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.JsonBean;
023import org.apache.oozie.client.rest.JsonTags;
024import org.apache.oozie.client.rest.JsonUtils;
025import org.apache.oozie.client.WorkflowAction;
026import org.apache.oozie.client.WorkflowJob;
027import org.apache.oozie.util.DateUtils;
028import org.apache.oozie.util.WritableUtils;
029import org.apache.hadoop.io.Writable;
030
031import java.io.DataInput;
032import java.io.IOException;
033import java.io.DataOutput;
034import java.text.MessageFormat;
035import java.util.ArrayList;
036import java.util.Date;
037import java.util.List;
038
039import javax.persistence.Entity;
040import javax.persistence.Column;
041import javax.persistence.Id;
042import javax.persistence.NamedQueries;
043import javax.persistence.NamedQuery;
044import javax.persistence.Basic;
045import javax.persistence.Lob;
046import javax.persistence.Table;
047import javax.persistence.Transient;
048
049import java.sql.Timestamp;
050
051import org.apache.openjpa.persistence.jdbc.Index;
052import org.apache.openjpa.persistence.jdbc.Strategy;
053import org.json.simple.JSONArray;
054import org.json.simple.JSONObject;
055
056@Entity
057
058@NamedQueries({
059
060    @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.statusStr = :status, w.wfInstance = :wfInstance where w.id = :id"),
061
062    @NamedQuery(name = "UPDATE_WORKFLOW_MODTIME", query = "update WorkflowJobBean w set w.lastModifiedTimestamp = :lastModTime where w.id = :id"),
063
064    @NamedQuery(name = "UPDATE_WORKFLOW_STATUS_MODTIME", query = "update WorkflowJobBean w set w.statusStr = :status, w.lastModifiedTimestamp = :lastModTime where w.id = :id"),
065
066    @NamedQuery(name = "UPDATE_WORKFLOW_PARENT_MODIFIED", query = "update WorkflowJobBean w set w.parentId = :parentId, w.lastModifiedTimestamp = :lastModTime where w.id = :id"),
067
068    @NamedQuery(name = "UPDATE_WORKFLOW_STATUS_INSTANCE_MODIFIED", query = "update WorkflowJobBean w set w.statusStr = :status, w.wfInstance = :wfInstance, w.lastModifiedTimestamp = :lastModTime where w.id = :id"),
069
070    @NamedQuery(name = "UPDATE_WORKFLOW_STATUS_INSTANCE_MOD_END", query = "update WorkflowJobBean w set w.statusStr = :status, w.wfInstance = :wfInstance, w.lastModifiedTimestamp = :lastModTime, w.endTimestamp = :endTime where w.id = :id"),
071
072    @NamedQuery(name = "UPDATE_WORKFLOW_STATUS_INSTANCE_MOD_START_END", query = "update WorkflowJobBean w set w.statusStr = :status, w.wfInstance = :wfInstance, w.lastModifiedTimestamp = :lastModTime, w.startTimestamp = :startTime, w.endTimestamp = :endTime where w.id = :id"),
073
074    @NamedQuery(name = "UPDATE_WORKFLOW_RERUN", query = "update WorkflowJobBean w set w.appName = :appName, w.protoActionConf = :protoActionConf, w.appPath = :appPath, w.conf = :conf, w.logToken = :logToken, w.user = :user, w.group = :group, w.externalId = :externalId, w.endTimestamp = :endTime, w.run = :run, w.statusStr = :status, w.wfInstance = :wfInstance, w.lastModifiedTimestamp = :lastModTime where w.id = :id"),
075
076    @NamedQuery(name = "DELETE_WORKFLOW", query = "delete from WorkflowJobBean w where w.id = :id"),
077
078    @NamedQuery(name = "GET_WORKFLOWS", query = "select OBJECT(w) from WorkflowJobBean w order by w.startTimestamp desc"),
079
080    @NamedQuery(name = "GET_WORKFLOWS_COLUMNS", query = "select w.id, w.appName, w.statusStr, w.run, w.user, w.group, w.createdTimestamp, w.startTimestamp, w.lastModifiedTimestamp, w.endTimestamp, w.externalId, w.parentId from WorkflowJobBean w order by w.createdTimestamp desc"),
081
082    @NamedQuery(name = "GET_WORKFLOWS_COUNT", query = "select count(w) from WorkflowJobBean w"),
083
084    @NamedQuery(name = "GET_COMPLETED_WORKFLOWS_OLDER_THAN", query = "select w from WorkflowJobBean w where w.endTimestamp < :endTime"),
085
086    @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"),
087
088    @NamedQuery(name = "GET_COMPLETED_COORD_WORKFLOWS_OLDER_THAN", query = "select w.id, w.parentId from WorkflowJobBean w where w.endTimestamp < :endTime and w.parentId like '%C@%'"),
089
090    @NamedQuery(name = "GET_WORKFLOW", query = "select OBJECT(w) from WorkflowJobBean w where w.id = :id"),
091
092    @NamedQuery(name = "GET_WORKFLOW_STARTTIME", query = "select w.id, w.startTimestamp from WorkflowJobBean w where w.id = :id"),
093
094    @NamedQuery(name = "GET_WORKFLOW_START_END_TIME", query = "select w.id, w.startTimestamp, w.endTimestamp from WorkflowJobBean w where w.id = :id"),
095
096    @NamedQuery(name = "GET_WORKFLOW_USER_GROUP", query = "select w.user, w.group from WorkflowJobBean w where w.id = :id"),
097
098    @NamedQuery(name = "GET_WORKFLOW_SUSPEND", query = "select w.id, w.user, w.group, w.appName, w.statusStr, w.parentId, w.startTimestamp, w.endTimestamp, w.logToken, w.wfInstance  from WorkflowJobBean w where w.id = :id"),
099
100    @NamedQuery(name = "GET_WORKFLOW_RERUN", query = "select w.id, w.user, w.group, w.appName, w.statusStr, w.run, w.logToken, w.wfInstance from WorkflowJobBean w where w.id = :id"),
101
102    @NamedQuery(name = "GET_WORKFLOW_DEFINITION", query = "select w.id, w.user, w.group, w.appName, w.logToken, w.wfInstance from WorkflowJobBean w where w.id = :id"),
103
104    @NamedQuery(name = "GET_WORKFLOW_ACTION_OP", query = "select w.id, w.user, w.group, w.appName, w.appPath, w.statusStr, w.run, w.parentId, w.logToken, w.wfInstance, w.protoActionConf from WorkflowJobBean w where w.id = :id"),
105
106    @NamedQuery(name = "GET_WORKFLOW_KILL", query = "select w.id, w.user, w.group, w.appName, w.appPath, w.statusStr, w.parentId, w.startTimestamp, w.endTimestamp, w.logToken, w.wfInstance, w.slaXml from WorkflowJobBean w where w.id = :id"),
107
108    @NamedQuery(name = "GET_WORKFLOW_RESUME", query = "select w.id, w.user, w.group, w.appName, w.appPath, w.statusStr, w.parentId, w.startTimestamp, w.endTimestamp, w.logToken, w.wfInstance, w.protoActionConf from WorkflowJobBean w where w.id = :id"),
109
110    @NamedQuery(name = "GET_WORKFLOW_FOR_UPDATE", query = "select OBJECT(w) from WorkflowJobBean w where w.id = :id"),
111
112    @NamedQuery(name = "GET_WORKFLOW_FOR_SLA", query = "select w.id, w.statusStr, w.startTimestamp, w.endTimestamp from WorkflowJobBean w where w.id = :id"),
113
114    @NamedQuery(name = "GET_WORKFLOW_ID_FOR_EXTERNAL_ID", query = "select  w.id from WorkflowJobBean w where w.externalId = :externalId"),
115
116    @NamedQuery(name = "GET_WORKFLOWS_COUNT_WITH_STATUS", query = "select count(w) from WorkflowJobBean w where w.statusStr = :status"),
117
118    @NamedQuery(name = "GET_WORKFLOWS_COUNT_WITH_STATUS_IN_LAST_N_SECS", query = "select count(w) from WorkflowJobBean w where w.statusStr = :status and w.lastModifiedTimestamp > :lastModTime"),
119
120    @NamedQuery(name = "GET_WORKFLOWS_WITH_WORKFLOW_PARENT_ID", query = "select w.id from WorkflowJobBean w where w.parentId = :parentId"),
121
122    @NamedQuery(name = "GET_WORKFLOWS_WITH_COORD_PARENT_ID", query = "select w.id from WorkflowJobBean w where w.parentId like :parentId"), // when setting parentId parameter, make sure to append a '%' (percent symbol) at the end (e.g. 0000004-130709155224435-oozie-rkan-C%")
123
124    @NamedQuery(name = "GET_WORKFLOWS_COUNT_WITH_WORKFLOW_PARENT_ID_NOT_READY_FOR_PURGE", query = "select count(w) from WorkflowJobBean w where w.parentId = :parentId and (w.statusStr = 'PREP' OR w.statusStr = 'RUNNING' OR w.statusStr = 'SUSPENDED' OR w.endTimestamp >= :endTime)"),
125
126    @NamedQuery(name = "GET_WORKFLOWS_COUNT_WITH_COORD_PARENT_ID_NOT_READY_FOR_PURGE", query = "select count(w) from WorkflowJobBean w where w.parentId like :parentId and (w.statusStr = 'PREP' OR w.statusStr = 'RUNNING' OR w.statusStr = 'SUSPENDED' OR w.endTimestamp >= :endTime)"), // when setting parentId parameter, make sure to append a '%' (percent symbol) at the end (e.g. 0000004-130709155224435-oozie-rkan-C%")
127
128    @NamedQuery(name = "GET_WORKFLOW_FOR_USER", query = "select w.user from WorkflowJobBean w where w.id = :id"),
129
130    @NamedQuery(name = "GET_WORKFLOW_STATUS", query = "select w.statusStr from WorkflowJobBean w where w.id = :id"),
131
132    @NamedQuery(name = "GET_WORKFLOWS_PARENT_COORD_RERUN", query = "select w.id, w.statusStr, w.startTimestamp, w.endTimestamp "
133            + "from WorkflowJobBean w where w.parentId = :parentId order by w.createdTimestamp")})
134@Table(name = "WF_JOBS")
135public class WorkflowJobBean implements Writable, WorkflowJob, JsonBean {
136
137    @Id
138    private String id;
139
140    @Basic
141    @Column(name = "proto_action_conf")
142    @Lob
143    @Strategy("org.apache.oozie.executor.jpa.StringBlobValueHandler")
144    private StringBlob protoActionConf;
145
146    @Basic
147    @Column(name = "log_token")
148    private String logToken = null;
149
150    @Basic
151    @Index
152    @Column(name = "external_id")
153    private String externalId = null;
154
155    @Basic
156    @Index
157    @Column(name = "status")
158    private String statusStr = WorkflowJob.Status.PREP.toString();
159
160    @Basic
161    @Column(name = "created_time")
162    private java.sql.Timestamp createdTimestamp = null;
163
164    @Basic
165    @Column(name = "start_time")
166    private java.sql.Timestamp startTimestamp = null;
167
168    @Basic
169    @Index
170    @Column(name = "end_time")
171    private java.sql.Timestamp endTimestamp = null;
172
173    @Basic
174    @Index
175    @Column(name = "last_modified_time")
176    private java.sql.Timestamp lastModifiedTimestamp = null;
177
178    @Basic
179    @Column(name = "wf_instance")
180    @Lob
181    @Strategy("org.apache.oozie.executor.jpa.BinaryBlobValueHandler")
182    private BinaryBlob wfInstance ;
183
184    @Basic
185    @Column(name = "sla_xml")
186    @Lob
187    @Strategy("org.apache.oozie.executor.jpa.StringBlobValueHandler")
188    private StringBlob slaXml;
189
190
191    @Basic
192    @Column(name = "app_name")
193    private String appName = null;
194
195    @Basic
196    @Column(name = "app_path")
197    private String appPath = null;
198
199    @Basic
200    @Column(name = "conf")
201    @Lob
202    @Strategy("org.apache.oozie.executor.jpa.StringBlobValueHandler")
203    private StringBlob conf;
204
205    @Basic
206    @Column(name = "user_name")
207    private String user = null;
208
209    @Basic
210    @Column(name = "group_name")
211    private String group;
212
213    @Basic
214    @Column(name = "run")
215    private int run = 1;
216
217    @Basic
218    @Index
219    @Column(name = "parent_id")
220    private String parentId;
221
222    @Transient
223    private String consoleUrl;
224
225    @Transient
226    private List<WorkflowActionBean> actions;
227
228
229    /**
230     * Default constructor.
231     */
232    public WorkflowJobBean() {
233        actions = new ArrayList<WorkflowActionBean>();
234    }
235
236    /**
237     * Serialize the workflow bean to a data output.
238     *
239     * @param dataOutput data output.
240     * @throws IOException thrown if the workflow bean could not be serialized.
241     */
242    public void write(DataOutput dataOutput) throws IOException {
243        WritableUtils.writeStr(dataOutput, getAppPath());
244        WritableUtils.writeStr(dataOutput, getAppName());
245        WritableUtils.writeStr(dataOutput, getId());
246        WritableUtils.writeStr(dataOutput, getParentId());
247        WritableUtils.writeStr(dataOutput, getConf());
248        WritableUtils.writeStr(dataOutput, getStatusStr());
249        dataOutput.writeLong((getCreatedTime() != null) ? getCreatedTime().getTime() : -1);
250        dataOutput.writeLong((getStartTime() != null) ? getStartTime().getTime() : -1);
251        dataOutput.writeLong((getLastModifiedTime() != null) ? getLastModifiedTime().getTime() : -1);
252        dataOutput.writeLong((getEndTime() != null) ? getEndTime().getTime() : -1);
253        WritableUtils.writeStr(dataOutput, getUser());
254        WritableUtils.writeStr(dataOutput, getGroup());
255        dataOutput.writeInt(getRun());
256        WritableUtils.writeStr(dataOutput, logToken);
257        WritableUtils.writeStr(dataOutput, getProtoActionConf());
258    }
259
260    /**
261     * Deserialize a workflow bean from a data input.
262     *
263     * @param dataInput data input.
264     * @throws IOException thrown if the workflow bean could not be deserialized.
265     */
266    public void readFields(DataInput dataInput) throws IOException {
267        setAppPath(WritableUtils.readStr(dataInput));
268        setAppName(WritableUtils.readStr(dataInput));
269        setId(WritableUtils.readStr(dataInput));
270        setParentId(WritableUtils.readStr(dataInput));
271        setConf(WritableUtils.readStr(dataInput));
272        setStatus(WorkflowJob.Status.valueOf(WritableUtils.readStr(dataInput)));
273        // setStatus(WritableUtils.readStr(dataInput));
274        long d = dataInput.readLong();
275        if (d != -1) {
276            setCreatedTime(new Date(d));
277        }
278        d = dataInput.readLong();
279        if (d != -1) {
280        }
281        setStartTime(new Date(d));
282        d = dataInput.readLong();
283        if (d != -1) {
284            setLastModifiedTime(new Date(d));
285        }
286        d = dataInput.readLong();
287        if (d != -1) {
288            setEndTime(new Date(d));
289        }
290        setUser(WritableUtils.readStr(dataInput));
291        setGroup(WritableUtils.readStr(dataInput));
292        setRun(dataInput.readInt());
293        logToken = WritableUtils.readStr(dataInput);
294        setProtoActionConf(WritableUtils.readStr(dataInput));
295        setExternalId(getExternalId());
296    }
297
298    public boolean inTerminalState() {
299        boolean inTerminalState = false;
300        switch (WorkflowJob.Status.valueOf(statusStr)) {
301            case FAILED:
302            case KILLED:
303            case SUCCEEDED:
304                inTerminalState = true;
305                break;
306            default:
307                break;
308        }
309        return inTerminalState;
310    }
311
312    public String getLogToken() {
313        return logToken;
314    }
315
316    public void setLogToken(String logToken) {
317        this.logToken = logToken;
318    }
319
320    public String getSlaXml() {
321        return slaXml == null ? null : slaXml.getString();
322    }
323
324    public void setSlaXml(String slaXml) {
325        if (this.slaXml == null) {
326            this.slaXml = new StringBlob(slaXml);
327        }
328        else {
329            this.slaXml.setString(slaXml);
330        }
331    }
332
333    public void setSlaXmlBlob(StringBlob slaXml) {
334        this.slaXml = slaXml;
335    }
336
337    public StringBlob getSlaXmlBlob() {
338        return this.slaXml;
339    }
340
341    public WorkflowInstance getWorkflowInstance() {
342        return wfInstance == null ? null : get(wfInstance.getBytes());
343    }
344
345    public BinaryBlob getWfInstanceBlob() {
346        return this.wfInstance;
347    }
348
349    public void setWorkflowInstance(WorkflowInstance workflowInstance) {
350        if (this.wfInstance == null) {
351            this.wfInstance = new BinaryBlob(WritableUtils.toByteArray((LiteWorkflowInstance) workflowInstance), true);
352        }
353        else {
354            this.wfInstance.setBytes(WritableUtils.toByteArray((LiteWorkflowInstance) workflowInstance));
355        }
356    }
357
358    public void setWfInstanceBlob(BinaryBlob wfInstance) {
359        this.wfInstance = wfInstance;
360    }
361
362    public String getProtoActionConf() {
363        return protoActionConf == null ? null : protoActionConf.getString();
364    }
365
366    public void setProtoActionConf(String protoActionConf) {
367        if (this.protoActionConf == null) {
368            this.protoActionConf = new StringBlob(protoActionConf);
369        }
370        else {
371            this.protoActionConf.setString(protoActionConf);
372        }
373    }
374
375    public void setProtoActionConfBlob (StringBlob protoBytes) {
376        this.protoActionConf = protoBytes;
377    }
378
379    public StringBlob getProtoActionConfBlob() {
380        return this.protoActionConf;
381    }
382
383    public String getlogToken() {
384        return logToken;
385    }
386
387    public Timestamp getLastModifiedTimestamp() {
388        return lastModifiedTimestamp;
389    }
390
391    public Timestamp getStartTimestamp() {
392        return startTimestamp;
393    }
394
395    public Timestamp getCreatedTimestamp() {
396        return createdTimestamp;
397    }
398
399    public Timestamp getEndTimestamp() {
400        return endTimestamp;
401    }
402
403    public void setStatusStr (String statusStr) {
404        this.statusStr = statusStr;
405    }
406
407    public void setStatus(Status val) {
408        this.statusStr = val.toString();
409    }
410
411    @Override
412    public Status getStatus() {
413        return Status.valueOf(statusStr);
414    }
415
416    public String getStatusStr() {
417        return statusStr;
418    }
419
420    public void setExternalId(String externalId) {
421        this.externalId = externalId;
422    }
423
424    @Override
425    public String getExternalId() {
426        return externalId;
427    }
428
429    public void setLastModifiedTime(Date lastModifiedTime) {
430        this.lastModifiedTimestamp = DateUtils.convertDateToTimestamp(lastModifiedTime);
431    }
432
433    public Date getLastModifiedTime() {
434        return DateUtils.toDate(lastModifiedTimestamp);
435    }
436
437    public Date getCreatedTime() {
438        return DateUtils.toDate(createdTimestamp);
439    }
440
441    public void setCreatedTime(Date createdTime) {
442        this.createdTimestamp = DateUtils.convertDateToTimestamp(createdTime);
443    }
444
445    @Override
446    public Date getStartTime() {
447        return DateUtils.toDate(startTimestamp);
448    }
449
450    public void setStartTime(Date startTime) {
451        this.startTimestamp = DateUtils.convertDateToTimestamp(startTime);
452    }
453
454    public Date getEndTime() {
455        return DateUtils.toDate(endTimestamp);
456    }
457
458    public void setEndTime(Date endTime) {
459        this.endTimestamp = DateUtils.convertDateToTimestamp(endTime);
460    }
461
462    private WorkflowInstance get(byte[] array) {
463        LiteWorkflowInstance pInstance = WritableUtils.fromByteArray(array, LiteWorkflowInstance.class);
464        return pInstance;
465    }
466
467    @SuppressWarnings("unchecked")
468    public JSONObject toJSONObject() {
469        return toJSONObject("GMT");
470    }
471
472    @SuppressWarnings("unchecked")
473    public JSONObject toJSONObject(String timeZoneId) {
474        JSONObject json = new JSONObject();
475        json.put(JsonTags.WORKFLOW_APP_PATH, getAppPath());
476        json.put(JsonTags.WORKFLOW_APP_NAME, getAppName());
477        json.put(JsonTags.WORKFLOW_ID, getId());
478        json.put(JsonTags.WORKFLOW_EXTERNAL_ID, getExternalId());
479        json.put(JsonTags.WORKFLOW_PARENT_ID, getParentId());
480        json.put(JsonTags.WORKFLOW_CONF, getConf());
481        json.put(JsonTags.WORKFLOW_STATUS, getStatus().toString());
482        json.put(JsonTags.WORKFLOW_LAST_MOD_TIME, JsonUtils.formatDateRfc822(getLastModifiedTime(), timeZoneId));
483        json.put(JsonTags.WORKFLOW_CREATED_TIME, JsonUtils.formatDateRfc822(getCreatedTime(), timeZoneId));
484        json.put(JsonTags.WORKFLOW_START_TIME, JsonUtils.formatDateRfc822(getStartTime(), timeZoneId));
485        json.put(JsonTags.WORKFLOW_END_TIME, JsonUtils.formatDateRfc822(getEndTime(), timeZoneId));
486        json.put(JsonTags.WORKFLOW_USER, getUser());
487        json.put(JsonTags.WORKFLOW_GROUP, getGroup());
488        json.put(JsonTags.WORKFLOW_ACL, getAcl());
489        json.put(JsonTags.WORKFLOW_RUN, (long) getRun());
490        json.put(JsonTags.WORKFLOW_CONSOLE_URL, getConsoleUrl());
491        json.put(JsonTags.WORKFLOW_ACTIONS, WorkflowActionBean.toJSONArray(actions, timeZoneId));
492        json.put(JsonTags.TO_STRING, toString());
493        return json;
494    }
495
496    public String getAppPath() {
497        return appPath;
498    }
499
500    public void setAppPath(String appPath) {
501        this.appPath = appPath;
502    }
503
504    public String getAppName() {
505        return appName;
506    }
507
508    public void setAppName(String appName) {
509        this.appName = appName;
510    }
511
512    public String getId() {
513        return id;
514    }
515
516    public void setId(String id) {
517        this.id = id;
518    }
519
520    public String getConf() {
521        return conf == null ? null : conf.getString();
522    }
523
524    public void setConf(String conf) {
525        if (this.conf == null) {
526            this.conf = new StringBlob(conf);
527        }
528        else {
529            this.conf.setString(conf);
530        }
531    }
532
533    public void setConfBlob(StringBlob conf) {
534        this.conf = conf;
535    }
536
537    public StringBlob getConfBlob() {
538        return this.conf;
539    }
540
541    public String getUser() {
542        return user;
543    }
544
545    public void setUser(String user) {
546        this.user = user;
547    }
548
549    public String getGroup() {
550        return group;
551    }
552
553    @Override
554    public String getAcl() {
555        return getGroup();
556    }
557
558    public void setGroup(String group) {
559        this.group = group;
560    }
561
562    public int getRun() {
563        return run;
564    }
565
566    public void setRun(int run) {
567        this.run = run;
568    }
569
570    /**
571     * Return the workflow job console URL.
572     *
573     * @return the workflow job console URL.
574     */
575    public String getConsoleUrl() {
576        return consoleUrl;
577    }
578
579    /**
580     * Return the corresponding Action ID, if any.
581     *
582     * @return the coordinator Action Id.
583     */
584    public String getParentId() {
585        return parentId;
586    }
587
588    /**
589     * Set coordinator action id
590     *
591     * @param parentId : coordinator action id
592     */
593    public void setParentId(String parentId) {
594        this.parentId = parentId;
595    }
596
597    /**
598     * Set the workflow job console URL.
599     *
600     * @param consoleUrl the workflow job console URL.
601     */
602    public void setConsoleUrl(String consoleUrl) {
603        this.consoleUrl = consoleUrl;
604    }
605
606    @SuppressWarnings("unchecked")
607    public List<WorkflowAction> getActions() {
608        return (List) actions;
609    }
610
611    public void setActions(List<WorkflowActionBean> nodes) {
612        this.actions = (nodes != null) ? nodes : new ArrayList<WorkflowActionBean>();
613    }
614
615    @Override
616    public String toString() {
617        return MessageFormat.format("Workflow id[{0}] status[{1}]", getId(), getStatus());
618    }
619
620    /**
621     * Convert a workflows list into a JSONArray.
622     *
623     * @param workflows workflows list.
624     * @param timeZoneId time zone to use for dates in the JSON array.
625     * @return the corresponding JSON array.
626     */
627    @SuppressWarnings("unchecked")
628    public static JSONArray toJSONArray(List<WorkflowJobBean> workflows, String timeZoneId) {
629        JSONArray array = new JSONArray();
630        if (workflows != null) {
631            for (WorkflowJobBean node : workflows) {
632                array.add(node.toJSONObject(timeZoneId));
633            }
634        }
635        return array;
636    }
637
638
639
640}