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.store;
016
017 import java.sql.SQLException;
018 import java.sql.Timestamp;
019 import java.util.ArrayList;
020 import java.util.Date;
021 import java.util.List;
022 import java.util.concurrent.Callable;
023
024 import javax.persistence.EntityManager;
025 import javax.persistence.Query;
026
027 import org.apache.oozie.ErrorCode;
028 import org.apache.oozie.SLAEventBean;
029 import org.apache.oozie.XException;
030 import org.apache.oozie.service.InstrumentationService;
031 import org.apache.oozie.service.Services;
032 import org.apache.oozie.util.Instrumentation;
033 import org.apache.oozie.util.ParamChecker;
034
035 public class SLAStore extends Store {
036 private EntityManager entityManager;
037 private static final String INSTR_GROUP = "db";
038
039 public SLAStore() throws StoreException {
040 super();
041 entityManager = getEntityManager();
042
043 }
044
045 public SLAStore(Store store) throws StoreException {
046 super(store);
047 entityManager = getEntityManager();
048 }
049
050 /**
051 * Create a CoordJobBean. It also creates the process instance for the job.
052 *
053 * @param workflow workflow bean
054 * @throws StoreException
055 */
056
057 public void insertSLAEvent(final SLAEventBean slaEvent) throws StoreException {
058 ParamChecker.notNull(slaEvent, "sLaEvent");
059
060 doOperation("insertSLAEvent", new Callable<Void>() {
061 public Void call() throws StoreException {
062 entityManager.persist(slaEvent);
063 return null;
064 }
065 });
066 }
067
068 /**
069 * Get a list of SLA Events newer than a specific sequence with limit clause.
070 *
071 * @param seqId sequence id
072 * @return List of SLA Events
073 * @throws StoreException
074 */
075 public List<SLAEventBean> getSLAEventListNewerSeqLimited(final long seqId, final int limitLen, long[] lastSeqId)
076 throws StoreException {
077 ParamChecker.notNull(seqId, "SLAEventListNewerSeqLimited");
078 ParamChecker.checkGTZero(limitLen, "SLAEventListNewerSeqLimited");
079
080 lastSeqId[0] = seqId;
081
082 List<SLAEventBean> seBeans = (List<SLAEventBean>) doOperation("getSLAEventListNewerSeqLimited",
083 new Callable<List<SLAEventBean>>() {
084
085 public List<SLAEventBean> call() throws StoreException {
086
087 List<SLAEventBean> seBeans;
088 try {
089 Query q = entityManager.createNamedQuery("GET_SLA_EVENT_NEWER_SEQ_LIMITED");
090 q.setParameter("id", seqId);
091 // q.setFirstResult(0);
092 q.setMaxResults(limitLen);
093 seBeans = q.getResultList();
094 }
095 catch (IllegalStateException e) {
096 throw new StoreException(ErrorCode.E0601, e.getMessage(), e);
097 }
098 return seBeans;
099 }
100 });
101 List<SLAEventBean> eventList = new ArrayList<SLAEventBean>();
102 for (SLAEventBean j : seBeans) {
103 lastSeqId[0] = Math.max(lastSeqId[0], j.getEvent_id());
104 eventList.add(j);
105 }
106 return eventList;
107 }
108
109 private SLAEventBean copyEventBean(SLAEventBean e) {
110 SLAEventBean event = new SLAEventBean();
111 event.setAlertContact(e.getAlertContact());
112 event.setAlertFrequency(e.getAlertFrequency());
113 event.setAlertPercentage(e.getAlertPercentage());
114 event.setAppName(e.getAppName());
115 event.setAppType(e.getAppType());
116 event.setAppTypeStr(e.getAppTypeStr());
117 event.setDevContact(e.getDevContact());
118 event.setEvent_id(e.getEvent_id());
119 event.setEventType(e.getEventType());
120 event.setExpectedEnd(e.getExpectedEnd());
121 event.setExpectedStart(e.getExpectedStart());
122 event.setGroupName(e.getGroupName());
123 event.setJobData(e.getJobData());
124 event.setJobStatus(e.getJobStatus());
125 event.setJobStatusStr(e.getJobStatusStr());
126 event.setNotificationMsg(e.getNotificationMsg());
127 event.setParentClientId(e.getParentClientId());
128 event.setParentSlaId(e.getParentSlaId());
129 event.setQaContact(e.getQaContact());
130 event.setSeContact(e.getSeContact());
131 event.setSlaId(e.getSlaId());
132 event.setStatusTimestamp(e.getStatusTimestamp());
133 event.setUpstreamApps(e.getUpstreamApps());
134 event.setUser(e.getUser());
135 return event;
136 }
137
138 private <V> V doOperation(String name, Callable<V> command) throws StoreException {
139 try {
140 Instrumentation.Cron cron = new Instrumentation.Cron();
141 cron.start();
142 V retVal;
143 try {
144 retVal = command.call();
145 }
146 finally {
147 cron.stop();
148 }
149 Services.get().get(InstrumentationService.class).get().addCron(INSTR_GROUP, name, cron);
150 return retVal;
151 }
152 catch (StoreException ex) {
153 throw ex;
154 }
155 catch (SQLException ex) {
156 throw new StoreException(ErrorCode.E0603, name, ex.getMessage(), ex);
157 }
158 catch (Exception e) {
159 throw new StoreException(ErrorCode.E0607, name, e.getMessage(), e);
160 }
161 }
162
163 }