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++) {
pEpkey.asc
Description: application/pgp-keys