You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2006/08/31 10:41:54 UTC

svn commit: r438841 - in /directory/trunks/mina: core/src/main/java/org/apache/mina/filter/codec/ core/src/main/java/org/apache/mina/filter/codec/textline/ filter-codec-asn1/src/main/java/org/apache/mina/filter/codec/asn1/ filter-codec-netty/src/main/j...

Author: trustin
Date: Thu Aug 31 01:41:51 2006
New Revision: 438841

URL: http://svn.apache.org/viewvc?rev=438841&view=rev
Log:
Fixed issue: DIRMINA-248 (ProtocolDecoder should get notified when a connection is closed.)
* Added ProtocolDecoder.finishDecode(IoSession,ProtocolDecoderOutput)
** Added the default implementation to ProtocolDecoderAdapter
* Changed ProtocolCodecFilter to invoke finishDecode() when sessionClosed event is invoked.


Modified:
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderAdapter.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
    directory/trunks/mina/filter-codec-asn1/src/main/java/org/apache/mina/filter/codec/asn1/Asn1CodecDecoder.java
    directory/trunks/mina/filter-codec-netty/src/main/java/org/apache/mina/filter/codec/netty/NettyDecoder.java

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=438841&r1=438840&r2=438841&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Thu Aug 31 01:41:51 2006
@@ -249,8 +249,35 @@
     
     public void sessionClosed( NextFilter nextFilter, IoSession session ) throws Exception
     {
-        disposeEncoder( session );
-        disposeDecoder( session );
+	// Call finishDecode() first when a connection is closed.
+	ProtocolDecoder decoder = getDecoder( session );
+        ProtocolDecoderOutput decoderOut = getDecoderOut( session, nextFilter );
+        try
+        {
+            decoder.finishDecode( session, decoderOut );
+        }
+        catch( Throwable t )
+        {
+            ProtocolDecoderException pde;
+            if( t instanceof ProtocolDecoderException )
+            {
+                pde = ( ProtocolDecoderException ) t;
+            }
+            else
+            {
+                pde = new ProtocolDecoderException( t );
+            }
+            throw pde;
+        }
+        finally
+        {
+            // Dispose all.
+            disposeEncoder( session );
+            disposeDecoder( session );
+
+            decoderOut.flush();
+        }
+        
         nextFilter.sessionClosed( session );
     }
 

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java?rev=438841&r1=438840&r2=438841&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java Thu Aug 31 01:41:51 2006
@@ -50,6 +50,17 @@
                  ProtocolDecoderOutput out ) throws Exception;
     
     /**
+     * Invoked when the specified <tt>session</tt> is closed.  This method is useful
+     * when you deal with the protocol which doesn't specify the length of a message
+     * such as HTTP response without <tt>content-length</tt> header. Implement this
+     * method to process the remaining data that {@link #decode(IoSession, ByteBuffer, ProtocolDecoderOutput)}
+     * method didn't process completely.
+     * 
+     * @throws Exception if the read data violated protocol specification
+     */
+    void finishDecode( IoSession session, ProtocolDecoderOutput out ) throws Exception;
+    
+    /**
      * Releases all resources related with this decoder.
      * 
      * @throws Exception if failed to dispose all resources

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderAdapter.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderAdapter.java?rev=438841&r1=438840&r2=438841&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderAdapter.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderAdapter.java Thu Aug 31 01:41:51 2006
@@ -30,8 +30,17 @@
  */
 public abstract class ProtocolDecoderAdapter implements ProtocolDecoder
 {
+    
     /**
-     * Override this method dispose all resources related with this decoder.
+     * Override this method to deal with the closed connection.
+     * The default implementation does nothing.
+     */
+    public void finishDecode( IoSession session, ProtocolDecoderOutput out ) throws Exception
+    {
+    }
+
+    /**
+     * Override this method to dispose all resources related with this decoder.
      * The default implementation does nothing.
      */
     public void dispose( IoSession session ) throws Exception

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java?rev=438841&r1=438840&r2=438841&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java Thu Aug 31 01:41:51 2006
@@ -63,6 +63,14 @@
         }
     }
 
