001 /** 002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved. 003 * Licensed under the Apache License, Version 2.0 (the "License"); 004 * you may not use this file except in compliance with the License. 005 * You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software 010 * distributed under the License is distributed on an "AS IS" BASIS, 011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 * See the License for the specific language governing permissions and 013 * limitations under the License. See accompanying LICENSE file. 014 */ 015 package org.apache.oozie; 016 017 import java.io.DataInput; 018 import java.io.DataOutput; 019 import java.io.IOException; 020 import java.sql.Timestamp; 021 import java.util.Date; 022 023 import javax.persistence.Basic; 024 import javax.persistence.Column; 025 import javax.persistence.Entity; 026 import javax.persistence.Lob; 027 import javax.persistence.NamedQueries; 028 import javax.persistence.NamedQuery; 029 030 import org.apache.hadoop.io.Writable; 031 import org.apache.oozie.client.CoordinatorJob; 032 import org.apache.oozie.client.rest.JsonCoordinatorJob; 033 import org.apache.oozie.util.DateUtils; 034 import org.apache.oozie.util.WritableUtils; 035 import org.apache.openjpa.persistence.jdbc.Index; 036 037 @Entity 038 @NamedQueries({ 039 @NamedQuery(name = "UPDATE_COORD_JOB", query = "update CoordinatorJobBean w set w.appName = :appName, w.appPath = :appPath, w.concurrency = :concurrency, w.conf = :conf, w.externalId = :externalId, w.frequency = :frequency, w.lastActionNumber = :lastActionNumber, w.timeOut = :timeOut, w.timeZone = :timeZone, w.authToken = :authToken, w.createdTimestamp = :createdTime, w.endTimestamp = :endTime, w.execution = :execution, w.jobXml = :jobXml, w.lastActionTimestamp = :lastAction, w.lastModifiedTimestamp = :lastModifiedTime, w.nextMaterializedTimestamp = :nextMaterializedTime, w.origJobXml = :origJobXml, w.slaXml=:slaXml, w.startTimestamp = :startTime, w.status = :status, w.timeUnitStr = :timeUnit where w.id = :id"), 040 041 @NamedQuery(name = "UPDATE_COORD_JOB_STATUS", query = "update CoordinatorJobBean w set w.status = :status, w.lastModifiedTimestamp = :lastModifiedTime where w.id = :id"), 042 043 @NamedQuery(name = "DELETE_COORD_JOB", query = "delete from CoordinatorJobBean w where w.id = :id"), 044 045 @NamedQuery(name = "GET_COORD_JOBS", query = "select OBJECT(w) from CoordinatorJobBean w"), 046 047 @NamedQuery(name = "GET_COORD_JOB", query = "select OBJECT(w) from CoordinatorJobBean w where w.id = :id"), 048 049 @NamedQuery(name = "GET_COORD_JOBS_COUNT", query = "select count(w) from CoordinatorJobBean w"), 050 051 @NamedQuery(name = "GET_COORD_JOBS_COLUMNS", query = "select w.id, w.appName, w.status, w.user, w.group, w.startTimestamp, w.endTimestamp, w.appPath, w.concurrency, w.frequency, w.lastActionTimestamp, w.nextMaterializedTimestamp, w.createdTimestamp, w.timeUnitStr, w.timeZone, w.timeOut from CoordinatorJobBean w order by w.createdTimestamp desc"), 052 053 @NamedQuery(name = "GET_COORD_JOBS_OLDER_THAN", query = "select OBJECT(w) from CoordinatorJobBean w where w.startTimestamp <= :matTime AND (w.status = 'PREP' OR w.status = 'RUNNING') AND (w.nextMaterializedTimestamp < :matTime OR w.nextMaterializedTimestamp IS NULL) AND (w.nextMaterializedTimestamp IS NULL OR (w.endTimestamp > w.nextMaterializedTimestamp AND (w.pauseTimestamp IS NULL OR w.pauseTimestamp > w.nextMaterializedTimestamp))) order by w.lastModifiedTimestamp"), 054 055 @NamedQuery(name = "GET_COORD_JOBS_OLDER_THAN_STATUS", query = "select OBJECT(w) from CoordinatorJobBean w where w.status = :status AND w.lastModifiedTimestamp <= :lastModTime order by w.lastModifiedTimestamp"), 056 057 @NamedQuery(name = "GET_COMPLETED_COORD_JOBS_OLDER_THAN_STATUS", query = "select OBJECT(w) from CoordinatorJobBean w where ( w.status = 'SUCCEEDED' OR w.status = 'FAILED' or w.status = 'KILLED') AND w.lastModifiedTimestamp <= :lastModTime order by w.lastModifiedTimestamp")}) 058 public class CoordinatorJobBean extends JsonCoordinatorJob implements Writable { 059 060 @Basic 061 @Index 062 @Column(name = "status") 063 private String status = CoordinatorJob.Status.PREP.toString(); 064 065 @Basic 066 @Column(name = "auth_token") 067 @Lob 068 private String authToken = null; 069 070 @Basic 071 @Column(name = "start_time") 072 private java.sql.Timestamp startTimestamp = null; 073 074 @Basic 075 @Column(name = "end_time") 076 private java.sql.Timestamp endTimestamp = null; 077 078 @Basic 079 @Column(name = "pause_time") 080 private java.sql.Timestamp pauseTimestamp = null; 081 082 @Basic 083 @Index 084 @Column(name = "created_time") 085 private java.sql.Timestamp createdTimestamp = null; 086 087 @Basic 088 @Column(name = "time_unit") 089 private String timeUnitStr = CoordinatorJob.Timeunit.NONE.toString(); 090 091 @Basic 092 @Column(name = "execution") 093 private String execution = null; 094 095 @Basic 096 @Column(name = "last_action") 097 private java.sql.Timestamp lastActionTimestamp = null; 098 099 @Basic 100 @Index 101 @Column(name = "next_matd_time") 102 private java.sql.Timestamp nextMaterializedTimestamp = null; 103 104 @Basic 105 @Index 106 @Column(name = "last_modified_time") 107 private java.sql.Timestamp lastModifiedTimestamp = null; 108 109 @Basic 110 @Index 111 @Column(name = "suspended_time") 112 private java.sql.Timestamp suspendedTimestamp = null; 113 114 @Column(name = "job_xml") 115 @Lob 116 private String jobXml = null; 117 118 @Column(name = "orig_job_xml") 119 @Lob 120 private String origJobXml = null; 121 122 @Column(name = "sla_xml") 123 @Lob 124 private String slaXml = null; 125 126 public java.sql.Timestamp getStartTimestamp() { 127 return startTimestamp; 128 } 129 130 public void setStartTimestamp(java.sql.Timestamp startTimestamp) { 131 super.setStartTime(DateUtils.toDate(startTimestamp)); 132 this.startTimestamp = startTimestamp; 133 } 134 135 public java.sql.Timestamp getEndTimestamp() { 136 return endTimestamp; 137 } 138 139 public void setEndTimestamp(java.sql.Timestamp endTimestamp) { 140 super.setEndTime(DateUtils.toDate(endTimestamp)); 141 this.endTimestamp = endTimestamp; 142 } 143 144 public Timestamp getNextMaterializedTimestamp() { 145 return nextMaterializedTimestamp; 146 } 147 148 public void setNextMaterializedTimestamp(java.sql.Timestamp nextMaterializedTimestamp) { 149 super.setNextMaterializedTime(DateUtils.toDate(nextMaterializedTimestamp)); 150 this.nextMaterializedTimestamp = nextMaterializedTimestamp; 151 } 152 153 public Timestamp getLastModifiedTimestamp() { 154 return lastModifiedTimestamp; 155 } 156 157 public void setLastModifiedTimestamp(java.sql.Timestamp lastModifiedTimestamp) { 158 this.lastModifiedTimestamp = lastModifiedTimestamp; 159 } 160 161 public Timestamp getSuspendedTimestamp() { 162 return suspendedTimestamp; 163 } 164 165 public void setSuspendedTimestamp(java.sql.Timestamp suspendedTimestamp) { 166 this.suspendedTimestamp = suspendedTimestamp; 167 } 168 169 public String getJobXml() { 170 return jobXml; 171 } 172 173 public void setJobXml(String jobXml) { 174 this.jobXml = jobXml; 175 } 176 177 public String getOrigJobXml() { 178 return origJobXml; 179 } 180 181 public void setOrigJobXml(String origJobXml) { 182 this.origJobXml = origJobXml; 183 } 184 185 public String getSlaXml() { 186 return slaXml; 187 } 188 189 public void setSlaXml(String slaXml) { 190 this.slaXml = slaXml; 191 } 192 193 @Override 194 public void setTimeUnit(Timeunit timeUnit) { 195 super.setTimeUnit(timeUnit); 196 this.timeUnitStr = timeUnit.toString(); 197 } 198 199 public void setExecution(String execution) { 200 this.execution = execution; 201 } 202 203 public void setLastActionTimestamp(java.sql.Timestamp lastActionTimestamp) { 204 super.setLastActionTime(DateUtils.toDate(lastActionTimestamp)); 205 this.lastActionTimestamp = lastActionTimestamp; 206 } 207 208 public void setAuthToken(String authToken) { 209 this.authToken = authToken; 210 } 211 212 public CoordinatorJobBean() { 213 } 214 215 /* 216 * Serialize the coordinator bean to a data output. @param dataOutput data 217 * output. @throws IOException thrown if the coordinator bean could not be 218 * serialized. 219 */ 220 public void write(DataOutput dataOutput) throws IOException { 221 WritableUtils.writeStr(dataOutput, getAppPath()); 222 WritableUtils.writeStr(dataOutput, getAppName()); 223 WritableUtils.writeStr(dataOutput, getId()); 224 WritableUtils.writeStr(dataOutput, getConf()); 225 WritableUtils.writeStr(dataOutput, getStatusStr()); 226 dataOutput.writeInt(getFrequency()); 227 WritableUtils.writeStr(dataOutput, getTimeUnit().toString()); 228 WritableUtils.writeStr(dataOutput, getTimeZone()); 229 dataOutput.writeInt(getConcurrency()); 230 WritableUtils.writeStr(dataOutput, getExecutionOrder().toString()); 231 dataOutput.writeLong((getStartTime() != null) ? getLastActionTime().getTime() : -1); 232 dataOutput.writeLong((getStartTime() != null) ? getNextMaterializedTime().getTime() : -1); 233 dataOutput.writeLong((getStartTime() != null) ? getStartTime().getTime() : -1); 234 dataOutput.writeLong((getEndTime() != null) ? getEndTime().getTime() : -1); 235 WritableUtils.writeStr(dataOutput, getUser()); 236 WritableUtils.writeStr(dataOutput, getGroup()); 237 WritableUtils.writeStr(dataOutput, getExternalId()); 238 dataOutput.writeInt(getTimeout()); 239 } 240 241 /** 242 * Deserialize a coordinator bean from a data input. 243 * 244 * @param dataInput data input. 245 * @throws IOException thrown if the workflow bean could not be deserialized. 246 */ 247 public void readFields(DataInput dataInput) throws IOException { 248 setAppPath(WritableUtils.readStr(dataInput)); 249 setAppName(WritableUtils.readStr(dataInput)); 250 setId(WritableUtils.readStr(dataInput)); 251 setConf(WritableUtils.readStr(dataInput)); 252 setStatus(CoordinatorJob.Status.valueOf(WritableUtils.readStr(dataInput))); 253 setFrequency(dataInput.readInt()); 254 setTimeUnit(CoordinatorJob.Timeunit.valueOf(WritableUtils.readStr(dataInput))); 255 setTimeZone(WritableUtils.readStr(dataInput)); 256 setConcurrency(dataInput.readInt()); 257 setExecutionOrder(Execution.valueOf(WritableUtils.readStr(dataInput))); 258 259 long d = dataInput.readLong(); 260 if (d != -1) { 261 setLastActionTime(new Date(d)); 262 } 263 d = dataInput.readLong(); 264 if (d != -1) { 265 setNextMaterializedTime(new Date(d)); 266 } 267 d = dataInput.readLong(); 268 if (d != -1) { 269 setStartTime(new Date(d)); 270 } 271 272 d = dataInput.readLong(); 273 if (d != -1) { 274 setEndTime(new Date(d)); 275 } 276 setUser(WritableUtils.readStr(dataInput)); 277 setGroup(WritableUtils.readStr(dataInput)); 278 setExternalId(WritableUtils.readStr(dataInput)); 279 setTimeout(dataInput.readInt()); 280 } 281 282 @Override 283 public Status getStatus() { 284 return Status.valueOf(this.status); 285 } 286 287 public String getStatusStr() { 288 return status; 289 } 290 291 @Override 292 public void setStatus(Status val) { 293 super.setStatus(val); 294 this.status = val.toString(); 295 } 296 297 public String getTimeUnitStr() { 298 return timeUnitStr; 299 } 300 301 @Override 302 public Timeunit getTimeUnit() { 303 return Timeunit.valueOf(this.timeUnitStr); 304 } 305 306 public void setExecution(Execution order) { 307 this.execution = order.toString(); 308 super.setExecutionOrder(order); 309 } 310 311 @Override 312 public Execution getExecutionOrder() { 313 return Execution.valueOf(this.execution); 314 } 315 316 public String getExecution() { 317 return execution; 318 } 319 320 @Override 321 public void setLastActionTime(Date lastAction) { 322 this.lastActionTimestamp = DateUtils.convertDateToTimestamp(lastAction); 323 super.setLastActionTime(lastAction); 324 } 325 326 @Override 327 public Date getLastActionTime() { 328 return DateUtils.toDate(lastActionTimestamp); 329 } 330 331 public Timestamp getLastActionTimestamp() { 332 return lastActionTimestamp; 333 } 334 335 @Override 336 public void setNextMaterializedTime(Date nextMaterializedTime) { 337 super.setNextMaterializedTime(nextMaterializedTime); 338 this.nextMaterializedTimestamp = DateUtils.convertDateToTimestamp(nextMaterializedTime); 339 } 340 341 @Override 342 public Date getNextMaterializedTime() { 343 return DateUtils.toDate(nextMaterializedTimestamp); 344 } 345 346 public void setLastModifiedTime(Date lastModifiedTime) { 347 this.lastModifiedTimestamp = DateUtils.convertDateToTimestamp(lastModifiedTime); 348 } 349 350 public Date getLastModifiedTime() { 351 return DateUtils.toDate(lastModifiedTimestamp); 352 } 353 354 public void setSuspendedTime(Date suspendedTime) { 355 this.suspendedTimestamp = DateUtils.convertDateToTimestamp(suspendedTime); 356 } 357 358 public Date getSuspendedTime() { 359 return DateUtils.toDate(suspendedTimestamp); 360 } 361 362 @Override 363 public void setStartTime(Date startTime) { 364 super.setStartTime(startTime); 365 this.startTimestamp = DateUtils.convertDateToTimestamp(startTime); 366 } 367 368 @Override 369 public Date getStartTime() { 370 return DateUtils.toDate(startTimestamp); 371 } 372 373 @Override 374 public void setEndTime(Date endTime) { 375 super.setEndTime(endTime); 376 this.endTimestamp = DateUtils.convertDateToTimestamp(endTime); 377 } 378 379 @Override 380 public void setPauseTime(Date pauseTime) { 381 super.setPauseTime(pauseTime); 382 this.pauseTimestamp = DateUtils.convertDateToTimestamp(pauseTime); 383 } 384 385 @Override 386 public Date getEndTime() { 387 return DateUtils.toDate(endTimestamp); 388 } 389 390 @Override 391 public Date getPauseTime() { 392 return DateUtils.toDate(pauseTimestamp); 393 } 394 395 public void setCreatedTime(Date createTime) { 396 this.createdTimestamp = DateUtils.convertDateToTimestamp(createTime); 397 } 398 399 public Date getCreatedTime() { 400 return DateUtils.toDate(createdTimestamp); 401 } 402 403 public Timestamp getCreatedTimestamp() { 404 return createdTimestamp; 405 } 406 407 public String getAuthToken() { 408 // TODO Auto-generated method stub 409 return this.authToken; 410 } 411 412 }