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 2004/12/19 03:11:26 UTC

svn commit: r122729 - in incubator/directory/network/trunk/mina/src/java/org/apache/mina: io io/socket util

Author: trustin
Date: Sat Dec 18 18:11:24 2004
New Revision: 122729

URL: http://svn.apache.org/viewcvs?view=rev&rev=122729
Log:
Added filter chaining feature to I/O layer. :)

 * Added: IoHandlerFilterManager which manages filter chain and fires events
 * Added: (Acceptor|Connector).(addFilter|removeFilter) method
Added:
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java   (contents, props changed)
Modified:
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Acceptor.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/IoSession.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpAcceptor.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpConnector.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpSession.java

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Acceptor.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Acceptor.java?view=diff&rev=122729&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Acceptor.java&r1=122728&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Acceptor.java&r2=122729
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Acceptor.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Acceptor.java	Sat Dec 18 18:11:24 2004
@@ -34,4 +34,8 @@
             throws IOException;
 
     void unbind( SocketAddress address );
+    
+    void addFilter(int priority, IoHandlerFilter filter);
+    
+    void removeFilter(IoHandlerFilter filter);
 }

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=122729&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java&r1=122728&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/Connector.java&r2=122729
==============================================================================
--- 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	Sat Dec 18 18:11:24 2004
@@ -35,4 +35,8 @@
 
     void connect( SocketAddress address, int timeout,
                  IoHandler defaultHandler ) throws IOException;
