? subdel.diff Index: apichanges.xml =================================================================== RCS file: /cvs/openide/masterfs/apichanges.xml,v retrieving revision 1.2.2.2 diff -u -r1.2.2.2 apichanges.xml --- apichanges.xml 28 Jun 2006 07:20:17 -0000 1.2.2.2 +++ apichanges.xml 1 Aug 2006 10:01:29 -0000 @@ -23,6 +23,24 @@ MasterFileSystem API + + + ProvidedExtensions.getDeleteHandler was added. + + + + + +

+ ProvidedExtensions.getDeleteHandler was added, which + is the way how to impose handlers for + deleting into mastersfs implementation + which was required by module org.netbeans.modules.subversion. +

+
+ + +
ProvidedExtensions was added. Index: manifest.mf =================================================================== RCS file: /cvs/openide/masterfs/manifest.mf,v retrieving revision 1.11.16.1.2.3 diff -u -r1.11.16.1.2.3 manifest.mf --- manifest.mf 12 Jul 2006 15:07:29 -0000 1.11.16.1.2.3 +++ manifest.mf 1 Aug 2006 10:01:29 -0000 @@ -1,5 +1,5 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.masterfs/1 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/masterfs/resources/Bundle.properties -OpenIDE-Module-Specification-Version: 1.8.22 +OpenIDE-Module-Specification-Version: 1.8.23 Index: src/org/netbeans/modules/masterfs/MasterFileObject.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/MasterFileObject.java,v retrieving revision 1.45.2.1.2.2 retrieving revision 1.45.2.1.2.2.4.3 diff -u -r1.45.2.1.2.2 -r1.45.2.1.2.2.4.3 --- src/org/netbeans/modules/masterfs/MasterFileObject.java 28 Jun 2006 07:20:20 -0000 1.45.2.1.2.2 +++ src/org/netbeans/modules/masterfs/MasterFileObject.java 28 Jul 2006 14:14:42 -0000 1.45.2.1.2.2.4.3 @@ -23,6 +23,7 @@ import java.io.File; import org.netbeans.modules.masterfs.filebasedfs.FileBasedFileSystem; import org.netbeans.modules.masterfs.filebasedfs.fileobjects.BaseFileObj; +import org.netbeans.modules.masterfs.filebasedfs.naming.FileNaming; import org.openide.ErrorManager; import org.openide.filesystems.*; @@ -83,7 +84,7 @@ public boolean isValid() { FileObject deleg = getValidOrInvalid(getDelegate().getPrefered()); File f = (deleg.isVirtual()) ? null: getResource().getFile(); - return (f != null) ? (deleg.isValid() && f.exists()) : deleg.isValid(); + return (f != null) ? (deleg.isValid() && (f.exists())) : deleg.isValid(); } /** @@ -291,13 +292,15 @@ } if (canRefresh) { if (f != null && f.exists()) { - this.refresh(); - if (deleg instanceof BaseFileObj) {//#54856 - FileObject child = deleg.getFileObject(name, ext); - retVal = (child != null) ? transformChild(child) : null; - } else { - retVal = getCache().getOrCreate(childResourcePath); - } + if (getDeleteHandler(f) == null) { + this.refresh(); + if (deleg instanceof BaseFileObj) {//#54856 + FileObject child = deleg.getFileObject(name, ext); + retVal = (child != null) ? transformChild(child) : null; + } else { + retVal = getCache().getOrCreate(childResourcePath); + } + } } } } @@ -589,7 +592,7 @@ finishCriticalSection(); } } - + private ProvidedExtensions.IOHandler getRenameHandler(final String name, final String ext) { ProvidedExtensions pe; pe = ((MasterFileSystem.StatusImpl)MasterFileSystem.getDefault().getStatus()).getExtensions(); @@ -907,9 +910,19 @@ FileEvent fe2Fire = new FileEvent(MasterFileObject.this, eventFile, fe.isExpected()); FileObject eventFileDelegate = eventFile.getDelegate().get(); FileObject meDelegate = MasterFileObject.this.getDelegate().get(); - - if (eventFileDelegate == fe.getFile() && meDelegate == fe.getSource()) { - fireFileDeletedEvent(getEnumOfListeners(), fe2Fire); + if (fe.getFile() instanceof BaseFileObj && eventFileDelegate instanceof BaseFileObj + && fe.getSource() instanceof BaseFileObj && meDelegate instanceof BaseFileObj) { + FileNaming fName = ((BaseFileObj)fe.getFile()).getFileName(); + FileNaming sName = ((BaseFileObj)fe.getSource()).getFileName(); + FileNaming f1Name = ((BaseFileObj)eventFileDelegate).getFileName(); + FileNaming s1Name = ((BaseFileObj)meDelegate).getFileName(); + if (fName.equals(f1Name) && sName.equals(s1Name)) { + fireFileDeletedEvent(getEnumOfListeners(), fe2Fire); + } + } else { + if (eventFileDelegate == fe.getFile() && meDelegate == fe.getSource()) { + fireFileDeletedEvent(getEnumOfListeners(), fe2Fire); + } } } @@ -960,6 +973,13 @@ } } + private static ProvidedExtensions.DeleteHandler getDeleteHandler(File f) { + ProvidedExtensions pe; + pe = ((MasterFileSystem.StatusImpl)MasterFileSystem.getDefault().getStatus()).getExtensions(); + + return pe.getDeleteHandler(f); + } + private static final class AtomicAction implements FileSystem.AtomicAction { private int operation; private final MasterFileObject hfoI; @@ -1123,7 +1143,12 @@ private void delete() throws IOException { FileObject deleg = getValidOrInvalid(hfoI.getDelegate().get(), hfoI); FileLock lck = Delegate.getLockForDelegate(fLockI, deleg); - deleg.delete(lck); + if (deleg instanceof BaseFileObj) { + ((BaseFileObj)deleg).delete(lck, + MasterFileObject.getDeleteHandler(((BaseFileObj)deleg).getFileName().getFile())); + } else { + deleg.delete(lck); + } } private void move() throws IOException { @@ -1154,7 +1179,7 @@ retVal = hfoI.superMove(fLockI, targetI, nameI, extI); } } - + private ProvidedExtensions.IOHandler getMoveHandler() { ProvidedExtensions pe; pe = ((MasterFileSystem.StatusImpl)MasterFileSystem.getDefault().getStatus()).getExtensions(); Index: src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java,v retrieving revision 1.2.10.2 retrieving revision 1.2.10.2.4.2 diff -u -r1.2.10.2 -r1.2.10.2.4.2 --- src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java 28 Jun 2006 07:20:20 -0000 1.2.10.2 +++ src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java 25 Jul 2006 13:06:50 -0000 1.2.10.2.4.2 @@ -41,6 +41,18 @@ this.annotationProviders = annotationProviders; } + public ProvidedExtensions.DeleteHandler getDeleteHandler(final File f) { + ProvidedExtensions.DeleteHandler retValue = null; + for (Iterator it = annotationProviders.iterator(); it.hasNext() && retValue == null;) { + AnnotationProvider provider = (AnnotationProvider) it.next(); + final InterceptionListener iListener = (provider != null) ? provider.getInterceptionListener() : null; + if (iListener instanceof ProvidedExtensions) { + retValue = ((ProvidedExtensions)iListener).getDeleteHandler(f); + } + } + return retValue; + } + public ProvidedExtensions.IOHandler getRenameHandler(final File from, final String newName) { final File to = new File(from.getParentFile(), newName); IOHandler retValue = null; @@ -124,5 +136,5 @@ iListener.beforeDelete(fo); } } - } + } } Index: src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenCache.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenCache.java,v retrieving revision 1.3.58.1 retrieving revision 1.3.58.1.4.1 diff -u -r1.3.58.1 -r1.3.58.1.4.1 --- src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenCache.java 28 Jun 2006 07:20:22 -0000 1.3.58.1 +++ src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenCache.java 21 Jul 2006 14:11:22 -0000 1.3.58.1.4.1 @@ -32,6 +32,14 @@ Set getChildren(boolean rescan); FileNaming getChild(String childName, boolean rescan); + + /** + * Added because of subversion support, please do don't use + * this method and use rather FileNaming getChild(String childName, boolean rescan) + * This method is just good for keeping cache in state that doesn't correspond + * with disk status. + */ + void removeChild(String childName); boolean existsInCache(String childName); Index: src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenSupport.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenSupport.java,v retrieving revision 1.10.42.2 retrieving revision 1.10.42.2.4.1 diff -u -r1.10.42.2 -r1.10.42.2.4.1 --- src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenSupport.java 28 Jun 2006 07:20:22 -0000 1.10.42.2 +++ src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenSupport.java 21 Jul 2006 14:11:22 -0000 1.10.42.2.4.1 @@ -94,6 +94,13 @@ return lookupChildInCache(folder, childName) != null; } + public void removeChild(final FileNaming folderName, final String childName) { + FileName fName = lookupChildInCache(folderName, childName); + if (fName != null) { + getChildrenCache().remove(fName); + } + } + private FileName lookupChildInCache(final FileNaming folder, final String childName) { final File f = new File(folder.getFile(), childName); final Integer id = NamingFactory.createID(f); Index: src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java,v retrieving revision 1.16.16.2.2.2 retrieving revision 1.16.16.2.2.2.4.3 diff -u -r1.16.16.2.2.2 -r1.16.16.2.2.2.4.3 --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java 28 Jun 2006 07:20:22 -0000 1.16.16.2.2.2 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java 31 Jul 2006 15:17:32 -0000 1.16.16.2.2.2.4.3 @@ -19,6 +19,7 @@ package org.netbeans.modules.masterfs.filebasedfs.fileobjects; +import java.util.Iterator; import org.netbeans.modules.masterfs.filebasedfs.FileBasedFileSystem; import org.netbeans.modules.masterfs.filebasedfs.Statistics; import org.netbeans.modules.masterfs.filebasedfs.children.ChildrenCache; @@ -33,8 +34,11 @@ import javax.swing.event.EventListenerList; import java.io.*; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.Enumeration; +import java.util.List; import org.netbeans.modules.masterfs.providers.ProvidedExtensions; /** @@ -188,15 +192,31 @@ final String originalExt = getExt(); //TODO: no lock used - if (!NamingFactory.rename(getFileName(),file2Rename.getName(),handler)) { + FileNaming[] allRenamed = NamingFactory.rename(getFileName(),file2Rename.getName(),handler); + if (allRenamed == null) { FileObject parentFo = getExistingParent(); String parentPath = (parentFo != null) ? parentFo.getPath() : file.getParentFile().getAbsolutePath(); FSException.io("EXC_CannotRename", file.getName(), parentPath, file2Rename.getName());// NOI18N } - FileBasedFileSystem fs = getLocalFileSystem(); fs.getFactory().rename(); BaseFileObj.attribs.renameAttributes(file.getAbsolutePath().replace('\\', '/'), file2Rename.getAbsolutePath().replace('\\', '/'));//NOI18N + for (int i = 0; i < allRenamed.length; i++) { + FolderObj par = (allRenamed[i].getParent() != null) ? + (FolderObj)fs.getFactory().get(allRenamed[i].getParent().getFile()) : null; + if (par != null) { + ChildrenCache childrenCache = par.getChildrenCache(); + final Mutex.Privileged mutexPrivileged = (childrenCache != null) ? childrenCache.getMutexPrivileged() : null; + if (mutexPrivileged != null) mutexPrivileged.enterWriteAccess(); + try { + childrenCache.removeChild(allRenamed[i].getName()); + childrenCache.getChild(allRenamed[i].getName(), true); + } finally { + if (mutexPrivileged != null) mutexPrivileged.exitWriteAccess(); + } + } + } + fireFileRenamedEvent(originalName, originalExt); } @@ -384,8 +404,12 @@ public final FileNaming getFileName() { return fileName; } + + public final void delete(final FileLock lock) throws IOException { + delete(lock, null); + } - public void delete(final FileLock lock) throws IOException { + public void delete(final FileLock lock, ProvidedExtensions.DeleteHandler deleteHandler) throws IOException { final File f = getFileName().getFile(); final FolderObj existingParent = getExistingParent(); @@ -398,13 +422,20 @@ FSException.io("EXC_InvalidLock", lock, getPath()); // NOI18N } - if (!f.delete()) { + boolean deleteStatus = (deleteHandler != null) ? deleteHandler.delete(f) : f.delete(); + if (!deleteStatus) { FileObject parent = getExistingParent(); String parentPath = (parent != null) ? parent.getPath() : f.getParentFile().getAbsolutePath(); FSException.io("EXC_CannotDelete", f.getName(), parentPath);// NOI18N } BaseFileObj.attribs.deleteAttributes(f.getAbsolutePath().replace('\\', '/'));//NOI18N - if (childrenCache != null) childrenCache.getChild(BaseFileObj.getNameExt(f), true); + if (childrenCache != null) { + if (deleteHandler != null) { + childrenCache.removeChild(BaseFileObj.getNameExt(f)); + } else { + childrenCache.getChild(BaseFileObj.getNameExt(f), true); + } + } } finally { if (mutexPrivileged != null) mutexPrivileged.exitWriteAccess(); setValid(false); @@ -413,7 +444,7 @@ fireFileDeletedEvent(false); } - + abstract boolean checkLock(FileLock lock) throws IOException; public Object writeReplace() { @@ -423,6 +454,7 @@ abstract protected void setValid(boolean valid); abstract public void refresh(final boolean expected, boolean fire); + //TODO: attributes written by VCS must be readable by FileBaseFS and vice versa /** Index: src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObj.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObj.java,v retrieving revision 1.12.8.1.2.2 retrieving revision 1.12.8.1.2.2.4.1 diff -u -r1.12.8.1.2.2 -r1.12.8.1.2.2.4.1 --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObj.java 28 Jun 2006 07:20:23 -0000 1.12.8.1.2.2 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObj.java 27 Jul 2006 15:08:09 -0000 1.12.8.1.2.2.4.1 @@ -29,14 +29,15 @@ import java.util.Date; import java.util.Enumeration; import org.netbeans.modules.masterfs.filebasedfs.Statistics; +import org.netbeans.modules.masterfs.filebasedfs.children.ChildrenCache; import org.netbeans.modules.masterfs.filebasedfs.naming.FileNaming; import org.netbeans.modules.masterfs.filebasedfs.utils.FSException; import org.netbeans.modules.masterfs.filebasedfs.utils.FileInfo; import org.netbeans.modules.masterfs.providers.ProvidedExtensions; import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; import org.openide.util.Enumerations; +import org.openide.util.Mutex; /** * @author rm111737 @@ -189,11 +190,23 @@ boolean validityFlag = getFileName().getFile().exists(); if (!validityFlag) { //fileobject is invalidated + FolderObj parent = getExistingParent(); + if (parent != null) { + ChildrenCache childrenCache = parent.getChildrenCache(); + final Mutex.Privileged mutexPrivileged = (childrenCache != null) ? childrenCache.getMutexPrivileged() : null; + if (mutexPrivileged != null) mutexPrivileged.enterWriteAccess(); + try { + childrenCache.getChild(getFileName().getFile().getName(),true); + } finally { + if (mutexPrivileged != null) mutexPrivileged.exitWriteAccess(); + } + + } setValid(false); if (fire) { - fireFileDeletedEvent(expected); - } - } + fireFileDeletedEvent(expected); + } + } } stopWatch.stop(); } Index: src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObj.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObj.java,v retrieving revision 1.12.2.1.2.2 retrieving revision 1.12.2.1.2.2.4.3 diff -u -r1.12.2.1.2.2 -r1.12.2.1.2.2.4.3 --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObj.java 28 Jun 2006 07:20:23 -0000 1.12.2.1.2.2 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObj.java 25 Jul 2006 14:33:13 -0000 1.12.2.1.2.2.4.3 @@ -34,6 +34,7 @@ import java.io.*; import java.util.*; import org.netbeans.modules.masterfs.filebasedfs.naming.NamingFactory; +import org.netbeans.modules.masterfs.providers.ProvidedExtensions; /** * @author rm111737 @@ -214,18 +215,18 @@ } } - public final void delete(final FileLock lock) throws IOException { + public void delete(final FileLock lock, ProvidedExtensions.DeleteHandler deleteHandler) throws IOException { final LinkedList all = new LinkedList(); final File file = getFileName().getFile(); - if (!deleteFile(file, all, getLocalFileSystem().getFactory())) { + if (!deleteFile(file, all, getLocalFileSystem().getFactory(), deleteHandler)) { FileObject parent = getExistingParent(); String parentPath = (parent != null) ? parent.getPath() : file.getParentFile().getAbsolutePath(); FSException.io("EXC_CannotDelete", file.getName(), parentPath);// NOI18N } BaseFileObj.attribs.deleteAttributes(file.getAbsolutePath().replace('\\', '/'));//NOI18N - + setValid(false); for (int i = 0; i < all.size(); i++) { final BaseFileObj toDel = (BaseFileObj) all.get(i); final FolderObj existingParent = toDel.getExistingParent(); @@ -233,8 +234,14 @@ if (childrenCache != null) { final Mutex.Privileged mutexPrivileged = (childrenCache != null) ? childrenCache.getMutexPrivileged() : null; if (mutexPrivileged != null) mutexPrivileged.enterWriteAccess(); - try { - childrenCache.getChild(BaseFileObj.getNameExt(file), true); + try { + if (deleteHandler != null) { + childrenCache.removeChild(BaseFileObj.getNameExt(file)); + } else { + childrenCache.getChild(BaseFileObj.getNameExt(file), true); + } + + } finally { if (mutexPrivileged != null) mutexPrivileged.exitWriteAccess(); } @@ -344,8 +351,8 @@ } //TODO: rewrite partly and check FileLocks for existing FileObjects - private boolean deleteFile(final File file, final LinkedList all, final FileObjectFactory factory) throws IOException { - final boolean ret = file.delete(); + private boolean deleteFile(final File file, final LinkedList all, final FileObjectFactory factory, ProvidedExtensions.DeleteHandler deleteHandler) throws IOException { + final boolean ret = (deleteHandler != null) ? deleteHandler.delete(file) : file.delete(); if (ret) { final FileObject aliveFo = factory.get(file); @@ -364,7 +371,7 @@ final File[] arr = file.listFiles(); for (int i = 0; i < arr.length; i++) { final File f2Delete = arr[i]; - if (!deleteFile(f2Delete, all, factory)) { + if (!deleteFile(f2Delete, all, factory, deleteHandler)) { return false; } } @@ -374,7 +381,7 @@ //super.delete(lock()); - final boolean retVal = file.delete(); + final boolean retVal = (deleteHandler != null) ? deleteHandler.delete(file) : file.delete(); if (retVal) { final FileObject aliveFo = factory.get(file); if (aliveFo != null) { @@ -470,6 +477,10 @@ public boolean existsInCache(String childName) { return ch.existsldInCache(getFileName(), childName); + } + + public void removeChild(String childName) { + ch.removeChild(getFileName(), childName); } } Index: src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/ReplaceForSerialization.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/ReplaceForSerialization.java,v retrieving revision 1.4.58.2 retrieving revision 1.4.58.2.4.1 diff -u -r1.4.58.2 -r1.4.58.2.4.1 --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/ReplaceForSerialization.java 28 Jun 2006 07:20:23 -0000 1.4.58.2 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/ReplaceForSerialization.java 21 Jul 2006 14:11:21 -0000 1.4.58.2.4.1 @@ -20,6 +20,7 @@ package org.netbeans.modules.masterfs.filebasedfs.fileobjects; import org.netbeans.modules.masterfs.filebasedfs.FileBasedFileSystem; +import org.netbeans.modules.masterfs.providers.ProvidedExtensions; import org.openide.filesystems.*; import java.io.*; @@ -53,10 +54,10 @@ super(file); } - public void delete(FileLock lock) throws IOException { + public void delete(FileLock lock, ProvidedExtensions.IOHandler io) throws IOException { throw new IOException(getPath()); } - + boolean checkLock(FileLock lock) throws IOException { return false; } Index: src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java,v retrieving revision 1.5.28.1.2.2 retrieving revision 1.5.28.1.2.2.4.1 diff -u -r1.5.28.1.2.2 -r1.5.28.1.2.2.4.1 --- src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java 28 Jun 2006 07:20:25 -0000 1.5.28.1.2.2 +++ src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java 31 Jul 2006 13:23:56 -0000 1.5.28.1.2.2.4.1 @@ -66,20 +66,22 @@ } } - public static synchronized boolean rename (FileNaming fNaming, String newName) { + private static synchronized FileNaming[] rename (FileNaming fNaming, String newName) { return rename(fNaming, newName, null); } - public static synchronized boolean rename (FileNaming fNaming, String newName, ProvidedExtensions.IOHandler handler) { + public static synchronized FileNaming[] rename (FileNaming fNaming, String newName, ProvidedExtensions.IOHandler handler) { + final ArrayList all = new ArrayList(); boolean retVal = false; remove(fNaming, null); retVal = fNaming.rename(newName, handler); + all.add(fNaming); NamingFactory.registerInstanceOfFileNaming(fNaming.getParent(), fNaming.getFile(), fNaming); - renameChildren(); - return retVal; + renameChildren(all); + return (retVal) ? ((FileNaming[])all.toArray(new FileNaming[all.size()])) : null; } - private static void renameChildren() { + private static void renameChildren(final ArrayList all) { HashMap toRename = new HashMap (); for (Iterator iterator = nameMap.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); @@ -101,7 +103,7 @@ Map.Entry entry = (Map.Entry) iterator.next(); Integer id = (Integer)entry.getKey(); FileNaming fN = (FileNaming)entry.getValue(); - + all.add(fN); remove(fN, id); fN.getId(true); NamingFactory.registerInstanceOfFileNaming(fN.getParent(), fN.getFile(), fN); Index: src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java,v retrieving revision 1.2.10.2 diff -u -r1.2.10.2 ProvidedExtensions.java --- src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java 28 Jun 2006 07:20:27 -0000 1.2.10.2 +++ src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java 1 Aug 2006 10:01:29 -0000 @@ -72,6 +72,21 @@ File from, String newName) { return null; } + + /* + * Return instance of {@link ProvidedExtensions.DeleteHandler} + * that is responsible for deleting the file or null. + * + * Just the first non null instance of DeleteHandler is used by + * MasterFileSystem + * + * @param f file or folder to be deleted + * @return instance of {@link ProvidedExtensions.DeleteHandler} + * that is responsible for deleting the file or null + */ + public ProvidedExtensions.DeleteHandler getDeleteHandler(File f) { + return null; + } public interface IOHandler { @@ -80,6 +95,19 @@ */ void handle() throws IOException; } + + public interface DeleteHandler { + /** + * Deletes the file or directory denoted by this abstract pathname. If + * this pathname denotes a directory, then the directory must be empty in + * order to be deleted. + * + * @return true if and only if the file or directory is + * successfully deleted; false otherwise + */ + boolean delete(File file); + } + public void createSuccess(FileObject fo) {} public void createFailure(FileObject parent, String name, boolean isFolder) {} Index: test/unit/src/org/netbeans/modules/masterfs/CacheTest.java =================================================================== RCS file: /cvs/openide/masterfs/test/unit/src/org/netbeans/modules/masterfs/CacheTest.java,v retrieving revision 1.2.6.2.2.1 retrieving revision 1.2.6.2.2.1.4.1 diff -u -r1.2.6.2.2.1 -r1.2.6.2.2.1.4.1 --- test/unit/src/org/netbeans/modules/masterfs/CacheTest.java 28 Jun 2006 07:20:28 -0000 1.2.6.2.2.1 +++ test/unit/src/org/netbeans/modules/masterfs/CacheTest.java 27 Jul 2006 16:03:54 -0000 1.2.6.2.2.1.4.1 @@ -22,9 +22,8 @@ import java.io.File; import java.lang.ref.Reference; import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; import org.netbeans.junit.NbTestCase; +import org.netbeans.modules.masterfs.providers.ProvidedExtensionsTest; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; @@ -58,7 +57,9 @@ testFo.getFileSystem().findResource(testFo.getPath()); FileObject testFo2 = Cache.getDefault().getValidOrInvalid(((MasterFileObject)testFo).getResource()); - assertFalse(testFo2.isValid()); + if (!ProvidedExtensionsTest.ProvidedExtensionsImpl.isImplsDeleteRetVal()) { + assertFalse(testFo2.isValid()); + } assertEquals(testFo, testFo2); } Index: 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.24.6.1.2.2 retrieving revision 1.24.6.1.2.2.2.1 diff -u -r1.24.6.1.2.2 -r1.24.6.1.2.2.2.1 --- test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java 10 Jul 2006 14:18:03 -0000 1.24.6.1.2.2 +++ test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java 21 Jul 2006 14:11:22 -0000 1.24.6.1.2.2.2.1 @@ -36,6 +36,7 @@ import javax.swing.filechooser.FileSystemView; import org.netbeans.modules.masterfs.filebasedfs.fileobjects.WriteLockUtils; +import org.netbeans.modules.masterfs.providers.ProvidedExtensionsTest; public class MasterFileObjectTestHid extends TestBaseHid{ private FileObject root; @@ -431,8 +432,10 @@ } }); - assertNotNull(fo.getFileObject("newchild.txt")); - assertTrue(list.size() == 1); + if (!ProvidedExtensionsTest.ProvidedExtensionsImpl.isImplsDeleteRetVal()) { + assertNotNull(fo.getFileObject("newchild.txt")); + assertTrue(list.size() == 1); + } fo.removeFileChangeListener(fcl); } @@ -535,10 +538,12 @@ MountTable mt = MountTable.getDefault(); mt.mount(mountFile.getAbsolutePath(), ifs); - - mountDir.delete(); - assertTrue(!mountDir.isValid()); - assertNull(root.getFileObject("testdir/mountdir")); + + if (!ProvidedExtensionsTest.ProvidedExtensionsImpl.isImplsDeleteRetVal()) { + mountDir.delete(); + assertTrue(!mountDir.isValid()); + assertNull(root.getFileObject("testdir/mountdir")); + } } public void testDeleteCaptureExteralChanges () throws Exception { @@ -553,7 +558,9 @@ assertTrue(f.exists()); assertTrue (f.delete()); - assertFalse(fileObject.isValid()); + if (!ProvidedExtensionsTest.ProvidedExtensionsImpl.isImplsDeleteRetVal()) { + assertFalse(fileObject.isValid()); + } } public void testFindResourceCaptureExteralChanges () throws Exception { Index: test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemTest.java =================================================================== RCS file: /cvs/openide/masterfs/test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemTest.java,v retrieving revision 1.7.72.2 retrieving revision 1.7.72.2.4.1 diff -u -r1.7.72.2 -r1.7.72.2.4.1 --- test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemTest.java 28 Jun 2006 07:20:29 -0000 1.7.72.2 +++ test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemTest.java 21 Jul 2006 14:11:22 -0000 1.7.72.2.4.1 @@ -58,7 +58,7 @@ super(test); ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsMoveRetVal(false); ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsRenameRetVal(false); - + ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsDeleteRetVal(false); } Index: test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemWithExtensionsTest.java =================================================================== RCS file: /cvs/openide/masterfs/test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemWithExtensionsTest.java,v retrieving revision 1.2.10.2 retrieving revision 1.2.10.2.4.1 diff -u -r1.2.10.2 -r1.2.10.2.4.1 --- test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemWithExtensionsTest.java 28 Jun 2006 07:20:29 -0000 1.2.10.2 +++ test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemWithExtensionsTest.java 21 Jul 2006 14:11:22 -0000 1.2.10.2.4.1 @@ -31,6 +31,7 @@ super(test); ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsMoveRetVal(true); ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsRenameRetVal(true); + ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsDeleteRetVal(true); } public static Test suite() { Index: test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObjTest.java =================================================================== RCS file: /cvs/openide/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObjTest.java,v retrieving revision 1.6.18.2.2.1 retrieving revision 1.6.18.2.2.1.4.1 diff -u -r1.6.18.2.2.1 -r1.6.18.2.2.1.4.1 --- test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObjTest.java 28 Jun 2006 07:20:30 -0000 1.6.18.2.2.1 +++ test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObjTest.java 27 Jul 2006 15:08:09 -0000 1.6.18.2.2.1.4.1 @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; +import java.util.Iterator; import java.util.List; import org.netbeans.junit.NbTestCase; import org.netbeans.modules.masterfs.filebasedfs.FileBasedFileSystem; @@ -303,6 +304,45 @@ f = f.getParentFile(); } + } + + public void testGetChildrenStackOwerflow() throws Exception { + File f = testFile; + assertTrue(f.exists()); + assertTrue(f.isDirectory()); + FileSystem fs = FileBasedFileSystem.getInstance(f); + assertNotNull(fs); + final FileObject fo = fs.findResource(f.getAbsolutePath()); + assertNotNull(f.getAbsolutePath(),fo); + assertTrue(fo.isFolder()); + assertEquals(0,fo.getChildren().length); + assertTrue(new File(f,"child1").createNewFile()); + assertTrue(new File(f,"child2").createNewFile()); + final File child3 = new File(f,"child3"); + assertTrue(child3.createNewFile()); + final List keepThem = new ArrayList(); + fo.addFileChangeListener(new FileChangeAdapter(){ + public void fileDeleted(FileEvent fe) { + for (Iterator it = keepThem.iterator(); it.hasNext();) { + FileObject fodel = (FileObject) it.next(); + FileObject[] all = fo.getChildren(); + for (int i = 0; i < all.length; i++) { + all[i].refresh(); + } + + } + } + + public void fileDataCreated(FileEvent fe) { + FileObject ffoo = fe.getFile(); + keepThem.add(ffoo); + ((BaseFileObj)ffoo).getFileName().getFile().delete(); + ffoo.refresh(); + } + } ); + + fo.refresh(); + assertEquals(0,fo.getChildren().length); } /** Index: test/unit/src/org/netbeans/modules/masterfs/providers/ProvidedExtensionsTest.java =================================================================== RCS file: /cvs/openide/masterfs/test/unit/src/org/netbeans/modules/masterfs/providers/ProvidedExtensionsTest.java,v retrieving revision 1.2.10.2 retrieving revision 1.2.10.2.4.3 diff -u -r1.2.10.2 -r1.2.10.2.4.3 --- test/unit/src/org/netbeans/modules/masterfs/providers/ProvidedExtensionsTest.java 28 Jun 2006 07:20:31 -0000 1.2.10.2 +++ test/unit/src/org/netbeans/modules/masterfs/providers/ProvidedExtensionsTest.java 27 Jul 2006 16:03:54 -0000 1.2.10.2.4.3 @@ -20,6 +20,7 @@ package org.netbeans.modules.masterfs.providers; import java.io.File; +import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -27,8 +28,10 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import junit.framework.AssertionFailedError; import org.netbeans.junit.NbTestCase; import org.netbeans.modules.masterfs.filebasedfs.FileBasedFileSystem; @@ -368,6 +371,7 @@ private static boolean implsMoveRetVal = true; private static boolean implsRenameRetVal = true; + private static boolean implsDeleteRetVal = true; public static FileLock lock; @@ -377,7 +381,31 @@ implsRenameCalls = 0; renameImplCalls = 0; } - + + public ProvidedExtensions.DeleteHandler getDeleteHandler(File f) { + return (!isImplsDeleteRetVal()) ? null : new ProvidedExtensions.DeleteHandler(){ + final Set s = new HashSet(); + public boolean delete(File file) { + if (file.isDirectory()) { + File[] childs = file.listFiles(new FileFilter() { + public boolean accept(File pathname) { + boolean accepted = pathname.isFile(); + if (!accepted && pathname.isDirectory()) { + accepted = !s.contains(pathname); + if (!s.contains(pathname)) { + s.add(pathname); + } + } + return accepted; + } + }); + return childs.length == 0; + } + return file.delete(); + } + }; + } + public ProvidedExtensions.IOHandler getRenameHandler(final File from, final String newName) { implsRenameCalls++; final File f = new File(from.getParentFile(),newName); @@ -441,5 +469,13 @@ public static void setImplsRenameRetVal(boolean implsRenameRetVal) { ProvidedExtensionsImpl.implsRenameRetVal = implsRenameRetVal; } + + public static boolean isImplsDeleteRetVal() { + return implsDeleteRetVal; + } + + public static void setImplsDeleteRetVal(boolean implsDeleteRetVal) { + ProvidedExtensionsImpl.implsDeleteRetVal = implsDeleteRetVal; + } } }