bug 448004: Implement the changed Jar Scanner functionality.
diff --git a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanFilter.java b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanFilter.java new file mode 100644 index 0000000..57b923e --- /dev/null +++ b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanFilter.java
@@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2015 SAP SE + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at + * http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at + * http://www.opensource.org/licenses/apache2.0.php. + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * Violeta Georgieva - initial contribution + *******************************************************************************/ + +package org.eclipse.gemini.web.tomcat.internal; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.apache.tomcat.JarScanFilter; +import org.apache.tomcat.JarScanType; +import org.osgi.framework.BundleContext; + +final class BundleDependenciesJarScanFilter implements JarScanFilter { + + private static final String COMMA_SEPARATOR = ","; + + /** + * By default the Bundle Dependencies Jar Scanner will exclude the bundles listed below from the scanning process as + * they do not provide TLDs and web-fragment.xml files: org.eclipse.osgi, javax.servlet, javax.servlet.jsp, + * javax.el,javax.websocket. The default behavior can be changed with property + * <code>org.eclipse.gemini.web.tomcat.scanner.skip.bundles</code>. The syntax is + * <code>org.eclipse.gemini.web.tomcat.scanner.skip.bundles=<bundle-symbolic-name>,<bundle-symbolic-name>,...</code> + */ + 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,javax.websocket"; + + private final Set<String> skipBundles; + + BundleDependenciesJarScanFilter(BundleContext bundleContext) { + this.skipBundles = Collections.unmodifiableSet(getBundlesToSkip(bundleContext)); + } + + @Override + public boolean check(JarScanType jarScanType, String bundleSymbolicName) { + if (this.skipBundles.contains(bundleSymbolicName)) { + return false; + } + return true; + } + + private Set<String> getBundlesToSkip(BundleContext bundleContext) { + Set<String> result = new HashSet<>(); + 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/BundleDependenciesJarScanner.java b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/BundleDependenciesJarScanner.java index d71f676..ae9fc50 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,14 +1,14 @@ /******************************************************************************* - * Copyright (c) 2009, 2014 VMware Inc. + * Copyright (c) 2009, 2015 VMware Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. + * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html - * and the Apache License v2.0 is available at + * and the Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php. - * You may elect to redistribute this code under either of these licenses. + * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. - initial contribution @@ -22,16 +22,17 @@ 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; +import org.apache.jasper.servlet.JasperInitializer; +import org.apache.tomcat.JarScanFilter; +import org.apache.tomcat.JarScanType; import org.apache.tomcat.JarScanner; import org.apache.tomcat.JarScannerCallback; import org.apache.tomcat.websocket.server.WsSci; -import org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader; +import org.eclipse.gemini.web.tomcat.internal.loader.BundleWebappClassLoader; import org.eclipse.gemini.web.tomcat.internal.support.BundleDependencyDeterminer; import org.eclipse.gemini.web.tomcat.internal.support.BundleFileResolver; import org.osgi.framework.Bundle; @@ -43,29 +44,16 @@ /** * A <code>JarScanner</code> implementation that passes each of the {@link Bundle}'s dependencies to the * {@link JarScannerCallback}. - * + * * <p /> - * + * * <strong>Concurrent Semantics</strong><br /> - * + * * Thread-safe. - * + * */ final class BundleDependenciesJarScanner implements JarScanner { - private static final String COMMA_SEPARATOR = ","; - - /** - * By default the Bundle Dependencies Jar Scanner will exclude the bundles listed below from the scanning process as - * they do not provide TLDs and web-fragment.xml files: org.eclipse.osgi, javax.servlet, javax.servlet.jsp, - * javax.el,javax.websocket. The default behavior can be changed with property - * <code>org.eclipse.gemini.web.tomcat.scanner.skip.bundles</code>. The syntax is - * <code>org.eclipse.gemini.web.tomcat.scanner.skip.bundles=<bundle-symbolic-name>,<bundle-symbolic-name>,...</code> - */ - 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,javax.websocket"; - private static final String JAR_URL_SUFFIX = "!/"; private static final String JAR_URL_PREFIX = "jar:"; @@ -78,48 +66,64 @@ private final BundleFileResolver bundleFileResolver; - private final Set<String> skipBundles; + private JarScanFilter jarScanFilter; - public BundleDependenciesJarScanner(BundleDependencyDeterminer bundleDependencyDeterminer, BundleFileResolver bundleFileResolver, + BundleDependenciesJarScanner(BundleDependencyDeterminer bundleDependencyDeterminer, BundleFileResolver bundleFileResolver, BundleContext bundleContext) { this.bundleDependencyDeterminer = bundleDependencyDeterminer; this.bundleFileResolver = bundleFileResolver; - this.skipBundles = Collections.unmodifiableSet(getBundlesToSkip(bundleContext)); + this.jarScanFilter = new BundleDependenciesJarScanFilter(bundleContext); } @Override - public void scan(ServletContext context, ClassLoader classLoader, JarScannerCallback callback, Set<String> jarsToSkip) { + public JarScanFilter getJarScanFilter() { + return this.jarScanFilter; + } + + @Override + public void setJarScanFilter(JarScanFilter jarScanFilter) { + this.jarScanFilter = jarScanFilter; + } + + @Override + public void scan(JarScanType jarScanType, ServletContext context, JarScannerCallback callback) { + ClassLoader classLoader = context.getClassLoader(); if (classLoader instanceof BundleWebappClassLoader) { Bundle bundle = ((BundleWebappClassLoader) classLoader).getBundle(); - scanDependentBundles(bundle, callback); + scanDependentBundles(bundle, jarScanType, callback); } } - private void scanDependentBundles(Bundle rootBundle, JarScannerCallback callback) { - Set<Bundle> dependencies = this.bundleDependencyDeterminer.getDependencies(rootBundle); - + private void scanDependentBundles(Bundle rootBundle, JarScanType jarScanType, JarScannerCallback callback) { Bundle apacheWebsocketBundle = FrameworkUtil.getBundle(WsSci.class); if (apacheWebsocketBundle != null) { - dependencies.add(apacheWebsocketBundle); + scanBundle(apacheWebsocketBundle, callback, false); } + Bundle apacheJasperBundle = FrameworkUtil.getBundle(JasperInitializer.class); + if (apacheJasperBundle != null) { + scanBundle(apacheJasperBundle, callback, false); + } + + Set<Bundle> dependencies = this.bundleDependencyDeterminer.getDependencies(rootBundle); + for (Bundle bundle : dependencies) { - if (!this.skipBundles.contains(bundle.getSymbolicName())) { - scanBundle(bundle, callback); + if (getJarScanFilter().check(jarScanType, bundle.getSymbolicName())) { + scanBundle(bundle, callback, true); } } } - private void scanBundle(Bundle bundle, JarScannerCallback callback) { + private void scanBundle(Bundle bundle, JarScannerCallback callback, boolean isWebapp) { File bundleFile = this.bundleFileResolver.resolve(bundle); if (bundleFile != null) { - scanBundleFile(bundleFile, callback); + scanBundleFile(bundleFile, callback, isWebapp); } else { - scanJarUrlConnection(bundle, callback); + scanJarUrlConnection(bundle, callback, isWebapp); } } - private void scanJarUrlConnection(Bundle bundle, JarScannerCallback callback) { + private void scanJarUrlConnection(Bundle bundle, JarScannerCallback callback, boolean isWebapp) { URL bundleUrl; String bundleLocation = bundle.getLocation(); try { @@ -130,57 +134,41 @@ bundleUrl = new URL(JAR_URL_PREFIX + bundleLocation + JAR_URL_SUFFIX); } } catch (MalformedURLException e) { - LOGGER.warn("Failed to create jar: url for bundle location " + bundleLocation); + LOGGER.warn("Failed to create jar: url for bundle location [" + bundleLocation + "]."); return; } - scanBundleUrl(bundleUrl, callback); + scanBundleUrl(bundleUrl, callback, isWebapp); } - private void scanBundleFile(File bundleFile, JarScannerCallback callback) { + private void scanBundleFile(File bundleFile, JarScannerCallback callback, boolean isWebapp) { if (bundleFile.isDirectory()) { try { - callback.scan(bundleFile); + callback.scan(bundleFile, null, isWebapp); } catch (IOException e) { - LOGGER.warn("Failure when attempting to scan bundle file '" + bundleFile + "'.", e); + LOGGER.warn("Failure when attempting to scan bundle file [" + bundleFile + "].", e); } } else { URL bundleUrl; try { bundleUrl = new URL(JAR_URL_PREFIX + bundleFile.toURI().toURL() + JAR_URL_SUFFIX); } catch (MalformedURLException e) { - LOGGER.warn("Failed to create jar: url for bundle file " + bundleFile); + LOGGER.warn("Failed to create jar: url for bundle file [" + bundleFile + "]."); return; } - scanBundleUrl(bundleUrl, callback); + scanBundleUrl(bundleUrl, callback, isWebapp); } } - private void scanBundleUrl(URL url, JarScannerCallback callback) { + private void scanBundleUrl(URL url, JarScannerCallback callback, boolean isWebapp) { try { URLConnection connection = url.openConnection(); if (connection instanceof JarURLConnection) { - callback.scan((JarURLConnection) connection); + callback.scan((JarURLConnection) connection, null, isWebapp); } } catch (IOException e) { - LOGGER.warn("Failure when attempting to scan bundle via jar URL '" + url + "'.", e); + 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 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/ChainingJarScanner.java b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/ChainingJarScanner.java index 12dd874..544506c 100644 --- a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/ChainingJarScanner.java +++ b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/ChainingJarScanner.java
@@ -1,14 +1,14 @@ /******************************************************************************* - * Copyright (c) 2009, 2012 VMware Inc. + * Copyright (c) 2009, 2015 VMware Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. + * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html - * and the Apache License v2.0 is available at + * and the Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php. - * You may elect to redistribute this code under either of these licenses. + * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. - initial contribution @@ -16,21 +16,21 @@ package org.eclipse.gemini.web.tomcat.internal; -import java.util.Set; - import javax.servlet.ServletContext; +import org.apache.tomcat.JarScanFilter; +import org.apache.tomcat.JarScanType; import org.apache.tomcat.JarScanner; import org.apache.tomcat.JarScannerCallback; /** * A <code>JarScanner</code> implementation that delegates to a chain of <code>JarScanner</code>s. * <p /> - * + * * <strong>Concurrent Semantics</strong><br /> - * + * * Thread-safe. - * + * */ final class ChainingJarScanner implements JarScanner { @@ -41,10 +41,20 @@ } @Override - public void scan(ServletContext context, ClassLoader classloader, JarScannerCallback callback, Set<String> jarsToSkip) { + public void scan(JarScanType jarScanType, ServletContext context, JarScannerCallback callback) { for (JarScanner jarScanner : this.jarScanners) { - jarScanner.scan(context, classloader, callback, jarsToSkip); + jarScanner.scan(jarScanType, context, callback); } } + @Override + public JarScanFilter getJarScanFilter() { + return null; + } + + @Override + public void setJarScanFilter(JarScanFilter jarScanFilter) { + // no-op + } + }
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 27003d9..a52d353 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
@@ -3,12 +3,12 @@ * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. + * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html - * and the Apache License v2.0 is available at + * and the Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php. - * You may elect to redistribute this code under either of these licenses. + * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. - initial contribution @@ -18,8 +18,10 @@ import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; +import static org.easymock.EasyMock.isNull; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; @@ -30,19 +32,19 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import java.util.Hashtable; + +import javax.servlet.ServletContext; import org.apache.tomcat.JarScannerCallback; -import org.eclipse.gemini.web.tomcat.internal.loading.BundleWebappClassLoader; +import org.eclipse.gemini.web.tomcat.internal.loader.BundleWebappClassLoader; 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.test.stubs.framework.StubBundle; import org.eclipse.virgo.test.stubs.framework.StubBundleContext; import org.junit.Test; import org.osgi.framework.Bundle; -/** - */ public class BundleDependenciesJarScannerTests { private final BundleDependencyDeterminer dependencyDeterminer = createMock(BundleDependencyDeterminer.class); @@ -54,7 +56,7 @@ private final BundleDependenciesJarScanner scanner = new BundleDependenciesJarScanner(this.dependencyDeterminer, this.bundleFileResolver, this.bundleContext); - private final Bundle bundle = createMock(Bundle.class); + private final Bundle bundle = new StubBundle(); private final JarScannerCallback callback = createMock(JarScannerCallback.class); @@ -62,83 +64,85 @@ private final Bundle dependency = createMock(Bundle.class); + private final ServletContext servletContext = createMock(ServletContext.class); + @Test public void noDependencies() throws IOException { - expect(this.bundle.getHeaders()).andReturn(new Hashtable<String, String>()); expect(this.dependencyDeterminer.getDependencies(this.bundle)).andReturn(Collections.<Bundle> emptySet()); - replay(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback); - ClassLoader classLoader = new BundleWebappClassLoader(this.bundle, this.classLoaderCustomizer); + expect(this.servletContext.getClassLoader()).andReturn(classLoader); - this.scanner.scan(null, classLoader, this.callback, null); + replay(this.dependencyDeterminer, this.servletContext); + + this.scanner.scan(null, this.servletContext, this.callback); ((URLClassLoader) classLoader).close(); - verify(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback); + verify(this.dependencyDeterminer, this.servletContext); } @Test public void scanDirectory() throws IOException { - expect(this.bundle.getHeaders()).andReturn(new Hashtable<String, String>()); expect(this.dependencyDeterminer.getDependencies(this.bundle)).andReturn(new HashSet<>(Arrays.asList(this.dependency))); File dependencyFile = new File("src/test/resources"); expect(this.bundleFileResolver.resolve(this.dependency)).andReturn(dependencyFile); - this.callback.scan(dependencyFile); - - replay(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback); + this.callback.scan(dependencyFile, null, true); ClassLoader classLoader = new BundleWebappClassLoader(this.bundle, this.classLoaderCustomizer); + expect(this.servletContext.getClassLoader()).andReturn(classLoader); - this.scanner.scan(null, classLoader, this.callback, null); + replay(this.dependencyDeterminer, this.bundleFileResolver, this.callback, this.servletContext); + + this.scanner.scan(null, this.servletContext, this.callback); ((URLClassLoader) classLoader).close(); - verify(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback); + verify(this.dependencyDeterminer, this.bundleFileResolver, this.callback, this.servletContext); } @Test public void scanFile() throws IOException { - expect(this.bundle.getHeaders()).andReturn(new Hashtable<String, String>()); expect(this.dependencyDeterminer.getDependencies(this.bundle)).andReturn(new HashSet<>(Arrays.asList(this.dependency))); File dependencyFile = new File(""); expect(this.bundleFileResolver.resolve(this.dependency)).andReturn(dependencyFile); - this.callback.scan(isA(JarURLConnection.class)); - - replay(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback); + this.callback.scan(isA(JarURLConnection.class), (String) isNull(), eq(true)); ClassLoader classLoader = new BundleWebappClassLoader(this.bundle, this.classLoaderCustomizer); + expect(this.servletContext.getClassLoader()).andReturn(classLoader); - this.scanner.scan(null, classLoader, this.callback, null); + replay(this.dependencyDeterminer, this.bundleFileResolver, this.callback, this.servletContext); + + this.scanner.scan(null, this.servletContext, this.callback); ((URLClassLoader) classLoader).close(); - verify(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback); + verify(this.dependencyDeterminer, this.bundleFileResolver, this.callback, this.servletContext); } @Test public void scanJarUrlConnection() throws IOException { - expect(this.bundle.getHeaders()).andReturn(new Hashtable<String, String>()); expect(this.dependencyDeterminer.getDependencies(this.bundle)).andReturn(new HashSet<>(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)); - - replay(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback, this.dependency); + this.callback.scan(isA(JarURLConnection.class), (String) isNull(), eq(true)); ClassLoader classLoader = new BundleWebappClassLoader(this.bundle, this.classLoaderCustomizer); + expect(this.servletContext.getClassLoader()).andReturn(classLoader).times(2); - this.scanner.scan(null, classLoader, this.callback, null); + replay(this.dependencyDeterminer, this.bundleFileResolver, this.callback, this.dependency, this.servletContext); - this.scanner.scan(null, classLoader, this.callback, null); + this.scanner.scan(null, this.servletContext, this.callback); + + this.scanner.scan(null, this.servletContext, this.callback); ((URLClassLoader) classLoader).close(); - verify(this.dependencyDeterminer, this.bundleFileResolver, this.bundle, this.callback); + verify(this.dependencyDeterminer, this.bundleFileResolver, this.callback, this.dependency, this.servletContext); } }
diff --git a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/ChainingJarScannerTests.java b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/ChainingJarScannerTests.java index 400e9c8..e0fd60a 100755 --- a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/ChainingJarScannerTests.java +++ b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/ChainingJarScannerTests.java
@@ -1,14 +1,14 @@ /******************************************************************************* - * Copyright (c) 2012, 2014 SAP AG + * Copyright (c) 2012, 2015 SAP AG * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. + * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html - * and the Apache License v2.0 is available at + * and the Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php. - * You may elect to redistribute this code under either of these licenses. + * You may elect to redistribute this code under either of these licenses. * * Contributors: * Violeta Georgieva - initial contribution @@ -20,10 +20,11 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import javax.servlet.ServletContext; +import org.apache.tomcat.JarScanFilter; +import org.apache.tomcat.JarScanType; import org.apache.tomcat.JarScanner; import org.apache.tomcat.JarScannerCallback; import org.junit.Test; @@ -35,13 +36,13 @@ @Test public void testScan() { ChainingJarScanner chainingJarScanner = new ChainingJarScanner(); - chainingJarScanner.scan(null, null, null, null); + chainingJarScanner.scan(null, null, null); assertTrue(this.scannedResources.size() == 0); String resource1 = "resource1"; String resource2 = "resource2"; chainingJarScanner = new ChainingJarScanner(jarScannerFor(resource1), jarScannerFor(resource2)); - chainingJarScanner.scan(null, null, null, null); + chainingJarScanner.scan(null, null, null); assertTrue(this.scannedResources.size() == 2); assertTrue(resource1.equals(this.scannedResources.get(0))); assertTrue(resource2.equals(this.scannedResources.get(1))); @@ -51,10 +52,20 @@ return new JarScanner() { @Override - public void scan(ServletContext context, ClassLoader classloader, JarScannerCallback callback, Set<String> jarsToSkip) { + public void scan(JarScanType jarScanType, ServletContext context, JarScannerCallback callback) { ChainingJarScannerTests.this.scannedResources.add(resource); } + @Override + public JarScanFilter getJarScanFilter() { + return null; + } + + @Override + public void setJarScanFilter(JarScanFilter arg0) { + // no-op + } + }; } }