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);
         }
     }
 


Reply via email to