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     */
018    package org.apache.oozie.client.rest;
019    
020    import java.text.MessageFormat;
021    import java.util.ArrayList;
022    import java.util.Date;
023    import java.util.List;
024    
025    import javax.persistence.Basic;
026    import javax.persistence.Column;
027    import javax.persistence.DiscriminatorColumn;
028    import javax.persistence.DiscriminatorType;
029    import javax.persistence.Entity;
030    import javax.persistence.Id;
031    import javax.persistence.Lob;
032    import javax.persistence.Table;
033    import javax.persistence.Transient;
034    
035    import org.apache.oozie.client.BundleJob;
036    import org.apache.oozie.client.CoordinatorJob;
037    import org.apache.oozie.client.Job;
038    import org.json.simple.JSONArray;
039    import org.json.simple.JSONObject;
040    
041    @Entity
042    @Table(name = "BUNDLE_JOBS")
043    @DiscriminatorColumn(name = "bean_type", discriminatorType = DiscriminatorType.STRING)
044    public class JsonBundleJob implements BundleJob, JsonBean {
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 = Job.Status.PREP;
066    
067        @Transient
068        private Date kickoffTime;
069    
070        @Transient
071        private Date startTime;
072    
073        @Transient
074        private Date endTime;
075    
076        @Transient
077        private Date pauseTime;
078    
079        @Transient
080        private Date createdTime;
081    
082        @Transient
083        private Timeunit timeUnit = BundleJob.Timeunit.MINUTE;
084    
085        @Basic
086        @Column(name = "time_out")
087        private int timeOut = 0;
088    
089        @Basic
090        @Column(name = "user_name")
091        private String user = null;
092    
093        @Basic
094        @Column(name = "group_name")
095        private String group = null;
096    
097        @Transient
098        private String consoleUrl;
099    
100        @Transient
101        private int pending = 0;
102    
103        @Transient
104        private List<? extends JsonCoordinatorJob> coordJobs;
105    
106        public JsonBundleJob() {
107            coordJobs = new ArrayList<JsonCoordinatorJob>();
108        }
109    
110        /**
111         * Get the value from the json object.
112         *
113         * @param json
114        public JsonBundleJob(JSONObject json) {
115            appPath = (String) json.get(JsonTags.BUNDLE_JOB_PATH);
116            appName = (String) json.get(JsonTags.BUNDLE_JOB_NAME);
117            id = (String) json.get(JsonTags.BUNDLE_JOB_ID);
118            externalId = (String) json.get(JsonTags.BUNDLE_JOB_EXTERNAL_ID);
119            conf = (String) json.get(JsonTags.BUNDLE_JOB_CONF);
120            status = Status.valueOf((String) json.get(JsonTags.BUNDLE_JOB_STATUS));
121            kickoffTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.BUNDLE_JOB_KICKOFF_TIME));
122            startTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.BUNDLE_JOB_START_TIME));
123            endTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.BUNDLE_JOB_END_TIME));
124            pauseTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.BUNDLE_JOB_PAUSE_TIME));
125            createdTime = JsonUtils.parseDateRfc822((String) json.get(JsonTags.BUNDLE_JOB_CREATED_TIME));
126            timeUnit = Timeunit.valueOf((String) json.get(JsonTags.BUNDLE_JOB_TIMEUNIT));
127            timeOut = (int) JsonUtils.getLongValue(json, JsonTags.BUNDLE_JOB_TIMEOUT);
128            user = (String) json.get(JsonTags.BUNDLE_JOB_USER);
129            group = (String) json.get(JsonTags.BUNDLE_JOB_GROUP);
130            consoleUrl = (String) json.get(JsonTags.BUNDLE_JOB_CONSOLE_URL);
131            coordJobs = JsonCoordinatorJob.fromJSONArray((JSONArray) json.get(JsonTags.BUNDLE_COORDINATOR_JOBS));
132        }
133    */
134    
135        /* (non-Javadoc)
136         * @see org.apache.oozie.client.rest.JsonBean#toJSONObject()
137         */
138        @Override
139        @SuppressWarnings("unchecked")
140        public JSONObject toJSONObject() {
141            return toJSONObject("GMT");
142        }
143        
144        /* (non-Javadoc)
145         * @see org.apache.oozie.client.rest.JsonBean#toJSONObject(String timeZoneId)
146         */
147        @Override
148        @SuppressWarnings("unchecked")
149        public JSONObject toJSONObject(String timeZoneId) {
150            JSONObject json = new JSONObject();
151            json.put(JsonTags.BUNDLE_JOB_PATH, appPath);
152            json.put(JsonTags.BUNDLE_JOB_NAME, appName);
153            json.put(JsonTags.BUNDLE_JOB_ID, id);
154            json.put(JsonTags.BUNDLE_JOB_EXTERNAL_ID, externalId);
155            json.put(JsonTags.BUNDLE_JOB_CONF, conf);
156            json.put(JsonTags.BUNDLE_JOB_STATUS, getStatus().toString());
157            json.put(JsonTags.BUNDLE_JOB_TIMEUNIT, getTimeUnit().toString());
158            json.put(JsonTags.BUNDLE_JOB_TIMEOUT, timeOut);
159            json.put(JsonTags.BUNDLE_JOB_KICKOFF_TIME, JsonUtils.formatDateRfc822(getKickoffTime(), timeZoneId));
160            json.put(JsonTags.BUNDLE_JOB_START_TIME, JsonUtils.formatDateRfc822(getStartTime(), timeZoneId));
161            json.put(JsonTags.BUNDLE_JOB_END_TIME, JsonUtils.formatDateRfc822(getEndTime(), timeZoneId));
162            json.put(JsonTags.BUNDLE_JOB_PAUSE_TIME, JsonUtils.formatDateRfc822(getPauseTime(), timeZoneId));
163            json.put(JsonTags.BUNDLE_JOB_CREATED_TIME, JsonUtils.formatDateRfc822(getCreatedTime(), timeZoneId));
164            json.put(JsonTags.BUNDLE_JOB_USER, getUser());
165            json.put(JsonTags.BUNDLE_JOB_GROUP, getGroup());
166            json.put(JsonTags.BUNDLE_JOB_ACL, getAcl());
167            json.put(JsonTags.BUNDLE_JOB_CONSOLE_URL, getConsoleUrl());
168            json.put(JsonTags.BUNDLE_COORDINATOR_JOBS, JsonCoordinatorJob.toJSONArray(coordJobs, timeZoneId));
169            json.put(JsonTags.TO_STRING, toString());
170    
171            return json;
172        }
173    
174        /* (non-Javadoc)
175         * @see org.apache.oozie.client.Job#getAppName()
176         */
177        @Override
178        public String getAppName() {
179            return appName;
180        }
181    
182        /* (non-Javadoc)
183         * @see org.apache.oozie.client.Job#getAppPath()
184         */
185        @Override
186        public String getAppPath() {
187            return appPath;
188        }
189    
190        /* (non-Javadoc)
191         * @see org.apache.oozie.client.Job#getConf()
192         */
193        @Override
194        public String getConf() {
195            return conf;
196        }
197    
198        /* (non-Javadoc)
199         * @see org.apache.oozie.client.Job#getConsoleUrl()
200         */
201        @Override
202        public String getConsoleUrl() {
203            return consoleUrl;
204        }
205    
206        /* (non-Javadoc)
207         * @see org.apache.oozie.client.BundleJob#getCoordinators()
208         */
209        @Override
210        @SuppressWarnings("unchecked")
211        public List<CoordinatorJob> getCoordinators() {
212            return (List) coordJobs;
213        }
214    
215        /* (non-Javadoc)
216         * @see org.apache.oozie.client.Job#getEndTime()
217         */
218        @Override
219        public Date getEndTime() {
220            return endTime;
221        }
222    
223        /* (non-Javadoc)
224         * @see org.apache.oozie.client.Job#getGroup()
225         */
226        @Override
227        @Deprecated
228        public String getGroup() {
229            return group;
230        }
231    
232        @Override
233        public String getAcl() {
234            return getGroup();
235        }
236    
237        /* (non-Javadoc)
238         * @see org.apache.oozie.client.Job#getId()
239         */
240        @Override
241        public String getId() {
242            return id;
243        }
244    
245        /* (non-Javadoc)
246         * @see org.apache.oozie.client.Job#getKickoffTime()
247         */
248        @Override
249        public Date getKickoffTime() {
250            return kickoffTime;
251        }
252    
253        /* (non-Javadoc)
254         * @see org.apache.oozie.client.Job#getStatus()
255         */
256        @Override
257        public Status getStatus() {
258            return status;
259        }
260    
261        /* (non-Javadoc)
262         * @see org.apache.oozie.client.BundleJob#getTimeUnit()
263         */
264        @Override
265        public Timeunit getTimeUnit() {
266            return timeUnit;
267        }
268    
269        /* (non-Javadoc)
270         * @see org.apache.oozie.client.BundleJob#getTimeout()
271         */
272        @Override
273        public int getTimeout() {
274            return timeOut;
275        }
276    
277        /* (non-Javadoc)
278         * @see org.apache.oozie.client.Job#getUser()
279         */
280        @Override
281        public String getUser() {
282            return user;
283        }
284    
285        /**
286         * Set id
287         *
288         * @param id the id to set
289         */
290        public void setId(String id) {
291            this.id = id;
292        }
293    
294        /**
295         * Set bundlePath
296         *
297         * @param bundlePath the bundlePath to set
298         */
299        public void setAppPath(String bundlePath) {
300            this.appPath = bundlePath;
301        }
302    
303        /**
304         * Set bundleName
305         *
306         * @param bundleName the bundleName to set
307         */
308        public void setAppName(String bundleName) {
309            this.appName = bundleName;
310        }
311    
312        /**
313         * Return externalId
314         *
315         * @return externalId
316         */
317        public String getExternalId() {
318            return this.externalId;
319        }
320    
321        /**
322         * Set externalId
323         *
324         * @param externalId the externalId to set
325         */
326        public void setExternalId(String externalId) {
327            this.externalId = externalId;
328        }
329    
330        /**
331         * Set conf
332         *
333         * @param conf the conf to set
334         */
335        public void setConf(String conf) {
336            this.conf = conf;
337        }
338    
339        /**
340         * Set status
341         *
342         * @param status the status to set
343         */
344        @Override
345        public void setStatus(Status status) {
346            this.status = status;
347        }
348    
349        /**
350         * Set kickoffTime
351         *
352         * @param kickoffTime the kickoffTime to set
353         */
354        public void setKickoffTime(Date kickoffTime) {
355            this.kickoffTime = kickoffTime;
356        }
357    
358        /**
359         * Set startTime
360         *
361         * @param kickoffTime the kickoffTime to set
362         */
363        public void setStartTime(Date startTime) {
364            this.startTime = startTime;
365        }
366    
367        /**
368         * Set endTime
369         *
370         * @param endTime the endTime to set
371         */
372        public void setEndTime(Date endTime) {
373            this.endTime = endTime;
374        }
375    
376        /**
377         * Get pauseTime
378         *
379         * @return pauseTime
380         */
381        public Date getPauseTime() {
382            return pauseTime;
383        }
384    
385        /**
386         * Set pauseTime
387         *
388         * @param pauseTime the pauseTime to set
389         */
390        public void setPauseTime(Date pauseTime) {
391            this.pauseTime = pauseTime;
392        }
393    
394        /**
395         * Get createdTime
396         *
397         * @return createdTime
398         */
399        public Date getCreatedTime() {
400            return createdTime;
401        }
402    
403        /**
404         * Set createdTime
405         *
406         * @param createdTime the createdTime to set
407         */
408        public void setCreatedTime(Date createdTime) {
409            this.createdTime = createdTime;
410        }
411    
412        /**
413         * Set timeUnit
414         *
415         * @param timeUnit the timeUnit to set
416         */
417        public void setTimeUnit(Timeunit timeUnit) {
418            this.timeUnit = timeUnit;
419        }
420    
421        /**
422         * Set timeOut
423         *
424         * @param timeOut the timeOut to set
425         */
426        public void setTimeOut(int timeOut) {
427            this.timeOut = timeOut;
428        }
429    
430        /**
431         * Set user
432         *
433         * @param user the user to set
434         */
435        public void setUser(String user) {
436            this.user = user;
437        }
438    
439        /**
440         * Set group
441         *
442         * @param group the group to set
443         */
444        public void setGroup(String group) {
445            this.group = group;
446        }
447    
448        /**
449         * Set consoleUrl
450         *
451         * @param consoleUrl the consoleUrl to set
452         */
453        public void setConsoleUrl(String consoleUrl) {
454            this.consoleUrl = consoleUrl;
455        }
456    
457        /**
458         * Set coordJobs
459         *
460         * @param coordJobs the coordJobs to set
461         */
462        public void setCoordJobs(List<? extends JsonCoordinatorJob> coordJobs) {
463            this.coordJobs = (coordJobs != null) ? coordJobs : new ArrayList<JsonCoordinatorJob>();
464        }
465    
466        /**
467         * Convert a Bundle job list into a JSONArray.
468         *
469         * @param application list.
470         * @param timeZoneId time zone to use for dates in the JSON array.
471         * @return the corresponding JSON array.
472         */
473        @SuppressWarnings("unchecked")
474        public static JSONArray toJSONArray(List<? extends JsonBundleJob> applications, String timeZoneId) {
475            JSONArray array = new JSONArray();
476            if (applications != null) {
477                for (JsonBundleJob application : applications) {
478                    array.add(application.toJSONObject(timeZoneId));
479                }
480            }
481            return array;
482        }
483    
484        /* (non-Javadoc)
485         * @see org.apache.oozie.client.Job#getStartTime()
486         */
487        @Override
488        public Date getStartTime() {
489            return startTime;
490        }
491    
492        /**
493         * Set pending to true
494         *
495         * @param pending set pending to true
496         */
497        public void setPending() {
498            this.pending = 1;
499        }
500    
501        /**
502         * Set pending to false
503         *
504         * @param pending set pending to false
505         */
506        public void resetPending() {
507            this.pending = 0;
508        }
509    
510        @Override
511        public String toString() {
512            return MessageFormat.format("Bundle id[{0}] status[{1}]", getId(), getStatus());
513        }
514    }