ensured single instance of vamsasarchive io handler to prevent lock contention.
[vamsas.git] / src / uk / ac / vamsas / client / simpleclient / SessionsFile.java
index d391d0a..230c633 100644 (file)
@@ -1,54 +1,8 @@
-/* EMBL - The European Bioinformatics institute
-* MSD Group
+/*
+ * 
 * VAMSAS Project
-*
-*  Copyright (c) 2005-2006 Thr European Bioinformatics Institute. All rights reserved.
-*
-*   Redistribution and use in source and binary forms, with or without
-*   modification, are permitted provided that the following conditions
-*   are met:
-*  
-*   1. Redistributions of source code must retain the above copyright
-*      notice, this list of conditions and the following disclaimer. 
-*  
-*   2. Redistributions in binary form must reproduce the above copyright
-*      notice, this list of conditions and the following disclaimer in
-*      the documentation and/or other materials provided with the
-*      distribution.
-*  
-*   3. The name MSD must not be used to endorse or promote products 
-*      derived from this software without prior written permission. For 
-*      written permission, please contact msd-help@ebi.ac.uk
-*  
-*   4. Products derived from this software may not be called "MSD"
-*      nor may "MSD" appear in their names without prior written
-*      permission of the MSD developers.
-*  
-*   5. Redistributions of any form whatsoever must retain the following
-*      acknowledgment:
-*      "This product includes software developed by MSD 
-*       (http://www.ebi.ac.uk/)"
-*  
-*   THIS SOFTWARE IS PROVIDED BY THE MSD GROUP ``AS IS'' AND ANY
-*   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-*   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-*   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ENSEMBL GROUP OR
-*   ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-*   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-*   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-*   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-*   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-*   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-*   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-*   OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The European Bioinformatics Institute may publish revised and/or new
-* versions of this license with new releases of VAMSAS software.
-*==============================================================================
-*
-*  @author <a href="mailto:pierre@ebi.ac.uk">Pierre MARGUERITE</a>
 * 
-* Dec 13, 2006  - VamsasClientV4
+* Dec 13, 2006  - VamsasClient
 *
 */
  
