package org.limewire.nio.channel;
import org.limewire.nio.observer.WriteObserver;
/**
* Defines an interface that allows {@link InterestWritableByteChannel
* InterestWritableByteChannels} to be set as the target writing channel
* for this object.
* <p>
* The general flow for chained writing goes something as follows.
* <p>
* Install a chain:
* <pre>
* ChannelWriter a = new ProtocolWriter();
* ChannelWriter b = new Obfuscator();
* ChannelWriter c = new DataDeflater();
* a.setWriteChannel(b);
* b.setWriteChannel(c);
* MyNIOMultiplexor.setWriteObserver(a);
* </pre>
* When writing can happen on the socket, the {@link NIOMultiplexor} notifies its
* internal source that a write can happen. That source will notify the last
* chain that was interested in it (generally 'c' above, the deflator).
* 'c' can choose to either pass the event to the last chain that was interested
* in it (generally 'b') or to instead write data directly to its source.
* It would opt to write to the source in the case where data was already deflated,
* and could opt to propagate the event if there was still room to write and someone
* was interested in getting the event.
*/
public interface ChannelWriter extends WriteObserver {
/**
* Set the write target, AKA sink. This object should immediately
* register interest with the newChannel if there is any data to be
* written.
*/
void setWriteChannel(InterestWritableByteChannel newChannel);
/** Returns the write target, AKA sink. */
InterestWritableByteChannel getWriteChannel();
}