You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2008/11/11 20:32:27 UTC

svn commit: r713125 - in /mina/trunk: core/src/main/java/org/apache/mina/filter/codec/ core/src/main/java/org/apache/mina/filter/codec/statemachine/ example/src/main/java/org/apache/mina/example/tapedeck/

Author: elecharny
Date: Tue Nov 11 11:32:26 2008
New Revision: 713125

URL: http://svn.apache.org/viewvc?rev=713125&view=rev
Log:
Fixed DIRMINA-636 and DIRMINA-635:
o removing the NextFilter and IoSession parameters to the ProtocolDecoderOutput constructor
o adding those parameters to the fulsh() method
o calling a common initializer for the encoder/decoder into the preAdd and sessionCreated methods
o The very same for the dispose encoder/decoder

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java
    mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=713125&r1=713124&r2=713125&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Tue Nov 11 11:32:26 2008
@@ -185,18 +185,16 @@
             throw new IllegalArgumentException(
                     "You can't add the same filter instance more than once.  Create another instance and add it.");
         }
+        
+        // Initialize the encoder and decoder
+        initCodec(parent.getSession());
     }
 
     @Override
     public void onPostRemove(IoFilterChain parent, String name,
             NextFilter nextFilter) throws Exception {
-        // We just remove the two instances of encoder/decoder to release resources
-        // from the session
-        disposeEncoder(parent.getSession());
-        disposeDecoder(parent.getSession());
-        
-        // We also remove the callback  
-        disposeDecoderOut(parent.getSession());
+        // Clean everything
+        disposeCodec(parent.getSession());
     }
 
     /**
@@ -262,7 +260,7 @@
                 }
                 
                 // Finish decoding if no exception was thrown.
-                decoderOut.flush();
+                decoderOut.flush(nextFilter, session);
             } catch (Throwable t) {
                 ProtocolDecoderException pde;
                 if (t instanceof ProtocolDecoderException) {
@@ -280,7 +278,7 @@
                 }
 
                 // Fire the exceptionCaught event.
-                decoderOut.flush();
+                decoderOut.flush(nextFilter, session);
                 nextFilter.exceptionCaught(session, pde);
 
                 // Retry only if the type of the caught exception is
@@ -390,13 +388,8 @@
      */
     @Override
     public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {
-        // Creates the decoder and stores it into the newly created session 
-        ProtocolDecoder decoder = factory.getDecoder(session);
-        session.setAttribute(DECODER, decoder);
-
-        // Creates the encoder and stores it into the newly created session 
-        ProtocolEncoder encoder = factory.getEncoder(session);
-        session.setAttribute(ENCODER, encoder);
+        // Initialized the encoder and decoder
+        initCodec(session);
 
         // Call the next filter
         nextFilter.sessionCreated(session);
@@ -407,19 +400,6 @@
             throws Exception {
         // Call finishDecode() first when a connection is closed.
         ProtocolDecoder decoder = getDecoder(session);
-        
-        if ( decoder == null) {
-            // The decoder must not be null. It's null if
-            // the sessionCreated message has not be called, for
-            // instance if the filter has been added after the 
-            // first session is created.
-            ProtocolDecoderException pde = new ProtocolDecoderException(
-                "Cannot decode if the decoder is null. Add the filter in the chain" +
-                "before the first session is created" ); 
-            nextFilter.exceptionCaught(session, pde);
-            return;
-        }
-        
         ProtocolDecoderOutput decoderOut = getDecoderOut(session, nextFilter);
         
         if ( decoderOut == null) {
@@ -445,13 +425,12 @@
             }
             throw pde;
         } finally {
-            // Dispose all.
-            disposeEncoder(session);
-            disposeDecoder(session);
-            disposeDecoderOut(session);
-            decoderOut.flush();
+            // Dispose everything
+            disposeCodec(session);
+            decoderOut.flush(nextFilter, session);
         }
 
+        // Call the next filter
         nextFilter.sessionClosed(session);
     }
 
@@ -464,46 +443,12 @@
             NextFilter nextFilter) {
         ProtocolDecoderOutput out = (ProtocolDecoderOutput) session.getAttribute(DECODER_OUT);
         if (out == null) {
-            out = new ProtocolDecoderOutputImpl(session, nextFilter);
+            out = new ProtocolDecoderOutputImpl();
             session.setAttribute(DECODER_OUT, out);
         }
         return out;
     }
 
