Le 09/04/2018 à 17:17, Jonathan Valliere a écrit :
> I’d be interested in the diff.  Why not propagate the sent down the chain
> instead of just to the handler? 

I do propagate the event down teh chain. Ultimately, the IoHandler is
responsible for handling it.

I have attached the diff, nit sure it will be visible.

-- 
Emmanuel Lecharny

Symas.com
directory.apache.org

diff --git 
a/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
 
b/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
index ee17646e..2aa6b7c5 100644
--- 
a/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
+++ 
b/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
@@ -35,6 +35,7 @@ import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.write.WriteRequest;
 import org.apache.mina.core.write.WriteRequestQueue;
+import org.apache.mina.filter.FilterEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -773,6 +774,19 @@ public void fireFilterWrite(WriteRequest writeRequest) {
         }
     }
 
+    private void callNextFilterFire(Entry entry, IoSession session, 
FilterEvent event) {
+        try {
+            IoFilter filter = entry.getFilter();
+            NextFilter nextFilter = entry.getNextFilter();
+            filter.fire(nextFilter, session, event);
+        } catch (Exception e) {
+            fireExceptionCaught(e);
+        } catch (Error e) {
+            fireExceptionCaught(e);
+            throw e;
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -1024,6 +1038,11 @@ public void fireFilterWrite(WriteRequest writeRequest) {
         public void filterClose(NextFilter nextFilter, IoSession session) 
throws Exception {
             nextFilter.filterClose(session);
         }
+        
+        @Override
+        public void fire(NextFilter nextFilter, IoSession session, FilterEvent 
event) throws Exception {
+            session.getHandler().fire(session, event);
+        }
     }
 
     private final class EntryImpl implements Entry {
@@ -1141,6 +1160,15 @@ public void fireFilterWrite(WriteRequest writeRequest) {
                     callPreviousFilterClose(nextEntry, session);
                 }
 
+                /**
+                 * {@inheritDoc}
+                 */
+                @Override
+                public void fire(IoSession session, FilterEvent event) {
+                    Entry nextEntry = EntryImpl.this.nextEntry;
+                    callNextFilterFire(nextEntry, session, event);
+                }
+
                 /**
                  * {@inheritDoc}
                  */
diff --git 
a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java 
b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
index 42832404..f5105e40 100644
--- a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
+++ b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
@@ -23,6 +23,7 @@ import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.write.WriteRequest;
+import org.apache.mina.filter.FilterEvent;
 import org.apache.mina.filter.util.ReferenceCountingFilter;
 
 /**
@@ -269,6 +270,18 @@ public interface IoFilter {
      * @throws Exception If an error occurred while processing the event
      */
     void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest 
writeRequest) throws Exception;
+    
+    /**
+     * Propagate an event up to the {@link IoHandler}
+     * 
+     * @param nextFilter
+     *            the {@link NextFilter} for this filter. You can reuse this
+     *            object until this filter is removed from the chain.
+     * @param session The {@link IoSession} which has to process this 
invocation
+     * @param event The event to propagate
+     * @throws Exception If an error occurred while processing the event
+     */
+    void fire(NextFilter nextFilter, IoSession session, FilterEvent event) 
throws Exception;
 
     /**
      * Represents the next {@link IoFilter} in {@link IoFilterChain}.
@@ -348,5 +361,12 @@ public interface IoFilter {
          */
         void filterClose(IoSession session);
 
+        /**
+         * Forwards <tt>fire</tt> event to next filter.
+         * 
+         * @param session The {@link IoSession} which has to process this 
invocation
+         * @param event The event to propagate
+         */
+        void fire(IoSession session, FilterEvent event);
     }
 }
