You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ec...@apache.org on 2015/10/01 16:27:25 UTC

svn commit: r1706261 - in /commons/proper/vfs/trunk: core/src/main/java/org/apache/commons/vfs2/impl/ core/src/test/java/org/apache/commons/vfs2/impl/test/ core/src/test/java/org/apache/commons/vfs2/test/ src/changes/

Author: ecki
Date: Thu Oct  1 14:27:25 2015
New Revision: 1706261

URL: http://svn.apache.org/viewvc?rev=1706261&view=rev
Log:
[VFS-490] Do not layer folders with .jar extension, add tests. closes #2 on GitHub.

Modified:
    commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/impl/FileTypeMap.java
    commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/impl/test/VfsClassLoaderTests.java
    commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/test/ProviderReadTests.java
    commons/proper/vfs/trunk/src/changes/changes.xml

Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/impl/FileTypeMap.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/impl/FileTypeMap.java?rev=1706261&r1=1706260&r2=1706261&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/impl/FileTypeMap.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/impl/FileTypeMap.java Thu Oct  1 14:27:25 2015
@@ -48,7 +48,10 @@ class FileTypeMap
     }
 
     /**
-     * Finds the provider to use to create a filesystem from a given file.
+     * Find the scheme for the provider of a layered file system.
+     * <p>
+     * This will check the FileContentInfo or file extension.
+     * @return Scheme supporting the file type or null (if unknonw).
      */
     public String getScheme(final FileObject file) throws FileSystemException
     {
@@ -60,7 +63,11 @@ class FileTypeMap
             return mimeTypeMap.get(mimeType);
         }
 
-        // Check the file's extension for a match
+        // no specific mime-type - if it is a file also check the extension
+        if (!file.isFile())
+        {
+            return null; // VFS-490 folders don't use extensions for mime-type
+        }
         final String extension = file.getName().getExtension();
         return extensionMap.get(extension);
     }

Modified: commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/impl/test/VfsClassLoaderTests.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/impl/test/VfsClassLoaderTests.java?rev=1706261&r1=1706260&r2=1706261&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/impl/test/VfsClassLoaderTests.java (original)
+++ commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/impl/test/VfsClassLoaderTests.java Thu Oct  1 14:27:25 2015
@@ -103,38 +103,36 @@ public class VfsClassLoaderTests
     }
 
     /**
-     * Tests retrieving resources (from JAR searchpath)
+     * Tests retrieving resources (from JAR searchpath).
+     * <p>
+     * This is run for all providers, but only when a local
+     * provider is present and jar extension is registered
+     * it will actually carry out all tests.
      */
     public void testGetResourcesJARs() throws Exception
     {
         final FileSystemManager manager = getManager();
-        final File baseDir = AbstractVfsTestCase.getTestDirectoryFile();
-
-        // make sure the provider config is useable
-        if (baseDir == null || manager == null || !baseDir.isDirectory()) 
-        {
-            return;
-        }
-
-        // build search path without using #getBaseFolder()
-        // because NestedJarTestCase redefines it
-        final FileObject nestedJar;
-        final FileObject testJar;
         try
         {
-            nestedJar = manager.resolveFile(baseDir, "nested.jar");
-            testJar = manager.resolveFile(baseDir, "test.jar");
+            // hasProvider("file") cannot be used as it triggers default provider URL
+            manager.toFileObject(new File("."));
         }
-        catch (FileSystemException ignored)
+        catch (FileSystemException e)
         {
-            return; // this suite cannot handle localFiles
+            System.out.println("VfsClassLoaderTestCase has no local file provider, skipping.");
+            return;
         }
 
-        final FileObject[] search = new FileObject[] { nestedJar, testJar };
+        // build search path without using #getBaseFolder()
+        // because NestedJarTestCase redefines it
+        final File baseDir = AbstractVfsTestCase.getTestDirectoryFile();
+        final FileObject nestedJar = manager.resolveFile(baseDir, "nested.jar");
+        final FileObject testJar = manager.resolveFile(baseDir, "test.jar");
 
         // test setup needs to know about .jar extension - i.e. NestedJarTestCase
-        if (!manager.canCreateFileSystem(nestedJar)) 
+        if (!manager.canCreateFileSystem(nestedJar))
         {
+            System.out.println("VfsClassLoaderTestCase has no .jar provider, skipping.");
             return;
         }
 
@@ -146,7 +144,7 @@ public class VfsClassLoaderTests
         // to returning resources for META-INF/MANIFEST.MF (see VFS-500)
         // so we use our own which is guaranteed to not return any hit
         final ClassLoader mockClassloader = new MockClassloader();
-
+        final FileObject[] search = new FileObject[] { nestedJar, testJar };
         final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader);
 
         final Enumeration<URL> urls = loader.getResources("META-INF/MANIFEST.MF");
