Index: apichanges.xml =================================================================== RCS file: /cvs/openide/masterfs/apichanges.xml,v retrieving revision 1.3 diff -u -r1.3 apichanges.xml --- apichanges.xml 1 Jul 2006 09:08:42 -0000 1.3 +++ apichanges.xml 1 Aug 2006 09:53:21 -0000 @@ -42,6 +42,24 @@ + + + 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. +

+
+ + +
Index: manifest.mf =================================================================== RCS file: /cvs/openide/masterfs/manifest.mf,v retrieving revision 1.15 diff -u -r1.15 manifest.mf --- manifest.mf 8 Jun 2006 16:00:42 -0000 1.15 +++ manifest.mf 1 Aug 2006 09:53:21 -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.9 +OpenIDE-Module-Specification-Version: 1.10 Index: src/org/netbeans/modules/masterfs/MasterFileObject.java =================================================================== RCS file: /cvs/openide/masterfs/src/org/netbeans/modules/masterfs/MasterFileObject.java,v retrieving revision 1.55 diff -u -r1.55 MasterFileObject.java --- src/org/netbeans/modules/masterfs/MasterFileObject.java 3 Jul 2006 09:08:37 -0000 1.55 +++ src/org/netbeans/modules/masterfs/MasterFileObject.java 1 Aug 2006 09:53:21 -0000 @@ -23,6 +23,9 @@ 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.*; import org.openide.util.Utilities; import org.netbeans.modules.masterfs.filebasedfs.fileobjects.ReplaceForSerialization; @@ -85,7 +88,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(); } /** @@ -293,13 +296,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); + } + } } } } @@ -572,7 +577,7 @@ finishCriticalSection(); } } - + private ProvidedExtensions.IOHandler getRenameHandler(final String name, final String ext) { ProvidedExtensions pe; pe = ((MasterFileSystem.StatusImpl)MasterFileSystem.getDefault().getStatus()).getExtensions(); @@ -894,9 +899,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); + } } } @@ -947,6 +962,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; @@ -1110,7 +1132,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 { @@ -1141,7 +1168,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.3 diff -u -r1.3 ProvidedExtensionsProxy.java --- src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java 1 Jul 2006 09:08:44 -0000 1.3 +++ src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java 1 Aug 2006 09:53:21 -0000 @@ -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.4 diff -u -r1.4 ChildrenCache.java --- src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenCache.java 1 Jul 2006 09:08:45 -0000 1.4 +++ src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenCache.java 1 Aug 2006 09:53:21 -0000 @@ -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.13 diff -u -r1.13 ChildrenSupport.java --- src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenSupport.java 1 Jul 2006 09:08:45 -0000 1.13 +++ src/org/netbeans/modules/masterfs/filebasedfs/children/ChildrenSupport.java 1 Aug 2006 09:53:22 -0000 @@ -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.24 diff -u -r1.24 BaseFileObj.java --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java 1 Jul 2006 09:08:45 -0000 1.24 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java 1 Aug 2006 09:53:22 -0000 @@ -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; import org.openide.util.Enumerations; @@ -154,15 +158,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); } @@ -353,8 +373,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(); @@ -367,13 +391,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); @@ -382,7 +413,7 @@ fireFileDeletedEvent(false); } - + abstract boolean checkLock(FileLock lock) throws IOException; public Object writeReplace() { @@ -392,6 +423,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.22 diff -u -r1.22 FileObj.java --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObj.java 27 Jul 2006 14:20:41 -0000 1.22 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObj.java 1 Aug 2006 09:53:22 -0000 @@ -210,8 +210,8 @@ setValid(false); if (fire) { 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.22 diff -u -r1.22 FolderObj.java --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObj.java 1 Jul 2006 09:08:46 -0000 1.22 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FolderObj.java 1 Aug 2006 09:53:22 -0000 @@ -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) { @@ -473,6 +480,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.7 diff -u -r1.7 ReplaceForSerialization.java --- src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/ReplaceForSerialization.java 1 Jul 2006 09:08:46 -0000 1.7 +++ src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/ReplaceForSerialization.java 1 Aug 2006 09:53:22 -0000 @@ -26,8 +26,11 @@ import java.io.OutputStream; import java.util.Date; import org.netbeans.modules.masterfs.filebasedfs.FileBasedFileSystem; -import org.openide.filesystems.FileLock; -import org.openide.filesystems.FileObject; +import org.netbeans.modules.masterfs.providers.ProvidedExtensions; +import org.openide.filesystems.*; + +import java.io.*; +import java.util.Date; /** * @author Radek Matous @@ -57,10 +60,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.9 diff -u -r1.9 NamingFactory.java --- src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java 1 Jul 2006 09:08:47 -0000 1.9 +++ src/org/netbeans/modules/masterfs/filebasedfs/naming/NamingFactory.java 1 Aug 2006 09:53:22 -0000 @@ -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.3 diff -u -r1.3 ProvidedExtensions.java --- src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java 1 Jul 2006 09:08:48 -0000 1.3 +++ src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java 1 Aug 2006 09:53:22 -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.4 diff -u -r1.4 CacheTest.java --- test/unit/src/org/netbeans/modules/masterfs/CacheTest.java 1 Jul 2006 09:08:49 -0000 1.4 +++ test/unit/src/org/netbeans/modules/masterfs/CacheTest.java 1 Aug 2006 09:53:22 -0000 @@ -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.32 diff -u -r1.32 MasterFileObjectTestHid.java --- test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java 1 Jul 2006 09:08:49 -0000 1.32 +++ test/unit/src/org/netbeans/modules/masterfs/MasterFileObjectTestHid.java 1 Aug 2006 09:53:22 -0000 @@ -37,6 +37,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; @@ -443,8 +444,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); } @@ -547,10 +550,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 { @@ -565,7 +570,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.9 diff -u -r1.9 MasterFileSystemTest.java --- test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemTest.java 1 Jul 2006 09:08:50 -0000 1.9 +++ test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemTest.java 1 Aug 2006 09:53:22 -0000 @@ -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.3 diff -u -r1.3 MasterFileSystemWithExtensionsTest.java --- test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemWithExtensionsTest.java 1 Jul 2006 09:08:50 -0000 1.3 +++ test/unit/src/org/netbeans/modules/masterfs/MasterFileSystemWithExtensionsTest.java 1 Aug 2006 09:53:22 -0000 @@ -30,7 +30,8 @@ public MasterFileSystemWithExtensionsTest(Test test) { super(test); ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsMoveRetVal(true); - ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsRenameRetVal(true); + ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsRenameRetVal(true); + ProvidedExtensionsTest.ProvidedExtensionsImpl.setImplsDeleteRetVal(true); } public static Test suite() { 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.3 diff -u -r1.3 ProvidedExtensionsTest.java --- test/unit/src/org/netbeans/modules/masterfs/providers/ProvidedExtensionsTest.java 1 Jul 2006 09:08:51 -0000 1.3 +++ test/unit/src/org/netbeans/modules/masterfs/providers/ProvidedExtensionsTest.java 1 Aug 2006 09:53:22 -0000 @@ -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; + } } }