[webbeans-commits] Webbeans SVN: r1207 - ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans and 3 other directories.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Fri Jan 23 12:50:40 EST 2009


Author: pete.muir at jboss.org
Date: 2009-01-23 12:50:40 -0500 (Fri, 23 Jan 2009)
New Revision: 1207

Modified:
   examples/trunk/translator/webbeans-translator-ejb/src/main/java/org/jboss/webbeans/examples/translator/TextTranslator.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/EnterpriseBeanProxyMethodHandler.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/SessionContext.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/SessionBeanInterceptor.java
Log:
Use new instances for non-contextual injection into EJBs, WBRI-101

Modified: examples/trunk/translator/webbeans-translator-ejb/src/main/java/org/jboss/webbeans/examples/translator/TextTranslator.java
===================================================================
--- examples/trunk/translator/webbeans-translator-ejb/src/main/java/org/jboss/webbeans/examples/translator/TextTranslator.java	2009-01-23 17:13:42 UTC (rev 1206)
+++ examples/trunk/translator/webbeans-translator-ejb/src/main/java/org/jboss/webbeans/examples/translator/TextTranslator.java	2009-01-23 17:50:40 UTC (rev 1207)
@@ -2,18 +2,19 @@
 
 import java.io.Serializable;
 
+import javax.ejb.EJB;
 import javax.webbeans.Initializer;
 
 public class TextTranslator implements Serializable
 { 
    private SentenceParser sentenceParser; 
-   private Translator sentenceTranslator; 
    
+   @EJB Translator translator;
+   
    @Initializer
-   TextTranslator(SentenceParser sentenceParser, Translator sentenceTranslator) 
+   TextTranslator(SentenceParser sentenceParser) 
    { 
-      this.sentenceParser = sentenceParser; 
-      this.sentenceTranslator = sentenceTranslator; 
+      this.sentenceParser = sentenceParser;  
    }
    
    public String translate(String text) 
@@ -21,7 +22,7 @@
       StringBuilder sb = new StringBuilder(); 
       for (String sentence: sentenceParser.parse(text)) 
       { 
-         sb.append(sentenceTranslator.translate(sentence)).append(". "); 
+         sb.append(translator.translate(sentence)).append(". "); 
       } 
       return sb.toString().trim(); 
    }

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-23 17:13:42 UTC (rev 1206)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ManagerImpl.java	2009-01-23 17:50:40 UTC (rev 1207)
@@ -52,6 +52,8 @@
 import javax.webbeans.manager.Manager;
 
 import org.jboss.webbeans.bean.AbstractBean;
+import org.jboss.webbeans.bean.EnterpriseBean;
+import org.jboss.webbeans.bean.NewEnterpriseBean;
 import org.jboss.webbeans.bean.proxy.ProxyPool;
 import org.jboss.webbeans.context.ContextMap;
 import org.jboss.webbeans.ejb.EjbDescriptorCache;
@@ -103,7 +105,8 @@
    // The registered beans
    private transient List<Bean<?>> beans;
    // The registered beans, mapped by implementation class
-   private transient final Map<Class<?>, Bean<?>> beanMap;
+   private transient final Map<Class<?>, EnterpriseBean<?>> newEnterpriseBeanMap;
+   private transient final Map<Class<?>, EnterpriseBean<?>> enterpriseBeanMap;
    // The registered decorators
    private transient final Set<Decorator> decorators;
    // The registered interceptors
@@ -133,7 +136,8 @@
       this.namingContext = namingContext;
       this.resourceLoader = resourceLoader;
       this.beans = new CopyOnWriteArrayList<Bean<?>>();
-      this.beanMap = new ConcurrentHashMap<Class<?>, Bean<?>>();
+      this.newEnterpriseBeanMap = new ConcurrentHashMap<Class<?>, EnterpriseBean<?>>();
+      this.enterpriseBeanMap = new ConcurrentHashMap<Class<?>, EnterpriseBean<?>>();
       this.resolver = new Resolver(this);
       this.proxyPool = new ProxyPool();
       this.decorators = new HashSet<Decorator>();
@@ -328,6 +332,7 @@
     * @param beans The set of beans to add
     * @return A reference to the manager
     */
+   // TODO Build maps in the deployer :-)
    public void setBeans(Set<AbstractBean<?, ?>> beans)
    {
       synchronized (beans)
@@ -335,7 +340,14 @@
          this.beans = new CopyOnWriteArrayList<Bean<?>>(beans);
          for (AbstractBean<?, ?> bean : beans)
          {
-            beanMap.put(bean.getType(), bean);
+            if (bean instanceof NewEnterpriseBean)
+            {
+               newEnterpriseBeanMap.put(bean.getType(), (EnterpriseBean<?>) bean);
+            }
+            else if (bean instanceof EnterpriseBean)
+            {
+               enterpriseBeanMap.put(bean.getType(), (EnterpriseBean<?>) bean);
+            }
          }
          resolver.clear();
       }
@@ -346,10 +358,15 @@
     * 
     * @return The bean map
     */
-   public Map<Class<?>, Bean<?>> getBeanMap()
+   public Map<Class<?>, EnterpriseBean<?>> getNewEnterpriseBeanMap()
    {
-      return beanMap;
+      return newEnterpriseBeanMap;
    }
