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/03/25 13:31:28 UTC

svn commit: r159006 - in directory/network/trunk/src: java/org/apache/mina/io/ java/org/apache/mina/io/datagram/ java/org/apache/mina/io/socket/ java/org/apache/mina/protocol/ java/org/apache/mina/protocol/io/ java/org/apache/mina/protocol/vmpipe/ test/org/apache/mina/io/ test/org/apache/mina/protocol/

Author: trustin
Date: Fri Mar 25 04:31:24 2005
New Revision: 159006

URL: http://svn.apache.org/viewcvs?view=rev&rev=159006
Log:
* Added chain hierarchy integrity check code
* Added test cases for chains

Added:
    directory/network/trunk/src/test/org/apache/mina/protocol/
    directory/network/trunk/src/test/org/apache/mina/protocol/ProtocolHandlerFilterChainTest.java   (with props)
Modified:
    directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java
    directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
    directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java
    directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java
    directory/network/trunk/src/java/org/apache/mina/io/socket/SocketFilterChain.java
    directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java
    directory/network/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java
    directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolFilterChain.java
    directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java
    directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeFilterChain.java
    directory/network/trunk/src/test/org/apache/mina/io/IoHandlerFilterChainTest.java

Modified: directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java Fri Mar 25 04:31:24 2005
@@ -200,6 +200,8 @@
             nextFilter.filterWrite( session, buf, marker );
         }
     };
+    
+    private final boolean root;
 
     private AbstractIoHandlerFilterChain parent;
     
@@ -211,13 +213,18 @@
     
     private final Entry tail;
 
-    protected AbstractIoHandlerFilterChain()
+    protected AbstractIoHandlerFilterChain( boolean root )
     {
+        this.root = root;
+
         head = new Entry( null, null, "head", HEAD_FILTER );
         tail = new Entry( head, null, "tail", TAIL_FILTER );
         head.nextEntry = tail;
         
-        register( head, IoHandlerFilterChain.NEXT_FILTER, NEXT_FILTER );
+        if( !root )
+        {
+            register( head, IoHandlerFilterChain.NEXT_FILTER, NEXT_FILTER );
+        }
     }
     
     public IoHandlerFilterChain getRoot()
