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