Native FS watchers: Queue, group and delay external events.
1.1 --- a/masterfs/src/org/netbeans/modules/masterfs/watcher/Watcher.java Fri Sep 17 11:58:20 2010 +0200
1.2 +++ b/masterfs/src/org/netbeans/modules/masterfs/watcher/Watcher.java Mon Sep 20 10:23:55 2010 +0200
1.3 @@ -55,6 +55,7 @@
1.4 import org.netbeans.modules.masterfs.providers.AnnotationProvider;
1.5 import org.openide.filesystems.FileUtil;
1.6 import org.openide.util.Exceptions;
1.7 +import org.openide.util.RequestProcessor;
1.8 import org.openide.util.Utilities;
1.9 import org.openide.util.lookup.ServiceProvider;
1.10
1.11 @@ -94,7 +95,7 @@
1.12 return ext;
1.13 }
1.14
1.15 - private static class Ext<KEY> extends ProvidedExtensions implements Runnable {
1.16 + private class Ext<KEY> extends ProvidedExtensions implements Runnable {
1.17 private final Notifier<KEY> impl;
1.18 private final Map<FileObject, KEY> map = new WeakHashMap<FileObject, KEY>();
1.19
1.20 @@ -145,7 +146,7 @@
1.21
1.22 // may be null
1.23 if (map.containsKey(fo)) {
1.24 - fo.refresh();
1.25 + enqueue(fo);
1.26 }
1.27 }
1.28 } catch (ThreadDeath td) {
1.29 @@ -157,6 +158,36 @@
1.30 }
1.31 }
1.32
1.33 + private final Object lock = new Object();
1.34 + private Set<FileObject> pending; // guarded by lock
1.35 + private static RequestProcessor RP = new RequestProcessor("Pending refresh", 1);
1.36 +
1.37 +
1.38 + private RequestProcessor.Task refreshTask = RP.create(new Runnable() {
1.39 + public @Override void run() {
1.40 + Set<FileObject> toRefresh;
1.41 + synchronized(lock) {
1.42 + toRefresh = pending;
1.43 + pending = null;
1.44 + }
1.45 +
1.46 + for (FileObject fileObject : toRefresh) {
1.47 + fileObject.refresh();
1.48 + }
1.49 + }
1.50 + });
1.51 +
1.52 +
1.53 + private void enqueue(FileObject fo) {
1.54 + synchronized(lock) {
1.55 + if (pending == null) {
1.56 + refreshTask.schedule(1500);
1.57 + pending = new HashSet();
1.58 + }
1.59 + pending.add(fo);
1.60 + }
1.61 + }
1.62 +
1.63 /** select the best available notifier implementation on given platform/JDK
1.64 * or null if there is no such service available.
1.65 *