+   
+   public Map<Class<?>, EnterpriseBean<?>> getEnterpriseBeanMap()
+   {
+      return enterpriseBeanMap;
+   }
 
    /**
     * The beans registered with the Web Bean manager. For internal use

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/EnterpriseBeanProxyMethodHandler.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/EnterpriseBeanProxyMethodHandler.java	2009-01-23 17:13:42 UTC (rev 1206)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/proxy/EnterpriseBeanProxyMethodHandler.java	2009-01-23 17:50:40 UTC (rev 1207)
@@ -18,15 +18,14 @@
 package org.jboss.webbeans.bean.proxy;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javassist.util.proxy.MethodHandler;
 
-import javax.webbeans.Dependent;
-
 import org.jboss.webbeans.CurrentManager;
 import org.jboss.webbeans.bean.EnterpriseBean;
 import org.jboss.webbeans.log.LogProvider;
@@ -44,6 +43,40 @@
 {
    // The log provider
    private static final transient LogProvider log = Logging.getLogProvider(EnterpriseBeanProxyMethodHandler.class);
+   
+   private static final ThreadLocal<Set<Class<?>>> contextualInstance;
+   
+   static
+   {
+      contextualInstance = new ThreadLocal<Set<Class<?>>>()
+      {
+         
+         @Override
+         protected Set<Class<?>> initialValue()
+         {
+            return new HashSet<Class<?>>();
+         }
+         
+      };
+      
+   }
+   
+   public static boolean isContextualInstance(Class<?> beanClass)
+   {
+      return contextualInstance.get().contains(beanClass);
+   }
+   
+   private static void setContextualInstance(Class<?> beanClass, boolean accessing)
+   {
+      if (accessing)
+      {
+         contextualInstance.get().add(beanClass);
+      }
+      else
+      {
+         contextualInstance.get().remove(beanClass);
+      }
+   }
 
    // The container provided proxy that implements all interfaces
    private final Map<Class<?>, Object> proxiedInstances;
@@ -51,6 +84,7 @@
    private boolean destroyed;
    private boolean canCallRemoveMethods;
    private final List<Method> removeMethods;
+   private final Class<?> beanClass;
 
    /**
     * Constructor
@@ -66,6 +100,7 @@
       this.canCallRemoveMethods = bean.canCallRemoveMethods();
       this.removeMethods = bean.getEjbDescriptor().getRemoveMethods();
       this.destroyed = false;
+      this.beanClass = bean.getType();
       log.trace("Created enterprise bean proxy method handler for " + bean);
    }
 
@@ -101,7 +136,15 @@
          {
             throw new IllegalStateException("Unable to establish jndi name to use to lookup EJB");
          }
-         proxiedInstance = CurrentManager.rootManager().getNaming().lookup(jndiName, businessInterface);
+         try
+         {
+            setContextualInstance(beanClass, true);
+            proxiedInstance = CurrentManager.rootManager().getNaming().lookup(jndiName, businessInterface);
+         }
+         finally
+         {
+            setContextualInstance(beanClass, false);
+         }
          proxiedInstances.put(businessInterface, proxiedInstance);
       }
       Method proxiedMethod = Reflections.lookupMethod(method, proxiedInstance);
@@ -116,8 +159,17 @@
             throw new UnsupportedOperationException("Remove method can't be called directly on non-dependent scoped Enterprise Beans");
          }
       }
-      Object returnValue = Reflections.invokeAndWrap(proxiedMethod, proxiedInstance, args);
-      log.trace("Executed " + method + " on " + proxiedInstance + " with parameters " + args + " and got return value " + returnValue);
-      return returnValue;
+      try
+      {
+         setContextualInstance(beanClass, true);
+         Object returnValue = Reflections.invokeAndWrap(proxiedMethod, proxiedInstance, args);
+         log.trace("Executed " + method + " on " + proxiedInstance + " with parameters " + args + " and got return value " + returnValue);
+         return returnValue;
+      }
+      finally
+      {
+         setContextualInstance(beanClass, false);
+      }
+      
    }
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/SessionContext.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/SessionContext.java	2009-01-23 17:13:42 UTC (rev 1206)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/SessionContext.java	2009-01-23 17:50:40 UTC (rev 1207)
@@ -51,7 +51,7 @@
     * Gets the bean map
     * 
     * @returns The bean map
-    * @see org.jboss.webbeans.context.AbstractContext#getBeanMap()
+    * @see org.jboss.webbeans.context.AbstractContext#getNewEnterpriseBeanMap()
     */
    @Override
    public BeanMap getBeanMap()

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/SessionBeanInterceptor.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/SessionBeanInterceptor.java	2009-01-23 17:13:42 UTC (rev 1206)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/SessionBeanInterceptor.java	2009-01-23 17:50:40 UTC (rev 1207)
@@ -20,10 +20,10 @@
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.interceptor.InvocationContext;
-import javax.webbeans.manager.Bean;
 
 import org.jboss.webbeans.CurrentManager;
 import org.jboss.webbeans.bean.EnterpriseBean;
+import org.jboss.webbeans.bean.proxy.EnterpriseBeanProxyMethodHandler;
 
 /**
  * Interceptor for handling EJB post-construct tasks
@@ -76,17 +76,13 @@
     */
    private static <T> EnterpriseBean<T> getBean(Class<? extends T> beanClass)
    {
-      Bean<?> bean = CurrentManager.rootManager().getBeanMap().get(beanClass);
-      if (bean instanceof EnterpriseBean)
+      if (EnterpriseBeanProxyMethodHandler.isContextualInstance(beanClass))
       {
-         @SuppressWarnings("unchecked")
-         // TODO shift this into the map!
-         EnterpriseBean<T> enterpriseBean = (EnterpriseBean<T>) bean;
-         return enterpriseBean;
+         return (EnterpriseBean<T>) CurrentManager.rootManager().getEnterpriseBeanMap().get(beanClass);
       }
       else
       {
-         return null;
+         return (EnterpriseBean<T>) CurrentManager.rootManager().getNewEnterpriseBeanMap().get(beanClass);
       }
    }
 




More information about the weld-commits mailing list