[jboss-cvs] JBossAS SVN: r72297 - trunk/server/src/main/org/jboss/deployment.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Apr 16 12:21:54 EDT 2008


Author: scott.stark at jboss.org
Date: 2008-04-16 12:21:54 -0400 (Wed, 16 Apr 2008)
New Revision: 72297

Modified:
   trunk/server/src/main/org/jboss/deployment/MappedReferenceMetaDataResolverDeployer.java
Log:
Synch the current endpoint map updates

Modified: trunk/server/src/main/org/jboss/deployment/MappedReferenceMetaDataResolverDeployer.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/MappedReferenceMetaDataResolverDeployer.java	2008-04-16 16:20:01 UTC (rev 72296)
+++ trunk/server/src/main/org/jboss/deployment/MappedReferenceMetaDataResolverDeployer.java	2008-04-16 16:21:54 UTC (rev 72297)
@@ -26,21 +26,30 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.jboss.deployers.spi.DeploymentException;
 import org.jboss.deployers.spi.deployer.DeploymentStages;
 import org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer;
 import org.jboss.deployers.structure.spi.DeploymentUnit;
+import org.jboss.deployment.dependency.ContainerDependencyMetaData;
+import org.jboss.deployment.dependency.JndiDependencyMetaData;
+import org.jboss.deployment.plugin.MappedDeploymentEndpointResolver;
+import org.jboss.deployment.spi.DeploymentEndpointResolver;
+import org.jboss.deployment.spi.EndpointInfo;
+import org.jboss.deployment.spi.EndpointType;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.client.jboss.JBossClientMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeansMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEntityBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossGenericBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.BusinessLocalsMetaData;
 import org.jboss.metadata.ejb.spec.BusinessRemotesMetaData;
+import org.jboss.metadata.javaee.spec.AnnotatedEJBReferenceMetaData;
 import org.jboss.metadata.javaee.spec.AnnotatedEJBReferencesMetaData;
 import org.jboss.metadata.javaee.spec.EJBLocalReferenceMetaData;
 import org.jboss.metadata.javaee.spec.EJBLocalReferencesMetaData;
@@ -62,6 +71,12 @@
  */
 public class MappedReferenceMetaDataResolverDeployer extends AbstractRealDeployer
 {
+   /** Key for Map<String, ContainerDependencyMetaData> attachment */
+   public static final String ENDPOINT_MAP_KEY = "MappedReferenceMetaDataResolverDeployer.endpointMap";
+   /** Key for Set<ContainerDependencyMetaData> attachment */
+   public static final String DEPENDS_SET_KEY = "MappedReferenceMetaDataResolverDeployer.dependsSet";
+   /** Key for Map<String, String> of alternate endpoint resolution to the endpointMap key */
+   public static final String ALTERNATE_MAP_KEY = "MappedReferenceMetaDataResolverDeployer.endpointAlternateMap";
    private static Logger log = Logger.getLogger(MappedReferenceMetaDataResolverDeployer.class);
    /** */
    private boolean failOnUnresolvedRefs;
@@ -74,6 +89,7 @@
       inputs.add(JBossMetaData.class.getName());
       inputs.add(JBossWebMetaData.class.getName());
       super.setInputs(inputs);
+      super.setOutput(DeploymentEndpointResolver.class);
    }
 
    /**
@@ -99,7 +115,8 @@
     * Look for ejb, web or client metadata to resolve references without
     * mapped names.
     */
