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