[jboss-cvs] JBossAS SVN: r108472 - in trunk: server/src/main/java/org/jboss/web/deployers and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Oct 7 02:05:43 EDT 2010


Author: jaikiran
Date: 2010-10-07 02:05:42 -0400 (Thu, 07 Oct 2010)
New Revision: 108472

Modified:
   trunk/server/pom.xml
   trunk/server/src/main/java/org/jboss/web/deployers/AbstractWarDeployer.java
   trunk/testsuite/src/main/org/jboss/test/web/servlets/StandaloneENCAnnotationsServlet.java
Log:
JBAS-8406 Add a dependency on annotated resource injections in a web module. Temporary workaround till we have switchboard

Modified: trunk/server/pom.xml
===================================================================
--- trunk/server/pom.xml	2010-10-06 22:03:07 UTC (rev 108471)
+++ trunk/server/pom.xml	2010-10-07 06:05:42 UTC (rev 108472)
@@ -257,6 +257,11 @@
     </dependency>
     
     <dependency>
+        <groupId>org.jboss.ejb3.ejbref.resolver</groupId>
+        <artifactId>ejbref-resolver-spi</artifactId>
+    </dependency>
+    
+    <dependency>
       <groupId>org.jboss.integration</groupId>
       <artifactId>jboss-deployment-spi</artifactId>
     </dependency>

Modified: trunk/server/src/main/java/org/jboss/web/deployers/AbstractWarDeployer.java
===================================================================
--- trunk/server/src/main/java/org/jboss/web/deployers/AbstractWarDeployer.java	2010-10-06 22:03:07 UTC (rev 108471)
+++ trunk/server/src/main/java/org/jboss/web/deployers/AbstractWarDeployer.java	2010-10-07 06:05:42 UTC (rev 108472)
@@ -35,9 +35,12 @@
 import java.util.Set;
 
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
 import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.deployers.spi.DeploymentException;
 import org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer;
 import org.jboss.deployers.spi.deployer.helpers.AttachmentLocator;
@@ -45,6 +48,8 @@
 import org.jboss.deployers.structure.spi.DeploymentUnit;
 import org.jboss.deployers.structure.spi.main.MainDeployerInternals;
 import org.jboss.deployers.vfs.spi.structure.VFSDeploymentUnit;
+import org.jboss.ejb3.ejbref.resolver.spi.EjbReference;
+import org.jboss.ejb3.ejbref.resolver.spi.EjbReferenceResolver;
 import org.jboss.jpa.resolvers.PersistenceUnitDependencyResolver;
 import org.jboss.kernel.plugins.bootstrap.basic.KernelConstants;
 import org.jboss.managed.api.ManagedObject;
@@ -58,6 +63,8 @@
 import org.jboss.metadata.ear.jboss.JBossAppMetaData;
 import org.jboss.metadata.ear.spec.ModuleMetaData;
 import org.jboss.metadata.ear.spec.WebModuleMetaData;
+import org.jboss.metadata.javaee.spec.AnnotatedEJBReferenceMetaData;
+import org.jboss.metadata.javaee.spec.AnnotatedEJBReferencesMetaData;
 import org.jboss.metadata.javaee.spec.PersistenceContextReferenceMetaData;
 import org.jboss.metadata.javaee.spec.PersistenceContextReferencesMetaData;
 import org.jboss.metadata.javaee.spec.PersistenceUnitReferenceMetaData;
@@ -72,6 +79,8 @@
 import org.jboss.system.metadata.ServiceDependencyMetaData;
 import org.jboss.system.metadata.ServiceInjectionValueMetaData;
 import org.jboss.system.metadata.ServiceMetaData;
+import org.jboss.system.metadata.ServiceMetaDataVisitor;
+import org.jboss.system.microcontainer.ServiceControllerContext;
 import org.jboss.vfs.VFS;
 import org.jboss.vfs.VFSUtils;
 import org.jboss.vfs.VirtualFile;
@@ -110,6 +119,8 @@
    public static final String WEB_APP = "org.jboss.web.AbstractWebContainer.webApp";
    public static final String WEB_MODULE = "org.jboss.web.AbstractWebContainer.webModule";
    public static final String ERROR = "org.jboss.web.AbstractWebContainer.error";
+   
+   private static final String JNDI_DEPENDENCY_PREFIX = "jndi:";
 
    /** A mapping of deployed warUrl strings to the WebApplication object */
    protected HashMap deploymentMap = new HashMap();
@@ -133,6 +144,9 @@
    private MainDeployerInternals mainDeployer;
 
    private PersistenceUnitDependencyResolver persistenceUnitDependencyResolver;
+   
+   /** EJB reference resolver */
+   private EjbReferenceResolver ejbRefResolver;
 
    /**
     * Create a new AbstractWarDeployer.
@@ -261,7 +275,14 @@
    {
       this.persistenceUnitDependencyResolver = resolver;
    }
+   
+   @Inject
+   public void setEjbReferenceResolver(EjbReferenceResolver resolver)
+   {
+      this.ejbRefResolver = resolver;
+   }
 
+
    /** Get the session attribute number under which the caller Subject is stored
     * @jmx:managed-attribute
     */
