package org.apereo.cas.util.io;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;
/**
* Buffered output stream around a file that is exclusively locked for the
* lifetime of the stream.
* @author Misagh Moayyed
* @author Marvin S. Addison
* @since 4.1.0
*/
public class LockedOutputStream extends BufferedOutputStream {
/** Lock held on file underneath stream. */
private FileLock lock;
/** Flag to indicate underlying stream is already closed. */
private boolean closed;
/**
* Creates a new instance by obtaining a lock on the underlying stream
* that is held until the stream is closed.
*
* @param out Output stream.
* @throws IOException If a lock cannot be obtained on the file.
*/
public LockedOutputStream(final FileOutputStream out) throws IOException {
super(out);
this.lock = out.getChannel().lock();
}
@Override
public void close() throws IOException {
if (this.closed) {
return;
}
try {
this.lock.release();
} finally {
this.closed = true;
super.close();
}
}
}