[webbeans-commits] Webbeans SVN: r1266 - ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean and 4 other directories.
webbeans-commits at lists.jboss.org
webbeans-commits at lists.jboss.org
Wed Jan 28 17:58:12 EST 2009
Author: pete.muir at jboss.org
Date: 2009-01-28 17:58:12 -0500 (Wed, 28 Jan 2009)
New Revision: 1266
Added:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyProvider.java
Removed:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ProxyPool.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/exception/
Modified:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractProducerBean.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyMethodHandler.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/CreationalContextImpl.java
ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/lookup/circular/CircularDependencyTest.java
tck/trunk/impl/src/main/java/org/jboss/webbeans/tck/unit/event/EventTest.java
Log:
better circular dependencies support
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 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -56,7 +56,7 @@
import org.jboss.webbeans.bean.EnterpriseBean;
import org.jboss.webbeans.bean.NewEnterpriseBean;
import org.jboss.webbeans.bean.RIBean;
-import org.jboss.webbeans.bean.proxy.ProxyPool;
+import org.jboss.webbeans.bean.proxy.ClientProxyProvider;
import org.jboss.webbeans.context.ContextMap;
import org.jboss.webbeans.context.CreationalContextImpl;
import org.jboss.webbeans.ejb.EjbDescriptorCache;
@@ -107,7 +107,7 @@
// The registered contexts
private transient final ContextMap contextMap;
// The client proxy pool
- private transient final ProxyPool proxyPool;
+ private transient final ClientProxyProvider clientProxyProvider;
// The registered beans
private transient List<Bean<?>> beans;
// The registered beans, mapped by implementation class
@@ -145,7 +145,7 @@
this.newEnterpriseBeanMap = new ConcurrentHashMap<Class<?>, EnterpriseBean<?>>();
this.enterpriseBeanMap = new ConcurrentHashMap<Class<?>, EnterpriseBean<?>>();
this.resolver = new Resolver(this);
- this.proxyPool = new ProxyPool();
+ this.clientProxyProvider = new ClientProxyProvider();
this.decorators = new HashSet<Decorator>();
this.interceptors = new HashSet<Interceptor>();
this.contextMap = new ContextMap();
@@ -580,7 +580,14 @@
}
else if (MetaDataCache.instance().getScopeModel(bean.getScopeType()).isNormal())
{
- return (T) proxyPool.getClientProxy(bean, creationalContext != null);
+ if (creationalContext != null || (creationalContext == null && getContext(bean.getScopeType()).get(bean) != null))
+ {
+ return (T) clientProxyProvider.getClientProxy(bean);
+ }
+ else
+ {
+ return null;
+ }
}
else
{
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractProducerBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractProducerBean.java 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractProducerBean.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -37,6 +37,7 @@
import javax.inject.manager.InjectionPoint;
import org.jboss.webbeans.ManagerImpl;
+import org.jboss.webbeans.context.CreationalContextImpl;
import org.jboss.webbeans.context.DependentContext;
import org.jboss.webbeans.log.LogProvider;
import org.jboss.webbeans.log.Logging;
@@ -285,8 +286,20 @@
*
* @return The receiver
*/
- protected Object getReceiver()
+ protected Object getReceiver(CreationalContext<?> creationalContext)
{
+ // This is a bit dangerous, as it means that producer methods can end of
+ // executing on partially constructed instances. Also, it's not required
+ // by the spec...
+ if (creationalContext instanceof CreationalContextImpl)
+ {
+ CreationalContextImpl<?> creationalContextImpl = (CreationalContextImpl<?>) creationalContext;
+ if (creationalContextImpl.containsIncompleteInstance(getDeclaringBean()))
+ {
+ log.warn("Executing producer method on incomplete declaring bean due to circular injection");
+ return creationalContextImpl.getIncompleteInstance(getDeclaringBean());
+ }
+ }
return getAnnotatedItem().isStatic() ? null : manager.getInstance(getDeclaringBean());
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -82,7 +82,7 @@
@Override
protected T produceInstance(CreationalContext<T> creationalContext)
{
- return field.get(getReceiver());
+ return field.get(getReceiver(creationalContext));
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -78,7 +78,7 @@
protected T produceInstance(CreationalContext<T> creationalContext)
{
- return method.invoke(getReceiver(), manager, creationalContext);
+ return method.invoke(getReceiver(creationalContext), manager, creationalContext);
}
/**
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyMethodHandler.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyMethodHandler.java 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyMethodHandler.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -38,7 +38,7 @@
*
* @author Nicklas Karlsson
*
- * @see org.jboss.webbeans.bean.proxy.ProxyPool
+ * @see org.jboss.webbeans.bean.proxy.ClientProxyProvider
*/
public class ClientProxyMethodHandler implements MethodHandler, Serializable
{
@@ -49,6 +49,8 @@
private transient Bean<?> bean;
// The bean index in the manager
private int beanIndex;
+
+ private static final ThreadLocal<CreationalContextImpl<?>> currentCreationalContext = new ThreadLocal<CreationalContextImpl<?>>();
/**
* Constructor
@@ -97,8 +99,28 @@
private <T> T getProxiedInstance(Bean<T> bean)
{
- Context context = CurrentManager.rootManager().getContext(bean.getScopeType());
- return context.get(bean, new CreationalContextImpl<T>(bean));
+ CreationalContextImpl<T> creationalContext;
+ if (currentCreationalContext.get() == null)
+ {
+ creationalContext = new CreationalContextImpl<T>(bean);
+ currentCreationalContext.set(creationalContext);
+ }
+ else
+ {
+ creationalContext = currentCreationalContext.get().getCreationalContext(bean);
+ }
+ try
+ {
+ Context context = CurrentManager.rootManager().getContext(bean.getScopeType());
+ return context.get(bean, creationalContext);
+ }
+ finally
+ {
+ if (creationalContext.isOuter())
+ {
+ currentCreationalContext.remove();
+ }
+ }
}
/**
Copied: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyProvider.java (from rev 1263, 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/ClientProxyProvider.java (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyProvider.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -0,0 +1,142 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.webbeans.bean.proxy;
+
+import java.io.Serializable;
+import java.lang.reflect.Type;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.concurrent.Callable;
+
+import javassist.util.proxy.ProxyFactory;
+
+import javax.inject.DefinitionException;
+import javax.inject.manager.Bean;
+
+import org.jboss.webbeans.CurrentManager;
+import org.jboss.webbeans.util.ConcurrentCache;
+import org.jboss.webbeans.util.Proxies;
+
+/**
+ * A proxy pool for holding scope adaptors (client proxies)
+ *
+ * @author Nicklas Karlsson
+ *
+ * @see org.jboss.webbeans.bean.proxy.ProxyMethodHandler
+ */
+public class ClientProxyProvider
+{
+ private static final long serialVersionUID = 9029999149357529341L;
+
+ /**
+ * A container/cache for previously created proxies
+ *
+ * @author Nicklas Karlsson
+ */
+ private ConcurrentCache<Bean<? extends Object>, Object> pool;
+
+ /**
+ * Constructor
+ */
+ public ClientProxyProvider()
+ {
+ this.pool = new ConcurrentCache<Bean<? extends Object>, Object>();
+ }
+
+ /**
+ * Creates a Javassist scope adaptor (client proxy) for a bean
+ *
+ * Creates a Javassist proxy factory. Gets the type info. Sets the interfaces
+ * and superclass to the factory. Hooks in the MethodHandler and creates the
+ * proxy.
+ *
+ * @param bean The bean to proxy
+ * @param beanIndex The index to the bean in the manager bean list
+ * @return A Javassist proxy
+ * @throws InstantiationException When the proxy couldn't be created
+ * @throws IllegalAccessException When the proxy couldn't be created
+ */
+ private static <T> T createClientProxy(Bean<T> bean, int beanIndex) throws RuntimeException
+ {
+
+ try
+ {
+ ClientProxyMethodHandler proxyMethodHandler = new ClientProxyMethodHandler(bean, beanIndex);
+ Set<Type> classes = new LinkedHashSet<Type>(bean.getTypes());
+ classes.add(Serializable.class);
+ ProxyFactory proxyFactory = Proxies.getProxyFactory(classes);
+ proxyFactory.setHandler(proxyMethodHandler);
+ Class<?> clazz = proxyFactory.createClass();
+
+ @SuppressWarnings("unchecked")
+ T instance = (T) clazz.newInstance();
+
+ return instance;
+ }
+ catch (InstantiationException e)
+ {
+ throw new RuntimeException("Could not instantiate client proxy for " + bean, e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RuntimeException("Could not access bean correctly when creating client proxy for " + bean, e);
+ }
+ }
+
+ /**
+ * Gets a client proxy for a bean
+ *
+ * Looks for a proxy in the pool. If not found, one is created and added to
+ * the pool if the create argument is true.
+ *
+ * @param bean The bean to get a proxy to
+ * @param create Flag indicating if the proxy should be created if it does
+ * not already exist
+ * @return the client proxy for the bean
+ */
+ @SuppressWarnings("unchecked")
+ public <T> T getClientProxy(final Bean<T> bean)
+ {
+ return pool.putIfAbsent(bean, new Callable<T>()
+ {
+
+ public T call() throws Exception
+ {
+ int beanIndex = CurrentManager.rootManager().getBeans().indexOf(bean);
+ if (beanIndex < 0)
+ {
+ throw new DefinitionException(bean + " is not known to the manager");
+ }
+ return createClientProxy(bean, beanIndex);
+ }
+
+ });
+ }
+
+ /**
+ * Gets a string representation
+ *
+ * @return The string representation
+ */
+ @Override
+ public String toString()
+ {
+ return "Proxy pool with " + pool.size() + " proxies";
+ }
+
+}
Property changes on: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ClientProxyProvider.java
___________________________________________________________________
Name: svn:mergeinfo
+
Deleted: 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 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/ProxyPool.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -1,149 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed 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.jboss.webbeans.bean.proxy;
-
-import java.io.Serializable;
-import java.lang.reflect.Type;
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.concurrent.Callable;
-
-import javassist.util.proxy.ProxyFactory;
-
-import javax.inject.DefinitionException;
-import javax.inject.manager.Bean;
-
-import org.jboss.webbeans.CurrentManager;
-import org.jboss.webbeans.util.ConcurrentCache;
-import org.jboss.webbeans.util.Proxies;
-
-/**
- * A proxy pool for holding scope adaptors (client proxies)
- *
- * @author Nicklas Karlsson
- *
- * @see org.jboss.webbeans.bean.proxy.ProxyMethodHandler
- */
-public class ProxyPool
-{
- private static final long serialVersionUID = 9029999149357529341L;
-
- /**
- * A container/cache for previously created proxies
- *
- * @author Nicklas Karlsson
- */
- private ConcurrentCache<Bean<? extends Object>, Object> pool;
-
- /**
- * Constructor
- */
- public ProxyPool()
- {
- this.pool = new ConcurrentCache<Bean<? extends Object>, Object>();
- }
-
- /**
- * Creates a Javassist scope adaptor (client proxy) for a bean
- *
- * Creates a Javassist proxy factory. Gets the type info. Sets the interfaces
- * and superclass to the factory. Hooks in the MethodHandler and creates the
- * proxy.
- *
- * @param bean The bean to proxy
- * @param beanIndex The index to the bean in the manager bean list
- * @return A Javassist proxy
- * @throws InstantiationException When the proxy couldn't be created
- * @throws IllegalAccessException When the proxy couldn't be created
- */
- private static <T> T createClientProxy(Bean<T> bean, int beanIndex) throws RuntimeException
- {
-
- try
- {
- ClientProxyMethodHandler proxyMethodHandler = new ClientProxyMethodHandler(bean, beanIndex);
- Set<Type> classes = new LinkedHashSet<Type>(bean.getTypes());
- classes.add(Serializable.class);
- ProxyFactory proxyFactory = Proxies.getProxyFactory(classes);
- proxyFactory.setHandler(proxyMethodHandler);
- Class<?> clazz = proxyFactory.createClass();
-
- @SuppressWarnings("unchecked")
- T instance = (T) clazz.newInstance();
-
- return instance;
- }
- catch (InstantiationException e)
- {
- throw new RuntimeException("Could not instantiate client proxy for " + bean, e);
- }
- catch (IllegalAccessException e)
- {
- throw new RuntimeException("Could not access bean correctly when creating client proxy for " + bean, e);
- }
- }
-
- /**
- * Gets a client proxy for a bean
- *
- * Looks for a proxy in the pool. If not found, one is created and added to
- * the pool if the create argument is true.
- *
- * @param bean The bean to get a proxy to
- * @param create Flag indicating if the proxy should be created if it does
- * not already exist
- * @return the client proxy for the bean
- */
- @SuppressWarnings("unchecked")
- public <T> T getClientProxy(final Bean<T> bean, boolean create)
- {
- if (create)
- {
- return pool.putIfAbsent(bean, new Callable<T>()
- {
-
- public T call() throws Exception
- {
- int beanIndex = CurrentManager.rootManager().getBeans().indexOf(bean);
- if (beanIndex < 0)
- {
- throw new DefinitionException(bean + " is not known to the manager");
- }
- return createClientProxy(bean, beanIndex);
- }
-
- });
- }
- else
- {
- return (T)pool.getValue(bean);
- }
- }
-
- /**
- * Gets a string representation
- *
- * @return The string representation
- */
- @Override
- public String toString()
- {
- return "Proxy pool with " + pool.size() + " proxies";
- }
-
-}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/CreationalContextImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/CreationalContextImpl.java 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/CreationalContextImpl.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -11,17 +11,20 @@
private final Map<Bean<?>, Object> incompleteInstances;
private final Bean<T> bean;
+ private final boolean outer;
public CreationalContextImpl(Bean<T> bean)
{
this.incompleteInstances = new HashMap<Bean<?>, Object>();
this.bean = bean;
+ this.outer = true;
}
private CreationalContextImpl(Bean<T> bean, Map<Bean<?>, Object> incompleteInstances)
{
this.incompleteInstances = incompleteInstances;
this.bean = bean;
+ this.outer = false;
}
public void push(T incompleteInstance)
@@ -44,4 +47,9 @@
return incompleteInstances.containsKey(bean);
}
+ public boolean isOuter()
+ {
+ return outer;
+ }
+
}
Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/lookup/circular/CircularDependencyTest.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/lookup/circular/CircularDependencyTest.java 2009-01-28 21:20:19 UTC (rev 1265)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/lookup/circular/CircularDependencyTest.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -7,7 +7,7 @@
{
- @Test(groups="broken", timeOut=1000)
+ @Test
public void testCircularInjectionOnTwoNormalBeans() throws Exception
{
deployBeans(Pig.class, Food.class);
@@ -73,7 +73,7 @@
}.run();
}
- @Test(groups="broken", timeOut=1000)
+ @Test(timeOut=1000)
public void testDependentProducerMethodDeclaredOnDependentBeanWhichInjectsProducedBean() throws Exception
{
deployBeans(DependentSelfConsumingDependentProducer.class);
Modified: tck/trunk/impl/src/main/java/org/jboss/webbeans/tck/unit/event/EventTest.java
===================================================================
--- tck/trunk/impl/src/main/java/org/jboss/webbeans/tck/unit/event/EventTest.java 2009-01-28 21:20:19 UTC (rev 1265)
+++ tck/trunk/impl/src/main/java/org/jboss/webbeans/tck/unit/event/EventTest.java 2009-01-28 22:58:12 UTC (rev 1266)
@@ -432,6 +432,7 @@
activateDependentContext();
RecluseSpider bean = manager.getInstanceByType(RecluseSpider.class);
assert bean != null;
+ bean.toString();
manager.fireEvent("Another event");
assert RecluseSpider.notified;
More information about the weld-commits
mailing list