package org.limewire.nio.channel;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import org.limewire.nio.observer.Shutdownable;
import org.limewire.nio.observer.WriteObserver;
/**
* A basic channel writer that just forwards all information to the next channel
* in line.
*/
public abstract class AbstractChannelInterestWriter implements ChannelWriter, InterestWritableByteChannel {
/** The channel to write to & interest on. */
private volatile InterestWritableByteChannel channel;
/** The next observer. */
private volatile WriteObserver observer;
/** {@inheritDoc} */
public InterestWritableByteChannel getWriteChannel() {
return channel;
}
/** {@inheritDoc} */
public void setWriteChannel(InterestWritableByteChannel channel) {
this.channel = channel;
channel.interestWrite(this, true);
}
/**
* {@inheritDoc}
*/
public void interestWrite(WriteObserver observer, boolean status) {
this.observer = status ? observer : null;
InterestWritableByteChannel source = channel;
if(source != null)
source.interestWrite(this, status);
}
/** Closes the underlying channel. */
public void close() throws IOException {
Channel source = channel;
if(source != null)
source.close();
}
/** Determines if the underlying channel is open. */
public boolean isOpen() {
Channel source = channel;
return source != null ? source.isOpen() : false;
}
public void shutdown() {
Shutdownable listener = observer;
if(listener != null)
listener.shutdown();
}
/** Unused, Unsupported. */
public void handleIOException(IOException x) {
throw new RuntimeException("Unsupported", x);
}
public boolean hasBufferedOutput() {
InterestWritableByteChannel channel = this.channel;
return channel != null && channel.hasBufferedOutput();
}
public boolean handleWrite() throws IOException {
WriteObserver interested = observer;
if(interested != null)
return interested.handleWrite();
else
return false;
}
public int write(ByteBuffer src) throws IOException {
InterestWritableByteChannel source = channel;
if(source == null)
throw new IllegalStateException("no source!");
return source.write(src);
}
}