You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2010/04/06 07:14:12 UTC

svn commit: r931020 [1/6] - in /geronimo/server/trunk: framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/ plugins/j2ee/geronimo-web-2.5-bu...

Author: xuhaihong
Date: Tue Apr  6 05:14:09 2010
New Revision: 931020

URL: http://svn.apache.org/viewvc?rev=931020&view=rev
Log:
GERONIMO-5037 Support Servlet 3.0 annotation and fragment web file

Added:
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java   (with props)
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeHelper.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeItem.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/annotation/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/annotation/AnnotationMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/annotation/WebFilterAnnotationMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/annotation/WebListenerAnnotationMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/annotation/WebServletAnnotationMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ContextParamMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/DataSourceMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/DistributableMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/EjbLocalRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/EjbRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/EnvEntryMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ErrorPageMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/FilterInitParamMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/FilterMappingDispatcherMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/FilterMappingMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/FilterMappingServletNameMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/FilterMappingUrlPatternMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/FilterMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/JspConfigMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ListenerMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/LocaleEncodingMappingListMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/LoginConfigMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/MessageDestinationMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/MessageDestinationRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/MimeMappingMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/PersistenceContextRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/PersistenceUnitRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/PostConstructMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/PreDestroyMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ResourceEnvRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ResourceRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/SecurityConstraintMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/SecurityRoleMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ServiceRefMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ServletInitParamMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ServletLoadOnStartupMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ServletMappingMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ServletMappingUrlPatternMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/ServletMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/SessionConfigMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/SubMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/WebFragmentEntry.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/WebFragmentMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/webfragment/WelcomeFileListMergeHandler.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/utils/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/utils/WebDeploymentMessageUtils.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/utils/WebDeploymentValidationUtils.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/java/org/apache/geronimo/web25/deployment/WebFragmentTest.java   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/javaee_6schema/web-fragment-1.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/absolute/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/absolute/web-withothers.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/absolute/web-withoutothers.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/absolute/webfragmentA.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/absolute/webfragmentB.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/absolute/webfragmentC.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/absolute/webfragmentD.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusA/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusA/web.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusA/webfragmentA.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusA/webfragmentB.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusA/webfragmentC.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusA/webfragmentD.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusB/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusB/web.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusB/webfragmentA.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusB/webfragmentB.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusB/webfragmentC.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusB/webfragmentD.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusC/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusC/web.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusC/webfragmentA.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusC/webfragmentB.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusC/webfragmentC.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/circus/circusC/webfragmentD.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/relative/
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/relative/web.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/relative/webfragmentA.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/relative/webfragmentB.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/relative/webfragmentC.xml   (with props)
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/resources/webfragments/relative/webfragmentD.xml   (with props)
Modified:
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployer.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleAnnotationFinder.java
    geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleResourceFinder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/pom.xml
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/AbstractWebModuleBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/java/org/apache/geronimo/web25/deployment/SchemaConversionTest.java
    geronimo/server/trunk/plugins/jetty8/geronimo-jetty8-builder/src/main/java/org/apache/geronimo/jetty8/deployment/JettyModuleBuilder.java
    geronimo/server/trunk/plugins/tomcat/geronimo-tomcat7-builder/src/main/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java

Modified: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployer.java?rev=931020&r1=931019&r2=931020&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployer.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployer.java Tue Apr  6 05:14:09 2010
@@ -26,9 +26,10 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
-import java.util.Hashtable;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.jar.Attributes;
@@ -56,7 +57,6 @@ import org.apache.geronimo.kernel.osgi.B
 import org.apache.geronimo.kernel.repository.Artifact;
 import org.apache.geronimo.kernel.repository.ArtifactResolver;
 import org.apache.geronimo.kernel.util.FileUtils;
-import org.apache.geronimo.kernel.util.IOUtils;
 import org.apache.geronimo.kernel.util.JarUtils;
 import org.apache.geronimo.system.configuration.ExecutableConfigurationUtil;
 import org.apache.geronimo.system.main.CommandLineManifest;
@@ -180,17 +180,17 @@ public class Deployer implements GBeanLi
             return null;
         }
         // Generate the URL based on the remote deployment configuration
