Package org.apache.commons.vfs2.impl
Class DefaultFileMonitor
- java.lang.Object
-
- org.apache.commons.vfs2.impl.DefaultFileMonitor
-
- All Implemented Interfaces:
java.lang.Runnable
,FileMonitor
public class DefaultFileMonitor extends java.lang.Object implements java.lang.Runnable, FileMonitor
A pollingFileMonitor
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.
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 class
DefaultFileMonitor.FileMonitorAgent
File monitor agent.
-
Field Summary
Fields Modifier and Type Field Description private java.util.Stack<FileObject>
addStack
File objects to be added to the monitor map.private int
checksPerRun
Set the number of files to check until a delay will be insertedprivate static long
DEFAULT_DELAY
private static int
DEFAULT_MAX_FILES
private long
delay
Set the delay between checksprivate java.util.Stack<FileObject>
deleteStack
File objects to be removed from the monitor map.private FileListener
listener
A listener object that if set, is notified on file creation and deletion.private static org.apache.commons.logging.Log
LOG
private java.util.Map<FileName,DefaultFileMonitor.FileMonitorAgent>
monitorMap
Map from FileName to FileObject being monitored.private java.lang.Thread
monitorThread
The low priority thread used for checking the files being monitored.private boolean
recursive
A flag used to determine if adding files to be monitored should be recursive.private boolean
shouldRun
A flag used to determine if the monitor thread should be running.
-
Constructor Summary
Constructors Constructor Description DefaultFileMonitor(FileListener listener)
Creates a new instance with the given listener.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addFile(FileObject file)
Adds a file to be monitored.int
getChecksPerRun()
get the number of files to check per run.long
getDelay()
Get the delay between runs.(package private) FileListener
getFileListener()
Access method to get the current FileListener object notified when there are changes with the files added.boolean
isRecursive()
Access method to get the recursive setting when adding files for monitoring.protected void
queueAddFile(FileObject file)
Queues a file for addition to be monitored.protected void
queueRemoveFile(FileObject file)
Queues a file for removal from being monitored.void
removeFile(FileObject file)
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
start()
Starts monitoring the files that have been added.void
stop()
Stops monitoring the files that have been added.
-
-
-
Field Detail
-
LOG
private static final org.apache.commons.logging.Log LOG
-
DEFAULT_DELAY
private static final long DEFAULT_DELAY
- See Also:
- Constant Field Values
-
DEFAULT_MAX_FILES
private static final int DEFAULT_MAX_FILES
- See Also:
- Constant Field Values
-
monitorMap
private final java.util.Map<FileName,DefaultFileMonitor.FileMonitorAgent> monitorMap
Map from FileName to FileObject being monitored.
-
monitorThread
private java.lang.Thread monitorThread
The low priority thread used for checking the files being monitored.
-
deleteStack
private final java.util.Stack<FileObject> deleteStack
File objects to be removed from the monitor map.
-
addStack
private final java.util.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 Detail
-
DefaultFileMonitor
public DefaultFileMonitor(FileListener listener)
Creates a new instance with the given listener.- Parameters:
listener
- the listener.
-
-
Method Detail
-
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 interfaceFileMonitor
- Parameters:
file
- The FileObject to monitor.
-
removeFile
public void removeFile(FileObject file)
Removes a file from being monitored.- Specified by:
removeFile
in interfaceFileMonitor
- 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 interfacejava.lang.Runnable
-
-