[jboss-cvs] JBossAS SVN: r102766 - projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Mar 23 04:55:57 EDT 2010


Author: wolfc
Date: 2010-03-23 04:55:57 -0400 (Tue, 23 Mar 2010)
New Revision: 102766

Modified:
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java
Log:
EJBTHREE-2056: allow for injection of EjbEncFactory

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java	2010-03-23 07:18:06 UTC (rev 102765)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/EJBContainer.java	2010-03-23 08:55:57 UTC (rev 102766)
@@ -64,9 +64,21 @@
 import org.jboss.ejb3.tx.UserTransactionImpl;
 import org.jboss.ejb3.tx.metadata.ApplicationExceptionComponentMetaDataLoaderFactory;
 import org.jboss.ejb3.tx.metadata.ApplicationExceptionMetaDataBridge;
+import org.jboss.ejb3.util.Service;
 import org.jboss.ejb3.vfs.spi.VirtualFile;
-import org.jboss.ejb3.util.Service;
-import org.jboss.injection.*;
+import org.jboss.injection.DependsHandler;
+import org.jboss.injection.EJBHandler;
+import org.jboss.injection.EJBInjectionContainer;
+import org.jboss.injection.EncInjector;
+import org.jboss.injection.ExtendedInjectionContainer;
+import org.jboss.injection.InjectionHandler;
+import org.jboss.injection.InjectionUtil;
+import org.jboss.injection.Injector;
+import org.jboss.injection.JndiInjectHandler;
+import org.jboss.injection.PersistenceContextHandler;
+import org.jboss.injection.PersistenceUnitHandler;
+import org.jboss.injection.ResourceHandler;
+import org.jboss.injection.WebServiceRefHandler;
 import org.jboss.jca.spi.ComponentStack;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.ejb.jboss.JBossAssemblyDescriptorMetaData;
@@ -83,20 +95,35 @@
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
-import javax.ejb.*;
+import javax.ejb.EJBException;
+import javax.ejb.Local;
+import javax.ejb.Remote;
+import javax.ejb.Timeout;
 import javax.ejb.Timer;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
-import javax.naming.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.LinkRef;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
 import javax.transaction.TransactionManager;
 import java.lang.annotation.Annotation;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.*;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
@@ -109,7 +136,7 @@
  * @version $Revision$
  */
 @DisableAOP
-public abstract class EJBContainer 
+public abstract class EJBContainer
    implements Container, IndirectContainer<EJBContainer, DirectContainer<EJBContainer>>, 
       EJBInjectionContainer, ExtendedInjectionContainer, JavaEEComponent
 {
@@ -122,9 +149,9 @@
    private final BeanContainer beanContainer;
    
    private DirectContainer<EJBContainer> directContainer;
-   
-   protected EjbEncFactory encFactory = new DefaultEjbEncFactory();
 
+   protected EjbEncFactory encFactory;
+
    protected Pool pool;
 
    protected String ejbName;
@@ -202,7 +229,7 @@
     * @param beanMetaData           the meta data for this bean or null
     */
 
-   public EJBContainer(String name, Domain domain, ClassLoader cl,
+   protected EJBContainer(String name, Domain domain, ClassLoader cl,
                        String beanClassName, String ejbName, Hashtable ctxProperties,
                        Ejb3Deployment deployment, JBossEnterpriseBeanMetaData beanMetaData) throws ClassNotFoundException
    {
@@ -246,16 +273,6 @@
       //annotations = new AnnotationRepositoryToMetaData(this);
 
       initialContextProperties = ctxProperties;
-      try
-      {
-         Util.createSubcontext(getEnc(), "env");
-      }
-      catch (Exception e)
-      {
-         throw new RuntimeException(e);
-      }
-      bindORB();
-      bindEJBContext();
 
       if(deployment != null)
          this.dependencyPolicy = deployment.createDependencyPolicy(this);
@@ -279,7 +296,7 @@
     * @param beanMetaData           the meta data for this bean or null
     */
 
-   public EJBContainer(String name, Domain domain, ClassLoader cl,
+   protected EJBContainer(String name, Domain domain, ClassLoader cl,
                        String beanClassName, String ejbName, Hashtable ctxProperties,
                        JBossEnterpriseBeanMetaData beanMetaData) throws ClassNotFoundException
    {
@@ -787,7 +804,31 @@
    {
       if (enc == null)
       {
-         enc = encFactory.getEnc(this);
+         if(encFactory == null)
+         {
+            // postpone the inevitable
+            //ClassLoader cl = AccessController.doPrivileged(currentContextClassLoader());
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            Class<?> interfaces[] = { Context.class };
+            InvocationHandler handler = new InvocationHandler() {
+               public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
+               {
+                  try
+                  {
+                     if(encFactory == null)
+                        throw new IllegalStateException("EJBTHREE-2056: EjbEncFactory is null, usage of java:comp is not allowed before CREATE");
+                     return method.invoke(encFactory.getEnc(EJBContainer.this), args);
+                  }
+                  catch(InvocationTargetException e)
+                  {
+                     throw e.getTargetException();
+                  }
+               }
+            };
+            enc = (Context) Proxy.newProxyInstance(cl, interfaces, handler);
+         }
+         else
+            enc = encFactory.getEnc(this);
       }
       return enc;
    }
@@ -889,6 +930,23 @@
    {
       // Blocking invocations until start()
       this.blockInvocations();
+
+      if(encFactory == null)
+      {
+         log.debug("EJBTHREE-2056: Failed to get an EjbEncFactory, will create the default.");
+         encFactory = new DefaultEjbEncFactory();
+      }
+
+      try
+      {
+         Util.createSubcontext(getEnc(), "env");
+      }
+      catch (Exception e)
+      {
+         throw new RuntimeException(e);
+      }
+      bindORB();
+      bindEJBContext();
       
       /*
       initializeClassContainer();
@@ -1575,7 +1633,12 @@
    {
       return deployment;
    }
-   
+
+   public void setEjbEncFactory(EjbEncFactory encFactory)
+   {
+      this.encFactory = encFactory;
+   }
+
    public abstract boolean hasJNDIBinding(String jndiName);
    
    /**




More information about the jboss-cvs-commits mailing list