You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/01/12 08:13:46 UTC

svn commit: r124943 - in incubator/directory/network/trunk/mina/src: examples/org/apache/mina/examples/sumup java/org/apache/mina/io java/org/apache/mina/io/datagram java/org/apache/mina/io/filter java/org/apache/mina/io/socket java/org/apache/mina/protocol java/org/apache/mina/protocol/codec java/org/apache/mina/protocol/filter java/org/apache/mina/protocol/vmpipe java/org/apache/mina/util test/org/apache/mina/util

Author: trustin
Date: Tue Jan 11 23:13:42 2005
New Revision: 124943

URL: http://svn.apache.org/viewcvs?view=rev&rev=124943
Log:
 * Session.write() operation is now filtered:
   * Added IoHandlerFilter.filterWrite(ByteBuffer) and ProtocolHandlerFiler.filterWrite(Object)
   * Added IoHandlerFilterManager.write() and ProtocolHandlerFilterManager.write() to filter write operations.
   * Prohibited wrapping IoSessions and ProtocolSessions in filters for the case user caches session instance.
 * Filter priorities must be unique now to avoid confusion.

Added:
   incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/
   incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterImpl.java   (contents, props changed)
   incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterManagerTest.java   (contents, props changed)
   incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterImpl.java   (contents, props changed)
   incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterManagerTest.java   (contents, props changed)
