001 /** 002 * Copyright 2005-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.krad.dao.proxy; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.rice.core.api.config.ConfigurationException; 020 import org.kuali.rice.core.framework.persistence.jpa.OrmUtils; 021 import org.kuali.rice.krad.bo.BusinessObject; 022 import org.kuali.rice.krad.bo.ModuleConfiguration; 023 import org.kuali.rice.krad.bo.PersistableBusinessObject; 024 import org.kuali.rice.krad.dao.BusinessObjectDao; 025 import org.kuali.rice.krad.dao.impl.BusinessObjectDaoJpa; 026 import org.kuali.rice.krad.dao.impl.BusinessObjectDaoOjb; 027 import org.kuali.rice.krad.service.KRADServiceLocator; 028 import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 029 import org.kuali.rice.krad.service.KualiModuleService; 030 import org.kuali.rice.krad.service.ModuleService; 031 import org.springframework.transaction.annotation.Transactional; 032 033 import javax.persistence.EntityManager; 034 import java.util.ArrayList; 035 import java.util.Collection; 036 import java.util.HashMap; 037 import java.util.List; 038 import java.util.Map; 039 040 @Transactional 041 public class BusinessObjectDaoProxy implements BusinessObjectDao { 042 043 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BusinessObjectDaoProxy.class); 044 045 private BusinessObjectDao businessObjectDaoJpa; 046 private BusinessObjectDao businessObjectDaoOjb; 047 private static KualiModuleService kualiModuleService; 048 private static HashMap<String, BusinessObjectDao> boDaoValues = new HashMap<String, BusinessObjectDao>(); 049 050 private BusinessObjectDao getDao(Class clazz) { 051 ModuleService moduleService = getKualiModuleService().getResponsibleModuleService(clazz); 052 if (moduleService != null) { 053 ModuleConfiguration moduleConfig = moduleService.getModuleConfiguration(); 054 String dataSourceName = ""; 055 EntityManager entityManager = null; 056 if (moduleConfig != null) { 057 dataSourceName = moduleConfig.getDataSourceName(); 058 entityManager = moduleConfig.getEntityManager(); 059 } 060 061 if (StringUtils.isNotEmpty(dataSourceName)) { 062 if (boDaoValues.get(dataSourceName) != null) { 063 return boDaoValues.get(dataSourceName); 064 } else { 065 if (OrmUtils.isJpaAnnotated(clazz) && OrmUtils.isJpaEnabled()) { 066 //using JPA 067 if (entityManager != null) { 068 BusinessObjectDaoJpa boDaoJpa = 069 new BusinessObjectDaoJpa(entityManager, KRADServiceLocator 070 .getPersistenceStructureService()); 071 // add to our cache of bo daos 072 boDaoValues.put(dataSourceName, boDaoJpa); 073 return boDaoJpa; 074 } else { 075 throw new ConfigurationException("EntityManager is null. EntityManager must be set in the Module Configuration bean in the appropriate spring beans xml. (see nested exception for details)."); 076 } 077 } else { 078 //using OJB 079 BusinessObjectDaoOjb boDaoOjb = new BusinessObjectDaoOjb( 080 KRADServiceLocator.getPersistenceStructureService()); 081 boDaoOjb.setJcdAlias(dataSourceName); 082 // add to our cache of bo daos 083 boDaoValues.put(dataSourceName, boDaoOjb); 084 return boDaoOjb; 085 } 086 } 087 088 } 089 } 090 //return businessObjectDaoJpa; 091 return (OrmUtils.isJpaAnnotated(clazz) && OrmUtils.isJpaEnabled()) ? businessObjectDaoJpa : businessObjectDaoOjb; 092 } 093 094 /** 095 * @see org.kuali.rice.krad.dao.BusinessObjectDao#countMatching(java.lang.Class, java.util.Map) 096 */ 097 public int countMatching(Class clazz, Map<String, ?> fieldValues) { 098 return getDao(clazz).countMatching(clazz, fieldValues); 099 } 100 101 /** 102 * @see org.kuali.rice.krad.dao.BusinessObjectDao#countMatching(java.lang.Class, java.util.Map, java.util.Map) 103 */ 104 public int countMatching(Class clazz, Map<String, ?> positiveFieldValues, Map<String, ?> negativeFieldValues) { 105 return getDao(clazz).countMatching(clazz, positiveFieldValues, negativeFieldValues); 106 } 107 108 /** 109 * @see org.kuali.rice.krad.dao.BusinessObjectDao#delete(org.kuali.rice.krad.bo.PersistableBusinessObject) 110 */ 111 public void delete(PersistableBusinessObject bo) { 112 if (bo != null) { 113 getDao(bo.getClass()).delete(bo); 114 } 115 } 116 117 /** 118 * @see org.kuali.rice.krad.dao.BusinessObjectDao#delete(java.util.List) 119 */ 120 public void delete(List<? extends PersistableBusinessObject> boList) { 121 if (!boList.isEmpty()) { 122 getDao(boList.get(0).getClass()).delete(boList); 123 } 124 } 125 126 /** 127 * @see org.kuali.rice.krad.dao.BusinessObjectDao#deleteMatching(java.lang.Class, java.util.Map) 128 */ 129 public void deleteMatching(Class clazz, Map<String, ?> fieldValues) { 130 getDao(clazz).deleteMatching(clazz, fieldValues); 131 } 132 133 /** 134 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findAll(java.lang.Class) 135 */ 136 public <T extends BusinessObject> Collection<T> findAll(Class<T> clazz) { 137 return getDao(clazz).findAll(clazz); 138 } 139 140 /** 141 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findAllActive(java.lang.Class) 142 */ 143 public <T extends BusinessObject> Collection<T> findAllActive(Class<T> clazz) { 144 return getDao(clazz).findAllActive(clazz); 145 } 146 147 /** 148 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findAllInactive(java.lang.Class) 149 */ 150 public <T extends BusinessObject> Collection<T> findAllInactive(Class<T> clazz) { 151 return getDao(clazz).findAllInactive(clazz); 152 } 153 154 /** 155 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findAllActiveOrderBy(java.lang.Class, java.lang.String, boolean) 156 */ 157 public <T extends BusinessObject> Collection<T> findAllActiveOrderBy(Class<T> clazz, String sortField, boolean sortAscending) { 158 return getDao(clazz).findAllActiveOrderBy(clazz, sortField, sortAscending); 159 } 160 161 /** 162 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findAllOrderBy(java.lang.Class, java.lang.String, boolean) 163 */ 164 public <T extends BusinessObject> Collection<T> findAllOrderBy(Class<T> clazz, String sortField, boolean sortAscending) { 165 return getDao(clazz).findAllOrderBy(clazz, sortField, sortAscending); 166 } 167 168 /** 169 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findBySinglePrimaryKey(java.lang.Class, java.lang.Object) 170 */ 171 public <T extends BusinessObject> T findBySinglePrimaryKey(Class<T> clazz, Object primaryKey) { 172 return getDao(clazz).findBySinglePrimaryKey(clazz, primaryKey); 173 } 174 175 /** 176 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findByPrimaryKey(java.lang.Class, java.util.Map) 177 */ 178 public <T extends BusinessObject> T findByPrimaryKey(Class<T> clazz, Map<String, ?> primaryKeys) { 179 return getDao(clazz).findByPrimaryKey(clazz, primaryKeys); 180 } 181 182 /** 183 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findMatching(java.lang.Class, java.util.Map) 184 */ 185 public <T extends BusinessObject> Collection<T> findMatching(Class<T> clazz, Map<String, ?> fieldValues) { 186 return getDao(clazz).findMatching(clazz, fieldValues); 187 } 188 189 /** 190 * Has the proxied DAO handle the criteria 191 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findMatching(org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria) 192 */ 193 //public <T extends BusinessObject> Collection<T> findMatching(Criteria criteria) { 194 // Class clazz = null; 195 // try { 196 // clazz = Class.forName(criteria.getEntityName()); 197 // } catch (ClassNotFoundException cnfe) { 198 // throw new RuntimeException("Attempted to run JPA Criteria which uses a non-existent class to query against: "+criteria.getEntityName(), cnfe); 199 // } 200 // return getDao(clazz).findMatching(criteria); 201 //} 202 203 /** 204 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findMatchingActive(java.lang.Class, java.util.Map) 205 */ 206 public <T extends BusinessObject> Collection<T> findMatchingActive(Class<T> clazz, Map<String, ?> fieldValues) { 207 return getDao(clazz).findMatchingActive(clazz, fieldValues); 208 } 209 210 /** 211 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findMatchingOrderBy(java.lang.Class, java.util.Map, java.lang.String, boolean) 212 */ 213 public <T extends BusinessObject> Collection<T> findMatchingOrderBy(Class<T> clazz, Map<String, ?> fieldValues, String sortField, boolean sortAscending) { 214 return getDao(clazz).findMatchingOrderBy(clazz, fieldValues, sortField, sortAscending); 215 } 216 217 /** 218 * @see org.kuali.rice.krad.dao.BusinessObjectDao#retrieve(org.kuali.rice.krad.bo.PersistableBusinessObject) 219 */ 220 public PersistableBusinessObject retrieve(PersistableBusinessObject object) { 221 return getDao(object.getClass()).retrieve(object); 222 } 223 224 /** 225 226 * @see org.kuali.rice.krad.dao.BusinessObjectDao#manageReadOnly(org.kuali.rice.krad.bo.PersistableBusinessObject) 227 */ 228 public PersistableBusinessObject manageReadOnly(PersistableBusinessObject bo) { 229 return getDao(bo.getClass()).manageReadOnly(bo); 230 } 231 232 /** 233 * Defers to correct DAO for this class 234 * @see org.kuali.rice.krad.dao.BusinessObjectDao#findByPrimaryKeyUsingKeyObject(java.lang.Class, java.lang.Object) 235 */ 236 public <T extends BusinessObject> T findByPrimaryKeyUsingKeyObject(Class<T> clazz, Object pkObject) { 237 return getDao(clazz).findByPrimaryKeyUsingKeyObject(clazz, pkObject); 238 } 239 240 /** 241 * @see org.kuali.rice.krad.dao.BusinessObjectDao#save(org.kuali.rice.krad.bo.PersistableBusinessObject) 242 */ 243 public PersistableBusinessObject save(PersistableBusinessObject bo) { 244 PersistableBusinessObject savedBo; 245 savedBo = getDao(bo.getClass()).save(bo); 246 return savedBo; 247 } 248 249 /** 250 * @see org.kuali.rice.krad.dao.BusinessObjectDao#save(java.util.List) 251 */ 252 public List<? extends PersistableBusinessObject> save(List businessObjects) { 253 if (!businessObjects.isEmpty()) { 254 return getDao(businessObjects.get(0).getClass()).save(businessObjects); 255 } 256 return new ArrayList<PersistableBusinessObject>(); 257 } 258 259 private static KualiModuleService getKualiModuleService() { 260 if (kualiModuleService == null) { 261 kualiModuleService = KRADServiceLocatorWeb.getKualiModuleService(); 262 } 263 return kualiModuleService; 264 } 265 266 public void setBusinessObjectDaoJpa(BusinessObjectDao businessObjectDaoJpa) { 267 this.businessObjectDaoJpa = businessObjectDaoJpa; 268 } 269 270 public void setBusinessObjectDaoOjb(BusinessObjectDao businessObjectDaoOjb) { 271 this.businessObjectDaoOjb = businessObjectDaoOjb; 272 } 273 }