Author: jvermillard
Date: Fri Aug 19 20:03:29 2011
New Revision: 1159767
URL: http://svn.apache.org/viewvc?rev=1159767&view=rev
Log:
Testing another filter chaining strategy for read and write
Added:
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
(with props)
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java
(with props)
Modified:
mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilter.java
mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilterChain.java
mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoSession.java
mina/branches/3.0/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/DefaultIoFilterChain.java
mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
mina/branches/3.0/core/src/test/java/org/apache/mina/filterchain/DefaultIoFilterChainTest.java
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilter.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilter.java?rev=1159767&r1=1159766&r2=1159767&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilter.java
(original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilter.java Fri
Aug 19 20:03:29 2011
@@ -20,6 +20,9 @@
package org.apache.mina.api;
+import org.apache.mina.filterchain.ReadFilterChainController;
+import org.apache.mina.filterchain.WriteFilterChainController;
+
/**
* Filter are interceptors/processors for incoming data received/sent.
*
@@ -64,17 +67,14 @@ public interface IoFilter {
*
* @param session {@link IoSession} associated with the invocation
* @param message the incoming message to process
- * @return the message after processing
*/
- Object messageReceived(IoSession session, Object message);
+ void messageReceived(IoSession session, Object message,
ReadFilterChainController controller, int currentPosition);
/**
* Invoked when a message is under writing. The filter is supposed to
apply the needed transformation.
*
* @param session {@link IoSession} associated with the invocation
* @param message the message to process before writing
- * @return the message after processing
*/
- Object messageWriting(IoSession session, Object message);
-
+ void messageWriting(IoSession session, Object message,
WriteFilterChainController controller, int currentPosition);
}
\ No newline at end of file
Modified:
mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilterChain.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilterChain.java?rev=1159767&r1=1159766&r2=1159767&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilterChain.java
(original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoFilterChain.java
Fri Aug 19 20:03:29 2011
@@ -95,9 +95,9 @@ public interface IoFilterChain {
/**
* Call this method for processing a message for writing using this chain.
+ * Once the message is processed, the resulting ByteBuffers are enqueued
in the session write requests queue
* @param session {@link IoSession} associated with this message
* @param message the message to write
- * @return the message after the processing
*/
- Object processMessageWriting(IoSession session, Object message);
+ void processMessageWriting(IoSession session, Object message);
}
\ No newline at end of file
Modified:
mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoSession.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoSession.java?rev=1159767&r1=1159766&r2=1159767&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoSession.java
(original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/api/IoSession.java Fri
Aug 19 20:03:29 2011
@@ -284,6 +284,12 @@ public interface IoSession {
public IoFuture<Void> writeWithFuture(Object message);
/**
+ * Internal method for enqueue write request after {@link IoFilterChain}
processing
+ * @param message
+ */
+ public void enqueueWriteRequest(Object message);
+
+ /**
* Get the {@link Queue} of this session. The write queue contains the
pending writes.
* @return the write queue of this session
*/
Modified:
mina/branches/3.0/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java?rev=1159767&r1=1159766&r2=1159767&view=diff
==============================================================================
---
mina/branches/3.0/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
(original)
+++
mina/branches/3.0/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
Fri Aug 19 20:03:29 2011
@@ -22,6 +22,8 @@ package org.apache.mina.filter.logging;
import org.apache.mina.api.IdleStatus;
import org.apache.mina.api.IoFilter;
import org.apache.mina.api.IoSession;
+import org.apache.mina.filterchain.ReadFilterChainController;
+import org.apache.mina.filterchain.WriteFilterChainController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -154,6 +156,7 @@ public class LoggingFilter implements Io
@Override
public void sessionOpened(IoSession session) {
log(sessionOpenedLevel, "OPENED");
+
}
@Override
@@ -167,15 +170,17 @@ public class LoggingFilter implements Io
}
@Override
- public Object messageReceived(IoSession session, Object message) {
+ public void messageReceived(IoSession session, Object message,
ReadFilterChainController controller,
+ int currentPosition) {
log(messageReceivedLevel, "RECEIVED: {}", message);
- return message;
+ controller.callReadNextFilter(session, currentPosition, message);
}
@Override
- public Object messageWriting(IoSession session, Object message) {
+ public void messageWriting(IoSession session, Object message,
WriteFilterChainController controller,
+ int currentPosition) {
log(messageWritingLevel, "WRITTING: {}", message);
- return message;
+ controller.callWriteNextFilter(session, currentPosition, message);
}
//=========================
Modified:
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/DefaultIoFilterChain.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/DefaultIoFilterChain.java?rev=1159767&r1=1159766&r2=1159767&view=diff
==============================================================================
---
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/DefaultIoFilterChain.java
(original)
+++
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/DefaultIoFilterChain.java
Fri Aug 19 20:03:29 2011
@@ -28,7 +28,7 @@ import org.apache.mina.api.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class DefaultIoFilterChain implements IoFilterChain {
+public class DefaultIoFilterChain implements IoFilterChain,
ReadFilterChainController, WriteFilterChainController {
private static final Logger LOG =
LoggerFactory.getLogger(DefaultIoFilterChain.class);
@@ -61,6 +61,7 @@ public class DefaultIoFilterChain implem
@Override
public void processSessionCreated(IoSession session) {
+ LOG.debug("processing session created event");
for (IoFilter filter : chain) {
filter.sessionCreated(session);
}
@@ -68,6 +69,7 @@ public class DefaultIoFilterChain implem
@Override
public void processSessionOpen(IoSession session) {
+ LOG.debug("processing session open event");
for (IoFilter filter : chain) {
filter.sessionOpened(session);
}
@@ -75,6 +77,7 @@ public class DefaultIoFilterChain implem
@Override
public void processSessionClosed(IoSession session) {
+ LOG.debug("processing session closed event");
for (IoFilter filter : chain) {
filter.sessionClosed(session);
}
@@ -82,27 +85,24 @@ public class DefaultIoFilterChain implem
@Override
public void processMessageReceived(IoSession session, Object message) {
- for (IoFilter filter : chain) {
- message = filter.messageReceived(session, message);
- if (message == null) {
- // no message was produced by the filter, it's probably
accumulating messages
- break;
- }
+ LOG.debug("processing message '{}' received event ", message);
+ if (chain.isEmpty()) {
+ LOG.debug("Nothing to do, the chain is empty");
+ } else {
+ // we call the first filter, it's supposed to call the next ones
using the filter chain controller
+ chain.get(0).messageReceived(session, message, this, 0);
}
}
@Override
- public Object processMessageWriting(IoSession session, Object message) {
- int len = chain.size();
- for (int i = 1; i <= len; i++) {
- message = chain.get(len - i).messageWriting(session, message);
- if (message == null) {
- // no message was produced by the filter, it's probably
accumulating messages
- return null;
- }
-
+ public void processMessageWriting(IoSession session, Object message) {
+ LOG.debug("processing message '{}' writing event ", message);
+ if (chain.isEmpty()) {
+ LOG.debug("Nothing to do, the chain is empty");
+ } else {
+ // we call the first filter, it's supposed to call the next ones
using the filter chain controller
+ chain.get(0).messageWriting(session, message, this, 0);
}
- return message;
}
@Override
@@ -115,4 +115,25 @@ public class DefaultIoFilterChain implem
return bldr.append("}").toString();
}
+ @Override
+ public void callWriteNextFilter(IoSession session, int currentPosition,
Object message) {
+ currentPosition--;
+ if (currentPosition < 0 || chain.size() == 0) {
+ // end of chain processing
+ session.enqueueWriteRequest(message);
+ } else {
+ chain.get(currentPosition).messageWriting(session, message, this,
currentPosition);
+ }
+ }
+
+ @Override
+ public void callReadNextFilter(IoSession session, int currentPosition,
Object message) {
+ currentPosition++;
+ if (currentPosition >= chain.size()) {
+ // end of chain processing
+ } else {
+ chain.get(currentPosition).messageReceived(session, message, this,
currentPosition);
+ }
+ }
+
}
\ No newline at end of file
Added:
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java?rev=1159767&view=auto
==============================================================================
---
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
(added)
+++
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
Fri Aug 19 20:03:29 2011
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.mina.filterchain;
+
+import org.apache.mina.api.IoSession;
+
+/**
+ * Chain controller used by a filter for calling the next filter in read order.
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ *
+ */
+public interface ReadFilterChainController {
+
+ void callReadNextFilter(IoSession session, int currentPosition, Object
message);
+}
Propchange:
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/ReadFilterChainController.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java?rev=1159767&view=auto
==============================================================================
---
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java
(added)
+++
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java
Fri Aug 19 20:03:29 2011
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.mina.filterchain;
+
+import org.apache.mina.api.IoSession;
+
+/**
+ * Chain controller used by a filter for calling the next filter in write
order.
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ *
+ */
+public interface WriteFilterChainController {
+ void callWriteNextFilter(IoSession session, int currentPosition, Object
message);
+}
Propchange:
mina/branches/3.0/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java?rev=1159767&r1=1159766&r2=1159767&view=diff
==============================================================================
---
mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
(original)
+++
mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
Fri Aug 19 20:03:29 2011
@@ -229,10 +229,11 @@ public abstract class AbstractIoSession
}
// process the queue
- message = getFilterChain().processMessageWriting(this, message);
- if (message == null)
- return;
+ getFilterChain().processMessageWriting(this, message);
+ }
+
+ public void enqueueWriteRequest(Object message) {
writeQueue.add(new DefaultWriteRequest(message));
// If it wasn't, we register this session as interested to write.
@@ -240,6 +241,7 @@ public abstract class AbstractIoSession
if (!registeredForWrite.getAndSet(true)) {
writeProcessor.flush(this);
}
+
}
@Override
Modified:
mina/branches/3.0/core/src/test/java/org/apache/mina/filterchain/DefaultIoFilterChainTest.java
URL:
http://svn.apache.org/viewvc/mina/branches/3.0/core/src/test/java/org/apache/mina/filterchain/DefaultIoFilterChainTest.java?rev=1159767&r1=1159766&r2=1159767&view=diff
==============================================================================
---
mina/branches/3.0/core/src/test/java/org/apache/mina/filterchain/DefaultIoFilterChainTest.java
(original)
+++
mina/branches/3.0/core/src/test/java/org/apache/mina/filterchain/DefaultIoFilterChainTest.java
Fri Aug 19 20:03:29 2011
@@ -49,18 +49,20 @@ public class DefaultIoFilterChainTest {
public void sessionIdle(IoSession session, IdleStatus status) {
}
- @Override
- public Object messageReceived(IoSession session, Object message) {
- return message;
+ public String toString() {
+ return "DummyFilter(" + id + ")";
}
@Override
- public Object messageWriting(IoSession session, Object message) {
- return message;
+ public void messageReceived(IoSession session, Object message,
ReadFilterChainController controller,
+ int currentPosition) {
+ controller.callReadNextFilter(session, currentPosition, message);
}
- public String toString() {
- return "DummyFilter(" + id + ")";
+ @Override
+ public void messageWriting(IoSession session, Object message,
WriteFilterChainController controller,
+ int currentPosition) {
+ controller.callWriteNextFilter(session, currentPosition, message);
}
}