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}