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>