You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ge...@apache.org on 2010/08/05 14:37:02 UTC

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   (with props)
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
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
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java 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
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java?rev=982578&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java 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
------------------------------------------------------------------------------
    svn:eol-style = native



Re: svn commit: r982578 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: config/WebBeansFinder.java corespi/DefaultSingletonService.java

Posted by Mark Struberg <st...@yahoo.de>.
s/2/1/: we only can have 1 SingletonService for the WHOLE VM 

:)

LieGrue,
strub




----- Original Message ----
> From: Mark Struberg <st...@yahoo.de>
> To: dev@openwebbeans.apache.org
> 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 <st...@yahoo.de>
> > To: dev@openwebbeans.apache.org
> >  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: "gerdogdu@apache.org" <ge...@apache.org>
> > > To: commits@openwebbeans.apache.org
> >  >  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
> > > 
> > > 
> > > 
> > 
> > 
> >      
> > 
> 
> 
>       
> 


      

Re: svn commit: r982578 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: config/WebBeansFinder.java corespi/DefaultSingletonService.java

Posted by Mark Struberg <st...@yahoo.de>.
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 <st...@yahoo.de>
> To: dev@openwebbeans.apache.org
> 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: "gerdogdu@apache.org" <ge...@apache.org>
> > To: commits@openwebbeans.apache.org
> >  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 
>
> >   (with props)
> > Modified:
> >      
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>a
> >
> > 
> > Modified: 
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>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
> >
> > 
>==============================================================================
> > ; --- 
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>a
> >  a (original)
> > +++  
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>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
> >
> >  URL: 
>>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java?rev=982578&view=auto
>o
> >
> > 
>==============================================================================
> > ; --- -  
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>a
> >   (added)
> > +++  
>>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>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
> >
> > 
>------------------------------------------------------------------------------
> >  ;     svn:eol-style = native
> > 
> > 
> > 
> 
> 
>       
> 


      

Re: svn commit: r982578 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: config/WebBeansFinder.java corespi/DefaultSingletonService.java

Posted by Mark Struberg <st...@yahoo.de>.
+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: "gerdogdu@apache.org" <ge...@apache.org>
> To: commits@openwebbeans.apache.org
> 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 
>   (with props)
> Modified:
>      
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>
> 
> Modified: 
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>
> 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
>
> ==============================================================================
> --- 
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
> a (original)
> +++  
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansFinder.java
>  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
>
> URL: 
>http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java?rev=982578&view=auto
>
> ==============================================================================
> --- -  
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>  (added)
> +++  
>openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/corespi/DefaultSingletonService.java
>  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
>
> ------------------------------------------------------------------------------
>      svn:eol-style = native
> 
> 
>