package uk.ac.vamsas.client.simpleclient;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.nio.channels.ByteChannel;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import org.apache.commons.logging.LogFactory;
/**
* transient object representing a file lock
* This lock should hold for all processes interacting in a session.
* @author jimp
*/
public abstract class Lock {
protected org.apache.commons.logging.Log log = LogFactory.getLog(Lock.class);
File target = null; // The file that is being locked
protected RandomAccessFile rafile=null;
/**
* creates a valid Lock (test with isLocked)
* if a lock could be obtained for lockfile
* @param lockfile
*/
protected Lock(java.io.File lockfile) {
target = lockfile;
}
/**
*
* @return true if lock is held on the target
*/
public abstract boolean isLocked();
/**
* release lock and close all managed channels to file
*
*/
public abstract void release();
/**
* optionally close the open random access channel on the file when releasing lock
* @param closeChannel
*/
public abstract void release(boolean closeChannel);
/**
* gets Locked Stream for reading from
* @param atStart true to start reading at beginning of file.
* @return null if file not locked
* @throws IOException
*/
public abstract FileInputStream getFileInputStream(boolean atStart) throws IOException;
/**
* gets Locked stream to write to
* FileInput always starts at the *end* of the file (after any truncation)
* @param clear true means file will be cleared to zero length
* @return null if file is not locked
* @throws IOException
*/
public abstract FileOutputStream getFileOutputStream(boolean clear) throws IOException;
/**
* return buffered output stream to locked file.
* @param clear - true means file is truncated to 0 length before writing
* @return
*/
public abstract BufferedOutputStream getBufferedOutputStream(boolean clear) throws IOException;
protected void finalize() throws Throwable {
target=null;
}
/**
* return buffered input stream for locked file.
* @param atStart - true means read from begining of file
* @return null if file is not locked.
*/
public BufferedInputStream getBufferedInputStream(boolean atStart) throws IOException {
FileInputStream fis = getFileInputStream(atStart);
if (fis!=null)
return new BufferedInputStream(fis);
return null;
}
/**
* safe lock target length() function.
* @return -1 for non-lockable target, otherwise target's file length
*/
public abstract long length();
public abstract RandomAccessFile getRaFile() throws IOException;
public abstract FileChannel getRaChannel() throws IOException;
}