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.client.rest;
019
020import org.apache.oozie.client.WorkflowAction;
021import org.apache.oozie.client.WorkflowJob;
022import org.json.simple.JSONArray;
023import org.json.simple.JSONObject;
024
025import java.text.MessageFormat;
026import java.util.ArrayList;
027import java.util.Date;
028import java.util.List;
029
030import javax.persistence.*;
031
032/**
033 * Json Bean that represents an Oozie workflow job.
034 */
035
036@Entity
037@Table(name = "WF_JOBS")
038@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
039@DiscriminatorColumn(name = "bean_type", discriminatorType = DiscriminatorType.STRING)
040public class JsonWorkflowJob implements WorkflowJob, JsonBean {
041
042    @Id
043    private String id;
044
045    @Basic
046    @Column(name = "app_name")
047    private String appName = null;
048
049    @Basic
050    @Column(name = "app_path")
051    private String appPath = null;
052
053    @Transient
054    private String externalId = null;
055
056    @Column(name = "conf")
057    @Lob
058    private String conf = null;
059
060    @Transient
061    private Status status = WorkflowJob.Status.PREP;
062
063    @Transient
064    private Date createdTime;
065
066    @Transient
067    private Date startTime;
068
069    @Transient
070    private Date endTime;
071
072    @Transient
073    private Date lastModifiedTime;
074
075    @Basic
076    @Column(name = "user_name")
077    private String user = null;
078
079    @Basic
080    @Column(name = "group_name")
081    private String group;
082
083    @Basic
084    @Column(name = "run")
085    private int run = 1;
086
087    @Basic
088    @Column(name = "parent_id")
089    private String parentId;
090
091    @Transient
092    private String consoleUrl;
093
094    @Transient
095    private List<? extends JsonWorkflowAction> actions;
096
097    public JsonWorkflowJob() {
098        actions = new ArrayList<JsonWorkflowAction>();
099    }
100
101    @SuppressWarnings("unchecked")
102    public JSONObject toJSONObject() {
103        return toJSONObject("GMT");
104    }
105    
106    @SuppressWarnings("unchecked")
107    public JSONObject toJSONObject(String timeZoneId) {
108        JSONObject json = new JSONObject();
109        json.put(JsonTags.WORKFLOW_APP_PATH, getAppPath());
110        json.put(JsonTags.WORKFLOW_APP_NAME, getAppName());
111        json.put(JsonTags.WORKFLOW_ID, getId());
112        json.put(JsonTags.WORKFLOW_EXTERNAL_ID, getExternalId());
113        json.put(JsonTags.WORKFLOW_PARENT_ID, getParentId());
114        json.put(JsonTags.WORKFLOW_CONF, getConf());
115        json.put(JsonTags.WORKFLOW_STATUS, getStatus().toString());
116        json.put(JsonTags.WORKFLOW_LAST_MOD_TIME, JsonUtils.formatDateRfc822(getLastModifiedTime(), timeZoneId));
117        json.put(JsonTags.WORKFLOW_CREATED_TIME, JsonUtils.formatDateRfc822(getCreatedTime(), timeZoneId));
118        json.put(JsonTags.WORKFLOW_START_TIME, JsonUtils.formatDateRfc822(getStartTime(), timeZoneId));
119        json.put(JsonTags.WORKFLOW_END_TIME, JsonUtils.formatDateRfc822(getEndTime(), timeZoneId));
120        json.put(JsonTags.WORKFLOW_USER, getUser());
121        json.put(JsonTags.WORKFLOW_GROUP, getGroup());
122        json.put(JsonTags.WORKFLOW_ACL, getAcl());
123        json.put(JsonTags.WORKFLOW_RUN, (long) getRun());
124        json.put(JsonTags.WORKFLOW_CONSOLE_URL, getConsoleUrl());
125        json.put(JsonTags.WORKFLOW_ACTIONS, JsonWorkflowAction.toJSONArray(actions, timeZoneId));
126        json.put(JsonTags.TO_STRING, toString());
127        return json;
128    }
129
130    public String getAppPath() {
131        return appPath;
132    }
133
134    public void setAppPath(String appPath) {
135        this.appPath = appPath;
136    }
137
138    public String getAppName() {
139        return appName;
140    }
141
142    public void setAppName(String appName) {
143        this.appName = appName;
144    }
145
146    public String getId() {
147        return id;
148    }
149
150    public void setId(String id) {
151        this.id = id;
152    }
153
154    public void setExternalId(String externalId) {
155        this.externalId = externalId;
156    }
157
158    public String getExternalId() {
159        return externalId;
160    }
161
162    public String getConf() {
163        return conf;
164    }
165
166    public void setConf(String conf) {
167        this.conf = conf;
168    }
169
170    public Status getStatus() {
171        return status;
172    }
173
174    public void setStatus(Status status) {
175        this.status = status;
176    }
177
178    public Date getLastModifiedTime() {
179        return lastModifiedTime;
180    }
181
182    public void setLastModifiedTime(Date lastModTime) {
183        this.lastModifiedTime = lastModTime;
184    }
185
186    public Date getCreatedTime() {
187        return createdTime;
188    }
189
190    public void setCreatedTime(Date createdTime) {
191        this.createdTime = createdTime;
192    }
193
194    public Date getStartTime() {
195        return startTime;
196    }
197
198    public void setStartTime(Date startTime) {
199        this.startTime = startTime;
200    }
201
202    public Date getEndTime() {
203        return endTime;
204    }
205
206    public void setEndTime(Date endTime) {
207        this.endTime = endTime;
208    }
209
210    public String getUser() {
211        return user;
212    }
213
214    public void setUser(String user) {
215        this.user = user;
216    }
217
218    public String getGroup() {
219        return group;
220    }
221
222    @Override
223    public String getAcl() {
224        return getGroup();
225    }
226
227    public void setGroup(String group) {
228        this.group = group;
229    }
230
231    public int getRun() {
232        return run;
233    }
234
235    public void setRun(int run) {
236        this.run = run;
237    }
238
239    /**
240     * Return the workflow job console URL.
241     *
242     * @return the workflow job console URL.
243     */
244    public String getConsoleUrl() {
245        return consoleUrl;
246    }
247
248    /**
249     * Return the corresponding Action ID, if any.
250     *
251     * @return the coordinator Action Id.
252     */
253    public String getParentId() {
254        return parentId;
255    }
256
257    /**
258     * Set coordinator action id
259     *
260     * @param parentId : coordinator action id
261     */
262    public void setParentId(String parentId) {
263        this.parentId = parentId;
264    }
265
266    /**
267     * Set the workflow job console URL.
268     *
269     * @param consoleUrl the workflow job console URL.
270     */
271    public void setConsoleUrl(String consoleUrl) {
272        this.consoleUrl = consoleUrl;
273    }
274
275    @SuppressWarnings("unchecked")
276    public List<WorkflowAction> getActions() {
277        return (List) actions;
278    }
279
280    public void setActions(List<? extends JsonWorkflowAction> nodes) {
281        this.actions = (nodes != null) ? nodes : new ArrayList<JsonWorkflowAction>();
282    }
283
284    @Override
285    public String toString() {
286        return MessageFormat.format("Workflow id[{0}] status[{1}]", getId(), getStatus());
287    }
288
289    /**
290     * Convert a workflows list into a JSONArray.
291     *
292     * @param workflows workflows list.
293     * @param timeZoneId time zone to use for dates in the JSON array.
294     * @return the corresponding JSON array.
295     */
296    @SuppressWarnings("unchecked")
297    public static JSONArray toJSONArray(List<? extends JsonWorkflowJob> workflows, String timeZoneId) {
298        JSONArray array = new JSONArray();
299        if (workflows != null) {
300            for (JsonWorkflowJob node : workflows) {
301                array.add(node.toJSONObject(timeZoneId));
302            }
303        }
304        return array;
305    }
306
307}