001 /** 002 * Copyright 2005-2013 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 java.util.HashMap; 019 020 import javax.persistence.EntityManager; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.apache.ojb.broker.core.proxy.ProxyHelper; 024 import org.hibernate.proxy.HibernateProxy; 025 import org.kuali.rice.core.framework.persistence.jpa.OrmUtils; 026 import org.kuali.rice.krad.bo.ModuleConfiguration; 027 import org.kuali.rice.krad.dao.PersistenceDao; 028 import org.kuali.rice.krad.dao.impl.PersistenceDaoOjb; 029 import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 030 import org.kuali.rice.krad.service.KualiModuleService; 031 import org.kuali.rice.krad.service.ModuleService; 032 import org.kuali.rice.krad.util.ObjectUtils; 033 import org.springframework.transaction.annotation.Transactional; 034 035 @Transactional 036 public class PersistenceDaoProxy implements PersistenceDao { 037 038 private PersistenceDao persistenceDaoJpa; 039 private PersistenceDao persistenceDaoOjb; 040 private static KualiModuleService kualiModuleService; 041 private static HashMap<String, PersistenceDao> persistenceDaoValues = new HashMap<String, PersistenceDao>(); 042 043 public void setPersistenceDaoJpa(PersistenceDao persistenceDaoJpa) { 044 this.persistenceDaoJpa = persistenceDaoJpa; 045 } 046 047 public void setPersistenceDaoOjb(PersistenceDao persistenceDaoOjb) { 048 this.persistenceDaoOjb = persistenceDaoOjb; 049 } 050 051 private PersistenceDao getDao(Class clazz) { 052 ModuleService moduleService = getKualiModuleService().getResponsibleModuleService(clazz); 053 if (moduleService != null) { 054 ModuleConfiguration moduleConfig = moduleService.getModuleConfiguration(); 055 String dataSourceName = ""; 056 EntityManager entityManager = null; 057 if (moduleConfig != null) { 058 dataSourceName = moduleConfig.getDataSourceName(); 059 entityManager = moduleConfig.getEntityManager(); 060 } 061 062 if (StringUtils.isNotEmpty(dataSourceName)) { 063 if (persistenceDaoValues.get(dataSourceName) != null) { 064 return persistenceDaoValues.get(dataSourceName); 065 } else { 066 if (OrmUtils.isJpaAnnotated(clazz) && (OrmUtils.isJpaEnabled() || OrmUtils.isJpaEnabled("rice.krad"))) { 067 //return the default JPA values since PersistenceDaoJPA delegates to the BusinessObjectService which should grab the correct datasource 068 persistenceDaoValues.put(dataSourceName, persistenceDaoJpa); 069 return persistenceDaoJpa; 070 071 } else { 072 //using OJB 073 PersistenceDaoOjb persistDaoOjb = new PersistenceDaoOjb(); 074 persistDaoOjb.setJcdAlias(dataSourceName); 075 076 persistenceDaoValues.put(dataSourceName, persistDaoOjb); 077 return persistDaoOjb; 078 } 079 080 } 081 082 } 083 } 084 return (OrmUtils.isJpaAnnotated(clazz) && (OrmUtils.isJpaEnabled() || OrmUtils.isJpaEnabled("rice.krad"))) ? 085 persistenceDaoJpa : persistenceDaoOjb; 086 } 087 088 /** 089 * @see org.kuali.rice.krad.dao.PersistenceDao#clearCache() 090 */ 091 public void clearCache() { 092 //if (OrmUtils.isJpaEnabled()) { 093 persistenceDaoJpa.clearCache(); 094 //} else { 095 persistenceDaoOjb.clearCache(); 096 //} 097 } 098 099 /** 100 * @see org.kuali.rice.krad.dao.PersistenceDao#resolveProxy(java.lang.Object) 101 */ 102 public Object resolveProxy(Object o) { 103 return getDao(ObjectUtils.materializeClassForProxiedObject(o)).resolveProxy(o); 104 } 105 106 /** 107 * @see org.kuali.rice.krad.dao.PersistenceDao#retrieveAllReferences(java.lang.Object) 108 */ 109 public void retrieveAllReferences(Object o) { 110 getDao(ObjectUtils.materializeClassForProxiedObject(o)).retrieveAllReferences(o); 111 } 112 113 /** 114 * @see org.kuali.rice.krad.dao.PersistenceDao#retrieveReference(java.lang.Object, java.lang.String) 115 */ 116 public void retrieveReference(Object o, String referenceName) { 117 getDao(ObjectUtils.materializeClassForProxiedObject(o)).retrieveReference(o, referenceName); 118 } 119 120 /** 121 * Asks proper DAO implementation if the object is proxied 122 * 123 * @see org.kuali.rice.krad.dao.PersistenceDao#isProxied(java.lang.Object) 124 */ 125 public boolean isProxied(Object object) { 126 if (object instanceof HibernateProxy) return true; 127 if (ProxyHelper.isProxy(object)) return true; 128 return false; 129 } 130 131 private static KualiModuleService getKualiModuleService() { 132 if (kualiModuleService == null) { 133 kualiModuleService = KRADServiceLocatorWeb.getKualiModuleService(); 134 } 135 return kualiModuleService; 136 } 137 }