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;
016    
017    import java.io.DataInput;
018    import java.io.DataOutput;
019    import java.io.IOException;
020    import java.sql.Timestamp;
021    import java.text.MessageFormat;
022    import java.util.ArrayList;
023    import java.util.Date;
024    import java.util.List;
025    
026    import javax.persistence.Basic;
027    import javax.persistence.Column;
028    import javax.persistence.Entity;
029    import javax.persistence.NamedQueries;
030    import javax.persistence.NamedQuery;
031    
032    import org.apache.hadoop.io.Writable;
033    import org.apache.oozie.client.SLAEvent;
034    import org.apache.oozie.client.rest.JsonSLAEvent;
035    import org.apache.oozie.util.DateUtils;
036    import org.apache.oozie.util.XLog;
037    import org.jdom.Element;
038    import org.json.simple.JSONArray;
039    import org.json.simple.JSONObject;
040    
041    @Entity
042    @NamedQueries({
043    
044        @NamedQuery(name = "GET_SLA_EVENT_NEWER_SEQ_LIMITED", query = "select OBJECT(w) from SLAEventBean w where w.event_id > :id order by w.event_id")})
045    public class SLAEventBean extends JsonSLAEvent implements Writable {
046    
047        @Basic
048        @Column(name = "job_status")
049        private String jobStatusStr = null;
050    
051        @Basic
052        @Column(name = "app_type")
053        private String appTypeStr = null;
054    
055        @Basic
056        @Column(name = "expected_start")
057        private java.sql.Timestamp expectedStartTS = null;
058    
059        @Basic
060        @Column(name = "expected_end")
061        private java.sql.Timestamp expectedEndTS = null;
062    
063        @Basic
064        @Column(name = "status_timestamp")
065        private java.sql.Timestamp statusTimestampTS = null;
066    
067        @Basic
068        @Column(name = "event_type")
069        private String eventType = null;
070    
071        public SLAEventBean() {
072    
073        }
074    
075        public String getJobStatusStr() {
076            return jobStatusStr;
077        }
078    
079        public void setJobStatusStr(String jobStatusStr) {
080            this.jobStatusStr = jobStatusStr;
081        }
082    
083        public Status getJobStatus() {
084            return Status.valueOf(this.jobStatusStr);
085        }
086    
087        public void setJobStatus(Status jobStatus) {
088            super.setJobStatus(jobStatus);
089            this.jobStatusStr = jobStatus.toString();
090        }
091    
092        public String getAppTypeStr() {
093            return appTypeStr;
094        }
095    
096        public void setAppTypeStr(String appTypeStr) {
097            this.appTypeStr = appTypeStr;
098        }
099    
100        public SlaAppType getAppType() {
101            return SlaAppType.valueOf(appTypeStr);
102        }
103    
104        public void setAppType(SlaAppType appType) {
105            super.setAppType(appType);
106            this.appTypeStr = appType.toString();
107        }
108    
109        public java.sql.Timestamp getExpectedStartTS() {
110            return expectedStartTS;
111        }
112    
113        public Date getExpectedStart() {
114            return DateUtils.toDate(expectedStartTS);
115        }
116    
117        public void setExpectedStart(Date expectedStart) {
118            super.setExpectedStart(expectedStart);
119            this.expectedStartTS = DateUtils.convertDateToTimestamp(expectedStart);
120        }
121    
122        public java.sql.Timestamp getExpectedEndTS() {
123            return expectedEndTS;
124        }
125    
126        public Date getExpectedEnd() {
127            return DateUtils.toDate(expectedEndTS);
128        }
129    
130        public void setExpectedEnd(Date expectedEnd) {
131            super.setExpectedEnd(expectedEnd);
132            this.expectedEndTS = DateUtils.convertDateToTimestamp(expectedEnd);
133        }
134    
135        public java.sql.Timestamp getStatusTimestampTS() {
136            return statusTimestampTS;
137        }
138    
139        public Date getStatusTimestamp() {
140            return DateUtils.toDate(statusTimestampTS);
141        }
142    
143        public void setStatusTimestamp(Date statusTimestamp) {
144            super.setStatusTimestamp(statusTimestamp);
145            this.statusTimestampTS = DateUtils.convertDateToTimestamp(statusTimestamp);
146        }
147    
148        public String getEventType() {
149            return eventType;
150        }
151    
152        public void setEventType(String eventType) {
153            this.eventType = eventType;
154        }
155    
156        @Override
157        public void readFields(DataInput arg0) throws IOException {
158            // TODO Auto-generated method stub
159    
160        }
161    
162        @Override
163        public void write(DataOutput arg0) throws IOException {
164            // TODO Auto-generated method stub
165    
166        }
167    
168        public String toString() {
169            return MessageFormat.format("Event id[{0}] status[{1}]", getEvent_id(),
170                                        getJobStatus());
171        }
172    
173        /**
174         * Convert a SLAEvent list into a JSONArray.
175         *
176         * @param SLAEVent list.
177         * @return the corresponding JSON array.
178         */
179        @SuppressWarnings("unchecked")
180        public static JSONArray toJSONArray(List<? extends SLAEventBean> events) {
181            JSONArray array = new JSONArray();
182            if (events != null) {
183                for (JsonSLAEvent node : events) {
184                    array.add(node.toJSONObject());
185                }
186            }
187            return array;
188        }
189    
190        /**
191         * Convert a JSONArray into a SLAEvent list.
192         *
193         * @param array JSON array.
194         * @return the corresponding SLA event list.
195         */
196        @SuppressWarnings("unchecked")
197        public static List<SLAEvent> fromJSONArray(JSONArray array) {
198            List<SLAEvent> list = new ArrayList<SLAEvent>();
199            for (Object obj : array) {
200                list.add(new JsonSLAEvent((JSONObject) obj));
201            }
202            return list;
203        }
204    
205        /* public String toXml2() {
206                String ret = "";
207                if (getJobStatus() == Status.CREATED) {
208                    ret = getRegistrationEventXml();
209                }
210                else {
211                    ret = getStatusEventXml();
212                }
213                return createATag("event", ret);
214            }
215    
216            private String getStatusEventXml() {
217                StringBuilder statXml = new StringBuilder();
218                statXml
219                        .append(createATag("sequence-id", String.valueOf(getEvent_id())));
220                statXml.append("<status>");
221                statXml.append(createATag("sla-id", getSlaId()));
222                statXml.append(createATag("status-timestamp",
223                        getDateString(getStatusTimestamp())));
224                statXml.append(createATag("job-status", getJobStatus().toString()));
225                statXml.append("</status>");
226                return statXml.toString();
227            }
228    
229            private String getRegistrationEventXml() {
230                StringBuilder regXml = new StringBuilder();
231                regXml.append(createATag("sequence-id", String.valueOf(getEvent_id())));
232                regXml.append("<registration>");
233                regXml.append(createATag("sla-id", String.valueOf(getSlaId())));
234                regXml.append(createATag("app-type", getAppType().toString()));
235                regXml.append(createATag("app-name", getAppName()));
236                regXml.append(createATag("user", getUser()));
237                regXml.append(createATag("group", getGroupName()));
238                regXml.append(createATag("parent-sla-id", String
239                        .valueOf(getParentSlaId())));
240                regXml.append(createATag("expected-start",
241                        getDateString(getExpectedStart())));
242                regXml.append(createATag("expected-end",
243                        getDateString(getExpectedEnd())));
244                regXml.append(createATag("status-timestamp",
245                        getDateString(getStatusTimestamp())));
246                regXml.append(createATag("job-status", getJobStatus().toString()));
247    
248                regXml.append(createATag("alert-contact", getAlertContact()));
249                regXml.append(createATag("dev-contact", getDevContact()));
250                regXml.append(createATag("qa-contact", getQaContact()));
251                regXml.append(createATag("se-contact", getSeContact()));
252                regXml.append(createATag("notification-msg", getNotificationMsg()));
253                regXml.append(createATag("alert-percentage", getAlertPercentage()));
254                regXml.append(createATag("alert-frequency", getAlertFrequency()));
255                regXml.append(createATag("upstream-apps", getUpstreamApps()));
256                regXml.append("</registration>");
257                return regXml.toString();
258            }
259            private String createATag(String tag, String content) {
260                if (content == null) {
261                    content = "";
262                }
263                return "<" + tag + ">" + content + "</" + tag + ">";
264            }
265        */
266        public Element toXml() {
267            Element retElem = null;
268            if (getJobStatus() == Status.CREATED) {
269                retElem = getRegistrationEvent("event");
270            }
271            else {
272                retElem = getStatusEvent("event");
273            }
274            return retElem;
275        }
276    
277        private Element getRegistrationEvent(String tag) {
278            Element eReg = new Element(tag);
279            eReg.addContent(createATagElement("sequence-id", String.valueOf(getEvent_id())));
280            Element e = new Element("registration");
281            e.addContent(createATagElement("sla-id", getSlaId()));
282            //e.addContent(createATagElement("sla-id", String.valueOf(getSlaId())));
283            e.addContent(createATagElement("app-type", getAppType().toString()));
284            e.addContent(createATagElement("app-name", getAppName()));
285            e.addContent(createATagElement("user", getUser()));
286            e.addContent(createATagElement("group", getGroupName()));
287            e.addContent(createATagElement("parent-sla-id", String
288                    .valueOf(getParentSlaId())));
289            e.addContent(createATagElement("expected-start",
290                                           getDateString(getExpectedStart())));
291            e.addContent(createATagElement("expected-end",
292                                           getDateString(getExpectedEnd())));
293            e.addContent(createATagElement("status-timestamp",
294                                           getDateString(getStatusTimestamp())));
295            e.addContent(createATagElement("notification-msg", getNotificationMsg()));
296    
297            e.addContent(createATagElement("alert-contact", getAlertContact()));
298            e.addContent(createATagElement("dev-contact", getDevContact()));
299            e.addContent(createATagElement("qa-contact", getQaContact()));
300            e.addContent(createATagElement("se-contact", getSeContact()));
301    
302            e.addContent(createATagElement("alert-percentage", getAlertPercentage()));
303            e.addContent(createATagElement("alert-frequency", getAlertFrequency()));
304    
305            e.addContent(createATagElement("upstream-apps", getUpstreamApps()));
306            e.addContent(createATagElement("job-status", getJobStatus().toString()));
307            e.addContent(createATagElement("job-data", getJobData()));
308            eReg.addContent(e);
309            return eReg;
310        }
311    
312        private Element getStatusEvent(String tag) {
313            Element eStat = new Element(tag);
314            eStat.addContent(createATagElement("sequence-id", String.valueOf(getEvent_id())));
315            Element e = new Element("status");
316            e.addContent(createATagElement("sla-id", getSlaId()));
317            e.addContent(createATagElement("status-timestamp",
318                                           getDateString(getStatusTimestamp())));
319            e.addContent(createATagElement("job-status", getJobStatus().toString()));
320            e.addContent(createATagElement("job-data", getJobData()));
321            eStat.addContent(e);
322            return eStat;
323        }
324    
325        private Element createATagElement(String tag, String content) {
326            if (content == null) {
327                content = "";
328            }
329            Element e = new Element(tag);
330            e.addContent(content);
331            return e;
332        }
333    
334        private Element createATagElement(String tag, Element content) {
335            Element e = new Element(tag);
336            e.addContent(content);
337            return e;
338        }
339    
340        private String getDateString(Date d) {
341            try {
342                return DateUtils.formatDateUTC(d);
343            }
344            catch (Exception e) {
345                // TODO Auto-generated catch block
346                e.printStackTrace();
347                XLog.getLog(getClass()).error("Date formatting error " + d, e);
348                throw new RuntimeException("Date formatting error " + d + e);
349            }
350        }
351    
352    }