From 8323ce3c74cff67c0006c6d0cc4155a5e6fe7ca1 Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 12 Oct 2005 10:46:59 +0000 Subject: [PATCH] modified FileWatcher to only register file change after a lock release (incurs a momentary file lock). tested multi-process watching. git-svn-id: https://svn.lifesci.dundee.ac.uk/svn/repository/trunk@62 be28352e-c001-0410-b1a7-c7978e42abec --- .../vamsas/client/simpleclient/ClientsFile.java | 9 ++- .../vamsas/client/simpleclient/FileWatcher.java | 63 +++++++++++++------- src/org/vamsas/client/simpleclient/Lock.java | 17 ++++-- .../vamsas/test/simpleclient/ClientsFileTest.java | 23 +++++++ 4 files changed, 82 insertions(+), 30 deletions(-) diff --git a/src/org/vamsas/client/simpleclient/ClientsFile.java b/src/org/vamsas/client/simpleclient/ClientsFile.java index 4d34039..aa62482 100644 --- a/src/org/vamsas/client/simpleclient/ClientsFile.java +++ b/src/org/vamsas/client/simpleclient/ClientsFile.java @@ -49,11 +49,10 @@ public class ClientsFile { if (filelist.exists()) { // TODO: see if we need to loop-wait for locks or they just block until // lock is made... - // do { - // listlock = new Lock(filelist); // TODO: wait around if we can't get - // the lock. - // } while (!listlock.isLocked()); - listlock = new Lock(filelist); + do { + listlock = new Lock(filelist); // TODO: wait around if we can't get the lock. + } while (!listlock.isLocked()); + // listlock = new Lock(filelist); return listlock.isLocked(); } } else diff --git a/src/org/vamsas/client/simpleclient/FileWatcher.java b/src/org/vamsas/client/simpleclient/FileWatcher.java index f486360..ce218ee 100644 --- a/src/org/vamsas/client/simpleclient/FileWatcher.java +++ b/src/org/vamsas/client/simpleclient/FileWatcher.java @@ -5,47 +5,68 @@ package org.vamsas.client.simpleclient; import java.io.File; +import org.vamsas.client.SimpleClient; + /** - * @author jim - * Watches a particular file for its creation, deletion, or modification. + * @author jim Watches a particular file for its creation, deletion, or + * modification. */ public class FileWatcher { - private File subject=null; + + private File subject = null; + private long lastStat; - boolean exists=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) + * 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 */ - private boolean check() { + private boolean checkLock() { if (subject!=null) { + Lock tl = new Lock(subject); + if (tl.isLocked()) { + tl.release(); + return false; + } else { + return true; + } + } + return false; + } + private boolean check() { + if (subject != null) { if (!subject.exists()) { if (exists) { - exists=false; - return true; - } - return false; - } else { - long newStat=subject.lastModified(); - if (exists && lastStat==newStat) { + exists = false; + return true; + } return false; + } else { + + long newStat = subject.lastModified(); + if (exists && ((lastStat == newStat) || checkLock())) { + return false; + } + lastStat = newStat; + exists = true; + return true; } - lastStat=newStat; - exists=true; - return true; } - } return false; } - - + public FileWatcher(File subject) { // TODO Auto-generated constructor stub this.subject = subject; check(); } + public boolean hasChanged() { return check(); } diff --git a/src/org/vamsas/client/simpleclient/Lock.java b/src/org/vamsas/client/simpleclient/Lock.java index d7239e6..a185233 100644 --- a/src/org/vamsas/client/simpleclient/Lock.java +++ b/src/org/vamsas/client/simpleclient/Lock.java @@ -31,7 +31,7 @@ public class Lock { if (!lockfile.createNewFile()) { return; } - + lock = (rafile=new RandomAccessFile(lockfile,"rw")).getChannel().tryLock(); } catch (FileNotFoundException e) { System.err.println("Error! Couldn't create a lockfile at " @@ -50,13 +50,22 @@ public class Lock { } return false; } - + public void release() { + if (lock!=null) { + try { + rafile.close(); + lock.release(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(System.err); + } + } + } /* Explicitly release lock (probably don't need to do this!) * @see java.lang.Object#finalize() */ protected void finalize() throws Throwable { - if (lock!=null) - lock.release(); + release(); super.finalize(); } diff --git a/src/org/vamsas/test/simpleclient/ClientsFileTest.java b/src/org/vamsas/test/simpleclient/ClientsFileTest.java index 9339600..f484a63 100644 --- a/src/org/vamsas/test/simpleclient/ClientsFileTest.java +++ b/src/org/vamsas/test/simpleclient/ClientsFileTest.java @@ -1,10 +1,12 @@ package org.vamsas.test.simpleclient; +import java.io.File; import java.util.Iterator; import java.util.Vector; import org.vamsas.client.ClientHandle; import org.vamsas.client.simpleclient.ClientsFile; +import org.vamsas.client.simpleclient.FileWatcher; public class ClientsFileTest { private static Vector commands; @@ -14,6 +16,7 @@ public class ClientsFileTest { ClientsFileTest.commands.add(new String("remove")); ClientsFileTest.commands.add(new String("list")); ClientsFileTest.commands.add(new String("clear")); + ClientsFileTest.commands.add(new String("watch")); } private static void complainArgs(int argl, int argpos, String cmd, int argneed, String msg) { if (argl-argpos