[webbeans-commits] Webbeans SVN: r395 - in ri/trunk/webbeans-ri/src: main/java/org/jboss/webbeans/bean/proxy and 2 other directories.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Wed Dec 3 14:25:14 EST 2008


Author: pete.muir at jboss.org
Date: 2008-12-03 14:25:14 -0500 (Wed, 03 Dec 2008)
New Revision: 395

Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ProxyPool.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/contexts/ContextMap.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/examples/Tests.java
Log:
More improvements to thread safety (some refactoring needed)

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java	2008-12-03 18:44:05 UTC (rev 394)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java	2008-12-03 19:25:14 UTC (rev 395)
@@ -19,6 +19,7 @@
 
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -210,7 +211,7 @@
     */
    public List<Class<? extends Annotation>> getEnabledDeploymentTypes()
    {
-      return enabledDeploymentTypes;
+      return Collections.unmodifiableList(enabledDeploymentTypes);
    }
 
    /**
@@ -289,10 +290,13 @@
     */
    public Manager setBeans(Set<AbstractBean<?, ?>> beans)
    {
-      this.beans = new CopyOnWriteArrayList<Bean<?>>(beans);
-      resolver.clear();
-      initStandardBeans();
-      return this;
+      synchronized (beans)
+      {
+         this.beans = new CopyOnWriteArrayList<Bean<?>>(beans);
+         resolver.clear();
+         initStandardBeans();
+         return this;
+      }
    }
 
    /**
@@ -302,7 +306,7 @@
     */
    public List<Bean<?>> getBeans()
    {
-      return beans;
+      return Collections.unmodifiableList(beans);
    }
 
    /**

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java	2008-12-03 18:44:05 UTC (rev 394)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java	2008-12-03 19:25:14 UTC (rev 395)
@@ -21,6 +21,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.jboss.webbeans.ejb.EjbMetaData;
 import org.jboss.webbeans.model.AnnotationModel;
@@ -41,7 +42,7 @@
 
       public AnnotationModelMap()
       {
-         delegate = new HashMap<Class<? extends Annotation>, T>();
+         delegate = new ConcurrentHashMap<Class<? extends Annotation>, T>();
       }
 
       public <S extends Annotation> T putIfAbsent(Class<S> key)

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ProxyPool.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ProxyPool.java	2008-12-03 18:44:05 UTC (rev 394)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ProxyPool.java	2008-12-03 19:25:14 UTC (rev 395)
@@ -22,7 +22,11 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
 
 import javassist.util.proxy.ProxyFactory;
 import javassist.util.proxy.ProxyObject;
@@ -49,24 +53,24 @@
     * 
     * @author Nicklas Karlsson
     */
