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 java.text.MessageFormat;
018    import java.util.ArrayList;
019    import java.util.Date;
020    import java.util.List;
021    
022    import javax.persistence.Basic;
023    import javax.persistence.Column;
024    import javax.persistence.DiscriminatorColumn;
025    import javax.persistence.DiscriminatorType;
026    import javax.persistence.Entity;
027    import javax.persistence.Id;
028    import javax.persistence.Lob;
029    import javax.persistence.Table;
030    import javax.persistence.Transient;
031    
032    import org.apache.oozie.client.CoordinatorAction;
033    import org.json.simple.JSONArray;
034    import org.json.simple.JSONObject;
035    
036    @Entity
037    @Table(name = "COORD_ACTIONS")
038    @DiscriminatorColumn(name = "bean_type", discriminatorType = DiscriminatorType.STRING)
039    public class JsonCoordinatorAction implements CoordinatorAction, JsonBean {
040    
041        @Id
042        private String id;
043    
044        @Transient
045        private String jobId;
046    
047        @Basic
048        @Column(name = "job_type")
049        private String type;
050    
051        @Transient
052        private Status status = CoordinatorAction.Status.WAITING;
053    
054        @Basic
055        @Column(name = "action_number")
056        private int actionNumber;
057    
058        @Transient
059        private Date createdTime;
060    
061        @Column(name = "created_conf")
062        @Lob
063        private String createdConf;
064    
065        @Transient
066        private String externalId;
067    
068        @Basic
069        @Column(name = "time_out")
070        private int timeOut = 0;
071    
072        @Transient
073        private Date lastModifiedTime;
074    
075        @Transient
076        private Date nominalTime;
077    
078        @Column(name = "run_conf")
079        @Lob
080        private String runConf;
081    
082        @Column(name = "action_xml")
083        @Lob
084        private String actionXml;
085    
086        @Column(name = "missing_dependencies")
087        @Lob
088        private String missingDependencies;
089    
090        @Basic
091        @Column(name = "external_status")
092        private String externalStatus;
093    
094        @Basic
095        @Column(name = "tracker_uri")
096        private String trackerUri;
097    
098        @Basic
099        @Column(name = "console_url")
100        private String consoleUrl;
101    
102        @Basic
103        @Column(name = "error_code")
104        private String errorCode;
105    
106        @Basic
107        @Column(name = "error_message")
108        private String errorMessage;
109    
110        public JsonCoordinatorAction() {
111    
112        }
113    
114        public JsonCoordinatorAction(JSONObject jsonObject) {
115            id = (String) jsonObject.get(JsonTags.COORDINATOR_ACTION_ID);
116            jobId = (String) jsonObject.get(JsonTags.COORDINATOR_JOB_ID);
117    
118            type = (String) jsonObject.get(JsonTags.COORDINATOR_ACTION_TYPE);
119            actionNumber = (int) JsonUtils.getLongValue(jsonObject,
120                                                        JsonTags.COORDINATOR_ACTION_NUMBER);
121            createdConf = (String) jsonObject
122                    .get(JsonTags.COORDINATOR_ACTION_CREATED_CONF);
123            createdTime = JsonUtils.parseDateRfc822((String) jsonObject
124                    .get(JsonTags.COORDINATOR_ACTION_CREATED_TIME));
125            nominalTime = JsonUtils.parseDateRfc822((String) jsonObject
126                    .get(JsonTags.COORDINATOR_ACTION_NOMINAL_TIME));
127            externalId = (String) jsonObject.get(JsonTags.COORDINATOR_ACTION_EXTERNALID);
128            status = Status.valueOf((String) jsonObject
129                    .get(JsonTags.COORDINATOR_ACTION_STATUS));
130            lastModifiedTime = JsonUtils.parseDateRfc822((String) jsonObject
131                    .get(JsonTags.COORDINATOR_ACTION_LAST_MODIFIED_TIME));
132            /*
133           * startTime = JsonUtils.parseDateRfc822((String) jsonObject
134           * .get(JsonTags.COORDINATOR_ACTION_START_TIME)); endTime =
135           * JsonUtils.parseDateRfc822((String) jsonObject
136           * .get(JsonTags.COORDINATOR_ACTION_END_TIME));
137           */
138            runConf = (String) jsonObject
139                    .get(JsonTags.COORDINATOR_ACTION_RUNTIME_CONF);
140            missingDependencies = (String) jsonObject
141                    .get(JsonTags.COORDINATOR_ACTION_MISSING_DEPS);
142            externalStatus = (String) jsonObject
143                    .get(JsonTags.COORDINATOR_ACTION_EXTERNAL_STATUS);
144            trackerUri = (String) jsonObject
145                    .get(JsonTags.COORDINATOR_ACTION_TRACKER_URI);
146            consoleUrl = (String) jsonObject
147                    .get(JsonTags.COORDINATOR_ACTION_CONSOLE_URL);
148            errorCode = (String) jsonObject
149                    .get(JsonTags.COORDINATOR_ACTION_ERROR_CODE);
150            errorMessage = (String) jsonObject
151                    .get(JsonTags.COORDINATOR_ACTION_ERROR_MESSAGE);
152        }
153    
154        @SuppressWarnings("unchecked")
155        public JSONObject toJSONObject() {
156            JSONObject json = new JSONObject();
157            json.put(JsonTags.COORDINATOR_ACTION_ID, id);
158            json.put(JsonTags.COORDINATOR_JOB_ID, jobId);
159            json.put(JsonTags.COORDINATOR_ACTION_TYPE, type);
160            json.put(JsonTags.COORDINATOR_ACTION_NUMBER, actionNumber);
161            json.put(JsonTags.COORDINATOR_ACTION_CREATED_CONF, createdConf);
162            json.put(JsonTags.COORDINATOR_ACTION_CREATED_TIME, JsonUtils
163                    .formatDateRfc822(createdTime));
164            json.put(JsonTags.COORDINATOR_ACTION_NOMINAL_TIME, JsonUtils
165                    .formatDateRfc822(nominalTime));
166            json.put(JsonTags.COORDINATOR_ACTION_EXTERNALID, externalId);
167            // json.put(JsonTags.COORDINATOR_ACTION_START_TIME, JsonUtils
168            // .formatDateRfc822(startTime));
169            json.put(JsonTags.COORDINATOR_ACTION_STATUS, status.toString());
170            json.put(JsonTags.COORDINATOR_ACTION_RUNTIME_CONF, runConf);
171            json.put(JsonTags.COORDINATOR_ACTION_LAST_MODIFIED_TIME, JsonUtils
172                    .formatDateRfc822(lastModifiedTime));
173            // json.put(JsonTags.COORDINATOR_ACTION_START_TIME, JsonUtils
174            // .formatDateRfc822(startTime));
175            // json.put(JsonTags.COORDINATOR_ACTION_END_TIME, JsonUtils
176            // .formatDateRfc822(endTime));
177            json.put(JsonTags.COORDINATOR_ACTION_MISSING_DEPS, missingDependencies);
178            json.put(JsonTags.COORDINATOR_ACTION_EXTERNAL_STATUS, externalStatus);
179            json.put(JsonTags.COORDINATOR_ACTION_TRACKER_URI, trackerUri);
180            json.put(JsonTags.COORDINATOR_ACTION_CONSOLE_URL, consoleUrl);
181            json.put(JsonTags.COORDINATOR_ACTION_ERROR_CODE, errorCode);
182            json.put(JsonTags.COORDINATOR_ACTION_ERROR_MESSAGE, errorMessage);
183            return json;
184        }
185    
186        public String getId() {
187            return id;
188        }
189    
190        public void setId(String id) {
191            this.id = id;
192        }
193    
194        public String getJobId() {
195            return jobId;
196        }
197    
198        public void setJobId(String id) {
199            this.jobId = id;
200        }
201    
202        public String getType() {
203            return type;
204        }
205    
206        public void setType(String type) {
207            this.type = type;
208        }
209    
210        public String getExternalId() {
211            return externalId;
212        }
213    
214        public void setExternalId(String extId) {
215            this.externalId = extId;
216        }
217    
218    
219        public void setActionNumber(int actionNumber) {
220            this.actionNumber = actionNumber;
221        }
222    
223        public int getActionNumber() {
224            return actionNumber;
225        }
226    
227        public String getCreatedConf() {
228            return createdConf;
229        }
230    
231        public void setCreatedConf(String createdConf) {
232            this.createdConf = createdConf;
233        }
234    
235        public void setCreatedTime(Date createdTime) {
236            this.createdTime = createdTime;
237        }
238    
239        public Date getCreatedTime() {
240            return createdTime;
241        }
242    
243        public Status getStatus() {
244            return status;
245        }
246    
247        public void setStatus(Status status) {
248            this.status = status;
249        }
250    
251        public void setLastModifiedTime(Date lastModifiedTime) {
252            this.lastModifiedTime = lastModifiedTime;
253        }
254    
255        public Date getLastModifiedTime() {
256            return lastModifiedTime;
257        }
258    
259        public void setRunConf(String runConf) {
260            this.runConf = runConf;
261        }
262    
263        public String getRunConf() {
264            return runConf;
265        }
266    
267        public void setMissingDependencies(String missingDependencies) {
268            this.missingDependencies = missingDependencies;
269        }
270    
271        public String getMissingDependencies() {
272            return missingDependencies;
273        }
274    
275        public String getExternalStatus() {
276            return externalStatus;
277        }
278    
279        public void setExternalStatus(String externalStatus) {
280            this.externalStatus = externalStatus;
281        }
282    
283        public String getTrackerUri() {
284            return trackerUri;
285        }
286    
287        public void setTrackerUri(String trackerUri) {
288            this.trackerUri = trackerUri;
289        }
290    
291        public String getConsoleUrl() {
292            return consoleUrl;
293        }
294    
295        public void setConsoleUrl(String consoleUrl) {
296            this.consoleUrl = consoleUrl;
297        }
298    
299        public String getErrorCode() {
300            return errorCode;
301        }
302    
303        public String getErrorMessage() {
304            return errorMessage;
305        }
306    
307        public void setErrorInfo(String errorCode, String errorMessage) {
308            this.errorCode = errorCode;
309            this.errorMessage = errorMessage;
310        }
311    
312        public String getActionXml() {
313            return actionXml;
314        }
315    
316        public void setActionXml(String actionXml) {
317            this.actionXml = actionXml;
318        }
319    
320        @Override
321        public String toString() {
322            return MessageFormat.format("WorkflowAction name[{0}] status[{1}]",
323                                        getId(), getStatus());
324        }
325    
326        public Date getNominalTime() {
327            return nominalTime;
328        }
329    
330        public void setNominalTime(Date nominalTime) {
331            this.nominalTime = nominalTime;
332        }
333    
334        public int getTimeOut() {
335            return timeOut;
336        }
337    
338        public void setTimeOut(int timeOut) {
339            this.timeOut = timeOut;
340        }
341    
342    
343        public void setErrorCode(String errorCode) {
344            this.errorCode = errorCode;
345        }
346    
347        public void setErrorMessage(String errorMessage) {
348            this.errorMessage = errorMessage;
349        }
350    
351        /**
352         * Convert a nodes list into a JSONArray.
353         *
354         * @param nodes nodes list.
355         * @return the corresponding JSON array.
356         */
357        @SuppressWarnings("unchecked")
358        public static JSONArray toJSONArray(
359                List<? extends JsonCoordinatorAction> actions) {
360            JSONArray array = new JSONArray();
361            for (JsonCoordinatorAction action : actions) {
362                array.add(action.toJSONObject());
363            }
364            return array;
365        }
366    
367        /**
368         * Convert a JSONArray into a nodes list.
369         *
370         * @param array JSON array.
371         * @return the corresponding nodes list.
372         */
373        @SuppressWarnings("unchecked")
374        public static List<JsonCoordinatorAction> fromJSONArray(JSONArray array) {
375            List<JsonCoordinatorAction> list = new ArrayList<JsonCoordinatorAction>();
376            for (Object obj : array) {
377                list.add(new JsonCoordinatorAction((JSONObject) obj));
378            }
379            return list;
380        }
381    
382        /*
383         * (non-Javadoc)
384         *
385         * @see java.lang.Object#hashCode()
386         */
387        @Override
388        public int hashCode() {
389            final int prime = 31;
390            int result = 1;
391            result = prime * result + ((id == null) ? 0 : id.hashCode());
392            return result;
393        }
394    
395        /*
396         * (non-Javadoc)
397         *
398         * @see java.lang.Object#equals(java.lang.Object)
399         */
400        @Override
401        public boolean equals(Object obj) {
402            if (this == obj) {
403                return true;
404            }
405            if (obj == null) {
406                return false;
407            }
408            if (getClass() != obj.getClass()) {
409                return false;
410            }
411            JsonCoordinatorAction other = (JsonCoordinatorAction) obj;
412            if (id == null) {
413                if (other.id != null) {
414                    return false;
415                }
416            }
417            else if (!id.equals(other.id)) {
418                return false;
419            }
420            return true;
421        }
422    }