Class DefaultFileMonitor

java.lang.Object
org.apache.commons.vfs2.impl.DefaultFileMonitor
All Implemented Interfaces:
Runnable, FileMonitor

public class DefaultFileMonitor extends Object implements Runnable, FileMonitor
A polling FileMonitor implementation.

The DefaultFileMonitor is a Thread based polling file system monitor with a 1 second delay.

Design:

There is a Map of monitors known as FileMonitorAgents. With the thread running, each FileMonitorAgent object is asked to "check" on the file it is responsible for. To do this check, the cache is cleared.
  • If the file existed before the refresh and it no longer exists, a delete event is fired.
  • If the file existed before the refresh and it still exists, check the last modified timestamp to see if that has changed.
  • If it has, fire a change event.
With each file delete, the FileMonitorAgent of the parent is asked to re-build its list of children, so that they can be accurately checked when there are new children.

New files are detected during each "check" as each file does a check for new children. If new children are found, create events are fired recursively if recursive descent is enabled.

For performance reasons, added a delay that increases as the number of files monitored increases. The default is a delay of 1 second for every 1000 files processed.

Example usage:

 FileSystemManager fsManager = VFS.getManager();
 FileObject listendir = fsManager.resolveFile("/home/username/monitored/");

 DefaultFileMonitor fm = new DefaultFileMonitor(new CustomFileListener());
 fm.setRecursive(true);
 fm.addFile(listendir);
 fm.start();
 
(where CustomFileListener is a class that implements the FileListener interface.)
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    private static final class 
    File monitor agent.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final Stack<FileObject>
    File objects to be added to the monitor map.
    private int
    Set the number of files to check until a delay will be inserted
    private static final long
     
    private static final int
     
    private long
    Set the delay between checks
    private final Stack<FileObject>
    File objects to be removed from the monitor map.
    private final FileListener
    A listener object that if set, is notified on file creation and deletion.
    private static final org.apache.commons.logging.Log
     
    Map from FileName to FileObject being monitored.
    private Thread
    The low priority thread used for checking the files being monitored.
    private boolean
    A flag used to determine if adding files to be monitored should be recursive.
    private boolean
    A flag used to determine if the monitor thread should be running.
  • Constructor Summary

    Constructors
    Constructor
    Description
    Creates a new instance with the given listener.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    Adds a file to be monitored.
    int
    get the number of files to check per run.
    long
    Get the delay between runs.
    (package private) FileListener
    Access method to get the current FileListener object notified when there are changes with the files added.
    boolean
    Access method to get the recursive setting when adding files for monitoring.
    protected void
    Queues a file for addition to be monitored.
    protected void
    Queues a file for removal from being monitored.
    void
    Removes a file from being monitored.
    void
    run()
    Asks the agent for each file being monitored to check its file for changes.
    void
    setChecksPerRun(int checksPerRun)
    set the number of files to check per run.
    void
    setDelay(long delay)
    Set the delay between runs.
    void
    setRecursive(boolean newRecursive)
    Access method to set the recursive setting when adding files for monitoring.
    void
    Starts monitoring the files that have been added.
    void
    Stops monitoring the files that have been added.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • LOG

      private static final org.apache.commons.logging.Log LOG
    • DEFAULT_DELAY

      private static final long DEFAULT_DELAY
      See Also:
    • DEFAULT_MAX_FILES

      private static final int DEFAULT_MAX_FILES
      See Also:
    • monitorMap

      Map from FileName to FileObject being monitored.
    • monitorThread

      private Thread monitorThread
      The low priority thread used for checking the files being monitored.
    • deleteStack

      private final Stack<FileObject> deleteStack
      File objects to be removed from the monitor map.
    • addStack

      private final Stack<FileObject> addStack
      File objects to be added to the monitor map.
    • shouldRun

      private volatile boolean shouldRun
      A flag used to determine if the monitor thread should be running.
    • recursive

      private boolean recursive
      A flag used to determine if adding files to be monitored should be recursive.
    • delay

      private long delay
      Set the delay between checks
    • checksPerRun

      private int checksPerRun
      Set the number of files to check until a delay will be inserted
    • listener

      private final FileListener listener
      A listener object that if set, is notified on file creation and deletion.
  • Constructor Details

    • DefaultFileMonitor

      public DefaultFileMonitor(FileListener listener)
      Creates a new instance with the given listener.
      Parameters:
      listener - the listener.
  • Method Details

    • isRecursive

      public boolean isRecursive()
      Access method to get the recursive setting when adding files for monitoring.
      Returns:
      true if monitoring is enabled for children.
    • setRecursive

      public void setRecursive(boolean newRecursive)
      Access method to set the recursive setting when adding files for monitoring.
      Parameters:
      newRecursive - true if monitoring should be enabled for children.
    • getFileListener

      FileListener getFileListener()
      Access method to get the current FileListener object notified when there are changes with the files added.
      Returns:
      The FileListener.
    • addFile

      public void addFile(FileObject file)
      Adds a file to be monitored.
      Specified by:
      addFile in interface FileMonitor
      Parameters:
      file - The FileObject to monitor.
    • removeFile

      public void removeFile(FileObject file)
      Removes a file from being monitored.
      Specified by:
      removeFile in interface FileMonitor
      Parameters:
      file - The FileObject to remove from monitoring.
    • queueRemoveFile

      protected void queueRemoveFile(FileObject file)
      Queues a file for removal from being monitored.
      Parameters:
      file - The FileObject to be removed from being monitored.
    • getDelay

      public long getDelay()
      Get the delay between runs.
      Returns:
      The delay period.
    • setDelay

      public void setDelay(long delay)
      Set the delay between runs.
      Parameters:
      delay - The delay period.
    • getChecksPerRun

      public int getChecksPerRun()
      get the number of files to check per run.
      Returns:
      The number of files to check per iteration.
    • setChecksPerRun

      public void setChecksPerRun(int checksPerRun)
      set the number of files to check per run. a additional delay will be added if there are more files to check
      Parameters:
      checksPerRun - a value less than 1 will disable this feature
    • queueAddFile

      protected void queueAddFile(FileObject file)
      Queues a file for addition to be monitored.
      Parameters:
      file - The FileObject to add.
    • start

      public void start()
      Starts monitoring the files that have been added.
    • stop

      public void stop()
      Stops monitoring the files that have been added.
    • run

      public void run()
      Asks the agent for each file being monitored to check its file for changes.
      Specified by:
      run in interface Runnable