+    public void finishDecode( IoSession session, ProtocolDecoderOutput out ) throws Exception
+    {
+	synchronized( decoder )
+	{
+	    decoder.finishDecode( session, out );
+	}
+    }
+
     public void dispose( IoSession session ) throws Exception
     {
         synchronized( decoder )

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java?rev=438841&r1=438840&r2=438841&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java Thu Aug 31 01:41:51 2006
@@ -113,12 +113,7 @@
                         ProtocolDecoderOutput out )
             throws Exception
     {
-        Context ctx = ( Context ) session.getAttribute( CONTEXT );
-        if( ctx == null )
-        {
-            ctx = new Context();
-            session.setAttribute( CONTEXT, ctx );
-        }
+        Context ctx = getContext(session);
         
         if( LineDelimiter.AUTO.equals( delimiter ) )
         {
@@ -140,6 +135,21 @@
                             ctx.getDecoder(),
                             out ) );
         }
+    }
+
+    private Context getContext(IoSession session) {
+	Context ctx;
+	ctx = ( Context ) session.getAttribute( CONTEXT );
+        if( ctx == null )
+        {
+            ctx = new Context();
+            session.setAttribute( CONTEXT, ctx );
+        }
+	return ctx;
+    }
+
+    public void finishDecode( IoSession session, ProtocolDecoderOutput out ) throws Exception
+    {
     }
 
     public void dispose( IoSession session ) throws Exception

Modified: directory/trunks/mina/filter-codec-asn1/src/main/java/org/apache/mina/filter/codec/asn1/Asn1CodecDecoder.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/filter-codec-asn1/src/main/java/org/apache/mina/filter/codec/asn1/Asn1CodecDecoder.java?rev=438841&r1=438840&r2=438841&view=diff
==============================================================================
--- directory/trunks/mina/filter-codec-asn1/src/main/java/org/apache/mina/filter/codec/asn1/Asn1CodecDecoder.java (original)
+++ directory/trunks/mina/filter-codec-asn1/src/main/java/org/apache/mina/filter/codec/asn1/Asn1CodecDecoder.java Thu Aug 31 01:41:51 2006
@@ -24,7 +24,7 @@
 import org.apache.directory.shared.asn1.codec.stateful.StatefulDecoder;
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.codec.ProtocolDecoder;
+import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
 
 /**
@@ -33,7 +33,7 @@
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$, 
  */
