Native FS watchers: Queue, group and delay external events. fs_watches_26230
authorPetr Nejedl? <pnejedly@netbeans.org>
Mon, 20 Sep 2010 10:23:55 +0200
branchfs_watches_26230
changeset 180799b76b558e0f93
parent 180798 ac28837b23fb
child 180800 44dca4908ecb
Native FS watchers: Queue, group and delay external events.
masterfs/src/org/netbeans/modules/masterfs/watcher/Watcher.java
     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       *