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;
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.SessionFile.lockFile called for non-initialised SessionFile!");
+ log.error("lockFile called for non-initialised SessionFile!");
// no lock possible
return false;
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;
+ }
+ }
}