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