s/2/1/: we only can have 1 SingletonService for the WHOLE VM 

:)

LieGrue,
strub




----- Original Message ----
> From: Mark Struberg <[email protected]>
> To: [email protected]
> Sent: Thu, August 5, 2010 4:47:39 PM
> Subject: Re: svn commit: r982578 - in 
>/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: 
>config/WebBeansFinder.java corespi/DefaultSingletonService.java
> 
> Hi!
> 
> I now committed a simplified version with the same functionality. But  
> remember 
>
> that only can have 2 SingletonService for the WHOLE VM! So if you  like to 
> set 
>a 
>
> custom SingletonService twice, the WebBeansFinder will throw a 
> ConfigurationException!
> 
> LieGrue,
> strub
> 
> 
> 
> -----  Original Message ----
> > From: Mark Struberg <[email protected]>
> > To: [email protected]
> >  Sent: Thu, August 5, 2010 3:38:05 PM
> > Subject: Re: svn commit: r982578 -  in 
> >/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: 
> >config/WebBeansFinder.java corespi/DefaultSingletonService.java
> > 
> > +1 for the idea in general, but the FINDER stuff looks a bit broken.  What 
> > is 
>
> >the 
> >
> > reason to introduce aa anyway static member  which acts as an indirection 
> > to  
>
> >the 
> >
> >  SingletonService. There is only one instance allowed this way anyway, so   
>we 
>
> >can 
> >
> > simply switch to make the singletonService  member itself static.  There is 
>imo 
>
> >no 
> >
> > difference  - beside being slower and worse to  read.
> > 
> > And I'd prefer  to have some configuration for defining the  
>SingletonService.
> > 
> > I know that it's not possible to use the 'singleton'   ConfigService 
> > because 