@@ -738,6 +759,32 @@
                dependencies.add(sdmd);
             }
          }
+         
+         // JBAS-8406 Add dependency on @EJB(s). This is a bit of duplicacy, since the TomcatInjectionContainer
+         // through various handler would also do the same. But since the TomcatInjectionContainer comes too late
+         // in the picture and since we already have similar duplicacy for @PersistenceContext and @PersistenceUnit (see few lines
+         // above) and more importantly, since this works, let's just have it here. 
+         if (metaData.getJndiEnvironmentRefsGroup() != null)
+         {
+            AnnotatedEJBReferencesMetaData annotatedEjbRefs = metaData.getJndiEnvironmentRefsGroup().getAnnotatedEjbReferences();
+            if (annotatedEjbRefs != null && !annotatedEjbRefs.isEmpty())
+            {
+               for (AnnotatedEJBReferenceMetaData annotatedEjbRef : annotatedEjbRefs)
+               {
+                  // Note: @EJB(beanName="") is set as "link" in AnnotatedEJBReferenceMetadata.
+                  // Hence, we use the getLink() method to get hold of the beanName during resolution.
+                  String beanName = annotatedEjbRef.getLink();
+                  EjbReference ejbReference = new EjbReference(beanName, annotatedEjbRef.getBeanInterface().getName(), annotatedEjbRef.getMappedName());
+                  String jndiName = this.ejbRefResolver.resolveEjb(unit, ejbReference);
+                  if (jndiName != null)
+                  {
+                     ServiceDependencyMetaData sdmd = this.createJNDIDependency(jndiName);
+                     dependencies.add(sdmd);
+                  }
+               }
+            }
+         }
+         
 
          webModule.setDependencies(dependencies);
 
@@ -751,7 +798,7 @@
       }
       catch (Exception e)
       {
-         throw DeploymentException.rethrowAsDeploymentException("Error creating rar deployment " + unit.getName(), e);
+         throw DeploymentException.rethrowAsDeploymentException("Error creating web module " + unit.getName(), e);
       }
    }
 
@@ -810,4 +857,52 @@
       }
       return virtualFile.toURL();
    }
+   
+   /**
+    * Creates and returns a {@link ServiceDependencyMetaData} corresponding to the 
+    * passed jndi name
+    * 
+    * @param jndiName The jndi name 
+    * @return
+    */
+   private ServiceDependencyMetaData createJNDIDependency(String jndiName)
+   {
+      String dependency = JNDI_DEPENDENCY_PREFIX + jndiName;
+      ServiceDependencyMetaData sdmd = new InstalledServiceDependencyMetaData();
+      sdmd.setIDependOn(dependency);
+      return sdmd;
+   }
+   
+   /**
+    * 
+    * Similar to {@link ServiceDependencyMetaData} except that this expects the
+    * dependency to be in {@link ControllerState#INSTALLED}, unlike {@link ServiceDependencyMetaData}
+    * which expects it to be either in {@link ControllerState#START} or {@link ControllerState#CREATE} 
+    * 
+    */
+   private class InstalledServiceDependencyMetaData extends ServiceDependencyMetaData
+   {
+      /**
+       * @see ServiceDependencyMetaData#visit(ServiceMetaDataVisitor)
+       * 
+       */
+      @Override
+      public void visit(ServiceMetaDataVisitor visitor)
+      {
+         ServiceControllerContext context = visitor.getControllerContext();
+         Object name = context.getName();
+         Object dependency = this.getIDependOn();
+         try
+         {
+            dependency = getIDependOnObjectName().getCanonicalName();
+         }
+         catch (MalformedObjectNameException ignored)
+         {
+         }
+         // add a dependency on INSTALLED state of the dependency item
+         visitor.addDependency(new AbstractDependencyItem(name, dependency, ControllerState.CREATE, ControllerState.INSTALLED));
+         visitor.addDependency(new AbstractDependencyItem(name, dependency, ControllerState.START, ControllerState.INSTALLED));
+         visitor.visit(this);
+      }
+   }
 }

Modified: trunk/testsuite/src/main/org/jboss/test/web/servlets/StandaloneENCAnnotationsServlet.java
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/web/servlets/StandaloneENCAnnotationsServlet.java	2010-10-06 22:03:07 UTC (rev 108471)
+++ trunk/testsuite/src/main/org/jboss/test/web/servlets/StandaloneENCAnnotationsServlet.java	2010-10-07 06:05:42 UTC (rev 108472)
@@ -71,7 +71,7 @@
          mappedName="jbosstest/ejbs/UnsecuredEJB")
    StatelessSessionHome sshome;
    @EJB(name="ejb/CtsBmp", beanInterface=EntityHome.class, 
-         mappedName="jbosstest/ejbs/CtsBmp")
+         mappedName="ejbcts/BMPBean")
    EntityHome entityHome;
    @EJB(name="ejb/local/bean3", beanInterface=StatelessSessionLocalHome.class, 
          mappedName="jbosstest/ejbs/local/ENCBean1")



More information about the jboss-cvs-commits mailing list