-   public void internalDeploy(DeploymentUnit unit) throws DeploymentException
+   public void internalDeploy(DeploymentUnit unit)
+      throws DeploymentException
    {
       JBossMetaData ejbMetaData = unit.getAttachment(JBossMetaData.class);
       JBossWebMetaData webMetaData = unit.getAttachment(JBossWebMetaData.class);
@@ -109,20 +126,35 @@
 
       // Create a map of the reference endpoints if it does not exist in the top unit
       DeploymentUnit top = unit.getTopLevel();
-      Map<String, String> endpointMap = top.getAttachment("MappedReferenceMetaDataResolverDeployer.endpointMap", Map.class);
+      Map<String, ContainerDependencyMetaData> endpointMap = top.getAttachment(ENDPOINT_MAP_KEY, Map.class);
+      Map<String, String> endpointAlternateMap = top.getAttachment(ALTERNATE_MAP_KEY, Map.class);
       if(endpointMap == null)
       {
-         endpointMap = new ConcurrentHashMap<String, String>();
-         mapEndpoints(top, endpointMap);
-         top.addAttachment("MappedReferenceMetaDataResolverDeployer.endpointMap", endpointMap, Map.class);
+         endpointMap = new ConcurrentHashMap<String, ContainerDependencyMetaData>();
+         endpointAlternateMap = new ConcurrentHashMap<String, String>();
+         mapEndpoints(top, endpointMap, endpointAlternateMap);
+         top.addAttachment(ENDPOINT_MAP_KEY, endpointMap, Map.class);
+         top.addAttachment(ALTERNATE_MAP_KEY, endpointAlternateMap);
+         DeploymentEndpointResolver resolver = new MappedDeploymentEndpointResolver(endpointMap, endpointAlternateMap, unit.getRelativePath());
+         top.addAttachment(DeploymentEndpointResolver.class, resolver);
       }
 
+      DeploymentEndpointResolver resolver = new MappedDeploymentEndpointResolver(
+            endpointMap, endpointAlternateMap, unit.getRelativePath());
       dump(unit);
       if(ejbMetaData != null)
       {
          JBossEnterpriseBeansMetaData beans = ejbMetaData.getEnterpriseBeans();
          // Process ejb references
-         List<String> unresolvedPaths = resolve(unit, endpointMap, beans);
+         List<String> unresolvedPaths;
+         try
+         {
+            unresolvedPaths = resolve(unit, endpointMap, beans, resolver);
+         }
+         catch (Exception e)
+         {
+            throw new DeploymentException(e);
+         }
          if(unresolvedPaths != null && unresolvedPaths.size() > 0)
             log.warn("Unresolved references exist in JBossMetaData:"+unresolvedPaths);
       }
@@ -130,7 +162,7 @@
       {
          // Process web app references
          List<String> unresolvedPaths = new ArrayList<String>();
-         resolve(unit, endpointMap, webMetaData.getJndiEnvironmentRefsGroup(), unresolvedPaths);
+         //resolve(unit, endpointMap, webMetaData.getJndiEnvironmentRefsGroup(), unresolvedPaths);
          if(unresolvedPaths != null && unresolvedPaths.size() > 0)
             log.warn("Unresolved references exist in JBossWebMetaData:"+unresolvedPaths);
       }
@@ -138,10 +170,19 @@
       {
          // Process client app references
          List<String> unresolvedPaths = new ArrayList<String>();
-         resolve(unit, endpointMap, clientMetaData.getJndiEnvironmentRefsGroup(), unresolvedPaths);
+         //resolve(unit, endpointMap, clientMetaData.getJndiEnvironmentRefsGroup(), unresolvedPaths);
          if(unresolvedPaths != null && unresolvedPaths.size() > 0)
             log.warn("Unresolved references exist in JBossClientMetaData: "+unresolvedPaths);
       }
+      // Add the unique set of ContainerDependencyMetaData
+      Set<ContainerDependencyMetaData> depends = new HashSet<ContainerDependencyMetaData>();
+      for(ContainerDependencyMetaData cdmd : endpointMap.values())
+      {
+         depends.add(cdmd);
+      }
+      top.addAttachment(DEPENDS_SET_KEY, depends, Set.class);
+
+      unit.addAttachment(DeploymentEndpointResolver.class, resolver);
    }
 
    /**
@@ -150,39 +191,61 @@
     * @param unit - the deployment top level unit to start the mapping from
     * @param endpointMap - the endpoint
     */
-   protected void mapEndpoints(DeploymentUnit unit, Map<String, String> endpointMap)
+   protected void mapEndpoints(DeploymentUnit unit, Map<String, ContainerDependencyMetaData> endpointMap,
+         Map<String, String> endpointAlternateMap)
    {
       boolean trace = log.isTraceEnabled();
       // First map the ejbs
-      mapEjbs(unit, endpointMap, trace);
+      mapEjbs(unit, endpointMap, endpointAlternateMap, trace);
       // Map all sources of message-destinations
       mapMessageDestinations(unit, endpointMap, trace);
+      // Map persistence units
+      mapPersistenceUnits(unit, endpointMap, trace);
+      // Display the endpoint map for debugging
+      displayEndpoints(unit.getName(), endpointMap);
    }
