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

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Sep 9 11:55:10 EDT 2009


Author: remy.maucherat at jboss.com
Date: 2009-09-09 11:55:10 -0400 (Wed, 09 Sep 2009)
New Revision: 93315

Modified:
   trunk/server/src/main/org/jboss/deployment/AnnotationMetaDataDeployer.java
   trunk/server/src/main/org/jboss/web/deployers/MergedJBossWebMetaDataDeployer.java
Log:
- Add metadata-complete for the fragments.
- Review the design of the fragment merging after reading the specification again.

Modified: trunk/server/src/main/org/jboss/deployment/AnnotationMetaDataDeployer.java
===================================================================
--- trunk/server/src/main/org/jboss/deployment/AnnotationMetaDataDeployer.java	2009-09-09 13:51:24 UTC (rev 93314)
+++ trunk/server/src/main/org/jboss/deployment/AnnotationMetaDataDeployer.java	2009-09-09 15:55:10 UTC (rev 93315)
@@ -45,6 +45,7 @@
 import org.jboss.metadata.ejb.spec.EjbJar3xMetaData;
 import org.jboss.metadata.ejb.spec.EjbJarMetaData;
 import org.jboss.metadata.web.spec.Web25MetaData;
+import org.jboss.metadata.web.spec.Web30MetaData;
 import org.jboss.metadata.web.spec.WebMetaData;
 import org.jboss.virtual.VFSUtils;
 import org.jboss.virtual.VirtualFile;
@@ -128,15 +129,22 @@
          isComplete = true;         
       }
       WebMetaData webMetaData = unit.getAttachment(WebMetaData.class);
-      if(webMetaData != null && webMetaData instanceof Web25MetaData)
+      if(webMetaData != null)
       {
-         isComplete |= ((Web25MetaData)webMetaData).isMetadataComplete();
+         if (webMetaData instanceof Web25MetaData)
+         {
+            isComplete |= ((Web25MetaData)webMetaData).isMetadataComplete();
+         }
+         else if (webMetaData instanceof Web30MetaData)
+         {
+            isComplete |= ((Web30MetaData)webMetaData).isMetadataComplete();
+         }
+         else
+         {
+            // Any web.xml 2.4 or earlier deployment is metadata complete
+            isComplete = true;
+         }
       }
-      else if(webMetaData != null)
-      {
-         // Any web.xml 2.4 or earlier deployment is metadata complete
-         isComplete = true;
-      }
       ApplicationClientMetaData clientMetaData = unit.getAttachment(ApplicationClientMetaData.class);
       if(clientMetaData != null)
          isComplete |= clientMetaData.isMetadataComplete();

Modified: trunk/server/src/main/org/jboss/web/deployers/MergedJBossWebMetaDataDeployer.java
===================================================================
--- trunk/server/src/main/org/jboss/web/deployers/MergedJBossWebMetaDataDeployer.java	2009-09-09 13:51:24 UTC (rev 93314)
+++ trunk/server/src/main/org/jboss/web/deployers/MergedJBossWebMetaDataDeployer.java	2009-09-09 15:55:10 UTC (rev 93315)
@@ -68,6 +68,17 @@
    public static final String WEB_ORDER_ATTACHMENT_NAME = "order."+WebMetaData.class.getName();
    public static final String WEB_OVERLAYS_ATTACHMENT_NAME = "overlays."+WebMetaData.class.getName();
 
+   private boolean metaDataCompleteIsDefault = false;
+
+   public boolean isMetaDataCompleteIsDefault()
+   {
+      return metaDataCompleteIsDefault;
+   }
+   public void setMetaDataCompleteIsDefault(boolean metaDataCompleteIsDefault)
+   {
+      this.metaDataCompleteIsDefault = metaDataCompleteIsDefault;
+   }
+
    /**
     * Create a new MergedJBossWebMetaDataDeployer.
     */
@@ -95,8 +106,25 @@
       if(specMetaData == null && metaData == null)
          return;
 
-      // FIXME: Check metadata-complete (see AnnotationMetaDataDeployer)
-      
+      // Check metadata-complete (see AnnotationMetaDataDeployer)
+      boolean isComplete = this.isMetaDataCompleteIsDefault();
+      if(specMetaData != null)
+      {
+         if (specMetaData instanceof Web25MetaData)
+         {
+            isComplete |= ((Web25MetaData)specMetaData).isMetadataComplete();
+         }
+         else if (specMetaData instanceof Web30MetaData)
+         {
+            isComplete |= ((Web30MetaData)specMetaData).isMetadataComplete();
+         }
+         else
+         {
+            // Any web.xml 2.4 or earlier deployment is metadata complete
+            isComplete = true;
+         }
+      }
+
       // Find all fragments that have been processed by deployers, and place them in a map keyed by location
       LinkedList<String> order = new LinkedList<String>();
       List<WebOrdering> orderings = new ArrayList<WebOrdering>();
