[VFS] Rename write-open file?

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[VFS] Rename write-open file?

Bernd Eckenfels
Hello,

I am currently implementing a database Blob provider, and while writing  
some unit tests I noticed that VFS is not catching the case that a file is  
(still) open. It will happily call doRename(). Afterwards both source and  
target file objects are isContentOpen==false.

Is this the intended behaviour? For some providers a opened file might not  
exist and they will fail (ram provider). Currently the DB Blob behaves the  
same.

This is my unit test for the ram provider and the failure to rename (the  
not existing object):

     @Test
     public void testRenameOpen() throws IOException
     {
         final long now = System.currentTimeMillis();

         final FileObject testFile = manager.resolveFile("ram:/fo5-old",  
smallSizedFso);
         final FileObject targetFile = manager.resolveFile("ram:/fo5-new",  
smallSizedFso);
         assertEquals(false, testFile.exists());
         assertEquals(FileType.IMAGINARY, testFile.getType());

         OutputStream os = testFile.getContent().getOutputStream();
         assertEquals(false, testFile.exists());
         os.write(255);
         //not closed -> not exist
         assertEquals(false, testFile.exists());
         assertEquals(true,  testFile.isContentOpen());

         try{
         testFile.moveTo(targetFile); // Throws:
         } catch (FileSystemException ignored) { }

         assertEquals(false,  testFile.isContentOpen()); // if fails -> true
         assertEquals(false,  targetFile.isContentOpen());
     }

If I dont catch it, this stacktrace is visible:

org.apache.commons.vfs2.FileSystemException: Could not rename  
"ram:///fo5-old" to "ram:///fo5-new".
        at  
org.apache.commons.vfs2.provider.AbstractFileObject.moveTo(AbstractFileObject.java:1353)
        at  
org.apache.commons.vfs2.provider.ram.test.CustomRamProviderTest.testRenameOpen(CustomRamProviderTest.java:289)
...
        at  
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.commons.vfs2.FileSystemException: Unknown message  
with code "File does not exist: ram:///fo5-old".
        at  
org.apache.commons.vfs2.provider.ram.RamFileSystem.rename(RamFileSystem.java:195)
        at  
org.apache.commons.vfs2.provider.ram.RamFileObject.doRename(RamFileObject.java:188)
        at  
org.apache.commons.vfs2.provider.AbstractFileObject.moveTo(AbstractFileObject.java:1339)
        ... 26 more

--
http://bernd.eckenfels.net

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]