You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2008/11/04 19:02:54 UTC

svn commit: r711331 - in /mina/branches/mina-new-chain: core/src/main/java/org/apache/mina/core/filterchain/ core/src/main/java/org/apache/mina/core/polling/ core/src/main/java/org/apache/mina/core/service/ core/src/main/java/org/apache/mina/core/sessi...

Author: elecharny
Date: Tue Nov  4 10:02:53 2008
New Revision: 711331

URL: http://svn.apache.org/viewvc?rev=711331&view=rev
Log:
A new version (still with a lot or compilation errors), but where the Chat sample is starting to work (at least, the server is receiving the sessionOpened event and process it). The client seems to be blocked, I have to investigate.

Modified:
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoService.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandler.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/IoSession.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/executor/WriteRequestFilter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
    mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java
    mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/ChatProtocolHandler.java
    mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/Main.java
    mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java
    mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/SwingChatClientHandler.java

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java Tue Nov  4 10:02:53 2008
@@ -96,7 +96,7 @@
     void destroy() throws Exception;
     
     /**
-     * Returns the next filter in the chain, or null if there is
+     * Returns the next filter in the incoming chain, or null if there is
      * no more filter (this will be the case when we call this
      * method on the last protocol Handler.
      * 
@@ -106,7 +106,21 @@
      *
      * @return The next filter in the chain
      */
