You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2003/07/08 00:00:03 UTC

cvs commit: jakarta-commons/beanutils/src/java/org/apache/commons/beanutils BeanUtilsBean.java

rdonkin     2003/07/07 15:00:03

  Modified:    beanutils/src/java/org/apache/commons/beanutils
                        BeanUtilsBean.java
  Log:
  Refactored context thread loader logic into separate class. Added new setInstance method which works on a per-thread-context-classloader basis. Patch contributed by Eric Pabst
  
  Revision  Changes    Path
  1.11      +22 -35    jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BeanUtilsBean.java
  
  Index: BeanUtilsBean.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BeanUtilsBean.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- BeanUtilsBean.java	24 May 2003 08:14:23 -0000	1.10
  +++ BeanUtilsBean.java	7 Jul 2003 22:00:02 -0000	1.11
  @@ -103,15 +103,16 @@
   
       // ------------------------------------------------------ Private Class Variables
   
  -    /** Singleton instance */
  -    private static final BeanUtilsBean singleton = new BeanUtilsBean();
       /** 
  -     * Map contains <code>BeanUtilsBean</code> instances indexed by context classloader.
  -     * <strong>Note:</strong> A WeakHashMap bug in several 1.3 JVMs results in a memory leak
  -     * for those JVMs.
  +     * Contains <code>BeanUtilsBean</code> instances indexed by context classloader.
        */
  -    private static final Map beansByClassLoader
  -            = new WeakHashMap();
  +    private static final ContextClassLoaderLocal 
  +            beansByClassLoader = new ContextClassLoaderLocal() {
  +                        // Creates the default instance used when the context classloader is unavailable
  +                        protected Object initialValue() {
  +                            return new BeanUtilsBean();
  +                        }
  +                    };
       
       /** 
        * Gets the instance which provides the functionality for {@link BeanUtils}.
  @@ -119,30 +120,16 @@
        * This mechanism provides isolation for web apps deployed in the same container. 
        */
       public synchronized static BeanUtilsBean getInstance() {
  -        // synchronizing the whole method is a bit slower 
  -        // but guarentees no subtle threading problems
  -        
  -        // make sure that the map is given a change to purge itself
  -        beansByClassLoader.isEmpty();
  -        try {
  -            
  -            ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
  -            if (contextClassLoader != null) {
  -                
  -                BeanUtilsBean instance = (BeanUtilsBean) beansByClassLoader.get(contextClassLoader);
  -                    
  -                if (instance == null) {
  -                    instance = new BeanUtilsBean();
  -                    beansByClassLoader.put(contextClassLoader, instance);
  -                }
  -                return instance;
  -                
  -            }
  -            
  -        } catch (SecurityException e) { /* SWALLOW - should we log this? */ }
  -        
  -        // if in doubt, return the basic
  -        return singleton;
  +        return (BeanUtilsBean) beansByClassLoader.get();
  +    }
  +
  +    /** 
  +     * Sets the instance which provides the functionality for {@link BeanUtils}.
  +     * This is a pseudo-singleton - an single instance is provided per (thread) context classloader.
  +     * This mechanism provides isolation for web apps deployed in the same container. 
  +     */
  +    public synchronized static void setInstance(BeanUtilsBean newInstance) {
  +        beansByClassLoader.set(newInstance);
       }
   
       // --------------------------------------------------------- Attributes
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org