1 23 24 25 package com.sun.jdo.spi.persistence.support.sqlstore.model; 26 27 import com.sun.jdo.spi.persistence.support.sqlstore.ConfigCache; 28 import com.sun.jdo.spi.persistence.support.sqlstore.PersistenceConfig; 29 import com.sun.jdo.spi.persistence.support.sqlstore.VersionConsistencyCache; 30 import com.sun.jdo.spi.persistence.support.sqlstore.ejb.ApplicationLifeCycleEventListener; 31 import com.sun.jdo.spi.persistence.support.sqlstore.ejb.EJBHelper; 32 import com.sun.jdo.spi.persistence.support.sqlstore.query.util.type.TypeTable; 33 import com.sun.jdo.api.persistence.model.Model; 34 35 import java.util.*; 36 37 42 public class ConfigCacheImpl 43 implements ConfigCache, ApplicationLifeCycleEventListener { 44 45 48 private Map classConfigs; 49 50 53 private Map oidClassToClassType; 54 55 59 private VersionConsistencyCache vcCache; 60 61 65 private Map classLoaderToClassType; 66 67 public ConfigCacheImpl() { 68 classConfigs = new HashMap(); 69 classLoaderToClassType = new HashMap(); 70 oidClassToClassType = new HashMap(); 71 72 EJBHelper.registerApplicationLifeCycleEventListener(this); 74 } 75 76 84 public synchronized PersistenceConfig getPersistenceConfig(Class pcClass) { 85 ClassDesc sqlConfig = 86 (ClassDesc) classConfigs.get(pcClass); 87 if (sqlConfig == null) { 88 96 sqlConfig = ClassDesc.newInstance(pcClass); 97 classConfigs.put(pcClass, sqlConfig); 98 sqlConfig.initialize(this); 99 oidClassToClassType.put(sqlConfig.getOidClass(), pcClass); 100 addToClassLoaderMap(pcClass); 101 } 102 return sqlConfig; 103 } 104 105 111 public Class getClassByOidClass(Class oidType) { 112 return (Class ) oidClassToClassType.get(oidType); 113 } 114 115 118 public void notifyApplicationUnloaded(ClassLoader classLoader) { 119 synchronized (this) { 122 List pcClasses = (List) classLoaderToClassType.get(classLoader); 123 if (pcClasses != null) { 124 Iterator it = pcClasses.iterator(); 125 while (it.hasNext()) { 126 Class classType = (Class ) it.next(); 127 ClassDesc config = 128 (ClassDesc) classConfigs.remove(classType); 129 Class oidClass = config.getOidClass(); 130 oidClassToClassType.remove(oidClass); 131 if (config.hasVersionConsistency() && vcCache != null) { 132 vcCache.removePCType(classType); 133 } 134 } 135 classLoaderToClassType.remove(classLoader); 138 } 139 } 140 141 TypeTable.removeInstance(classLoader); 143 Model model = Model.RUNTIME; 144 model.removeResourcesFromCaches(classLoader); 145 146 } 147 148 153 public synchronized void setVersionConsistencyCache( 154 VersionConsistencyCache vcCache) { 155 this.vcCache = vcCache; 156 } 157 158 165 private void addToClassLoaderMap(Class pcClass) { 166 ClassLoader classLoader = pcClass.getClassLoader(); 167 List classes = (List) classLoaderToClassType.get(classLoader); 168 if (classes == null) { 169 classes = new ArrayList(); 171 classLoaderToClassType.put(classLoader, classes); 172 } 173 classes.add(pcClass); 174 } 175 } 176 | Popular Tags |