-   protected void mapMessageDestinations(DeploymentUnit unit, Map<String, String> endpointMap, boolean trace)
+
+   /**
+    * @param unit
+    * @param endpointMap
+    * @param trace
+    */
+   protected void mapPersistenceUnits(DeploymentUnit unit,
+         Map<String, ContainerDependencyMetaData> endpointMap, boolean trace)
    {
+      // TODO Auto-generated method stub
       String vfsPath = unit.getRelativePath();
+      //PersistenceUnitsMetaData ejbMetaData = unit.getAttachment(PersistenceUnitsMetaData.class);
+
+   }
+
+   protected void mapMessageDestinations(DeploymentUnit unit, Map<String, ContainerDependencyMetaData> endpointMap, boolean trace)
+   {
+      String vfsPath = unit.getRelativePath();
       JBossMetaData ejbMetaData = unit.getAttachment(JBossMetaData.class);
       MessageDestinationsMetaData msgDestinations = null;
+      ClassLoader loader = unit.getClassLoader();
       if(ejbMetaData != null)
       {
          ejbMetaData.getAssemblyDescriptor().getMessageDestinations();
-         mapMessageDestinations(vfsPath, msgDestinations, endpointMap, trace);
+         mapMessageDestinations(vfsPath, msgDestinations, endpointMap, loader, trace);
       }
       JBossWebMetaData webMetaData = unit.getAttachment(JBossWebMetaData.class);
       if(webMetaData != null)
       {
          msgDestinations = webMetaData.getMessageDestinations();
-         mapMessageDestinations(vfsPath, msgDestinations, endpointMap, trace);
+         mapMessageDestinations(vfsPath, msgDestinations, endpointMap, loader, trace);
       }
       JBossClientMetaData clientMetaData = unit.getAttachment(JBossClientMetaData.class);
       if(clientMetaData != null)
       {
          msgDestinations = clientMetaData.getMessageDestinations();
-         mapMessageDestinations(vfsPath, msgDestinations, endpointMap, trace);
+         mapMessageDestinations(vfsPath, msgDestinations, endpointMap, loader, trace);
       }
    }
    protected void mapMessageDestinations(String vfsPath, MessageDestinationsMetaData msgDestinations,
-         Map<String, String> endpointMap, boolean trace)
+         Map<String, ContainerDependencyMetaData> endpointMap,
+         ClassLoader loader, boolean trace)
    {
       if(msgDestinations == null || msgDestinations.size() == 0)
          return;
@@ -196,8 +259,9 @@
             log.debug("Message-destination: "+destName+" has no mappedName");
             continue;
          }
-         String destPath = prefix + "/" + destName;
-         endpointMap.put(destPath, mappedName);
+         String destPath = prefix + "#" + destName;
+         ContainerDependencyMetaData destMD = new ContainerDependencyMetaData(mappedName, destName, vfsPath);
+         endpointMap.put(destPath, destMD);
          if(trace)
             log.trace("mapMessageDestinations: "+destPath+", mappedName: "+mappedName);
       }
@@ -211,7 +275,8 @@
     * @param unit
     * @param endpointMap
     */