+    
+    void addFilter(int priority, IoHandlerFilter filter);
+    
+    void removeFilter(IoHandlerFilter filter);
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java?view=diff&rev=122729&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java&r1=122728&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java&r2=122729
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java	Sat Dec 18 18:11:24 2004
@@ -31,6 +31,8 @@
  */
 public interface IoSession
 {
+    IoHandler getHandler();
+    
     void close();
 
     Object getAttachment();

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpAcceptor.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpAcceptor.java?view=diff&rev=122729&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpAcceptor.java&r1=122728&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpAcceptor.java&r2=122729
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpAcceptor.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpAcceptor.java	Sat Dec 18 18:11:24 2004
@@ -34,6 +34,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.mina.io.Acceptor;
 import org.apache.mina.io.IoHandler;
+import org.apache.mina.io.IoHandlerFilter;
+import org.apache.mina.util.IoHandlerFilterManager;
 
 /**
  * TODO Insert type comment.
@@ -47,6 +49,8 @@
 
     private static final Log log = LogFactory.getLog( TcpAcceptor.class );
 
+    private final IoHandlerFilterManager filterManager = new IoHandlerFilterManager();
+
     private final int id = nextId++;
 
     private final Selector selector;
@@ -101,7 +105,7 @@
         Validate.notNull( address );
 
         ServerSocketChannel ssc = ( ServerSocketChannel ) channels
-                                                                  .get( address );
+                .get( address );
 
         if( ssc == null )
             throw new IllegalArgumentException( "Unknown address: " + address );
@@ -149,16 +153,17 @@
                             continue;
 
                         ServerSocketChannel ssc = ( ServerSocketChannel ) key
-                                                                             .channel();
+                                .channel();
                         SocketChannel ch = ssc.accept();
 
                         if( ch == null )
                             continue;
 
                         TcpSession session = new TcpSession(
+                                                             filterManager,
                                                              ch,
                                                              ( IoHandler ) key
-                                                                                     .attachment() );
+                                                                     .attachment() );
                         TcpIoProcessor.getInstance().addSession( session );
                     }
                 }
@@ -168,5 +173,15 @@
                 }
             }
         }
+    }
+
+    public void addFilter( int priority, IoHandlerFilter filter )
+    {
+        filterManager.addFilter( priority, filter );
+    }
+
+    public void removeFilter( IoHandlerFilter filter )
+    {
+        filterManager.removeFilter( filter );
     }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpConnector.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpConnector.java?view=diff&rev=122729&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpConnector.java&r1=122728&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpConnector.java&r2=122729
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpConnector.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpConnector.java	Sat Dec 18 18:11:24 2004
@@ -33,6 +33,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.mina.io.Connector;
 import org.apache.mina.io.IoHandler;
+import org.apache.mina.io.IoHandlerFilter;
+import org.apache.mina.util.IoHandlerFilterManager;
 
 /**
  * TODO Insert type comment. TODO Stop worker thread when not used.
@@ -48,6 +50,8 @@
 
     private final int id = nextId++;
 
+    private final IoHandlerFilterManager filterManager = new IoHandlerFilterManager();
+
     private final Selector selector;
 
     private Worker worker;
@@ -200,7 +204,7 @@
 
     private void newSession( SocketChannel ch, IoHandler handler )
     {
-        TcpSession session = new TcpSession( ch, handler );
+        TcpSession session = new TcpSession( filterManager, ch, handler );
         TcpIoProcessor.getInstance().addSession( session );
     }
 
@@ -247,5 +251,16 @@
             this.deadline = System.currentTimeMillis() + timeout * 1000L;
             this.handler = handler;
         }
+    }
+
+    public void addFilter( int priority, IoHandlerFilter filter )
+    {
+        filterManager.addFilter( priority, filter );
+
+    }
+
+    public void removeFilter( IoHandlerFilter filter )
+    {
+        filterManager.removeFilter( filter );
     }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java?view=diff&rev=122729&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java&r1=122728&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java&r2=122729
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java	Sat Dec 18 18:11:24 2004
@@ -159,12 +159,12 @@
             catch( IOException e )
             {
                 registered = false;
-                fireExceptionCaught( session, e );
+                session.getFilterManager().fireExceptionCaught( session, e );
             }
 
             if( registered )
             {
-                fireSessionOpened( session );
+                session.getFilterManager().fireSessionOpened( session );
             }
         }
     }
@@ -196,11 +196,11 @@
             }
             catch( IOException e )
             {
-                fireExceptionCaught( session, e );
+                session.getFilterManager().fireExceptionCaught( session, e );
             }
             finally
             {
-                fireSessionClosed( session );
+                session.getFilterManager().fireSessionClosed( session );
             }
         }
     }
@@ -263,7 +263,8 @@
                     if( readBytes > 0 )
                     {
                         lock.markBaseIndex();
-                        fireDataRead( session, readBytes );
+                        session.getFilterManager().fireDataRead( session,
+                                                                 readBytes );
                     }
                     else
                     {
@@ -280,7 +281,7 @@
         }
         catch( Throwable e )
         {
-            fireExceptionCaught( session, e );
+            session.getFilterManager().fireExceptionCaught( session, e );
         }
     }
 
@@ -346,7 +347,7 @@
             && ( currentTime - lastIoTime ) >= idleTime )
         {
             session.setIdle( status );
-            fireSessionIdle( session, status );
+            session.getFilterManager().fireSessionIdle( session, status );
         }
     }
 
@@ -385,7 +386,7 @@
             synchronized( lock )
             {
                 writeBuf.flip();
-                
+
                 // ignore empty write buffer
                 if( writeBuf.remaining() == 0 )
                 {
@@ -399,7 +400,9 @@
                         if( marker == null )
                             break;
 
-                        fireMarkerRemoved( session, marker.getValue() );
+                        session.getFilterManager()
+                                .fireMarkerReleased( session,
+                                                     marker.getValue() );
                     }
                 }
                 else
@@ -434,7 +437,8 @@
                     {
                         session.increaseWrittenBytes( writtenBytes );
                         lock.markBaseIndex();
-                        fireDataWritten( session, writtenBytes );
+                        session.getFilterManager()
+                                .fireDataWritten( session, writtenBytes );
                         Queue markers = lock.getMarkers();
                         for( ;; )
                         {
@@ -452,13 +456,19 @@
                             else if( bytesLeft == writtenBytes )
                             {
                                 markers.pop();
-                                fireMarkerRemoved( session, marker.getValue() );
+                                session
+                                        .getFilterManager()
+                                        .fireMarkerReleased( session,
+                                                             marker.getValue() );
                                 break;
                             }
                             else
                             {
                                 markers.pop();
-                                fireMarkerRemoved( session, marker.getValue() );
+                                session
+                                        .getFilterManager()
+                                        .fireMarkerReleased( session,
+                                                             marker.getValue() );
                                 writtenBytes -= bytesLeft;
                             }
                         }
@@ -468,96 +478,7 @@
         }
         catch( IOException e )
         {
-            fireExceptionCaught( session, e );
-        }
-    }
-
-    private void fireSessionOpened( TcpSession session )
-    {
-        try
-        {
-            session.getHandler().sessionOpened( session );
-        }
-        catch( Throwable e )
-        {
-            fireExceptionCaught( session, e );
-        }
-    }
-
-    private void fireSessionClosed( TcpSession session )
-    {
-        try
-        {
-            session.getHandler().sessionClosed( session );
-        }
-        catch( Throwable e )
-        {
-            fireExceptionCaught( session, e );
-        }
-    }
-
-    private void fireSessionIdle( TcpSession session, IdleStatus status )
-    {
-        try
-        {
-            session.getHandler().sessionIdle( session, status );
-        }
-        catch( Throwable e )
-        {
-            fireExceptionCaught( session, e );
-        }
-    }
-
-    private void fireDataRead( TcpSession session, int readBytes )
-    {
-        try
-        {
-            session.getHandler().dataRead( session, readBytes );
-        }
-        catch( Throwable e )
-        {
-            fireExceptionCaught( session, e );
-        }
-    }
-
-    private void fireDataWritten( TcpSession session, int writtenBytes )
-    {
-        try
-        {
-            session.getHandler().dataWritten( session, writtenBytes );
-        }
-        catch( Throwable e )
-        {
-            fireExceptionCaught( session, e );
-        }
-    }
-
-    private void fireMarkerRemoved( TcpSession session, Object marker )
-    {
-        try
-        {
-            session.getHandler().markerReleased( session, marker );
-        }
-        catch( Throwable e )
-        {
-            fireExceptionCaught( session, e );
-        }
-    }
-
-    private void fireExceptionCaught( TcpSession session, Throwable cause )
-    {
-        try
-        {
-            session.getHandler().exceptionCaught( session, cause );
-
-            if( cause instanceof IOException )
-            {
-                scheduleRemove( session );
-            }
-        }
-        catch( Throwable t )
-        {
-            log.error( "Exception from excaptionCaught.", t );
+            session.getFilterManager().fireExceptionCaught( session, e );
         }
     }
 

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpSession.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpSession.java?view=diff&rev=122729&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpSession.java&r1=122728&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpSession.java&r2=122729
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpSession.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpSession.java	Sat Dec 18 18:11:24 2004
@@ -25,11 +25,12 @@
 
 import org.apache.mina.core.IdleStatus;
 import org.apache.mina.core.SessionConfig;
-import org.apache.mina.io.ReadBuffer;
-import org.apache.mina.io.IoSession;
 import org.apache.mina.io.IoHandler;
+import org.apache.mina.io.IoSession;
+import org.apache.mina.io.ReadBuffer;
 import org.apache.mina.io.WriteBuffer;
 import org.apache.mina.util.ByteBufferPool;
+import org.apache.mina.util.IoHandlerFilterManager;
 
 /**
  * TODO Insert type comment.
@@ -39,6 +40,8 @@
  */
 class TcpSession implements IoSession
 {
+    private final IoHandlerFilterManager filterManager;
+
     private final SocketChannel ch;
 
     private final TcpSessionConfig config;
@@ -70,8 +73,9 @@
     /**
      * Creates a new instance.
      */
-    TcpSession( SocketChannel ch, IoHandler defaultHandler )
+    TcpSession( IoHandlerFilterManager filterManager, SocketChannel ch, IoHandler defaultHandler )
     {
+        this.filterManager = filterManager;
         this.ch = ch;
         this.config = new TcpSessionConfig( ch );
         this.readBuf = new TcpReadBuffer(
@@ -83,17 +87,16 @@
         this.writeBuf = new TcpWriteBuffer( this, ByteBufferPool.open() );
         this.handler = defaultHandler;
     }
+    
+    IoHandlerFilterManager getFilterManager() {
+        return filterManager;
+    }
 
     SocketChannel getChannel()
     {
         return ch;
     }
 
-    IoHandler getHandler()
-    {
-        return handler;
-    }
-
     SelectionKey getSelectionKey()
     {
         return key;
@@ -108,6 +111,11 @@
     {
         ByteBufferPool.close( readBuf.buf() );
         ByteBufferPool.close( writeBuf.buf() );
+    }
+
+    public IoHandler getHandler()
+    {
+        return handler;
     }
 
     public void close()

Added: 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=auto&rev=122729
==============================================================================
--- (empty file)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java	Sat Dec 18 18:11:24 2004
@@ -0,0 +1,351 @@
+/*
+ * @(#) $Id$
+ */
+package org.apache.mina.util;
+
+import org.apache.mina.core.IdleStatus;
+import org.apache.mina.io.IoHandler;
+import org.apache.mina.io.IoHandlerFilter;
+import org.apache.mina.io.IoSession;
+
+/**
+ * TODO Document me.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class IoHandlerFilterManager
+{
+    private static final IoHandlerFilter FINAL_FILTER = new IoHandlerFilter()
+    {
+
+        public void sessionOpened( IoHandler nextHandler, IoSession session )
+        {
+            session.getHandler().sessionOpened( session );
+        }
+
+        public void sessionClosed( IoHandler nextHandler, IoSession session )
+        {
+            session.getHandler().sessionClosed( session );
+        }
+
+        public void sessionIdle( IoHandler nextHandler, IoSession session,
+                                IdleStatus status )
+        {
+            session.getHandler().sessionIdle( session, status );
+        }
+
+        public void exceptionCaught( IoHandler nextHandler, IoSession session,
+                                    Throwable cause )
+        {
+            session.getHandler().exceptionCaught( session, cause );
+        }
+
+        public void dataRead( IoHandler nextHandler, IoSession session,
+                             int readBytes )
+        {
+            session.getHandler().dataRead( session, readBytes );
+        }
+
+        public void dataWritten( IoHandler nextHandler, IoSession session,
+                                int writtenBytes )
+        {
+            session.getHandler().dataWritten( session, writtenBytes );
+        }
+
+        public void markerReleased( IoHandler nextHandler, IoSession session,
+                                   Object marker )
+        {
+            session.getHandler().markerReleased( session, marker );
+        }
+    };
+
+    private Entry head = new Entry( null, Integer.MIN_VALUE, FINAL_FILTER );
+
+    public IoHandlerFilterManager()
+    {
+    }
+
+    public synchronized void addFilter( int priority, IoHandlerFilter filter )
+    {
+        Entry e = head;
+        Entry prevEntry = null;
+        for( ;; )
+        {
+            if( e.nextEntry == null )
+            {
+                Entry newEntry = new Entry( e, priority, filter );
+                if( prevEntry == null )
+                {
+                    head = newEntry;
+                }
+                else
+                {
+                    prevEntry.nextEntry = newEntry;
+                }
+                break;
+            }
+            else if( e.priority < priority )
+            {
+                Entry newEntry = new Entry( e, priority, filter );
+                if( prevEntry == null )
+                {
+                    head = newEntry;
+                }
+                else
+                {
+                    prevEntry.nextEntry = newEntry;
+                }
+                break;
+            }
+            prevEntry = e;
+            e = e.nextEntry;
+        }
+    }
+
+    public synchronized void removeFilter( IoHandlerFilter filter )
+    {
+        Entry e = head;
+        Entry prevEntry = null;
+        for( ;; )
+        {
+            if( e.nextEntry == null )
+            {
+                break;
+            }
+            else if( e.filter == filter )
+            {
+                if( prevEntry == null )
+                {
+                    // e is head
+                    head = e.nextEntry;
+                }
+                else
+                {
+                    prevEntry.nextEntry = e.nextEntry;
+                }
+                break;
+            }
+            prevEntry = e;
+            e = e.nextEntry;
+        }
+    }
+
+    public void fireSessionOpened( IoSession session )
+    {
+        Entry head = this.head;
+        try
+        {
+            head.filter.sessionOpened( head.nextHandler, session );
+        }
+        catch( Throwable e )
+        {
+            fireExceptionCaught( session, e );
+        }
+    }
+
+    public void fireSessionClosed( IoSession session )
+    {
+        Entry head = this.head;
+        try
+        {
+            head.filter.sessionClosed( head.nextHandler, session );
+        }
+        catch( Throwable e )
+        {
+            fireExceptionCaught( session, e );
+        }
+    }
+
+    public void fireSessionIdle( IoSession session, IdleStatus status )
+    {
+        Entry head = this.head;
+        try
+        {
+            head.filter.sessionIdle( head.nextHandler, session, status );
+        }
+        catch( Throwable e )
+        {
+            fireExceptionCaught( session, e );
+        }
+    }
+
+    public void fireDataRead( IoSession session, int readBytes )
+    {
+        Entry head = this.head;
+        try
+        {
+            head.filter.dataRead( head.nextHandler, session, readBytes );
+        }
+        catch( Throwable e )
+        {
+            fireExceptionCaught( session, e );
+        }
+    }
+
+    public void fireDataWritten( IoSession session, int dataWritten )
+    {
+        Entry head = this.head;
+        try
+        {
+            head.filter.dataWritten( head.nextHandler, session, dataWritten );
+        }
+        catch( Throwable e )
+        {
+            fireExceptionCaught( session, e );
+        }
+    }
+
+    public void fireMarkerReleased( IoSession session, Object marker )
+    {
+        Entry head = this.head;
+        try
+        {
+            head.filter.markerReleased( head.nextHandler, session, marker );
+        }
+        catch( Throwable e )
+        {
+            fireExceptionCaught( session, e );
+        }
+    }
+
+    public void fireExceptionCaught( IoSession session, Throwable cause )
+    {
+        Entry head = this.head;
+        try
+        {
+            head.filter.exceptionCaught( head.nextHandler, session, cause );
+        }
+        catch( Throwable e )
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private static class Entry
+    {
+        private Entry nextEntry;
+
+        private final int priority;
+
+        private final IoHandlerFilter filter;
+
+        private final IoHandler nextHandler;
+
+        private Entry( Entry nextEntry, int priority, IoHandlerFilter filter )
+        {
+            if( filter == null )
+                throw new NullPointerException( "filter" );
+            this.nextEntry = nextEntry;
+            this.priority = priority;
+            this.filter = filter;
+            this.nextHandler = new IoHandler()
+            {
+
+                public void sessionOpened( IoSession session )
+                {
+                    try
+                    {
+                        Entry.this.nextEntry.filter
+                                .sessionOpened(
+                                                Entry.this.nextEntry.nextHandler,
+                                                session );
+                    }
+                    catch( Throwable e )
+                    {
+                        exceptionCaught( session, e );
+                    }
+                }
+
+                public void sessionClosed( IoSession session )
+                {
+                    try
+                    {
+                        Entry.this.nextEntry.filter
+                                .sessionClosed(
+                                                Entry.this.nextEntry.nextHandler,
+                                                session );
+                    }
+                    catch( Throwable e )
+                    {
+                        exceptionCaught( session, e );
+                    }
+                }
+
+                public void sessionIdle( IoSession session, IdleStatus status )
+                {
+                    try
+                    {
+                        Entry.this.nextEntry.filter
+                                .sessionIdle(
+                                              Entry.this.nextEntry.nextHandler,
+                                              session, status );
+                    }
+                    catch( Throwable e )
+                    {
+                        exceptionCaught( session, e );
+                    }
+                }
+
+                public void exceptionCaught( IoSession session, Throwable cause )
+                {
+                    try
+                    {
+                        Entry.this.nextEntry.filter
+                                .exceptionCaught(
+                                                  Entry.this.nextEntry.nextHandler,
+                                                  session, cause );
+                    }
+                    catch( Throwable e )
+                    {
+                        e.printStackTrace();
+                    }
+                }
+
+                public void dataRead( IoSession session, int readBytes )
+                {
+                    try
+                    {
+                        Entry.this.nextEntry.filter
+                                .dataRead( Entry.this.nextEntry.nextHandler,
+                                           session, readBytes );
+                    }
+                    catch( Throwable e )
+                    {
+                        exceptionCaught( session, e );
+                    }
+                }
+
+                public void dataWritten( IoSession session, int writtenBytes )
+                {
+                    try
+                    {
+                        Entry.this.nextEntry.filter
+                                .dataWritten(
+                                              Entry.this.nextEntry.nextHandler,
+                                              session, writtenBytes );
+                    }
+                    catch( Throwable e )
+                    {
+                        exceptionCaught( session, e );
+                    }
+                }
+
+                public void markerReleased( IoSession session, Object marker )
+                {
+                    try
+                    {
+                        Entry.this.nextEntry.filter
+                                .markerReleased(
+                                                 Entry.this.nextEntry.nextHandler,
+                                                 session, marker );
+                    }
+                    catch( Throwable e )
+                    {
+                        exceptionCaught( session, e );
+                    }
+                }
+            };
+        }
+    }
+}
\ No newline at end of file