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}