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