Index: fs/src/org/openide/filesystems/FileObject.java =================================================================== RCS file: /shared/data/ccvs/repository/openide/fs/src/org/openide/filesystems/FileObject.java,v retrieving revision 1.15 diff -u -r1.15 FileObject.java --- fs/src/org/openide/filesystems/FileObject.java 9 Aug 2006 12:45:53 -0000 1.15 +++ fs/src/org/openide/filesystems/FileObject.java 11 Aug 2006 15:15:26 -0000 @@ -794,8 +794,11 @@ * listeners. */ static boolean isPriorityListener(FileChangeListener fcl) { - return (fcl instanceof PriorityFileChangeListener) || - fcl.getClass().getName().indexOf("MasterFileObject$FileChangeListenerImpl") == -1;//NOI18N + if (fcl instanceof PriorityFileChangeListener) { + return true; + } else { + return false; + } } interface PriorityFileChangeListener extends FileChangeListener {} Index: fs/test/unit/src/org/openide/filesystems/FileObjectTestHid.java =================================================================== RCS file: /shared/data/ccvs/repository/openide/fs/test/unit/src/org/openide/filesystems/FileObjectTestHid.java,v retrieving revision 1.11 diff -u -r1.11 FileObjectTestHid.java --- fs/test/unit/src/org/openide/filesystems/FileObjectTestHid.java 10 Aug 2006 14:22:57 -0000 1.11 +++ fs/test/unit/src/org/openide/filesystems/FileObjectTestHid.java 11 Aug 2006 15:15:26 -0000 @@ -74,12 +74,28 @@ //assertGC("", ref); } - public void testEventsDelivery81746() throws Exception { + public void testEventsDelivery81746() throws Exception { + doEventsDelivery81746(1); + } + + public void testEventsDeliveryInInnerAtomicActions82459() throws Exception { + doEventsDelivery81746(2); + } + + private void doEventsDelivery81746(final int howDeep) throws Exception { checkSetUp(); final FileObject fold = getTestFolder1(root); if (fold.getFileSystem().isReadOnly()) { return; } + class L extends FileChangeAdapter { + public int cnt; + + public void fileDataCreated(FileEvent fe) { + cnt++; + } + } + final FileChangeListener noFileDataCreatedListener = new FileChangeAdapter(){ public void fileDataCreated(FileEvent fe) { fail(); @@ -96,10 +112,22 @@ } }; + final L countingL = new L(); try { fold.getFileSystem().addFileChangeListener(listener1); + fold.addFileChangeListener(countingL); + fold.getFileSystem().addFileChangeListener(countingL); fold.getFileSystem().runAtomicAction(new FileSystem.AtomicAction(){ + private int stillDeep = howDeep; + public void run() throws java.io.IOException { + if (--stillDeep > 0) { + fold.getFileSystem().runAtomicAction(this); + assertEquals("No events in inner actions", 0, countingL.cnt); + return; + } + + fold.createData("file1"); fold.createData("file2"); } Index: loaders/src/org/openide/loaders/FolderLookup.java =================================================================== RCS file: /shared/data/ccvs/repository/openide/loaders/src/org/openide/loaders/FolderLookup.java,v retrieving revision 1.18 diff -u -r1.18 FolderLookup.java --- loaders/src/org/openide/loaders/FolderLookup.java 2 Aug 2006 06:53:34 -0000 1.18 +++ loaders/src/org/openide/loaders/FolderLookup.java 11 Aug 2006 15:15:34 -0000 @@ -361,7 +361,7 @@ // folder recognizer thread is waiting for more then // 10s in waitFinished, which signals that there // is a very high possibility of a deadlock - fl.err().fine("Preventing deadlock #65543: Do not call FolderLookup from inside DataObject operations!"); // NOI18N + fl.err().log(Level.INFO, "Preventing deadlock #65543: Do not call FolderLookup from inside DataObject operations!", new Exception("Thread dump")); // NOI18N return; } } Index: masterfs/src/org/netbeans/modules/masterfs/Delegate.java =================================================================== RCS file: /shared/data/ccvs/repository/openide/masterfs/src/org/netbeans/modules/masterfs/Delegate.java,v retrieving revision 1.23 diff -u -r1.23 Delegate.java --- masterfs/src/org/netbeans/modules/masterfs/Delegate.java 1 Jul 2006 09:08:43 -0000 1.23 +++ masterfs/src/org/netbeans/modules/masterfs/Delegate.java 11 Aug 2006 15:15:34 -0000 @@ -37,6 +37,7 @@ import org.openide.filesystems.FileUtil; import org.netbeans.modules.masterfs.filebasedfs.fileobjects.WriteLockUtils; import org.openide.util.Exceptions; +import org.openide.util.WeakListeners; /** * @author Radek Matous @@ -210,7 +211,17 @@ delegate = fo; if (fo != null) { - weakListener = FileUtil.weakFileChangeListener(fListener, fo); + // the following is not typesafe, it is not nice, + // and very likely it is not even correct, however until + // there is a proper API for "priority listeners" in openide/fs + // there is not much to do about this + Class realClass; + try { + realClass = Class.forName("org.openide.filesystems.FileObject$PriorityFileChangeListener"); + } catch (ClassNotFoundException ex) { + throw (IllegalStateException)new IllegalStateException(ex.getMessage()).initCause(ex); + } + weakListener = (FileChangeListener)WeakListeners.create(realClass, FileChangeListener.class, fListener, fo); fo.addFileChangeListener(weakListener); } }