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 2013/01/08 14:58:22 UTC
svn commit: r1430287 - in /mina/mina/trunk:
core/src/main/java/org/apache/mina/api/
core/src/main/java/org/apache/mina/filter/codec/
core/src/main/java/org/apache/mina/filter/logging/
core/src/main/java/org/apache/mina/filterchain/ core/src/main/java/o...
Author: elecharny
Date: Tue Jan 8 13:58:21 2013
New Revision: 1430287
URL: http://svn.apache.org/viewvc?rev=1430287&view=rev
Log:
Allow a direct write into channel without passing through a select() :
o We now pass a WriteRequest through the chain, to store the original message
o Removed the lastWriteRequest field in AbstractIoSession : we don't need it anymore.
o Renamed the highLevelMessage field to originalMessage in DefaultWriteRequest
o Added some setters in DefaultWriteRequest
o Added a writeDirect( message ) in IoSession (todo : check if it's a good idea to have it in the interface...)
o Fixed the tests accordingly to those changes
Modified:
mina/mina/trunk/core/src/main/java/org/apache/mina/api/AbstractIoFilter.java
mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoFilter.java
mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java
mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
mina/mina/trunk/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
mina/mina/trunk/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java
mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
mina/mina/trunk/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java
mina/mina/trunk/core/src/main/java/org/apache/mina/session/SslHelper.java
mina/mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java
mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java
mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java
mina/mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpClientFilterEventTest.java
mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpServerFilterEventTest.java
mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/echoserver/NioEchoServer.java
mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/udpecho/NioUdpEchoServer.java
mina/mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java
mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java
mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/api/AbstractIoFilter.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/api/AbstractIoFilter.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/api/AbstractIoFilter.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/api/AbstractIoFilter.java Tue Jan 8 13:58:21 2013
@@ -20,6 +20,7 @@ package org.apache.mina.api;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
/**
* A convenient {@link IoFilter} implementation to be sub-classed for easier IoFilter implementation.
@@ -62,8 +63,7 @@ public abstract class AbstractIoFilter i
* {@inheritDoc}
*/
@Override
- public void messageWriting(final IoSession session, final Object message,
- final WriteFilterChainController controller) {
+ public void messageWriting(IoSession session, WriteRequest message, WriteFilterChainController controller) {
controller.callWriteNextFilter(message);
}
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoFilter.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoFilter.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoFilter.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoFilter.java Tue Jan 8 13:58:21 2013
@@ -22,6 +22,7 @@ package org.apache.mina.api;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
/**
* Filter are interceptors/processors for incoming data received/sent.
@@ -65,7 +66,7 @@ public interface IoFilter {
* @param session {@link IoSession} associated with the invocation
* @param message the message to process before writing
*/
- void messageWriting(IoSession session, Object message, WriteFilterChainController controller);
+ void messageWriting(IoSession session, WriteRequest message, WriteFilterChainController controller);
/**
* Invoked when a high level message was written to the low level O/S buffer.
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java Tue Jan 8 13:58:21 2013
@@ -347,6 +347,16 @@ public interface IoSession {
public void write(Object message);
/**
+ * Writes the message immediately. If we can't write all the message, we will get back the number of
+ * written bytes.
+ *
+ * @param message the message to write
+ * @return the number of written bytes
+ *
+ */
+ public int writeDirect(Object message);
+
+ /**
* Same as {@link IoSession#write(Object)}, but provide a {@link IoFuture} for tracking the completion of this
* write.
*
@@ -358,10 +368,10 @@ public interface IoSession {
/**
* Internal method for enqueue write request after filter chain processing
*
- * @param message the message to put in the write request
+ * @param writeRequest the message to put in the write request
* @return the created write request
*/
- public WriteRequest enqueueWriteRequest(Object message);
+ public WriteRequest enqueueWriteRequest(WriteRequest writeRequest);
/**
* Get the {@link Queue} of this session. The write queue contains the pending writes.
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Tue Jan 8 13:58:21 2013
@@ -27,6 +27,7 @@ import org.apache.mina.api.IoSession;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
import org.apache.mina.session.AttributeKey;
+import org.apache.mina.session.WriteRequest;
import org.apache.mina.util.Assert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -210,8 +211,7 @@ public class ProtocolCodecFilter extends
* {@inheritDoc}
*/
@Override
- public void messageWriting(final IoSession session, final Object message,
- final WriteFilterChainController controller) {
+ public void messageWriting(IoSession session, WriteRequest message, WriteFilterChainController controller) {
LOGGER.debug("Processing a MESSAGE_WRITTING for session {}", session);
final ProtocolEncoder encoder = session.getAttribute(ENCODER, null);
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java Tue Jan 8 13:58:21 2013
@@ -21,6 +21,7 @@ package org.apache.mina.filter.codec;
import org.apache.mina.api.IoSession;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
import org.apache.mina.util.IoBuffer;
/**
@@ -49,7 +50,7 @@ public interface ProtocolEncoder {
*
* @throws Exception if the message violated protocol specification
*/
- Object encode(IoSession session, Object message, WriteFilterChainController controller); // throws Exception;
+ Object encode(IoSession session, WriteRequest message, WriteFilterChainController controller); // throws Exception;
/**
* Releases all resources related with this encoder.
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/filter/logging/LoggingFilter.java Tue Jan 8 13:58:21 2013
@@ -26,6 +26,7 @@ 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.apache.mina.session.WriteRequest;
import org.apache.mina.util.ByteBufferDumper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -202,13 +203,9 @@ public class LoggingFilter implements Io
* {@inheritDoc}
*/
@Override
- public void messageWriting(final IoSession session, final Object message,
+ public void messageWriting(final IoSession session, final WriteRequest message,
final WriteFilterChainController controller) {
- if (message instanceof ByteBuffer) {
- log(messageReceivedLevel, "WRITTING: {}", ByteBufferDumper.dump((ByteBuffer) message));
- } else {
- log(messageReceivedLevel, "WRITTING: {}", message);
- }
+ log(messageReceivedLevel, "WRITTING: {}", message);
controller.callWriteNextFilter(message);
}
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/filterchain/WriteFilterChainController.java Tue Jan 8 13:58:21 2013
@@ -19,6 +19,7 @@
*/
package org.apache.mina.filterchain;
+import org.apache.mina.session.WriteRequest;
/**
* Chain controller used by a filter for calling the next filter in write order.
@@ -28,5 +29,5 @@ package org.apache.mina.filterchain;
*/
public interface WriteFilterChainController {
- void callWriteNextFilter(Object message);
+ void callWriteNextFilter(WriteRequest message);
}
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java Tue Jan 8 13:58:21 2013
@@ -137,9 +137,6 @@ public abstract class AbstractIoSession
/** the current position in the read chain for this thread */
private int readChainPosition;
- /** hold the last WriteRequest created for the high level message currently written (can be null) */
- private WriteRequest lastWriteRequest;
-
/**
* Create an {@link org.apache.mina.api.IoSession} with a unique identifier (
* {@link org.apache.mina.api.IoSession#getId()}) and an associated {@link IoService}
@@ -519,17 +516,25 @@ public abstract class AbstractIoSession
return;
}
+ WriteRequest writeRequest = new DefaultWriteRequest(message);
+
// process the queue
- processMessageWriting(message, future);
+ processMessageWriting(writeRequest, future);
}
/**
* {@inheritDoc}
*/
- @Override
- public WriteRequest enqueueWriteRequest(final Object message) {
- WriteRequest request = null;
+ public int writeDirect(Object message) {
+ // Default to 0 : this method should be overwritten if needed
+ return 0;
+ }
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public WriteRequest enqueueWriteRequest(WriteRequest writeRequest) {
if (isConnectedSecured()) {
// SSL/TLS : we have to encrypt the message
final SslHelper sslHelper = getAttribute(SSL_HELPER, null);
@@ -538,26 +543,55 @@ public abstract class AbstractIoSession
throw new IllegalStateException();
}
- request = sslHelper.processWrite(this, message, writeQueue);
- } else {
- // Plain message
- request = new DefaultWriteRequest(message);
+ writeRequest = sslHelper.processWrite(this, writeRequest, writeQueue);
}
synchronized (writeQueue) {
- writeQueue.add(request);
+ if (writeQueue.isEmpty()) {
+ ByteBuffer message = (ByteBuffer) writeRequest.getMessage();
- // If it wasn't, we register this session as interested to write.
- // It's done in atomic fashion for avoiding two concurrent registering.
- if (!registeredForWrite.getAndSet(true)) {
- flushWriteQueue();
+ // We don't have anything in the writeQueue, let's try to write the
+ // data in the channel immediately if we can
+ int written = writeDirect(writeRequest.getMessage());
+
+ LOG.debug("wrote {} bytes to {}", written, this);
+
+ if (written > 0) {
+ incrementWrittenBytes(written);
+ }
+
+ // Update the idle status for this session
+ idleChecker.sessionWritten(this, System.currentTimeMillis());
+
+ if ((written < 0) || message.remaining() > 0) {
+ // We have to push the request on the writeQueue
+ writeQueue.add(writeRequest);
+
+ // If it wasn't, we register this session as interested to write.
+ // It's done in atomic fashion for avoiding two concurrent registering.
+ if (!registeredForWrite.getAndSet(true)) {
+ flushWriteQueue();
+ }
+ } else {
+ // The message has been fully written : update the stats, and signal the handler
+ // generate the message sent event
+ // complete the future if we have one (we should...)
+ final DefaultWriteFuture future = (DefaultWriteFuture) writeRequest.getFuture();
+
+ if (future != null) {
+ future.complete();
+ }
+
+ final Object highLevel = ((DefaultWriteRequest) writeRequest).getOriginalMessage();
+
+ if (highLevel != null) {
+ processMessageSent(highLevel);
+ }
+ }
}
}
- // Always wake-up the selector here!
- // TODO : wake up the selector.
-
- return request;
+ return writeRequest;
}
public abstract void flushWriteQueue();
@@ -566,6 +600,10 @@ public abstract class AbstractIoSession
registeredForWrite.set(false);
}
+ protected boolean isRegisteredForWrite() {
+ return registeredForWrite.get();
+ }
+
/**
* {@inheritDoc}
*/
@@ -783,24 +821,27 @@ public abstract class AbstractIoSession
*
* @param message the wrote message, should be transformed into ByteBuffer at the end of the filter chain
*/
- public void processMessageWriting(final Object message, final IoFuture<Void> future) {
- LOG.debug("processing message '{}' writing event for session {}", message, this);
+ public void processMessageWriting(WriteRequest writeRequest, final IoFuture<Void> future) {
+ LOG.debug("processing message '{}' writing event for session {}", writeRequest, this);
try {
- lastWriteRequest = null;
+ //lastWriteRequest = null;
if (chain.length < 1) {
- enqueueFinalWriteMessage(message);
+ enqueueWriteRequest(writeRequest);
} else {
writeChainPosition = chain.length - 1;
// we call the first filter, it's supposed to call the next ones using the filter chain controller
final int position = writeChainPosition;
final IoFilter nextFilter = chain[position];
- nextFilter.messageWriting(this, message, this);
+ nextFilter.messageWriting(this, writeRequest, this);
}
// put the future in the last write request
-
+ if (future != null) {
+ writeRequest.setFuture(future);
+ }
+ /*
final WriteRequest request = lastWriteRequest;
if (request != null) {
if (future != null) {
@@ -808,6 +849,7 @@ public abstract class AbstractIoSession
}
((DefaultWriteRequest) request).setHighLevelMessage(message);
}
+ */
} catch (final RuntimeException e) {
processException(e);
}
@@ -845,14 +887,14 @@ public abstract class AbstractIoSession
* @param message the received message
*/
@Override
- public void callWriteNextFilter(final Object message) {
+ public void callWriteNextFilter(WriteRequest message) {
LOG.debug("calling next filter for writing for message '{}' position : {}", message, writeChainPosition);
writeChainPosition--;
if (writeChainPosition < 0 || chain.length == 0) {
// end of chain processing
- enqueueFinalWriteMessage(message);
+ enqueueWriteRequest(message);
} else {
chain[writeChainPosition].messageWriting(this, message, this);
}
@@ -861,14 +903,6 @@ public abstract class AbstractIoSession
}
/**
- * At the end of write chain processing, enqueue final encoded {@link ByteBuffer} message in the session
- */
- private void enqueueFinalWriteMessage(final Object message) {
- LOG.debug("end of write chain we enqueue the message in the session : {}", message);
- lastWriteRequest = enqueueWriteRequest(message);
- }
-
- /**
* {@inheritDoc}
*/
@Override
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java Tue Jan 8 13:58:21 2013
@@ -31,21 +31,23 @@ import org.apache.mina.util.ByteBufferDu
*/
public class DefaultWriteRequest implements WriteRequest {
/** The stored message */
- private final Object message;
+ private Object message;
- /** The high level message (before being processed by the filter chain */
- private Object highLevelMessage;
+ /** The original message (before being processed by the filter chain */
+ private Object originalMessage;
/** the future to complete when this message is written */
private IoFuture<Void> future;
/**
- * Creates a new instance of a WriteRequest
+ * Creates a new instance of a WriteRequest, storing the message as it was
+ * when the IoSession.write() has been called.
*
- * @param message The stored message
+ * @param message The original message
*/
- public DefaultWriteRequest(final Object message) {
- this.message = message;
+ public DefaultWriteRequest(Object originalMessage) {
+ this.message = originalMessage;
+ this.originalMessage = originalMessage;
}
/**
@@ -60,25 +62,32 @@ public class DefaultWriteRequest impleme
* {@inheritDoc}
*/
@Override
+ public void setMessage(Object message) {
+ this.message = message;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public IoFuture<Void> getFuture() {
return future;
}
/**
- * Associates a Future to this WriteRequest instance
- *
- * @param future The associated Future
+ * {@inheritDoc}
*/
+ @Override
public void setFuture(final IoFuture<Void> future) {
this.future = future;
}
- public Object getHighLevelMessage() {
- return highLevelMessage;
- }
-
- public void setHighLevelMessage(final Object highLevelMessage) {
- this.highLevelMessage = highLevelMessage;
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Object getOriginalMessage() {
+ return originalMessage;
}
/**
@@ -91,12 +100,42 @@ public class DefaultWriteRequest impleme
sb.append("WriteRequest[");
if (future != null) {
- sb.append("Future,");
+ sb.append("Future : ");
+ sb.append(future);
+ sb.append(",");
+ } else {
+ sb.append("No future, ");
+ }
+
+ if (originalMessage != null) {
+ // Dump the original message
+ sb.append("Original message : '");
+
+ if (originalMessage instanceof ByteBuffer) {
+ sb.append(ByteBufferDumper.dump((ByteBuffer) originalMessage));
+ } else {
+ sb.append(originalMessage);
+ }
+
+ sb.append("', ");
+ } else {
+ sb.append("No Orginal message,");
}
if (message != null) {
+ // Dump the encoded message
// Just dump the first 16 bytes
- sb.append(ByteBufferDumper.dump((ByteBuffer) message, 16, false));
+ sb.append("Encoded message : '");
+
+ if (message instanceof ByteBuffer) {
+ sb.append(ByteBufferDumper.dump((ByteBuffer) message, 16, false));
+ } else {
+ sb.append(message);
+ }
+
+ sb.append("'");
+ } else {
+ sb.append("No encoded message,");
}
sb.append("]");
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/session/SslHelper.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/session/SslHelper.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/session/SslHelper.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/session/SslHelper.java Tue Jan 8 13:58:21 2013
@@ -324,7 +324,8 @@ public class SslHelper {
outBuffer.flip();
// Get out of the Connected state
- session.enqueueWriteRequest(outBuffer);
+ WriteRequest writeRequest = new DefaultWriteRequest(outBuffer);
+ session.enqueueWriteRequest(writeRequest);
}
}
}
@@ -383,7 +384,9 @@ public class SslHelper {
// Done. We can now push this buffer into the write queue.
outBuffer.flip();
- session.enqueueWriteRequest(outBuffer);
+ WriteRequest writeRequest = new DefaultWriteRequest(inBuffer);
+ writeRequest.setMessage(outBuffer);
+ session.enqueueWriteRequest(writeRequest);
hsStatus = result.getHandshakeStatus();
// Nothing more to wrap : get out.
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java Tue Jan 8 13:58:21 2013
@@ -22,8 +22,17 @@ package org.apache.mina.session;
import org.apache.mina.api.IoFuture;
/**
- * The write request created by the {@link org.apache.mina.api.IoSession#write} method, travel around the filter chain and finish as a
- * socket write.
+ * The write request created by the {@link org.apache.mina.api.IoSession#write} method,
+ * which is transmitted through the filter chain and finish as a socket write.<br/>
+ *
+ * We store the original message into this data structure, along the associated potentially
+ * modified message if the original message gets encoded during the process.<br/>
+ *
+ * Note that when we always ends with the message being a ByteBuffer when we reach
+ * the socket.<br/>
+ *
+ * We also keep a Future into this data structure to inform the caller about the write
+ * completion.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
@@ -36,8 +45,28 @@ public interface WriteRequest {
Object getMessage();
/**
+ * Store the encoded message
+ *
+ * @param The encoded message
+ */
+ void setMessage(Object message);
+
+ /**
+ * Gets the original message, as written by the handler, before passing through the filter chain.
+ *
+ * @return The original message
+ */
+ Object getOriginalMessage();
+
+ /**
* The future to be completed on a write success
* @return the future
*/
IoFuture<Void> getFuture();
+
+ /**
+ * Store the future into the request
+ * @param the future
+ */
+ void setFuture(IoFuture<Void> future);
}
\ No newline at end of file
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java Tue Jan 8 13:58:21 2013
@@ -140,6 +140,24 @@ public class NioTcpSession extends Abstr
throw new RuntimeException("Not implemented");
}
+ @Override
+ public int writeDirect(Object message) {
+ try {
+ // Check that we can write into the channel
+ if (!isRegisteredForWrite()) {
+ // We don't have pending writes
+ return channel.write((ByteBuffer) message);
+ } else {
+ return -1;
+ }
+ } catch (final IOException e) {
+ LOG.error("Exception while reading : ", e);
+ processException(e);
+
+ return -1;
+ }
+ }
+
/**
* {@inheritDoc}
*/
@@ -331,7 +349,7 @@ public class NioTcpSession extends Abstr
}
// generate the message sent event
- final Object highLevel = ((DefaultWriteRequest) writeRequest).getHighLevelMessage();
+ final Object highLevel = ((DefaultWriteRequest) writeRequest).getOriginalMessage();
if (highLevel != null) {
processMessageSent(highLevel);
@@ -370,7 +388,7 @@ public class NioTcpSession extends Abstr
}
}
} catch (final IOException e) {
- LOG.error("Exception while reading : ", e);
+ LOG.error("Exception while writing : ", e);
processException(e);
}
}
Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java Tue Jan 8 13:58:21 2013
@@ -199,4 +199,10 @@ public class NioUdpSession extends Abstr
processMessageReceived(readBuffer);
idleChecker.sessionRead(this, System.currentTimeMillis());
}
+
+ @Override
+ public int writeDirect(Object message) {
+ // TODO
+ return 0;
+ }
}
Modified: mina/mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java (original)
+++ mina/mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java Tue Jan 8 13:58:21 2013
@@ -206,7 +206,7 @@ public class AbstractIoSessionTest {
@Test
public void chain_writes() {
final DummySession session = new DummySession(service);
- final ByteBuffer buffer = mock(ByteBuffer.class);
+ final WriteRequest buffer = mock(DefaultWriteRequest.class);
session.processMessageWriting(buffer, null);
verify(filter1).messageWriting(eq(session), eq(buffer), any(WriteFilterChainController.class));
verify(filter2).messageWriting(eq(session), eq(buffer), any(WriteFilterChainController.class));
Modified: mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpClientFilterEventTest.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpClientFilterEventTest.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpClientFilterEventTest.java (original)
+++ mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpClientFilterEventTest.java Tue Jan 8 13:58:21 2013
@@ -19,7 +19,10 @@
*/
package org.apache.mina.transport.tcp;
-import static junit.framework.Assert.*;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
import java.io.IOException;
import java.net.InetSocketAddress;
@@ -37,6 +40,7 @@ import org.apache.mina.api.IoFuture;
import org.apache.mina.api.IoSession;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
import org.apache.mina.transport.nio.NioTcpClient;
import org.apache.mina.transport.nio.NioTcpServer;
import org.junit.Test;
@@ -156,9 +160,9 @@ public class NioTcpClientFilterEventTest
}
@Override
- public void messageWriting(final IoSession session, final Object message,
- final WriteFilterChainController controller) {
- controller.callWriteNextFilter(ByteBuffer.wrap(message.toString().getBytes()));
+ public void messageWriting(IoSession session, WriteRequest writeRequest, WriteFilterChainController controller) {
+ writeRequest.setMessage(ByteBuffer.wrap(writeRequest.getMessage().toString().getBytes()));
+ controller.callWriteNextFilter(writeRequest);
}
}
Modified: mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpServerFilterEventTest.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpServerFilterEventTest.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpServerFilterEventTest.java (original)
+++ mina/mina/trunk/core/src/test/java/org/apache/mina/transport/tcp/NioTcpServerFilterEventTest.java Tue Jan 8 13:58:21 2013
@@ -33,6 +33,7 @@ import org.apache.mina.api.AbstractIoFil
import org.apache.mina.api.IoSession;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
import org.apache.mina.transport.nio.FixedSelectorLoopPool;
import org.apache.mina.transport.nio.NioTcpServer;
import org.apache.mina.transport.nio.SelectorLoopPool;
@@ -206,9 +207,9 @@ public class NioTcpServerFilterEventTest
}
@Override
- public void messageWriting(final IoSession session, final Object message,
- final WriteFilterChainController controller) {
- controller.callWriteNextFilter(ByteBuffer.wrap(message.toString().getBytes()));
+ public void messageWriting(IoSession session, WriteRequest writeRequest, WriteFilterChainController controller) {
+ writeRequest.setMessage(ByteBuffer.wrap(writeRequest.getMessage().toString().getBytes()));
+ controller.callWriteNextFilter(writeRequest);
}
}
Modified: mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/echoserver/NioEchoServer.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/echoserver/NioEchoServer.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/echoserver/NioEchoServer.java (original)
+++ mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/echoserver/NioEchoServer.java Tue Jan 8 13:58:21 2013
@@ -20,6 +20,7 @@
package org.apache.mina.examples.echoserver;
+
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
@@ -32,90 +33,115 @@ import org.apache.mina.api.IoSession;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
import org.apache.mina.transport.nio.NioTcpServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
/**
* A basic Server test
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*
*/
-public class NioEchoServer {
+public class NioEchoServer
+{
+
+ static final private Logger LOG = LoggerFactory.getLogger( NioEchoServer.class );
- static final private Logger LOG = LoggerFactory.getLogger(NioEchoServer.class);
- public static void main(final String[] args) {
- LOG.info("starting echo server");
+ public static void main( final String[] args )
+ {
+ LOG.info( "starting echo server" );
final NioTcpServer acceptor = new NioTcpServer();
// create the fitler chain for this service
- acceptor.setFilters(new LoggingFilter("LoggingFilter1"), new IoFilter() {
+ acceptor.setFilters( new LoggingFilter( "LoggingFilter1" ), new IoFilter()
+ {
@Override
- public void sessionOpened(final IoSession session) {
- LOG.info("session {} open", session);
+ public void sessionOpened( final IoSession session )
+ {
+ LOG.info( "session {} open", session );
}
+
@Override
- public void sessionIdle(final IoSession session, final IdleStatus status) {
- LOG.info("session {} idle", session);
+ public void sessionIdle( final IoSession session, final IdleStatus status )
+ {
+ LOG.info( "session {} idle", session );
}
+
@Override
- public void sessionClosed(final IoSession session) {
- LOG.info("session {} open", session);
+ public void sessionClosed( final IoSession session )
+ {
+ LOG.info( "session {} open", session );
}
+
@Override
- public void messageWriting(final IoSession session, final Object message,
- final WriteFilterChainController controller) {
+ public void messageWriting( final IoSession session, WriteRequest message,
+ final WriteFilterChainController controller )
+ {
// we just push the message in the chain
- controller.callWriteNextFilter(message);
+ controller.callWriteNextFilter( message );
}
+
@Override
- public void messageReceived(final IoSession session, final Object message,
- final ReadFilterChainController controller) {
+ public void messageReceived( final IoSession session, final Object message,
+ final ReadFilterChainController controller )
+ {
- if (message instanceof ByteBuffer) {
- LOG.info("echoing");
- session.write(message);
+ if ( message instanceof ByteBuffer )
+ {
+ LOG.info( "echoing" );
+ session.write( message );
}
}
- @Override
- public void messageSent(final IoSession session, final Object message) {
- LOG.info("message {} sent", message);
- }
- });
- acceptor.setIoHandler(new AbstractIoHandler() {
@Override
- public void sessionOpened(final IoSession session) {
- LOG.info("session opened {}", session);
+ public void messageSent( final IoSession session, final Object message )
+ {
+ LOG.info( "message {} sent", message );
+ }
+ } );
+
+ acceptor.setIoHandler( new AbstractIoHandler()
+ {
+ @Override
+ public void sessionOpened( final IoSession session )
+ {
+ LOG.info( "session opened {}", session );
final String welcomeStr = "welcome\n";
- final ByteBuffer bf = ByteBuffer.allocate(welcomeStr.length());
- bf.put(welcomeStr.getBytes());
+ final ByteBuffer bf = ByteBuffer.allocate( welcomeStr.length() );
+ bf.put( welcomeStr.getBytes() );
bf.flip();
- session.write(bf);
+ session.write( bf );
}
- });
- try {
- final SocketAddress address = new InetSocketAddress(9999);
- acceptor.bind(address);
- LOG.debug("Running the server for 25 sec");
- Thread.sleep(25000);
- LOG.debug("Unbinding the TCP port");
+ } );
+ try
+ {
+ final SocketAddress address = new InetSocketAddress( 9999 );
+ acceptor.bind( address );
+ LOG.debug( "Running the server for 25 sec" );
+ Thread.sleep( 25000 );
+ LOG.debug( "Unbinding the TCP port" );
acceptor.unbind();
- } catch (final IOException e) {
- LOG.error("I/O exception", e);
- } catch (final InterruptedException e) {
- LOG.error("Interrupted exception", e);
+ }
+ catch ( final IOException e )
+ {
+ LOG.error( "I/O exception", e );
+ }
+ catch ( final InterruptedException e )
+ {
+ LOG.error( "Interrupted exception", e );
}
}
}
\ No newline at end of file
Modified: mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/udpecho/NioUdpEchoServer.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/udpecho/NioUdpEchoServer.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/udpecho/NioUdpEchoServer.java (original)
+++ mina/mina/trunk/examples/src/main/java/org/apache/mina/examples/udpecho/NioUdpEchoServer.java Tue Jan 8 13:58:21 2013
@@ -19,6 +19,7 @@
*/
package org.apache.mina.examples.udpecho;
+
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
@@ -31,90 +32,115 @@ import org.apache.mina.api.IoSession;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
import org.apache.mina.transport.nio.NioSelectorLoop;
import org.apache.mina.transport.nio.NioUdpServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
/**
* A UDP base echo server sending back every datagram received
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
-public class NioUdpEchoServer {
- static final Logger LOG = LoggerFactory.getLogger(NioUdpEchoServer.class);
+public class NioUdpEchoServer
+{
+ static final Logger LOG = LoggerFactory.getLogger( NioUdpEchoServer.class );
+
- public static void main(final String[] args) {
- LOG.info("starting echo server");
+ public static void main( final String[] args )
+ {
+ LOG.info( "starting echo server" );
- final NioUdpServer server = new NioUdpServer(new NioSelectorLoop("I/O", 0), null);
+ final NioUdpServer server = new NioUdpServer( new NioSelectorLoop( "I/O", 0 ), null );
// create the fitler chain for this service
- server.setFilters(new LoggingFilter("LoggingFilter1"), new IoFilter() {
+ server.setFilters( new LoggingFilter( "LoggingFilter1" ), new IoFilter()
+ {
@Override
- public void sessionOpened(final IoSession session) {
- LOG.info("session {} open", session);
+ public void sessionOpened( final IoSession session )
+ {
+ LOG.info( "session {} open", session );
}
+
@Override
- public void sessionIdle(final IoSession session, final IdleStatus status) {
- LOG.info("session {} idle", session);
+ public void sessionIdle( final IoSession session, final IdleStatus status )
+ {
+ LOG.info( "session {} idle", session );
}
+
@Override
- public void sessionClosed(final IoSession session) {
- LOG.info("session {} open", session);
+ public void sessionClosed( final IoSession session )
+ {
+ LOG.info( "session {} open", session );
}
+
@Override
- public void messageWriting(final IoSession session, final Object message,
- final WriteFilterChainController controller) {
+ public void messageWriting( final IoSession session, WriteRequest message,
+ final WriteFilterChainController controller )
+ {
// we just push the message in the chain
- controller.callWriteNextFilter(message);
+ controller.callWriteNextFilter( message );
}
+
@Override
- public void messageReceived(final IoSession session, final Object message,
- final ReadFilterChainController controller) {
+ public void messageReceived( final IoSession session, final Object message,
+ final ReadFilterChainController controller )
+ {
- if (message instanceof ByteBuffer) {
- LOG.info("echoing");
- session.write(message);
+ if ( message instanceof ByteBuffer )
+ {
+ LOG.info( "echoing" );
+ session.write( message );
}
}
- @Override
- public void messageSent(final IoSession session, final Object message) {
- LOG.info("message {} sent", message);
- }
- });
- server.setIoHandler(new AbstractIoHandler() {
@Override
- public void sessionOpened(final IoSession session) {
- LOG.info("session opened {}", session);
+ public void messageSent( final IoSession session, final Object message )
+ {
+ LOG.info( "message {} sent", message );
+ }
+ } );
+
+ server.setIoHandler( new AbstractIoHandler()
+ {
+ @Override
+ public void sessionOpened( final IoSession session )
+ {
+ LOG.info( "session opened {}", session );
final String welcomeStr = "welcome\n";
- final ByteBuffer bf = ByteBuffer.allocate(welcomeStr.length());
- bf.put(welcomeStr.getBytes());
+ final ByteBuffer bf = ByteBuffer.allocate( welcomeStr.length() );
+ bf.put( welcomeStr.getBytes() );
bf.flip();
- session.write(bf);
+ session.write( bf );
}
- });
+ } );
- try {
- final SocketAddress address = new InetSocketAddress(9999);
- server.bind(address);
- LOG.debug("Running the server for 25 sec");
- Thread.sleep(25000);
- LOG.debug("Unbinding the UDP port");
+ try
+ {
+ final SocketAddress address = new InetSocketAddress( 9999 );
+ server.bind( address );
+ LOG.debug( "Running the server for 25 sec" );
+ Thread.sleep( 25000 );
+ LOG.debug( "Unbinding the UDP port" );
server.unbind();
- } catch (final IOException e) {
- LOG.error("I/O exception", e);
- } catch (final InterruptedException e) {
- LOG.error("Interrupted exception", e);
+ }
+ catch ( final IOException e )
+ {
+ LOG.error( "I/O exception", e );
+ }
+ catch ( final InterruptedException e )
+ {
+ LOG.error( "Interrupted exception", e );
}
}
}
Modified: mina/mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java (original)
+++ mina/mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java Tue Jan 8 13:58:21 2013
@@ -19,6 +19,7 @@
*/
package org.apache.mina.http;
+
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Map;
@@ -28,26 +29,37 @@ import org.apache.mina.filter.codec.Prot
import org.apache.mina.filterchain.WriteFilterChainController;
import org.apache.mina.http.api.HttpEndOfContent;
import org.apache.mina.http.api.HttpResponse;
+import org.apache.mina.session.WriteRequest;
+
-public class HttpServerEncoder implements ProtocolEncoder {
+public class HttpServerEncoder implements ProtocolEncoder
+{
- public Object encode(IoSession session, Object message, WriteFilterChainController controller) {
- if (message instanceof HttpResponse) {
- HttpResponse msg = (HttpResponse) message;
- StringBuilder sb = new StringBuilder(msg.getStatus().line());
-
- for (Map.Entry<String, String> header : msg.getHeaders().entrySet()) {
- sb.append(header.getKey());
- sb.append(": ");
- sb.append(header.getValue());
- sb.append("\r\n");
+ public Object encode( IoSession session, WriteRequest message, WriteFilterChainController controller )
+ {
+ if ( message.getOriginalMessage() instanceof HttpResponse )
+ {
+ HttpResponse msg = ( HttpResponse ) message;
+ StringBuilder sb = new StringBuilder( msg.getStatus().line() );
+
+ for ( Map.Entry<String, String> header : msg.getHeaders().entrySet() )
+ {
+ sb.append( header.getKey() );
+ sb.append( ": " );
+ sb.append( header.getValue() );
+ sb.append( "\r\n" );
}
- sb.append("\r\n");
- byte[] bytes = sb.toString().getBytes(Charset.forName("UTF-8"));
- controller.callWriteNextFilter(ByteBuffer.wrap(bytes));
- } else if (message instanceof ByteBuffer) {
- controller.callWriteNextFilter(message);
- } else if (message instanceof HttpEndOfContent) {
+ sb.append( "\r\n" );
+ byte[] bytes = sb.toString().getBytes( Charset.forName( "UTF-8" ) );
+ message.setMessage( ByteBuffer.wrap( bytes ) );
+ controller.callWriteNextFilter( message );
+ }
+ else if ( message.getOriginalMessage() instanceof ByteBuffer )
+ {
+ controller.callWriteNextFilter( message );
+ }
+ else if ( message.getOriginalMessage() instanceof HttpEndOfContent )
+ {
// end of HTTP content
// keep alive ?
return null;
@@ -56,8 +68,10 @@ public class HttpServerEncoder implement
return null;
}
+
@Override
- public void dispose(IoSession session) throws Exception {
+ public void dispose( IoSession session ) throws Exception
+ {
// TODO Auto-generated method stub
}
}
Modified: mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java (original)
+++ mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java Tue Jan 8 13:58:21 2013
@@ -46,6 +46,7 @@ import org.apache.mina.filter.codec.Prot
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filterchain.WriteFilterChainController;
import org.apache.mina.session.AttributeKey;
+import org.apache.mina.session.WriteRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -92,32 +93,33 @@ public class LdapCodec extends ProtocolC
}
@Override
- public void messageWriting(final IoSession session, final Object message,
- final WriteFilterChainController controller) {
+ public void messageWriting(IoSession session, WriteRequest writeRequest, WriteFilterChainController controller) {
+ Object message = writeRequest.getOriginalMessage();
+
if (message instanceof AddResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof BindResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof DeleteResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof CompareResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof ExtendedResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof IntermediateResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof ModifyResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof ModifyDnResponse) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof SearchResultDone) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof SearchResultEntry) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof SearchResultReference) {
- ldapEncoder.encode(session, message, controller);
+ ldapEncoder.encode(session, writeRequest, controller);
} else if (message instanceof ByteBuffer) {
- controller.callWriteNextFilter(message);
+ controller.callWriteNextFilter(writeRequest);
}
}
}
\ No newline at end of file
Modified: mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java?rev=1430287&r1=1430286&r2=1430287&view=diff
==============================================================================
--- mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java (original)
+++ mina/mina/trunk/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java Tue Jan 8 13:58:21 2013
@@ -27,6 +27,7 @@ import org.apache.directory.shared.ldap.
import org.apache.mina.api.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.session.WriteRequest;
/**
* A LDAP message encoder. It is based on shared-ldap encoder.
@@ -49,11 +50,12 @@ public class LdapProtocolEncoder impleme
/**
* {@inheritDoc}
*/
- public Object encode(IoSession session, Object message, WriteFilterChainController controller) {
+ public Object encode(IoSession session, WriteRequest writeRequest, WriteFilterChainController controller) {
try {
- ByteBuffer buffer = encoder.encodeMessage((Message) message);
+ ByteBuffer buffer = encoder.encodeMessage((Message) writeRequest.getOriginalMessage());
+ writeRequest.setMessage(buffer);
- controller.callWriteNextFilter(buffer);
+ controller.callWriteNextFilter(writeRequest);
} catch (Exception e) {
return null;
}