001 package org.kuali.student.common.util.spring;
002
003 import java.lang.reflect.Field;
004 import java.util.Map;
005
006 import javax.persistence.spi.PersistenceUnitTransactionType;
007
008 import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager;
009 import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
010
011 public class MergingPersistenceUnitManager extends
012 DefaultPersistenceUnitManager {
013
014 private String mergedPersistenceUnitName;
015 private PersistenceUnitTransactionType transactionTypeOverride = PersistenceUnitTransactionType.RESOURCE_LOCAL;
016
017 public void setMergedPersistenceUnitName(String mergedPersistenceUnitName) {
018 this.mergedPersistenceUnitName = mergedPersistenceUnitName;
019 }
020
021 @Override
022 protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
023 try {
024 Field persistenceUnitInfosField = DefaultPersistenceUnitManager.class.getDeclaredField("persistenceUnitInfos");
025 persistenceUnitInfosField.setAccessible(true);
026 Map<String, MutablePersistenceUnitInfo> persistenceUnitInfos = (Map<String, MutablePersistenceUnitInfo>) persistenceUnitInfosField.get(this);
027
028 if(persistenceUnitInfos.isEmpty()){
029 pui.setPersistenceUnitName(mergedPersistenceUnitName);
030 pui.setTransactionType(transactionTypeOverride);
031 }else{
032 MutablePersistenceUnitInfo currentlyMergedPui = persistenceUnitInfos.get(mergedPersistenceUnitName);
033 for(String className:pui.getManagedClassNames()){
034 currentlyMergedPui.getManagedClassNames().add(className);
035 }
036 }
037
038 } catch (Exception e) {
039 throw new RuntimeException("Error while merging persistence units.",e);
040 }
041
042 super.postProcessPersistenceUnitInfo(pui);
043 }
044
045 public void setTransactionTypeOverride(PersistenceUnitTransactionType transactionTypeOverride) {
046 this.transactionTypeOverride = transactionTypeOverride;
047 }
048
049
050 }