You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ma...@apache.org on 2008/05/05 12:41:05 UTC

svn commit: r653417 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/fs/mem/MemoryFileSystem.java test/java/org/apache/jackrabbit/core/fs/AbstractFileSystemTest.java

Author: martijnh
Date: Mon May  5 03:41:04 2008
New Revision: 653417

URL: http://svn.apache.org/viewvc?rev=653417&view=rev
Log:
JCR-1450 move method of the MemoryFileSystem may accept invalid destination path resulting in invalid entries in FS

- Added unit test that shows the described behavior
- Added a fix to the MemoryFileSystem class

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/mem/MemoryFileSystem.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/fs/AbstractFileSystemTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/mem/MemoryFileSystem.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/mem/MemoryFileSystem.java?rev=653417&r1=653416&r2=653417&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/mem/MemoryFileSystem.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/fs/mem/MemoryFileSystem.java Mon May  5 03:41:04 2008
@@ -246,6 +246,16 @@
             throw new FileSystemException("Destination exists: " + destPath);
         }
 
+        // Create destination folder if it does not yet exist
+        String[] path = destPath.split(SEPARATOR);
+        String folder = "";
+        for (int i = 1; i < path.length; i++) {
+            folder += SEPARATOR + path[i];
+            if (!exists(folder)) {
+                createFolder(folder);
+            }
+        }
+        
         Map moves = new HashMap();
         moves.put(srcPath, destPath);
         if (getEntry(srcPath).isFolder()) {

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/fs/AbstractFileSystemTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/fs/AbstractFileSystemTest.java?rev=653417&r1=653416&r2=653417&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/fs/AbstractFileSystemTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/fs/AbstractFileSystemTest.java Mon May  5 03:41:04 2008
@@ -214,6 +214,61 @@
         assertEquals("subfolder", list[0]);
     }
 
+    public void testMoveFile_destFolderDoesNotExist() throws Exception {
+        // Create a folder with a file
+        fs.createFolder("/folder");
+        createFile("/folder/file", sampleBytes);
+
+        // Check that the destination folder and file do not exist
+        assertFalse(fs.exists("/folder2"));
+        assertFalse(fs.exists("/folder2/file"));
+
+        // Move the file into a non-existent directory
+        fs.move("/folder/file", "/folder2/file");
+
+        // Check that the file has been moved
+        assertFalse(fs.exists("/folder/file"));
+        assertFalse(fs.isFolder("/folder/file"));
+        assertFalse(fs.isFile("/folder/file"));
+        assertTrue(fs.exists("/folder2/file"));
+        assertFalse(fs.isFolder("/folder2/file"));
+        assertTrue(fs.isFile("/folder2/file"));
+
+        // Check that folder2 has been silently created
+        assertTrue(fs.exists("/folder2"));
+        assertTrue(fs.isFolder("/folder2"));
+        assertFalse(fs.isFile("/folder2"));
+    }
+    
+    public void testMoveFolder_destFolderDoesNotExist() throws Exception {
+        // Create a folder with a file
+        fs.createFolder("/folder");
+        createFile("/folder/file", sampleBytes);
+        // Check that the destination folder and file do not exist
+        assertFalse(fs.exists("/folder2"));
+        assertFalse(fs.exists("/folder2/folder3"));
+        assertFalse(fs.exists("/folder2/folder3/file"));
+
+        // Move the folder into a non-existent directory
+        fs.move("/folder", "/folder2/folder3");
+
+        // Assert
+        assertFalse(fs.exists("/folder"));
+        assertFalse(fs.exists("/folder/file"));
+        
+        assertTrue(fs.exists("/folder2"));
+        assertTrue(fs.isFolder("/folder2"));
+        assertFalse(fs.isFile("/folder2"));
+
+        assertTrue(fs.exists("/folder2/folder3"));
+        assertTrue(fs.isFolder("/folder2/folder3"));
+        assertFalse(fs.isFile("/folder2/folder3"));
+
+        assertTrue(fs.exists("/folder2/folder3/file"));
+        assertFalse(fs.isFolder("/folder2/folder3/file"));
+        assertTrue(fs.isFile("/folder2/folder3/file"));
+    }
+
     private void verifyStreamInput(
             InputStream inputStream, byte[] expectedBytes) throws IOException {
         byte[] resultBytes = new byte[3];