> >this 
> >
> > needs the SingletonService ,  but I'll try to do a  trick with 'manually' 
> > bootstrapping the  ConfigService  first.
> > 
> > LieGrue,
> > strub
> > 
> > 
> > 
> > 
> > ----- Original Message  ----
> >  > From: "[email protected]" <[email protected]>
> > > To: [email protected]
> >  >  Sent: Thu, August 5, 2010 2:37:02 PM
> > > Subject: svn  commit: r982578 - in 
> >  >/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: 
> > >config/WebBeansFinder.java  corespi/DefaultSingletonService.java
> > > 
> > > Author:  gerdogdu
> > > Date: Thu Aug  5 12:37:01 2010
> > >  New  Revision:  982578
> > > 
> > > URL:    http://svn.apache.org/viewvc?rev=982578&view=rev
> > > Log:
> > >  [OWB-432]  Create  Singleton Service SPI
> > > 
> > >  Added:
> > >      
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>a
> >a 
> >
> > >   (with props)
> > > Modified:
> >  >      
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>a
> >a
> >  >
> > > 
> > > Modified: 
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>a
> >a
> >  >
> > >  URL: :  
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java?rev=982578&r1=982577&r2=982578&view=diff
>f
> >f
> >  >
> > > 
> 
>==============================================================================
> >  > ; --- 
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>a
> >a
> >  >  a (original)
> > > +++  
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>a
> >a
> >  >   Thu Aug  5 12:37:01 2010
> > > @@ -18,14 +18,8  @@
> > >    */
> > >  package   org.apache.webbeans.config;
> > > 
> > >  -import  java.util.HashMap;
> > > -import    java.util.IdentityHashMap;
> > > -import java.util.Map;
> > >  -import   java.util.Map.Entry;
> > > -
> > > -import    org.apache.webbeans.exception.WebBeansException;
> > > -import    org.apache.webbeans.util.Asserts;
> > > -import    org.apache.webbeans.util.ClassUtil;
> > > +import    org.apache.webbeans.corespi.DefaultSingletonService;
> > > +import    org.apache.webbeans.spi.SingletonService;
> > >  import    org.apache.webbeans.util.WebBeansUtil;
> > > 
> > >   /**
> > > @@  -35,16 +29,15 @@  import  org.apache.webbeans.util.WebBeans
> > >   *  @version  $Rev$  $Date$
> > >   *
> > >   */
> > >  -public  final class WebBeansFinder
> > > +public  final class  WebBeansFinder  implements SingletonService
> > >  {  
> > > -      /**
> > > -     * Keys  --> ClassLoaders
> > > -      *  Values -->  Maps of singleton class name with object
> > > -        */
> > > -    private static Map<ClassLoader,   Map<String,  Object>> singletonMap 
> > > = 
>
> >new 
> >
> >  >HashMap<ClassLoader,  Map<String,Object>>();
> >  >  +    //How you use singleton  provider ,
> > >  +     //As a default we use ClassLoader -->  Object
> >  > +     private SingletonService singletonService = new  
> > >DefaultSingletonService();
> > > +    
> >  > +     //VM based  singleton finder instance
> > >  +    private  static final WebBeansFinder  FINDER = new  
WebBeansFinder();
> > >    
> > > -     private  static Map<Object,  ClassLoader> objectToClassLoaderMap  = 
>new  
>
> 
> > >IdentityHashMap<Object,  ClassLoader>();
> > > -
> > >         /**
> > >       * No instantiate.
> > >         */
> > > @@  -53,138 +46,70 @@ public final  class  WebBeansFinder
> > >            //No  action
> > >      }
> > >    
> > > -      /**
> > > -     * Gets  signelton instance.
> > > -      * @param   singletonName singleton class name
> > > -      * @return  singleton  instance
> > > -     */
> > >        public static Object  getSingletonInstance(String   singletonName)
> > >      {
> > > -          return getSingletonInstance(singletonName,  
> >  >WebBeansUtil.getCurrentClassLoader());
> > > +          return  getSingletonInstance(singletonName,  
> >  >WebBeansUtil.getCurrentClassLoader());
> > >        }
> > >    
> > > -    /**
> > >  -     *  Gets singleton instance for  deployment.
> >  > -     * @param  singletonName singleton class   name
> > > -     * @param  classLoader classloader of  the  deployment
> > > -     *  @return signelton  instance for this  deployment
> > > -      */
> >  >      public static Object   getSingletonInstance(String  singletonName, 
> > >ClassLoader  classLoader)
> > >        {
> > > -         Object object =  null;
> > > -
> > > -           synchronized (singletonMap)
> > > -         {
> >  >  -            Map<String,  Object>   managerMap = 
> >singletonMap.get(classLoader);
> >  > -
> > > -              if  (managerMap == null)
> > > -               {
> > > -                  managerMap  = new HashMap<String,  Object>();
> > >  -                   singletonMap.put(classLoader, managerMap);
> > > -               }
> > > -             
> > >  -            object  =   managerMap.get(singletonName);
> > > -              /*  No singleton for this application, create one  */
> > > -              if (object ==  null)
> > > -              {
> >  > -                 try
> > >  -                  {
> > >  -                       //Load class
> > > -                       Class<?> clazz =  
> >  >ClassUtil.getClassFromName(singletonName);
> > > -                       if(clazz ==  null)
> > >  -                       {
> > > -                           throw new   ClassNotFoundException("Class 
> > > with 

> >name: " 
> >
> > >+  singletonName + " is not found in  the system");
> > > -                       }
> >  >  -                     
> > >  -                      //Create  instance
> > > -                       object =  clazz.newInstance();
> > > -
> > > -                       //Save it
> > > -                          managerMap.put(singletonName, object);
> > > -                     
> > > -                       //Save it object  -->   classloader
> > > -                       objectToClassLoaderMap.put(object,  classLoader);
> > >  -
> > > -                  }
> > >  -                  catch  (InstantiationException e)
> > >  -                  {
> > >  -                       throw new WebBeansException("Unable to  
>instantiate  
>
> >class 
> >
> > >: " + singletonName, e);
> > > -                   }
> > > -                   catch (IllegalAccessException  e)
> > > -                   {
> > > -                       throw new  WebBeansException("Illegal access  
> >exception in 
> >
> > >creating instance  with class : "  + singletonName, e);
> > > -                   }
> > > -                   catch (ClassNotFoundException e)
> > > -                   {
> > > -                       throw  new   WebBeansException("Class not found 
> >exception 
> >
> >  >in creating instance with  class : "  + singletonName, e);
> >  > -                  }
> >  > -             }
> > > -          }
> > > -
> > > -          return object;
> > > +         return   FINDER.get(classLoader, singletonName);
> > >         }
> > >    
> > > -    /**
> > >  -     *  Gets singleton  instance if one already  exists
> > > -     *  @param singletonName  singleton  class name
> > > -     * @param  cl classloader of  the  deployment
> > > -     * @return  singleton  instance or null if one  doesn't already exist
> > > -       */
> > > +    
> > >       public  static  Object getExistingSingletonInstance(String 
> >singletonName,  
> >
> > >ClassLoader cl)
> >  >      {
> > > -          Object  object = null;
> > > -          synchronized  (singletonMap)
> > > -         {
> > >  -             Map<String,  Object> managerMap  =  singletonMap.get(cl);
> > > -              if  (managerMap == null)
> > >  -             {
> > > -                  return  null;
> > > -              }
> > > -               else
> > > -              {
> > > -                   object =  managerMap.get(singletonName);
> > > -               }
> > > -         }
> > > -         return  object;
> > >  +         return FINDER.getExist(cl,   singletonName);
> > >       }
> > >    
> > > -     /**
> > > -     *  Clear all  deployment instances when the application is  
>undeployed.
> >  >  -     * @param classLoader of the deployment
> > >  -       */
> > >      public static  void  clearInstances(ClassLoader  classLoader)
> > >        {
> > > -          Asserts.assertNotNull(classLoader,  "classloader is null");
> > >  -         synchronized  (singletonMap)
> > >  -         {
> > > -              Map<String, Object>  objects =  
> >singletonMap.remove(classLoader);
> > > -               if(objects != null)
> > > -               {
> > > -                   for(Entry<String, Object> entry :  objects.entrySet())
> > > -                   {
> > > -                          
objectToClassLoaderMap.remove(entry.getValue());
> > > -                   }
> > > -               }
> > > -         }
> > > +           FINDER.clear(classLoader);
> > >       }
> >  >    
> > > -     /**
> > > -      *  Gets classloader with given singelton  instance.
> > >  -     *  @param object singleton instance
> > > -       * @return the  classloader that instance is created  within
> > > -       */
> > > -    public  static ClassLoader   getSingletonClassLoader(Object object)
> > >  +    public static  Object  getSingletonClassLoader(Object  object)
> > >       {
> > > -          Asserts.assertNotNull(object, "object is  null");
> > >  -         synchronized   (objectToClassLoaderMap)
> > > -         {
> >  > -                if(objectToClassLoaderMap.containsKey(object))
> > > -               {
> > > -                   return  objectToClassLoaderMap.get(object);
> > > -               }              
> >  > -         }
> > > -        
> > > -         return null;
> > > +          return  FINDER.getKey(object);
> > >        }
> > > +    
> > > +      //Thirdt pary frameworks can  set singleton instance
> > > +     //For  example, OpenEJB could  provide its own provider
> >  > +    //Based on   deployment
> > > +     public synchronized void   setSingletonService(SingletonService 
> >  >singletonService)
> > > +      {
> > > +         FINDER.singletonService =   singletonService;
> >  > +    }
> > > +
> > > +       @Override
> > > +    public void clear(Object key)
> > >  +      {
> > > +          this.singletonService.clear(key);
> > > +     }
> > >  +
> > >  +    @Override
> > > +    public  Object  get(Object  key, String singletonClassName)
> > >  +    {
> > > +          return  this.singletonService.get(key,   singletonClassName);
> > > +     }
> > > +
> > > +      @Override
> >  > +    public Object getExist(Object key, String    singletonClassName)
> > > +    {
> > > +          return  this.singletonService.getExist(key,   
>singletonClassName);
> > > +     }
> > > +
> > >  +     @Override
> > > +    public Object  getKey(Object   singleton)
> > > +    {
> > >  +         return   this.singletonService.getKey(singleton);
> > > +     }
> >  > +
> > > +     @Override
> > > +     public  boolean isExist(Object key, String   singletonClassName)
> > > +     {
> > > +         return   this.singletonService.isExist(key,  
singletonClassName);
> > > +      }
> > > +     
> > > +    
> > > 
> > >   }
> >  > \ No newline at end of  file
> > > 
> > > Added:  
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>a
> >a
> >  >
> > >  URL: 
>>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java?rev=982578&view=auto
>o
> >o
> >  >
> > > 
> 
>==============================================================================
> >  > ; --- -  
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>a
> >a
> >  >   (added)
> > > +++  
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>a
> >a
> >  >   Thu Aug  5 12:37:01 2010
> > > @@ -0,0 +1,239  @@
> > > +/*
> > > + *  Licensed to  the Apache Software  Foundation (ASF) under one
> > > + * or  more contributor   license agreements. See the NOTICE file
> > > + *  distributed with  this work for  additional information
> > > + *  regarding  copyright ownership. The ASF licenses  this file
> > > + * to   you under the Apache License, Version 2.0 (the
> > > + *   "License"); you  may not use this file except in compliance
> > > +  * with the  License.  You may obtain a copy of the License at
> >  > + *
> > > + *    http://www.apache.org/licenses/LICENSE-2.0
> > > + *
> > > + *  Unless  required by  applicable law or agreed to in writing,
> >  > + * software  distributed under the  License is distributed on  an
> > > + * "AS IS"  BASIS, WITHOUT WARRANTIES OR  CONDITIONS  OF ANY
> > > + * KIND, either  express or implied. See the License  for  the
> > > + * specific language  governing permissions and  limitations
> > > + * under  the  License.
> > > +  */
> > > +package org.apache.webbeans.corespi;
> > >   +
> > > +import  java.util.HashMap;
> > > +import   java.util.IdentityHashMap;
> > > +import  java.util.Map;
> >  > +import  java.util.Map.Entry;
> > > +
> > >  +import   org.apache.webbeans.exception.WebBeansException;
> > >  +import   org.apache.webbeans.spi.SingletonService;
> > >  +import   org.apache.webbeans.util.Asserts;
> > > +import    org.apache.webbeans.util.ClassUtil;
> > > +import    org.apache.webbeans.util.WebBeansUtil;
> > > +
> > > +public  class   DefaultSingletonService implements SingletonService 
> > >  +{
> > > +      /**
> > > +     * Keys  --> ClassLoaders
> > > +      * Values  -->  Maps of singleton class name with object
> > >  +      */
> > > +     private final Map<ClassLoader,   Map<String, Object>>  singletonMap 
> > > = 
>
> >new 
> >
> >  >HashMap<ClassLoader,  Map<String,Object>>();
> >  >  +    
> > > +    private  final  Map<Object,  ClassLoader> objectToClassLoaderMap = 
>new  
>
> >  >IdentityHashMap<Object, ClassLoader>();
> > > +
> > > + 
> > > +     /**
> > > +     * Gets  signelton  instance.
> > > +     * @param   singletonName singleton class  name
> > > +     * @return  singleton  instance
> > > +      */
> > >  +    public  Object   getSingletonInstance(String  singletonName)
> > > +    {
> > >  +         return getSingletonInstance(singletonName,  
> >  >WebBeansUtil.getCurrentClassLoader());
> > > +    }
> >  >  +    
> > > +    /**
> > > +      * Gets  singleton instance for  deployment.
> > >  +     * @param  singletonName singleton class  name
> >  > +     * @param  classLoader classloader of the   deployment
> > > +     *  @return signelton instance for  this  deployment
> > > +      */
> > > +     public Object  getSingletonInstance(String  singletonName,  
>ClassLoader 
>
> > >classLoader)
> > > +       {
> > > +        Object object = null;
> > >  +
> > >  +         synchronized  (singletonMap)
> > > +          {
> > >  +             Map<String, Object>   managerMap =  
> >singletonMap.get(classLoader);
> > > +
> >  > +              if (managerMap ==  null)
> > > +              {
> >  > +                 managerMap   = new HashMap<String, Object>();
> > > +                   singletonMap.put(classLoader,   managerMap);
> > > +             }
> >  >  +            
> > > +              object =   managerMap.get(singletonName);
> > >  +             /*  No singleton for this  application, create one  */
> > > +              if (object ==  null)
> > > +              {
> >  > +                try
> >  >  +                 {
> >  > +                       //Load  class
> > > +                       Class<?> clazz =  
> >  >ClassUtil.getClassFromName(singletonName);
> > > +                       if(clazz ==  null)
> > >  +                       {
> > > +                           throw new   ClassNotFoundException("Class 
> > > with 

> >name: " 
> >
> > >+  singletonName + " is not found in  the system");
> > > +                       }
> >  >  +                     
> > >  +                      //Create  instance
> > > +                       object =  clazz.newInstance();
> > > +
> > > +                       //Save it
> > > +                          managerMap.put(singletonName, object);
> > > +                     
> > > +                       //Save it object  -->   classloader
> > > +                       objectToClassLoaderMap.put(object,  classLoader);
> > >  +
> > > +                  }
> > >  +                  catch  (InstantiationException e)
> > >  +                  {
> > >  +                       throw new WebBeansException("Unable to  
>instantiate  
>
> >class 
> >
> > >: " + singletonName, e);
> > > +                   }
> > > +                   catch (IllegalAccessException  e)
> > > +                   {
> > > +                       throw new  WebBeansException("Illegal access  
> >exception in 
> >
> > >creating instance  with class : "  + singletonName, e);
> > > +                   }
> > > +                   catch (ClassNotFoundException e)
> > > +                   {
> > > +                       throw  new   WebBeansException("Class not found 
> >exception 
> >
> >  >in creating instance with  class : "  + singletonName, e);
> >  > +                  }
> >  > +             }
> > > +          }
> > > +
> > > +          return object;
> > > +     }
> > > +    
> > > +    /**
> > > +     * Gets  singleton   instance if one already exists
> > > +     *  @param  singletonName  singleton class name
> > > +      * @param cl  classloader of the  deployment
> > >  +     * @return singleton  instance or null if one  doesn't  already 
exist
> > > +      */
> > > +     public Object   getExistingSingletonInstance(String singletonName, 
> >  >ClassLoader  cl)
> > > +     {
> > > +         Object object  = null;
> > > +          synchronized  (singletonMap)
> > > +          {
> > > +              Map<String, Object>  managerMap =  singletonMap.get(cl);
> >  > +             if  (managerMap ==  null)
> > > +              {
> >  > +                return    null;
> > > +            }
> > >  +              else
> > > +               {
> > > +                  object =   managerMap.get(singletonName);
> > > +               }
> > > +        }
> > >   +        return  object;
> > > +      }
> > > +    
> > > +    /**
> > >  +       * Clear all deployment instances when the application  is  
> >undeployed.
> > > +     * @param classLoader  of the  deployment
> > > +      */
> > >  +    public void  clearInstances(ClassLoader   classLoader)
> > > +    {
> > >  +          Asserts.assertNotNull(classLoader, "classloader is   null");
> > > +         synchronized   (singletonMap)
> > > +         {
> > > +              Map<String, Object>  objects  =  
> >singletonMap.remove(classLoader);
> > > +               if(objects != null)
> > > +               {
> > > +                   for(Entry<String, Object> entry  : objects.entrySet())
> > > +                   {
> > > +                          
objectToClassLoaderMap.remove(entry.getValue());
> > > +                   }
> > > +               }
> > > +         }
> > > +     }
> > > +    
> > >  +    /**
> > > +     *  Gets classloader with  given  singelton instance.
> > > +     *  @param  object singleton  instance
> > > +     * @return the   classloader that instance is created  within
> > > +       */
> > > +    public ClassLoader    getSingletonClassLoader(Object object)
> > > +    {
> >  > +          Asserts.assertNotNull(object, "object  is null");
> > >  +         synchronized  (objectToClassLoaderMap)
> > >  +          {
> > > +               if(objectToClassLoaderMap.containsKey(object))
> > > +               {
> > > +                   return  objectToClassLoaderMap.get(object);
> > > +               }              
> >  > +         }
> > > +        
> > > +         return null;
> > > +      }
> > > +    
> > > +
> > > +      /**
> > >  +     * {...@inheritdoc}
> > >  +     */
> > > +      @Override
> > >  +    public void clear(Object   classLoader)
> > > +     {
> > > +           assertClassLoaderKey(classLoader);
> > > +           clearInstances((ClassLoader)classLoader);
> > > +     }
> > >  +
> > > +     /**
> > > +      * {...@inheritdoc}
> > >  +     */    
> > > +    @Override
> > >  +    public  Object get(Object key,  String  singletonClassName)
> > >  +    {
> > > +           assertClassLoaderKey(key);
> > > +          return  getSingletonInstance(singletonClassName, 
> (ClassLoader)key);
> > >  +     }
> > >  +
> > > +    /**
> > > +     *   {...@inheritdoc}
> > > +      */    
> > >  +     @Override
> > > +    public  Object  getExist(Object key,  String singletonClassName)
> > > +      {
> > > +          assertClassLoaderKey(key);
> > > +           return getExistingSingletonInstance(singletonClassName,  
> >  >(ClassLoader)key);
> > > +    }
> > > +
> > >  +     /**
> > > +      * {...@inheritdoc}
> >  > +      */    
> > > +      @Override
> > > +    public  boolean isExist(Object key,  String  singletonClassName)
> > > +     {
> > >  +          assertClassLoaderKey(key);
> > >  +        return    getExistingSingletonInstance(singletonClassName, 
> > >(ClassLoader)key)  !=  null ?  true : false;
> > > +    }
> > >  +
> > > +     /**
> > > +      *  {...@inheritdoc}
> > > +      */    
> > >  +     @Override
> > > +    public  ClassLoader  getKey(Object  singleton)
> > > +    {
> > >   +        return    getSingletonClassLoader(singleton);
> > > +    }
> > >  +    
> > > +    /**
> > > +     *  Assert that key is  classloader  instance.
> > > +      * @param key key
> > >  +     */
> > > +      private void  assertClassLoaderKey(Object key)
> > > +      {
> > > +         if(!(key instanceof  ClassLoader))
> > > +          {
> > >  +            throw  new   IllegalArgumentException("Key instance must be 
> > >ClassLoader  for  using  DefaultSingletonService");
> > > +          }
> > > +     }
> > > +
> > >  +}
> > > 
> > >  Propchange:  
>>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>a
> >a
> >  >
> > > 
> 
>------------------------------------------------------------------------------
> >  >  ;     svn:eol-style = native
> > > 
> > > 
> > > 
> > 
> > 
> >      
> > 
> 
> 
>       
> 


      

Reply via email to