[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