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.sla;
019
020import java.sql.Timestamp;
021import java.util.ArrayList;
022import java.util.Date;
023import java.util.HashMap;
024import java.util.List;
025import java.util.Map;
026import java.util.Map.Entry;
027
028import javax.persistence.Basic;
029import javax.persistence.Column;
030import javax.persistence.Entity;
031import javax.persistence.Id;
032import javax.persistence.NamedQueries;
033import javax.persistence.NamedQuery;
034import javax.persistence.Table;
035import javax.persistence.Transient;
036
037import org.apache.oozie.AppType;
038import org.apache.oozie.client.event.Event.MessageType;
039import org.apache.oozie.client.rest.JsonBean;
040import org.apache.oozie.util.DateUtils;
041import org.apache.openjpa.persistence.jdbc.Index;
042import org.json.simple.JSONArray;
043import org.json.simple.JSONObject;
044
045@Entity
046@Table(name = "SLA_REGISTRATION")
047@NamedQueries({
048
049 @NamedQuery(name = "UPDATE_SLA_REG_ALL", query = "update SLARegistrationBean w set w.jobId = :jobId, w.nominalTimeTS = :nominalTime, w.expectedStartTS = :expectedStartTime, w.expectedEndTS = :expectedEndTime, w.expectedDuration = :expectedDuration, w.slaConfig = :slaConfig, w.notificationMsg = :notificationMsg, w.upstreamApps = :upstreamApps, w.appType = :appType, w.appName = :appName, w.user = :user, w.parentId = :parentId, w.jobData = :jobData where w.jobId = :jobId"),
050
051 @NamedQuery(name = "GET_SLA_REG_ON_RESTART", query = "select w.notificationMsg, w.upstreamApps, w.slaConfig, w.jobData from SLARegistrationBean w where w.jobId = :id"),
052
053 @NamedQuery(name = "GET_SLA_REG_ALL", query = "select OBJECT(w) from SLARegistrationBean w where w.jobId = :id") })
054public class SLARegistrationBean implements JsonBean {
055
056    @Id
057    @Basic
058    @Column(name = "job_id")
059    private String jobId;
060
061    @Basic
062    @Column(name = "parent_id")
063    private String parentId = null;
064
065    @Basic
066    @Column(name = "app_name")
067    private String appName = null;
068
069    @Basic
070    @Column(name = "app_type")
071    private String appType = null;
072
073    @Basic
074    @Column(name = "created_time")
075    private Timestamp createdTimeTS = null;
076
077    @Basic
078    @Index
079    @Column(name = "nominal_time")
080    private Timestamp nominalTimeTS = null;
081
082    @Basic
083    @Column(name = "expected_start")
084    private Timestamp expectedStartTS = null;
085
086    @Basic
087    @Column(name = "expected_end")
088    private Timestamp expectedEndTS = null;
089
090    @Basic
091    @Column(name = "expected_duration")
092    private long expectedDuration = -1;
093
094    @Basic
095    @Column(name = "user_name")
096    private String user = null;
097
098    @Basic
099    @Column(name = "upstream_apps")
100    private String upstreamApps = null;
101
102    @Basic
103    @Column(name = "job_data")
104    private String jobData = null;
105
106    @Basic
107    @Column(name = "sla_config")
108    private String slaConfig = null;
109
110    @Basic
111    @Column(name = "notification_msg")
112    private String notificationMsg = null;
113
114    @Transient
115    private Map<String, String> slaConfigMap;
116
117    @Transient
118    private MessageType msgType;
119
120    private final String ALERT_EVENTS = "alert_events";
121    private final String ALERT_CONTACT = "alert_contact";
122
123    public SLARegistrationBean() {
124        slaConfigMap = new HashMap<String, String>();
125        msgType = MessageType.SLA;
126    }
127
128    public SLARegistrationBean(JSONObject obj) {
129        // TODO use JSONObject
130        this();
131    }
132
133    public String getId() {
134        return jobId;
135    }
136
137    public void setId(String jobId) {
138        this.jobId = jobId;
139    }
140
141    public String getParentId() {
142        return parentId;
143    }
144
145    public void setParentId(String parentId) {
146        this.parentId = parentId;
147    }
148
149    public String getAppName() {
150        return appName;
151    }
152
153    public void setAppName(String appName) {
154        this.appName = appName;
155    }
156
157    public AppType getAppType() {
158        return AppType.valueOf(appType);
159    }
160
161    public void setAppType(AppType appType) {
162        this.appType = appType.toString();
163    }
164
165    public Timestamp getCreatedTimestamp() {
166        return createdTimeTS;
167    }
168
169    public void setCreatedTimestamp(Timestamp createdTime) {
170        this.createdTimeTS = createdTime;
171    }
172
173    public Date getCreatedTime() {
174        return DateUtils.toDate(createdTimeTS);
175    }
176
177    public void setCreatedTime(Date createdTime) {
178        this.createdTimeTS = DateUtils.convertDateToTimestamp(createdTime);
179    }
180
181    public Date getNominalTime() {
182        return DateUtils.toDate(nominalTimeTS);
183    }
184
185    public Timestamp getNominalTimestamp() {
186        return this.nominalTimeTS;
187    }
188
189    public void setNominalTime(Date nominalTime) {
190        this.nominalTimeTS = DateUtils.convertDateToTimestamp(nominalTime);
191    }
192
193    public Date getExpectedStart() {
194        return DateUtils.toDate(expectedStartTS);
195    }
196
197    public Timestamp getExpectedStartTimestamp() {
198        return this.expectedStartTS;
199    }
200
201    public void setExpectedStart(Date expectedStart) {
202        this.expectedStartTS = DateUtils.convertDateToTimestamp(expectedStart);
203    }
204
205    public Date getExpectedEnd() {
206        return DateUtils.toDate(expectedEndTS);
207    }
208
209    public Timestamp getExpectedEndTimestamp() {
210        return this.expectedEndTS;
211    }
212
213    public void setExpectedEnd(Date expectedEnd) {
214        this.expectedEndTS = DateUtils.convertDateToTimestamp(expectedEnd);
215    }
216
217    public long getExpectedDuration() {
218        return expectedDuration;
219    }
220
221    public void setExpectedDuration(long expectedDuration) {
222        this.expectedDuration = expectedDuration;
223    }
224
225    public String getUser() {
226        return user;
227    }
228
229    public void setUser(String user) {
230        this.user = user;
231    }
232
233    public String getUpstreamApps() {
234        return upstreamApps;
235    }
236
237    public void setUpstreamApps(String upstreamApps) {
238        this.upstreamApps = upstreamApps;
239    }
240
241    public String getJobData() {
242        return jobData;
243    }
244
245    public void setJobData(String jobData) {
246        this.jobData = jobData;
247    }
248
249    public String getSlaConfig() {
250        return slaConfig;
251    }
252
253    public void setSlaConfig(String configStr) {
254        this.slaConfig = configStr;
255        slaConfigStringToMap();
256    }
257
258    public String getNotificationMsg() {
259        return notificationMsg;
260    }
261
262    public void setNotificationMsg(String notificationMsg) {
263        this.notificationMsg = notificationMsg;
264    }
265
266    public String getAlertEvents() {
267        return slaConfigMap.get(ALERT_EVENTS);
268    }
269
270    public void setAlertEvents(String alertEvents) {
271        slaConfigMap.put(ALERT_EVENTS, alertEvents);
272        slaConfig = slaConfigMapToString();
273    }
274
275    public String getAlertContact() {
276        return slaConfigMap.get(ALERT_CONTACT);
277    }
278
279    public void setAlertContact(String alertContact) {
280        slaConfigMap.put(ALERT_CONTACT, alertContact);
281        slaConfig = slaConfigMapToString();
282    }
283
284    public Map<String, String> getSlaConfigMap() {
285        return slaConfigMap;
286    }
287
288    private void slaConfigStringToMap() {
289        if (slaConfig != null) {
290            String[] splitString = slaConfig.split("},");
291            for (String config : splitString) {
292                String[] pair = config.split("=");
293                if (pair.length == 2) {
294                    slaConfigMap.put(pair[0].substring(1), pair[1]);
295                }
296            }
297        }
298    }
299    
300    public String slaConfigMapToString() {
301        StringBuilder sb = new StringBuilder();
302        for (Entry<String, String> e : slaConfigMap.entrySet()) {
303            sb.append("{" + e.getKey() + "=" + e.getValue() + "},");
304        }
305        return sb.toString();
306    }
307
308    @Override
309    public JSONObject toJSONObject() {
310        // TODO
311        return null;
312    }
313
314    @Override
315    public JSONObject toJSONObject(String timeZoneId) {
316        // TODO
317        return null;
318    }
319
320    /**
321     * Convert a SLARegistrationBean list into a JSONArray.
322     *
323     * @param events SLARegistrationBean list.
324     * @param timeZoneId time zone to use for dates in the JSON array.
325     * @return the corresponding JSON array.
326     */
327    @SuppressWarnings("unchecked")
328    public static JSONArray toJSONArray(List<? extends SLARegistrationBean> events, String timeZoneId) {
329        JSONArray array = new JSONArray();
330        if (events != null) {
331            for (SLARegistrationBean node : events) {
332                array.add(node.toJSONObject(timeZoneId));
333            }
334        }
335        return array;
336    }
337
338    /**
339     * Convert a JSONArray into a SLARegistrationBean list.
340     *
341     * @param array JSON array.
342     * @return the corresponding SLA SLARegistrationBean list.
343     */
344    public static List<SLARegistrationBean> fromJSONArray(JSONArray array) {
345        List<SLARegistrationBean> list = new ArrayList<SLARegistrationBean>();
346        for (Object obj : array) {
347            list.add(new SLARegistrationBean((JSONObject) obj));
348        }
349        return list;
350    }
351
352    public MessageType getMsgType(){
353        return this.msgType;
354    }
355
356    public void setMsgType(MessageType msgType){
357        this.msgType = msgType;
358    }
359}