bug 372116: Introduce property for skipping given bundles during scanning web application bundle dependencies.
diff --git a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanner.java b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanner.java
index 41450b4..ff19042 100644
--- a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanner.java
+++ b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanner.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2010 VMware Inc.
+ * Copyright (c) 2009, 2012 VMware Inc.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -22,6 +22,8 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
 import javax.servlet.ServletContext;
@@ -32,6 +34,7 @@
 import org.eclipse.gemini.web.tomcat.internal.support.BundleDependencyDeterminer;
 import org.eclipse.gemini.web.tomcat.internal.support.BundleFileResolver;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,6 +51,12 @@
  */
 final class BundleDependenciesJarScanner implements JarScanner {
 
+    private static final String COMMA_SEPARATOR = ",";
+
+    static final String SCANNER_SKIP_BUNDLES_PROPERTY_NAME = "org.eclipse.gemini.web.tomcat.scanner.skip.bundles";
+
+    private static final String SCANNER_SKIP_BUNDLES_PROPERTY_VALUE_DEFAULT = "org.eclipse.osgi,javax.servlet,javax.servlet.jsp,javax.el";
+
     private static final String JAR_URL_SUFFIX = "!/";
 
     private static final String JAR_URL_PREFIX = "jar:";
@@ -60,9 +69,13 @@
 
     private final BundleFileResolver bundleFileResolver;
 
-    public BundleDependenciesJarScanner(BundleDependencyDeterminer bundleDependencyDeterminer, BundleFileResolver bundleFileResolver) {
+    private final Set<String> skipBundles;
+
+    public BundleDependenciesJarScanner(BundleDependencyDeterminer bundleDependencyDeterminer, BundleFileResolver bundleFileResolver,
+        BundleContext bundleContext) {
         this.bundleDependencyDeterminer = bundleDependencyDeterminer;
         this.bundleFileResolver = bundleFileResolver;
+        this.skipBundles = Collections.unmodifiableSet(getBundlesToSkip(bundleContext));
     }
 
     @Override
@@ -77,7 +90,9 @@
         Set<Bundle> dependencies = this.bundleDependencyDeterminer.getDependencies(rootBundle);
 
         for (Bundle bundle : dependencies) {
-            scanBundle(bundle, callback);
+            if (!this.skipBundles.contains(bundle.getSymbolicName())) {
+                scanBundle(bundle, callback);
+            }
         }
     }
 
@@ -138,4 +153,20 @@
             LOGGER.warn("Failure when attempting to scan bundle via jar URL '" + url + "'.", e);
         }
     }
+
+    private Set<String> getBundlesToSkip(BundleContext bundleContext) {
+        Set<String> result = new HashSet<String>();
+        String property = bundleContext.getProperty(SCANNER_SKIP_BUNDLES_PROPERTY_NAME);
+
+        if (property == null) {
+            property = SCANNER_SKIP_BUNDLES_PROPERTY_VALUE_DEFAULT;
+        }
+
+        String[] bundlesNames = property.split(COMMA_SEPARATOR);
+        for (int i = 0; bundlesNames != null && i < bundlesNames.length; i++) {
+            result.add(bundlesNames[i]);
+        }
+
+        return result;
+    }
 }
diff --git a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/OsgiAwareEmbeddedTomcat.java b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/OsgiAwareEmbeddedTomcat.java
index 3efc098..987001f 100644
--- a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/OsgiAwareEmbeddedTomcat.java
+++ b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/OsgiAwareEmbeddedTomcat.java
@@ -118,7 +118,7 @@
     OsgiAwareEmbeddedTomcat(BundleContext context) {
         this.bundleContext = context;
         this.bundleDependenciesJarScanner = new BundleDependenciesJarScanner(new PackageAdminBundleDependencyDeterminer(),
-            BundleFileResolverFactory.createBundleFileResolver());
+            BundleFileResolverFactory.createBundleFileResolver(), context);
         this.defaultJarScanner = new StandardJarScanner();
         this.jarScannerCustomizer = new DelegatingJarScannerCustomizer(context);
     }
diff --git a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScannerTests.java b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScannerTests.java
index 4afe92b..5b9aa4e 100644
--- a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScannerTests.java
+++ b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScannerTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2010 VMware Inc.
+ * Copyright (c) 2009, 2012 VMware Inc.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -36,6 +36,7 @@
 import org.eclipse.gemini.web.tomcat.internal.support.BundleDependencyDeterminer;
 import org.eclipse.gemini.web.tomcat.internal.support.BundleFileResolver;
 import org.eclipse.gemini.web.tomcat.spi.ClassLoaderCustomizer;
