more fixes for clientdocument/simpleclient. Testign the vamsasArchive reader and...
[vamsas.git] / src / org / vamsas / client / simpleclient / SessionFile.java
index b2538ab..0eabf6d 100644 (file)
@@ -5,17 +5,25 @@ import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 /**
  * Basic methods for classes handling locked IO on files 
  * monitored by all (simpleclient) clients in a vamsas session.
  * @author jimp
- *
+ *TODO: support non nio file locking capable systems
  */
 public class SessionFile {
-
+  private static Log log = LogFactory.getLog(SessionFile.class);
   protected File sessionFile;
   protected Lock fileLock = null;
 
+  protected SessionFile(File file) {
+    super();
+    sessionFile = file;
+  }
+
   protected boolean lockFile(Lock extantlock) {
     if (fileLock!=null && !fileLock.isLocked()) {
       fileLock.release();// tidy up invalid lock
@@ -38,20 +46,29 @@ public class SessionFile {
         fileLock.release();
     fileLock = null;
     if (sessionFile != null) {
-      if (sessionFile.exists()) {
-        // TODO: see if we need to loop-wait for locks or they just block until
-        // lock is made...
-        do {
-          if (fileLock!=null)
-            fileLock.release();
-          fileLock = new Lock(sessionFile); // TODO: wait around if we can't get the lock.
-        } while (!fileLock.isLocked());
-        // fileLock = new Lock(sessionFile);
-        return fileLock.isLocked();
+      if (!sessionFile.exists()) {
+        // create new file
+        try {
+          if (!sessionFile.createNewFile()) {
+            log.error("Failed to create file prior to locking: "+sessionFile);
+            return false;
+          }
+        } catch (IOException e) {
+          log.error("Exception when trying to create file "+sessionFile, e);
+          return false;
+        }
       }
+      // TODO: see if we need to loop-wait for locks or they just block until
+      // lock is made...
+      do {
+        if (fileLock!=null)
+          fileLock.release();
+          fileLock = new Lock(sessionFile); // TODO: wait around if we can't get the lock.
+      } while (!fileLock.isLocked());
+      // fileLock = new Lock(sessionFile);
+      return fileLock.isLocked();    
     } else
-      throw new Error(
-          "org.vamsas.client.simpleclient.ClientsFile.lockList called for non-initialised ClientsFile!");
+      log.error("lockFile called for non-initialised SessionFile!");
   
     // no lock possible
     return false;
@@ -87,17 +104,41 @@ public class SessionFile {
             fileLock.rafile.length());
         tos.close();
       } catch (FileNotFoundException e1) {
-        System.err.println("Can't create temp file for "+sessionFile.getName());
-        e1.printStackTrace(System.err);
+        log.warn("Can't create temp file for "+sessionFile.getName(),e1);
         tempfile=null;
       } catch (IOException e1) {
-        System.err
-            .println("Error when copying content to temp file for "+sessionFile.getName());
-        e1.printStackTrace(System.err);
+        log.warn("Error when copying content to temp file for "+sessionFile.getName(),e1);
         tempfile=null;
       }
     }
     return tempfile;
   }
-
+  /**
+   * Replaces data in sessionFile with data from file handled by another sessionFile
+   * passes up any exceptions.
+   * @param newData source for new data
+   */
+  protected void updateFrom(Lock extantLock, SessionFile newData) throws IOException {
+    log.debug("Updating "+sessionFile.getAbsolutePath()+" from "+newData.sessionFile.getAbsolutePath());
+    if (newData==null)
+      throw new IOException("Null newData object.");
+    if (newData.sessionFile==null)
+      throw new IOException("Null SessionFile in newData.");
+      
+    lockFile(extantLock);  
+    newData.lockFile();
+    fileLock.rafile.getChannel().transferFrom(newData.fileLock.rafile.getChannel(), 0, 
+        newData.fileLock.rafile.length());
+  }
+  /**
+   * remove all trace of the sessionFile file
+   *
+   */
+  protected void eraseExistence() {
+    unlockFile();
+    if (sessionFile!=null) {
+      sessionFile.delete();
+      sessionFile = null;
+    }
+  }
 }