TAP5-2448, TAP5-2517: check that the directory is inside a JAR file
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/c61335a1 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/c61335a1 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/c61335a1 Branch: refs/heads/master Commit: c61335a151b193730555a62c20e397a675305a6d Parents: f043669 Author: Jochen Kemnade <[email protected]> Authored: Thu Nov 12 10:34:43 2015 +0100 Committer: Jochen Kemnade <[email protected]> Committed: Thu Nov 12 10:34:43 2015 +0100 ---------------------------------------------------------------------- .../ioc/internal/util/AbstractResource.java | 4 +++- .../ioc/specs/ClasspathResourceSpec.groovy | 22 ++++++++++++++++++++ .../META-INF/maven/org.slf4j/slf4j-api/pom.xml | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c61335a1/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/AbstractResource.java ---------------------------------------------------------------------- diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/AbstractResource.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/AbstractResource.java index 7af7c48..2ead75e 100644 --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/AbstractResource.java +++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/AbstractResource.java @@ -290,7 +290,9 @@ public abstract class AbstractResource extends LockSupport implements Resource String resourceInJar = urlAsString.substring(indexOfExclamationMark + 2); - boolean isDirectory = Thread.currentThread().getContextClassLoader().getResource(resourceInJar + "/") != null; + URL directoryResource = Thread.currentThread().getContextClassLoader().getResource(resourceInJar + "/"); + + boolean isDirectory = directoryResource != null && "jar".equals(directoryResource.getProtocol()); if (isDirectory) { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c61335a1/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathResourceSpec.groovy ---------------------------------------------------------------------- diff --git a/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathResourceSpec.groovy b/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathResourceSpec.groovy index a7829bc..6f446cb 100644 --- a/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathResourceSpec.groovy +++ b/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathResourceSpec.groovy @@ -1,7 +1,10 @@ package ioc.specs +import java.security.AccessController; + import org.apache.commons.lang3.SystemUtils import org.apache.tapestry5.ioc.internal.util.ClasspathResource +import org.slf4j.Logger; import spock.lang.Issue; import spock.lang.Specification @@ -279,4 +282,23 @@ class ClasspathResourceSpec extends Specification { notThrown(IOException) } + @Issue('TAP5-2517') + def "Can open a stream for a file resource within a JAR file that has a duplicate on the classpath"() { + setup: + def currentCl = Thread.currentThread().contextClassLoader + + def loadedURLs = currentCl.ucp.path + def slf4jApiFirst = loadedURLs.sort{!it.toString().contains('slf4j-api')} + + ClassLoader cl = new URLClassLoader(slf4jApiFirst as URL[], null, AccessController.getContext()) + + ClasspathResource r = new ClasspathResource(cl, '/META-INF/maven/org.slf4j/slf4j-api/pom.xml') + + when: + r.openStream() + then: + notThrown(IOException) + + } + } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c61335a1/tapestry-ioc/src/test/resources/META-INF/maven/org.slf4j/slf4j-api/pom.xml ---------------------------------------------------------------------- diff --git a/tapestry-ioc/src/test/resources/META-INF/maven/org.slf4j/slf4j-api/pom.xml b/tapestry-ioc/src/test/resources/META-INF/maven/org.slf4j/slf4j-api/pom.xml new file mode 100644 index 0000000..6199647 --- /dev/null +++ b/tapestry-ioc/src/test/resources/META-INF/maven/org.slf4j/slf4j-api/pom.xml @@ -0,0 +1,2 @@ +This is a test file for TAP5-2517. +See ioc.specs.ClasspathResourceSpec.Can open a stream for a file resource within a JAR file that has a duplicate on the classpath() \ No newline at end of file