diff --git 
a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java 
b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
index 424df5c3..81b30660 100644
--- 
a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
+++ 
b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
@@ -22,6 +22,7 @@ package org.apache.mina.core.filterchain;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.write.WriteRequest;
+import org.apache.mina.filter.FilterEvent;
 
 /**
  * An adapter class for {@link IoFilter}.  You can extend
@@ -153,6 +154,14 @@ public class IoFilterAdapter implements IoFilter {
         nextFilter.inputClosed(session);
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void fire(NextFilter nextFilter, IoSession session, FilterEvent 
event) throws Exception {
+        nextFilter.fire(session, event);
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git 
a/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java 
b/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
index 1ae1a302..0dcfb716 100644
--- 
a/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
+++ 
b/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
@@ -30,6 +30,7 @@ import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.session.IoSessionConfig;
 import org.apache.mina.core.session.IoSessionInitializer;
+import org.apache.mina.filter.FilterEvent;
 
 /**
  * A base implementation of {@link IoConnector}.
@@ -313,6 +314,14 @@ public abstract class AbstractIoConnector extends 
AbstractIoService implements I
                     public void inputClosed(IoSession session) throws 
Exception {
                         // Empty handler
                     }
+
+                    /**
+                     * {@inheritDoc}
+                     */
+                    @Override
+                    public void fire(IoSession session, FilterEvent event) 
throws Exception {
+                        // Empty handler
+                    }
                 });
             } else {
                 throw new IllegalStateException("handler is not set.");
diff --git 
a/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java 
b/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java
index e7db2fe6..ccb9ffa0 100644
--- a/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java
+++ b/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.FilterEvent;
 
 /**
  * Handles all I/O events fired by MINA.
@@ -111,4 +112,14 @@ public interface IoHandler {
      * @throws Exception If we get an exception while closing the input
      */
     void inputClosed(IoSession session) throws Exception;
+    
+    /**
+     * Invoked when a filter event is fired. Each filter might sent a 
different event,
+     * this is very application specific.
+     * 
+     * @param session The session for which we have an event to process
+     * @param event The event to process
+     * @throws Exception If we get an exception while processing the event 
+     */
+    void fire(IoSession session, FilterEvent event) throws Exception;
 }
