You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jv...@apache.org on 2013/10/28 16:55:14 UTC
[2/2] git commit: In read chain message writting for IoFilters
In read chain message writting for IoFilters
Useful for filters negociating or implementing a part of a protocol like
security features.
Project: http://git-wip-us.apache.org/repos/asf/mina/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/2ff729a6
Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/2ff729a6
Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/2ff729a6
Branch: refs/heads/trunk
Commit: 2ff729a63d77039eb540138193c750bdb95c3fc6
Parents: 919154a
Author: jvermillard <jv...@apache.org>
Authored: Mon Oct 28 15:57:02 2013 +0100
Committer: jvermillard <jv...@apache.org>
Committed: Mon Oct 28 15:57:02 2013 +0100
----------------------------------------------------------------------
.../filterchain/ReadFilterChainController.java | 10 ++++
.../apache/mina/session/AbstractIoSession.java | 14 +++++
.../mina/session/AbstractIoSessionTest.java | 59 +++++++++++++++++++-
3 files changed, 80 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mina/blob/2ff729a6/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java b/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
index 82b0147..227ba51 100644
--- a/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
+++ b/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
@@ -27,5 +27,15 @@ package org.apache.mina.filterchain;
*/
public interface ReadFilterChainController {
+ /**
+ * Push the message to the next filter. Transformed or not.
+ * @param message the message to push to the next filter.
+ */
void callReadNextFilter(Object message);
+
+ /**
+ * Write a message according to the protocol implemented in the filter
+ * @param message the message to be written and sent to the previous mail
+ */
+ void callWriteMessageForRead(Object message);
}
http://git-wip-us.apache.org/repos/asf/mina/blob/2ff729a6/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/mina/session/AbstractIoSession.java b/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
index a82a2fa..1504c13 100644
--- a/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
+++ b/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
@@ -792,6 +792,20 @@ public abstract class AbstractIoSession implements IoSession, ReadFilterChainCon
* {@inheritDoc}
*/
@Override
+ public void callWriteMessageForRead(Object message) {
+ if (IS_DEBUG) {
+ LOG.debug("calling filter for reading for message '{}' position : {} from a write event", message,
+ readChainPosition);
+ }
+
+ writeChainPosition = readChainPosition;
+ callWriteNextFilter(new DefaultWriteRequest(message));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public void callReadNextFilter(Object message) {
readChainPosition++;
http://git-wip-us.apache.org/repos/asf/mina/blob/2ff729a6/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java b/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
index a9277a6..abb381b 100644
--- a/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
+++ b/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
@@ -18,9 +18,18 @@
*/
package org.apache.mina.session;
-import static org.junit.Assert.*;
-import static org.mockito.Matchers.*;
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
@@ -29,6 +38,7 @@ import org.apache.mina.api.AbstractIoFilter;
import org.apache.mina.api.IoFilter;
import org.apache.mina.api.IoFuture;
import org.apache.mina.api.IoService;
+import org.apache.mina.api.IoSession;
import org.apache.mina.api.IoSessionConfig;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
@@ -127,6 +137,13 @@ public class AbstractIoSessionTest {
private final IoFilter filter3 = spy(new PassthruFilter());
+ private final IoFilter filterWriteBack = spy(new PassthruFilter() {
+ @Override
+ public void messageReceived(IoSession session, Object message, ReadFilterChainController controller) {
+ controller.callWriteMessageForRead(message);
+ }
+ });
+
@Before
public void setup() {
service = mock(IoService.class);
@@ -185,6 +202,42 @@ public class AbstractIoSessionTest {
}
@Test
+ public void chain_reads_with_writeback() {
+ service = mock(IoService.class);
+ when(service.getFilters()).thenReturn(new IoFilter[] { filter1, filterWriteBack, filter3 });
+ final DummySession session = new DummySession(service);
+ final ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ final long before = System.currentTimeMillis();
+ session.processMessageReceived(buffer);
+ verify(filter1).messageReceived(eq(session), eq(buffer), any(ReadFilterChainController.class));
+ verify(filterWriteBack).messageReceived(eq(session), eq(buffer), any(ReadFilterChainController.class));
+ verify(filter1).messageWriting(eq(session), any(WriteRequest.class), any(WriteFilterChainController.class));
+
+ assertEquals(1024L, session.getReadBytes());
+ final long lastRead = session.getLastReadTime();
+ assertTrue(lastRead - before < 100);
+ verifyNoMoreInteractions(filter1, filter2, filter3, filterWriteBack);
+ }
+
+ @Test
+ public void chain_reads_with_writeback_final() {
+ service = mock(IoService.class);
+ when(service.getFilters()).thenReturn(new IoFilter[] { filterWriteBack, filter2, filter3 });
+ final DummySession session = new DummySession(service);
+ final ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ final long before = System.currentTimeMillis();
+ session.processMessageReceived(buffer);
+ verify(filterWriteBack).messageReceived(eq(session), eq(buffer), any(ReadFilterChainController.class));
+
+ assertEquals(1024L, session.getReadBytes());
+ final long lastRead = session.getLastReadTime();
+ assertTrue(lastRead - before < 100);
+ verifyNoMoreInteractions(filter1, filter2, filter3, filterWriteBack);
+ }
+
+ @Test
public void chain_writes() {
final DummySession session = new DummySession(service);
final WriteRequest buffer = mock(DefaultWriteRequest.class);