Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java
 Sat Nov  8 16:05:27 2008
@@ -23,8 +23,8 @@
 import java.util.Queue;
 
 import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.filterchain.IoFilter;
 import org.apache.mina.core.filterchain.IoFilterAdapter;
-import org.apache.mina.core.filterchain.IoFilterChain;
 import org.apache.mina.core.session.AttributeKey;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.write.DefaultWriteRequest;
@@ -55,17 +55,17 @@
 
 
     @Override
-    public void onPreAdd(IoFilterChain parent, String name,
-            NextFilter nextFilter) throws Exception {
+    public void onPreAdd(IoSession session, int index, String name,
+            IoFilter nextFilter) throws Exception {
         Class<? extends IoFilterAdapter> clazz = getClass();
-               if (parent.contains(clazz)) {
+               if (session.getFilterChain().contains(clazz)) {
             throw new IllegalStateException(
                     "Only one " + clazz.getName() + " is permitted.");
         }
     }
 
     @Override
-    public void filterWrite(NextFilter nextFilter, IoSession session,
+    public void filterWrite(int index, IoSession session,
                             WriteRequest writeRequest) throws Exception {
         // If we're already processing a stream we need to queue the 
WriteRequest.
         if (session.getAttribute(CURRENT_STREAM) != null) {
@@ -88,17 +88,17 @@
             if (buffer == null) {
                 // End of stream reached.
                 writeRequest.getFuture().setWritten();
-                nextFilter.messageSent(session, writeRequest);
+                session.getFilter(index).messageSent(index+1, session, 
writeRequest);
             } else {
                 session.setAttribute(CURRENT_STREAM, message);
                 session.setAttribute(CURRENT_WRITE_REQUEST, writeRequest);
 
-                nextFilter.filterWrite(session, new DefaultWriteRequest(
-                        buffer));
+                session.getFilter(index).filterWrite(index+1, session, 
+                               new DefaultWriteRequest(buffer));
             }
 
         } else {
-            nextFilter.filterWrite(session, writeRequest);
+               session.getFilter(index).filterWrite(index+1, session, 
writeRequest);
         }
     }
     
@@ -115,12 +115,12 @@
     }
     
     @Override
-    public void messageSent(NextFilter nextFilter, IoSession session,
+    public void messageSent(int index, IoSession session,
                             WriteRequest writeRequest) throws Exception {
         T stream = 
getMessageClass().cast(session.getAttribute(CURRENT_STREAM));
 
         if (stream == null) {
-            nextFilter.messageSent(session, writeRequest);
+            session.getFilter(index).messageSent(index+1, session, 
writeRequest);
         } else {
             IoBuffer buffer = getNextBuffer(stream);
 
@@ -135,16 +135,17 @@
                 if (queue != null) {
                     WriteRequest wr = queue.poll();
                     while (wr != null) {
-                        filterWrite(nextFilter, session, wr);
+                        filterWrite(index+1, session, wr);
                         wr = queue.poll();
                     }
                 }
 
                 currentWriteRequest.getFuture().setWritten();
-                nextFilter.messageSent(session, currentWriteRequest);
+                session.getFilter(index).messageSent(index+1, session, 
+                               currentWriteRequest);
             } else {
-                nextFilter.filterWrite(session, new DefaultWriteRequest(
-                        buffer));
+               session.getFilter(index).filterWrite(index+1, session, 
+                               new DefaultWriteRequest(buffer));
             }
         }
     }

Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java
 Sat Nov  8 16:05:27 2008
@@ -77,7 +77,7 @@
 
     @Override
     public final void filterWrite(int index, IoSession session, WriteRequest 
writeRequest) throws Exception {
-        filter(new IoFilterEvent(index+1, IoEventType.WRITE, session, 
writeRequest));
+        filter(new IoFilterEvent(index, IoEventType.WRITE, session, 
writeRequest));
     }
 
     @Override

Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java
 Sat Nov  8 16:05:27 2008
@@ -21,7 +21,6 @@
 
 import org.apache.mina.core.filterchain.IoFilter;
 import org.apache.mina.core.filterchain.IoFilterAdapter;
-import org.apache.mina.core.filterchain.IoFilterChain;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.session.TrafficMask;
@@ -52,20 +51,20 @@
         //no-op, will destroy on-demand in post-remove if count == 0
     }
 
-    public synchronized void onPreAdd(IoFilterChain parent, String name,
-            NextFilter nextFilter) throws Exception {
+    public synchronized void onPreAdd(IoSession session, int index, String 
name,
+            IoFilter nextFilter) throws Exception {
         if (0 == count) {
             filter.init();
 
             ++count;
         }
 
-        filter.onPreAdd(parent, name, nextFilter);
+        filter.onPreAdd(session, index, name, nextFilter);
     }
 
-    public synchronized void onPostRemove(IoFilterChain parent, String name,
-            NextFilter nextFilter) throws Exception {
-        filter.onPostRemove(parent, name, nextFilter);
+    public synchronized void onPostRemove(IoSession session, int index, String 
name,
+            IoFilter nextFilter) throws Exception {
+        filter.onPostRemove(session, index, name, nextFilter);
 
         --count;
 
@@ -74,63 +73,63 @@
         }
     }
 
-    public void exceptionCaught(NextFilter nextFilter, IoSession session,
+    public void exceptionCaught(int index, IoSession session,
             Throwable cause) throws Exception {
-        filter.exceptionCaught(nextFilter, session, cause);
+        filter.exceptionCaught(index+1, session, cause);
     }
 
-    public void filterClose(NextFilter nextFilter, IoSession session)
+    public void filterClose(int index, IoSession session)
             throws Exception {
-        filter.filterClose(nextFilter, session);
+        filter.filterClose(index+1, session);
     }
 
-    public void filterWrite(NextFilter nextFilter, IoSession session,
+    public void filterWrite(int index, IoSession session,
             WriteRequest writeRequest) throws Exception {
-        filter.filterWrite(nextFilter, session, writeRequest);
+        filter.filterWrite(index+1, session, writeRequest);
     }
 
-    public void messageReceived(NextFilter nextFilter, IoSession session,
+    public void messageReceived(int index, IoSession session,
             Object message) throws Exception {
-        filter.messageReceived(nextFilter, session, message);
+        filter.messageReceived(index+1, session, message);
     }
 
-    public void messageSent(NextFilter nextFilter, IoSession session,
+    public void messageSent(int index, IoSession session,
             WriteRequest writeRequest) throws Exception {
-        filter.messageSent(nextFilter, session, writeRequest);
+        filter.messageSent(index+1, session, writeRequest);
     }
 
-    public void onPostAdd(IoFilterChain parent, String name,
-            NextFilter nextFilter) throws Exception {
-        filter.onPostAdd(parent, name, nextFilter);
+    public void onPostAdd(IoSession session, int index, String name,
+            IoFilter nextFilter) throws Exception {
+        filter.onPostAdd(session, index, name, nextFilter);
     }
 
-    public void onPreRemove(IoFilterChain parent, String name,
-            NextFilter nextFilter) throws Exception {
-        filter.onPreRemove(parent, name, nextFilter);
+    public void onPreRemove(IoSession session, int index, String name,
+            IoFilter nextFilter) throws Exception {
+        filter.onPreRemove(session, index, name, nextFilter);
     }
 
-    public void sessionClosed(NextFilter nextFilter, IoSession session)
+    public void sessionClosed(int index, IoSession session)
             throws Exception {
-        filter.sessionClosed(nextFilter, session);
+        filter.sessionClosed(index+1, session);
     }
 
-    public void sessionCreated(NextFilter nextFilter, IoSession session)
+    public void sessionCreated(int index, IoSession session)
             throws Exception {
-        filter.sessionCreated(nextFilter, session);
+        filter.sessionCreated(index+1, session);
     }
 
-    public void sessionIdle(NextFilter nextFilter, IoSession session,
+    public void sessionIdle(int index, IoSession session,
             IdleStatus status) throws Exception {
-        filter.sessionIdle(nextFilter, session, status);
+        filter.sessionIdle(index+1, session, status);
     }
 
-    public void sessionOpened(NextFilter nextFilter, IoSession session)
+    public void sessionOpened(int index, IoSession session)
             throws Exception {
-        filter.sessionOpened(nextFilter, session);
+        filter.sessionOpened(index+1, session);
     }
 
-    public void filterSetTrafficMask(NextFilter nextFilter, IoSession session,
+    public void filterSetTrafficMask(int index, IoSession session,
             TrafficMask trafficMask) throws Exception {
-        filter.filterSetTrafficMask(nextFilter, session, trafficMask);
+        filter.filterSetTrafficMask(index+1, session, trafficMask);
     }
 }

Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java
 Sat Nov  8 16:05:27 2008
@@ -140,12 +140,12 @@
      * map and forward the event to the next filter.
      */
     @Override
-    public void sessionCreated(NextFilter nextFilter, IoSession session)
+    public void sessionCreated(int index, IoSession session)
             throws Exception {
         for (Map.Entry<String, Object> e : attributes.entrySet()) {
             session.setAttribute(e.getKey(), e.getValue());
         }
 
-        nextFilter.sessionCreated(session);
+        session.getFilterIn(index).sessionCreated(index+1, session);
     }
 }

Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java
 Sat Nov  8 16:05:27 2008
@@ -36,34 +36,35 @@
  */
 public abstract class WriteRequestFilter extends IoFilterAdapter {
     @Override
-    public void filterWrite(NextFilter nextFilter, IoSession session,
+    public void filterWrite(int index, IoSession session,
             WriteRequest writeRequest) throws Exception {
-        Object filteredMessage = doFilterWrite(nextFilter, session, 
writeRequest);
+        Object filteredMessage = doFilterWrite(index+1, session, writeRequest);
         if (filteredMessage != null && filteredMessage != 
writeRequest.getMessage()) {
-            nextFilter.filterWrite(
+            session.getFilterOut(index).filterWrite(index+1,
                     session, new FilteredWriteRequest(
                             filteredMessage, writeRequest));
         } else {
-            nextFilter.filterWrite(session, writeRequest);
+               session.getFilterOut(index).filterWrite(index+1, session, 
writeRequest);
         }
     }
 
     @Override
-    public void messageSent(NextFilter nextFilter, IoSession session,
+    public void messageSent(int index, IoSession session,
             WriteRequest writeRequest) throws Exception {
         if (writeRequest instanceof FilteredWriteRequest) {
             FilteredWriteRequest req = (FilteredWriteRequest) writeRequest;
             if (req.getParent() == this) {
-                nextFilter.messageSent(session, req.getParentRequest());
+               session.getFilterIn(index).messageSent(index+1, session, 
+                               req.getParentRequest());
                 return;
             }
         }
 
-        nextFilter.messageSent(session, writeRequest);
+        session.getFilterIn(index).messageSent(index+1, session, writeRequest);
     }
 
     protected abstract Object doFilterWrite(
-            NextFilter nextFilter, IoSession session, WriteRequest 
writeRequest) throws Exception;
+            int index, IoSession session, WriteRequest writeRequest) throws 
Exception;
 
     private class FilteredWriteRequest extends WriteRequestWrapper {
         private final Object filteredMessage;

Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java
 Sat Nov  8 16:05:27 2008
@@ -24,7 +24,6 @@
 import java.util.Queue;
 
 import org.apache.mina.core.buffer.IoBuffer;
-import org.apache.mina.core.filterchain.IoFilter.NextFilter;
 import org.apache.mina.core.future.DefaultWriteFuture;
 import org.apache.mina.core.future.WriteFuture;
 import org.apache.mina.core.session.IoSession;
@@ -106,7 +105,7 @@
      * @param nextFilter       Downstream filter to receive data.
      * @param data                     Data buffer to be written.
      */
-    protected WriteFuture writeData(final NextFilter nextFilter,
+    protected WriteFuture writeData(int index,
             final IoBuffer data) throws UnsupportedEncodingException {
         // write net data
         ProxyHandshakeIoBuffer writeBuffer = new ProxyHandshakeIoBuffer(data);
@@ -114,7 +113,7 @@
         logger.debug("   session write: {}", writeBuffer);
 
         WriteFuture writeFuture = new DefaultWriteFuture(getSession());
-        getProxyFilter().writeData(nextFilter, getSession(),
+        getProxyFilter().writeData(index+1, getSession(),
                 new DefaultWriteRequest(writeBuffer, writeFuture), true);
 
         return writeFuture;

Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java
 Sat Nov  8 16:05:27 2008
@@ -34,25 +34,74 @@
  * @version $Rev$, $Date$
  */
 public abstract class NioSession extends AbstractIoSession {
-    private final List<IoFilter> filterChain = new 
CopyOnWriteArrayList<IoFilter>();
-
-    public List<IoFilter> getFilterChain() {
-        return filterChain;
-    }
+    private final List<IoFilter> filterChainIn = new 
CopyOnWriteArrayList<IoFilter>();
+    private final List<IoFilter> filterChainOut = new 
CopyOnWriteArrayList<IoFilter>();
 
+    /**
+     * Stores all the filters from the common chain into the incoming and 
outgoing 
+     * chains for the current session. The chains are copied.
+     * 
+     * @param filters The chain (it will be used in both direction)
+     */
     public void setFilterChain(List<IoFilter> filters) {
        if (filters == null) {
                return;
        }
        
-               filterChain.addAll(filters);
+               filterChainIn.addAll(filters);
+               filterChainOut.addAll(filters);
+    }
+
+    /**
+     * Stores all the filters from both chains (incoming and outgoing) into 
+     * the current session. The chains are copied.
+     * 
+     * @param filtersIn The incoming chain
+     * @param filtersOut The outgoing chain
+     */
+    public void setFilterChain(List<IoFilter> filtersIn, List<IoFilter> 
filtersOut) {
+       if ((filtersIn == null) || (filtersOut == null)) {
+               return;
+       }
+       
+               filterChainIn.addAll(filtersIn);
+               filterChainOut.addAll(filtersOut);
     }
 
     /**
      * [EMAIL PROTECTED]
      */
-    public IoFilter getFilter(int index) {
-        return filterChain.get(index);
+    public IoFilter getFilterIn(int index) {
+        return filterChainIn.get(index);
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public IoFilter getFilterOut(int index) {
+        return filterChainOut.get(index);
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public List<IoFilter> getFilterChainIn() {
+        return filterChainIn;
+    }
+    
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public List<IoFilter> getFilterChainOut() {
+       return filterChainOut;
+    }
+    
+    public IoFilter getFilterInHead() {
+       return filterChainIn.get(0);
+    }
+    
+    public IoFilter getFilterOutHead() {
+       return filterChainOut.get(0);
     }
 
     abstract ByteChannel getChannel();

Modified: 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java
 Sat Nov  8 16:05:27 2008
@@ -23,13 +23,10 @@
 import java.net.SocketException;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SocketChannel;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.mina.core.RuntimeIoException;
 import org.apache.mina.core.buffer.IoBuffer;
 import org.apache.mina.core.file.FileRegion;
-import org.apache.mina.core.filterchain.IoFilter;
 import org.apache.mina.core.service.DefaultTransportMetadata;
 import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.service.IoProcessor;
@@ -82,8 +79,9 @@
         this.ch = ch;
         this.handler = service.getHandler();
         this.config.setAll(service.getSessionConfig());
-        service.getFilterChain().add(service.getTailFilter());
-        setFilterChain(service.getFilterChain());
+        service.getFilterChainIn().add(service.getTailFilter());
+        service.getFilterChainOut().add(service.getTailFilter());
+        setFilterChain(service.getFilterChainIn(), 
service.getFilterChainOut());
     }
 
     public IoService getService() {

Modified: 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java
 Sat Nov  8 16:05:27 2008
@@ -36,6 +36,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
 
 /**
  * Tests [EMAIL PROTECTED] IoServiceListenerSupport}.
@@ -190,7 +191,11 @@
                 // the visibility problem of simultaneous EasyMock
                 // state update. (not sure if it fixes the failing test yet.)
                 synchronized (listener) {
-                    support.fireSessionDestroyed(session);
+                       try {
+                               support.fireSessionDestroyed(session);
+                       } catch (Throwable t) {
+                               fail();
+                       }
                 }
             }
         }.start();

Modified: 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
 Sat Nov  8 16:05:27 2008
@@ -25,7 +25,6 @@
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
-import org.apache.mina.core.filterchain.IoFilter.NextFilter;
 import org.apache.mina.core.session.DummySession;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
@@ -73,7 +72,7 @@
             Integer objI = new Integer(i);
 
             for (int j = end; j >= 0; j--) {
-                filter.messageReceived(nextFilter, sessions[j], objI);
+                filter.messageReceived(0, sessions[j], objI);
             }
 
             if (nextFilter.throwable != null) {

Modified: 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
 (original)
+++ 
mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
 Sat Nov  8 16:05:27 2008
@@ -33,7 +33,7 @@
 import org.apache.log4j.Level;
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.mina.core.buffer.IoBuffer;
-import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
+import org.apache.mina.core.filterchain.IoFilter;
 import org.apache.mina.core.filterchain.IoFilterAdapter;
 import org.apache.mina.core.future.ConnectFuture;
 import org.apache.mina.core.service.IoHandlerAdapter;
@@ -87,77 +87,77 @@
     }
 
     public void testSimpleChain() throws IOException, InterruptedException {
-        DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
-        chain.addFirst("mdc-injector", new MdcInjectionFilter());
-        chain.addLast("dummy", new DummyIoFilter());
-        chain.addLast("protocol", new ProtocolCodecFilter(new 
DummyProtocolCodecFactory()));
+        List<IoFilter> chain = new ArrayList<IoFilter>();
+        chain.add(new MdcInjectionFilter());
+        chain.add(new DummyIoFilter());
+        chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
         test(chain);
     }
 
     public void testExecutorFilterAtTheEnd() throws IOException, 
InterruptedException {
-        DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
+        List<IoFilter> chain = new ArrayList<IoFilter>();
         MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
-        chain.addFirst("mdc-injector1", mdcInjectionFilter);
-        chain.addLast("dummy", new DummyIoFilter());
-        chain.addLast("protocol", new ProtocolCodecFilter(new 
DummyProtocolCodecFactory()));
-        chain.addLast("executor" , new ExecutorFilter());
-        chain.addLast("mdc-injector2", mdcInjectionFilter);
+        chain.add(mdcInjectionFilter);
+        chain.add(new DummyIoFilter());
+        chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
+        chain.add(new ExecutorFilter());
+        chain.add(mdcInjectionFilter);
         test(chain);
     }
 
     public void testExecutorFilterAtBeginning() throws IOException, 
InterruptedException {
-        DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
+        List<IoFilter> chain = new ArrayList<IoFilter>();
         MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
-        chain.addLast("executor" , new ExecutorFilter());
-        chain.addLast("mdc-injector", mdcInjectionFilter);
-        chain.addLast("dummy", new DummyIoFilter());
-        chain.addLast("protocol", new ProtocolCodecFilter(new 
DummyProtocolCodecFactory()));
+        chain.add(new ExecutorFilter());
+        chain.add(mdcInjectionFilter);
+        chain.add(new DummyIoFilter());
+        chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
         test(chain);
     }
 
     public void testExecutorFilterBeforeProtocol() throws IOException, 
InterruptedException {
-        DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
+        List<IoFilter> chain = new ArrayList<IoFilter>();
         MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
-        chain.addLast("executor" , new ExecutorFilter());
-        chain.addLast("mdc-injector", mdcInjectionFilter);
-        chain.addLast("dummy", new DummyIoFilter());
-        chain.addLast("protocol", new ProtocolCodecFilter(new 
DummyProtocolCodecFactory()));
+        chain.add(new ExecutorFilter());
+        chain.add(mdcInjectionFilter);
+        chain.add(new DummyIoFilter());
+        chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
         test(chain);
     }
 
     public void testMultipleFilters() throws IOException, InterruptedException 
{
-        DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
+        List<IoFilter> chain = new ArrayList<IoFilter>();
         MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
-        chain.addLast("executor" , new ExecutorFilter());
-        chain.addLast("mdc-injector", mdcInjectionFilter);
-        chain.addLast("profiler", new ProfilerTimerFilter());
-        chain.addLast("dummy", new DummyIoFilter());
-        chain.addLast("logger", new LoggingFilter());
-        chain.addLast("protocol", new ProtocolCodecFilter(new 
DummyProtocolCodecFactory()));
+        chain.add(new ExecutorFilter());
+        chain.add(mdcInjectionFilter);
+        chain.add(new ProfilerTimerFilter());
+        chain.add(new DummyIoFilter());
+        chain.add(new LoggingFilter());
+        chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
         test(chain);
     }
 
 
     public void testTwoExecutorFilters() throws IOException, 
InterruptedException {
-        DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
+        List<IoFilter> chain = new ArrayList<IoFilter>();
         MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
-        chain.addLast("executor1" , new ExecutorFilter());
-        chain.addLast("mdc-injector1", mdcInjectionFilter);
-        chain.addLast("protocol", new ProtocolCodecFilter(new 
DummyProtocolCodecFactory()));
-        chain.addLast("dummy", new DummyIoFilter());
-        chain.addLast("executor2" , new ExecutorFilter());
+        chain.add(new ExecutorFilter());
+        chain.add(mdcInjectionFilter);
+        chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
+        chain.add(new DummyIoFilter());
+        chain.add(new ExecutorFilter());
         // add the MdcInjectionFilter instance after every ExecutorFilter
         // it's important to use the same MdcInjectionFilter instance
-        chain.addLast("mdc-injector2",  mdcInjectionFilter);
+        chain.add(mdcInjectionFilter);
         test(chain);
     }
 
     public void testOnlyRemoteAddress() throws IOException, 
InterruptedException {
-        DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
-        chain.addFirst("mdc-injector", new MdcInjectionFilter(
+        List<IoFilter> chain = new ArrayList<IoFilter>();
+        chain.add(new MdcInjectionFilter(
             MdcInjectionFilter.MdcKey.remoteAddress));
-        chain.addLast("dummy", new DummyIoFilter());
-        chain.addLast("protocol", new ProtocolCodecFilter(new 
DummyProtocolCodecFactory()));
+        chain.add(new DummyIoFilter());
+        chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
         SimpleIoHandler simpleIoHandler = new SimpleIoHandler();
         acceptor.setHandler(simpleIoHandler);
         acceptor.bind(new InetSocketAddress(0));
@@ -191,7 +191,7 @@
         }
     }
 
-    private void test(DefaultIoFilterChainBuilder chain) throws IOException, 
InterruptedException {
+    private void test(List<IoFilter> chain) throws IOException, 
InterruptedException {
         // configure the server
         SimpleIoHandler simpleIoHandler = new SimpleIoHandler();
         acceptor.setHandler(simpleIoHandler);
@@ -381,9 +381,9 @@
 
     private static class DummyIoFilter extends IoFilterAdapter {
         @Override
-        public void sessionOpened(NextFilter nextFilter, IoSession session) 
throws Exception {
+        public void sessionOpened(int index, IoSession session) throws 
Exception {
             logger.info("DummyIoFilter.sessionOpened");
-            nextFilter.sessionOpened(session);
+            session.getFilter(index).sessionOpened(index+1, session);
         }
     }
 

Modified: 
mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java
 (original)
+++ 
mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java
 Sat Nov  8 16:05:27 2008
@@ -46,20 +46,26 @@
 
     public static void main(String[] args) throws Exception {
         NioSocketAcceptor acceptor = new NioSocketAcceptor();
-        List<IoFilter> chain = acceptor.getFilterChain();
-
-        MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
-        chain.add(mdcInjectionFilter);
+        List<IoFilter> chainIn = acceptor.getFilterChainIn();
+        List<IoFilter> chainOut = acceptor.getFilterChainOut();
+        ProtocolCodecFilter codecFilter = new ProtocolCodecFilter(
+                new TextLineCodecFactory());
 
         // Add SSL filter if SSL is enabled.
         if (USE_SSL) {
-            addSSLSupport(chain);
+            addSSLSupport(chainIn);
         }
 
-        chain.add(new ProtocolCodecFilter(
-                new TextLineCodecFactory()));
+        MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
+        chainIn.add(mdcInjectionFilter);
+
+        chainIn.add(codecFilter);
 
-        addLogger(chain);
+        addLogger(chainIn);
+        
+        addLogger(chainOut);
+        chainOut.add(codecFilter);
+        chainOut.add(mdcInjectionFilter);
 
         // Bind
         acceptor.setHandler(new ChatProtocolHandler());

Modified: 
mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java
URL: 
http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java?rev=712452&r1=712451&r2=712452&view=diff
==============================================================================
--- 
mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java
 (original)
+++ 
mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java
 Sat Nov  8 16:05:27 2008
@@ -69,18 +69,23 @@
             IoFilter CODEC_FILTER = new ProtocolCodecFilter(
                     new TextLineCodecFactory());
             
-            connector.getFilterChain().add(new MdcInjectionFilter());
-            connector.getFilterChain().add(CODEC_FILTER);
-            connector.getFilterChain().add(LOGGING_FILTER);
+            connector.getFilterChainIn().add(new MdcInjectionFilter());
+            connector.getFilterChainIn().add(CODEC_FILTER);
+            connector.getFilterChainIn().add(LOGGING_FILTER);
 
             if (useSsl) {
                 SSLContext sslContext = BogusSslContextFactory
                         .getInstance(false);
                 SslFilter sslFilter = new SslFilter(sslContext);
                 sslFilter.setUseClientMode(true);
-                connector.getFilterChain().add(sslFilter);
+                connector.getFilterChainIn().add(sslFilter);
+                connector.getFilterChainOut().add(sslFilter);
             }
 
+            connector.getFilterChainOut().add(LOGGING_FILTER);
+            connector.getFilterChainOut().add(CODEC_FILTER);
+            connector.getFilterChainOut().add(new MdcInjectionFilter());
+
             connector.setHandler(handler);
             ConnectFuture future1 = connector.connect(address);
             future1.awaitUninterruptibly();


Reply via email to