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