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