private long lastStat[];
boolean waslocked=false;
boolean exists = false;
-
/**
- * Make a watcher for a particular file. If the file doesn't exist, the
- * watcher will watch for its creation (and indicate a change of state)
- * For locked files, the removal of a lock constitutes a change of
- * state if the file was modified.
- *
- * @param subject
+ * transient lock on subject - can be passed back to calling class
+ * to preserve new state of file for immediate reading.
*/
+ private Lock subjectLock = null;
+
+ private void clearLock() {
+ if (subjectLock!=null)
+ subjectLock.release();
+ subjectLock=null;
+ }
+
private boolean checkLock() {
if (subject!=null && subject.exists()) {
- Lock tl = new Lock(subject);
- if (tl.isLocked()) {
- tl.release();
+ if (subjectLock!=null) {
+ subjectLock.release();
+ }
+ subjectLock = new Lock(subject);
+ if (subjectLock.isLocked()) {
+ // subjectLock.release();
return false;
}
- tl.release();
+ clearLock();
return true;
}
return false;
/**
* Detect changes in file state and release of any
* lock in place during change.
- * @return true if file state has changed
+ * @return true if file state has changed. Leaves lock in subjectLock (ready to be passed to caller)
*/
private boolean check() {
if (subject != null) {
}
return false;
}
+ /**
+ * updates internal record of file state when caller has intentionally
+ * modified subject. (ignores locked-state of subject)
+ */
public void setState() {
if (subject!=null) {
- lastStat = getStat(subject);
- exists = subject.exists();
- waslocked = checkLock();
+ if (exists = subject.exists()) {
+ lastStat = getStat(subject);
+ waslocked = false;
+ }
}
}
+ /**
+ * Make a watcher for a particular file. If the file doesn't exist, the
+ * watcher will watch for its creation (and indicate a change of state)
+ * For locked files, the removal of a lock constitutes a change of
+ * state if the file was modified.
+ *
+ * @param subject
+ */
+
public FileWatcher(File subject) {
// TODO Auto-generated constructor stub
this.subject = subject;
setState();
}
-
+ /**
+ * Test for change in file state. Only indicates a change
+ * after any lock on a file has been released.
+ * @return true if file has been modified.
+ */
public boolean hasChanged() {
- return check();
+ boolean res = check();
+ clearLock();
+ return res;
+ }
+ /**
+ * passes lock back to caller if hasChanged returned true.
+ * @return
+ */
+ public Lock getChangedState() {
+ boolean res = check();
+ if (res)
+ return subjectLock;
+ else {
+ clearLock();
+ return null;
+ }
}
}