@@ -157,6 +155,44 @@ public class VfsClassLoaderTests
         assertTrue("Second resource must refer to test.jar but was " + url2, url2.toString().endsWith("test.jar!/META-INF/MANIFEST.MF"));
     }
 
+    /**
+     * Tests retrieving resources (from local directory with .jar extension).
+     * <p>
+     * This test is repeatet with various provider configurations but works on local files, only.
+     */
+    public void testGetResourcesNoLayerLocal() throws Exception
+    {
+        final FileSystemManager manager = getManager();
+        try
+        {
+            // hasProvider("file") cannot be used as it triggers default provider URL
+            manager.toFileObject(new File("."));
+        }
+        catch (FileSystemException e)
+        {
+            System.out.println("TestCase has no local file provider, skipping.");
+            return;
+        }
+        final File baseDir = AbstractVfsTestCase.getTestDirectoryFile();
+
+        // setup test folder
+        final FileObject dir = manager.resolveFile(baseDir, "read-tests/dir1/subdir4.jar");
+        System.out.println("vfsclassloadertests: " + dir);
+        assertTrue("subdir4.jar/ is required for testing " + dir, dir.getType() == FileType.FOLDER);
+        assertFalse(manager.canCreateFileSystem(dir));
+
+        // prepare classloader
+        final FileObject[] search = new FileObject[] { dir };
+        final ClassLoader mockClassloader = new MockClassloader();
+        final VFSClassLoader loader = new VFSClassLoader(search, getManager(), mockClassloader);
+
+        // verify resource loading
+        final Enumeration<URL> urls = loader.getResources("file1.txt");
+        final URL url1 = urls.nextElement();
+        assertFalse("Only one hit expected", urls.hasMoreElements());
+        assertTrue("not pointing to resource " + url1, url1.toString().endsWith("subdir4.jar/file1.txt"));
+    }
+
 
     /**
      * Verify the package loaded with class loader.

Modified: commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/test/ProviderReadTests.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/test/ProviderReadTests.java?rev=1706261&r1=1706260&r2=1706261&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/test/ProviderReadTests.java (original)
+++ commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/test/ProviderReadTests.java Thu Oct  1 14:27:25 2015
@@ -363,4 +363,34 @@ public class ProviderReadTests extends A
             assertEquals(expected, actual);
         }
     }
+
+    /**
+     * Tests that we can traverse a folder that has JAR name.
+     */
+    public void testDotJarFolderName() throws Exception
+    {
+        final FileObject folder = getReadFolderDir1().resolveFile("subdir4.jar");
+        Assert.assertTrue(folder.exists());
+        final FileObject file = folder.resolveFile("file1.txt");
+        Assert.assertTrue(file.exists());
+    }
+
+    /**
+     * Tests that a folder can't be layered.
+     */
+    public void testDotJarFolderNameLayer() throws Exception
+    {
+        final FileObject folder = getReadFolderDir1().resolveFile("subdir4.jar");
+        Assert.assertTrue("subdir4.jar/ must exist as folder, check test setup.", folder.isFolder());
+        Assert.assertFalse("subdir4.jar/ must not be layerable", getManager().canCreateFileSystem(folder));
+        try
+        {
+            FileObject ignored = getManager().createFileSystem(folder);
+            fail("Should not be able to create a layered filesystem on a directory. " + ignored);
+        }
+        catch (final FileSystemException e)
+        {
+            assertSame("Creation of layered filesystem should fail" + e, "vfs.impl/no-provider-for-file.error", e.getCode());
+        }
+    }
 }

Modified: commons/proper/vfs/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1706261&r1=1706260&r2=1706261&view=diff
==============================================================================
--- commons/proper/vfs/trunk/src/changes/changes.xml (original)
+++ commons/proper/vfs/trunk/src/changes/changes.xml Thu Oct  1 14:27:25 2015
@@ -26,6 +26,9 @@
 <!--       <action issue="VFS-443" dev="ggregory" type="update" due-to="nickallen"> -->
 <!--        [Local] Need an easy way to convert from a FileObject to a File. -->
 <!--       </action> -->
+      <action issue="VFS-490" dev="ecki" type="fix">
+        [vfsclassloader] Do not open folders with .jar extension. Adds tests.
+     </action>
       <action issue="VFS-582" dev="ecki" type="fix">
         [tests] revert rename of getTestDirectoryFile to make test classes more compatible for external providers.
      </action>