001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *      http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.oozie;
019
020import org.apache.oozie.workflow.WorkflowInstance;
021import org.apache.oozie.workflow.lite.LiteWorkflowInstance;
022import org.apache.oozie.client.rest.JsonWorkflowJob;
023import org.apache.oozie.client.WorkflowJob;
024import org.apache.oozie.util.DateUtils;
025import org.apache.oozie.util.WritableUtils;
026import org.apache.hadoop.io.Writable;
027
028import java.io.DataInput;
029import java.io.IOException;
030import java.io.DataOutput;
031import java.util.Date;
032
033import javax.persistence.Entity;
034import javax.persistence.Column;
035import javax.persistence.NamedQueries;
036import javax.persistence.NamedQuery;
037import javax.persistence.Basic;
038import javax.persistence.Lob;
039
040import java.sql.Timestamp;
041
042import org.apache.openjpa.persistence.jdbc.Index;
043
044@Entity
045@NamedQueries({
046
047    @NamedQuery(name = "UPDATE_WORKFLOW", query = "update WorkflowJobBean w set w.appName = :appName, w.appPath = :appPath, w.conf = :conf, w.group = :groupName, w.run = :run, w.user = :user, w.createdTimestamp = :createdTime, w.endTimestamp = :endTime, w.externalId = :externalId, w.lastModifiedTimestamp = :lastModTime,w.logToken = :logToken, w.protoActionConf = :protoActionConf, w.slaXml =:slaXml, w.startTimestamp = :startTime, w.status = :status, w.wfInstance = :wfInstance where w.id = :id"),
048
049    @NamedQuery(name = "DELETE_WORKFLOW", query = "delete from WorkflowJobBean w where w.id = :id"),
050
051    @NamedQuery(name = "GET_WORKFLOWS", query = "select OBJECT(w) from WorkflowJobBean w order by w.startTimestamp desc"),
052
053    @NamedQuery(name = "GET_WORKFLOWS_COLUMNS", query = "select w.id, w.appName, w.status, w.run, w.user, w.group, w.createdTimestamp, "
054            + "w.startTimestamp, w.lastModifiedTimestamp, w.endTimestamp, w.externalId from WorkflowJobBean w order by w.createdTimestamp desc"),
055
056    @NamedQuery(name = "GET_WORKFLOWS_COUNT", query = "select count(w) from WorkflowJobBean w"),
057
058    @NamedQuery(name = "GET_COMPLETED_WORKFLOWS_OLDER_THAN", query = "select w from WorkflowJobBean w where w.endTimestamp < :endTime"),
059
060    @NamedQuery(name = "GET_COMPLETED_WORKFLOWS_WITH_NO_PARENT_OLDER_THAN", query = "select w.id from WorkflowJobBean w where w.endTimestamp < :endTime and w.parentId is null"),
061
062    @NamedQuery(name = "GET_WORKFLOW", query = "select OBJECT(w) from WorkflowJobBean w where w.id = :id"),
063
064    @NamedQuery(name = "GET_WORKFLOW_FOR_UPDATE", query = "select OBJECT(w) from WorkflowJobBean w where w.id = :id"),
065
066    @NamedQuery(name = "GET_WORKFLOW_FOR_SLA", query = "select w.id, w.status, w.startTimestamp, w.endTimestamp from WorkflowJobBean w where w.id = :id"),
067
068    @NamedQuery(name = "GET_WORKFLOW_ID_FOR_EXTERNAL_ID", query = "select  w.id from WorkflowJobBean w where w.externalId = :externalId"),
069
070    @NamedQuery(name = "GET_WORKFLOWS_COUNT_WITH_STATUS", query = "select count(w) from WorkflowJobBean w where w.status = :status"),
071
072    @NamedQuery(name = "GET_WORKFLOWS_COUNT_WITH_STATUS_IN_LAST_N_SECS", query = "select count(w) from WorkflowJobBean w where w.status = :status and w.lastModifiedTimestamp > :lastModTime"),
073
074    @NamedQuery(name = "GET_WORKFLOWS_WITH_PARENT_ID", query = "select w.id from WorkflowJobBean w where w.parentId = :parentId"),
075
076    @NamedQuery(name = "GET_WORKFLOWS_COUNT_WITH_PARENT_ID_NOT_READY_FOR_PURGE", query = "select count(w) from WorkflowJobBean w where w.parentId = :parentId and (w.status = 'PREP' OR w.status = 'RUNNING' OR w.status = 'SUSPENDED' OR w.endTimestamp >= :endTime)"),
077
078    @NamedQuery(name = "GET_WORKFLOW_FOR_USER", query = "select w.user from WorkflowJobBean w where w.id = :id")
079        })
080public class WorkflowJobBean extends JsonWorkflowJob implements Writable {
081
082    @Column(name = "proto_action_conf")
083    @Lob
084    private String protoActionConf = null;
085
086    @Basic
087    @Column(name = "log_token")
088    private String logToken = null;
089
090    @Basic
091    @Index
092    @Column(name = "external_id")
093    private String externalId = null;
094
095    @Basic
096    @Index
097    @Column(name = "status")
098    private String status = WorkflowJob.Status.PREP.toString();
099
100    @Basic
101    @Column(name = "created_time")
102    private java.sql.Timestamp createdTimestamp = null;
103
104    @Basic
105    @Column(name = "start_time")
106    private java.sql.Timestamp startTimestamp = null;
107
108    @Basic
109    @Index
110    @Column(name = "end_time")
111    private java.sql.Timestamp endTimestamp = null;
112
113    @Basic
114    @Index
115    @Column(name = "last_modified_time")
116    private java.sql.Timestamp lastModifiedTimestamp = null;
117
118    // @Basic(fetch = FetchType.LAZY)
119    // @Column(name="wfinstance",columnDefinition="blob")
120    @Column(name = "wf_instance")
121    @Lob
122    private byte[] wfInstance = null;
123
124    @Column(name = "sla_xml")
125    @Lob
126    private String slaXml = null;
127
128    /**
129     * Default constructor.
130     */
131    public WorkflowJobBean() {
132    }
133
134    /**
135     * Serialize the workflow bean to a data output.
136     *
137     * @param dataOutput data output.
138     * @throws IOException thrown if the workflow bean could not be serialized.
139     */
140    public void write(DataOutput dataOutput) throws IOException {
141        WritableUtils.writeStr(dataOutput, getAppPath());
142        WritableUtils.writeStr(dataOutput, getAppName());
143        WritableUtils.writeStr(dataOutput, getId());
144        WritableUtils.writeStr(dataOutput, getParentId());
145        WritableUtils.writeStr(dataOutput, getConf());
146        WritableUtils.writeStr(dataOutput, getStatusStr());
147        dataOutput.writeLong((getCreatedTime() != null) ? getCreatedTime().getTime() : -1);
148        dataOutput.writeLong((getStartTime() != null) ? getStartTime().getTime() : -1);
149        dataOutput.writeLong((getLastModifiedTime() != null) ? getLastModifiedTime().getTime() : -1);
150        dataOutput.writeLong((getEndTime() != null) ? getEndTime().getTime() : -1);
151        WritableUtils.writeStr(dataOutput, getUser());
152        WritableUtils.writeStr(dataOutput, getGroup());
153        dataOutput.writeInt(getRun());
154        WritableUtils.writeStr(dataOutput, logToken);
155        WritableUtils.writeStr(dataOutput, protoActionConf);
156    }
157
158    /**
159     * Deserialize a workflow bean from a data input.
160     *
161     * @param dataInput data input.
162     * @throws IOException thrown if the workflow bean could not be deserialized.
163     */
164    public void readFields(DataInput dataInput) throws IOException {
165        setAppPath(WritableUtils.readStr(dataInput));
166        setAppName(WritableUtils.readStr(dataInput));
167        setId(WritableUtils.readStr(dataInput));
168        setParentId(WritableUtils.readStr(dataInput));
169        setConf(WritableUtils.readStr(dataInput));
170        setStatus(WorkflowJob.Status.valueOf(WritableUtils.readStr(dataInput)));
171        // setStatus(WritableUtils.readStr(dataInput));
172        long d = dataInput.readLong();
173        if (d != -1) {
174            setCreatedTime(new Date(d));
175        }
176        d = dataInput.readLong();
177        if (d != -1) {
178        }
179        setStartTime(new Date(d));
180        d = dataInput.readLong();
181        if (d != -1) {
182            setLastModifiedTime(new Date(d));
183        }
184        d = dataInput.readLong();
185        if (d != -1) {
186            setEndTime(new Date(d));
187        }
188        setUser(WritableUtils.readStr(dataInput));
189        setGroup(WritableUtils.readStr(dataInput));
190        setRun(dataInput.readInt());
191        logToken = WritableUtils.readStr(dataInput);
192        protoActionConf = WritableUtils.readStr(dataInput);
193        setExternalId(getExternalId());
194        setProtoActionConf(protoActionConf);
195    }
196
197    public boolean inTerminalState() {
198        boolean inTerminalState = false;
199        switch (WorkflowJob.Status.valueOf(status)) {
200            case FAILED:
201            case KILLED:
202            case SUCCEEDED:
203                inTerminalState = true;
204                break;
205            default:
206                break;
207        }
208        return inTerminalState;
209    }
210
211    public String getLogToken() {
212        return logToken;
213    }
214
215    public void setLogToken(String logToken) {
216        this.logToken = logToken;
217    }
218
219    public String getSlaXml() {
220        return slaXml;
221    }
222
223    public void setSlaXml(String slaXml) {
224        this.slaXml = slaXml;
225    }
226
227    public WorkflowInstance getWorkflowInstance() {
228        return get(this.wfInstance);
229    }
230
231    public byte[] getWfInstance() {
232        return wfInstance;
233    }
234
235    public void setWorkflowInstance(WorkflowInstance workflowInstance) {
236        setWfInstance(workflowInstance);
237    }
238
239    public void setWfInstance(byte[] wfInstance) {
240        this.wfInstance = wfInstance;
241    }
242
243    public void setWfInstance(WorkflowInstance wfInstance) {
244        this.wfInstance = WritableUtils.toByteArray((LiteWorkflowInstance) wfInstance);
245    }
246
247    public String getProtoActionConf() {
248        return protoActionConf;
249    }
250
251    public void setProtoActionConf(String protoActionConf) {
252        this.protoActionConf = protoActionConf;
253    }
254
255    public String getprotoActionConf() {
256        return protoActionConf;
257    }
258
259    public String getlogToken() {
260        return logToken;
261    }
262
263    public String getStatusStr() {
264        return status;
265    }
266
267    public Timestamp getLastModifiedTimestamp() {
268        return lastModifiedTimestamp;
269    }
270
271    public Timestamp getStartTimestamp() {
272        return startTimestamp;
273    }
274
275    public Timestamp getCreatedTimestamp() {
276        return createdTimestamp;
277    }
278
279    public Timestamp getEndTimestamp() {
280        return endTimestamp;
281    }
282
283    @Override
284    public void setAppName(String val) {
285        super.setAppName(val);
286    }
287
288    @Override
289    public void setAppPath(String val) {
290        super.setAppPath(val);
291    }
292
293    @Override
294    public void setConf(String val) {
295        super.setConf(val);
296    }
297
298    @Override
299    public void setStatus(Status val) {
300        super.setStatus(val);
301        this.status = val.toString();
302    }
303
304    @Override
305    public Status getStatus() {
306        return Status.valueOf(this.status);
307    }
308
309    @Override
310    public void setExternalId(String externalId) {
311        super.setExternalId(externalId);
312        this.externalId = externalId;
313    }
314
315    @Override
316    public String getExternalId() {
317        return externalId;
318    }
319
320    @Override
321    public void setLastModifiedTime(Date lastModifiedTime) {
322        super.setLastModifiedTime(lastModifiedTime);
323        this.lastModifiedTimestamp = DateUtils.convertDateToTimestamp(lastModifiedTime);
324    }
325
326    @Override
327    public Date getLastModifiedTime() {
328        return DateUtils.toDate(lastModifiedTimestamp);
329    }
330
331    @Override
332    public Date getCreatedTime() {
333        return DateUtils.toDate(createdTimestamp);
334    }
335
336    @Override
337    public void setCreatedTime(Date createdTime) {
338        super.setCreatedTime(createdTime);
339        this.createdTimestamp = DateUtils.convertDateToTimestamp(createdTime);
340    }
341
342    @Override
343    public Date getStartTime() {
344        return DateUtils.toDate(startTimestamp);
345    }
346
347    @Override
348    public void setStartTime(Date startTime) {
349        super.setStartTime(startTime);
350        this.startTimestamp = DateUtils.convertDateToTimestamp(startTime);
351    }
352
353    @Override
354    public Date getEndTime() {
355        return DateUtils.toDate(endTimestamp);
356    }
357
358    @Override
359    public void setEndTime(Date endTime) {
360        super.setEndTime(endTime);
361        this.endTimestamp = DateUtils.convertDateToTimestamp(endTime);
362    }
363
364    private WorkflowInstance get(byte[] array) {
365        LiteWorkflowInstance pInstance = WritableUtils.fromByteArray(array, LiteWorkflowInstance.class);
366        return pInstance;
367    }
368
369}