+import org.eclipse.virgo.teststubs.osgi.framework.StubBundleContext;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
 
@@ -47,7 +48,10 @@
 
     private final BundleFileResolver bundleFileResolver = createMock(BundleFileResolver.class);
 
-    private final BundleDependenciesJarScanner scanner = new BundleDependenciesJarScanner(this.dependencyDeterminer, this.bundleFileResolver);
+    private final StubBundleContext bundleContext = new StubBundleContext();
+
+    private final BundleDependenciesJarScanner scanner = new BundleDependenciesJarScanner(this.dependencyDeterminer, this.bundleFileResolver,
+        this.bundleContext);
 
     private final Bundle bundle = createMock(Bundle.class);
 
@@ -113,6 +117,7 @@
         expect(this.dependencyDeterminer.getDependencies(this.bundle)).andReturn(new HashSet<Bundle>(Arrays.asList(this.dependency))).times(2);
         expect(this.dependency.getLocation()).andReturn("file:src/test/resources/bundle.jar").andReturn(
             "reference:file:src/test/resources/bundle.jar");
+        expect(this.dependency.getSymbolicName()).andReturn("bundle").anyTimes();
 
         expect(this.bundleFileResolver.resolve(this.dependency)).andReturn(null).times(2);
         this.callback.scan(isA(JarURLConnection.class));
diff --git a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerFactoryTests.java b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerFactoryTests.java
index f48615a..4968201 100644
--- a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerFactoryTests.java
+++ b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerFactoryTests.java
@@ -38,6 +38,7 @@
         this.bundleContext = createMock(BundleContext.class);
         expect(this.bundleContext.getProperty(TomcatConfigLocator.CONFIG_PATH_FRAMEWORK_PROPERTY)).andReturn(null);
         expect(this.bundleContext.getProperty(OsgiAwareEmbeddedTomcat.USE_NAMING)).andReturn(null);
+        expect(this.bundleContext.getProperty(BundleDependenciesJarScanner.SCANNER_SKIP_BUNDLES_PROPERTY_NAME)).andReturn(null);
         expect(this.bundleContext.createFilter("(objectClass=org.eclipse.gemini.web.tomcat.spi.ClassLoaderCustomizer)")).andReturn(null);
         expect(this.bundleContext.createFilter("(objectClass=org.eclipse.gemini.web.tomcat.spi.JarScannerCustomizer)")).andReturn(null);
         expect(this.bundleContext.getBundle()).andReturn(null);
diff --git a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerTests.java b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerTests.java
index bf8bdff..a83b486 100644
--- a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerTests.java
+++ b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/TomcatServletContainerTests.java
@@ -87,6 +87,7 @@
         expect(this.bundleContext.createFilter(FILTER_1)).andReturn(this.filter);
         expect(this.bundleContext.createFilter(FILTER_2)).andReturn(this.filter);
         expect(this.bundleContext.getProperty(OsgiAwareEmbeddedTomcat.USE_NAMING)).andReturn(OsgiAwareEmbeddedTomcat.NAMING_DISABLED);
+        expect(this.bundleContext.getProperty(BundleDependenciesJarScanner.SCANNER_SKIP_BUNDLES_PROPERTY_NAME)).andReturn(null);
 
         expect(this.server.findServices()).andReturn(new Service[] { this.service }).anyTimes();
         this.server.init();
diff --git a/test-bundles/customizer-bundle/ivy.xml b/test-bundles/customizer-bundle/ivy.xml
index 95ecae0..5bac503 100755
--- a/test-bundles/customizer-bundle/ivy.xml
+++ b/test-bundles/customizer-bundle/ivy.xml
@@ -20,7 +20,7 @@
 		<dependency org="javax.servlet" name="javax.servlet" rev="${javax.servlet}" conf="compile->runtime"/>
 		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.tomcat.api" rev="${org.apache.tomcat.api}" conf="compile->runtime"/>
 		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="compile->runtime"/>
-		<dependency org="org.eclipse.gemini" name="org.eclipse.gemini.web.tomcat" rev="2.2.0.M01" conf="compile->runtime"/>
+		<dependency org="org.eclipse.gemini" name="org.eclipse.gemini.web.tomcat" rev="2.2.0.M02" conf="compile->runtime"/>
     </dependencies>
 
 </ivy-module>