Author: trustin
Date: Thu Dec 27 19:43:04 2007
New Revision: 607166

URL: http://svn.apache.org/viewvc?rev=607166&view=rev
Log:
Resolved issue: DIRMINA-504 (Allow ProtocolEncoder to generate non-IoBuffer 
objects)
* Changed ProtocolEncoderOutput.write() to accept an Object as a parameter
* Renamed ProtocolEncoderOutput.getBufferQueue() to getEncodedMessageQueue()


Modified:
    
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java
    
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/ProtocolEncoderOutput.java
    
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java
    
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java?rev=607166&r1=607165&r2=607166&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java
 Thu Dec 27 19:43:04 2007
@@ -32,26 +32,38 @@
  */
 public abstract class AbstractProtocolEncoderOutput implements
         ProtocolEncoderOutput {
-    private final Queue<IoBuffer> bufferQueue = new CircularQueue<IoBuffer>();
+    private final Queue<Object> encodedMessageQueue = new 
CircularQueue<Object>();
+    private boolean buffersOnly = true;
 
     public AbstractProtocolEncoderOutput() {
     }
 
-    public Queue<IoBuffer> getBufferQueue() {
-        return bufferQueue;
+    public Queue<Object> getEncodedMessageQueue() {
+        return encodedMessageQueue;
     }
 
-    public void write(IoBuffer buf) {
-        if (buf.hasRemaining()) {
-            bufferQueue.add(buf);
+    public void write(Object encodedMessage) {
+        if (encodedMessage instanceof IoBuffer) {
+            IoBuffer buf = (IoBuffer) encodedMessage;
+            if (buf.hasRemaining()) {
+                encodedMessageQueue.offer(buf);
+            } else {
+                throw new IllegalArgumentException(
+                        "buf is empty. Forgot to call flip()?");
+            }
         } else {
-            throw new IllegalArgumentException(
-                    "buf is empty. Forgot to call flip()?");
+            encodedMessageQueue.offer(encodedMessage);
+            buffersOnly = false;
         }
     }
 
     public void mergeAll() {
-        final int size = bufferQueue.size();
+        if (!buffersOnly) {
+            throw new IllegalStateException(
+                    "the encoded message list contains a non-buffer.");
+        }
+        
+        final int size = encodedMessageQueue.size();
 
         if (size < 2) {
             // no need to merge!
@@ -60,8 +72,8 @@
 
         // Get the size of merged BB
         int sum = 0;
-        for (IoBuffer b : bufferQueue) {
-            sum += b.remaining();
+        for (Object b : encodedMessageQueue) {
+            sum += ((IoBuffer) b).remaining();
         }
 
         // Allocate a new BB that will contain all fragments
@@ -69,7 +81,7 @@
 
         // and merge all.
         for (; ;) {
-            IoBuffer buf = bufferQueue.poll();
+            IoBuffer buf = (IoBuffer) encodedMessageQueue.poll();
             if (buf == null) {
                 break;
             }
@@ -79,6 +91,6 @@
 
         // Push the new buffer finally.
         newBuf.flip();
-        bufferQueue.add(newBuf);
+        encodedMessageQueue.add(newBuf);
     }
 }

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=607166&r1=607165&r2=607166&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
 Thu Dec 27 19:43:04 2007
@@ -335,7 +335,7 @@
     }
 
     private static class EncodedWriteRequest extends DefaultWriteRequest {
-        private EncodedWriteRequest(IoBuffer encodedMessage,
+        private EncodedWriteRequest(Object encodedMessage,
                 WriteFuture future, SocketAddress destination) {
             super(encodedMessage, future, destination);
         }
@@ -387,18 +387,19 @@
         }
 
         public WriteFuture flush() {
-            Queue<IoBuffer> bufferQueue = getBufferQueue();
+            Queue<Object> bufferQueue = getEncodedMessageQueue();
             WriteFuture future = null;
             for (;;) {
-                IoBuffer buf = bufferQueue.poll();
-                if (buf == null) {
+                Object encodedMessage = bufferQueue.poll();
+                if (encodedMessage == null) {
                     break;
                 }
 
                 // Flush only when the buffer has remaining.
-                if (buf.hasRemaining()) {
+                if (!(encodedMessage instanceof IoBuffer) ||
+                        ((IoBuffer) encodedMessage).hasRemaining()) {
                     future = new DefaultWriteFuture(session);
-                    nextFilter.filterWrite(session, new 
EncodedWriteRequest(buf,
+                    nextFilter.filterWrite(session, new 
EncodedWriteRequest(encodedMessage,
                             future, writeRequest.getDestination()));
                 }
             }
@@ -412,18 +413,19 @@
         }
         
         public void flushWithoutFuture() {
-            Queue<IoBuffer> bufferQueue = getBufferQueue();
+            Queue<Object> bufferQueue = getEncodedMessageQueue();
             for (;;) {
-                IoBuffer buf = bufferQueue.poll();
-                if (buf == null) {
+                Object encodedMessage = bufferQueue.poll();
+                if (encodedMessage == null) {
                     break;
                 }
 
                 // Flush only when the buffer has remaining.
-                if (buf.hasRemaining()) {
+                if (!(encodedMessage instanceof IoBuffer) ||
+                        ((IoBuffer) encodedMessage).hasRemaining()) {
                     nextFilter.filterWrite(
                             session, new EncodedWriteRequest(
-                                    buf, null, writeRequest.getDestination()));
+                                    encodedMessage, null, 
writeRequest.getDestination()));
                 }
             }
         }

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=607166&r1=607165&r2=607166&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
 Thu Dec 27 19:43:04 2007
@@ -92,8 +92,8 @@
     /**
      * Returns the [EMAIL PROTECTED] Queue} of the buffered encoder output.
      */
-    public Queue<IoBuffer> getEncoderOutputQueue() {
-        return encoderOutput.getBufferQueue();
+    public Queue<Object> getEncoderOutputQueue() {
+        return encoderOutput.getEncodedMessageQueue();
     }
 
     /**

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java?rev=607166&r1=607165&r2=607166&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java
 Thu Dec 27 19:43:04 2007
@@ -19,37 +19,42 @@
  */
 package org.apache.mina.filter.codec;
 
+import org.apache.mina.common.FileRegion;
 import org.apache.mina.common.IoBuffer;
 import org.apache.mina.common.WriteFuture;
 
 /**
- * Callback for [EMAIL PROTECTED] ProtocolEncoder} to generate encoded [EMAIL 
PROTECTED] IoBuffer}s.
- * [EMAIL PROTECTED] ProtocolEncoder} must call [EMAIL PROTECTED] 
#write(IoBuffer)} for each encoded
- * message.
+ * Callback for [EMAIL PROTECTED] ProtocolEncoder} to generate encoded 
messages such as
+ * [EMAIL PROTECTED] IoBuffer}s.  [EMAIL PROTECTED] ProtocolEncoder} must call 
[EMAIL PROTECTED] #write(Object)}
+ * for each encoded message.
  *
  * @author The Apache MINA Project ([EMAIL PROTECTED])
  * @version $Rev$, $Date$
  */
 public interface ProtocolEncoderOutput {
     /**
-     * Callback for [EMAIL PROTECTED] ProtocolEncoder} to generate encoded
-     * [EMAIL PROTECTED] IoBuffer}s. [EMAIL PROTECTED] ProtocolEncoder} must 
call
-     * [EMAIL PROTECTED] #write(IoBuffer)} for each encoded message.
+     * Callback for [EMAIL PROTECTED] ProtocolEncoder} to generate an encoded 
message such
+     * as an [EMAIL PROTECTED] IoBuffer}. [EMAIL PROTECTED] ProtocolEncoder} 
must call
+     * [EMAIL PROTECTED] #write(Object)} for each encoded message.
      *
-     * @param buf the buffer which contains encoded data
+     * @param encodedMessage the encoded message, typically an [EMAIL 
PROTECTED] IoBuffer}
+     *                       or a [EMAIL PROTECTED] FileRegion}.
      */
-    void write(IoBuffer buf);
+    void write(Object encodedMessage);
 
     /**
-     * Merges all buffers you wrote via [EMAIL PROTECTED] #write(IoBuffer)} 
into
+     * Merges all buffers you wrote via [EMAIL PROTECTED] #write(Object)} into
      * one [EMAIL PROTECTED] IoBuffer} and replaces the old fragmented ones 
with it.
      * This method is useful when you want to control the way MINA generates
-     * network packets.
+     * network packets.  Please note that this method only works when you
+     * called [EMAIL PROTECTED] #write(Object)} method with only [EMAIL 
PROTECTED] IoBuffer}s.
+     * 
+     * @throws IllegalStateException if you wrote something else than [EMAIL 
PROTECTED] IoBuffer}
      */
     void mergeAll();
 
     /**
-     * Flushes all buffers you wrote via [EMAIL PROTECTED] #write(IoBuffer)} to
+     * Flushes all buffers you wrote via [EMAIL PROTECTED] #write(Object)} to
      * the session.  This operation is asynchronous; please wait for
      * the returned [EMAIL PROTECTED] WriteFuture} if you want to wait for
      * the buffers flushed.

Modified: 
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java?rev=607166&r1=607165&r2=607166&view=diff
==============================================================================
--- 
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java
 (original)
+++ 
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java
 Thu Dec 27 19:43:04 2007
@@ -48,7 +48,7 @@
         encoder.encode(session, expected, out);
 
         Assert.assertEquals(1, session.getEncoderOutputQueue().size());
-        IoBuffer buf = session.getEncoderOutputQueue().poll();
+        IoBuffer buf = (IoBuffer) session.getEncoderOutputQueue().poll();
 
         testDecoderAndInputStream(expected, buf);
     }

Modified: 
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java?rev=607166&r1=607165&r2=607166&view=diff
==============================================================================
--- 
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java
 (original)
+++ 
mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java
 Thu Dec 27 19:43:04 2007
@@ -47,7 +47,7 @@
 
         encoder.encode(session, "ABC", out);
         Assert.assertEquals(1, session.getEncoderOutputQueue().size());
-        IoBuffer buf = session.getEncoderOutputQueue().poll();
+        IoBuffer buf = (IoBuffer) session.getEncoderOutputQueue().poll();
         Assert.assertEquals(5, buf.remaining());
         Assert.assertEquals('A', buf.get());
         Assert.assertEquals('B', buf.get());


Reply via email to