\ No newline at end of file
diff --git 
a/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java 
b/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
index 7df46cff..c12fd098 100644
--- a/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
+++ b/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
@@ -21,6 +21,7 @@ package org.apache.mina.core.service;
 
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.FilterEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -100,4 +101,12 @@ public class IoHandlerAdapter implements IoHandler {
     public void inputClosed(IoSession session) throws Exception {
         session.closeNow();
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void fire(IoSession session, FilterEvent event) throws Exception {
+        // Empty handler
+    }
 }
\ No newline at end of file
diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java 
b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
index 846f1d88..58b2bf09 100644
--- a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
+++ b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java
@@ -133,20 +133,6 @@ public class SslFilter extends IoFilterAdapter {
      */
     public static final AttributeKey PEER_ADDRESS = new 
AttributeKey(SslFilter.class, "peerAddress");
 
-    /**
-     * A special message object which is emitted with a {@link 
IoHandler#messageReceived(IoSession, Object)}
-     * event when the session is secured and its {@link #USE_NOTIFICATION}
-     * attribute is set.
-     */
-    public static final SslFilterMessage SESSION_SECURED = new 
SslFilterMessage("SESSION_SECURED");
-
-    /**
-     * A special message object which is emitted with a {@link 
IoHandler#messageReceived(IoSession, Object)}
-     * event when the session is not secure anymore and its {@link 
#USE_NOTIFICATION}
-     * attribute is set.
-     */
-    public static final SslFilterMessage SESSION_UNSECURED = new 
SslFilterMessage("SESSION_UNSECURED");
-
     /** An attribute containing the next filter */
     private static final AttributeKey NEXT_FILTER = new 
AttributeKey(SslFilter.class, "nextFilter");
 
@@ -786,9 +772,8 @@ public class SslFilter extends IoFilterAdapter {
                 sslHandler.destroy();
             }
 
-            if (session.containsAttribute(USE_NOTIFICATION)) {
-                sslHandler.scheduleMessageReceived(nextFilter, 
SESSION_UNSECURED);
-            }
+            // Inform that the session is not any more secured
+            nextFilter.fire(session, SslEvent.UNSECURED);
         } catch (SSLException se) {
             sslHandler.release();
             throw se;
diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java 
b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
index 28917d3f..bb35d4d5 100644
--- a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
+++ b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
@@ -537,10 +537,9 @@ class SslHandler {
                 handshakeComplete = true;
 
                 // Send the SECURE message only if it's the first SSL handshake
-                if (firstSSLNegociation && 
session.containsAttribute(SslFilter.USE_NOTIFICATION)) {
-                    // SESSION_SECURED is fired only when it's the first 
handshake
+                if (firstSSLNegociation) {
                     firstSSLNegociation = false;
-                    scheduleMessageReceived(nextFilter, 
SslFilter.SESSION_SECURED);
+                    nextFilter.fire(session, SslEvent.SECURED);
                 }
 
                 if (LOGGER.isDebugEnabled()) {
diff --git 
a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
 
b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
index f2d911e4..3fe390b0 100644
--- 
a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
+++ 
b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.FilterEvent;
 
 /**
  * A session handler without an {@link IoSession} parameter for simplicity.
@@ -123,4 +124,13 @@ public interface SingleSessionIoHandler {
      */
     void messageSent(Object message) throws Exception;
 
+
+    /**
+     * Invoked when a filter event is fired. Each filter might sent a 
different event,
+     * this is very application specific.
+     * 
+     * @param event The event to process
+     * @throws Exception If we get an exception while processing the event 
+     */
+    void fire(FilterEvent event) throws Exception;
 }
diff --git 
a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
 
b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
index 12bafed9..4d3e31a2 100644
--- 
a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
+++ 
b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
@@ -21,6 +21,7 @@ package org.apache.mina.handler.multiton;
 
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.FilterEvent;
 
 /**
  * Adapter class for implementors of the {@link SingleSessionIoHandler}
@@ -124,4 +125,12 @@ public class SingleSessionIoHandlerAdapter implements 
SingleSessionIoHandler {
     public void sessionOpened() throws Exception {
         // Do nothing
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void fire(FilterEvent event) throws Exception {
+        // Do nothing
+    }
 }
diff --git 
a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
 
b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
index 5b6cacde..cba84665 100644
--- 
a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
+++ 
b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
@@ -23,6 +23,7 @@ import org.apache.mina.core.service.IoHandler;
 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.filter.FilterEvent;
 
 /**
  * An {@link IoHandler} implementation which delegates all requests to
@@ -175,4 +176,17 @@ public class SingleSessionIoHandlerDelegate implements 
IoHandler {
         SingleSessionIoHandler handler = (SingleSessionIoHandler) 
session.getAttribute(HANDLER);
         handler.inputClosed(session);
     }
+
+    /**
+     * Delegates the method call to the
+     * {@link SingleSessionIoHandler#fire(event)} method of the handler
+     * assigned to this session.
+     * 
+     * {@inheritDoc}
+     */
+    @Override
+    public void fire(IoSession session, FilterEvent event) throws Exception {
+        SingleSessionIoHandler handler = (SingleSessionIoHandler) 
session.getAttribute(HANDLER);
+        handler.fire(event);
+    }
 }
diff --git 
a/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
 
b/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
index 2b8aedad..1735afad 100644
--- 
a/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
@@ -29,6 +29,7 @@ import org.apache.mina.core.session.DummySession;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.write.WriteRequest;
+import org.apache.mina.filter.FilterEvent;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -163,5 +164,9 @@ public class ExecutorFilterRegressionTest {
         public void sessionCreated(IoSession session) {
             // Do nothing
         }
+        
+        public void fire(IoSession session, FilterEvent event) {
+            // Do nothing
+        }
     }
 }
diff --git 
a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslDIRMINA937Test.java 
b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslDIRMINA937Test.java
index 2f620243..2993fbc8 100644
--- a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslDIRMINA937Test.java
+++ b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslDIRMINA937Test.java
@@ -35,6 +35,7 @@ import javax.net.ssl.TrustManagerFactory;
 import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.FilterEvent;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
@@ -117,18 +118,15 @@ public class SslDIRMINA937Test {
         filters.addLast("sslFilter", sslFilter);
         connector.setHandler(new IoHandlerAdapter() {
             @Override
-            public void sessionCreated(IoSession session) throws Exception {
-                session.setAttribute(SslFilter.USE_NOTIFICATION, Boolean.TRUE);
+            public void messageReceived(IoSession session, Object message) 
throws Exception {
             }
 
             @Override
-            public void messageReceived(IoSession session, Object message) 
throws Exception {
-                if (message == SslFilter.SESSION_SECURED) {
+            public void fire(IoSession session, FilterEvent event) throws 
Exception {
+                if (event == SslEvent.UNSECURED ) {
                     counter.countDown();
                 }
             }
-
-
         });
         connector.connect(new InetSocketAddress("localhost", port));
     }
diff --git 
a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java 
b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java
index d829cc7c..09364f44 100644
--- a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java
+++ b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterTest.java
@@ -36,6 +36,7 @@ import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.write.DefaultWriteRequest;
 import org.apache.mina.core.write.WriteRequest;
+import org.apache.mina.filter.FilterEvent;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -65,6 +66,8 @@ abstract class AbstractNextFilter implements NextFilter {
 
     public void filterClose(IoSession session) { }
 
+    public void fire(IoSession session, FilterEvent event) { }
+
     public String toString() {
         return null;
     }
diff --git 
a/mina-example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
 
b/mina-example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
index 45248120..74b67c5f 100644
--- 
a/mina-example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
+++ 
b/mina-example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
@@ -24,7 +24,6 @@ import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
-import org.apache.mina.filter.ssl.SslFilter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,9 +38,6 @@ public class EchoProtocolHandler extends IoHandlerAdapter {
     @Override
     public void sessionCreated(IoSession session) {
         session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
-
-        // We're going to use SSL negotiation notification.
-        session.setAttribute(SslFilter.USE_NOTIFICATION);
     }
 
     @Override
diff --git 
a/mina-example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java
 
b/mina-example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java
index f674138c..508f331b 100644
--- 
a/mina-example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java
+++ 
b/mina-example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java
@@ -29,6 +29,7 @@ import org.apache.mina.core.buffer.IoBuffer;
 import org.apache.mina.core.service.IoAcceptor;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
+import org.apache.mina.filter.FilterEvent;
 import org.apache.mina.filter.ssl.SslFilter;
 import org.apache.mina.transport.socket.DatagramSessionConfig;
 import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
@@ -158,6 +159,10 @@ public abstract class AbstractTest {
                         super.messageReceived(session, buf);
                     }
                 }
+                
+                public void fire(IoSession session, FilterEvent event) {
+                    System.out.println( event );
+                }
             });
 
             socketAcceptor.bind(address);
diff --git 
a/mina-example/src/test/java/org/apache/mina/example/echoserver/AcceptorTest.java
 
b/mina-example/src/test/java/org/apache/mina/example/echoserver/AcceptorTest.java
index 2be86a45..445d07d0 100644
--- 
a/mina-example/src/test/java/org/apache/mina/example/echoserver/AcceptorTest.java
+++ 
b/mina-example/src/test/java/org/apache/mina/example/echoserver/AcceptorTest.java
@@ -62,7 +62,7 @@ public class AcceptorTest extends AbstractTest {
     }
 
     private void testTCP0(Socket client) throws Exception {
-        client.setSoTimeout(3000);
+        client.setSoTimeout(300000);
         byte[] writeBuf = new byte[16];
 
         for (int i = 0; i < 10; i++) {

Attachment: pEpkey.asc
Description: application/pgp-keys

Reply via email to