-    private void disposeEncoder(IoSession session) {
-        ProtocolEncoder encoder = (ProtocolEncoder) session
-                .removeAttribute(ENCODER);
-        if (encoder == null) {
-            return;
-        }
-
-        try {
-            encoder.dispose(session);
-        } catch (Throwable t) {
-            logger.warn(
-                    "Failed to dispose: " + encoder.getClass().getName() + " (" + encoder + ')');
-        }
-    }
-
-    private void disposeDecoder(IoSession session) {
-        ProtocolDecoder decoder = (ProtocolDecoder) session
-                .removeAttribute(DECODER);
-        if (decoder == null) {
-            return;
-        }
-
-        try {
-            decoder.dispose(session);
-        } catch (Throwable t) {
-            logger.warn(
-                    "Falied to dispose: " + decoder.getClass().getName() + " (" + decoder + ')');
-        }
-    }
-
-    private void disposeDecoderOut(IoSession session) {
-        session.removeAttribute(DECODER_OUT);
-    }
-
     private static class EncodedWriteRequest extends DefaultWriteRequest {
         private EncodedWriteRequest(Object encodedMessage,
                 WriteFuture future, SocketAddress destination) {
@@ -524,16 +469,10 @@
 
     private static class ProtocolDecoderOutputImpl extends
             AbstractProtocolDecoderOutput {
-        private final IoSession session;
-        private final NextFilter nextFilter;
-
-        public ProtocolDecoderOutputImpl(
-                IoSession session, NextFilter nextFilter) {
-            this.session = session;
-            this.nextFilter = nextFilter;
+        public ProtocolDecoderOutputImpl() {
         }
 
-        public void flush() {
+        public void flush(NextFilter nextFilter, IoSession session) {
             Queue<Object> messageQueue = getMessageQueue();
             while (!messageQueue.isEmpty()) {
                 nextFilter.messageReceived(session, messageQueue.poll());
@@ -601,4 +540,80 @@
             }
         }
     }
+    
+    //----------- Helper methods ---------------------------------------------
+    /**
+     * Initialize the encoder and the decoder, storing them in the 
+     * session attributes.
+     */
+    private void initCodec(IoSession session) throws Exception {
+        // Creates the decoder and stores it into the newly created session 
+        ProtocolDecoder decoder = factory.getDecoder(session);
+        session.setAttribute(DECODER, decoder);
+
+        // Creates the encoder and stores it into the newly created session 
+        ProtocolEncoder encoder = factory.getEncoder(session);
+        session.setAttribute(ENCODER, encoder);
+    }
+    
+    /**
+     * Dispose the encoder, decoder, and the callback for the decoded
+     * messages.
+     */
+    private void disposeCodec(IoSession session) {
+        // We just remove the two instances of encoder/decoder to release resources
+        // from the session
+        disposeEncoder(session);
+        disposeDecoder(session);
+        
+        // We also remove the callback  
+        disposeDecoderOut(session);
+    }
+    
+    /**
+     * dispose the encoder, removing its instance from the
+     * session's attributes, and calling the associated
+     * dispose method.
+     */
+    private void disposeEncoder(IoSession session) {
+        ProtocolEncoder encoder = (ProtocolEncoder) session
+                .removeAttribute(ENCODER);
+        if (encoder == null) {
+            return;
+        }
+
+        try {
+            encoder.dispose(session);
+        } catch (Throwable t) {
+            logger.warn(
+                    "Failed to dispose: " + encoder.getClass().getName() + " (" + encoder + ')');
+        }
+    }
+
+    /**
+     * dispose the decoder, removing its instance from the
+     * session's attributes, and calling the associated
+     * dispose method.
+     */
+    private void disposeDecoder(IoSession session) {
+        ProtocolDecoder decoder = (ProtocolDecoder) session
+                .removeAttribute(DECODER);
+        if (decoder == null) {
+            return;
+        }
+
+        try {
+            decoder.dispose(session);
+        } catch (Throwable t) {
+            logger.warn(
+                    "Falied to dispose: " + decoder.getClass().getName() + " (" + decoder + ')');
+        }
+    }
+
+    /**
+     * Remove the decoder callback from the session's attributes.
+     */
+    private void disposeDecoderOut(IoSession session) {
+        session.removeAttribute(DECODER_OUT);
+    }
 }

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java?rev=713125&r1=713124&r2=713125&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java Tue Nov 11 11:32:26 2008
@@ -22,6 +22,7 @@
 import java.util.Queue;
 
 import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.filterchain.IoFilter.NextFilter;
 import org.apache.mina.core.future.DefaultWriteFuture;
 import org.apache.mina.core.future.WriteFuture;
 import org.apache.mina.core.session.DummySession;
@@ -71,7 +72,7 @@
 
     private final AbstractProtocolDecoderOutput decoderOutput =
         new AbstractProtocolDecoderOutput() {
-            public void flush() {
+            public void flush(NextFilter nextFilter, IoSession session) {
             }
     };
 

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java?rev=713125&r1=713124&r2=713125&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java Tue Nov 11 11:32:26 2008
@@ -19,6 +19,9 @@
  */
 package org.apache.mina.filter.codec;
 
+import org.apache.mina.core.filterchain.IoFilter.NextFilter;
+import org.apache.mina.core.session.IoSession;
+
 /**
  * Callback for {@link ProtocolDecoder} to generate decoded messages.
  * {@link ProtocolDecoder} must call {@link #write(Object)} for each decoded
@@ -41,5 +44,5 @@
      * Flushes all messages you wrote via {@link #write(Object)} to
      * the next filter.
      */
-    void flush();
+    void flush(NextFilter nextFilter, IoSession session);
 }

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java?rev=713125&r1=713124&r2=713125&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java Tue Nov 11 11:32:26 2008
@@ -23,6 +23,8 @@
 import java.util.List;
 
 import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.filterchain.IoFilter.NextFilter;
+import org.apache.mina.core.session.IoSession;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
 import org.slf4j.Logger;
@@ -53,7 +55,7 @@
     private final List<Object> childProducts = new ArrayList<Object>();
 
     private final ProtocolDecoderOutput childOutput = new ProtocolDecoderOutput() {
-        public void flush() {
+        public void flush(NextFilter nextFilter, IoSession session) {
         }
 
         public void write(Object message) {

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java?rev=713125&r1=713124&r2=713125&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java Tue Nov 11 11:32:26 2008
@@ -23,6 +23,7 @@
 import java.util.LinkedList;
 
 import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.filterchain.IoFilter.NextFilter;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.filter.codec.ProtocolDecoder;
 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
@@ -94,7 +95,7 @@
             public void write(Object message) {
                 lines.add((String) message);
             }
-            public void flush() {}
+            public void flush(NextFilter nextFilter, IoSession session) {}
         });
         
         for (String s: lines) {