package org.openamq.nio; import java.io.IOException; import org.apache.mina.common.ByteBuffer; import org.apache.mina.common.IoFilterChain; import org.apache.mina.common.IoSession; import org.apache.mina.common.IoFilter.WriteRequest; import org.apache.mina.common.support.AbstractIoFilterChain; import org.apache.mina.util.Queue; /** * An {@link IoFilterChain} for socket transport (TCP/IP). * * @author The Apache Directory Project */ class SocketFilterChain extends AbstractIoFilterChain { public SocketFilterChain( IoSession parent ) { super( parent ); } protected void doWrite( IoSession session, WriteRequest writeRequest ) { SocketSessionImpl s = ( SocketSessionImpl ) session; Queue writeRequestQueue = s.getWriteRequestQueue(); // SocketIoProcessor.doFlush() will reset it after write is finished // because the buffer will be passed with messageSent event. ( ( ByteBuffer ) writeRequest.getMessage() ).mark(); synchronized( writeRequestQueue ) { writeRequestQueue.push( writeRequest ); if( writeRequestQueue.size() == 1 && session.getTrafficMask().isWritable() ) { // Notify SocketIoProcessor only when writeRequestQueue was empty. s.getIoProcessor().flush( s ); } } } protected void doClose( IoSession session ) throws IOException { SocketSessionImpl s = ( SocketSessionImpl ) session; s.getIoProcessor().remove( s ); } }