FileDocCategorySizeDatePackage
ConfigCacheImpl.javaAPI DocGlassfish v2 API7314Fri May 04 22:35:06 BST 2007com.sun.jdo.spi.persistence.support.sqlstore.model

ConfigCacheImpl

public class ConfigCacheImpl extends Object implements com.sun.jdo.spi.persistence.support.sqlstore.ConfigCache, com.sun.jdo.spi.persistence.support.sqlstore.ejb.ApplicationLifeCycleEventListener
Caches SQLStore config information.
author
Mitesh Meswani

Fields Summary
private Map
classConfigs
Map of class types to PersistenceConfig.
private Map
oidClassToClassType
Map of OID classes to PersistenceCapable classes.
private com.sun.jdo.spi.persistence.support.sqlstore.VersionConsistencyCache
vcCache
This cache should be notified every time a VC class is loaded or unloaded.
private Map
classLoaderToClassType
Map of class loaders to a list of PersistenceCapable classes loaded by the classloader.
Constructors Summary
public ConfigCacheImpl()

        classConfigs = new HashMap();
        classLoaderToClassType = new HashMap();
        oidClassToClassType = new HashMap();

        // Register for call backs on application loader events.        
        EJBHelper.registerApplicationLifeCycleEventListener(this);        
    
Methods Summary
private voidaddToClassLoaderMap(java.lang.Class pcClass)
Add pcClass to a classLoaderToClassType map. The only call to this private method is from getPersistenceConfig(). As that method is synchronized we don't need to synchronize here.

param
pcClass The pcClass to be added.

        ClassLoader classLoader = pcClass.getClassLoader();
        List classes = (List) classLoaderToClassType.get(classLoader);
        if (classes == null) {
            // First entry for a given ClassLoader, initialize the ArrayList.
            classes = new ArrayList();
            classLoaderToClassType.put(classLoader, classes);
        }
        classes.add(pcClass);
    
public java.lang.ClassgetClassByOidClass(java.lang.Class oidType)
Gets the Class instance corresponding to given oidType.

param
oidType The input oidType.
return
The Class instance corresponding to given oidType.

        return (Class) oidClassToClassType.get(oidType);
    
public synchronized com.sun.jdo.spi.persistence.support.sqlstore.PersistenceConfiggetPersistenceConfig(java.lang.Class pcClass)
Get the PersistenceConfig for given pcClass. The config is looked up from a cache. If a config can not be found in cache, a new instance is created and returned.

param
pcClass The input pcClass.
return
PersistenceConfig for given pcClass.

        ClassDesc sqlConfig =
                (ClassDesc) classConfigs.get(pcClass);
        if (sqlConfig == null) {
            // The order of the below operations is important.
            // Initialize is called after puting sqlConfig into the
            // cache so that ClassDesc#fixupForeignReferences does not
            // cause infinite recursion.
            // After the initialisation, oidClassToClassType.put is
            // called so that sqlConfig.getOidClass() returns correct
            // value.

            sqlConfig = ClassDesc.newInstance(pcClass);
            classConfigs.put(pcClass, sqlConfig);
            sqlConfig.initialize(this);
            oidClassToClassType.put(sqlConfig.getOidClass(), pcClass);
            addToClassLoaderMap(pcClass);
        }
        return sqlConfig;
    
public voidnotifyApplicationUnloaded(java.lang.ClassLoader classLoader)

inheritDoc

        // Clean up classConfigs and oidClassToClassType for the given
        // classLoader.
        synchronized (this) {
            List pcClasses = (List) classLoaderToClassType.get(classLoader);
            if (pcClasses != null) {
                Iterator it = pcClasses.iterator();
                while (it.hasNext()) {
                    Class classType = (Class) it.next();
                    ClassDesc config =
                            (ClassDesc) classConfigs.remove(classType);
                    Class oidClass = config.getOidClass();
                    oidClassToClassType.remove(oidClass);
                    if (config.hasVersionConsistency() && vcCache != null) {
                        vcCache.removePCType(classType);
                    }
                }
                // Data about this classLoader is no longer needed. 
                // Remove it from cache.  
                classLoaderToClassType.remove(classLoader);
            }
        }

        // Notify others to cleanup
        TypeTable.removeInstance(classLoader);
        Model model = Model.RUNTIME;
        model.removeResourcesFromCaches(classLoader);

    
public synchronized voidsetVersionConsistencyCache(com.sun.jdo.spi.persistence.support.sqlstore.VersionConsistencyCache vcCache)
Sets VersionConsistencyCache field.

param
vcCache the VersionConsistencyCache instance.

 
        this.vcCache = vcCache;