-    IoFilter getNextFilter();
+    IoFilter getNextFilterIn(IoSession session);
+    
+    
+    /**
+     * Returns the next filter in the outgoing chain, or null if there is
+     * no more filter (this will be the case when we call this
+     * method on the last protocol Handler.
+     * 
+     * This method is <b>NOT</b> thread safe. If you want to keep
+     * the chain safe when moving or adding some new filter, please
+     * call the #getNextFilterLock() method.
+     *
+     * @return The next filter in the chain
+     */
+    IoFilter getNextFilterOut(IoSession session);
     
     /**
      * Returns the next filter in the chain, or null if there is
@@ -116,7 +130,7 @@
      * This method is thread safe. 
      *
      * @return The next filter in the chain
-     */
+     *
     IoFilter getNextFilterLock();
     
     /**

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java Tue Nov  4 10:02:53 2008
@@ -33,9 +33,6 @@
  * @version $Rev: 591770 $, $Date: 2007-11-04 13:22:44 +0100 (Sun, 04 Nov 2007) $
  */
 public class IoFilterAdapter implements IoFilter {
-    /** The next filter in the chain */
-    private IoFilter nextFilter;
-    
     /** The filter's name */
     private String name;
 
@@ -70,15 +67,22 @@
     /**
      * {@inheritDoc}
      */
-    public IoFilter getNextFilter() {
-        return nextFilter;
+    public IoFilter getNextFilterIn(IoSession session) {
+        return session.getNextFilterIn(this);
     }
     
     /**
      * {@inheritDoc}
      */
-    public IoFilter getNextFilterLock() {
-        synchronized(nextFilter) {
+    public IoFilter getNextFilterOut(IoSession session) {
+        return session.getNextFilterOut(this);
+    }
+    
+    /**
+     * {@inheritDoc}
+     *
+    public IoFilter getNextFilterLock(IoSession session) {
+        synchronized() {
             return nextFilter;
         }
     }
@@ -115,21 +119,21 @@
      * {@inheritDoc}
      */
     public void sessionCreated(IoSession session) {
-    	getNextFilter().sessionCreated(session);
+    	getNextFilterIn(session).sessionCreated(session);
     }
 
     /**
      * {@inheritDoc}
      */
     public void sessionOpened(IoSession session) {
-        getNextFilter().sessionOpened(session);
+        getNextFilterIn(session).sessionOpened(session);
     }
 
     /**
      * {@inheritDoc}
      */
     public void sessionClosed(IoSession session) {
-    	getNextFilter().sessionClosed(session);
+    	getNextFilterIn(session).sessionClosed(session);
     }
 
     /**
@@ -137,14 +141,14 @@
      */
     public void sessionIdle(IoSession session,
             IdleStatus status) {
-    	getNextFilter().sessionIdle(session, status);
+    	getNextFilterIn(session).sessionIdle(session, status);
     }
 
     /**
      * {@inheritDoc}
      */
     public void exceptionCaught(IoSession session, Throwable cause) {
-    	getNextFilter().exceptionCaught(session, cause);
+    	getNextFilterIn(session).exceptionCaught(session, cause);
     }
 
     /**
@@ -152,7 +156,7 @@
      */
     public void messageReceived(IoSession session,
             Object message) {
-    	getNextFilter().messageReceived(session, message);
+    	getNextFilterIn(session).messageReceived(session, message);
     }
 
     /**
@@ -160,21 +164,21 @@
      */
     public void messageSent(IoSession session,
             WriteRequest writeRequest) {
-    	getNextFilter().messageSent(session, writeRequest);
+    	getNextFilterOut(session).messageSent(session, writeRequest);
     }
 
     /**
      * {@inheritDoc}
      */
     public void filterWrite(IoSession session, WriteRequest writeRequest) {
-    	getNextFilter().filterWrite(session, writeRequest);
+    	getNextFilterOut(session).filterWrite(session, writeRequest);
     }
 
     /**
      * {@inheritDoc}
      */
     public void filterClose(IoSession session) {
-    	getNextFilter().filterClose(session);
+    	getNextFilterOut(session).filterClose(session);
     }
 
     /**

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java Tue Nov  4 10:02:53 2008
@@ -36,6 +36,7 @@
 import org.apache.mina.core.filterchain.IoFilter;
 import org.apache.mina.core.future.DefaultIoFuture;
 import org.apache.mina.core.service.AbstractIoService;
+import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.service.IoProcessor;
 import org.apache.mina.core.session.AbstractIoSession;
 import org.apache.mina.core.session.IdleStatusChecker;
@@ -420,7 +421,7 @@
             ((IoSession)session).setFilterChainIn(chainIn);
             
             List<IoFilter> chainOut = ((IoSession)session). getService().getFilterChainOut();
-            ((IoSession)session).setFilterChainIn(chainOut);
+            ((IoSession)session).setFilterChainOut(chainOut);
             
             // DefaultIoFilterChain.CONNECT_FUTURE is cleared inside here
             // in AbstractIoFilterChain.fireSessionOpened().

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java Tue Nov  4 10:02:53 2008
@@ -219,33 +219,28 @@
 
         if (getHandler() == null) {
             if (getSessionConfig().isUseReadOperation()) {
-                setHandler(new IoHandler() {
+                setHandler(new IoHandlerAdapter() {
                     public void exceptionCaught(IoSession session,
-                            Throwable cause) throws Exception {
+                            Throwable cause){
                     }
 
                     public void messageReceived(IoSession session,
-                            Object message) throws Exception {
+                            Object message) {
                     }
 
-                    public void messageSent(IoSession session, Object message)
-                            throws Exception {
+                    public void messageSent(IoSession session, Object message) {
                     }
 
-                    public void sessionClosed(IoSession session)
-                            throws Exception {
+                    public void sessionClosed(IoSession session) {
                     }
 
-                    public void sessionCreated(IoSession session)
-                            throws Exception {
+                    public void sessionCreated(IoSession session) {
                     }
 
-                    public void sessionIdle(IoSession session, IdleStatus status)
-                            throws Exception {
+                    public void sessionIdle(IoSession session, IdleStatus status) {
                     }
 
-                    public void sessionOpened(IoSession session)
-                            throws Exception {
+                    public void sessionOpened(IoSession session) {
                     }
                 });
             } else {

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoService.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoService.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoService.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/AbstractIoService.java Tue Nov  4 10:02:53 2008
@@ -20,6 +20,7 @@
 package org.apache.mina.core.service;
 
 import java.util.AbstractSet;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -243,6 +244,10 @@
      * {@inheritDoc}
      */
     public final List<IoFilter> getFilterChainIn() {
+    	if (filterChainIn == null) {
+    		filterChainIn = new ArrayList<IoFilter>();
+    	}
+    	
     	return filterChainIn;
     }
 
@@ -250,6 +255,10 @@
      * {@inheritDoc}
      */
     public final List<IoFilter> getFilterChainOut() {
+    	if (filterChainOut == null) {
+    		filterChainOut = new ArrayList<IoFilter>();
+    	}
+    	
     	return filterChainOut;
     }
 
@@ -373,6 +382,7 @@
                     "handler cannot be set while the service is active.");
         }
 
+        filterChainIn.add(handler);
         this.handler = handler;
     }
 

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandler.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandler.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandler.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandler.java Tue Nov  4 10:02:53 2008
@@ -21,6 +21,7 @@
 
 import java.io.IOException;
 
+import org.apache.mina.core.filterchain.IoFilter;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 
@@ -32,51 +33,5 @@
  *
  * @see IoHandlerAdapter
  */
-public interface IoHandler {
-    /**
-     * Invoked from an I/O processor thread when a new connection has been created.
-     * Because this method is supposed to be called from the same thread that
-     * handles I/O of multiple sessions, please implement this method to perform
-     * tasks that consumes minimal amount of time such as socket parameter
-     * and user-defined session attribute initialization.
-     */
-    void sessionCreated(IoSession session) throws Exception;
-
-    /**
-     * Invoked when a connection has been opened.  This method is invoked after
-     * {@link #sessionCreated(IoSession)}.  The biggest difference from
-     * {@link #sessionCreated(IoSession)} is that it's invoked from other thread
-     * than an I/O processor thread once thread model is configured properly.
-     */
-    void sessionOpened(IoSession session) throws Exception;
-
-    /**
-     * Invoked when a connection is closed.
-     */
-    void sessionClosed(IoSession session) throws Exception;
-
-    /**
-     * Invoked with the related {@link IdleStatus} when a connection becomes idle.
-     * This method is not invoked if the transport type is UDP; it's a known bug,
-     * and will be fixed in 2.0.
-     */
-    void sessionIdle(IoSession session, IdleStatus status) throws Exception;
-
-    /**
-     * Invoked when any exception is thrown by user {@link IoHandler}
-     * implementation or by MINA.  If <code>cause</code> is an instance of
-     * {@link IOException}, MINA will close the connection automatically.
-     */
-    void exceptionCaught(IoSession session, Throwable cause) throws Exception;
-
-    /**
-     * Invoked when a message is received.
-     */
-    void messageReceived(IoSession session, Object message) throws Exception;
-
-    /**
-     * Invoked when a message written by {@link IoSession#write(Object)} is
-     * sent out.
-     */
-    void messageSent(IoSession session, Object message) throws Exception;
+public interface IoHandler extends IoFilter{
 }
\ No newline at end of file

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java Tue Nov  4 10:02:53 2008
@@ -19,8 +19,12 @@
  */
 package org.apache.mina.core.service;
 
+import org.apache.mina.core.filterchain.IoFilter;
+import org.apache.mina.core.future.ConnectFuture;
+import org.apache.mina.core.session.AttributeKey;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.core.write.WriteRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,24 +38,34 @@
  * @version $Rev$, $Date$
  */
 public class IoHandlerAdapter implements IoHandler {
-
     private final Logger logger = LoggerFactory.getLogger(getClass());
+    
+    public static final AttributeKey SESSION_CREATED_FUTURE = new AttributeKey(
+            IoFilter.class, "connectFuture");
 
-    public void sessionCreated(IoSession session) throws Exception {
+    public void init() throws Exception {
+    }
+    
+    public void destroy() throws Exception {
     }
 
-    public void sessionOpened(IoSession session) throws Exception {
+    public String getName() {
+    	return null;
     }
 
-    public void sessionClosed(IoSession session) throws Exception {
+    public void sessionCreated(IoSession session) {
     }
 
-    public void sessionIdle(IoSession session, IdleStatus status)
-            throws Exception {
+    public void sessionOpened(IoSession session) {
     }
 
-    public void exceptionCaught(IoSession session, Throwable cause)
-            throws Exception {
+    public void sessionClosed(IoSession session) {
+    }
+
+    public void sessionIdle(IoSession session, IdleStatus status) {
+    }
+
+    public void exceptionCaught(IoSession session, Throwable cause) {
         if (logger.isWarnEnabled()) {
             logger.warn("EXCEPTION, please implement "
                     + getClass().getName()
@@ -59,10 +73,39 @@
         }
     }
 
-    public void messageReceived(IoSession session, Object message)
-            throws Exception {
+    public void messageReceived(IoSession session, Object message) {
     }
 
-    public void messageSent(IoSession session, Object message) throws Exception {
+    public void messageSent(IoSession session, WriteRequest message) {
+    }
+    
+    public void filterClose(IoSession session) {
+    }
+    
+    public void filterWrite(IoSession session, WriteRequest writeRequest) {
+    }
+    
+    public void onPreAdd(IoFilter parent, String name, IoFilter nextFilter)
+    		throws Exception {
+    }
+
+    public void onPostAdd(IoFilter parent, String name, IoFilter nextFilter)
+    		throws Exception {
+    }
+
+    public void onPreRemove(IoFilter parent, String name, IoFilter nextFilter)
+    		throws Exception {
+    }
+
+    public void onPostRemove(IoFilter parent, String name, IoFilter nextFilter)
+    		throws Exception {
+    }
+    
+    public IoFilter getNextFilterOut(IoSession session) {
+    	return null;
+    }
+    
+    public IoFilter getNextFilterIn(IoSession session) {
+    	return null;
     }
 }
\ No newline at end of file

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java Tue Nov  4 10:02:53 2008
@@ -420,6 +420,51 @@
     	return getFilterChainOut().get(0);
     }
 
+    /**
+     * Search for filter following the given filter in the incoming
+     * filter chain.
+     * 
+     * @param filter the filter we are looking for the follower
+     * @return The next filter in the chain, or null if none 
+     */
+    public IoFilter getNextFilterIn(IoFilter filter) {
+    	boolean found = false;
+    	
+    	for (IoFilter f:getFilterChainIn()) {
+    		if (found) {
+    			return f;
+    		} else {
+	    		if ( f == filter ) {
+	    			found = true;
+	    		}
+    		}
+    	}
+    	
+    	return null;
+    }
+    
+    /**
+     * Search for filter following the given filter in the incoming
+     * filter chain.
+     * 
+     * @param filter the filter we are looking for the follower
+     * @return The next filter in the chain, or null if none 
+     */
+    public IoFilter getNextFilterOut(IoFilter filter) {
+    	boolean found = false;
+    	
+    	for (IoFilter f:getFilterChainOut()) {
+    		if (found) {
+    			return f;
+    		} else {
+	    		if ( f == filter ) {
+	    			found = true;
+	    		}
+    		}
+    	}
+    	
+    	return null;
+    }
     
     /**
      * {@inheritDoc}

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/IoSession.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/IoSession.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/IoSession.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/core/session/IoSession.java Tue Nov  4 10:02:53 2008
@@ -130,6 +130,24 @@
     IoFilter getFirstFilterOut();
     
     /**
+     * Get the next filter in the ingoing chain, given a specific name
+     * @param name The current filter
+     * @return the following filter 
+     * @throws ArrayIndexOutOfBoundsException If this was the last filter
+     * in the chain
+     */
+    IoFilter getNextFilterIn(IoFilter filter);
+    
+    /**
+     * Get the next filter in the outgoing chain, given a specific name
+     * @param name The current filter
+     * @return the following filter 
+     * @throws ArrayIndexOutOfBoundsException If this was the last filter
+     * in the chain
+     */
+    IoFilter getNextFilterOut(IoFilter filter);
+    
+    /**
      * TODO Add method documentation
      */
     WriteRequestQueue getWriteRequestQueue();

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Tue Nov  4 10:02:53 2008
@@ -430,16 +430,21 @@
      */
     @Override
     public void sessionCreated(IoSession session) {
-        // Creates the decoder and stores it into the newly created session 
-        ProtocolDecoder decoder = factory.getDecoder(session);
-        session.setAttribute(DECODER, decoder);
-
-        // Creates the encoder and stores it into the newly created session 
-        ProtocolEncoder encoder = factory.getEncoder(session);
-        session.setAttribute(ENCODER, encoder);
-
-        // Call the next filter
-        getNextFilter().sessionCreated(session);
+    	try
+    	{
+	        // Creates the decoder and stores it into the newly created session 
+	        ProtocolDecoder decoder = factory.getDecoder(session);
+	        session.setAttribute(DECODER, decoder);
+	
+	        // Creates the encoder and stores it into the newly created session 
+	        ProtocolEncoder encoder = factory.getEncoder(session);
+	        session.setAttribute(ENCODER, encoder);
+	
+	        // Call the next filter
+	        session.getNextFilterIn(this).sessionCreated(session);
+    	} catch (Exception e) {
+    		// TODO : do nothing atm
+    	}
     }
 
     @Override

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/executor/WriteRequestFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/executor/WriteRequestFilter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/executor/WriteRequestFilter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/executor/WriteRequestFilter.java Tue Nov  4 10:02:53 2008
@@ -62,10 +62,8 @@
  * @version $Rev$, $Date$
  */
 public class WriteRequestFilter extends IoFilterAdapter {
-    // Set the filter's name
-    static {
-    	name = "writeRequest";
-    }
+    // Set the filter's default name
+    private static final String DEFAULT_NAME = "writeRequest";
     
 
     private final IoEventQueueHandler queueHandler;
@@ -78,9 +76,29 @@
     }
 
     /**
+     * Creates a new instance with a new default {@link IoEventQueueThrottle}.
+     * 
+     * @param name The filter's name 
+     */
+    public WriteRequestFilter(String name) {
+        this(name, new IoEventQueueThrottle());
+    }
+
+    /**
      * Creates a new instance with the specified {@link IoEventQueueHandler}.
      */
     public WriteRequestFilter(IoEventQueueHandler queueHandler) {
+    	this(DEFAULT_NAME, queueHandler);
+    }
+
+    /**
+     * Creates a new instance with the specified {@link IoEventQueueHandler}.
+     * 
+     * @param name The filter's name
+     */
+    public WriteRequestFilter(String name, IoEventQueueHandler queueHandler) {
+    	super(name);
+    	
         if (queueHandler == null) {
             throw new NullPointerException("queueHandler");
         }
@@ -102,7 +120,7 @@
         final IoEvent e = new IoEvent(IoEventType.WRITE, session, writeRequest);
 
         if (queueHandler.accept(this, e)) {
-            getNextFilter().filterWrite(session, writeRequest);
+            session.getNextFilterOut(this).filterWrite(session, writeRequest);
             WriteFuture writeFuture = writeRequest.getFuture();
             if (writeFuture == null) {
                 return;

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java Tue Nov  4 10:02:53 2008
@@ -43,10 +43,8 @@
  * @org.apache.xbean.XBean
  */
 public class LoggingFilter extends IoFilterAdapter {
-    // Set the filter's name
-    static {
-    	name = "logging";
-    }
+    // Set the filter's default name
+    private static final String DEFAULT_NAME = "logging";
     
 	/** The logger name */
     private final String loggerName;
@@ -79,7 +77,7 @@
      * Default Constructor.
      */
     public LoggingFilter() {
-        this(LoggingFilter.class.getName());
+        this(DEFAULT_NAME, LoggingFilter.class);
     }
     
     /**
@@ -88,7 +86,16 @@
      * @param clazz the cass which name will be used to create the logger
      */
     public LoggingFilter(Class<?> clazz) {
-        this(clazz.getName());
+        this(DEFAULT_NAME, clazz);
+    }
+
+    /**
+     * Create a new NoopFilter using a class name
+     * 
+     * @param clazz the cass which name will be used to create the logger
+     */
+    public LoggingFilter(String name, Class<?> clazz) {
+        this(name, clazz.getName());
     }
 
     /**
@@ -96,14 +103,16 @@
      * 
      * @param name the name used to create the logger. If null, will default to "NoopFilter"
      */
-    public LoggingFilter(String loggerName) {
+    public LoggingFilter(String name, String loggerName) {
+    	super(name);
+    	
         if (loggerName == null) {
             this.loggerName = LoggingFilter.class.getName();
         } else {
         	this.loggerName = loggerName;
         }
         
-        logger = LoggerFactory.getLogger(loggerName);
+        logger = LoggerFactory.getLogger(this.loggerName);
     }
 
     /**
@@ -175,43 +184,43 @@
     @Override
     public void exceptionCaught(IoSession session, Throwable cause) {
     	log(exceptionCaughtLevel, "EXCEPTION :", cause);
-        getNextFilter().exceptionCaught(session, cause);
+        session.getNextFilterIn(this).exceptionCaught(session, cause);
     }
 
     @Override
     public void messageReceived(IoSession session, Object message) {
     	log(messageReceivedLevel, "RECEIVED: {}", message );
-    	getNextFilter().messageReceived(session, message);
+    	session.getNextFilterIn(this).messageReceived(session, message);
     }
 
     @Override
     public void messageSent(IoSession session, WriteRequest writeRequest) {
     	log(messageSentLevel, "SENT: {}", writeRequest.getMessage() );
-    	getNextFilter().messageSent(session, writeRequest);
+    	session.getNextFilterOut(this).messageSent(session, writeRequest);
     }
 
     @Override
     public void sessionCreated(IoSession session) {
     	log(sessionCreatedLevel, "CREATED");
-    	getNextFilter().sessionCreated(session);
+    	session.getNextFilterIn(this).sessionCreated(session);
     }
 
     @Override
     public void sessionOpened(IoSession session) {
     	log(sessionOpenedLevel, "OPENED");
-    	getNextFilter().sessionOpened(session);
+    	session.getNextFilterIn(this).sessionOpened(session);
     }
 
     @Override
     public void sessionIdle(IoSession session, IdleStatus status) {
     	log(sessionIdleLevel, "IDLE");
-    	getNextFilter().sessionIdle(session, status);
+    	session.getNextFilterIn(this).sessionIdle(session, status);
     }
 
     @Override
     public void sessionClosed(IoSession session) {
     	log(sessionClosedLevel, "CLOSED");
-    	getNextFilter().sessionClosed(session);
+    	session.getNextFilterIn(this).sessionClosed(session);
     }
     
     /**

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java Tue Nov  4 10:02:53 2008
@@ -72,11 +72,8 @@
  */
 
 public class MdcInjectionFilter extends CommonEventFilter {
-
-    // Set the filter's name
-    static {
-    	name = "mdcInjection";
-    }
+    // Set the filter's default name
+    private static final String DEFAULT_NAME = "mdcInjection";
     
     public enum MdcKey {
         handlerClass, remoteAddress, localAddress, remoteIp, remotePort, localIp, localPort
@@ -103,6 +100,18 @@
      * @see #setProperty(org.apache.mina.core.session.IoSession, String, String)
      */
     public MdcInjectionFilter(EnumSet<MdcKey> keys) {
+        this(DEFAULT_NAME, keys);
+    }
+
+    /**
+     * Use this constructor when you want to specify which keys to add to the MDC.
+     * You could still add custom keys via {@link #setProperty(IoSession, String, String)}
+     * @param keys set of keys that should be added to the MDC
+     *
+     * @see #setProperty(org.apache.mina.core.session.IoSession, String, String)
+     */
+    public MdcInjectionFilter(String name, EnumSet<MdcKey> keys) {
+    	super(name);
         this.mdcKeys = keys.clone();
     }
 
@@ -119,6 +128,11 @@
     }
 
     public MdcInjectionFilter() {
+    	this(DEFAULT_NAME);
+    }
+
+    public MdcInjectionFilter(String name) {
+    	super(name);
         this.mdcKeys = EnumSet.allOf(MdcKey.class);
     }
 

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java Tue Nov  4 10:02:53 2008
@@ -31,7 +31,6 @@
 
 import org.apache.mina.core.buffer.IoBuffer;
 import org.apache.mina.core.filterchain.IoFilterAdapter;
-import org.apache.mina.core.filterchain.IoFilterChain;
 import org.apache.mina.core.future.DefaultWriteFuture;
 import org.apache.mina.core.future.IoFuture;
 import org.apache.mina.core.future.IoFutureListener;
@@ -86,9 +85,7 @@
  */
 public class SslFilter extends IoFilterAdapter {
     // Set the filter's name
-    static {
-    	name = "ssl";
-    }
+    private static final String DEFAULT_NAME = "ssl";
     
     /**
      * A session attribute key that stores underlying {@link SSLSession}
@@ -171,17 +168,33 @@
      * Creates a new SSL filter using the specified {@link SSLContext}.
      */
     public SslFilter(SSLContext sslContext) {
-        this(sslContext, true);
+    	this(DEFAULT_NAME, sslContext);
+    }
+
+    /**
+     * Creates a new SSL filter using the specified {@link SSLContext}.
+     */
+    public SslFilter(String name, SSLContext sslContext) {
+        this(name, sslContext, true);
     }
 
     /**
      * Creates a new SSL filter using the specified {@link SSLContext}.
      */
     public SslFilter(SSLContext sslContext, boolean autoStart) {
+    	this(DEFAULT_NAME, sslContext,autoStart);
+    }
+    
+    /**
+     * Creates a new SSL filter using the specified {@link SSLContext}.
+     */
+    public SslFilter(String name, SSLContext sslContext, boolean autoStart) {
+    	super(name);
         if (sslContext == null) {
             throw new NullPointerException("sslContext");
         }
 
+        
         this.sslContext = sslContext;
         this.autoStart = autoStart;
     }

Modified: mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java (original)
+++ mina/branches/mina-new-chain/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java Tue Nov  4 10:02:53 2008
@@ -57,46 +57,46 @@
 
     @Override
     public final void sessionCreated(IoSession session) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.SESSION_CREATED, session, null));
+        filter(new IoFilterEvent(session.getNextFilterIn(this), IoEventType.SESSION_CREATED, session, null));
     }
 
     @Override
     public final void sessionOpened(IoSession session) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.SESSION_OPENED, session, null));
+        filter(new IoFilterEvent(session.getNextFilterIn(this), IoEventType.SESSION_OPENED, session, null));
     }
 
     @Override
     public final void sessionClosed(IoSession session) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.SESSION_CLOSED, session, null));
+        filter(new IoFilterEvent(session.getNextFilterIn(this), IoEventType.SESSION_CLOSED, session, null));
     }
 
     @Override
     public final void sessionIdle(IoSession session, IdleStatus status) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.SESSION_IDLE, session, status));
+        filter(new IoFilterEvent(session.getNextFilterIn(this), IoEventType.SESSION_IDLE, session, status));
     }
 
     @Override
     public final void exceptionCaught(IoSession session, Throwable cause) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.EXCEPTION_CAUGHT, session, cause));
+        filter(new IoFilterEvent(session.getNextFilterIn(this), IoEventType.EXCEPTION_CAUGHT, session, cause));
     }
 
     @Override
     public final void messageReceived(IoSession session, Object message) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.MESSAGE_RECEIVED, session, message));