-   protected void mapEjbs(DeploymentUnit unit, Map<String, String> endpointMap, boolean trace)
+   protected void mapEjbs(DeploymentUnit unit, Map<String, ContainerDependencyMetaData> endpointMap,
+         Map<String, String> endpointAlternateMap, boolean trace)
    {
       JBossMetaData ejbMetaData = unit.getAttachment(JBossMetaData.class);
       JBossEnterpriseBeansMetaData beans = null;
@@ -223,30 +288,60 @@
          String prefix = "ejb/" + vfsPath;
          for(JBossEnterpriseBeanMetaData bean : beans)
          {
-            String ejbPath = prefix + "/" + bean.getEjbName();
-            String mappedName = bean.getMappedName();
-            if(mappedName != null)
+            // The unique id for this ejb in the deployment
+            String ejbCompID = prefix + "#" + bean.getEjbName();
+            String jndiName = getJndiName(bean, bean.isMessageDriven());
+            ContainerDependencyMetaData cdmd = new ContainerDependencyMetaData(jndiName, bean.getEjbName(), vfsPath);
+            endpointMap.put(ejbCompID, cdmd);
+            // debug info for the mappings each ejb has
+            ArrayList<String> mappings = new ArrayList<String>();
+            // Alternate mappings
+            String ejbNameKey = "ejb/" + bean.getEjbName();
+            if(endpointAlternateMap.containsKey(ejbNameKey) == false)
             {
-               endpointMap.put(ejbPath, mappedName);
+               endpointAlternateMap.put(ejbNameKey, ejbCompID);
+               mappings.add(ejbNameKey);
                if(trace)
-                  log.trace("mapEjbs: "+ejbPath+", mappedName: "+mappedName);
+                  log.trace("mapEjbs, added alternate root ejb-name: "+ejbNameKey);
             }
+            else
+            {
+               log.debug("Duplicate root ejb-name: "+ejbNameKey+" from: "+ejbCompID);
+            }
             // Create mappings based on the bean business interfaces
             if(bean instanceof JBossSessionBeanMetaData)
             {
                JBossSessionBeanMetaData sbean = (JBossSessionBeanMetaData) bean;
+               cdmd.addJndiName(sbean.determineJndiName());
+               cdmd.addJndiName(sbean.determineLocalJndiName());
                String ejbName = sbean.getEjbName();
                BusinessLocalsMetaData locals = sbean.getBusinessLocals();
                if(locals != null)
                {
                   for(String local : locals)
                   {
-                     String ifacePath = prefix + "/" + local;
+                     // Add ejb/vfsPath at iface
+                     String ifacePath = prefix + "@" + local;
+                     if(endpointAlternateMap.containsKey(ifacePath))
+                        log.debug(ejbName+" duplicates business local: "+local+", existing: "+endpointAlternateMap.get(ifacePath));
+                     else
+                     {
+                        endpointAlternateMap.put(ifacePath, ejbCompID);
+                        mappings.add(ifacePath);
+                        if(trace)
+                           log.trace("mapEjbs, business-local: "+ifacePath+", ejbName: "+ejbName);
+                     }
+                     // Add ejb/iface
+                     ifacePath = "ejb@" + local;
                      if(endpointMap.containsKey(ifacePath))
-                        log.debug(ejbName+" duplicates business local: "+local+", existing: "+endpointMap.get(ifacePath));
+                     {
+                        // TODO: may need to track the duplicates to create an error
+                        log.debug(ejbName+" duplicates business-local: "+local+", existing: "+endpointMap.get(ifacePath));
+                     }
                      else
                      {
-                        endpointMap.put(ifacePath, ejbName);
+                        endpointAlternateMap.put(ifacePath, ejbCompID);
+                        mappings.add(ifacePath);
                         if(trace)
                            log.trace("mapEjbs, business-local: "+ifacePath+", ejbName: "+ejbName);
                      }
@@ -257,18 +352,37 @@
                {
                   for(String remote : remotes)
                   {
-                     String ifacePath = prefix + "/" + remote;
-                     if(endpointMap.containsKey(ifacePath))
-                        log.debug(ejbName+" duplicates business remote: "+remote+", existing: "+endpointMap.get(ifacePath));
+                     // Add ejb/vfsPath/iface
+                     String ifacePath = prefix + "@" + remote;
+                     if(endpointAlternateMap.containsKey(ifacePath))
+                        log.debug(ejbName+" duplicates business remote: "+remote+", existing: "+endpointAlternateMap.get(ifacePath));
                      else
                      {
-                        endpointMap.put(ifacePath, ejbName);
+                        endpointAlternateMap.put(ifacePath, ejbCompID);
+                        mappings.add(ifacePath);
                         if(trace)
                            log.trace("mapEjbs, business-remote: "+ifacePath+", ejbName: "+ejbName);
                      }
+                     // Add ejb/iface
+                     ifacePath = "ejb@" + remote;
+                     if(endpointAlternateMap.containsKey(ifacePath))
+                        log.debug(ejbName+" duplicates business-remote: "+remote+", existing: "+endpointAlternateMap.get(ifacePath));
+                     else
+                     {
+                        endpointAlternateMap.put(ifacePath, ejbCompID);
+                        mappings.add(ifacePath);
+                        if(trace)
+                           log.trace("mapEjbs, business-remote: "+ifacePath+", ejbName: "+ejbName);
+                     }
                   }
                }
+               if(trace)
+                  log.trace("mapEjbs: "+ejbCompID+", mappings: "+mappings);
             }
+            else if(bean instanceof JBossGenericBeanMetaData)
+            {
+               log.warn("JBossGenericBeanMetaData seen for: "+bean.getEjbName());
+            }
          }
       }
 
@@ -277,152 +391,289 @@
       if(children != null)
       {
          for(DeploymentUnit child : children)
-            mapEjbs(child, endpointMap, trace);
+            mapEjbs(child, endpointMap, endpointAlternateMap, trace);
       }
    }
 
-   protected void resolve(DeploymentUnit unit, Map<String, String> endpointMap, Environment env, List<String> unresolvedRefs)
+   /**
+    * 
+    * @param unit
+    * @param endpointMap
+    * @param referenceeKey
+    * @param env
+    * @param unresolvedRefs
+    */
+   protected void resolve(ContainerDependencyMetaData cdmd, DeploymentUnit unit,
+         Map<String, ContainerDependencyMetaData> endpointMap,
+         Environment env,
+         DeploymentEndpointResolver resolver,
+         List<String> unresolvedRefs)
+      throws Exception
    {
       if(env == null)
          return;
 
       AnnotatedEJBReferencesMetaData annotatedRefs = env.getAnnotatedEjbReferences();
+      resolveEjbAnnotatedRefs(cdmd, unit, endpointMap, annotatedRefs, resolver, unresolvedRefs);
       EJBLocalReferencesMetaData localRefs = env.getEjbLocalReferences();
-      resolveEjbLocalRefs(unit, endpointMap, localRefs, unresolvedRefs);
+      resolveEjbLocalRefs(cdmd, unit, endpointMap, localRefs, resolver, unresolvedRefs);
       EJBReferencesMetaData ejbRefs = env.getEjbReferences();
-      resolveEjbRefs(unit, endpointMap, ejbRefs, unresolvedRefs);
+      resolveEjbRefs(cdmd, unit, endpointMap, ejbRefs, resolver, unresolvedRefs);
       MessageDestinationReferencesMetaData msgRefs = env.getMessageDestinationReferences();
-      resolveMsgRefs(unit, endpointMap, msgRefs, unresolvedRefs);
+      resolveMsgRefs(cdmd, unit, endpointMap, msgRefs, resolver, unresolvedRefs);
       // TODO, other references
    }
-   protected List<String> resolve(DeploymentUnit unit, Map<String, String> endpointMap,
-         JBossEnterpriseBeansMetaData beans)
+   protected List<String> resolve(DeploymentUnit unit, Map<String, ContainerDependencyMetaData> endpointMap,
+         JBossEnterpriseBeansMetaData beans,
+         DeploymentEndpointResolver resolver)
+      throws Exception
    {
       ArrayList<String> unresolvedRefs = new ArrayList<String>();
       if(beans == null || beans.size() == 0)
          return unresolvedRefs;
 
+      String vfsPath = unit.getRelativePath();
       for(JBossEnterpriseBeanMetaData bean : beans)
       {
-         EJBLocalReferencesMetaData localRefs = bean.getEjbLocalReferences();
-         resolveEjbLocalRefs(unit, endpointMap, localRefs, unresolvedRefs);
-         EJBReferencesMetaData ejbRefs = bean.getEjbReferences();
-         resolveEjbRefs(unit, endpointMap, ejbRefs, unresolvedRefs);
+         // Find the container dependency metadata
+         String ejbCompID = "ejb/" + vfsPath + "#" + bean.getEjbName();
+         ContainerDependencyMetaData cdmd = endpointMap.get(ejbCompID);
+         if(cdmd == null)
+            throw new IllegalStateException("Failed to find ContainerDependencyMetaData for: "+ejbCompID);
          Environment env = bean.getJndiEnvironmentRefsGroup();
-         resolve(unit, endpointMap, env, unresolvedRefs);
+         resolve(cdmd, unit, endpointMap, env, resolver,  unresolvedRefs);
       }
       return unresolvedRefs;
    }
 
+   protected void resolveEjbAnnotatedRefs(ContainerDependencyMetaData cdmd, DeploymentUnit unit,
+      Map<String, ContainerDependencyMetaData> endpointMap,
+      AnnotatedEJBReferencesMetaData annotatedRefs,
+      DeploymentEndpointResolver resolver,
+      List<String> unresolvedRefs)
+   {
+      if(annotatedRefs == null)
+         return;
+
+      String vfsContext = unit.getRelativePath();
+      for(AnnotatedEJBReferenceMetaData ref : annotatedRefs)
+      {
+         Class iface = ref.getBeanInterface();
+         String link = ref.getLink();
+         EndpointInfo info = null;
+         if(link != null)
+            info = resolver.getEndpointInfo(link, EndpointType.EJB, vfsContext);
+         if(info == null && iface != null)
+            info = resolver.getEndpointInfo(iface, EndpointType.EJB, vfsContext);
+
+         if(info != null)
+         {
+            ContainerDependencyMetaData target = endpointMap.get(info.getComponentKey());
+            if(target != null)
+            {
+               cdmd.addDependency(target);
+               String containerJndiName = target.getContainerName();
+               if(containerJndiName != null)
+                  ref.setResolvedJndiName(containerJndiName);
+            }
+            else
+            {
+               unresolvedRefs.add(cdmd.getComponentID()+":"+ref);
+            }
+         }
+         else
+         {
+            unresolvedRefs.add(cdmd.getComponentID()+":"+ref);
+         }
+      }
+   }
+
    /**
     *
     * @param unit
     * @param localRefs
     * @param unresolvedRefs
     */
-   protected void resolveEjbLocalRefs(DeploymentUnit unit, Map<String, String> endpointMap,
-         EJBLocalReferencesMetaData localRefs, List<String> unresolvedRefs)
+   protected void resolveEjbLocalRefs(ContainerDependencyMetaData cdmd, DeploymentUnit unit,
+         Map<String, ContainerDependencyMetaData> endpointMap,
+         EJBLocalReferencesMetaData localRefs,
+         DeploymentEndpointResolver resolver,
+         List<String> unresolvedRefs)
+      throws Exception
    {
       if(localRefs == null)
          return;
-      String vfsPath = unit.getRelativePath();
-      String prefix = "ejb/" + vfsPath;
-      ArrayList<String> searched = new ArrayList<String>();
+
+      String vfsContext = unit.getRelativePath();
+      ClassLoader loader = unit.getClassLoader();
       for(EJBLocalReferenceMetaData ref : localRefs)
       {
+         if (ref.getIgnoreDependency() != null)
+         {
+            log.debug("IGNORING <ejb-ref> DEPENDENCY: " + ref);
+            return;
+         }
+
          String link = ref.getLink();
-         //String target = findLocalEjbLink(unit, link, searched);
-         // First look
-         String ejbPath = prefix + "/" + ref.getEjbRefName();
-         String target = endpointMap.get(ejbPath);
-         if(target == null)
-            unresolvedRefs.add(ref.getEjbRefName()+"/ejb-local-ref/"+link+" available: " + searched);
+         String mappedName = ref.getMappedName();
+         // Use mapped name first
+         if(mappedName == null || mappedName.length() == 0)
+         {
+            ContainerDependencyMetaData target = null;
+            if(link != null)
+            {
+               EndpointInfo info = resolver.getEndpointInfo(link, EndpointType.EJB, vfsContext);
+               if(info != null)
+               {
+                  target = endpointMap.get(info.getComponentKey());
+               }
+            }
+            if(target == null && ref.getLocal() != null)
+            {
+               // Try the local interface type
+               target = resolveEjbInterface(ref.getLocal(), unit,
+                     endpointMap, resolver);
+            }
+            if(target == null)
+               unresolvedRefs.add(cdmd.getComponentID()+":"+ref);
+            else
+            {
+               cdmd.addDependency(target);
+               String containerJndiName = target.getContainerName();
+               if(containerJndiName != null)
+                  ref.setResolvedJndiName(containerJndiName);
+            }
+         }
          else
          {
-            ref.setResolvedJndiName(target);
+            // Create a JNDI dependency
+            ref.setResolvedJndiName(mappedName);
+            JndiDependencyMetaData jdmd = new JndiDependencyMetaData(mappedName, loader);
+            cdmd.addJndiDependency(jdmd);
          }
       }
+
    }
-   protected void resolveEjbRefs(DeploymentUnit unit, Map<String, String> endpointMap,
-         EJBReferencesMetaData ejbRefs, List<String> unresolvedRefs)
+
+   protected void resolveEjbRefs(ContainerDependencyMetaData cdmd, DeploymentUnit unit,
+         Map<String, ContainerDependencyMetaData> endpointMap,
+         EJBReferencesMetaData ejbRefs,
+         DeploymentEndpointResolver resolver,
+         List<String> unresolvedRefs)
+      throws Exception
    {
       if(ejbRefs == null)
          return;
-      ArrayList<String> searched = new ArrayList<String>();
+
+      String vfsContext = unit.getRelativePath();
+      ClassLoader loader = unit.getClassLoader();
       for(EJBReferenceMetaData ref : ejbRefs)
       {
+         if (ref.getIgnoreDependency() != null)
+         {
+            log.debug("IGNORING <ejb-ref> DEPENDENCY: " + ref);
+            return;
+         }
+
+         String link = ref.getLink();
          String mappedName = ref.getMappedName();
+         // Use mapped name first
          if(mappedName == null || mappedName.length() == 0)
          {
-            String link = ref.getLink();
-            String target = null;
+            ContainerDependencyMetaData target = null;
             if(link != null)
-               target = findEjbLink(unit, link, searched);
+            {
+               EndpointInfo info = resolver.getEndpointInfo(link, EndpointType.EJB, vfsContext);
+               if(info != null)
+               {
+                  target = endpointMap.get(info.getComponentKey());
+               }
+            }
+            if(target == null && ref.getRemote() != null)
+            {
+               // Try the local interface type
+               target = resolveEjbInterface(ref.getRemote(), unit,
+                     endpointMap, resolver);
+            }
             if(target == null)
-               unresolvedRefs.add(ref.getEjbRefName()+"/ejb-ref/"+link+ " available: " + searched);
+               unresolvedRefs.add(cdmd.getComponentID()+":"+ref);
             else
-               mappedName = target;
+            {
+               cdmd.addDependency(target);
+               String containerJndiName = target.getContainerName();
+               if(containerJndiName != null)
+                  ref.setResolvedJndiName(containerJndiName);
+            }
          }
-         ref.setResolvedJndiName(mappedName);
+         else
+         {
+            // Create a JNDI dependency
+            ref.setResolvedJndiName(mappedName);
+            JndiDependencyMetaData jdmd = new JndiDependencyMetaData(mappedName, loader);
+            cdmd.addJndiDependency(jdmd);
+         }
       }
    }
-   protected void resolveMsgRefs(DeploymentUnit unit, Map<String, String> endpointMap,
-         MessageDestinationReferencesMetaData msgRefs, List<String> unresolvedRefs)
+   protected void resolveMsgRefs(ContainerDependencyMetaData cdmd, DeploymentUnit unit,
+         Map<String, ContainerDependencyMetaData> endpointMap,
+         MessageDestinationReferencesMetaData msgRefs,
+         DeploymentEndpointResolver resolver,
+         List<String> unresolvedRefs)
    {
       if(msgRefs == null)
          return;
-      ArrayList<MessageDestinationMetaData> searched = new ArrayList<MessageDestinationMetaData>();
+
+      ClassLoader loader = unit.getClassLoader();
+      String vfsContext = unit.getRelativePath();
       for(MessageDestinationReferenceMetaData ref : msgRefs)
       {
          String mappedName = ref.getMappedName();
          if(mappedName == null || mappedName.length() == 0)
          {
             String link = ref.getLink();
-            MessageDestinationMetaData target = null;
+            ContainerDependencyMetaData target = null;
             if(link != null)
-               target = findMessageDestination(unit, link, searched);
+            {
+               EndpointInfo info = resolver.getEndpointInfo(link, EndpointType.MessageDestination, vfsContext);
+               if(info != null)
+               {
+                  target = endpointMap.get(info.getComponentKey());
+               }
+            }
             if(target == null)
-               unresolvedRefs.add(ref.getMessageDestinationRefName()+"/message-destination-ref/"+link + " available: " + searched);
+               unresolvedRefs.add(cdmd.getComponentID()+":"+ref);
             else
-               mappedName = target.getMappedName();
+            {
+               cdmd.addDependency(target);
+               String containerJndiName = target.getContainerName();
+               if(containerJndiName != null)
+                  ref.setResolvedJndiName(containerJndiName);
+            }
          }
-         ref.setResolvedJndiName(mappedName);
+         else
+         {
+            // Create a JNDI dependency
+            ref.setResolvedJndiName(mappedName);
+            JndiDependencyMetaData jdmd = new JndiDependencyMetaData(mappedName, loader);
+            cdmd.addJndiDependency(jdmd);
+         }
       }
    }
 
-   /**
-    * Resolves an &lt;ejb-link&gt; target for an &lt;ejb-ref&gt; entry and
-    * returns the name of the target in the JNDI tree.
-    *
-    * @param unit DeploymentUnit
-    * @param link Content of the &lt;ejb-link&gt; entry.
-    * @param searched the list of ejbs searched
-    *
-    * @return The JNDI Entry of the target bean; <code>null</code> if
-    *         no appropriate target could be found.
-    */
-   public static String findEjbLink(DeploymentUnit unit, String link, ArrayList<String> searched)
+   protected ContainerDependencyMetaData resolveEjbInterface(String iface,
+         DeploymentUnit unit, Map<String, ContainerDependencyMetaData> endpointMap,
+         DeploymentEndpointResolver resolver)
+      throws Exception
    {
-      return resolveLink(unit, link, searched, false);
+      ClassLoader loader = unit.getClassLoader();
+      Class ifaceClass = loader.loadClass(iface);
+      String vfsContext = unit.getRelativePath();
+      EndpointInfo info = resolver.getEndpointInfo(ifaceClass, EndpointType.EJB, vfsContext);
+      ContainerDependencyMetaData cdmd = endpointMap.get(info.getComponentKey());
+      return null;
    }
 
    /**
-    * Resolves an &lt;ejb-link&gt; target for an &lt;ejb-local-ref&gt; entry
-    * and returns the name of the target in the JNDI tree.
-    *
-    * @param unit DeploymentUnit
-    * @param link Content of the &lt;ejb-link&gt; entry.
-    * @param searched the searched ejbs
-    *
-    * @return The JNDI Entry of the target bean; <code>null</code> if
-    *         no appropriate target could be found.
-    */
-   public static String findLocalEjbLink(DeploymentUnit unit, String link, ArrayList<String> searched)
-   {
-      return resolveLink(unit, link, searched, true);
-   }
-
-   /**
     * Resolves a &lt;message-destination&gt; target for a &lt;message-destination-link&gt;
     * entry and returns the name of the target in the JNDI tree.
     *
@@ -438,137 +689,7 @@
       return resolveMessageDestination(di, link, searched);
    }
 
-   private static String resolveLink(DeploymentUnit di, String link, ArrayList<String> searched, boolean isLocal)
-   {
-      if (link == null)
-      {
-         return null;
-      }
 
-      if (log.isTraceEnabled())
-      {
-         log.trace("resolveLink( {" + di + "}, {" + link + "}, {" + isLocal + "}");
-      }
-
-      if (di == null)
-      {
-         // We should throw an IllegalArgumentException here probably?
-         return null;
-      }
-
-      if (link.indexOf('#') != -1)
-      {
-         // <ejb-link> is specified in the form path/file.jar#Bean
-         return resolveRelativeLink(di, link, searched, isLocal);
-      }
-      else
-      {
-         // <ejb-link> contains a Bean Name, scan the DeploymentUnit tree
-         DeploymentUnit top = di.getTopLevel();
-         return resolveAbsoluteLink(top, link, searched, isLocal);
-      }
-   }
-
-   private static String resolveRelativeLink(DeploymentUnit unit, String link, ArrayList<String> searched, boolean isLocal)
-   {
-      DeploymentUnit top = unit.getTopLevel();
-      String path = link.substring(0, link.indexOf('#'));
-      String ejbName = link.substring(link.indexOf('#') + 1);
-
-
-      if (log.isTraceEnabled())
-      {
-         log.trace("Resolving relative link: " + link);
-      }
-      DeploymentUnit targetUnit = findLinkPath(top, path);
-      if (targetUnit == null)
-      {
-         log.warn("Can't locate DeploymentUnit for target: " + path);
-         return null;
-      }
-
-      String linkTarget = null;
-      if (targetUnit.getAttachment(JBossMetaData.class) != null)
-      {
-         JBossMetaData appMD = targetUnit.getAttachment(JBossMetaData.class);
-         JBossEnterpriseBeanMetaData beanMD = appMD.getEnterpriseBean(ejbName);
-
-         if (beanMD != null)
-         {
-            linkTarget = getJndiName(beanMD, isLocal);
-            if (linkTarget == null)
-            {
-               if (isLocal)
-                  log.warn("Unable to determine local jndi name for "+ beanMD.getEjbName());
-               else
-                  log.warn("Unable to determine jndi name for " +beanMD.getEjbName());
-               searched.add(beanMD.getEjbName());
-            }
-         }
-         else
-         {
-            log.warn("No Bean named '" + ejbName + "' found in '" + path + "'!");
-            for (JBossEnterpriseBeanMetaData md : appMD.getEnterpriseBeans())
-               searched.add(md.getEjbName());
-         }
-      }
-      else
-      {
-         log.warn("DeploymentUnit " + targetUnit + " is not an EJB.jar " + "file!");
-         searched.add(targetUnit.getName());
-      }
-
-      return linkTarget;
-   }
-
-   private static String resolveAbsoluteLink(DeploymentUnit unit, String link, ArrayList<String> searched, boolean isLocal)
-   {
-      if (log.isTraceEnabled())
-      {
-         log.trace("Resolving absolute link, di: " + unit);
-      }
-
-      String ejbName = null;
-
-      // Search all ejb DeploymentUnits
-      List<JBossMetaData> ejbMetaData = getAllAttachments(unit, JBossMetaData.class);
-      for(JBossMetaData ejbMD : ejbMetaData)
-      {
-         JBossEnterpriseBeanMetaData beanMD = ejbMD.getEnterpriseBean(link);
-         if (beanMD != null)
-         {
-            ejbName = getJndiName(beanMD, isLocal);
-            if (ejbName == null)
-            {
-               if (isLocal)
-                  log.warn("Unable to determine local jndi name for "+ beanMD.getEjbName());
-               else
-                  log.warn("Unable to determine jndi name for " + beanMD.getEjbName());
-               searched.add(beanMD.getEjbName());
-            }
-            if (log.isTraceEnabled())
-            {
-               log.trace("Found Bean: " + beanMD + ", resolves to: " + ejbName);
-            }
-
-            return ejbName;
-         }
-         else if (log.isTraceEnabled())
-         {
-            // Dump the ejb module ejbNames
-            log.trace("No match for ejb-link: " + link + ", module names:");
-            for(JBossEnterpriseBeanMetaData md : ejbMD.getEnterpriseBeans())
-            {
-               String beanEjbName = getJndiName(md, isLocal);
-               searched.add(md.getEjbName());
-               log.trace("... ejbName: " + beanEjbName);
-            }
-         }
-      }
-
-      return ejbName;
-   }
-
    private static <T> List<T> getAllAttachments(DeploymentUnit unit, Class<T> type)
    {
       ArrayList<T> attachments = new ArrayList<T>();
@@ -611,9 +732,7 @@
          else if( beanMD.isSession())
          {
             JBossSessionBeanMetaData md = (JBossSessionBeanMetaData) beanMD;
-            jndiName = md.getHomeJndiName();
-            if(jndiName == null)
-               jndiName = md.determineJndiName();
+            jndiName = md.determineJndiName();
          }
       }
       return jndiName;
@@ -823,4 +942,15 @@
             dump(child, tmp, depth+1);
       }
    }
+   private void displayEndpoints(String unitName, Map<String, ContainerDependencyMetaData> endpointMap)
+   {
+      StringBuilder tmp = new StringBuilder(unitName+" endpoint mappings:\n");
+      for(Map.Entry<String, ContainerDependencyMetaData> entry : endpointMap.entrySet())
+      {
+         tmp.append("  + "+entry.getKey()+" -> "+entry.getValue());
+         tmp.append('\n');
+      }
+      log.info(tmp.toString());
+   }
+
 }




More information about the jboss-cvs-commits mailing list