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
