cvs commit: spice/sandbox/metaclass/src/java/org/realityforge/metaclass/introspector CachingMetaClassAccessor.java DefaultMetaClassRegistry.java MetaClassRegistry.java

Peter Donald <[email protected]>
Newsgroups gmane.comp.java.spice.cvs
Message-ID <[email protected]>
donaldp     03/10/27 22:40:56

  Added:       sandbox/metaclass/src/java/org/realityforge/metaclass/introspector
                        CachingMetaClassAccessor.java
  Removed:     sandbox/metaclass/src/java/org/realityforge/metaclass/introspector
                        DefaultMetaClassRegistry.java
                        MetaClassRegistry.java
  Log:
  Rewrite registry as a CachingMetaClassAccessor as thats all we really need.
  
  Revision  Changes    Path
  1.1                  spice/sandbox/metaclass/src/java/org/realityforge/metaclass/introspector/CachingMetaClassAccessor.java
  
  Index: CachingMetaClassAccessor.java
  ===================================================================
  package org.realityforge.metaclass.introspector;
  
  import java.util.Map;
  import java.util.WeakHashMap;
  
  import org.realityforge.metaclass.model.ClassDescriptor;
  
  /**
   * Caching MetaClassAccessor implementation.
   *
   * @author <a href="mailto:peter at realityforge.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2003/10/28 06:40:56 $
   */
  public class CachingMetaClassAccessor
     implements MetaClassAccessor
  {
     /**
      * Class used to access the MetaData.
      */
     private MetaClassAccessor m_accessor = new DefaultMetaClassAccessor();
  
     /**
      * The cache in which info objects are stored.
      * This cache stores maps for ClassLoaders which in
      * turn stores info for particular classes in
      * classloader.
      */
     private final Map m_cache = new WeakHashMap();
  
     /**
      * Set the MetaClassAccessor to use to locate
      * ClassDescriptor objects.
      *
      * @param accessor the MetaClassAccessor
      */
     public void setAccessor( final MetaClassAccessor accessor )
     {
        if ( null == accessor )
        {
           throw new NullPointerException( "accessor" );
        }
        m_accessor = accessor;
     }
  
     /**
      * Remove all descriptors from registry.
      */
     public void clear()
     {
        m_cache.clear();
     }
  
     /**
      * @see MetaClassAccessor#getClassDescriptor
      */
     public ClassDescriptor getClassDescriptor( final String classname,
                                                final ClassLoader classLoader )
        throws MetaClassException
     {
        if ( null == classname )
        {
           throw new NullPointerException( "classname" );
        }
        if ( null == classLoader )
        {
           throw new NullPointerException( "classLoader" );
        }
        final Map cache = getClassLoaderCache( classLoader );
        ClassDescriptor descriptor = (ClassDescriptor) cache.get( classname );
        if ( null != descriptor )
        {
           return descriptor;
        }
        else
        {
           descriptor = m_accessor.getClassDescriptor( classname, classLoader );
           cache.put( classname, descriptor );
           return descriptor;
        }
     }
  
     /**
      * Register specified descriptor and associated with specified ClassLoader.
      *
      * @param descriptor the descriptor
      * @param classLoader the ClassLoader
      */
     public void registerDescriptor( final ClassDescriptor descriptor,
                                     final ClassLoader classLoader )
     {
        if ( null == descriptor )
        {
           throw new NullPointerException( "descriptor" );
        }
        if ( null == classLoader )
        {
           throw new NullPointerException( "classLoader" );
        }
        final Map cache = getClassLoaderCache( classLoader );
        cache.put( descriptor.getName(), descriptor );
     }
  
     /**
      * Get Cache for specified ClassLoader.
      *
      * @param classLoader the ClassLoader to get cache for
      * @return the Map/Cache for ClassLoader
      */
     private synchronized Map getClassLoaderCache( final ClassLoader classLoader )
     {
        Map map = (Map) m_cache.get( classLoader );
        if ( null == map )
        {
           map = new WeakHashMap();
           m_cache.put( classLoader, map );
        }
        return map;
     }
  }
  
  
  


-------------------------------------------------------
This SF.net email is sponsored by: The SF.net Donation Program.
Do you like what SourceForge.net is doing for the Open
Source Community?  Make a contribution, and help us add new
features and functionality. Click here: http://sourceforge.net/donate/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.