-   private class Pool extends ForwardingMap<Bean<?>, Object>
+   private class Pool extends ForwardingMap<Bean<?>, Future<Object>>
    {
 
-      Map<Bean<?>, Object> delegate;
+      Map<Bean<?>, Future<Object>> delegate;
 
       public Pool()
       {
-         delegate = new ConcurrentHashMap<Bean<?>, Object>();
+         delegate = new ConcurrentHashMap<Bean<?>, Future<Object>>();
       }
 
       @SuppressWarnings("unchecked")
-      public <T> T get(Bean<T> key)
+      public <T> Future<T> get(Bean<T> key)
       {
-         return (T) super.get(key);
+         return (Future<T>) super.get(key);
       }
 
       @Override
-      protected Map<Bean<?>, Object> delegate()
+      protected Map<Bean<?>, Future<Object>> delegate()
       {
          return delegate;
       }
@@ -93,7 +97,7 @@
     * 
     * @author Nicklas Karlsson
     */
-   private class TypeInfo
+   private static class TypeInfo
    {
       Class<?>[] interfaces;
       Class<?> superclass;
@@ -109,7 +113,7 @@
     * @param types A set of types (interfaces and superclasses) of a class
     * @return The TypeInfo with categorized information
     */
-   private TypeInfo getTypeInfo(Set<Class<?>> types)
+   private static TypeInfo getTypeInfo(Set<Class<?>> types)
    {
       TypeInfo typeInfo = new TypeInfo();
       List<Class<?>> interfaces = new ArrayList<Class<?>>();
@@ -145,7 +149,7 @@
     * @throws IllegalAccessException When the proxy couldn't be created
     */
    @SuppressWarnings("unchecked")
-   private <T> T createClientProxy(Bean<T> bean, int beanIndex) throws RuntimeException
+   private static <T> T createClientProxy(Bean<T> bean, int beanIndex, ManagerImpl manager) throws RuntimeException
    {
       ProxyFactory proxyFactory = new ProxyFactory();
       TypeInfo typeInfo = getTypeInfo(bean.getTypes());
@@ -178,21 +182,66 @@
     * @param bean
     * @return
     */
-   public Object getClientProxy(Bean<?> bean)
+   public Object getClientProxy(final Bean<?> bean)
    {
-      Object clientProxy = pool.get(bean);
+      Future<?> clientProxy = pool.get(bean);
       if (clientProxy == null)
       {
-         int beanIndex = manager.getBeans().indexOf(bean);
-         if (beanIndex < 0)
+         FutureTask<Object> task = new FutureTask<Object>(new Callable<Object>()
          {
-            throw new DefinitionException(bean + " is not known to the manager");
+   
+            public Object call() throws Exception
+            {
+               int beanIndex = manager.getBeans().indexOf(bean);
+               if (beanIndex < 0)
+               {
+                  throw new DefinitionException(bean + " is not known to the manager");
+               }
+               return createClientProxy(bean, beanIndex, manager);
+            }
+      
+         });
+         clientProxy = task;
+         pool.put(bean, task);
+         task.run();
+      }
+      boolean interrupted = false;
+      try
+      {
+         while (true)
+         {
+            try
+            {
+               return clientProxy.get();
+            }
+            catch (InterruptedException e)
+            {
+               interrupted = true;
+            }
+            catch (ExecutionException e)
+            {
+               if (e.getCause() instanceof RuntimeException)
+               {
+                  throw (RuntimeException) e.getCause();
+               }
+               else if (e.getCause() instanceof Error)
+               {
+                  throw (Error) e.getCause();
+               }
+               else
+               {
+                  throw new IllegalStateException(e.getCause());
+               }
+            };
          }
-         clientProxy = createClientProxy(bean, beanIndex);
-
-         pool.put(bean, clientProxy);
       }
-      return clientProxy;
+      finally
+      {
+         if (interrupted)
+         {
+            Thread.currentThread().interrupt();
+         }
+      }
    }
 
    @Override

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/contexts/ContextMap.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/contexts/ContextMap.java	2008-12-03 18:44:05 UTC (rev 394)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/contexts/ContextMap.java	2008-12-03 19:25:14 UTC (rev 395)
@@ -87,8 +87,12 @@
       List<Context> contexts = super.get(context.getScopeType());
       if (contexts == null)
       {
-         contexts = new CopyOnWriteArrayList<Context>();
-         put(context.getScopeType(), contexts);
+         synchronized (delegate)
+         {
+            contexts = new CopyOnWriteArrayList<Context>();
+            put(context.getScopeType(), contexts);
+         }
+         contexts = super.get(context.getScopeType());
       }
       contexts.add(context);
    }

Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/examples/Tests.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/examples/Tests.java	2008-12-03 18:44:05 UTC (rev 394)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/examples/Tests.java	2008-12-03 19:25:14 UTC (rev 395)
@@ -2,6 +2,9 @@
 
 import java.lang.reflect.Method;
 
+import javax.webbeans.Production;
+import javax.webbeans.Standard;
+
 import org.jboss.webbeans.bean.ProducerMethodBean;
 import org.jboss.webbeans.bean.SimpleBean;
 import org.jboss.webbeans.test.AbstractTest;
@@ -41,7 +44,7 @@
    public void testMockSentenceTranslator() throws Exception {
       setupTextTranslator();
       
-      manager.getEnabledDeploymentTypes().add(Mock.class);
+      manager.setEnabledDeploymentTypes(Standard.class, Production.class, Mock.class);
       
       TextTranslator tt2 = manager.getInstanceByType(TextTranslator.class);
       assert "Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.".equals( tt2.translate("Hello world. How's tricks?") );




More information about the weld-commits mailing list