+        filter(new IoFilterEvent(session.getNextFilterIn(this), IoEventType.MESSAGE_RECEIVED, session, message));
     }
 
     @Override
     public final void messageSent(IoSession session, WriteRequest writeRequest) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.MESSAGE_SENT, session, writeRequest));
+        filter(new IoFilterEvent(session.getNextFilterOut(this), IoEventType.MESSAGE_SENT, session, writeRequest));
     }
 
     @Override
     public final void filterWrite(IoSession session, WriteRequest writeRequest) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.WRITE, session, writeRequest));
+        filter(new IoFilterEvent(session.getNextFilterOut(this), IoEventType.WRITE, session, writeRequest));
     }
 
     @Override
     public final void filterClose(IoSession session) {
-        filter(new IoFilterEvent(getNextFilter(), IoEventType.CLOSE, session, null));
+        filter(new IoFilterEvent(session.getNextFilterIn(this), IoEventType.CLOSE, session, null));
     }
 }

Modified: mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/ChatProtocolHandler.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/ChatProtocolHandler.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/ChatProtocolHandler.java (original)
+++ mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/ChatProtocolHandler.java Tue Nov  4 10:02:53 2008
@@ -130,7 +130,7 @@
     }
 
     @Override
-    public void sessionClosed(IoSession session) throws Exception {
+    public void sessionClosed(IoSession session) {
         String user = (String) session.getAttribute("user");
         users.remove(user);
         sessions.remove(session);

Modified: mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/Main.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/Main.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/Main.java (original)
+++ mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/Main.java Tue Nov  4 10:02:53 2008
@@ -20,8 +20,9 @@
 package org.apache.mina.example.chat;
 
 import java.net.InetSocketAddress;
+import java.util.List;
 
-import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
+import org.apache.mina.core.filterchain.IoFilter;
 import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
@@ -45,20 +46,21 @@
 
     public static void main(String[] args) throws Exception {
         NioSocketAcceptor acceptor = new NioSocketAcceptor();
-        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
+        List<IoFilter> chainIn = acceptor.getFilterChainIn();
+        List<IoFilter> chainOut = acceptor.getFilterChainOut();
 
-        MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
-        chain.addLast("mdc", mdcInjectionFilter);
+        MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter("mdc");
+        chainIn.add(mdcInjectionFilter);
 
         // Add SSL filter if SSL is enabled.
         if (USE_SSL) {
-            addSSLSupport(chain);
+            addSSLSupport(chainIn, chainOut);
         }
 
-        chain.addLast("codec", new ProtocolCodecFilter(
+        chainIn.add(new ProtocolCodecFilter("codec",
                 new TextLineCodecFactory()));
 
-        addLogger(chain);
+        addLogger(chainIn, chainOut);
 
         // Bind
         acceptor.setHandler(new ChatProtocolHandler());
@@ -67,17 +69,20 @@
         System.out.println("Listening on port " + PORT);
     }
 
-    private static void addSSLSupport(DefaultIoFilterChainBuilder chain)
+    private static void addSSLSupport(List<IoFilter> chainIn, List<IoFilter> chainOut)
             throws Exception {
-        SslFilter sslFilter = new SslFilter(BogusSslContextFactory
+        SslFilter sslFilter = new SslFilter("sslFilter", BogusSslContextFactory
                 .getInstance(true));
-        chain.addLast("sslFilter", sslFilter);
+        chainIn.add(sslFilter);
+        chainOut.add(sslFilter);
         System.out.println("SSL ON");
     }
 
-    private static void addLogger(DefaultIoFilterChainBuilder chain)
+    private static void addLogger(List<IoFilter> chainIn, List<IoFilter> chainOut)
             throws Exception {
-        chain.addLast("logger", new LoggingFilter());
+    	IoFilter loggerFilter = new LoggingFilter("logger", (String)null);
+        chainIn.add(loggerFilter);
+        chainOut.add(loggerFilter);
         System.out.println("Logging ON");
     }
 }

Modified: mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java (original)
+++ mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java Tue Nov  4 10:02:53 2008
@@ -20,6 +20,7 @@
 package org.apache.mina.example.chat.client;
 
 import java.net.SocketAddress;
+import java.util.List;
 
 import javax.net.ssl.SSLContext;
 
@@ -64,24 +65,35 @@
         }
 
         try {
-            IoFilter LOGGING_FILTER = new LoggingFilter();
+            IoFilter LOGGING_FILTER = new LoggingFilter("logger", (String)null);
 
-            IoFilter CODEC_FILTER = new ProtocolCodecFilter(
+            IoFilter CODEC_FILTER = new ProtocolCodecFilter("codec",
                     new TextLineCodecFactory());
             
-            connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());
-            connector.getFilterChain().addLast("codec", CODEC_FILTER);
-            connector.getFilterChain().addLast("logger", LOGGING_FILTER);
+            List<IoFilter> chainIn = connector.getFilterChainIn();
+            List<IoFilter> chainOut = connector.getFilterChainOut();
+            
+            chainIn.add(new MdcInjectionFilter("mdc"));
+            chainIn.add(CODEC_FILTER);
+            chainIn.add(LOGGING_FILTER);
+
+            chainOut.add(new MdcInjectionFilter("mdc"));
+            chainOut.add(CODEC_FILTER);
+            chainOut.add(LOGGING_FILTER);
 
             if (useSsl) {
                 SSLContext sslContext = BogusSslContextFactory
                         .getInstance(false);
-                SslFilter sslFilter = new SslFilter(sslContext);
+                SslFilter sslFilter = new SslFilter("sslFilter", sslContext);
                 sslFilter.setUseClientMode(true);
-                connector.getFilterChain().addLast("sslFilter", sslFilter);
+                connector.getFilterChainIn().add(sslFilter);
+                connector.getFilterChainOut().add(sslFilter);
             }
 
+            // Add the handler to the incoming chain
             connector.setHandler(handler);
+            chainIn.add(handler);
+            
             ConnectFuture future1 = connector.connect(address);
             future1.awaitUninterruptibly();
             if (!future1.isConnected()) {

Modified: mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/SwingChatClientHandler.java
URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/SwingChatClientHandler.java?rev=711331&r1=711330&r2=711331&view=diff
==============================================================================
--- mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/SwingChatClientHandler.java (original)
+++ mina/branches/mina-new-chain/example/src/main/java/org/apache/mina/example/chat/client/SwingChatClientHandler.java Tue Nov  4 10:02:53 2008
@@ -53,13 +53,12 @@
     }
 
     @Override
-    public void sessionOpened(IoSession session) throws Exception {
+    public void sessionOpened(IoSession session) {
         callback.connected();
     }
 
     @Override
-    public void messageReceived(IoSession session, Object message)
-            throws Exception {
+    public void messageReceived(IoSession session, Object message) {
         String theMessage = (String) message;
         String[] result = theMessage.split(" ", 3);
         String status = result[1];
@@ -92,7 +91,7 @@
     }
 
     @Override
-    public void sessionClosed(IoSession session) throws Exception {
+    public void sessionClosed(IoSession session) {
         callback.disconnected();
     }