@@ -330,15 +337,29 @@
 
     private void register( Entry prevEntry, String name, IoHandlerFilter filter )
     {
+        if ( filter instanceof AbstractIoHandlerFilterChain )
+        {
+            if( !this.getClass().isAssignableFrom( filter.getClass() ) )
+            {
+                throw new IllegalArgumentException( "Incompatible chain" );
+            }
+            if( ( ( AbstractIoHandlerFilterChain ) filter ).root )
+            {
+                throw new IllegalArgumentException( "Root chain cannot be added." );
+            }
+            if( ( ( AbstractIoHandlerFilterChain ) filter ).parent != null )
+            {
+                throw new IllegalArgumentException( "Already added to other parent chain." );
+            }
+
+            ( ( AbstractIoHandlerFilterChain ) filter ).parent = this;
+        }
+        
         Entry newEntry = new Entry( prevEntry, prevEntry.nextEntry, name, filter );
         prevEntry.nextEntry.prevEntry = newEntry;
         prevEntry.nextEntry = newEntry;
         name2entry.put( name, newEntry );
         filter2entry.put( filter, newEntry );
-        if ( filter instanceof AbstractIoHandlerFilterChain )
-        {
-            ( ( AbstractIoHandlerFilterChain ) filter ).parent = this;
-        }
     }
 
     /**

Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Fri Mar 25 04:31:24 2005
@@ -47,7 +47,7 @@
 {
     private static volatile int nextId = 0;
 
-    private final DatagramFilterChain filters = new DatagramFilterChain( this );
+    private final DatagramFilterChain filters = new DatagramFilterChain( true, this );
 
     private final int id = nextId ++ ;
 
@@ -515,7 +515,7 @@
     
     public IoHandlerFilterChain newFilterChain()
     {
-        return new DatagramFilterChain( this );
+        return new DatagramFilterChain( false, this );
     }
     
     public IoHandlerFilterChain getFilterChain()

Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java Fri Mar 25 04:31:24 2005
@@ -48,7 +48,7 @@
 {
     private static volatile int nextId = 0;
 
-    private final DatagramFilterChain filters = new DatagramFilterChain( this );
+    private final DatagramFilterChain filters = new DatagramFilterChain( true, this );
 
     private final int id = nextId ++ ;
 
@@ -428,7 +428,7 @@
 
     public IoHandlerFilterChain newFilterChain()
     {
-        return new DatagramFilterChain( this );
+        return new DatagramFilterChain( false, this );
     }
     
     public IoHandlerFilterChain getFilterChain()

Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java Fri Mar 25 04:31:24 2005
@@ -9,8 +9,9 @@
 
     private final DatagramProcessor processor;
 
-    DatagramFilterChain( DatagramProcessor processor )
+    DatagramFilterChain( boolean root, DatagramProcessor processor )
     {
+        super( root );
         this.processor = processor;
     }
 

Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java Fri Mar 25 04:31:24 2005
@@ -49,7 +49,7 @@
 {
     private static volatile int nextId = 0;
 
-    private final SocketFilterChain filters = new SocketFilterChain();
+    private final SocketFilterChain filters = new SocketFilterChain( true );
 
     private final int id = nextId ++ ;
 
@@ -425,7 +425,7 @@
 
     public IoHandlerFilterChain newFilterChain()
     {
-        return new SocketFilterChain();
+        return new SocketFilterChain( false );
     }
 
 

Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java Fri Mar 25 04:31:24 2005
@@ -48,7 +48,7 @@
 
     private final int id = nextId++;
 
-    private final SocketFilterChain filters = new SocketFilterChain();
+    private final SocketFilterChain filters = new SocketFilterChain( true );
 
     private final Selector selector;
 
@@ -330,7 +330,7 @@
 
     public IoHandlerFilterChain newFilterChain()
     {
-        return new SocketFilterChain();
+        return new SocketFilterChain( false );
     }
     
     public IoHandlerFilterChain getFilterChain()

Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketFilterChain.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketFilterChain.java Fri Mar 25 04:31:24 2005
@@ -7,8 +7,9 @@
 
 class SocketFilterChain extends AbstractIoHandlerFilterChain {
 
-    SocketFilterChain()
+    SocketFilterChain( boolean root )
     {
+        super( root );
     }
 
     protected void doWrite( IoSession session, ByteBuffer buf, Object marker )

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java Fri Mar 25 04:31:24 2005
@@ -198,6 +198,8 @@
         }
     };
 
+    private final boolean root;
+    
     private AbstractProtocolHandlerFilterChain parent;
     
     private final Map name2entry = new HashMap();
@@ -208,13 +210,18 @@
 
     private final Entry tail;
 
-    protected AbstractProtocolHandlerFilterChain()
+    protected AbstractProtocolHandlerFilterChain( boolean root )
     {
+        this.root = root;
+        
         head = new Entry( null, null, "head", HEAD_FILTER );
         tail = new Entry( head, null, "tail", TAIL_FILTER );
         head.nextEntry = tail;
         
-        register( head, ProtocolHandlerFilterChain.NEXT_FILTER, NEXT_FILTER );
+        if( !root )
+        {
+            register( head, ProtocolHandlerFilterChain.NEXT_FILTER, NEXT_FILTER );
+        }
     }
     
     public ProtocolHandlerFilterChain getRoot()
@@ -327,15 +334,28 @@
 
     private void register( Entry prevEntry, String name, ProtocolHandlerFilter filter )
     {
+        if ( filter instanceof AbstractProtocolHandlerFilterChain )
+        {
+            if( !this.getClass().isAssignableFrom( filter.getClass() ) )
+            {
+                throw new IllegalArgumentException( "Incompatible chain" );
+            }
+            if( ( ( AbstractProtocolHandlerFilterChain ) filter ).root )
+            {
+                throw new IllegalArgumentException( "Root chain cannot be added." );
+            }
+            if( ( ( AbstractProtocolHandlerFilterChain ) filter ).parent != null )
+            {
+                throw new IllegalArgumentException( "Already added to other parent chain." );
+            }
+
+            ( ( AbstractProtocolHandlerFilterChain ) filter ).parent = this;
+        }
         Entry newEntry = new Entry( prevEntry, prevEntry.nextEntry, name, filter );
         prevEntry.nextEntry.prevEntry = newEntry;
         prevEntry.nextEntry = newEntry;
         name2entry.put( name, newEntry );
         filter2entry.put( filter, newEntry );
-        if ( filter instanceof AbstractProtocolHandlerFilterChain )
-        {
-            ( ( AbstractProtocolHandlerFilterChain ) filter ).parent = this;
-        }
     }
 
     /**

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java Fri Mar 25 04:31:24 2005
@@ -52,7 +52,7 @@
  */
 public class IoAdapter
 {
-    private final IoProtocolFilterChain filters = new IoProtocolFilterChain();
+    private final IoProtocolFilterChain filters = new IoProtocolFilterChain( true );
 
     IoAdapter()
     {
@@ -60,7 +60,7 @@
     
     public ProtocolHandlerFilterChain newFilterChain()
     {
-        return new IoProtocolFilterChain();
+        return new IoProtocolFilterChain( false );
     }
     
     public ProtocolHandlerFilterChain getFilterChain()

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolFilterChain.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolFilterChain.java Fri Mar 25 04:31:24 2005
@@ -7,7 +7,8 @@
 
 class IoProtocolFilterChain extends AbstractProtocolHandlerFilterChain {
 
-    IoProtocolFilterChain() {
+    IoProtocolFilterChain( boolean root ) {
+        super( root );
     }
 
     protected void doWrite(ProtocolSession session, Object message) {

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java Fri Mar 25 04:31:24 2005
@@ -24,7 +24,7 @@
 {
     static final Map boundHandlers = new HashMap();
 
-    private final VmPipeFilterChain filters = new VmPipeFilterChain();
+    private final VmPipeFilterChain filters = new VmPipeFilterChain( true );
 
     /**
      * Creates a new instance.
@@ -70,7 +70,7 @@
     
     public ProtocolHandlerFilterChain newFilterChain()
     {
-        return new VmPipeFilterChain();
+        return new VmPipeFilterChain( false );
     }
     
     public ProtocolHandlerFilterChain getFilterChain()

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java Fri Mar 25 04:31:24 2005
@@ -21,7 +21,7 @@
  */
 public class VmPipeConnector implements ProtocolConnector
 {
-    private final VmPipeFilterChain filters = new VmPipeFilterChain();
+    private final VmPipeFilterChain filters = new VmPipeFilterChain( true );
 
     /**
      * Creates a new instance.
@@ -33,7 +33,7 @@
     
     public ProtocolHandlerFilterChain newFilterChain()
     {
-        return new VmPipeFilterChain();
+        return new VmPipeFilterChain( false );
     }
     
     public ProtocolHandlerFilterChain getFilterChain()

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeFilterChain.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeFilterChain.java Fri Mar 25 04:31:24 2005
@@ -5,8 +5,9 @@
 
 class VmPipeFilterChain extends AbstractProtocolHandlerFilterChain {
 
-    VmPipeFilterChain()
+    VmPipeFilterChain( boolean root )
     {
+        super( root );
     }
 
     protected void doWrite(ProtocolSession session, Object message)

Modified: directory/network/trunk/src/test/org/apache/mina/io/IoHandlerFilterChainTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/io/IoHandlerFilterChainTest.java?view=diff&r1=159005&r2=159006
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/io/IoHandlerFilterChainTest.java (original)
+++ directory/network/trunk/src/test/org/apache/mina/io/IoHandlerFilterChainTest.java Fri Mar 25 04:31:24 2005
@@ -2,96 +2,265 @@
 
 import java.net.SocketAddress;
 
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.SessionConfig;
 import org.apache.mina.common.TransportType;
 
-import junit.framework.TestCase;
+public class IoHandlerFilterChainTest extends TestCase
+{
+    private IoHandlerFilterChain chain;
+    private IoSession session;
+    private String result;
 
-// I'll use easymock to test AbstractIoHandlerFilterChain
-public class IoHandlerFilterChainTest extends TestCase {
+    public void setUp()
+    {
+        chain = new IoHandlerFilterChainImpl( true );
+        session = new TestSession();
+        result = "";
+    }
+    
+    public void tearDown()
+    {
+    }
+    
+    public void testDefault()
+    {
+        run( "HSO HDR HDW HSI HEC HSC" );
+    }
+    
+    public void testSimpleChain()
+    {
+        chain.addLast( "A", new TestFilter( 'A' ) );
+        chain.addLast( "B", new TestFilter( 'B' ) );
+        run( "ASO BSO HSO" +
+             "ADR BDR HDR" +
+             "BFW AFW ADW BDW HDW" +
+             "ASI BSI HSI" +
+             "AEC BEC HEC" +
+             "ASC BSC HSC" );
+    }
+    
+    public void testNestedChain()
+    {
+        IoHandlerFilterChainImpl childChain = new IoHandlerFilterChainImpl( false );
 
-    private static class TestSession implements IoSession
+        chain.addLast( "A", new TestFilter( 'A' ) );
+        chain.addLast( "child", childChain );
+        chain.addLast( "B", new TestFilter( 'B' ) );
+        childChain.addFirst( "C", new TestFilter( 'C' ) );
+        childChain.addLast( "D", new TestFilter( 'D' ) );
+        
+        run( "ASO CSO BSO HSO DSO" +
+             "ADR CDR BDR HDR DDR" +
+             "BFW DFW AFW ADW CDW BDW HDW DDW CFW" +
+             "ASI CSI BSI HSI DSI" +
+             "AEC CEC BEC HEC DEC" +
+             "ASC CSC BSC HSC DSC" );
+    }
+    
+    private void run( String expectedResult )
     {
-        private final IoHandlerFilterChain chain;
-        private final IoHandler handler;
+        chain.sessionOpened( null, session );
+        chain.dataRead( null, session, ByteBuffer.allocate( 16 ) );
+        chain.filterWrite( null, session, ByteBuffer.allocate( 16 ), null );
+        chain.sessionIdle( null, session, IdleStatus.READER_IDLE );
+        chain.exceptionCaught( null, session, new Exception() );
+        chain.sessionClosed( null, session );
+        
+        result = formatResult( result );
+        expectedResult = formatResult( expectedResult );
         
-        private TestSession( IoHandlerFilterChain chain, IoHandler handler )
+        System.out.println( "Expected: " + expectedResult );
+        System.out.println( "Actual:   " + result );
+        Assert.assertEquals( expectedResult, result );
+    }
+    
+    private String formatResult( String result )
+    {
+        result = result.replaceAll( "\\s", "" );
+        StringBuffer buf = new StringBuffer( result.length() * 4 / 3 );
+        for( int i = 0; i < result.length(); i++ )
         {
-            this.chain = chain;
-            this.handler = handler;
+            buf.append( result.charAt( i ) );
+            if( i % 3 == 2 )
+            {
+                buf.append(' ');
+            }
         }
         
+        return buf.toString();
+    }
+
+    private class TestSession implements IoSession
+    {
+        private IoHandler handler = new IoHandler()
+        {
+            public void sessionOpened(IoSession session) {
+                result += "HSO ";
+            }
+
+            public void dataRead(IoSession session, ByteBuffer buf) {
+                result += "HDR ";
+            }
+
+            public void dataWritten(IoSession session, Object marker) {
+                result += "HDW ";
+            }
+            
+            public void sessionIdle(IoSession session, IdleStatus status) {
+                result += "HSI ";
+            }
+
+            public void exceptionCaught(IoSession session, Throwable cause) {
+                result += "HEC ";
+                if( cause.getClass() != Exception.class )
+                {
+                    cause.printStackTrace( System.out );
+                }
+            }
+
+            public void sessionClosed(IoSession session) {
+                result += "HSC ";
+            }
+        };
+
         public IoHandler getHandler()
         {
             return handler;
         }
 
-        public void close() {
+        public void close()
+        {
         }
 
-        public void write(ByteBuffer buf, Object marker) {
-            chain.filterWrite( null, this, buf, marker );
+        public void write(ByteBuffer buf, Object marker)
+        {
         }
 
-        public Object getAttachment() {
+        public Object getAttachment()
+        {
             return null;
         }
 
-        public void setAttachment(Object attachment) {
+        public void setAttachment(Object attachment)
+        {
         }
 
-        public TransportType getTransportType() {
+        public TransportType getTransportType()
+        {
             return null;
         }
 
-        public boolean isConnected() {
+        public boolean isConnected()
+        {
             return false;
         }
 
-        public SessionConfig getConfig() {
+        public SessionConfig getConfig()
+        {
             return null;
         }
 
-        public SocketAddress getRemoteAddress() {
+        public SocketAddress getRemoteAddress()
+        {
             return null;
         }
 
-        public SocketAddress getLocalAddress() {
+        public SocketAddress getLocalAddress()
+        {
             return null;
         }
 
-        public long getReadBytes() {
+        public long getReadBytes()
+        {
             return 0;
         }
 
-        public long getWrittenBytes() {
+        public long getWrittenBytes()
+        {
             return 0;
         }
 
-        public long getLastIoTime() {
+        public long getLastIoTime()
+        {
             return 0;
         }
 
-        public long getLastReadTime() {
+        public long getLastReadTime()
+        {
             return 0;
         }
 
-        public long getLastWriteTime() {
+        public long getLastWriteTime()
+        {
             return 0;
         }
 
-        public boolean isIdle(IdleStatus status) {
+        public boolean isIdle(IdleStatus status)
+        {
             return false;
         }
     }
 
+    private class TestFilter implements IoHandlerFilter
+    {
+        private final char id;
+
+        private TestFilter( char id )
+        {
+            this.id = id;
+        }
+        
+        public void sessionOpened(NextFilter nextFilter, IoSession session) {
+            result += id + "SO ";
+            nextFilter.sessionOpened( session );
+        }
+
+        public void sessionClosed(NextFilter nextFilter, IoSession session) {
+            result += id + "SC ";
+            nextFilter.sessionClosed( session );
+        }
+
+        public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) {
+            result += id + "SI ";
+            nextFilter.sessionIdle( session, status );
+        }
+
+        public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) {
+            result += id + "EC ";
+            nextFilter.exceptionCaught( session, cause );
+        }
+
+        public void dataRead(NextFilter nextFilter, IoSession session, ByteBuffer buf) {
+            result += id + "DR ";
+            nextFilter.dataRead( session, buf );
+        }
+
+        public void dataWritten(NextFilter nextFilter, IoSession session, Object marker) {
+            result += id + "DW ";
+            nextFilter.dataWritten( session, marker );
+        }
+
+        public void filterWrite(NextFilter nextFilter, IoSession session, ByteBuffer buf, Object marker) {
+            result += id + "FW ";
+            nextFilter.filterWrite( session, buf, marker );
+        }
+    }
+
     private static class IoHandlerFilterChainImpl extends AbstractIoHandlerFilterChain
     {
+        protected IoHandlerFilterChainImpl(boolean root) {
+            super( root );
+        }
+
         protected void doWrite(IoSession session, ByteBuffer buffer, Object marker)
         {
-            session.getHandler().dataWritten( session, marker );
+            getRoot().dataWritten( null, session, marker );
         }
     }
+    
 }

Added: directory/network/trunk/src/test/org/apache/mina/protocol/ProtocolHandlerFilterChainTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/protocol/ProtocolHandlerFilterChainTest.java?view=auto&rev=159006
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/protocol/ProtocolHandlerFilterChainTest.java (added)
+++ directory/network/trunk/src/test/org/apache/mina/protocol/ProtocolHandlerFilterChainTest.java Fri Mar 25 04:31:24 2005
@@ -0,0 +1,258 @@
+package org.apache.mina.protocol;
+
+import java.net.SocketAddress;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.SessionConfig;
+import org.apache.mina.common.TransportType;
+
+public class ProtocolHandlerFilterChainTest extends TestCase
+{
+    private ProtocolHandlerFilterChain chain;
+    private ProtocolSession session;
+    private String result;
+
+    public void setUp()
+    {
+        chain = new ProtocolHandlerFilterChainImpl( true );
+        session = new TestSession();
+        result = "";
+    }
+    
+    public void tearDown()
+    {
+    }
+    
+    public void testDefault()
+    {
+        run( "HSO HMR HMS HSI HEC HSC" );
+    }
+    
+    public void testSimpleChain()
+    {
+        chain.addLast( "A", new TestFilter( 'A' ) );
+        chain.addLast( "B", new TestFilter( 'B' ) );
+        run( "ASO BSO HSO" +
+             "AMR BMR HMR" +
+             "BFW AFW AMS BMS HMS" +
+             "ASI BSI HSI" +
+             "AEC BEC HEC" +
+             "ASC BSC HSC" );
+    }
+    
+    public void testNestedChain()
+    {
+        ProtocolHandlerFilterChainImpl childChain = new ProtocolHandlerFilterChainImpl( false );
+
+        chain.addLast( "A", new TestFilter( 'A' ) );
+        chain.addLast( "child", childChain );
+        chain.addLast( "B", new TestFilter( 'B' ) );
+        childChain.addFirst( "C", new TestFilter( 'C' ) );
+        childChain.addLast( "D", new TestFilter( 'D' ) );
+        
+        run( "ASO CSO BSO HSO DSO" +
+             "AMR CMR BMR HMR DMR" +
+             "BFW DFW AFW AMS CMS BMS HMS DMS CFW" +
+             "ASI CSI BSI HSI DSI" +
+             "AEC CEC BEC HEC DEC" +
+             "ASC CSC BSC HSC DSC" );
+    }
+    
+    private void run( String expectedResult )
+    {
+        chain.sessionOpened( null, session );
+        chain.messageReceived( null, session, new Object() );
+        chain.filterWrite( null, session, new Object() );
+        chain.sessionIdle( null, session, IdleStatus.READER_IDLE );
+        chain.exceptionCaught( null, session, new Exception() );
+        chain.sessionClosed( null, session );
+        
+        result = formatResult( result );
+        expectedResult = formatResult( expectedResult );
+        
+        System.out.println( "Expected: " + expectedResult );
+        System.out.println( "Actual:   " + result );
+        Assert.assertEquals( expectedResult, result );
+    }
+    
+    private String formatResult( String result )
+    {
+        result = result.replaceAll( "\\s", "" );
+        StringBuffer buf = new StringBuffer( result.length() * 4 / 3 );
+        for( int i = 0; i < result.length(); i++ )
+        {
+            buf.append( result.charAt( i ) );
+            if( i % 3 == 2 )
+            {
+                buf.append(' ');
+            }
+        }
+        
+        return buf.toString();
+    }
+
+    private class TestSession implements ProtocolSession
+    {
+        private ProtocolHandler handler = new ProtocolHandler()
+        {
+            public void sessionOpened(ProtocolSession session) {
+                result += "HSO";
+            }
+
+            public void sessionClosed(ProtocolSession session) {
+                result += "HSC";
+            }
+
+            public void sessionIdle(ProtocolSession session, IdleStatus status) {
+                result += "HSI";
+            }
+
+            public void exceptionCaught(ProtocolSession session, Throwable cause) {
+                result += "HEC";
+                if( cause.getClass() != Exception.class )
+                {
+                    cause.printStackTrace( System.out );
+                }
+            }
+
+            public void messageReceived(ProtocolSession session, Object message) {
+                result += "HMR";
+            }
+
+            public void messageSent(ProtocolSession session, Object message) {
+                result += "HMS";
+            }
+        };
+
+        public ProtocolHandler getHandler() {
+            return handler;
+        }
+
+        public ProtocolEncoder getEncoder() {
+            return null;
+        }
+
+        public ProtocolDecoder getDecoder() {
+            return null;
+        }
+
+        public void close() {
+        }
+
+        public Object getAttachment() {
+            return null;
+        }
+
+        public void setAttachment(Object attachment) {
+        }
+
+        public void write(Object message) {
+        }
+
+        public TransportType getTransportType() {
+            return null;
+        }
+
+        public boolean isConnected() {
+            return false;
+        }
+
+        public SessionConfig getConfig() {
+            return null;
+        }
+
+        public SocketAddress getRemoteAddress() {
+            return null;
+        }
+
+        public SocketAddress getLocalAddress() {
+            return null;
+        }
+
+        public long getReadBytes() {
+            return 0;
+        }
+
+        public long getWrittenBytes() {
+            return 0;
+        }
+
+        public long getLastIoTime() {
+            return 0;
+        }
+
+        public long getLastReadTime() {
+            return 0;
+        }
+
+        public long getLastWriteTime() {
+            return 0;
+        }
+
+        public boolean isIdle(IdleStatus status) {
+            return false;
+        }
+    }
+
+    private class TestFilter implements ProtocolHandlerFilter
+    {
+        private final char id;
+
+        private TestFilter( char id )
+        {
+            this.id = id;
+        }
+        
+        public void sessionOpened(NextFilter nextFilter, ProtocolSession session) {
+            result += id + "SO";
+            nextFilter.sessionOpened( session );
+        }
+
+        public void sessionClosed(NextFilter nextFilter, ProtocolSession session) {
+            result += id + "SC";
+            nextFilter.sessionClosed( session );
+        }
+
+        public void sessionIdle(NextFilter nextFilter, ProtocolSession session, IdleStatus status) {
+            result += id + "SI";
+            nextFilter.sessionIdle( session, status );
+        }
+
+        public void exceptionCaught(NextFilter nextFilter, ProtocolSession session, Throwable cause) {
+            result += id + "EC";
+            nextFilter.exceptionCaught( session, cause );
+        }
+
+        public void filterWrite(NextFilter nextFilter, ProtocolSession session, Object message) {
+            result += id + "FW";
+            nextFilter.filterWrite( session, message );
+        }
+
+        public void messageReceived(NextFilter nextFilter, org.apache.mina.protocol.ProtocolSession session, Object message) {
+            result += id + "MR";
+            nextFilter.messageReceived( session, message );
+        }
+
+        public void messageSent(NextFilter nextFilter, org.apache.mina.protocol.ProtocolSession session, Object message) {
+            result += id + "MS";
+            nextFilter.messageSent( session, message );
+        }
+    }
+
+    private static class ProtocolHandlerFilterChainImpl extends AbstractProtocolHandlerFilterChain
+    {
+        protected ProtocolHandlerFilterChainImpl( boolean root )
+        {
+            super( root );
+        }
+
+        protected void doWrite( ProtocolSession session, Object message )
+        {
+            getRoot().messageSent( null, session, message );
+        }
+    }
+    
+}

Propchange: directory/network/trunk/src/test/org/apache/mina/protocol/ProtocolHandlerFilterChainTest.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision