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 package org.apache.oozie.executor.jpa; 019 020 import java.util.Collection; 021 import javax.persistence.EntityManager; 022 import javax.persistence.Query; 023 024 import org.apache.oozie.CoordinatorActionBean; 025 import org.apache.oozie.ErrorCode; 026 import org.apache.oozie.FaultInjection; 027 import org.apache.oozie.client.rest.JsonBean; 028 import org.apache.oozie.sla.SLARegistrationBean; 029 import org.apache.oozie.util.ParamChecker; 030 031 /** 032 * Class for updating and deleting beans in bulk 033 */ 034 public class BulkUpdateDeleteJPAExecutor implements JPAExecutor<Void> { 035 036 private Collection<JsonBean> updateList; 037 private Collection<JsonBean> deleteList; 038 private boolean forRerun = true; 039 040 /** 041 * Initialize the JPAExecutor using the update and delete list of JSON beans 042 * @param deleteList 043 * @param updateList 044 */ 045 public BulkUpdateDeleteJPAExecutor(Collection<JsonBean> updateList, Collection<JsonBean> deleteList, 046 boolean forRerun) { 047 this.updateList = updateList; 048 this.deleteList = deleteList; 049 this.forRerun = forRerun; 050 } 051 052 public BulkUpdateDeleteJPAExecutor() { 053 } 054 055 /** 056 * Sets the update list for JSON bean 057 * 058 * @param updateList 059 */ 060 public void setUpdateList(Collection<JsonBean> updateList) { 061 this.updateList = updateList; 062 } 063 064 /** 065 * Sets the delete list for JSON bean 066 * 067 * @param deleteList 068 */ 069 public void setDeleteList(Collection<JsonBean> deleteList) { 070 this.deleteList = deleteList; 071 } 072 073 /** 074 * Sets whether for RerunX command or no. Else it'd be for ChangeX 075 * 076 * @param forRerun 077 */ 078 public void setForRerun(boolean forRerun) { 079 this.forRerun = forRerun; 080 } 081 082 /* 083 * (non-Javadoc) 084 * 085 * @see org.apache.oozie.executor.jpa.JPAExecutor#getName() 086 */ 087 @Override 088 public String getName() { 089 return "BulkUpdateDeleteJPAExecutor"; 090 } 091 092 /* 093 * (non-Javadoc) 094 * 095 * @see org.apache.oozie.executor.jpa.JPAExecutor#execute(javax.persistence. 096 * EntityManager) 097 */ 098 @Override 099 public Void execute(EntityManager em) throws JPAExecutorException { 100 try { 101 if (updateList != null) { 102 for (JsonBean entity : updateList) { 103 ParamChecker.notNull(entity, "JsonBean"); 104 em.merge(entity); 105 } 106 } 107 // Only used by test cases to check for rollback of transaction 108 FaultInjection.activate("org.apache.oozie.command.SkipCommitFaultInjection"); 109 if (deleteList != null) { 110 for (JsonBean entity : deleteList) { 111 ParamChecker.notNull(entity, "JsonBean"); 112 if (forRerun) { 113 em.remove(em.merge(entity)); 114 } 115 else if (entity instanceof CoordinatorActionBean) { 116 Query g = em.createNamedQuery("DELETE_UNSCHEDULED_ACTION"); 117 String coordActionId = ((CoordinatorActionBean) entity).getId(); 118 g.setParameter("id", coordActionId); 119 int actionsDeleted = g.executeUpdate(); 120 if (actionsDeleted == 0) 121 throw new JPAExecutorException(ErrorCode.E1022, coordActionId); 122 } 123 else { 124 em.remove(em.merge(entity)); 125 } 126 } 127 } 128 return null; 129 } 130 catch (JPAExecutorException je) { 131 throw je; 132 } 133 catch (Exception e) { 134 throw new JPAExecutorException(ErrorCode.E0603, e.getMessage(), e); 135 } 136 } 137 }