-public class Asn1CodecDecoder implements ProtocolDecoder
+public class Asn1CodecDecoder extends ProtocolDecoderAdapter
 {
 
     private final StatefulDecoder decoder;
@@ -51,10 +51,6 @@
     {
         callback.decOut = out;
         decoder.decode( in.buf() );
-    }
-
-    public void dispose( IoSession session ) throws Exception
-    {
     }
 
     private class DecoderCallbackImpl implements DecoderCallback

Modified: directory/trunks/mina/filter-codec-netty/src/main/java/org/apache/mina/filter/codec/netty/NettyDecoder.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/filter-codec-netty/src/main/java/org/apache/mina/filter/codec/netty/NettyDecoder.java?rev=438841&r1=438840&r2=438841&view=diff
==============================================================================
--- directory/trunks/mina/filter-codec-netty/src/main/java/org/apache/mina/filter/codec/netty/NettyDecoder.java (original)
+++ directory/trunks/mina/filter-codec-netty/src/main/java/org/apache/mina/filter/codec/netty/NettyDecoder.java Thu Aug 31 01:41:51 2006
@@ -25,16 +25,19 @@
 
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.ProtocolDecoder;
+import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
 import org.apache.mina.filter.codec.ProtocolDecoderException;
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
 
 /**
- * A MINA <tt>ProtocolDecoder</tt> that decodes byte buffers into
+ * A MINA {@link ProtocolDecoder} that decodes byte buffers into
  * Netty2 {@link Message}s using specified {@link MessageRecognizer}s. 
  * 
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$,
  */
-public class NettyDecoder implements org.apache.mina.filter.codec.ProtocolDecoder
+public class NettyDecoder extends ProtocolDecoderAdapter
 {
     private final MessageRecognizer recognizer;
 
@@ -71,89 +74,86 @@
         readBuf = newBuf;
     }
 
-	public void decode(IoSession session, ByteBuffer in, org.apache.mina.filter.codec.ProtocolDecoderOutput out) throws Exception {
-	       put( in );
-
-	        Message m = readingMessage;
-	        try
-	        {
-	            for( ;; )
-	            {
-	                readBuf.flip();
-	                if( m == null )
-	                {
-	                    int limit = readBuf.limit();
-	                    boolean failed = true;
-	                    try
-	                    {
-	                        m = recognizer.recognize( readBuf );
-	                        failed = false;
-	                    }
-	                    finally
-	                    {
-	                        if( failed )
-	                        {
-	                            // clear the read buffer if failed to recognize
-	                            readBuf.clear();
-	                            break;
-	                        }
-	                        else
-	                        {
-	                            if( m == null )
-	                            {
-	                                readBuf.limit( readBuf.capacity() );
-	                                readBuf.position( limit );
-	                                break; // finish decoding
-	                            }
-	                            else
-	                            {
-	                                // reset buffer for read
-	                                readBuf.limit( limit );
-	                                readBuf.position( 0 );
-	                            }
-	                        }
-	                    }
-	                }
-
-	                if( m != null )
-	                {
-	                    try
-	                    {
-	                        if( m.read( readBuf ) )
-	                        {
-	                            out.write( m );
-	                            m = null;
-	                        } else {
-	                        	break;
-	                        }
-	                    }
-	                    finally
-	                    {
-	                        if( readBuf.hasRemaining() )
-	                        {
-	                            readBuf.compact();
-	                        }
-	                        else
-	                        {
-	                            readBuf.clear();
-				    break;
-	                        }
-	                    }
-	                }
-	            }
-	        }
-	        catch( MessageParseException e )
-	        {
-	            m = null; // discard reading message
-	            throw new ProtocolDecoderException( "Failed to decode.", e );
-	        }
-	        finally
-	        {
-	            readingMessage = m;
-	        }		
-	}
-
-	public void dispose(IoSession session) throws Exception {
+    public void decode( IoSession session, ByteBuffer in, ProtocolDecoderOutput out ) throws Exception
+    {
+        put( in );
 
-	}
+        Message m = readingMessage;
+        try
+        {
+            for( ;; )
+            {
+                readBuf.flip();
+                if( m == null )
+                {
+                    int limit = readBuf.limit();
+                    boolean failed = true;
+                    try
+                    {
+                        m = recognizer.recognize( readBuf );
+                        failed = false;
+                    }
+                    finally
+                    {
+                        if( failed )
+                        {
+                            // clear the read buffer if failed to recognize
+                            readBuf.clear();
+                            break;
+                        }
+                        else
+                        {
+                            if( m == null )
+                            {
+                        	readBuf.limit( readBuf.capacity() );
+                        	readBuf.position( limit );
+                        	break; // finish decoding
+                            }
+                            else
+                            {
+                        	// reset buffer for read
+                        	readBuf.limit( limit );
+                        	readBuf.position( 0 );
+                            }
+                        }
+                    }
+                }
+
+                if( m != null )
+                {
+                    try
+                    {
+                	if( m.read( readBuf ) )
+                	{
+                	    out.write( m );
+                	    m = null;
+                	} else {
+                	    break;
+                	}
+                    }
+                    finally
+                    {
+                	if( readBuf.hasRemaining() )
+                	{
+                	    readBuf.compact();
+                	}
+                	else
+                	{
+                	    readBuf.clear();
+                	    break;
+                	}
+                    }
+                }
+            }
+        }
+        catch( MessageParseException e )
+        {
+            m = null; // discard reading message
+            throw new ProtocolDecoderException( "Failed to decode.", e );
+        }
+        finally
+        {
+            readingMessage = m;
+        }		
+    }
 }