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}