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; } /** * test whether the given file is a target or related to the lock * on the target file. * @param afile a file * @return true if target is locked and afile is related to target */ public abstract boolean isTargetLockFile(File afile); /** * * @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; }