Index: fs/src/org/openide/filesystems/FileUtil.java =================================================================== RCS file: /cvs/openide/fs/src/org/openide/filesystems/FileUtil.java,v retrieving revision 1.25 diff -u -r1.25 FileUtil.java --- fs/src/org/openide/filesystems/FileUtil.java 28 Jul 2006 16:04:27 -0000 1.25 +++ fs/src/org/openide/filesystems/FileUtil.java 29 Aug 2006 17:38:42 -0000 @@ -39,6 +39,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.Stack; import java.util.StringTokenizer; import java.util.WeakHashMap; import java.util.jar.JarEntry; @@ -99,6 +100,96 @@ private FileUtil() { } + /** + * Returns FileObject for a folder. + * If such a folder does not exist then it is created, including any necessary but nonexistent parent + * folders. Note that if this operation fails it may have succeeded in creating some of the necessary + * parent folders. + * @param folder folder to be created + * @return FileObject for a folder + * @throws java.io.IOException if the creation fails + * @since 7.0 + */ + public static FileObject createFolder (final File folder) throws IOException { + FileObject retval = null; + File root = getRoot(folder); + if (!root.exists()) { + throw new IOException(folder.getAbsolutePath()); + } + FileObject rootFo = FileUtil.toFileObject(root); + assert rootFo != null : root.getAbsolutePath(); + final String relativePath = getRelativePath(root, folder); + try { + retval = FileUtil.createFolder(rootFo,relativePath); + } catch (IOException ex) { + //thus retval = null; + } + //if refresh needed because of external changes + if (retval == null || !retval.isValid()) { + rootFo.getFileSystem().refresh(false); + retval = FileUtil.createFolder(rootFo,relativePath); + } + assert retval != null; + return retval; + } + + /**Returns FileObject for a data file. + * If such a data file does not exist then it is created, including any necessary but nonexistent parent + * folders. Note that if this operation fails it may have succeeded in creating some of the necessary + * parent folders. + * @param data data file to be created + * @return FileObject for a data file + * @throws java.io.IOException if the creation fails + * @since 7.0 + */ + public static FileObject createData (final File data) throws IOException { + FileObject retval = null; + File root = getRoot(data); + if (!root.exists()) { + throw new IOException(data.getAbsolutePath()); + } + FileObject rootFo = FileUtil.toFileObject(root); + assert rootFo != null : root.getAbsolutePath(); + final String relativePath = getRelativePath(root, data); + try { + retval = FileUtil.createData(rootFo,relativePath); + } catch (IOException ex) { + //thus retval = null; + } + //if refresh needed because of external changes + if (retval == null || !retval.isValid()) { + rootFo.getFileSystem().refresh(false); + retval = FileUtil.createData(rootFo,relativePath); + } + assert retval != null; + return retval; + } + + private static File getRoot(final File dir) { + File retval = dir; + for (; retval.getParentFile() != null; retval = retval.getParentFile()); + assert retval != null; + return retval; + } + + private static String getRelativePath(final File dir, final File file) { + Stack stack = new Stack (); + File tempFile = file; + while(tempFile != null && !tempFile.equals(dir)) { + stack.push (tempFile.getName()); + tempFile = tempFile.getParentFile(); + } + assert tempFile != null : file.getAbsolutePath() + "not found in " + dir.getAbsolutePath();//NOI18N + StringBuilder retval = new StringBuilder(); + while (!stack.isEmpty()) { + retval.append((String)stack.pop()); + if (!stack.isEmpty()) { + retval.append("/");//NOI18N + } + } + return retval.toString(); + } + /** Copies stream of files. *

* Please be aware, that this method doesn't close any of passed streams. Index: masterfs/test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java =================================================================== RCS file: /cvs/openide/masterfs/test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java,v retrieving revision 1.33 diff -u -r1.33 MasterFileObjectTestHid.java --- masterfs/test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java 8 Aug 2006 15:54:12 -0000 1.33 +++ masterfs/test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java 29 Aug 2006 17:38:42 -0000 @@ -67,6 +67,112 @@ }; } + public void testCreateNotExistingFolderOrDataFile() throws IOException { + final File wDir = getWorkDir(); + final File fold = new File(wDir,"a/b/c"); + final File data = new File(fold,"c.data"); + implCreateFolderOrDataFile(wDir, fold, data); + } + + public void testCreateExistingFolderOrDataFile() throws IOException { + final File wDir = getWorkDir(); + final File fold = new File(wDir,"a/b/c"); + final File data = new File(fold,"c.data"); + + assertTrue(fold.mkdirs()); + assertTrue(data.createNewFile()); + + implCreateFolderOrDataFile(wDir, fold, data); + } + + public void testCreateFolderOrDataFileExternalChange() throws IOException { + final File wDir = getWorkDir(); + final File fold = new File(wDir,"a/b/c"); + final File data = new File(fold,"c.data"); + createFiles(data, fold); + + implCreateFolderOrDataFile(wDir, fold, data); + + FileObject foldFo = FileUtil.toFileObject(fold); + FileObject dataFo = FileUtil.toFileObject(data); + assertNotNull(foldFo); + assertNotNull(dataFo); + deleteFiles(data, wDir); + + implCreateFolderOrDataFile(wDir, fold, data); + + deleteFiles(data, wDir); + foldFo.getFileSystem().refresh(false); + foldFo = FileUtil.toFileObject(fold); + dataFo = FileUtil.toFileObject(data); + assertNull(foldFo); + assertNull(dataFo); + createFiles(data, fold); + + implCreateFolderOrDataFile(wDir, fold, data); + } + + public void testCreateFolderOrDataFileWithNotExistingRoot() throws Exception { + File wDir = null; + for (char d = 'A'; d < 'Z'; d++ ) { + wDir = new File(String.valueOf(d)+":/"); + if (!wDir.exists()) { + break; + } + } + final File fold = new File(wDir,"a/b/c"); + final File data = new File(fold,"c.data"); + try { + implCreateFolderOrDataFile(wDir, fold, data); + fail(); + } catch (IOException ex) { + } + } + + //just for JDK 1.6 + /*public void testCreateFolderOrDataFile_ReadOnly() throws Exception { + final File wDir = getWorkDir(); + final File fold = new File(wDir,"a/b/c"); + final File data = new File(fold,"a/b/c.data"); + assertTrue(getWorkDir().setReadOnly()); + try { + implCreateFolderOrDataFile(wDir, fold, data); + fail(); + } catch (IOException ex) { + } finally { + assertTrue(getWorkDir().setWritable(true)); + } + }*/ + + private static void createFiles(final File data, final File fold) throws IOException { + assertTrue(fold.mkdirs()); + assertTrue(data.createNewFile()); + } + + private static void deleteFiles(final File data, final File wDir) { + File tmp = data; + while(!tmp.equals(wDir)) { + assertTrue(tmp.delete()); + tmp = tmp.getParentFile(); + } + } + + private void implCreateFolderOrDataFile(final File wDir, final File fold, final File data) throws IOException { + FileObject foldFo = FileUtil.createFolder(fold); + assertNotNull(foldFo); + assertTrue(foldFo.isValid()); + assertNotNull(FileUtil.toFile(foldFo)); + assertEquals(FileUtil.toFile(foldFo),fold); + assertTrue(foldFo.isFolder()); + + FileObject dataFo = FileUtil.createData(data); + assertNotNull(dataFo); + assertTrue(dataFo.isValid()); + assertNotNull(FileUtil.toFile(dataFo)); + assertEquals(FileUtil.toFile(dataFo),data); + assertTrue(dataFo.isData()); + } + public void testGetNameExt2() throws IOException { FileObject fold1 = FileUtil.createFolder( FileBasedFileSystem.getFileObject(getWorkDir()),getName());