Modified:
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AbstractMessage.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AddMessage.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Client.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientProtocolProvider.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientSessionHandler.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Constants.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ResultMessage.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Server.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerProtocolProvider.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerSessionHandler.java
   incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/SumUpMessageRecognizer.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSession.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketConnector.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilter.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilterAdapter.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecDecoder.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecEncoder.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyDecoder.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyEncoder.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/filter/ProtocolThreadPoolFilter.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ProtocolHandlerFilterManager.java

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AbstractMessage.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AbstractMessage.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AbstractMessage.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AbstractMessage.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AbstractMessage.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AbstractMessage.java	Tue Jan 11 23:13:42 2005
@@ -14,89 +14,105 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public abstract class AbstractMessage implements Message {
+public abstract class AbstractMessage implements Message
+{
 
-	private final int type;
+    private final int type;
 
-	private int sequence;
+    private int sequence;
 
-	private boolean readHeader;
+    private boolean readHeader;
 
-	private boolean wroteHeader;
-
-	protected AbstractMessage(int type) {
-		this.type = type;
-	}
-
-	public int getSequence() {
-		return sequence;
-	}
-
-	public void setSequence(int sequence) {
-		this.sequence = sequence;
-	}
-
-	public final boolean read(ByteBuffer buf) throws MessageParseException {
-		// read a header if not read yet.
-		if (!readHeader) {
-			readHeader = readHeader(buf);
-			if (!readHeader)
-				return false;
-		}
-
-		// Header is read, now try to read body
-		if (readBody(buf)) {
-			// finished reading single complete message
-			readHeader = false; // reset state
-			return true;
-		} else
-			return false;
-	}
-
-	private boolean readHeader(ByteBuffer buf) throws MessageParseException {
-		// if header is not fully read, don't read it.
-		if (buf.remaining() < Constants.HEADER_LEN)
-			return false;
-
-		// read header and validate the message
-		int readType = buf.getShort();
-		if (type != readType)
-			throw new MessageParseException("type mismatches: " + readType
-					+ " (expected: " + type + ')');
-
-		// read sequence number of the message
-		sequence = buf.getInt();
-		return true;
-	}
-
-	protected abstract boolean readBody(ByteBuffer buf)
-			throws MessageParseException;
-
-	public boolean write(ByteBuffer buf) {
-		// write a header if not written yet.
-		if (!wroteHeader) {
-			wroteHeader = writeHeader(buf);
-			if (!wroteHeader)
-				return false; // buffer is almost full perhaps
-		}
-
-		// Header is written, now try to write body
-		if (writeBody(buf)) {
-			// finished writing single complete message
-			wroteHeader = false;
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	private boolean writeHeader(ByteBuffer buf) {
-		// check if there is enough space to write header
-		if (buf.remaining() < Constants.HEADER_LEN) return false;
-		buf.putShort((short) type);
-		buf.putInt(sequence);
-		return true;
-	}
+    private boolean wroteHeader;
+
+    protected AbstractMessage( int type )
+    {
+        this.type = type;
+    }
+
+    public int getSequence()
+    {
+        return sequence;
+    }
+
+    public void setSequence( int sequence )
+    {
+        this.sequence = sequence;
+    }
+
+    public final boolean read( ByteBuffer buf ) throws MessageParseException
+    {
+        // read a header if not read yet.
+        if( !readHeader )
+        {
+            readHeader = readHeader( buf );
+            if( !readHeader )
+                return false;
+        }
+
+        // Header is read, now try to read body
+        if( readBody( buf ) )
+        {
+            // finished reading single complete message
+            readHeader = false; // reset state
+            return true;
+        }
+        else
+            return false;
+    }
+
+    private boolean readHeader( ByteBuffer buf ) throws MessageParseException
+    {
+        // if header is not fully read, don't read it.
+        if( buf.remaining() < Constants.HEADER_LEN )
+            return false;
+
+        // read header and validate the message
+        int readType = buf.getShort();
+        if( type != readType )
+            throw new MessageParseException( "type mismatches: " + readType
+                                             + " (expected: " + type + ')' );
+
+        // read sequence number of the message
+        sequence = buf.getInt();
+        return true;
+    }
+
+    protected abstract boolean readBody( ByteBuffer buf )
+            throws MessageParseException;
+
+    public boolean write( ByteBuffer buf )
+    {
+        // write a header if not written yet.
+        if( !wroteHeader )
+        {
+            wroteHeader = writeHeader( buf );
+            if( !wroteHeader )
+                return false; // buffer is almost full perhaps
+        }
+
+        // Header is written, now try to write body
+        if( writeBody( buf ) )
+        {
+            // finished writing single complete message
+            wroteHeader = false;
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    private boolean writeHeader( ByteBuffer buf )
+    {
+        // check if there is enough space to write header
+        if( buf.remaining() < Constants.HEADER_LEN )
+            return false;
+        buf.putShort( ( short ) type );
+        buf.putInt( sequence );
+        return true;
+    }
 
-	protected abstract boolean writeBody(ByteBuffer buf);
+    protected abstract boolean writeBody( ByteBuffer buf );
 }

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AddMessage.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AddMessage.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AddMessage.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AddMessage.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AddMessage.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/AddMessage.java	Tue Jan 11 23:13:42 2005
@@ -13,41 +13,49 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class AddMessage extends AbstractMessage {
-	
-	private int value;
-
-	protected AddMessage() {
-		super(Constants.ADD);
-	}
-	
-	public int getValue() {
-		return value;
-	}
-	
-	public void setValue(int value) {
-		this.value = value;
-	}
-
-	protected boolean readBody(ByteBuffer buf) throws MessageParseException {
-		// don't read body if it is partially readable
-		if (buf.remaining() < Constants.ADD_BODY_LEN) return false;
-		value = buf.getInt();
-		return true;
-	}
-
-	protected boolean writeBody(ByteBuffer buf) {
-		// check if there is enough space to write body
-		if (buf.remaining() < Constants.ADD_BODY_LEN)
-			return false;
-		
-		buf.putInt(value);
-		
-		return true;
-	}
-	
-	public String toString() {
-		// it is a good practice to create toString() method on message classes.
-		return getSequence() + ":ADD(" + value + ')';
-	}
-}
+public class AddMessage extends AbstractMessage
+{
+
+    private int value;
+
+    protected AddMessage()
+    {
+        super( Constants.ADD );
+    }
+
+    public int getValue()
+    {
+        return value;
+    }
+
+    public void setValue( int value )
+    {
+        this.value = value;
+    }
+
+    protected boolean readBody( ByteBuffer buf ) throws MessageParseException
+    {
+        // don't read body if it is partially readable
+        if( buf.remaining() < Constants.ADD_BODY_LEN )
+            return false;
+        value = buf.getInt();
+        return true;
+    }
+
+    protected boolean writeBody( ByteBuffer buf )
+    {
+        // check if there is enough space to write body
+        if( buf.remaining() < Constants.ADD_BODY_LEN )
+            return false;
+
+        buf.putInt( value );
+
+        return true;
+    }
+
+    public String toString()
+    {
+        // it is a good practice to create toString() method on message classes.
+        return getSequence() + ":ADD(" + value + ')';
+    }
+}
\ No newline at end of file

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Client.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Client.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Client.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Client.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Client.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Client.java	Tue Jan 11 23:13:42 2005
@@ -19,22 +19,28 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class Client {
-	private static final String HOSTNAME = "localhost";
-	private static final int PORT = 8080;
-	private static final int CONNECT_TIMEOUT = 30; // seconds
-
-	public static void main(String[] args) throws Throwable {
-	    if (args.length == 0) {
-	        System.out.println("Please specify the list of any integers");
-	        return;
-	    }
-
-		// prepare values to sum up
-		int[] values = new int[args.length];
-		for (int i = 0; i < args.length; i++) {
-			values[i] = Integer.parseInt(args[i]);
-		}
+public class Client
+{
+    private static final String HOSTNAME = "localhost";
+
+    private static final int PORT = 8080;
+
+    private static final int CONNECT_TIMEOUT = 30; // seconds
+
+    public static void main( String[] args ) throws Throwable
+    {
+        if( args.length == 0 )
+        {
+            System.out.println( "Please specify the list of any integers" );
+            return;
+        }
+
+        // prepare values to sum up
+        int[] values = new int[ args.length ];
+        for( int i = 0; i < args.length; i++ )
+        {
+            values[ i ] = Integer.parseInt( args[ i ] );
+        }
 
         // Create I/O and Protocol thread pool filter.
         // I/O thread pool performs encoding and decoding of messages.
@@ -46,31 +52,39 @@
         ioThreadPoolFilter.start();
         protocolThreadPoolFilter.start();
 
-		Connector connector = new SocketConnector();
-		IoAdapter adapter = new IoAdapter();
-		
-		connector.addFilter(Integer.MAX_VALUE, ioThreadPoolFilter);
-		adapter.addFilter(Integer.MAX_VALUE, protocolThreadPoolFilter);
-		
-		ProtocolProvider protocolProvider = new ClientProtocolProvider(values);
-		for ( ;; ) {
-			try {
-				connector.connect(new InetSocketAddress(HOSTNAME, PORT), CONNECT_TIMEOUT, adapter.adapt(protocolProvider));
-				break;
-			} catch (IOException e) {
-				System.err.println("Failed to connect.");
-				e.printStackTrace();
-				Thread.sleep(5000);
-			}
-		}
-		
-		// wait until the summation is done
-		ClientSessionHandler sessionHandler = (ClientSessionHandler) protocolProvider.getHandler();
-		while ( sessionHandler.isFinished() ) {
-			Thread.sleep(100);
-		}
-		
-		ioThreadPoolFilter.stop();
-		protocolThreadPoolFilter.stop();
-	}
+        Connector connector = new SocketConnector();
+        IoAdapter adapter = new IoAdapter();
+
+        connector.addFilter( Integer.MAX_VALUE, ioThreadPoolFilter );
+        adapter.addFilter( Integer.MAX_VALUE, protocolThreadPoolFilter );
+
+        ProtocolProvider protocolProvider = new ClientProtocolProvider( values );
+        for( ;; )
+        {
+            try
+            {
+                connector.connect( new InetSocketAddress( HOSTNAME, PORT ),
+                                   CONNECT_TIMEOUT, adapter
+                                           .adapt( protocolProvider ) );
+                break;
+            }
+            catch( IOException e )
+            {
+                System.err.println( "Failed to connect." );
+                e.printStackTrace();
+                Thread.sleep( 5000 );
+            }
+        }
+
+        // wait until the summation is done
+        ClientSessionHandler sessionHandler = ( ClientSessionHandler ) protocolProvider
+                .getHandler();
+        while( sessionHandler.isFinished() )
+        {
+            Thread.sleep( 100 );
+        }
+
+        ioThreadPoolFilter.stop();
+        protocolThreadPoolFilter.stop();
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientProtocolProvider.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientProtocolProvider.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientProtocolProvider.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientProtocolProvider.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientProtocolProvider.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientProtocolProvider.java	Tue Jan 11 23:13:42 2005
@@ -17,30 +17,39 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$, 
  */
-public class ClientProtocolProvider implements ProtocolProvider {
+public class ClientProtocolProvider implements ProtocolProvider
+{
 
-	private static final ProtocolCodecFactory CODEC_FACTORY = new ProtocolCodecFactory() {
+    private static final ProtocolCodecFactory CODEC_FACTORY = new ProtocolCodecFactory()
+    {
 
-		public ProtocolEncoder newEncoder() {
-			return new NettyEncoder();
-		}
-
-		public ProtocolDecoder newDecoder() {
-			return new NettyDecoder(new SumUpMessageRecognizer(SumUpMessageRecognizer.CLIENT_MODE));
-		}
-	};
-	
-	private final ProtocolHandler handler;
-	
-	public ClientProtocolProvider(int[] values) {
-		handler = new ClientSessionHandler(values);
-	}
-
-	public ProtocolCodecFactory getCodecFactory() {
-		return CODEC_FACTORY;
-	}
-
-	public ProtocolHandler getHandler() {
-		return handler;
-	}
-}
+        public ProtocolEncoder newEncoder()
+        {
+            return new NettyEncoder();
+        }
+
+        public ProtocolDecoder newDecoder()
+        {
+            return new NettyDecoder(
+                                     new SumUpMessageRecognizer(
+                                                                 SumUpMessageRecognizer.CLIENT_MODE ) );
+        }
+    };
+
+    private final ProtocolHandler handler;
+
+    public ClientProtocolProvider( int[] values )
+    {
+        handler = new ClientSessionHandler( values );
+    }
+
+    public ProtocolCodecFactory getCodecFactory()
+    {
+        return CODEC_FACTORY;
+    }
+
+    public ProtocolHandler getHandler()
+    {
+        return handler;
+    }
+}
\ No newline at end of file

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientSessionHandler.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientSessionHandler.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientSessionHandler.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientSessionHandler.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientSessionHandler.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ClientSessionHandler.java	Tue Jan 11 23:13:42 2005
@@ -13,67 +13,82 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class ClientSessionHandler implements ProtocolHandler {
-	private final int[] values;
-	private boolean finished;
-
-	public ClientSessionHandler(int[] values) {
-		this.values = values;
-	}
-
-	public boolean isFinished() {
-		return finished;
-	}
-
-	public void sessionOpened(ProtocolSession session) {
-		System.out.println("OPENED");
-		// send summation requests
-		for (int i = 0; i < values.length; i++) {
-			AddMessage m = new AddMessage();
-			m.setSequence(i);
-			m.setValue(values[i]);
-			session.write(m);
-		}
-	}
-
-	public void sessionClosed(ProtocolSession session) {
-		System.out.println("CLOSED");
-	}
-
-	public void messageReceived(ProtocolSession session, Object message) {
-		System.out.println("RCVD: " + message);
-		// server only sends ResultMessage. otherwise, we will have to identify
-		// its type using instanceof operator.
-		ResultMessage rm = (ResultMessage) message;
-		if (rm.isOk()) {
-			// server returned OK code.
-			// if received the result message which has the last sequence
-			// number,
-			// it is time to disconnect.
-			if (rm.getSequence() == values.length - 1) {
-				// print the sum and disconnect.
-				System.out.println("The sum: " + rm.getValue());
-				session.close();
-				finished = true;
-			}
-		} else {
-			// seever returned error code because of overflow, etc.
-			System.err.println("Server error, disconnecting...");
-			session.close();
-			finished = true;
-		}
-	}
-
-	public void messageSent(ProtocolSession session, Object message) {
-		System.out.println("SENT: " + message);
-	}
-
-	public void sessionIdle(ProtocolSession session, IdleStatus status) {
-		// there is no idle time for client
-	}
-
-	public void exceptionCaught(ProtocolSession session, Throwable cause) {
-		cause.printStackTrace();
-		session.close();
-	}
+public class ClientSessionHandler implements ProtocolHandler
+{
+    private final int[] values;
+
+    private boolean finished;
+
+    public ClientSessionHandler( int[] values )
+    {
+        this.values = values;
+    }
+
+    public boolean isFinished()
+    {
+        return finished;
+    }
+
+    public void sessionOpened( ProtocolSession session )
+    {
+        System.out.println( "OPENED" );
+        // send summation requests
+        for( int i = 0; i < values.length; i++ )
+        {
+            AddMessage m = new AddMessage();
+            m.setSequence( i );
+            m.setValue( values[ i ] );
+            session.write( m );
+        }
+    }
+
+    public void sessionClosed( ProtocolSession session )
+    {
+        System.out.println( "CLOSED" );
+    }
+
+    public void messageReceived( ProtocolSession session, Object message )
+    {
+        System.out.println( "RCVD: " + message );
+        // server only sends ResultMessage. otherwise, we will have to identify
+        // its type using instanceof operator.
+        ResultMessage rm = ( ResultMessage ) message;
+        if( rm.isOk() )
+        {
+            // server returned OK code.
+            // if received the result message which has the last sequence
+            // number,
+            // it is time to disconnect.
+            if( rm.getSequence() == values.length - 1 )
+            {
+                // print the sum and disconnect.
+                System.out.println( "The sum: " + rm.getValue() );
+                session.close();
+                finished = true;
+            }
+        }
+        else
+        {
+            // seever returned error code because of overflow, etc.
+            System.err.println( "Server error, disconnecting..." );
+            session.close();
+            finished = true;
+        }
+    }
+
+    public void messageSent( ProtocolSession session, Object message )
+    {
+        System.out.println( "SENT: " + message );
+    }
+
+    public void sessionIdle( ProtocolSession session, IdleStatus status )
+    {
+        // there is no idle time for client
+    }
+
+    public void exceptionCaught( ProtocolSession session, Throwable cause )
+    {
+        cause.printStackTrace();
+        session.close();
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Constants.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Constants.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Constants.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Constants.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Constants.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Constants.java	Tue Jan 11 23:13:42 2005
@@ -9,23 +9,32 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class Constants {
-	public static final int TYPE_LEN = 2;
-	public static final int SEQUENCE_LEN = 4;
-	public static final int HEADER_LEN = TYPE_LEN + SEQUENCE_LEN;
-	public static final int BODY_LEN = 12;
-	
-	public static final int RESULT = 0;
-	public static final int ADD = 1;
-	
-	public static final int RESULT_CODE_LEN = 2;
-	public static final int RESULT_VALUE_LEN = 4;
-	public static final int ADD_BODY_LEN = 4;
-	
-	public static final int RESULT_OK = 0;
-	public static final int RESULT_ERROR = 1;
-	
-	private Constants() {
-	}
+public class Constants
+{
+    public static final int TYPE_LEN = 2;
 
-}
+    public static final int SEQUENCE_LEN = 4;
+
+    public static final int HEADER_LEN = TYPE_LEN + SEQUENCE_LEN;
+
+    public static final int BODY_LEN = 12;
+
+    public static final int RESULT = 0;
+
+    public static final int ADD = 1;
+
+    public static final int RESULT_CODE_LEN = 2;
+
+    public static final int RESULT_VALUE_LEN = 4;
+
+    public static final int ADD_BODY_LEN = 4;
+
+    public static final int RESULT_OK = 0;
+
+    public static final int RESULT_ERROR = 1;
+
+    private Constants()
+    {
+    }
+
+}
\ No newline at end of file

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ResultMessage.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ResultMessage.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ResultMessage.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ResultMessage.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ResultMessage.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ResultMessage.java	Tue Jan 11 23:13:42 2005
@@ -13,88 +13,107 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class ResultMessage extends AbstractMessage {
+public class ResultMessage extends AbstractMessage
+{
 
-	private boolean ok;
+    private boolean ok;
 
-	private int value;
+    private int value;
 
-	private boolean processedResultCode;
+    private boolean processedResultCode;
 
-	public ResultMessage() {
-		super(Constants.RESULT);
-	}
-
-	public boolean isOk() {
-		return ok;
-	}
-
-	public void setOk(boolean ok) {
-		this.ok = ok;
-	}
-
-	public int getValue() {
-		return value;
-	}
-
-	public void setValue(int value) {
-		this.value = value;
-	}
-
-	protected boolean readBody(ByteBuffer buf) throws MessageParseException {
-		if (!processedResultCode) {
-			processedResultCode = readResultCode(buf);
-			if (!processedResultCode)
-				return false;
-		}
-
-		if (ok) {
-			if (readValue(buf)) {
-				processedResultCode = false;
-				return true;
-			} else
-				return false;
-		} else {
-			processedResultCode = false;
-			return true;
-		}
-	}
-
-	private boolean readResultCode(ByteBuffer buf) {
-		if (buf.remaining() < Constants.RESULT_CODE_LEN)
-			return false;
-		ok = buf.getShort() == Constants.RESULT_OK;
-		return true;
-	}
-
-	private boolean readValue(ByteBuffer buf) {
-		if (buf.remaining() < Constants.RESULT_VALUE_LEN)
-			return false;
-		value = buf.getInt();
-		return true;
-
-	}
-
-	protected boolean writeBody(ByteBuffer buf) {
-		// check if there is enough space to write body
-		if (buf.remaining() < Constants.RESULT_CODE_LEN
-				+ Constants.RESULT_VALUE_LEN)
-			return false;
-		
-		buf
-				.putShort((short) (ok ? Constants.RESULT_OK
-						: Constants.RESULT_ERROR));
-		if (ok)
-			buf.putInt(value);
-		
-		return true;
-	}
-
-	public String toString() {
-		if (ok) {
-			return getSequence() + ":RESULT(" + value + ')';
-		} else {
-			return getSequence() + ":RESULT(ERROR)";
-		}
-	}
+    public ResultMessage()
+    {
+        super( Constants.RESULT );
+    }
+
+    public boolean isOk()
+    {
+        return ok;
+    }
+
+    public void setOk( boolean ok )
+    {
+        this.ok = ok;
+    }
+
+    public int getValue()
+    {
+        return value;
+    }
+
+    public void setValue( int value )
+    {
+        this.value = value;
+    }
+
+    protected boolean readBody( ByteBuffer buf ) throws MessageParseException
+    {
+        if( !processedResultCode )
+        {
+            processedResultCode = readResultCode( buf );
+            if( !processedResultCode )
+                return false;
+        }
+
+        if( ok )
+        {
+            if( readValue( buf ) )
+            {
+                processedResultCode = false;
+                return true;
+            }
+            else
+                return false;
+        }
+        else
+        {
+            processedResultCode = false;
+            return true;
+        }
+    }
+
+    private boolean readResultCode( ByteBuffer buf )
+    {
+        if( buf.remaining() < Constants.RESULT_CODE_LEN )
+            return false;
+        ok = buf.getShort() == Constants.RESULT_OK;
+        return true;
+    }
+
+    private boolean readValue( ByteBuffer buf )
+    {
+        if( buf.remaining() < Constants.RESULT_VALUE_LEN )
+            return false;
+        value = buf.getInt();
+        return true;
+
+    }
+
+    protected boolean writeBody( ByteBuffer buf )
+    {
+        // check if there is enough space to write body
+        if( buf.remaining() < Constants.RESULT_CODE_LEN
+                              + Constants.RESULT_VALUE_LEN )
+            return false;
+
+        buf.putShort( ( short ) ( ok ? Constants.RESULT_OK
+                                    : Constants.RESULT_ERROR ) );
+        if( ok )
+            buf.putInt( value );
+
+        return true;
+    }
+
+    public String toString()
+    {
+        if( ok )
+        {
+            return getSequence() + ":RESULT(" + value + ')';
+        }
+        else
+        {
+            return getSequence() + ":RESULT(ERROR)";
+        }
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Server.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Server.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Server.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Server.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Server.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/Server.java	Tue Jan 11 23:13:42 2005
@@ -17,10 +17,12 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class Server {
-	private static final int SERVER_PORT = 8080;
+public class Server
+{
+    private static final int SERVER_PORT = 8080;
 
-	public static void main(String[] args) throws Throwable {
+    public static void main( String[] args ) throws Throwable
+    {
         // Create I/O and Protocol thread pool filter.
         // I/O thread pool performs encoding and decoding of messages.
         // Protocol thread pool performs actual protocol flow.
@@ -31,13 +33,14 @@
         ioThreadPoolFilter.start();
         protocolThreadPoolFilter.start();
 
-		Acceptor acceptor = new SocketAcceptor();
-		IoAdapter adapter = new IoAdapter();
-		
-		acceptor.addFilter(Integer.MAX_VALUE, ioThreadPoolFilter);
-		adapter.addFilter(Integer.MAX_VALUE, protocolThreadPoolFilter);
+        Acceptor acceptor = new SocketAcceptor();
+        IoAdapter adapter = new IoAdapter();
 
-		acceptor.bind(new InetSocketAddress(SERVER_PORT), adapter.adapt(new ServerProtocolProvider()));
-		System.out.println("Listening on port " + SERVER_PORT);
-	}
+        acceptor.addFilter( Integer.MAX_VALUE, ioThreadPoolFilter );
+        adapter.addFilter( Integer.MAX_VALUE, protocolThreadPoolFilter );
+
+        acceptor.bind( new InetSocketAddress( SERVER_PORT ), adapter
+                .adapt( new ServerProtocolProvider() ) );
+        System.out.println( "Listening on port " + SERVER_PORT );
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerProtocolProvider.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerProtocolProvider.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerProtocolProvider.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerProtocolProvider.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerProtocolProvider.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerProtocolProvider.java	Tue Jan 11 23:13:42 2005
@@ -17,29 +17,38 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$, 
  */
-public class ServerProtocolProvider implements ProtocolProvider {
+public class ServerProtocolProvider implements ProtocolProvider
+{
 
-	private static final ProtocolCodecFactory CODEC_FACTORY = new ProtocolCodecFactory() {
+    private static final ProtocolCodecFactory CODEC_FACTORY = new ProtocolCodecFactory()
+    {
 
-		public ProtocolEncoder newEncoder() {
-			return new NettyEncoder();
-		}
-
-		public ProtocolDecoder newDecoder() {
-			return new NettyDecoder(new SumUpMessageRecognizer(SumUpMessageRecognizer.SERVER_MODE));
-		}
-	};
-	
-	private static final ProtocolHandler HANDLER = new ServerSessionHandler();
-	
-	public ServerProtocolProvider() {
-	}
-
-	public ProtocolCodecFactory getCodecFactory() {
-		return CODEC_FACTORY;
-	}
-
-	public ProtocolHandler getHandler() {
-		return HANDLER;
-	}
-}
+        public ProtocolEncoder newEncoder()
+        {
+            return new NettyEncoder();
+        }
+
+        public ProtocolDecoder newDecoder()
+        {
+            return new NettyDecoder(
+                                     new SumUpMessageRecognizer(
+                                                                 SumUpMessageRecognizer.SERVER_MODE ) );
+        }
+    };
+
+    private static final ProtocolHandler HANDLER = new ServerSessionHandler();
+
+    public ServerProtocolProvider()
+    {
+    }
+
+    public ProtocolCodecFactory getCodecFactory()
+    {
+        return CODEC_FACTORY;
+    }
+
+    public ProtocolHandler getHandler()
+    {
+        return HANDLER;
+    }
+}
\ No newline at end of file

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerSessionHandler.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerSessionHandler.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerSessionHandler.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerSessionHandler.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerSessionHandler.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/ServerSessionHandler.java	Tue Jan 11 23:13:42 2005
@@ -15,67 +15,78 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class ServerSessionHandler implements ProtocolHandler {
+public class ServerSessionHandler implements ProtocolHandler
+{
 
-	public ServerSessionHandler() {
-	}
-
-	public void sessionOpened(ProtocolSession session) {
-		System.out.println("OPENED");
-		// set idle time to 60 seconds
-		session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60);
-
-		// initial sum is zero
-		session.setAttachment(new Integer(0));
-	}
-
-	public void sessionClosed(ProtocolSession session) {
-		System.out.println("CLOSED");
-	}
-
-	public void messageReceived(ProtocolSession session, Object message) {
-		System.out.println("RCVD: " + message);
-		// client only sends AddMessage. otherwise, we will have to identify
-		// its type using instanceof operator.
-		AddMessage am = (AddMessage) message;
-
-		// add the value to the current sum.
-		int sum = ((Integer) session.getAttachment()).intValue();
-		int value = am.getValue();
-		long expectedSum = (long) sum + value;
-		if (expectedSum > Integer.MAX_VALUE || expectedSum < Integer.MIN_VALUE) {
-			// if the sum overflows or underflows, return error message
-			ResultMessage rm = new ResultMessage();
-			rm.setSequence(am.getSequence()); // copy sequence
-			rm.setOk(false);
-			session.write(rm);
-		} else {
-			// sum up
-			sum = (int) expectedSum;
-			session.setAttachment(new Integer(sum));
-
-			// return the result message
-			ResultMessage rm = new ResultMessage();
-			rm.setSequence(am.getSequence()); // copy sequence
-			rm.setOk(true);
-			rm.setValue(sum);
-			session.write(rm);
-		}
-	}
-
-	public void messageSent(ProtocolSession session, Object message) {
-		System.out.println("SENT: " + message);
-	}
-
-	public void sessionIdle(ProtocolSession session, IdleStatus status) {
-		System.out.println("Disconnecting the idle.");
-		// disconnect an idle client
-		session.close();
-	}
-
-	public void exceptionCaught(ProtocolSession session, Throwable cause) {
-		cause.printStackTrace();
-		// close the connection on exceptional situation
-		session.close();
-	}
+    public ServerSessionHandler()
+    {
+    }
+
+    public void sessionOpened( ProtocolSession session )
+    {
+        System.out.println( "OPENED" );
+        // set idle time to 60 seconds
+        session.getConfig().setIdleTime( IdleStatus.BOTH_IDLE, 60 );
+
+        // initial sum is zero
+        session.setAttachment( new Integer( 0 ) );
+    }
+
+    public void sessionClosed( ProtocolSession session )
+    {
+        System.out.println( "CLOSED" );
+    }
+
+    public void messageReceived( ProtocolSession session, Object message )
+    {
+        System.out.println( "RCVD: " + message );
+        // client only sends AddMessage. otherwise, we will have to identify
+        // its type using instanceof operator.
+        AddMessage am = ( AddMessage ) message;
+
+        // add the value to the current sum.
+        int sum = ( ( Integer ) session.getAttachment() ).intValue();
+        int value = am.getValue();
+        long expectedSum = ( long ) sum + value;
+        if( expectedSum > Integer.MAX_VALUE || expectedSum < Integer.MIN_VALUE )
+        {
+            // if the sum overflows or underflows, return error message
+            ResultMessage rm = new ResultMessage();
+            rm.setSequence( am.getSequence() ); // copy sequence
+            rm.setOk( false );
+            session.write( rm );
+        }
+        else
+        {
+            // sum up
+            sum = ( int ) expectedSum;
+            session.setAttachment( new Integer( sum ) );
+
+            // return the result message
+            ResultMessage rm = new ResultMessage();
+            rm.setSequence( am.getSequence() ); // copy sequence
+            rm.setOk( true );
+            rm.setValue( sum );
+            session.write( rm );
+        }
+    }
+
+    public void messageSent( ProtocolSession session, Object message )
+    {
+        System.out.println( "SENT: " + message );
+    }
+
+    public void sessionIdle( ProtocolSession session, IdleStatus status )
+    {
+        System.out.println( "Disconnecting the idle." );
+        // disconnect an idle client
+        session.close();
+    }
+
+    public void exceptionCaught( ProtocolSession session, Throwable cause )
+    {
+        cause.printStackTrace();
+        // close the connection on exceptional situation
+        session.close();
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/SumUpMessageRecognizer.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/SumUpMessageRecognizer.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/SumUpMessageRecognizer.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/SumUpMessageRecognizer.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/SumUpMessageRecognizer.java	(original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/sumup/SumUpMessageRecognizer.java	Tue Jan 11 23:13:42 2005
@@ -17,50 +17,57 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class SumUpMessageRecognizer implements MessageRecognizer {
+public class SumUpMessageRecognizer implements MessageRecognizer
+{
 
-	public static final int CLIENT_MODE = 1;
+    public static final int CLIENT_MODE = 1;
 
-	public static final int SERVER_MODE = 2;
+    public static final int SERVER_MODE = 2;
 
-	private int mode;
+    private int mode;
 
-	public SumUpMessageRecognizer(int mode) {
-		switch (mode) {
-		case CLIENT_MODE:
-		case SERVER_MODE:
-			this.mode = mode;
-			break;
-		default:
-			throw new IllegalArgumentException("invalid mode: " + mode);
-		}
-	}
-
-	public Message recognize(ByteBuffer buf) throws MessageParseException {
-		// return null if message type is not arrived yet.
-		if (buf.remaining() < Constants.TYPE_LEN)
-			return null;
-		
-		int type = buf.getShort();
-		switch (mode) {
-		// server can receive ADD message only.
-		case SERVER_MODE:
-			switch (type) {
-			case Constants.ADD:
-				return new AddMessage();
-			default:
-				throw new MessageParseException("unknown type: " + type);
-			}
-		// client can receive RESULT message only.
-		case CLIENT_MODE:
-			switch (type) {
-			case Constants.RESULT:
-				return new ResultMessage();
-			default:
-				throw new MessageParseException("unknown type: " + type);
-			}
-		default:
-			throw new InternalError(); // this cannot happen
-		}
-	}
+    public SumUpMessageRecognizer( int mode )
+    {
+        switch( mode )
+        {
+        case CLIENT_MODE:
+        case SERVER_MODE:
+            this.mode = mode;
+            break;
+        default:
+            throw new IllegalArgumentException( "invalid mode: " + mode );
+        }
+    }
+
+    public Message recognize( ByteBuffer buf ) throws MessageParseException
+    {
+        // return null if message type is not arrived yet.
+        if( buf.remaining() < Constants.TYPE_LEN )
+            return null;
+
+        int type = buf.getShort();
+        switch( mode )
+        {
+        // server can receive ADD message only.
+        case SERVER_MODE:
+            switch( type )
+            {
+            case Constants.ADD:
+                return new AddMessage();
+            default:
+                throw new MessageParseException( "unknown type: " + type );
+            }
+        // client can receive RESULT message only.
+        case CLIENT_MODE:
+            switch( type )
+            {
+            case Constants.RESULT:
+                return new ResultMessage();
+            default:
+                throw new MessageParseException( "unknown type: " + type );
+            }
+        default:
+            throw new InternalError(); // this cannot happen
+        }
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java	Tue Jan 11 23:13:42 2005
@@ -66,8 +66,8 @@
      * 
      * @throws IOException if failed to connect
      */
-    void connect( SocketAddress address, int timeout,
-                      IoHandler defaultHandler ) throws IOException;
+    void connect( SocketAddress address, int timeout, IoHandler defaultHandler )
+            throws IOException;
 
     /**
      * Adds the specified filter with the specified priority.  Greater priority

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java	Tue Jan 11 23:13:42 2005
@@ -34,6 +34,12 @@
  * <p>
  * Please refer to <a href="../../../../../xref/org/apache/mina/io/filter/BlacklistFilter.html"><code>BlacklistFilter</code></a>
  * example.
+ * <p>
+ * <strong>Please NEVER implement your filters to wrap
+ * {@link IoSession}s.</strong> Users can cache the reference to the session,
+ * which might malfunction if any filters are added or removed later.
+ * Please implement {@link #filterWrite(ByteBuffer)} method to override
+ * {@link IoSession#write(ByteBuffer, Object)} method.
  * 
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
@@ -73,4 +79,9 @@
      * Filters {@link IoHandler#dataWritten(IoSession, Object)} event.
      */
     void dataWritten( IoHandler nextHandler, IoSession session, Object marker );
+
+    /**
+     * Filters {@link IoSession#write(ByteBuffer, Object)} method invocation.
+     */
+    ByteBuffer filterWrite( ByteBuffer buf );
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java	Tue Jan 11 23:13:42 2005
@@ -68,4 +68,9 @@
     {
         nextHandler.dataWritten( session, marker );
     }
+
+    public ByteBuffer filterWrite( ByteBuffer buf )
+    {
+        return buf;
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java	Tue Jan 11 23:13:42 2005
@@ -123,7 +123,7 @@
     }
 
     public void connect( SocketAddress address, int timeout,
-                             IoHandler defaultHandler ) throws IOException
+                        IoHandler defaultHandler ) throws IOException
     {
         connect( address, defaultHandler );
     }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSession.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSession.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSession.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSession.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSession.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSession.java	Tue Jan 11 23:13:42 2005
@@ -30,6 +30,7 @@
 import org.apache.mina.io.IoSession;
 import org.apache.mina.util.IoHandlerFilterManager;
 import org.apache.mina.util.Queue;
+import org.apache.mina.util.IoHandlerFilterManager.WriteCommand;
 
 /**
  * TODO Insert type comment.
@@ -55,6 +56,8 @@
 
     private final SocketAddress localAddress;
 
+    private final WriteCommand writeCommand = new WriteCommandImpl();
+
     private SocketAddress remoteAddress;
 
     private SelectionKey key;
@@ -144,13 +147,7 @@
 
     public void write( ByteBuffer buf, Object marker )
     {
-        synchronized( writeBufferQueue )
-        {
-            writeBufferQueue.push( buf );
-            writeMarkerQueue.push( marker );
-        }
-
-        parent.flushSession( this );
+        filterManager.write( writeCommand, buf, marker );
     }
 
     public TransportType getTransportType()
@@ -245,5 +242,19 @@
         else
             throw new IllegalArgumentException( "Unknown idle status: "
                                                 + status );
+    }
+
+    private class WriteCommandImpl implements WriteCommand
+    {
+        public void execute( ByteBuffer buf, Object marker )
+        {
+            synchronized( writeBufferQueue )
+            {
+                writeBufferQueue.push( buf );
+                writeMarkerQueue.push( marker );
+            }
+
+            parent.flushSession( DatagramSession.this );
+        }
     }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java	Tue Jan 11 23:13:42 2005
@@ -543,4 +543,9 @@
             }
         }
     }
+
+    public ByteBuffer filterWrite( ByteBuffer buf )
+    {
+        return buf;
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketConnector.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketConnector.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketConnector.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketConnector.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketConnector.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketConnector.java	Tue Jan 11 23:13:42 2005
@@ -72,7 +72,7 @@
     }
 
     public void connect( SocketAddress address, int timeout,
-                             IoHandler defaultHandler ) throws IOException
+                        IoHandler defaultHandler ) throws IOException
     {
         if( address == null )
             throw new NullPointerException( "address" );
@@ -145,8 +145,8 @@
             {
                 ch.finishConnect();
                 newSession( ch, entry.handler );
-//                SocketSession session = newSession( ch, entry.handler );
-//                entry.session = session;
+                //                SocketSession session = newSession( ch, entry.handler );
+                //                entry.session = session;
                 entry.done = true;
 
                 synchronized( entry )
@@ -263,7 +263,7 @@
 
         private final IoHandler handler;
 
-//        private SocketSession session;
+        //        private SocketSession session;
 
         private boolean done;
 

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java	Tue Jan 11 23:13:42 2005
@@ -269,8 +269,8 @@
         }
         catch( Throwable e )
         {
-        	if ( e instanceof IOException )
-        		scheduleRemove( session );
+            if( e instanceof IOException )
+                scheduleRemove( session );
             session.getFilterManager().fireExceptionCaught( session, e );
         }
     }
@@ -337,8 +337,8 @@
                                     long idleTime, IdleStatus status,
                                     long lastIoTime )
     {
-        if( idleTime > 0 && !session.isIdle( status )
-            && lastIoTime != 0 && ( currentTime - lastIoTime ) >= idleTime )
+        if( idleTime > 0 && !session.isIdle( status ) && lastIoTime != 0
+            && ( currentTime - lastIoTime ) >= idleTime )
         {
             session.setIdle( status, true );
             session.getFilterManager().fireSessionIdle( session, status );
@@ -385,7 +385,7 @@
             }
             catch( IOException e )
             {
-            	scheduleRemove( session );
+                scheduleRemove( session );
                 session.getFilterManager().fireExceptionCaught( session, e );
             }
         }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java	Tue Jan 11 23:13:42 2005
@@ -30,6 +30,7 @@
 import org.apache.mina.io.IoSession;
 import org.apache.mina.util.IoHandlerFilterManager;
 import org.apache.mina.util.Queue;
+import org.apache.mina.util.IoHandlerFilterManager.WriteCommand;
 
 /**
  * TODO Insert type comment.
@@ -57,6 +58,8 @@
 
     private final SocketAddress localAddress;
 
+    private final WriteCommand writeCommand = new WriteCommandImpl();
+
     private SelectionKey key;
 
     private Object attachment;
@@ -155,13 +158,7 @@
 
     public void write( ByteBuffer buf, Object marker )
     {
-        synchronized( writeBufferQueue )
-        {
-            writeBufferQueue.push( buf );
-            writeMarkerQueue.push( marker );
-        }
-
-        SocketIoProcessor.getInstance().flushSession( this );
+        filterManager.write( writeCommand, buf, marker );
     }
 
     public TransportType getTransportType()
@@ -251,5 +248,19 @@
         else
             throw new IllegalArgumentException( "Unknown idle status: "
                                                 + status );
+    }
+
+    private class WriteCommandImpl implements WriteCommand
+    {
+        public void execute( ByteBuffer buf, Object marker )
+        {
+            synchronized( writeBufferQueue )
+            {
+                writeBufferQueue.push( buf );
+                writeMarkerQueue.push( marker );
+            }
+
+            SocketIoProcessor.getInstance().flushSession( SocketSession.this );
+        }
     }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java	Tue Jan 11 23:13:42 2005
@@ -31,6 +31,7 @@
 import org.apache.mina.io.IoSession;
 import org.apache.mina.util.ProtocolHandlerFilterManager;
 import org.apache.mina.util.Queue;
+import org.apache.mina.util.ProtocolHandlerFilterManager.WriteCommand;
 
 /**
  * Adapts the specified {@link ProtocolProvider} to {@link IoHandler}.  This is
@@ -251,7 +252,7 @@
         }
     }
 
-    private static class ProtocolSessionImpl implements ProtocolSession
+    private class ProtocolSessionImpl implements ProtocolSession
     {
         private final IoSession session;
 
@@ -263,6 +264,8 @@
 
         private final ProtocolDecoderOutputImpl decOut;
 
+        private final WriteCommand writeCommand = new WriteCommandImpl();
+
         private Object attachment;
 
         private ProtocolSessionImpl( IoSession session,
@@ -306,12 +309,7 @@
 
         public void write( Object message )
         {
-            synchronized( writeQueue )
-            {
-                writeQueue.push( message );
-            }
-
-            adapter.write( session );
+            filterManager.write( writeCommand, message );
         }
 
         public TransportType getTransportType()
@@ -367,6 +365,19 @@
         public boolean isIdle( IdleStatus status )
         {
             return session.isIdle( status );
+        }
+
+        private class WriteCommandImpl implements WriteCommand
+        {
+            public void execute( Object message )
+            {
+                synchronized( writeQueue )
+                {
+                    writeQueue.push( message );
+                }
+
+                adapter.write( session );
+            }
         }
     }
 

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilter.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilter.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilter.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilter.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilter.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilter.java	Tue Jan 11 23:13:42 2005
@@ -18,6 +18,7 @@
  */
 package org.apache.mina.protocol;
 
+import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IdleStatus;
 
 /**
@@ -31,6 +32,12 @@
  *   <li>Message transformation (e.g. encryption and decryption, ...),</li>
  *   <li>and many more.</li>
  * </ul>
+ * <p>
+ * <strong>Please NEVER implement your filters to wrap
+ * {@link ProtocolSession}s.</strong> Users can cache the reference to the
+ * session, which might malfunction if any filters are added or removed later.
+ * Please implement {@link #filterWrite(ByteBuffer)} method to override
+ * {@link ProtocolSession#write(Object)} method.
  * 
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
@@ -76,4 +83,9 @@
      */
     void messageSent( ProtocolHandler nextHandler, ProtocolSession session,
                      Object message );
+
+    /**
+     * Filters {@link ProtocolSession#write(Object)} method invocation.
+     */
+    Object filterWrite( Object message );
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilterAdapter.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilterAdapter.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilterAdapter.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilterAdapter.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilterAdapter.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolHandlerFilterAdapter.java	Tue Jan 11 23:13:42 2005
@@ -65,4 +65,9 @@
     {
         nextHandler.messageSent( session, message );
     }
+
+    public Object filterWrite( Object message )
+    {
+        return message;
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecDecoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecDecoder.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecDecoder.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecDecoder.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecDecoder.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecDecoder.java	Tue Jan 11 23:13:42 2005
@@ -19,31 +19,41 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$, 
  */
-public class Asn1CodecDecoder implements ProtocolDecoder {
+public class Asn1CodecDecoder implements ProtocolDecoder
+{
 
-	private final StatefulDecoder decoder;
-	private final DecoderCallbackImpl callback = new DecoderCallbackImpl();
-	
-	public Asn1CodecDecoder(StatefulDecoder decoder) {
-		decoder.setCallback(callback);
-		this.decoder = decoder;
-	}
-
-	public void decode(ProtocolSession session, ByteBuffer in,
-			ProtocolDecoderOutput out) throws ProtocolViolationException {
-		callback.decOut = out;
-		try {
-			decoder.decode(in.buf());
-		} catch (DecoderException e) {
-			throw new ProtocolViolationException("Failed to decode.", e);
-		}
-	}
-
-	private class DecoderCallbackImpl implements DecoderCallback {
-		private ProtocolDecoderOutput decOut;
-		
-		public void decodeOccurred(StatefulDecoder decoder, Object decoded) {
-			decOut.write(decoded);
-		}
-	}
-}
+    private final StatefulDecoder decoder;
+
+    private final DecoderCallbackImpl callback = new DecoderCallbackImpl();
+
+    public Asn1CodecDecoder( StatefulDecoder decoder )
+    {
+        decoder.setCallback( callback );
+        this.decoder = decoder;
+    }
+
+    public void decode( ProtocolSession session, ByteBuffer in,
+                       ProtocolDecoderOutput out )
+            throws ProtocolViolationException
+    {
+        callback.decOut = out;
+        try
+        {
+            decoder.decode( in.buf() );
+        }
+        catch( DecoderException e )
+        {
+            throw new ProtocolViolationException( "Failed to decode.", e );
+        }
+    }
+
+    private class DecoderCallbackImpl implements DecoderCallback
+    {
+        private ProtocolDecoderOutput decOut;
+
+        public void decodeOccurred( StatefulDecoder decoder, Object decoded )
+        {
+            decOut.write( decoded );
+        }
+    }
+}
\ No newline at end of file

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecEncoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecEncoder.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecEncoder.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecEncoder.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecEncoder.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/Asn1CodecEncoder.java	Tue Jan 11 23:13:42 2005
@@ -19,37 +19,54 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$, 
  */
-public class Asn1CodecEncoder implements ProtocolEncoder {
-	private final StatefulEncoder encoder;
-	private final EncoderCallbackImpl callback = new EncoderCallbackImpl();
+public class Asn1CodecEncoder implements ProtocolEncoder
+{
+    private final StatefulEncoder encoder;
 
-	public Asn1CodecEncoder(StatefulEncoder encoder) {
-		encoder.setCallback(callback);
-		this.encoder = encoder;
-	}
+    private final EncoderCallbackImpl callback = new EncoderCallbackImpl();
 
-	public void encode(ProtocolSession session, Object message, ProtocolEncoderOutput out) throws ProtocolViolationException {
-		callback.encOut = out;
-		try {
-			encoder.encode(message);
-		} catch (EncoderException e) {
-			throw new ProtocolViolationException("Encoding failed.", e);
-		}
-	}
-	
-	private class EncoderCallbackImpl implements EncoderCallback {
-		private ProtocolEncoderOutput encOut;
+    public Asn1CodecEncoder( StatefulEncoder encoder )
+    {
+        encoder.setCallback( callback );
+        this.encoder = encoder;
+    }
 
-		public void encodeOccurred(StatefulEncoder codec, Object encoded) {
-			if (encoded instanceof java.nio.ByteBuffer) {
-				java.nio.ByteBuffer buf = (java.nio.ByteBuffer) encoded;
-				ByteBuffer outBuf = ByteBuffer.allocate(buf.remaining());
-				outBuf.put(buf);
-				outBuf.flip();
-				encOut.write(outBuf);
-			} else {
-				throw new IllegalArgumentException("Encoded result is not a ByteBuffer: " + encoded.getClass());
-			}
-		}
-	}
-}
+    public void encode( ProtocolSession session, Object message,
+                       ProtocolEncoderOutput out )
+            throws ProtocolViolationException
+    {
+        callback.encOut = out;
+        try
+        {
+            encoder.encode( message );
+        }
+        catch( EncoderException e )
+        {
+            throw new ProtocolViolationException( "Encoding failed.", e );
+        }
+    }
+
+    private class EncoderCallbackImpl implements EncoderCallback
+    {
+        private ProtocolEncoderOutput encOut;
+
+        public void encodeOccurred( StatefulEncoder codec, Object encoded )
+        {
+            if( encoded instanceof java.nio.ByteBuffer )
+            {
+                java.nio.ByteBuffer buf = ( java.nio.ByteBuffer ) encoded;
+                ByteBuffer outBuf = ByteBuffer.allocate( buf.remaining() );
+                outBuf.put( buf );
+                outBuf.flip();
+                encOut.write( outBuf );
+            }
+            else
+            {
+                throw new IllegalArgumentException(
+                                                    "Encoded result is not a ByteBuffer: "
+                                                                                                                                                                                                                + encoded
+                                                                                                                                                                                                                        .getClass() );
+            }
+        }
+    }
+}
\ No newline at end of file

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyDecoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyDecoder.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyDecoder.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyDecoder.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyDecoder.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyDecoder.java	Tue Jan 11 23:13:42 2005
@@ -21,89 +21,119 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$,
  */
-public class NettyDecoder implements ProtocolDecoder {
-	private final MessageRecognizer recognizer;
-
-	private java.nio.ByteBuffer readBuf = java.nio.ByteBuffer.allocate(1024);
-
-	private Message readingMessage;
-
-	public NettyDecoder(MessageRecognizer recognizer) {
-		if (recognizer == null)
-			throw new NullPointerException();
-
-		this.recognizer = recognizer;
-	}
-
-	public void decode(ProtocolSession session, ByteBuffer in,
-			ProtocolDecoderOutput out) throws ProtocolViolationException {
-		
-		put(in);
-
-		Message m = readingMessage;
-		try {
-			for (;;) {
-				readBuf.flip();
-				if (m == null) {
-					int limit = readBuf.limit();
-					boolean failed = true;
-					try {
-						m = recognizer.recognize(readBuf);
-						failed = false;
-					} finally {
-						if (failed) {
-							// clear the read buffer if failed to recognize
-							readBuf.clear();
-							break;
-						} else {
-							if (m == null) {
-								readBuf.limit(readBuf.capacity());
-								readBuf.position(limit);
-								break; // finish decoding
-							} else {
-								// reset buffer for read
-								readBuf.limit(limit);
-								readBuf.position(0);
-							}
-						}
-					}
-				}
-
-				if (m != null) {
-					try {
-						if (m.read(readBuf)) {
-							out.write(m);
-							m = null;
-						}
-					} finally {
-						if (readBuf.hasRemaining()) {
-							readBuf.compact();
-						} else {
-							readBuf.clear();
-						}
-					}
-				}
-			}
-		} catch (MessageParseException e) {
-			m = null; // discard reading message
-			throw new ProtocolViolationException("Failed to decode.", e);
-		}
-		finally {
-			readingMessage = m;
-		}
-	}
-
-	private void put(ByteBuffer in) {
-		// copy to read buffer
-		if (in.remaining() > readBuf.remaining())
-			expand((readBuf.position() + in.remaining()) * 3 / 2);
-		readBuf.put(in.buf());
-	}
-
-	private void expand(int newCapacity) {
-		java.nio.ByteBuffer newBuf = java.nio.ByteBuffer.allocate(newCapacity);
-		readBuf.flip();
-		newBuf.put(readBuf);
-		readBuf = newBuf;
-	}
+public class NettyDecoder implements ProtocolDecoder
+{
+    private final MessageRecognizer recognizer;
+
+    private java.nio.ByteBuffer readBuf = java.nio.ByteBuffer.allocate( 1024 );
+
+    private Message readingMessage;
+
+    public NettyDecoder( MessageRecognizer recognizer )
+    {
+        if( recognizer == null )
+            throw new NullPointerException();
+
+        this.recognizer = recognizer;
+    }
+
+    public void decode( ProtocolSession session, ByteBuffer in,
+                       ProtocolDecoderOutput out )
+            throws ProtocolViolationException
+    {
+
+        put( in );
+
+        Message m = readingMessage;
+        try
+        {
+            for( ;; )
+            {
+                readBuf.flip();
+                if( m == null )
+                {
+                    int limit = readBuf.limit();
+                    boolean failed = true;
+                    try
+                    {
+                        m = recognizer.recognize( readBuf );
+                        failed = false;
+                    }
+                    finally
+                    {
+                        if( failed )
+                        {
+                            // clear the read buffer if failed to recognize
+                            readBuf.clear();
+                            break;
+                        }
+                        else
+                        {
+                            if( m == null )
+                            {
+                                readBuf.limit( readBuf.capacity() );
+                                readBuf.position( limit );
+                                break; // finish decoding
+                            }
+                            else
+                            {
+                                // reset buffer for read
+                                readBuf.limit( limit );
+                                readBuf.position( 0 );
+                            }
+                        }
+                    }
+                }
+
+                if( m != null )
+                {
+                    try
+                    {
+                        if( m.read( readBuf ) )
+                        {
+                            out.write( m );
+                            m = null;
+                        }
+                    }
+                    finally
+                    {
+                        if( readBuf.hasRemaining() )
+                        {
+                            readBuf.compact();
+                        }
+                        else
+                        {
+                            readBuf.clear();
+                        }
+                    }
+                }
+            }
+        }
+        catch( MessageParseException e )
+        {
+            m = null; // discard reading message
+            throw new ProtocolViolationException( "Failed to decode.", e );
+        }
+        finally
+        {
+            readingMessage = m;
+        }
+    }
+
+    private void put( ByteBuffer in )
+    {
+        // copy to read buffer
+        if( in.remaining() > readBuf.remaining() )
+            expand( ( readBuf.position() + in.remaining() ) * 3 / 2 );
+        readBuf.put( in.buf() );
+    }
+
+    private void expand( int newCapacity )
+    {
+        java.nio.ByteBuffer newBuf = java.nio.ByteBuffer
+                .allocate( newCapacity );
+        readBuf.flip();
+        newBuf.put( readBuf );
+        readBuf = newBuf;
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyEncoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyEncoder.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyEncoder.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyEncoder.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyEncoder.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/codec/NettyEncoder.java	Tue Jan 11 23:13:42 2005
@@ -19,33 +19,46 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$,
  */
-public class NettyEncoder implements ProtocolEncoder {
+public class NettyEncoder implements ProtocolEncoder
+{
 
-	public NettyEncoder() {
-	}
+    public NettyEncoder()
+    {
+    }
 
-	public void encode(ProtocolSession session, Object message,
-			ProtocolEncoderOutput out) throws ProtocolViolationException {
-		if (!(message instanceof Message)) {
-			throw new ProtocolViolationException(
-					"This encoder can decode only Netty Messages.");
-		}
+    public void encode( ProtocolSession session, Object message,
+                       ProtocolEncoderOutput out )
+            throws ProtocolViolationException
+    {
+        if( ! ( message instanceof Message ) )
+        {
+            throw new ProtocolViolationException(
+                                                  "This encoder can decode only Netty Messages." );
+        }
 
-		for (;;) {
-			ByteBuffer buf = ByteBuffer.allocate(8192);
-			Message m = (Message) message;
-			try {
-				if (m.write(buf.buf())) {
-					break;
-				}
-			} finally {
-				buf.flip();
-				if (buf.hasRemaining()) {
-					out.write(buf);
-				} else {
-					ByteBuffer.release(buf);
-				}
-			}
-		}
-	}
+        for( ;; )
+        {
+            ByteBuffer buf = ByteBuffer.allocate( 8192 );
+            Message m = ( Message ) message;
+            try
+            {
+                if( m.write( buf.buf() ) )
+                {
+                    break;
+                }
+            }
+            finally
+            {
+                buf.flip();
+                if( buf.hasRemaining() )
+                {
+                    out.write( buf );
+                }
+                else
+                {
+                    ByteBuffer.release( buf );
+                }
+            }
+        }
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/filter/ProtocolThreadPoolFilter.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/filter/ProtocolThreadPoolFilter.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/filter/ProtocolThreadPoolFilter.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/filter/ProtocolThreadPoolFilter.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/filter/ProtocolThreadPoolFilter.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/filter/ProtocolThreadPoolFilter.java	Tue Jan 11 23:13:42 2005
@@ -516,4 +516,9 @@
             }
         }
     }
+
+    public Object filterWrite( Object message )
+    {
+        return message;
+    }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java	Tue Jan 11 23:13:42 2005
@@ -13,6 +13,7 @@
 import org.apache.mina.protocol.ProtocolHandler;
 import org.apache.mina.protocol.ProtocolSession;
 import org.apache.mina.util.ProtocolHandlerFilterManager;
+import org.apache.mina.util.ProtocolHandlerFilterManager.WriteCommand;
 
 /**
  * TODO Document me.
@@ -30,14 +31,16 @@
 
     private final ProtocolHandler localHandler;
 
+    private final VmPipeSessionConfig config = new VmPipeSessionConfig();
+
+    private final WriteCommand writeCommand = new WriteCommandImpl();
+
     final ProtocolHandlerFilterManager localFilterManager;
 
     final ProtocolHandlerFilterManager remoteFilterManager;
 
     final VmPipeSession remoteSession;
 
-    private final VmPipeSessionConfig config = new VmPipeSessionConfig();
-
     private Object attachment;
 
     boolean closed;
@@ -130,12 +133,7 @@
 
     public void write( Object message )
     {
-        synchronized( lock )
-        {
-            if( closed )
-                throw new IllegalStateException( "Session is closed." );
-            remoteFilterManager.fireMessageReceived( remoteSession, message );
-        }
+        localFilterManager.write( writeCommand, message );
     }
 
     public TransportType getTransportType()
@@ -202,4 +200,19 @@
 
         throw new IllegalArgumentException( "Illegal statue: " + status );
     }
+
+    private class WriteCommandImpl implements WriteCommand
+    {
+        public void execute( Object message )
+        {
+            synchronized( lock )
+            {
+                if( closed )
+                    throw new IllegalStateException( "Session is closed." );
+                remoteFilterManager.fireMessageReceived( remoteSession,
+                                                         message );
+            }
+        }
+    }
+
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java	Tue Jan 11 23:13:42 2005
@@ -18,6 +18,9 @@
  */
 package org.apache.mina.util;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.io.IoHandler;
@@ -75,9 +78,17 @@
         {
             session.getHandler().dataWritten( session, marker );
         }
+
+        public ByteBuffer filterWrite( ByteBuffer buf )
+        {
+            return buf;
+        }
     };
 
-    private Entry head = new Entry( null, Integer.MIN_VALUE, FINAL_FILTER );
+    private Entry head = new Entry( null, null, Integer.MIN_VALUE,
+                                    FINAL_FILTER );
+
+    private final Entry tail = head;
 
     public IoHandlerFilterManager()
     {
@@ -89,31 +100,26 @@
         Entry prevEntry = null;
         for( ;; )
         {
-            if( e.nextEntry == null )
+            if( e.priority < priority )
             {
-                Entry newEntry = new Entry( e, priority, filter );
+                Entry newEntry = new Entry( prevEntry, e, priority, filter );
                 if( prevEntry == null )
                 {
                     head = newEntry;
                 }
                 else
                 {
+                    prevEntry.nextEntry.prevEntry = newEntry;
                     prevEntry.nextEntry = newEntry;
                 }
                 break;
             }
-            else if( e.priority < priority )
+            else if( e.priority == priority )
             {
-                Entry newEntry = new Entry( e, priority, filter );
-                if( prevEntry == null )
-                {
-                    head = newEntry;
-                }
-                else
-                {
-                    prevEntry.nextEntry = newEntry;
-                }
-                break;
+                throw new IllegalArgumentException(
+                                                    "Other filter is registered with priority "
+                                                                                                                                                                                                                + priority
+                                                                                                                                                                                                                + " already." );
             }
             prevEntry = e;
             e = e.nextEntry;
@@ -135,10 +141,12 @@
                 if( prevEntry == null )
                 {
                     // e is head
+                    e.nextEntry.prevEntry = null;
                     head = e.nextEntry;
                 }
                 else
                 {
+                    e.nextEntry.prevEntry = prevEntry;
                     prevEntry.nextEntry = e.nextEntry;
                 }
                 break;
@@ -226,8 +234,51 @@
         }
     }
 
+    public void write( WriteCommand cmd, ByteBuffer buf, Object marker )
+    {
+        Entry e = tail;
+        do
+        {
+            buf = e.filter.filterWrite( buf );
+            e = e.prevEntry;
+        }
+        while( e != null );
+
+        cmd.execute( buf, marker );
+    }
+
+    List filters()
+    {
+        List list = new ArrayList();
+        Entry e = head;
+        do
+        {
+            list.add( e.filter );
+            e = e.nextEntry;
+        }
+        while( e != null );
+
+        return list;
+    }
+
+    List filtersReversed()
+    {
+        List list = new ArrayList();
+        Entry e = tail;
+        do
+        {
+            list.add( e.filter );
+            e = e.prevEntry;
+        }
+        while( e != null );
+
+        return list;
+    }
+
     private static class Entry
     {
+        private Entry prevEntry;
+
         private Entry nextEntry;
 
         private final int priority;
@@ -236,10 +287,12 @@
 
         private final IoHandler nextHandler;
 
-        private Entry( Entry nextEntry, int priority, IoHandlerFilter filter )
+        private Entry( Entry prevEntry, Entry nextEntry, int priority,
+                      IoHandlerFilter filter )
         {
             if( filter == null )
                 throw new NullPointerException( "filter" );
+            this.prevEntry = prevEntry;
             this.nextEntry = nextEntry;
             this.priority = priority;
             this.filter = filter;
@@ -336,5 +389,10 @@
                 }
             };
         }
+    }
+
+    public static interface WriteCommand
+    {
+        void execute( ByteBuffer buf, Object marker );
     }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ProtocolHandlerFilterManager.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ProtocolHandlerFilterManager.java?view=diff&rev=124943&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ProtocolHandlerFilterManager.java&r1=124942&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ProtocolHandlerFilterManager.java&r2=124943
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ProtocolHandlerFilterManager.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ProtocolHandlerFilterManager.java	Tue Jan 11 23:13:42 2005
@@ -18,6 +18,9 @@
  */
 package org.apache.mina.util;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.protocol.ProtocolHandler;
 import org.apache.mina.protocol.ProtocolHandlerFilter;
@@ -69,9 +72,17 @@
         {
             session.getHandler().messageSent( session, message );
         }
+
+        public Object filterWrite( Object message )
+        {
+            return message;
+        }
     };
 
-    private Entry head = new Entry( null, Integer.MIN_VALUE, FINAL_FILTER );
+    private Entry head = new Entry( null, null, Integer.MIN_VALUE,
+                                    FINAL_FILTER );
+
+    private Entry tail = head;
 
     public ProtocolHandlerFilterManager()
     {
@@ -84,31 +95,26 @@
         Entry prevEntry = null;
         for( ;; )
         {
-            if( e.nextEntry == null )
+            if( e.priority < priority )
             {
-                Entry newEntry = new Entry( e, priority, filter );
+                Entry newEntry = new Entry( prevEntry, e, priority, filter );
                 if( prevEntry == null )
                 {
                     head = newEntry;
                 }
                 else
                 {
+                    prevEntry.nextEntry.prevEntry = newEntry;
                     prevEntry.nextEntry = newEntry;
                 }
                 break;
             }
-            else if( e.priority < priority )
+            else if( e.priority == priority )
             {
-                Entry newEntry = new Entry( e, priority, filter );
-                if( prevEntry == null )
-                {
-                    head = newEntry;
-                }
-                else
-                {
-                    prevEntry.nextEntry = newEntry;
-                }
-                break;
+                throw new IllegalArgumentException(
+                                                    "Other filter is registered with priority "
+                                                                                                                                                                                                                + priority
+                                                                                                                                                                                                                + " already." );
             }
             prevEntry = e;
             e = e.nextEntry;
@@ -130,10 +136,12 @@
                 if( prevEntry == null )
                 {
                     // e is head
+                    e.nextEntry.prevEntry = null;
                     head = e.nextEntry;
                 }
                 else
                 {
+                    e.nextEntry.prevEntry = prevEntry;
                     prevEntry.nextEntry = e.nextEntry;
                 }
                 break;
@@ -221,8 +229,51 @@
         }
     }
 
+    public void write( WriteCommand cmd, Object message )
+    {
+        Entry e = tail;
+        do
+        {
+            message = e.filter.filterWrite( message );
+            e = e.prevEntry;
+        }
+        while( e != null );
+
+        cmd.execute( message );
+    }
+
+    List filters()
+    {
+        List list = new ArrayList();
+        Entry e = head;
+        do
+        {
+            list.add( e.filter );
+            e = e.nextEntry;
+        }
+        while( e != null );
+
+        return list;
+    }
+
+    List filtersReversed()
+    {
+        List list = new ArrayList();
+        Entry e = tail;
+        do
+        {
+            list.add( e.filter );
+            e = e.prevEntry;
+        }
+        while( e != null );
+
+        return list;
+    }
+
     private static class Entry
     {
+        private Entry prevEntry;
+
         private Entry nextEntry;
 
         private final int priority;
@@ -231,11 +282,12 @@
 
         private final ProtocolHandler nextHandler;
 
-        private Entry( Entry nextEntry, int priority,
+        private Entry( Entry prevEntry, Entry nextEntry, int priority,
                       ProtocolHandlerFilter filter )
         {
             if( filter == null )
                 throw new NullPointerException( "filter" );
+            this.prevEntry = prevEntry;
             this.nextEntry = nextEntry;
             this.priority = priority;
             this.filter = filter;
@@ -337,5 +389,10 @@
                 }
             };
         }
+    }
+
+    public static interface WriteCommand
+    {
+        void execute( Object message );
     }
 }

Added: incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterImpl.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterImpl.java?view=auto&rev=124943
==============================================================================
--- (empty file)
+++ incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterImpl.java	Tue Jan 11 23:13:42 2005
@@ -0,0 +1,41 @@
+/*
+ * @(#) $Id$
+ */
+package org.apache.mina.util;
+
+import org.apache.mina.io.IoHandlerFilterAdapter;
+
+/**
+ * TODO Document me.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class IoHandlerFilterImpl extends IoHandlerFilterAdapter
+{
+    private final char c;
+
+    public IoHandlerFilterImpl( char c )
+    {
+        this.c = c;
+    }
+
+    public int hashCode()
+    {
+        return c;
+    }
+
+    public boolean equals( Object o )
+    {
+        if( o == null )
+            return false;
+        if( ! ( o instanceof IoHandlerFilterImpl ) )
+            return false;
+        return this.c == ( ( IoHandlerFilterImpl ) o ).c;
+    }
+
+    public String toString()
+    {
+        return "" + c;
+    }
+}
\ No newline at end of file

Added: incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterManagerTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterManagerTest.java?view=auto&rev=124943
==============================================================================
--- (empty file)
+++ incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/IoHandlerFilterManagerTest.java	Tue Jan 11 23:13:42 2005
@@ -0,0 +1,129 @@
+/*
+ * @(#) $Id$
+ */
+package org.apache.mina.util;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * TODO Document me.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class IoHandlerFilterManagerTest extends TestCase
+{
+    private IoHandlerFilterManager manager;
+
+    private IoHandlerFilterImpl filterA;
+
+    private IoHandlerFilterImpl filterB;
+
+    private IoHandlerFilterImpl filterC;
+
+    private IoHandlerFilterImpl filterD;
+
+    private IoHandlerFilterImpl filterE;
+
+    public void setUp()
+    {
+        manager = new IoHandlerFilterManager();
+        filterA = new IoHandlerFilterImpl( 'A' );
+        filterB = new IoHandlerFilterImpl( 'B' );
+        filterC = new IoHandlerFilterImpl( 'C' );
+        filterD = new IoHandlerFilterImpl( 'D' );
+        filterE = new IoHandlerFilterImpl( 'E' );
+        manager.addFilter( 0, filterA );
+        manager.addFilter( -2, filterB );
+        manager.addFilter( 2, filterC );
+        manager.addFilter( -1, filterD );
+        manager.addFilter( 1, filterE );
+    }
+
+    public void testAdd()
+    {
+        List list;
+        list = manager.filters();
+        assertEquals( 6, list.size() );
+        assertSame( filterC, list.get( 0 ) );
+        assertSame( filterE, list.get( 1 ) );
+        assertSame( filterA, list.get( 2 ) );
+        assertSame( filterD, list.get( 3 ) );
+        assertSame( filterB, list.get( 4 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 6, list.size() );
+        assertSame( filterC, list.get( 5 ) );
+        assertSame( filterE, list.get( 4 ) );
+        assertSame( filterA, list.get( 3 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 1 ) );
+    }
+
+    public void testRemoveFirst()
+    {
+        manager.removeFilter( filterC );
+
+        List list;
+        list = manager.filters();
+        assertEquals( 5, list.size() );
+        assertSame( filterE, list.get( 0 ) );
+        assertSame( filterA, list.get( 1 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 3 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 5, list.size() );
+        assertSame( filterE, list.get( 4 ) );
+        assertSame( filterA, list.get( 3 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 1 ) );
+    }
+
+    public void testRemoveLast()
+    {
+        manager.removeFilter( filterB );
+
+        List list;
+        list = manager.filters();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 0 ) );
+        assertSame( filterE, list.get( 1 ) );
+        assertSame( filterA, list.get( 2 ) );
+        assertSame( filterD, list.get( 3 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 4 ) );
+        assertSame( filterE, list.get( 3 ) );
+        assertSame( filterA, list.get( 2 ) );
+        assertSame( filterD, list.get( 1 ) );
+    }
+
+    public void testRemoveMiddle()
+    {
+        manager.removeFilter( filterA );
+
+        List list;
+        list = manager.filters();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 0 ) );
+        assertSame( filterE, list.get( 1 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 3 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 4 ) );
+        assertSame( filterE, list.get( 3 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 1 ) );
+    }
+
+    public static void main( String[] args )
+    {
+        junit.textui.TestRunner.run( IoHandlerFilterManagerTest.class );
+    }
+}
\ No newline at end of file

Added: incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterImpl.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterImpl.java?view=auto&rev=124943
==============================================================================
--- (empty file)
+++ incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterImpl.java	Tue Jan 11 23:13:42 2005
@@ -0,0 +1,41 @@
+/*
+ * @(#) $Id$
+ */
+package org.apache.mina.util;
+
+import org.apache.mina.protocol.ProtocolHandlerFilterAdapter;
+
+/**
+ * TODO Document me.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class ProtocolHandlerFilterImpl extends ProtocolHandlerFilterAdapter
+{
+    private final char c;
+
+    public ProtocolHandlerFilterImpl( char c )
+    {
+        this.c = c;
+    }
+
+    public int hashCode()
+    {
+        return c;
+    }
+
+    public boolean equals( Object o )
+    {
+        if( o == null )
+            return false;
+        if( ! ( o instanceof ProtocolHandlerFilterImpl ) )
+            return false;
+        return this.c == ( ( ProtocolHandlerFilterImpl ) o ).c;
+    }
+
+    public String toString()
+    {
+        return "" + c;
+    }
+}
\ No newline at end of file

Added: incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterManagerTest.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterManagerTest.java?view=auto&rev=124943
==============================================================================
--- (empty file)
+++ incubator/directory/network/trunk/mina/src/test/org/apache/mina/util/ProtocolHandlerFilterManagerTest.java	Tue Jan 11 23:13:42 2005
@@ -0,0 +1,129 @@
+/*
+ * @(#) $Id$
+ */
+package org.apache.mina.util;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * TODO Document me.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class ProtocolHandlerFilterManagerTest extends TestCase
+{
+    private ProtocolHandlerFilterManager manager;
+
+    private ProtocolHandlerFilterImpl filterA;
+
+    private ProtocolHandlerFilterImpl filterB;
+
+    private ProtocolHandlerFilterImpl filterC;
+
+    private ProtocolHandlerFilterImpl filterD;
+
+    private ProtocolHandlerFilterImpl filterE;
+
+    public void setUp()
+    {
+        manager = new ProtocolHandlerFilterManager();
+        filterA = new ProtocolHandlerFilterImpl( 'A' );
+        filterB = new ProtocolHandlerFilterImpl( 'B' );
+        filterC = new ProtocolHandlerFilterImpl( 'C' );
+        filterD = new ProtocolHandlerFilterImpl( 'D' );
+        filterE = new ProtocolHandlerFilterImpl( 'E' );
+        manager.addFilter( 0, filterA );
+        manager.addFilter( -2, filterB );
+        manager.addFilter( 2, filterC );
+        manager.addFilter( -1, filterD );
+        manager.addFilter( 1, filterE );
+    }
+
+    public void testAdd()
+    {
+        List list;
+        list = manager.filters();
+        assertEquals( 6, list.size() );
+        assertSame( filterC, list.get( 0 ) );
+        assertSame( filterE, list.get( 1 ) );
+        assertSame( filterA, list.get( 2 ) );
+        assertSame( filterD, list.get( 3 ) );
+        assertSame( filterB, list.get( 4 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 6, list.size() );
+        assertSame( filterC, list.get( 5 ) );
+        assertSame( filterE, list.get( 4 ) );
+        assertSame( filterA, list.get( 3 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 1 ) );
+    }
+
+    public void testRemoveFirst()
+    {
+        manager.removeFilter( filterC );
+
+        List list;
+        list = manager.filters();
+        assertEquals( 5, list.size() );
+        assertSame( filterE, list.get( 0 ) );
+        assertSame( filterA, list.get( 1 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 3 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 5, list.size() );
+        assertSame( filterE, list.get( 4 ) );
+        assertSame( filterA, list.get( 3 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 1 ) );
+    }
+
+    public void testRemoveLast()
+    {
+        manager.removeFilter( filterB );
+
+        List list;
+        list = manager.filters();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 0 ) );
+        assertSame( filterE, list.get( 1 ) );
+        assertSame( filterA, list.get( 2 ) );
+        assertSame( filterD, list.get( 3 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 4 ) );
+        assertSame( filterE, list.get( 3 ) );
+        assertSame( filterA, list.get( 2 ) );
+        assertSame( filterD, list.get( 1 ) );
+    }
+
+    public void testRemoveMiddle()
+    {
+        manager.removeFilter( filterA );
+
+        List list;
+        list = manager.filters();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 0 ) );
+        assertSame( filterE, list.get( 1 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 3 ) );
+
+        list = manager.filtersReversed();
+        assertEquals( 5, list.size() );
+        assertSame( filterC, list.get( 4 ) );
+        assertSame( filterE, list.get( 3 ) );
+        assertSame( filterD, list.get( 2 ) );
+        assertSame( filterB, list.get( 1 ) );
+    }
+
+    public static void main( String[] args )
+    {
+        junit.textui.TestRunner.run( ProtocolHandlerFilterManagerTest.class );
+    }
+}
\ No newline at end of file