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;
         }