@@ -130,92 +158,97 @@
             }
          }
 
-         String base = unit.getName();
-         int pos = base.indexOf(':');
-         if (pos > 0)
+         if (!isComplete)
          {
-            base = base.substring(pos);
-         }
+            
+            String base = unit.getName();
+            int pos = base.indexOf(':');
+            if (pos > 0)
+            {
+               base = base.substring(pos);
+            }
 
-         Iterator<String> attachementNames = unit.getAttachments().keySet().iterator();
-         HashSet<String> jarsWithoutFragmentsSet = (HashSet<String>) jarsSet.clone();
-         while (attachementNames.hasNext())
-         {
-            String location = attachementNames.next();
-            Object attachement = unit.getAttachment(location);
-            if (attachement != null && attachement instanceof WebFragmentMetaData)
+            Iterator<String> attachementNames = unit.getAttachments().keySet().iterator();
+            HashSet<String> jarsWithoutFragmentsSet = (HashSet<String>) jarsSet.clone();
+            while (attachementNames.hasNext())
             {
-               pos = location.indexOf(':');
-               if (pos > 0)
+               String location = attachementNames.next();
+               Object attachement = unit.getAttachment(location);
+               if (attachement != null && attachement instanceof WebFragmentMetaData)
                {
-                  location = location.substring(pos);
-               }
-               if (!location.startsWith(base))
-               {
-                  // If there is only one fragment, it will also get mapped as this attachement
-                  continue;
-               }
-               String relativeLocation = "/" + location.substring(base.length());
-               String jarName = null;
-               if (relativeLocation.startsWith("/WEB-INF/lib/"))
-               {
-                  jarName = relativeLocation.substring("/WEB-INF/lib/".length());
-               }
-               if (jarName == null)
-               {
-                  continue;
-               }
-               fragmentFound = true;
-               WebFragmentMetaData fragmentMetaData = (WebFragmentMetaData) attachement;
-               webFragments.put(jarName, fragmentMetaData);
-               WebOrdering webOrdering = new WebOrdering();
-               webOrdering.setName(fragmentMetaData.getName());
-               webOrdering.setJar(jarName);
-               jarsWithoutFragmentsSet.remove(jarName);
-               if (fragmentMetaData.getOrdering() != null)
-               {
-                  if (fragmentMetaData.getOrdering().getAfter() != null)
+                  pos = location.indexOf(':');
+                  if (pos > 0)
                   {
-                     for (OrderingElementMetaData orderingElementMetaData : 
-                        fragmentMetaData.getOrdering().getAfter().getOrdering())
+                     location = location.substring(pos);
+                  }
+                  if (!location.startsWith(base))
+                  {
+                     // If there is only one fragment, it will also get mapped as this attachement
+                     continue;
+                  }
+                  String relativeLocation = "/" + location.substring(base.length());
+                  String jarName = null;
+                  if (relativeLocation.startsWith("/WEB-INF/lib/"))
+                  {
+                     jarName = relativeLocation.substring("/WEB-INF/lib/".length());
+                  }
+                  if (jarName == null)
+                  {
+                     continue;
+                  }
+                  fragmentFound = true;
+                  WebFragmentMetaData fragmentMetaData = (WebFragmentMetaData) attachement;
+                  webFragments.put(jarName, fragmentMetaData);
+                  WebOrdering webOrdering = new WebOrdering();
+                  webOrdering.setName(fragmentMetaData.getName());
+                  webOrdering.setJar(jarName);
+                  jarsWithoutFragmentsSet.remove(jarName);
+                  if (fragmentMetaData.getOrdering() != null)
+                  {
+                     if (fragmentMetaData.getOrdering().getAfter() != null)
                      {
-                        if (orderingElementMetaData.isOthers())
+                        for (OrderingElementMetaData orderingElementMetaData : 
+                           fragmentMetaData.getOrdering().getAfter().getOrdering())
                         {
-                           webOrdering.setAfterOthers(true);
+                           if (orderingElementMetaData.isOthers())
+                           {
+                              webOrdering.setAfterOthers(true);
+                           }
+                           else
+                           {
+                              webOrdering.addAfter(orderingElementMetaData.getName());
+                           }
                         }
-                        else
-                        {
-                           webOrdering.addAfter(orderingElementMetaData.getName());
-                        }
                      }
-                  }
-                  if (fragmentMetaData.getOrdering().getBefore() != null)
-                  {
-                     for (OrderingElementMetaData orderingElementMetaData : 
-                        fragmentMetaData.getOrdering().getBefore().getOrdering())
+                     if (fragmentMetaData.getOrdering().getBefore() != null)
                      {
-                        if (orderingElementMetaData.isOthers())
+                        for (OrderingElementMetaData orderingElementMetaData : 
+                           fragmentMetaData.getOrdering().getBefore().getOrdering())
                         {
-                           webOrdering.setBeforeOthers(true);
+                           if (orderingElementMetaData.isOthers())
+                           {
+                              webOrdering.setBeforeOthers(true);
+                           }
+                           else
+                           {
+                              webOrdering.addBefore(orderingElementMetaData.getName());
+                           }
                         }
-                        else
-                        {
-                           webOrdering.addBefore(orderingElementMetaData.getName());
-                        }
                      }
                   }
+                  orderings.add(webOrdering);
                }
-               orderings.add(webOrdering);
             }
+            // If there is no fragment, still consider it for ordering as a
+            // fragment specifying no name and no order
+            for (String jarName : jarsWithoutFragmentsSet)
+            {
+               WebOrdering ordering = new WebOrdering();
+               ordering.setJar(jarName);
+               orderings.add(ordering);
+            }
+
          }
