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
019package org.apache.oozie.executor.jpa;
020
021import java.sql.Timestamp;
022import java.util.List;
023
024import javax.persistence.EntityManager;
025import javax.persistence.Query;
026
027import org.apache.oozie.ErrorCode;
028import org.apache.oozie.service.JPAService;
029import org.apache.oozie.service.Services;
030import org.apache.oozie.sla.SLASummaryBean;
031
032/**
033 * Query Executor for SLA Event
034 *
035 */
036public class SLASummaryQueryExecutor extends QueryExecutor<SLASummaryBean, SLASummaryQueryExecutor.SLASummaryQuery> {
037
038    public enum SLASummaryQuery {
039        UPDATE_SLA_SUMMARY_FOR_STATUS_ACTUAL_TIMES,
040        UPDATE_SLA_SUMMARY_ALL,
041        UPDATE_SLA_SUMMARY_EVENTPROCESSED,
042        UPDATE_SLA_SUMMARY_FOR_EXPECTED_TIMES,
043        UPDATE_SLA_SUMMARY_LAST_MODIFIED_TIME,
044        GET_SLA_SUMMARY,
045        GET_SLA_SUMMARY_EVENTPROCESSED,
046        GET_SLA_SUMMARY_EVENTPROCESSED_LAST_MODIFIED
047    };
048
049    private static SLASummaryQueryExecutor instance = new SLASummaryQueryExecutor();
050
051    private SLASummaryQueryExecutor() {
052    }
053
054    public static QueryExecutor<SLASummaryBean, SLASummaryQueryExecutor.SLASummaryQuery> getInstance() {
055        return SLASummaryQueryExecutor.instance;
056    }
057
058    @Override
059    public Query getUpdateQuery(SLASummaryQuery namedQuery, SLASummaryBean bean, EntityManager em)
060            throws JPAExecutorException {
061        Query query = em.createNamedQuery(namedQuery.name());
062        switch (namedQuery) {
063            case UPDATE_SLA_SUMMARY_FOR_STATUS_ACTUAL_TIMES:
064                query.setParameter("jobId", bean.getId());
065                query.setParameter("slaStatus", bean.getSLAStatus().toString());
066                query.setParameter("lastModifiedTS", bean.getLastModifiedTimestamp());
067                query.setParameter("eventStatus", bean.getEventStatusString());
068                query.setParameter("jobStatus", bean.getJobStatus());
069                query.setParameter("eventProcessed", bean.getEventProcessed());
070                query.setParameter("actualStartTS", bean.getActualStartTimestamp());
071                query.setParameter("actualEndTS", bean.getActualEndTimestamp());
072                query.setParameter("actualDuration", bean.getActualDuration());
073                break;
074            case UPDATE_SLA_SUMMARY_ALL:
075                query.setParameter("appName", bean.getAppName());
076                query.setParameter("appType", bean.getAppType().toString());
077                query.setParameter("nominalTime", bean.getNominalTimestamp());
078                query.setParameter("expectedStartTime", bean.getExpectedStartTimestamp());
079                query.setParameter("expectedEndTime", bean.getExpectedEndTimestamp());
080                query.setParameter("expectedDuration", bean.getExpectedDuration());
081                query.setParameter("jobStatus", bean.getJobStatus());
082                query.setParameter("slaStatus", bean.getSLAStatusString());
083                query.setParameter("eventStatus", bean.getEventStatusString());
084                query.setParameter("lastModTime", bean.getLastModifiedTimestamp());
085                query.setParameter("user", bean.getUser());
086                query.setParameter("parentId", bean.getParentId());
087                query.setParameter("eventProcessed", bean.getEventProcessed());
088                query.setParameter("actualDuration", bean.getActualDuration());
089                query.setParameter("actualEndTS", bean.getActualEndTimestamp());
090                query.setParameter("actualStartTS", bean.getActualStartTimestamp());
091                query.setParameter("jobId", bean.getId());
092                break;
093            case UPDATE_SLA_SUMMARY_FOR_EXPECTED_TIMES:
094                query.setParameter("nominalTime", bean.getNominalTimestamp());
095                query.setParameter("expectedStartTime", bean.getExpectedStartTimestamp());
096                query.setParameter("expectedEndTime", bean.getExpectedEndTimestamp());
097                query.setParameter("expectedDuration", bean.getExpectedDuration());
098                query.setParameter("lastModTime", bean.getLastModifiedTimestamp());
099                query.setParameter("jobId", bean.getId());
100                break;
101
102            case UPDATE_SLA_SUMMARY_EVENTPROCESSED:
103                query.setParameter("eventProcessed", bean.getEventProcessed());
104                query.setParameter("jobId", bean.getId());
105                break;
106            case UPDATE_SLA_SUMMARY_LAST_MODIFIED_TIME:
107                query.setParameter("lastModifiedTS", bean.getLastModifiedTime());
108                query.setParameter("jobId", bean.getId());
109                break;
110
111            default:
112                throw new JPAExecutorException(ErrorCode.E0603, "QueryExecutor cannot set parameters for "
113                        + namedQuery.name());
114        }
115        return query;
116    }
117
118    @Override
119    public Query getSelectQuery(SLASummaryQuery namedQuery, EntityManager em, Object... parameters)
120            throws JPAExecutorException {
121        Query query = em.createNamedQuery(namedQuery.name());
122        switch (namedQuery) {
123            case GET_SLA_SUMMARY:
124            case GET_SLA_SUMMARY_EVENTPROCESSED:
125            case GET_SLA_SUMMARY_EVENTPROCESSED_LAST_MODIFIED:
126                query.setParameter("id", parameters[0]);
127                break;
128        }
129        return query;
130    }
131
132    @Override
133    public int executeUpdate(SLASummaryQuery namedQuery, SLASummaryBean jobBean) throws JPAExecutorException {
134        JPAService jpaService = Services.get().get(JPAService.class);
135        EntityManager em = jpaService.getEntityManager();
136        Query query = getUpdateQuery(namedQuery, jobBean, em);
137        int ret = jpaService.executeUpdate(namedQuery.name(), query, em);
138        return ret;
139    }
140
141    @Override
142    public SLASummaryBean get(SLASummaryQuery namedQuery, Object... parameters) throws JPAExecutorException {
143        JPAService jpaService = Services.get().get(JPAService.class);
144        EntityManager em = jpaService.getEntityManager();
145        Query query = getSelectQuery(namedQuery, em, parameters);
146        Object ret = jpaService.executeGet(namedQuery.name(), query, em);
147        if (ret == null && !namedQuery.equals(SLASummaryQuery.GET_SLA_SUMMARY)) {
148            throw new JPAExecutorException(ErrorCode.E0604, query.toString());
149        }
150        SLASummaryBean bean = constructBean(namedQuery, ret, parameters);
151        return bean;
152    }
153
154    @Override
155    public SLASummaryBean getIfExist(SLASummaryQuery namedQuery, Object... parameters) throws JPAExecutorException {
156        JPAService jpaService = Services.get().get(JPAService.class);
157        EntityManager em = jpaService.getEntityManager();
158        Query query = getSelectQuery(namedQuery, em, parameters);
159        Object ret = jpaService.executeGet(namedQuery.name(), query, em);
160        if (ret == null && !namedQuery.equals(SLASummaryQuery.GET_SLA_SUMMARY)) {
161            return null;
162        }
163        SLASummaryBean bean = constructBean(namedQuery, ret, parameters);
164        return bean;
165    }
166
167    @Override
168    public List<SLASummaryBean> getList(SLASummaryQuery namedQuery, Object... parameters) throws JPAExecutorException {
169        JPAService jpaService = Services.get().get(JPAService.class);
170        EntityManager em = jpaService.getEntityManager();
171        Query query = getSelectQuery(namedQuery, em, parameters);
172        @SuppressWarnings("unchecked")
173        List<SLASummaryBean> beanList = (List<SLASummaryBean>) jpaService.executeGetList(namedQuery.name(), query, em);
174        return beanList;
175    }
176
177    @Override
178    public Object getSingleValue(SLASummaryQuery namedQuery, Object... parameters) throws JPAExecutorException {
179        JPAService jpaService = Services.get().get(JPAService.class);
180        EntityManager em = jpaService.getEntityManager();
181        Query query = getSelectQuery(namedQuery, em, parameters);
182        Object ret = jpaService.executeGet(namedQuery.name(), query, em);
183        if (ret == null) {
184            throw new JPAExecutorException(ErrorCode.E0604, query.toString());
185        }
186        return ret;
187    }
188
189    private SLASummaryBean constructBean(SLASummaryQuery namedQuery, Object ret, Object... parameters)
190            throws JPAExecutorException {
191        SLASummaryBean bean;
192        switch (namedQuery) {
193            case GET_SLA_SUMMARY:
194                bean = (SLASummaryBean) ret;
195                break;
196            case GET_SLA_SUMMARY_EVENTPROCESSED:
197                bean = new SLASummaryBean();
198                bean.setEventProcessed(((Byte)ret).intValue());
199                break;
200            case GET_SLA_SUMMARY_EVENTPROCESSED_LAST_MODIFIED:
201                Object[] arr = (Object[]) ret;
202                bean = new SLASummaryBean();
203                bean.setEventProcessed((Byte)arr[0]);
204                bean.setLastModifiedTime((Timestamp)arr[1]);
205
206                break;
207
208            default:
209                throw new JPAExecutorException(ErrorCode.E0603, "QueryExecutor cannot construct job bean for "
210                        + namedQuery.name());
211        }
212        return bean;
213    }
214
215}