openwebbeans-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gerdo...@apache.org
Subject svn commit: r982578 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: config/WebBeansFinder.java corespi/DefaultSingletonService.java
Date Thu, 05 Aug 2010 12:37:02 GMT
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



Mime
View raw message