@@ -101,7 +55,7 @@ public class SessionsFile extends ListFile {
   private SessionHandle[] retrieveSessionHandles() {
     if (lockFile()) {
       try {
-        SessionHandle[] clients=null;
+        SessionHandle[] sessions =null;
         if (this.fileLock.length()>0) {
           
           ObjectInputStream is = new ObjectInputStream(this.fileLock.getBufferedInputStream(true));
@@ -109,14 +63,15 @@ public class SessionsFile extends ListFile {
           o=is.readObject();
           if (o!=null) {
             try {
-              clients = (SessionHandle[]) o;
+              sessions = (SessionHandle[]) o;
             }
             catch (Exception e) {
               log.error("Garbage in the clientHandle list "+this.sessionFile,e);
             }
           }
+         // is.close();
         }
-        return clients;
+        return sessions;
       } catch (FileNotFoundException e) {
        // e.printStackTrace(System.err);
         log.error(e);
@@ -142,41 +97,41 @@ public class SessionsFile extends ListFile {
   }
 
   /**
-   * get list from the locked ClientList.
+   * get list from the locked SessionsList.
    * @param extantlock
-   * @return clientList or null if lock failed (or file was empty)
+   * @return sessionList or null if lock failed (or file was empty)
    */
   public SessionHandle[] retrieveSessionsList(Lock extantlock) {
     if (lockFile(extantlock)) {
-     SessionHandle[] clients = retrieveSessionHandles();
+     SessionHandle[] sessions = retrieveSessionHandles();
       unlockFile();
-      return clients;
+      return sessions;
     }
     return null;
   }
  
   
   /**
-   * adds clientHandle me to the clientList under an existing lock extantLock.
-   * @param me
+   * adds SessionHandle me to the sessionList under an existing lock extantLock.
+   * @param newSession
    * @param extantLock
-   * @return client index in list or 0 if lock was invalid or addClient operation failed.
+   * @return session index in list or 0 if lock was invalid or addSession operation failed.
    */
-  public int addSession(SessionHandle me, Lock extantLock) {
-    return addSession(me, true, extantLock);
+  public int addSession(SessionHandle newSession, Lock extantLock) {
+    return addSession(newSession, true, extantLock);
   }
   
   /**
    * adds SessionsHandle me to the sessionsList under an existing lock.
-   * @param me - sessionsHandle
-   * @param disambig - if true then add will fail if an identical clientHandle already exists
+   * @param newSession - sessionsHandle
+   * @param disambig - if true then add will fail if an identical sessionHandle already exists
    * @param extantLock - existing lock
-   * @return client index in list or 0 if addClient (or the lock) failed.
+   * @return client index in list or 0 if addSession (or the lock) failed.
    */
   
-  public int addSession(SessionHandle session, boolean disambig, Lock extantLock) {
+  public int addSession(SessionHandle newSession, boolean disambig, Lock extantLock) {
     if (lockFile(extantLock)) {
-      this.syncnum = addSession(session, disambig);
+      this.syncnum = addSession(newSession, disambig);
       unlockFile();
       return this.syncnum;
     }
@@ -185,23 +140,26 @@ public class SessionsFile extends ListFile {
   
   /**
    * removes the current session from the  SessionsList without complaint if the session isn't in the sessionsList already.
-   * @param me client handle to be removed
-   * @param clientlock existing lock passed from watcher.
+   * @param session session handle to be removed
+   * @param sessionlock existing lock passed from watcher.
    */
-  public void removeSession(SessionHandle session, Lock clientlock) {
+  public void removeSession(SessionHandle session, Lock sessionlock) {
     int mynum =-1;
-    if (lockFile(clientlock)) {
+    if (lockFile(sessionlock)) {
+      
       SessionHandle[] sessions = retrieveSessionHandles();
       if (sessions != null) {
-        if ((this.syncnum<=0 || this.syncnum>sessions.length) || sessions[this.syncnum-1]!=session) {
-          for (int i = 0, j = sessions.length; i < j; i++) 
-            if (sessions[i].equals(session)) {
+       if ((this.syncnum<=0 || this.syncnum>sessions.length) || !sessions[this.syncnum-1].equals(session)) {
+          for (int i = 0, j = sessions.length; i < j; i++)
+          { if (sessions[i].equals(session)) {
               mynum=i;
               break;
             }
+          }
         } else {
           mynum=this.syncnum-1;
         }
+       
         if (mynum>-1) {
           SessionHandle[] newlist = new SessionHandle[sessions.length - 1];
           for (int k=0,i = 0, j = sessions.length; i < j; i++)
@@ -213,14 +171,14 @@ public class SessionsFile extends ListFile {
       }
       unlockFile();
     } else {
-      throw new Error("Couldn't get lock for "+((sessionFile==null) ? "Unitialised sessionFile in SessionsFile" : this.sessionFile.getAbsolutePath()));
+      throw new Error("Couldn't get lock for "+((this.sessionFile==null) ? "Unitialised sessionFile in SessionsFile" : this.sessionFile.getAbsolutePath()));
     }
   }
   /**
    * Adds a SessionHandle to the SessionList file - optionally disambiguating 
    * the SessionHandle (modifes the URN). 
    * Note: Caller is left to release the lock on the SessionList.
-   * @param me
+   * @param session
    * @param disambiguate -
    *          flag indicating if the URN for me should be disambiguated to
    *          differentiate between sessions.
@@ -288,6 +246,7 @@ public class SessionsFile extends ListFile {
               new ObjectOutputStream(this.fileLock.getBufferedOutputStream(true));
             log.debug("About to write "+clients.length+" sessionHandles to output stream.");
             os.writeObject(clients);
+          //  os.flush();
             os.close();
           // All done - remove the backup.
           if (this.backup)