-         // If there is no fragment, still consider it for ordering as a
-         // fragment specifying no name and no order
-         for (String jarName : jarsWithoutFragmentsSet)
-         {
-            WebOrdering ordering = new WebOrdering();
-            ordering.setJar(jarName);
-            orderings.add(ordering);
-         }
       }
       
       if (!fragmentFound)
@@ -226,7 +259,7 @@
 
       // Generate web fragments parsing order
       AbsoluteOrderingMetaData absoluteOrderingMetaData = null;
-      if (specMetaData instanceof Web30MetaData)
+      if (!isComplete && specMetaData instanceof Web30MetaData)
       {
          absoluteOrderingMetaData = ((Web30MetaData) specMetaData).getAbsoluteOrdering();
       }
@@ -302,18 +335,49 @@
             }
          }
       }
-      
-      // FIXME: Find classes which extend, implement, or are annotated by HandlesTypes
-            
+      // TODO: Find classes which extend, implement, or are annotated by HandlesTypes
+
       // The fragments and corresponding annotations will need to be merged in order
-      // 1: Merge specMetaData into mergedMetaData
-      // 2: For each JAR in the order: 
-      // 2.1: Merge the fragment metadata into specMetaData, according to the Servlet 3.0 overriding rules
-      // 2.1: Merge the annotation metadata into specMetaData, according to the Servlet 3.0 overriding rules
-      // 3: Merge the Servlet annotations for all declared Servlets ?
+      // 1: For each JAR in the order: Merge the fragment metadata into specMetaData
+      // 2: For each JAR in the order: Merge the annotation metadata into specMetaData
+      // 3: Merge the Servlet annotations for all declared Servlets (FIXME: decide if we do it) (FIXME: processed in Catalina right now)
       // 4: Override with metaData (JBossWebMetaData)
-      // FIXME: Implement
 
+      // Step 1
+      // TODO: remove comments after implementing in meta data
+      WebMetaData finalSpecMetaData = null;
+      if (!isComplete)
+      {
+         finalSpecMetaData = new WebMetaData();
+         WebFragmentMetaData mergedFragmentMetaData = new WebFragmentMetaData();
+         for (String jar : order)
+         {
+            WebFragmentMetaData webFragmentMetaData = webFragments.get(jar);
+            if (webFragmentMetaData != null)
+            {
+               // Merge fragment meta data
+               try
+               {
+                  //mergedFragmentMetaData.augment(webFragmentMetaData, specMetaData);
+               }
+               catch (Exception e)
+               {
+                  DeploymentException.rethrowAsDeploymentException("Exception processing fragment for JAR: " + jar, e);
+               }
+            }
+         }
+         //finalSpecMetaData.augment(specMetaData);
+         //finalSpecMetaData.augment(mergedFragmentMetaData);
+      }
+      else
+      {
+         finalSpecMetaData = specMetaData;
+      }
+      //specMetaData = finalSpecMetaData;
+
+      // Step 2
+      // TODO: REDO (see above): merge annotation meta data corresponding to the JAR here, 
+      // according to the order (servlets, filters, listeners and init params)
       // Check for an annotated view
       String key = AnnotationMetaDataDeployer.WEB_ANNOTATED_ATTACHMENT_NAME;
       Web25MetaData annotatedMetaData = unit.getAttachment(key, Web25MetaData.class);
@@ -330,6 +394,10 @@
             specMetaData = annotatedMetaData;
       }
 
+      // Step 3
+      // TODO maybe
+      
+      // Step 4
       // Create a merged view
       JBossWebMetaData mergedMetaData = new JBossWebMetaData();
       mergedMetaData.merge(metaData, specMetaData);




More information about the jboss-cvs-commits mailing list