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