-        Hashtable hash = new Hashtable();
+        Map<String, String> hash = new HashMap<String, String>();
         hash.put("J2EEApplication", token.getObjectName().getKeyProperty("J2EEApplication"));
         hash.put("j2eeType", "WebModule");
         try {
             hash.put("name", Configuration.getConfigurationID(config).toString());
-            Set names = kernel.listGBeans(new AbstractNameQuery(null, hash));
+            Set<AbstractName> names = kernel.listGBeans(new AbstractNameQuery(null, hash));
             if (names.size() != 1) {
                 log.error("Unable to look up remote deploy upload URL");
                 return null;
             }
-            AbstractName module = (AbstractName) names.iterator().next();
+            AbstractName module = names.iterator().next();
             String contextPath = (String) kernel.getAttribute(module, "contextPath");
             if (null == contextPath) {
                 throw new IllegalStateException("Cannot find contextPath attribute for [" + module + "]");

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleAnnotationFinder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleAnnotationFinder.java?rev=931020&r1=931019&r2=931020&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleAnnotationFinder.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleAnnotationFinder.java Tue Apr  6 05:14:09 2010
@@ -38,8 +38,12 @@ public class BundleAnnotationFinder exte
     private final Bundle bundle;
 
     public BundleAnnotationFinder(PackageAdmin packageAdmin, Bundle bundle) throws Exception {
+        this(packageAdmin, bundle, BundleResourceFinder.FULL_DISCOVERY_FILTER);
+    }
+
+    public BundleAnnotationFinder(PackageAdmin packageAdmin, Bundle bundle, DiscoveryFilter discoveryFilter) throws Exception {
         this.bundle = bundle;
-        BundleResourceFinder bundleResourceFinder = new BundleResourceFinder(packageAdmin, bundle, "", ".class");
+        BundleResourceFinder bundleResourceFinder = new BundleResourceFinder(packageAdmin, bundle, "", ".class", discoveryFilter);
         bundleResourceFinder.find(new AnnotationFindingCallback());
     }
 

Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleResourceFinder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleResourceFinder.java?rev=931020&r1=931019&r2=931020&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleResourceFinder.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/BundleResourceFinder.java Tue Apr  6 05:14:09 2010
@@ -35,30 +35,38 @@ import org.osgi.framework.Bundle;
 import org.osgi.service.packageadmin.PackageAdmin;
 
 /**
- * Finds all available resources to a bundle by scanning Bundle-ClassPath header 
+ * Finds all available resources to a bundle by scanning Bundle-ClassPath header
  * of the given bundle and its fragments.
  * DynamicImport-Package header is not considered during scanning.
- * 
+ *
  * @version $Rev$ $Date$
  */
 public class BundleResourceFinder {
-   
+
+    public static final DiscoveryFilter FULL_DISCOVERY_FILTER = new DummyDiscoveryFilter();
     private final Bundle bundle;
     private final PackageAdmin packageAdmin;
     private final String prefix;
     private final String suffix;
-    
+    private DiscoveryFilter discoveryFilter;
+
     public BundleResourceFinder(PackageAdmin packageAdmin, Bundle bundle, String prefix, String suffix) {
+        this(packageAdmin, bundle, prefix, suffix, FULL_DISCOVERY_FILTER);
+    }
+
+    public BundleResourceFinder(PackageAdmin packageAdmin, Bundle bundle, String prefix, String suffix, DiscoveryFilter discoveryFilter) {
         this.packageAdmin = packageAdmin;
         this.bundle = bundle;
         this.prefix = prefix.trim();
         this.suffix = suffix.trim();
+        this.discoveryFilter = discoveryFilter;
     }
-    
-    public void find(ResourceFinderCallback callback) throws Exception {
-        scanBundleClassPath(callback, bundle);
 
-        if (packageAdmin != null) {
+    public void find(ResourceFinderCallback callback) throws Exception {
+        if (discoveryFilter.rangeDiscoveryRequired(DiscoveryRange.BUNDLE_CLASSPATH)) {
+            scanBundleClassPath(callback, bundle);
+        }
+        if (packageAdmin != null && discoveryFilter.rangeDiscoveryRequired(DiscoveryRange.FRAGMENT_BUNDLES)) {
             Bundle[] fragments = packageAdmin.getFragments(bundle);
             if (fragments != null) {
                 for (Bundle fragment : fragments) {
@@ -67,7 +75,7 @@ public class BundleResourceFinder {
             }
         }
     }
-    
+
     public Set<URL> find() {
         Set<URL> resources = new LinkedHashSet<URL>();
         try {
@@ -78,7 +86,7 @@ public class BundleResourceFinder {
         }
         return resources;
     }
-    
+
     private void scanBundleClassPath(ResourceFinderCallback callback, Bundle bundle) throws Exception {
         BundleDescription desc = new BundleDescription(bundle.getHeaders());
         List<HeaderEntry> paths = desc.getBundleClassPath();
@@ -100,8 +108,11 @@ public class BundleResourceFinder {
             }
         }
     }
-    
+
     private void scanDirectory(ResourceFinderCallback callback, Bundle bundle, String basePath) throws Exception {
+        if (!discoveryFilter.directoryDiscoveryRequired(basePath)) {
+            return;
+        }
         Enumeration e = bundle.findEntries(basePath, "*" + suffix, true);
         if (e != null) {
             while (e.hasMoreElements()) {
@@ -109,8 +120,11 @@ public class BundleResourceFinder {
             }
         }
     }
-    
-    private void scanZip(ResourceFinderCallback callback, Bundle bundle, String zipName) throws Exception {   
+
+    private void scanZip(ResourceFinderCallback callback, Bundle bundle, String zipName) throws Exception {
+        if (!discoveryFilter.zipFileDiscoveryRequired(zipName)) {
+            return;
+        }
         URL zipEntry = bundle.getEntry(zipName);
         if (zipEntry == null) {
             return;
@@ -128,7 +142,7 @@ public class BundleResourceFinder {
             e.printStackTrace();
         }
     }
-    
+
     private static class ZipEntryInputStream extends FilterInputStream {
         public ZipEntryInputStream(ZipInputStream in) {
             super(in);
@@ -138,7 +152,7 @@ public class BundleResourceFinder {
             // ((ZipInputStream) in).closeEntry();
         }
     }
-    
+
     private boolean prefixMatches(String name) {
         if (prefix.length() == 0 || prefix.equals(".") || prefix.equals("/")) {
             return true;
@@ -148,40 +162,40 @@ public class BundleResourceFinder {
             return name.startsWith(prefix);
         }
     }
-    
+
     private boolean suffixMatches(String name) {
         return (suffix.length() == 0) ? true : name.endsWith(suffix);
     }
-               
+
     private static String addSlash(String name) {
         if (!name.endsWith("/")) {
             name = name + "/";
         }
         return name;
     }
-    
+
     public interface ResourceFinderCallback {
         void foundInDirectory(Bundle bundle, String baseDir, URL url) throws Exception;
-        
+
         void foundInJar(Bundle bundle, String jarName, ZipEntry entry, InputStream in) throws Exception;
     }
-    
+
     public static class DefaultResourceFinderCallback implements ResourceFinderCallback {
 
         private Set<URL> resources;
-        
+
         public DefaultResourceFinderCallback() {
             this(new LinkedHashSet<URL>());
         }
-        
-        public DefaultResourceFinderCallback(Set<URL> resources) {  
+
+        public DefaultResourceFinderCallback(Set<URL> resources) {
             this.resources = resources;
         }
-        
+
         public Set<URL> getResources() {
             return resources;
         }
-        
+
         public void foundInDirectory(Bundle bundle, String baseDir, URL url) throws Exception {
             resources.add(url);
         }
@@ -191,6 +205,25 @@ public class BundleResourceFinder {
             URL url = new URL("jar:" + jarURL.toString() + "!/" + entry.getName());
             resources.add(url);
         }
-        
+
+    }
+
+    public static class DummyDiscoveryFilter implements DiscoveryFilter {
+
+        @Override
+        public boolean directoryDiscoveryRequired(String url) {
+            return true;
+        }
+
+        @Override
+        public boolean rangeDiscoveryRequired(DiscoveryRange discoveryRange) {
+            return true;
+        }
+
+        @Override
+        public boolean zipFileDiscoveryRequired(String url) {
+            return true;
+        }
+
     }
 }

Added: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java?rev=931020&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java Tue Apr  6 05:14:09 2010
@@ -0,0 +1,30 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.kernel.osgi;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface DiscoveryFilter {
+
+    public boolean rangeDiscoveryRequired(DiscoveryRange discoveryRange);
+
+    public boolean zipFileDiscoveryRequired(String url);
+
+    public boolean directoryDiscoveryRequired(String url);
+}

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryFilter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java?rev=931020&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java Tue Apr  6 05:14:09 2010
@@ -0,0 +1,25 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.kernel.osgi;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public enum DiscoveryRange {
+    REQUIRED_BUNDLES, IMPORT_PACKAGES, BUNDLE_CLASSPATH, FRAGMENT_BUNDLES
+}

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/osgi/DiscoveryRange.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/pom.xml?rev=931020&r1=931019&r2=931020&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/pom.xml (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/pom.xml Tue Apr  6 05:14:09 2010
@@ -84,7 +84,11 @@
                             org.apache.geronimo.web25.deployment,
                             org.apache.geronimo.web25.deployment.security,
                             org.apache.geronimo.xbeans.geronimo.web,
-                            org.apache.geronimo.xbeans.geronimo.web.impl
+                            org.apache.geronimo.xbeans.geronimo.web.impl,
+                            org.apache.geronimo.web25.deployment.merge,
+                            org.apache.geronimo.web25.deployment.merge.annotation,
+                            org.apache.geronimo.web25.deployment.merge.webfragment,
+                            org.apache.geronimo.web25.deployment.utils
                         </Export-Package>
                         <_exportcontents>schemaorg_apache_xmlbeans*</_exportcontents>
                         <DynamicImport-Package>schemaorg_apache_xmlbeans.*</DynamicImport-Package>

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/AbstractWebModuleBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/AbstractWebModuleBuilder.java?rev=931020&r1=931019&r2=931020&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/AbstractWebModuleBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/AbstractWebModuleBuilder.java Tue Apr  6 05:14:09 2010
@@ -17,6 +17,33 @@
 
 package org.apache.geronimo.web25.deployment;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+import javax.security.auth.message.module.ServerAuthModule;
+import javax.xml.bind.JAXBException;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
 import org.apache.geronimo.common.DeploymentException;
 import org.apache.geronimo.components.jaspi.model.AuthModuleType;
 import org.apache.geronimo.components.jaspi.model.ConfigProviderType;
@@ -63,20 +90,18 @@ import org.apache.geronimo.security.jasp
 import org.apache.geronimo.security.jaspi.ServerAuthConfigGBean;
 import org.apache.geronimo.security.jaspi.ServerAuthContextGBean;
 import org.apache.geronimo.security.jaspi.ServerAuthModuleGBean;
+import org.apache.geronimo.web25.deployment.merge.MergeHelper;
 import org.apache.geronimo.web25.deployment.security.AuthenticationWrapper;
 import org.apache.geronimo.web25.deployment.security.SpecSecurityBuilder;
 import org.apache.geronimo.xbeans.geronimo.j2ee.GerSecurityDocument;
-import org.apache.geronimo.xbeans.javaee6.FilterMappingType;
 import org.apache.geronimo.xbeans.javaee6.FilterType;
 import org.apache.geronimo.xbeans.javaee6.FullyQualifiedClassType;
 import org.apache.geronimo.xbeans.javaee6.ListenerType;
-import org.apache.geronimo.xbeans.javaee6.SecurityConstraintType;
 import org.apache.geronimo.xbeans.javaee6.ServletMappingType;
 import org.apache.geronimo.xbeans.javaee6.ServletType;
 import org.apache.geronimo.xbeans.javaee6.UrlPatternType;
 import org.apache.geronimo.xbeans.javaee6.WebAppDocument;
 import org.apache.geronimo.xbeans.javaee6.WebAppType;
-import org.apache.geronimo.xbeans.javaee6.WebResourceCollectionType;
 import org.apache.xbean.finder.ClassFinder;
 import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlDocumentProperties;
@@ -88,63 +113,54 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
-import javax.security.auth.message.module.ServerAuthModule;
-import javax.xml.bind.JAXBException;
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.stream.Location;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
 /**
  * @version $Rev$ $Date$
  */
 public abstract class AbstractWebModuleBuilder implements ModuleBuilder {
+
     //are we combining all web apps into one bundle in an ear?
     //TODO eliminate this
     protected static final boolean COMBINED_BUNDLE = true;
 
     public final static NamingBuilder.Key<GBeanData> DEFAULT_JSP_SERVLET_KEY = new NamingBuilder.Key<GBeanData>() {
+
         public GBeanData get(Map context) {
             return (GBeanData) context.get(this);
         }
-
     };
+
     private static final Logger log = LoggerFactory.getLogger(AbstractWebModuleBuilder.class);
 
     private static final QName TAGLIB = new QName(SchemaConversionUtils.JAVAEE_NAMESPACE, "taglib");
 
     private static final String LINE_SEP = System.getProperty("line.separator");
 
+    public static final String WEB_MODULE_HAS_SECURITY_REALM = "WEB_MODULE_HAS_SECURITY_REALM";
+
+    public static final String EXCLUDED_JAR_URLS = "EXCLUDED_JAR_URLS";
+
+    public static final String EXCLUDED_ANNOTATION_SCAN_JAR_URLS = "EXCLUDED_ANNOTATION_SCAN_JAR_URLS";
+
     protected static final AbstractNameQuery MANAGED_CONNECTION_FACTORY_PATTERN;
+
     private static final AbstractNameQuery ADMIN_OBJECT_PATTERN;
+
     protected static final AbstractNameQuery STATELESS_SESSION_BEAN_PATTERN;
+
     protected static final AbstractNameQuery STATEFUL_SESSION_BEAN_PATTERN;
+
     protected static final AbstractNameQuery ENTITY_BEAN_PATTERN;
+
     protected final Kernel kernel;
+
     protected final NamespaceDrivenBuilderCollection serviceBuilders;
+
     protected final ResourceEnvironmentSetter resourceEnvironmentSetter;
+
     protected final Collection<WebServiceBuilder> webServiceBuilder;
 
     protected final NamingBuilder namingBuilders;
+
     protected final Collection<ModuleBuilderExtension> moduleBuilderExtensions;
 
     private static final QName SECURITY_QNAME = GerSecurityDocument.type.getDocumentElementName();
@@ -156,7 +172,8 @@ public abstract class AbstractWebModuleB
      */
     private static final URI RELATIVE_MODULE_BASE_URI = URI.create("../");
 
-    protected AbstractWebModuleBuilder(Kernel kernel, Collection<NamespaceDrivenBuilder> serviceBuilders, NamingBuilder namingBuilders, ResourceEnvironmentSetter resourceEnvironmentSetter, Collection<WebServiceBuilder> webServiceBuilder, Collection<ModuleBuilderExtension> moduleBuilderExtensions) {
+    protected AbstractWebModuleBuilder(Kernel kernel, Collection<NamespaceDrivenBuilder> serviceBuilders, NamingBuilder namingBuilders, ResourceEnvironmentSetter resourceEnvironmentSetter,
+            Collection<WebServiceBuilder> webServiceBuilder, Collection<ModuleBuilderExtension> moduleBuilderExtensions) {
         this.kernel = kernel;
         this.serviceBuilders = new NamespaceDrivenBuilderCollection(serviceBuilders);
         this.namingBuilders = namingBuilders;
@@ -171,7 +188,6 @@ public abstract class AbstractWebModuleB
         STATELESS_SESSION_BEAN_PATTERN = new AbstractNameQuery(null, Collections.singletonMap(NameFactory.J2EE_TYPE, NameFactory.STATELESS_SESSION_BEAN));
         STATEFUL_SESSION_BEAN_PATTERN = new AbstractNameQuery(null, Collections.singletonMap(NameFactory.J2EE_TYPE, NameFactory.STATEFUL_SESSION_BEAN));
         ENTITY_BEAN_PATTERN = new AbstractNameQuery(null, Collections.singletonMap(NameFactory.J2EE_TYPE, NameFactory.ENTITY_BEAN));
-
     }
 
     public NamingBuilder getNamingBuilders() {
@@ -198,11 +214,13 @@ public abstract class AbstractWebModuleB
         return createModule(plan, moduleFile, ".", null, null, null, null, naming, idBuilder);
     }
 
-    public Module createModule(Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment environment, Object moduleContextInfo, AbstractName earName, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
+    public Module createModule(Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment environment, Object moduleContextInfo, AbstractName earName, Naming naming,
+            ModuleIDBuilder idBuilder) throws DeploymentException {
         return createModule(plan, moduleFile, targetPath, specDDUrl, environment, (String) moduleContextInfo, earName, naming, idBuilder);
     }
 
-    protected abstract Module createModule(Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment earEnvironment, String contextRoot, AbstractName earName, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException;
+    protected abstract Module createModule(Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment earEnvironment, String contextRoot, AbstractName earName, Naming naming,
+            ModuleIDBuilder idBuilder) throws DeploymentException;
 
     /**
      * Some servlets will have multiple url patterns.  However, webservice servlets
@@ -223,7 +241,6 @@ public abstract class AbstractWebModuleB
         for (ServletMappingType servletMapping : servletMappings) {
             String servletName = servletMapping.getServletName().getStringValue().trim();
             UrlPatternType[] urlPatterns = servletMapping.getUrlPatternArray();
-
             for (int i = 0; urlPatterns != null && (i < urlPatterns.length); i++) {
                 map.put(servletName, contextRoot + urlPatterns[i].getStringValue().trim());
             }
@@ -232,37 +249,32 @@ public abstract class AbstractWebModuleB
     }
 
     protected String determineDefaultContextRoot(WebAppType webApp, boolean isStandAlone, JarFile moduleFile, String targetPath) {
-
         if (webApp != null && webApp.getId() != null) {
             return webApp.getId();
         }
-
         if (isStandAlone) {
             // default configId is based on the moduleFile name
             return "/" + trimPath(new File(moduleFile.getName()).getName());
         }
-
         // default configId is based on the module uri from the application.xml
         return trimPath(targetPath);
     }
 
     private String trimPath(String path) {
-
         if (path == null) {
             return null;
         }
-
         if (path.endsWith(".war")) {
             path = path.substring(0, path.length() - 4);
         }
         if (path.endsWith("/")) {
             path = path.substring(0, path.length() - 1);
         }
-
         return path;
     }
 
-    public void installModule(JarFile earFile, EARContext earContext, Module module, Collection configurationStores, ConfigurationStore targetConfigurationStore, Collection repositories) throws DeploymentException {
+    public void installModule(JarFile earFile, EARContext earContext, Module module, Collection configurationStores, ConfigurationStore targetConfigurationStore, Collection repositories)
+            throws DeploymentException {
         EARContext moduleContext;
         //TODO GERONIMO-4972 find a way to create working nested bundles.
         if (true || module.isStandAlone()) {
@@ -275,19 +287,13 @@ public abstract class AbstractWebModuleB
             environment.addDependency(earConfigId, ImportType.ALL);
             File configurationDir = new File(earContext.getBaseDir(), module.getTargetPath());
             configurationDir.mkdirs();
-
             // construct the web app deployment context... this is the same class used by the ear context
             try {
                 File inPlaceConfigurationDir = null;
                 if (null != earContext.getInPlaceConfigurationDir()) {
                     inPlaceConfigurationDir = new File(earContext.getInPlaceConfigurationDir(), module.getTargetPath());
                 }
-                moduleContext = new EARContext(configurationDir,
-                        inPlaceConfigurationDir,
-                        environment,
-                        ConfigurationModuleType.WAR,
-                        module.getModuleName(),
-                        earContext);
+                moduleContext = new EARContext(configurationDir, inPlaceConfigurationDir, environment, ConfigurationModuleType.WAR, module.getModuleName(), earContext);
             } catch (DeploymentException e) {
                 cleanupConfigurationDir(configurationDir);
                 throw e;
@@ -295,7 +301,6 @@ public abstract class AbstractWebModuleB
         }
         module.setEarContext(moduleContext);
         module.setRootEarContext(earContext);
-
         try {
             ClassPathList manifestcp = new ClassPathList();
             // add the warfile's content to the configuration
@@ -315,27 +320,23 @@ public abstract class AbstractWebModuleB
                     moduleContext.addFile(targetPath, warFile, entry);
                 }
             }
-
             // always add WEB-INF/classes to the classpath regardless of whether
             // any classes exist.  This must be searched BEFORE the WEB-INF/lib jar files,
             // per the servlet specifications.
             moduleContext.addToClassPath(module.resolve("WEB-INF/classes/").getPath());
             manifestcp.add("WEB-INF/classes/");
-
             // install the libs
             for (ZipEntry entry : libs) {
                 URI targetPath = module.resolve(entry.getName());
                 moduleContext.addInclude(targetPath, warFile, entry);
                 manifestcp.add(entry.getName());
             }
-
             // add the manifest classpath entries declared in the war to the class loader
             // we have to explicitly add these since we are unpacking the web module
             // and the url class loader will not pick up a manifest from an unpacked dir
             //GERONIMO-4972 this can't be correct for one-bundle deployments.
             moduleContext.addManifestClassPath(warFile, RELATIVE_MODULE_BASE_URI);
             moduleContext.getGeneralData().put(ClassPathList.class, manifestcp);
-
         } catch (IOException e) {
             throw new DeploymentException("Problem deploying war", e);
         } finally {
@@ -352,7 +353,18 @@ public abstract class AbstractWebModuleB
         }
     }
 
-    protected void basicInitContext(EARContext earContext, Module module, XmlObject gerWebApp, boolean hasSecurityRealmName) throws DeploymentException {
+    protected abstract void preInitContext(EARContext earContext, Module module, Bundle bundle) throws DeploymentException;
+
+    protected abstract void postInitContext(EARContext earContext, Module module, Bundle bundle) throws DeploymentException;
+
+    @Override
+    public void initContext(EARContext earContext, Module module, Bundle bundle) throws DeploymentException {
+        preInitContext(earContext, module, bundle);
+        basicInitContext(earContext, module, bundle, (XmlObject) module.getVendorDD());
+        postInitContext(earContext, module, bundle);
+    }
+
+    protected void basicInitContext(EARContext earContext, Module module, Bundle bundle, XmlObject gerWebApp) throws DeploymentException {
         WebModule webModule = (WebModule) module;
         //complete manifest classpath
         EARContext moduleContext = webModule.getEarContext();
@@ -361,11 +373,13 @@ public abstract class AbstractWebModuleB
         URI baseUri = URI.create(webModule.getTargetPath());
         URI resolutionUri = invertURI(baseUri);
         earContext.getCompleteManifestClassPath(webModule.getDeployable(), baseUri, resolutionUri, manifestcp, moduleLocations);
-
+        //Security Configuration Validation
         WebAppType webApp = (WebAppType) webModule.getSpecDD();
+        boolean hasSecurityRealmName = (Boolean) module.getEarContext().getGeneralData().get(WEB_MODULE_HAS_SECURITY_REALM);
         if ((webApp.getSecurityConstraintArray().length > 0 || webApp.getSecurityRoleArray().length > 0)) {
             if (!hasSecurityRealmName) {
-                throw new DeploymentException("web.xml for web app " + webModule.getName() + " includes security elements but Geronimo deployment plan is not provided or does not contain <security-realm-name> element necessary to configure security accordingly.");
+                throw new DeploymentException("web.xml for web app " + webModule.getName()
+                        + " includes security elements but Geronimo deployment plan is not provided or does not contain <security-realm-name> element necessary to configure security accordingly.");
             }
         }
         if (hasSecurityRealmName) {
@@ -376,12 +390,18 @@ public abstract class AbstractWebModuleB
         if (securityElements.length > 0 && !hasSecurityRealmName) {
             throw new DeploymentException("You have supplied a security configuration for web app " + webModule.getName() + " but no security-realm-name to allow login");
         }
+
+        //Process Naming
         getNamingBuilders().buildEnvironment(webApp, webModule.getVendorDD(), webModule.getEnvironment());
-        //this is silly
         getNamingBuilders().initContext(webApp, gerWebApp, webModule);
 
-        Map servletNameToPathMap = buildServletNameToPathMap((WebAppType) webModule.getSpecDD(), webModule.getContextRoot());
+      //Process web fragments and annotations
+        if (!webApp.getMetadataComplete()) {
+            MergeHelper.processWebFragmentsAndAnnotations(earContext, webModule, bundle, webApp);
+        }
 
+        //Process Web Service
+        Map servletNameToPathMap = buildServletNameToPathMap((WebAppType) webModule.getSpecDD(), webModule.getContextRoot());
         Map sharedContext = webModule.getSharedContext();
         for (Object aWebServiceBuilder : webServiceBuilder) {
             WebServiceBuilder serviceBuilder = (WebServiceBuilder) aWebServiceBuilder;
@@ -403,6 +423,8 @@ public abstract class AbstractWebModuleB
         XmlOptions options = new XmlOptions();
         QName webQName = new QName("http://java.sun.com/xml/ns/javaee", "web-app");
         options.setSaveSyntheticDocumentElement(webQName);
+        options.setSavePrettyPrint();
+        options.setSavePrettyPrintIndent(4);
         try {
             module.getSpecDD().save(writer, options);
         } catch (IOException e) {
@@ -429,13 +451,11 @@ public abstract class AbstractWebModuleB
             XmlDocumentProperties xmlDocumentProperties = cursor.documentProperties();
             String publicId = xmlDocumentProperties.getDoctypePublicId();
             boolean is22 = "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN".equals(publicId);
-            if ("-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN".equals(publicId) ||
-                    is22) {
+            if ("-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN".equals(publicId) || is22) {
                 XmlCursor moveable = xmlObject.newCursor();
                 try {
                     moveable.toStartDoc();
                     moveable.toFirstChild();
-
                     SchemaConversionUtils.convertToSchema(cursor, SchemaConversionUtils.JAVAEE_NAMESPACE, schemaLocationURL, version);
                     cursor.toStartDoc();
                     cursor.toChild(SchemaConversionUtils.JAVAEE_NAMESPACE, "web-app");
@@ -500,7 +520,8 @@ public abstract class AbstractWebModuleB
         return builder.buildSpecSecurityConfig(webApp);
     }
 
-    protected void configureLocalJaspicProvider(AuthenticationWrapper authType, String contextPath, Module module, GBeanData securityFactoryData) throws DeploymentException, GBeanAlreadyExistsException {
+    protected void configureLocalJaspicProvider(AuthenticationWrapper authType, String contextPath, Module module, GBeanData securityFactoryData) throws DeploymentException,
+            GBeanAlreadyExistsException {
         EARContext moduleContext = module.getEarContext();
         GBeanData authConfigProviderData = null;
         AbstractName providerName = moduleContext.getNaming().createChildName(module.getModuleName(), "authConfigProvider", GBeanInfoBuilder.DEFAULT_J2EE_TYPE);
@@ -575,72 +596,17 @@ public abstract class AbstractWebModuleB
         }
     }
 
-    protected static void check(WebAppType webApp) throws DeploymentException {
-        checkURLPattern(webApp);
-        checkMultiplicities(webApp);
-    }
-
-    private static void checkURLPattern(WebAppType webApp) throws DeploymentException {
-
-        FilterMappingType[] filterMappings = webApp.getFilterMappingArray();
-        for (FilterMappingType filterMapping : filterMappings) {
-            UrlPatternType[] urlPatterns = filterMapping.getUrlPatternArray();
-            for (int j = 0; (urlPatterns != null) && (j < urlPatterns.length); j++) {
-                checkString(urlPatterns[j].getStringValue().trim());
-            }
-        }
-
-        ServletMappingType[] servletMappings = webApp.getServletMappingArray();
-        for (ServletMappingType servletMapping : servletMappings) {
-            UrlPatternType[] urlPatterns = servletMapping.getUrlPatternArray();
-            for (int j = 0; (urlPatterns != null) && (j < urlPatterns.length); j++) {
-                checkString(urlPatterns[j].getStringValue().trim());
-            }
-        }
-
-        SecurityConstraintType[] constraints = webApp.getSecurityConstraintArray();
-        for (SecurityConstraintType constraint : constraints) {
-            WebResourceCollectionType[] collections = constraint.getWebResourceCollectionArray();
-            for (WebResourceCollectionType collection : collections) {
-                UrlPatternType[] patterns = collection.getUrlPatternArray();
-                for (UrlPatternType pattern : patterns) {
-                    checkString(pattern.getStringValue().trim());
-                }
-            }
-        }
-    }
-
-    protected static void checkString(String pattern) throws DeploymentException {
-        //j2ee_1_4.xsd explicitly requires preserving all whitespace. Do not trim.
-        if (pattern.indexOf(0x0D) >= 0) throw new DeploymentException("<url-pattern> must not contain CR(#xD)");
-        if (pattern.indexOf(0x0A) >= 0) throw new DeploymentException("<url-pattern> must not contain LF(#xA)");
-    }
-
-    private static void checkMultiplicities(WebAppType webApp) throws DeploymentException {
-        if (webApp.getSessionConfigArray().length > 1)
-            throw new DeploymentException("Multiple <session-config> elements found");
-        if (webApp.getJspConfigArray().length > 1)
-            throw new DeploymentException("Multiple <jsp-config> elements found");
-        if (webApp.getLoginConfigArray().length > 1)
-            throw new DeploymentException("Multiple <login-config> elements found");
-    }
-
     private boolean cleanupConfigurationDir(File configurationDir) {
         LinkedList<String> cannotBeDeletedList = new LinkedList<String>();
-
         if (!FileUtils.recursiveDelete(configurationDir, cannotBeDeletedList)) {
             // Output a message to help user track down file problem
-            log.warn("Unable to delete " + cannotBeDeletedList.size() +
-                    " files while recursively deleting directory "
-                    + configurationDir.getAbsolutePath() + LINE_SEP +
-                    "The first file that could not be deleted was:" + LINE_SEP + "  " +
-                    (!cannotBeDeletedList.isEmpty() ? cannotBeDeletedList.getFirst() : ""));
+            log.warn("Unable to delete " + cannotBeDeletedList.size() + " files while recursively deleting directory " + configurationDir.getAbsolutePath() + LINE_SEP
+                    + "The first file that could not be deleted was:" + LINE_SEP + "  " + (!cannotBeDeletedList.isEmpty() ? cannotBeDeletedList.getFirst() : ""));
             return false;
         }
         return true;
     }
 
-
     protected ClassFinder createWebAppClassFinder(WebAppType webApp, WebModule webModule) throws DeploymentException {
         // Get the classloader from the module's EARContext
         Bundle bundle = webModule.getEarContext().getDeploymentBundle();
@@ -652,12 +618,11 @@ public abstract class AbstractWebModuleB
         // Find the list of classes from the web.xml we want to search for annotations in
         //------------------------------------------------------------------------------------
         List<Class> classes = new ArrayList<Class>();
-
         // Get all the servlets from the deployment descriptor
         ServletType[] servlets = webApp.getServletArray();
         for (ServletType servlet : servlets) {
             FullyQualifiedClassType cls = servlet.getServletClass();
-            if (cls != null) {                              // Don't try this for JSPs
+            if (cls != null) { // Don't try this for JSPs
                 Class<?> clas;
                 try {
                     clas = bundle.loadClass(cls.getStringValue());
@@ -667,7 +632,6 @@ public abstract class AbstractWebModuleB
                 addClass(classes, clas);
             }
         }
-
         // Get all the listeners from the deployment descriptor
         ListenerType[] listeners = webApp.getListenerArray();
         for (ListenerType listener : listeners) {
@@ -680,7 +644,6 @@ public abstract class AbstractWebModuleB
             }
             addClass(classes, clas);
         }
-
         // Get all the filters from the deployment descriptor
         FilterType[] filters = webApp.getFilterArray();
         for (FilterType filter : filters) {
@@ -693,7 +656,6 @@ public abstract class AbstractWebModuleB
             }
             addClass(classes, clas);
         }
-
         // see https://issues.apache.org/jira/browse/GERONIMO-3421 .
         // if the user has botched her classloader config (perhaps by
         // not including a jar that her app needs) then ClassFinder
@@ -714,14 +676,13 @@ public abstract class AbstractWebModuleB
         }
     }
 
-    protected void configureBasicWebModuleAttributes(WebAppType webApp, XmlObject vendorPlan, EARContext moduleContext, EARContext earContext, WebModule webModule, GBeanData webModuleData) throws DeploymentException {
+    protected void configureBasicWebModuleAttributes(WebAppType webApp, XmlObject vendorPlan, EARContext moduleContext, EARContext earContext, WebModule webModule, GBeanData webModuleData)
+            throws DeploymentException {
         Map<NamingBuilder.Key, Object> buildingContext = new HashMap<NamingBuilder.Key, Object>();
         buildingContext.put(NamingBuilder.GBEAN_NAME_KEY, moduleContext.getModuleName());
-
         //get partial jndi context from earContext.
         Map<JndiKey, Map<String, Object>> jndiContext = new HashMap<JndiKey, Map<String, Object>>(NamingBuilder.JNDI_KEY.get(earContext.getGeneralData()));
         buildingContext.put(NamingBuilder.JNDI_KEY, jndiContext);
-
         if (!webApp.getMetadataComplete()) {
             // Create a classfinder and populate it for the naming builder(s). The absence of a
             // classFinder in the module will convey whether metadata-complete is set (or not)
@@ -732,7 +693,6 @@ public abstract class AbstractWebModuleB
         //nope, persistence units can be in the war.
         //This means that you cannot use the default environment of the web builder to add configs that will be searched.
         getNamingBuilders().buildNaming(webApp, vendorPlan, webModule, buildingContext);
-
         //Combine contexts.  Note this may not work right for jaxws which has a comp/env/WebServiceContext binding
         Map<String, Object> compContext = new HashMap<String, Object>();
         if (jndiContext.get(JndiScope.comp) != null) {
@@ -744,7 +704,7 @@ public abstract class AbstractWebModuleB
         AbstractName contextSourceName = moduleContext.getNaming().createChildName(webModuleData.getAbstractName(), "ContextSource", "ContextSource");
         GBeanData contextSourceData = new GBeanData(contextSourceName, WebContextSource.class);
         contextSourceData.setAttribute("componentContext", compContext);
-        contextSourceData.setReferencePattern("ApplicationJndi", (AbstractName)earContext.getGeneralData().get(EARContext.APPLICATION_JNDI_NAME_KEY));
+        contextSourceData.setReferencePattern("ApplicationJndi", (AbstractName) earContext.getGeneralData().get(EARContext.APPLICATION_JNDI_NAME_KEY));
         contextSourceData.setReferencePattern("TransactionManager", moduleContext.getTransactionManagerName());
         try {
             moduleContext.addGBean(contextSourceData);
@@ -752,9 +712,7 @@ public abstract class AbstractWebModuleB
             throw new DeploymentException("ContextSource for this webapp already present:" + webModuleData.getAbstractName(), e);
         }
         webModuleData.setReferencePattern("ContextSource", contextSourceName);
-
         Holder holder = NamingBuilder.INJECTION_KEY.get(buildingContext);
-
         webModule.getSharedContext().put(WebModule.WEB_APP_DATA, webModuleData);
         webModule.getSharedContext().put(NamingBuilder.JNDI_KEY, jndiContext);
         webModule.getSharedContext().put(NamingBuilder.INJECTION_KEY, holder);
@@ -764,22 +722,20 @@ public abstract class AbstractWebModuleB
         if (!webModule.isStandAlone()) {
             webModuleData.setReferencePattern("J2EEApplication", earContext.getModuleName());
         }
-
         webModuleData.setAttribute("holder", holder);
-
         //Add dependencies on managed connection factories and ejbs in this app
         //This is overkill, but allows for people not using java:comp context (even though we don't support it)
         //and sidesteps the problem of circular references between ejbs.
         if (earContext != moduleContext) {
             addGBeanDependencies(earContext, webModuleData);
         }
-
         webModuleData.setReferencePattern("TransactionManager", moduleContext.getTransactionManagerName());
         webModuleData.setReferencePattern("TrackedConnectionAssociator", moduleContext.getConnectionTrackerName());
-        webModuleData.setAttribute("modulePath", webModule.isStandAlone() || webModule.getEarContext() != webModule.getRootEarContext()? null: webModule.getTargetPath());
+        webModuleData.setAttribute("modulePath", webModule.isStandAlone() || webModule.getEarContext() != webModule.getRootEarContext() ? null : webModule.getTargetPath());
     }
 
     private static class InternWrapper implements XMLStreamReader {
+
         private final XMLStreamReader delegate;
 
         private InternWrapper(XMLStreamReader delegate) {
@@ -966,5 +922,4 @@ public abstract class AbstractWebModuleB
             return delegate.standaloneSet();
         }
     }
-
 }

Added: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java?rev=931020&view=auto
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java (added)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java Tue Apr  6 05:14:09 2010
@@ -0,0 +1,25 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.web25.deployment.merge;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public enum ElementSource {
+    ANNOTATION, WEB_FRAGMENT, WEB_XML
+}

Propchange: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/ElementSource.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java?rev=931020&view=auto
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java (added)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java Tue Apr  6 05:14:09 2010
@@ -0,0 +1,88 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.web25.deployment.merge;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.geronimo.j2ee.deployment.EARContext;
+import org.apache.geronimo.web25.deployment.merge.webfragment.WebFragmentEntry;
+import org.apache.geronimo.xbeans.javaee6.WebFragmentType;
+import org.osgi.framework.Bundle;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class MergeContext {
+
+    private Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();
+
+    private Bundle bundle;
+
+    private EARContext earContext;
+
+    private WebFragmentEntry webFragmentEntry;
+
+    public Object getAttribute(String attributeName) {
+        return attributes.get(attributeName);
+    }
+
+    public Bundle getBundle() {
+        return bundle;
+    }
+
+    public WebFragmentType getCurrentWebFragment() {
+        return webFragmentEntry.getWebFragment();
+    }
+
+    public String getCurrentJarUrl() {
+        return webFragmentEntry.getJarURL();
+    }
+
+    public EARContext getEarContext() {
+        return earContext;
+    }
+
+    public void setAttribute(String attributeName, Object value) {
+        attributes.put(attributeName, value);
+    }
+
+    public void setBundle(Bundle bundle) {
+        this.bundle = bundle;
+    }
+
+    public void setEarContext(EARContext earContext) {
+        this.earContext = earContext;
+    }
+
+    public void setWebFragmentEntry(WebFragmentEntry webFragmentEntry) {
+        this.webFragmentEntry = webFragmentEntry;
+    }
+
+    public boolean containsAttribute(String name) {
+        return attributes.containsKey(name);
+    }
+
+    public void removeAttribute(String name) {
+        attributes.remove(name);
+    }
+
+    public void clearup() {
+        attributes.clear();
+    }
+}

Propchange: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/merge/MergeContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain