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