diff --git a/src/main/java/org/jboss/virtual/plugins/context/AbstractVFSContext.java b/src/main/java/org/jboss/virtual/plugins/context/AbstractVFSContext.java index 6846837d..ba565027 100644 --- a/src/main/java/org/jboss/virtual/plugins/context/AbstractVFSContext.java +++ b/src/main/java/org/jboss/virtual/plugins/context/AbstractVFSContext.java @@ -145,9 +145,9 @@ public URL getChildURL(VirtualFileHandler parent, String name) throws IOExceptio .append(":").append(rootUri.getPath()); if(parent != null) { - String pPathName = null; + String pPathName; if(parent instanceof AbstractVirtualFileHandler) - pPathName = ((AbstractVirtualFileHandler)parent).getLocalPathName(); + pPathName = parent.getLocalPathName(); else pPathName = parent.getPathName(); diff --git a/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemContext.java b/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemContext.java index 5ab684c5..c764b46e 100644 --- a/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemContext.java +++ b/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemContext.java @@ -65,7 +65,6 @@ */ public class FileSystemContext extends AbstractVFSContext { - private static final Logger log = Logger.getLogger(ZipEntryContext.class); /** true if forcing fallback to vfsjar from default vfszip */ diff --git a/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContext.java b/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContext.java index 21e59a37..ef79ebce 100644 --- a/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContext.java +++ b/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContext.java @@ -196,7 +196,6 @@ public ZipEntryContext(URL rootURL, VirtualFileHandler peer, ZipWrapper zipWrapp */ private void init(URL localRootURL, VirtualFileHandler peer, ZipWrapper zipWrapper) throws IOException, URISyntaxException { - if (zipWrapper == null) { if (localRootURL == null) @@ -709,7 +708,8 @@ protected void finalize() try { super.finalize(); - zipSource.close(); + if (zipSource != null) + zipSource.close(); } catch (Throwable ignored) { diff --git a/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContextFactory.java b/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContextFactory.java index 81921886..bf21720c 100644 --- a/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContextFactory.java +++ b/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContextFactory.java @@ -21,9 +21,6 @@ */ package org.jboss.virtual.plugins.context.zip; -import org.jboss.virtual.plugins.context.AbstractContextFactory; -import org.jboss.virtual.spi.VFSContext; - import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; @@ -32,13 +29,15 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.jboss.virtual.plugins.context.AbstractContextFactory; +import org.jboss.virtual.spi.VFSContext; + /** * ContextFactory that keeps track of ZipEntryContexts * * @author Marko Strukelj * @version $Revision: 1.0 $ */ - public class ZipEntryContextFactory extends AbstractContextFactory { /** registry of all ZipEntryContext instances */ @@ -75,7 +74,6 @@ public VFSContext getVFS(URL rootURL) throws IOException String longestMatchingKey = null; ZipEntryContext longestMatchingCtx = null; - for(Map.Entry ent : ctxCache.entrySet()) { if(key.startsWith(ent.getKey())) @@ -87,17 +85,12 @@ public VFSContext getVFS(URL rootURL) throws IOException } } } - - ZipEntryContext ctx = null; if(longestMatchingCtx != null) - ctx = longestMatchingCtx; - - if(ctx != null) - return ctx; + return longestMatchingCtx; try { - ctx = new ZipEntryContext(rootURL); + return new ZipEntryContext(rootURL); } catch(URISyntaxException ex) { @@ -105,11 +98,6 @@ public VFSContext getVFS(URL rootURL) throws IOException e.initCause(ex); throw e; } - - // ZipEntryContext registers newly created context with this factory - // by calling registerContext() which puts a newly created context into ctxCache - - return ctx; } public static ZipEntryContextFactory getInstance() diff --git a/src/test/java/org/jboss/test/virtual/test/JARSerializationUnitTestCase.java b/src/test/java/org/jboss/test/virtual/test/JARSerializationUnitTestCase.java index 887ed7f8..5af8c312 100644 --- a/src/test/java/org/jboss/test/virtual/test/JARSerializationUnitTestCase.java +++ b/src/test/java/org/jboss/test/virtual/test/JARSerializationUnitTestCase.java @@ -121,6 +121,7 @@ public void testInnerJarFileSerialization() throws Exception assertEquals("jar1", title1); jar1DSMF.close(); } + /** * JBVFS-17 test * @throws Exception @@ -156,7 +157,6 @@ public void testInnerJarFilesOnlyFileSerialization() throws Exception jar1DSMF.close(); } -/* public void testLevelZips() throws Exception { URL rootURL = getResource("/vfs/test"); @@ -203,7 +203,6 @@ public void testLevelZips() throws Exception textThree = two.findChild("level3.zip/test3.txt"); testText(textThree); } -*/ protected void testText(VirtualFile file) throws Exception { diff --git a/src/test/java/org/jboss/test/virtual/test/JARVFSContextUnitTestCase.java b/src/test/java/org/jboss/test/virtual/test/JARVFSContextUnitTestCase.java index ef16cabe..9b5bd5b1 100644 --- a/src/test/java/org/jboss/test/virtual/test/JARVFSContextUnitTestCase.java +++ b/src/test/java/org/jboss/test/virtual/test/JARVFSContextUnitTestCase.java @@ -161,4 +161,24 @@ public void testInnerJarFileEntryOpenStream() throws Exception InputStream is = target.openStream(); assertFalse("input stream closed", is.read() == -1); } + + public void testInnerJarOverURL() throws Exception + { + URL url = getResource("/vfs/test/nested/" + getNestedName() + ".jar"); + String urlString = url.toExternalForm(); + URL vfsURL = new URL(getProtocol() + urlString.substring(4) + "/complex.jar"); + InputStream is = vfsURL.openStream(); + assertNotNull(is); + } + + // we need to make sure this doesn't get touched before + protected String getNestedName() + { + return "nested"; + } + + protected String getProtocol() + { + return "vfsfile"; + } } diff --git a/src/test/java/org/jboss/test/virtual/test/ZipEntryVFSContextUnitTestCase.java b/src/test/java/org/jboss/test/virtual/test/ZipEntryVFSContextUnitTestCase.java index d0b62aac..f4082796 100644 --- a/src/test/java/org/jboss/test/virtual/test/ZipEntryVFSContextUnitTestCase.java +++ b/src/test/java/org/jboss/test/virtual/test/ZipEntryVFSContextUnitTestCase.java @@ -26,6 +26,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URL; +import java.util.Map; import junit.framework.Test; import org.jboss.virtual.VFS; @@ -43,6 +44,8 @@ */ public class ZipEntryVFSContextUnitTestCase extends JARVFSContextUnitTestCase { + private Map ctxCacheMap; + public ZipEntryVFSContextUnitTestCase(String name) { super(name); @@ -55,6 +58,25 @@ public static Test suite() return suite(ZipEntryVFSContextUnitTestCase.class); } +/* + protected void setUp() throws Exception + { + super.setUp(); + + SecurityManager sm = System.getSecurityManager(); + System.setSecurityManager(null); + try + { + Field field = ZipEntryContextFactory.class.getDeclaredField("ctxCache"); + ctxCacheMap = (Map)field.get(ZipEntryContextFactory.getInstance()); + } + finally + { + System.setSecurityManager(sm); + } + } +*/ + protected VFSContext getVFSContext(String name) throws Exception { URL url = getResource("/vfs/context/jar/" + name + ".jar"); @@ -121,4 +143,15 @@ public void testNotAnArchive() throws Exception handler = ctx.getRoot().getChild("notanarchive.jar"); assertTrue("is leaf", handler.isLeaf()); } + + // we need to make sure this doesn't get touched before + protected String getNestedName() + { + return super.getNestedName() + "_copy"; + } + + protected String getProtocol() + { + return "vfszip"; + } } \ No newline at end of file diff --git a/src/test/resources/vfs/test/nested/nested.jar b/src/test/resources/vfs/test/nested/nested.jar new file mode 100644 index 00000000..5fd5c3ff Binary files /dev/null and b/src/test/resources/vfs/test/nested/nested.jar differ diff --git a/src/test/resources/vfs/test/nested/nested_copy.jar b/src/test/resources/vfs/test/nested/nested_copy.jar new file mode 100644 index 00000000..5fd5c3ff Binary files /dev/null and b/src/test/resources/vfs/test/nested/nested_copy.jar differ