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.CoordinatorJob; 018 import org.apache.oozie.client.CoordinatorAction; 019 import org.json.simple.JSONArray; 020 import org.json.simple.JSONObject; 021 022 import java.text.MessageFormat; 023 import java.util.Date; 024 import java.util.List; 025 import java.util.ArrayList; 026 027 import javax.persistence.*; 028 029 @Entity 030 @Table(name = "COORD_JOBS") 031 @DiscriminatorColumn(name = "bean_type", discriminatorType = DiscriminatorType.STRING) 032 public class JsonCoordinatorJob implements CoordinatorJob, JsonBean { 033 034 @Id 035 private String id; 036 037 @Basic 038 @Column(name = "app_path") 039 private String appPath = null; 040 041 @Basic 042 @Column(name = "app_name") 043 private String appName = null; 044 045 @Basic 046 @Column(name = "external_id") 047 private String externalId = null; 048 049 @Column(name = "conf") 050 @Lob 051 private String conf = null; 052 053 @Transient 054 private Status status = CoordinatorJob.Status.PREP; 055 056 @Transient 057 private Execution executionOrder = CoordinatorJob.Execution.LIFO; 058 059 @Transient 060 private Date startTime; 061 062 @Transient 063 private Date endTime; 064 065 @Transient 066 private Date pauseTime; 067 068 @Basic 069 @Column(name = "frequency") 070 private int frequency = 0; 071 072 @Basic 073 @Column(name = "time_zone") 074 private String timeZone = null; 075 076 @Basic 077 @Column(name = "concurrency") 078 private int concurrency = 0; 079 080 @Transient 081 private Timeunit timeUnit = CoordinatorJob.Timeunit.MINUTE; 082 083 @Basic 084 @Column(name = "time_out") 085 private int timeOut = 0; 086 087 @Transient 088 private Date lastAction; 089 090 @Basic 091 @Column(name = "last_action_number") 092 private int lastActionNumber; 093 094 @Transient 095 private Date nextMaterializedTime; 096 097 @Basic 098 @Column(name = "user_name") 099 private String user = null; 100 101 @Basic 102 @Column(name = "group_name") 103 private String group = null; 104 105 @Basic 106 @Column(name = "bundle_id") 107 private String bundleId = null; 108 109 @Transient 110 private String consoleUrl; 111 112 @Transient 113 private List<? extends JsonCoordinatorAction> actions; 114 115 public JsonCoordinatorJob() { 116 actions = new ArrayList<JsonCoordinatorAction>(); 117 } 118 119 public JsonCoordinatorJob(JSONObject json) { 120 appPath = (String) json.get(JsonTags.COORDINATOR_JOB_PATH); 121 appName = (String) json.get(JsonTags.COORDINATOR_JOB_NAME); 122 id = (String) json.get(JsonTags.COORDINATOR_JOB_ID); 123 externalId = (String) json.get(JsonTags.COORDINATOR_JOB_EXTERNAL_ID); 124 conf = (String) json.get(JsonTags.COORDINATOR_JOB_CONF); 125 status = Status.valueOf((String) json.get(JsonTags.COORDINATOR_JOB_STATUS)); 126 executionOrder = Execution.valueOf((String) json.get(JsonTags.COORDINATOR_JOB_EXECUTIONPOLICY)); 127 startTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.COORDINATOR_JOB_START_TIME)); 128 endTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.COORDINATOR_JOB_END_TIME)); 129 pauseTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.COORDINATOR_JOB_PAUSE_TIME)); 130 frequency = (int) JsonUtils.getLongValue(json, JsonTags.COORDINATOR_JOB_FREQUENCY); 131 timeUnit = Timeunit.valueOf((String) json.get(JsonTags.COORDINATOR_JOB_TIMEUNIT)); 132 timeZone = (String) json.get(JsonTags.COORDINATOR_JOB_TIMEZONE); 133 concurrency = (int) JsonUtils.getLongValue(json, JsonTags.COORDINATOR_JOB_CONCURRENCY); 134 timeOut = (int) JsonUtils.getLongValue(json, JsonTags.COORDINATOR_JOB_TIMEOUT); 135 lastAction = JsonUtils.parseDateRfc822((String) json.get(JsonTags.COORDINATOR_JOB_LAST_ACTION_TIME)); 136 nextMaterializedTime = JsonUtils.parseDateRfc822((String) json 137 .get(JsonTags.COORDINATOR_JOB_NEXT_MATERIALIZED_TIME)); 138 user = (String) json.get(JsonTags.COORDINATOR_JOB_USER); 139 group = (String) json.get(JsonTags.COORDINATOR_JOB_GROUP); 140 consoleUrl = (String) json.get(JsonTags.COORDINATOR_JOB_CONSOLE_URL); 141 actions = JsonCoordinatorAction.fromJSONArray((JSONArray) json.get(JsonTags.COORDINATOR_ACTIONS)); 142 } 143 144 @SuppressWarnings("unchecked") 145 public JSONObject toJSONObject() { 146 JSONObject json = new JSONObject(); 147 json.put(JsonTags.COORDINATOR_JOB_PATH, appPath); 148 json.put(JsonTags.COORDINATOR_JOB_NAME, appName); 149 json.put(JsonTags.COORDINATOR_JOB_ID, id); 150 json.put(JsonTags.COORDINATOR_JOB_EXTERNAL_ID, externalId); 151 json.put(JsonTags.COORDINATOR_JOB_CONF, conf); 152 json.put(JsonTags.COORDINATOR_JOB_STATUS, status.toString()); 153 json.put(JsonTags.COORDINATOR_JOB_EXECUTIONPOLICY, executionOrder.toString()); 154 json.put(JsonTags.COORDINATOR_JOB_FREQUENCY, frequency); 155 json.put(JsonTags.COORDINATOR_JOB_TIMEUNIT, timeUnit.toString()); 156 json.put(JsonTags.COORDINATOR_JOB_TIMEZONE, timeZone); 157 json.put(JsonTags.COORDINATOR_JOB_CONCURRENCY, concurrency); 158 json.put(JsonTags.COORDINATOR_JOB_TIMEOUT, timeOut); 159 json.put(JsonTags.COORDINATOR_JOB_LAST_ACTION_TIME, JsonUtils.formatDateRfc822(lastAction)); 160 json.put(JsonTags.COORDINATOR_JOB_NEXT_MATERIALIZED_TIME, JsonUtils.formatDateRfc822(nextMaterializedTime)); 161 json.put(JsonTags.COORDINATOR_JOB_START_TIME, JsonUtils.formatDateRfc822(startTime)); 162 json.put(JsonTags.COORDINATOR_JOB_END_TIME, JsonUtils.formatDateRfc822(endTime)); 163 json.put(JsonTags.COORDINATOR_JOB_PAUSE_TIME, JsonUtils.formatDateRfc822(pauseTime)); 164 json.put(JsonTags.COORDINATOR_JOB_USER, user); 165 json.put(JsonTags.COORDINATOR_JOB_GROUP, group); 166 json.put(JsonTags.COORDINATOR_JOB_CONSOLE_URL, consoleUrl); 167 json.put(JsonTags.COORDINATOR_ACTIONS, JsonCoordinatorAction.toJSONArray(actions)); 168 169 return json; 170 } 171 172 public String getAppPath() { 173 return appPath; 174 } 175 176 public void setAppPath(String appPath) { 177 this.appPath = appPath; 178 } 179 180 public String getAppName() { 181 return appName; 182 } 183 184 public void setAppName(String appName) { 185 this.appName = appName; 186 } 187 188 public String getId() { 189 return id; 190 } 191 192 public void setId(String id) { 193 this.id = id; 194 } 195 196 public void setExternalId(String externalId) { 197 this.externalId = externalId; 198 } 199 200 public String getExternalId() { 201 return externalId; 202 } 203 204 public String getConf() { 205 return conf; 206 } 207 208 public void setConf(String conf) { 209 this.conf = conf; 210 } 211 212 public Status getStatus() { 213 return status; 214 } 215 216 public void setStatus(Status status) { 217 this.status = status; 218 } 219 220 public void setFrequency(int frequency) { 221 this.frequency = frequency; 222 } 223 224 public int getFrequency() { 225 return frequency; 226 } 227 228 public void setTimeUnit(Timeunit timeUnit) { 229 this.timeUnit = timeUnit; 230 } 231 232 public Timeunit getTimeUnit() { 233 return timeUnit; 234 } 235 236 public void setTimeZone(String timeZone) { 237 this.timeZone = timeZone; 238 } 239 240 public String getTimeZone() { 241 return timeZone; 242 } 243 244 public void setConcurrency(int concurrency) { 245 this.concurrency = concurrency; 246 } 247 248 public int getConcurrency() { 249 return concurrency; 250 } 251 252 public void setExecutionOrder(Execution order) { 253 this.executionOrder = order; 254 } 255 256 public Execution getExecutionOrder() { 257 return executionOrder; 258 } 259 260 public void setTimeout(int timeOut) { 261 this.timeOut = timeOut; 262 } 263 264 public int getTimeout() { 265 return timeOut; 266 } 267 268 public void setLastActionTime(Date lastAction) { 269 this.lastAction = lastAction; 270 } 271 272 public Date getLastActionTime() { 273 return lastAction; 274 } 275 276 public Date getNextMaterializedTime() { 277 return nextMaterializedTime; 278 } 279 280 public void setNextMaterializedTime(Date nextMaterializedTime) { 281 this.nextMaterializedTime = nextMaterializedTime; 282 } 283 284 public Date getStartTime() { 285 return startTime; 286 } 287 288 public void setStartTime(Date startTime) { 289 this.startTime = startTime; 290 } 291 292 public Date getEndTime() { 293 return endTime; 294 } 295 296 public void setEndTime(Date endTime) { 297 this.endTime = endTime; 298 } 299 300 public Date getPauseTime() { 301 return pauseTime; 302 } 303 304 public void setPauseTime(Date pauseTime) { 305 this.pauseTime = pauseTime; 306 } 307 308 public String getUser() { 309 return user; 310 } 311 312 public void setUser(String user) { 313 this.user = user; 314 } 315 316 public String getGroup() { 317 return group; 318 } 319 320 public void setGroup(String group) { 321 this.group = group; 322 } 323 324 public String getBundleId() { 325 return bundleId; 326 } 327 328 public void setBundleId(String bundleId) { 329 this.bundleId = bundleId; 330 } 331 332 /** 333 * Return the coordinate application console URL. 334 * 335 * @return the coordinate application console URL. 336 */ 337 public String getConsoleUrl() { 338 return consoleUrl; 339 } 340 341 /** 342 * Set the coordinate application console URL. 343 * 344 * @param consoleUrl the coordinate application console URL. 345 */ 346 public void setConsoleUrl(String consoleUrl) { 347 this.consoleUrl = consoleUrl; 348 } 349 350 public String toString() { 351 return MessageFormat.format("Coornidator application id[{0}] status[{1}]", getId(), getStatus()); 352 } 353 354 public void setActions(List<? extends JsonCoordinatorAction> nodes) { 355 this.actions = (nodes != null) ? nodes : new ArrayList<JsonCoordinatorAction>(); 356 } 357 358 @SuppressWarnings("unchecked") 359 public List<CoordinatorAction> getActions() { 360 return (List) actions; 361 } 362 363 /** 364 * Convert a coordinator application list into a JSONArray. 365 * 366 * @param application list. 367 * @return the corresponding JSON array. 368 */ 369 @SuppressWarnings("unchecked") 370 public static JSONArray toJSONArray(List<? extends JsonCoordinatorJob> applications) { 371 JSONArray array = new JSONArray(); 372 if (applications != null) { 373 for (JsonCoordinatorJob application : applications) { 374 array.add(application.toJSONObject()); 375 } 376 } 377 return array; 378 } 379 380 /** 381 * Convert a JSONArray into a application list. 382 * 383 * @param array JSON array. 384 * @return the corresponding application list. 385 */ 386 @SuppressWarnings("unchecked") 387 public static List<CoordinatorJob> fromJSONArray(JSONArray applications) { 388 List<CoordinatorJob> list = new ArrayList<CoordinatorJob>(); 389 for (Object obj : applications) { 390 list.add(new JsonCoordinatorJob((JSONObject) obj)); 391 } 392 return list; 393 } 394 395 public int getLastActionNumber() { 396 return lastActionNumber; 397 } 398 399 public void setLastActionNumber(int lastActionNumber) { 400 this.lastActionNumber = lastActionNumber; 401 } 402 }