[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