You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/06/12 13:25:25 UTC

svn commit: r190245 - in /directory/network/branches/dirmina-39: ./ src/examples/org/apache/mina/examples/tennis/ src/java/org/apache/mina/common/ src/java/org/apache/mina/filter/ src/java/org/apache/mina/filter/codec/ src/java/org/apache/mina/transport/socket/nio/ src/java/org/apache/mina/transport/vmpipe/ src/test/org/apache/mina/common/ src/test/org/apache/mina/examples/echoserver/ src/test/org/apache/mina/filter/codec/

Author: trustin
Date: Sun Jun 12 04:25:23 2005
New Revision: 190245

URL: http://svn.apache.org/viewcvs?rev=190245&view=rev
Log:
Resolved DIRMINA-39

Added:
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/CloseFuture.java   (with props)
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ConnectFuture.java   (with props)
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFuture.java   (with props)
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/WriteFuture.java   (with props)
Modified:
    directory/network/branches/dirmina-39/project.xml
    directory/network/branches/dirmina-39/src/examples/org/apache/mina/examples/tennis/Main.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/AbstractIoFilterChain.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ByteBuffer.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoConnector.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilter.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilterAdapter.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSession.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionFilterChain.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionManagerFilterChain.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/LoggingFilter.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLFilter.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLHandler.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/ThreadPoolFilter.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/SimpleProtocolEncoderOutput.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSession.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSessionManagerFilterChain.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketConnector.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSession.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSessionManagerFilterChain.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSession.java
    directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSessionManagerFilterChain.java
    directory/network/branches/dirmina-39/src/test/org/apache/mina/common/IoFilterChainTest.java
    directory/network/branches/dirmina-39/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java
    directory/network/branches/dirmina-39/src/test/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java

Modified: directory/network/branches/dirmina-39/project.xml
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/project.xml?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/project.xml (original)
+++ directory/network/branches/dirmina-39/project.xml Sun Jun 12 04:25:23 2005
@@ -71,13 +71,6 @@
 
   <dependencies>
 
-    <dependency>
-      <groupId>concurrent</groupId>
-      <artifactId>concurrent</artifactId>
-      <version>1.3.4</version>
-      <url>http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html</url>
-    </dependency>
-
     <!-- ========================================================= -->
     <!-- Dependencies required for running test cases and examples -->
     <!-- ========================================================= -->

Modified: directory/network/branches/dirmina-39/src/examples/org/apache/mina/examples/tennis/Main.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/examples/org/apache/mina/examples/tennis/Main.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/examples/org/apache/mina/examples/tennis/Main.java (original)
+++ directory/network/branches/dirmina-39/src/examples/org/apache/mina/examples/tennis/Main.java Sun Jun 12 04:25:23 2005
@@ -3,6 +3,7 @@
  */
 package org.apache.mina.examples.tennis;
 
+import org.apache.mina.common.ConnectFuture;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.TransportType;
 import org.apache.mina.registry.Service;
@@ -40,8 +41,10 @@
 
         // Connect to the server.
         VmPipeConnector connector = new VmPipeConnector();
-        IoSession session = connector.connect( address,
-                                                     new TennisPlayer() );
+        ConnectFuture future = connector.connect( address,
+                                                  new TennisPlayer() );
+        future.join();
+        IoSession session = future.getSession();
 
         // Send the first ping message
         session.write( new TennisBall( 10 ) );

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/AbstractIoFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/AbstractIoFilterChain.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/AbstractIoFilterChain.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/AbstractIoFilterChain.java Sun Jun 12 04:25:23 2005
@@ -26,10 +26,9 @@
 import java.util.Map;
 
 import org.apache.mina.common.IoFilter.NextFilter;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.ByteBufferUtil;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * An abstract implementation of {@link IoFilterChain} that provides
  * common operations for developers to extend protocol layer.
@@ -42,9 +41,9 @@
  * </ul>
  * 
  * The only method a developer should implement is
- * {@link #doWrite(IoSession, Object, FutureResult)}.  This method is invoked
+ * {@link #doWrite(IoSession, WriteRequest)}.  This method is invoked
  * when filter chain is evaluated for
- * {@link IoFilter#filterWrite(NextFilter, IoSession, Object, FutureResult)} and 
+ * {@link IoFilter#filterWrite(NextFilter, IoSession, WriteRequest)} and 
  * finally to be written out.
  * 
  * @author The Apache Directory Project
@@ -109,23 +108,18 @@
             }
             
             public void filterWrite( NextFilter nextFilter, IoSession session,
-                                     Object message, FutureResult future )
+                                     WriteRequest writeRequest )
             {
-                if( message == null )
-                {
-                    throw new NullPointerException( "Filtered message is null" );
-                }
-
-                if( session.getTransportType().getEnvelopeType().isAssignableFrom( message.getClass() ) )
+                if( session.getTransportType().getEnvelopeType().isAssignableFrom( writeRequest.getMessage().getClass() ) )
                 {
-                    doWrite( session, message, future );
+                    doWrite( session, writeRequest );
                 }
                 else
                 {
                     throw new IllegalStateException(
                             "Write requests must be transformed to " + 
                             session.getTransportType().getEnvelopeType() +
-                            ": " + message );
+                            ": " + writeRequest );
                 }
             }
         };
@@ -187,10 +181,9 @@
             }
 
             public void filterWrite( NextFilter nextFilter,
-                                     IoSession session, Object message,
-                                     FutureResult future ) throws Exception
+                                     IoSession session, WriteRequest writeRequest ) throws Exception
             {
-                nextFilter.filterWrite( session, message, future );
+                nextFilter.filterWrite( session, writeRequest );
             }
         };
     }
@@ -440,24 +433,19 @@
         }
     }
     
-    public void filterWrite( IoSession session, Object message, FutureResult future )
+    public void filterWrite( IoSession session, WriteRequest writeRequest )
     {
         Entry tail = this.tail;
-        callPreviousFilterWrite( tail, session, message, future );
+        callPreviousFilterWrite( tail, session, writeRequest );
     }
 
     private void callPreviousFilterWrite( Entry entry,
                                           IoSession session,
-                                          Object message, FutureResult future )
+                                          WriteRequest writeRequest )
     {
-        if( message == null )
-        {
-            return;
-        }
-        
         try
         {
-            entry.filter.filterWrite( entry.nextFilter, session, message, future );
+            entry.filter.filterWrite( entry.nextFilter, session, writeRequest );
         }
         catch( Throwable e )
         {
@@ -490,7 +478,7 @@
         return list;
     }
     
-    protected abstract void doWrite( IoSession session, Object message, FutureResult future );
+    protected abstract void doWrite( IoSession session, WriteRequest writeRequest );
 
     private class Entry
     {
@@ -560,10 +548,10 @@
                     callNextMessageSent( nextEntry, session, message );
                 }
                 
-                public void filterWrite( IoSession session, Object message, FutureResult future )
+                public void filterWrite( IoSession session, WriteRequest writeRequest )
                 {
                     Entry nextEntry = Entry.this.prevEntry;
-                    callPreviousFilterWrite( nextEntry, session, message, future );
+                    callPreviousFilterWrite( nextEntry, session, writeRequest );
                 }
             };
         }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ByteBuffer.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ByteBuffer.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ByteBuffer.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ByteBuffer.java Sun Jun 12 04:25:23 2005
@@ -33,11 +33,10 @@
 import java.nio.charset.CoderResult;
 
 import org.apache.mina.common.IoFilter.NextFilter;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.filter.codec.ProtocolEncoderOutput;
 import org.apache.mina.util.Stack;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * A pooled byte buffer used by MINA applications.
  * <p>
@@ -76,7 +75,7 @@
  * because MINA will release it automatically when:
  * <ul>
  *   <li>You pass the buffer by calling {@link IoSession#write(Object)}.</li>
- *   <li>You pass the buffer by calling {@link NextFilter#filterWrite(IoSession,Object,FutureResult)}.</li>
+ *   <li>You pass the buffer by calling {@link NextFilter#filterWrite(IoSession,WriteRequest)}.</li>
  *   <li>You pass the buffer by calling {@link ProtocolEncoderOutput#write(ByteBuffer)}.</li>
  * </ul>
  * And, you don't need to release any {@link ByteBuffer} which is passed as a parameter

Added: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/CloseFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/CloseFuture.java?rev=190245&view=auto
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/CloseFuture.java (added)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/CloseFuture.java Sun Jun 12 04:25:23 2005
@@ -0,0 +1,21 @@
+package org.apache.mina.common;
+
+public class CloseFuture extends IoFuture
+{
+    public boolean isClosed()
+    {
+        if( isReady() )
+        {
+            return ( ( Boolean ) getValue() ).booleanValue();
+        }
+        else
+        {
+            return false;
+        }
+    }
+    
+    public void setClosed( boolean closed )
+    {
+        setValue( closed? Boolean.TRUE : Boolean.FALSE );
+    }
+}

Propchange: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/CloseFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ConnectFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ConnectFuture.java?rev=190245&view=auto
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ConnectFuture.java (added)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ConnectFuture.java Sun Jun 12 04:25:23 2005
@@ -0,0 +1,32 @@
+package org.apache.mina.common;
+
+import java.io.IOException;
+
+import org.apache.mina.util.ExceptionUtil;
+
+public class ConnectFuture extends IoFuture
+{
+    public IoSession getSession() throws IOException
+    {
+        Object v = getValue();
+        if( v instanceof Throwable )
+        {
+            ExceptionUtil.throwException( ( Throwable ) v );
+            throw new InternalError(); // this cannot be executed
+        }
+        else
+        {
+            return ( IoSession ) v;
+        }
+    }
+    
+    public void setSession( IoSession session )
+    {
+        setValue( session );
+    }
+    
+    public void setException( Throwable exception )
+    {
+        setValue( exception );
+    }
+}

Propchange: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/ConnectFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoConnector.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoConnector.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoConnector.java Sun Jun 12 04:25:23 2005
@@ -45,23 +45,23 @@
     /**
      * Connects to the specified <code>address</code>.  If communication starts
      * successfully, events are fired to the specified
-     * <code>handler</code>.  This method blocks.
+     * <code>handler</code>.
      * 
      * @throws IOException if failed to connect
      */
-    IoSession connect( SocketAddress address, IoHandler handler )
+    ConnectFuture connect( SocketAddress address, IoHandler handler )
             throws IOException;
 
     /**
      * Connects to the specified <code>address</code>.  If communication starts
      * successfully, events are fired to the specified
-     * <code>handler</code>.  This method blocks.
+     * <code>handler</code>.
      * 
      * @param localAddress the local address the channel is bound to
      * @throws IOException if failed to connect
      */
-    IoSession connect( SocketAddress address, SocketAddress localAddress,
-                       IoHandler handler ) throws IOException;
+    ConnectFuture connect( SocketAddress address, SocketAddress localAddress,
+                           IoHandler handler ) throws IOException;
 
     /**
      * Connects to the specified <code>address</code> with timeout.  If
@@ -70,7 +70,7 @@
      * 
      * @throws IOException if failed to connect
      */
-    IoSession connect( SocketAddress address, int timeout, IoHandler handler )
+    ConnectFuture connect( SocketAddress address, int timeout, IoHandler handler )
             throws IOException;
     
     /**
@@ -81,6 +81,6 @@
      * @param localAddress the local address the channel is bound to
      * @throws IOException if failed to connect
      */
-    IoSession connect( SocketAddress address, SocketAddress localAddress,
-                       int timeout, IoHandler handler ) throws IOException;
+    ConnectFuture connect( SocketAddress address, SocketAddress localAddress,
+                           int timeout, IoHandler handler ) throws IOException;
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilter.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilter.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilter.java Sun Jun 12 04:25:23 2005
@@ -18,7 +18,6 @@
  */
 package org.apache.mina.common;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
 
 
 /**
@@ -85,7 +84,7 @@
     /**
      * Filters {@link IoSession#write(Object)} method invocation.
      */
-    void filterWrite( NextFilter nextFilter, IoSession session, Object message, FutureResult future ) throws Exception;
+    void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest ) throws Exception;
     
     public interface NextFilter
     {
@@ -95,6 +94,53 @@
         void exceptionCaught( IoSession session, Throwable cause );
         void messageReceived( IoSession session, Object message );
         void messageSent( IoSession session, Object message );
-        void filterWrite( IoSession session, Object message, FutureResult future );
+        void filterWrite( IoSession session, WriteRequest writeRequest );
+    }
+    
+    /**
+     * TODO doeument me
+     */
+    public static class WriteRequest
+    {
+        private static final WriteFuture UNUSED_FUTURE = new WriteFuture();
+        
+        private final Object message;
+        private final WriteFuture future;
+        
+        public WriteRequest( Object message )
+        {
+            this( message, null );
+        }
+
+        public WriteRequest( Object message, WriteFuture future )
+        {
+            if( message == null )
+            {
+                throw new NullPointerException( "message" );
+            }
+            
+            if( future == null )
+            {
+                future = UNUSED_FUTURE;
+            }
+            
+            this.message = message;
+            this.future = future;
+        }
+
+        public WriteFuture getFuture()
+        {
+            return future;
+        }
+
+        public Object getMessage()
+        {
+            return message;
+        }
+        
+        public String toString()
+        {
+            return message.toString();
+        }
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilterAdapter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilterAdapter.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilterAdapter.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFilterAdapter.java Sun Jun 12 04:25:23 2005
@@ -18,8 +18,6 @@
  */
 package org.apache.mina.common;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 
 /**
  * An abstract adapter class for {@link IoFilter}.  You can extend
@@ -61,8 +59,8 @@
         nextFilter.messageSent( session, message );
     }
 
-    public void filterWrite( NextFilter nextFilter, IoSession session, Object message, FutureResult future ) throws Exception
+    public void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest ) throws Exception
     {
-        nextFilter.filterWrite( session, message, future );
+        nextFilter.filterWrite( session, writeRequest );
     }
 }

Added: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFuture.java?rev=190245&view=auto
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFuture.java (added)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFuture.java Sun Jun 12 04:25:23 2005
@@ -0,0 +1,80 @@
+package org.apache.mina.common;
+
+
+public class IoFuture
+{
+    private Object result;
+    private boolean ready;
+
+    protected IoFuture()
+    {
+    }
+
+    public synchronized void join()
+    {
+        while( !ready )
+        {
+            try
+            {
+                wait();
+            }
+            catch( InterruptedException e )
+            {
+            }
+        }
+    }
+
+    public synchronized boolean join( long timeoutInMillis )
+    {
+        long startTime = ( timeoutInMillis <= 0 ) ? 0 : System
+                .currentTimeMillis();
+        long waitTime = timeoutInMillis;
+        if( ready )
+        {
+            return ready;
+        }
+        else if( waitTime <= 0 )
+        {
+            return ready;
+        }
+
+        for( ;; )
+        {
+            try
+            {
+                wait( waitTime );
+            }
+            catch( InterruptedException e )
+            {
+            }
+
+            if( ready )
+                return true;
+            else
+            {
+                waitTime = timeoutInMillis - ( System.currentTimeMillis() - startTime );
+                if( waitTime <= 0 )
+                {
+                    return ready;
+                }
+            }
+        }
+    }
+
+    public synchronized boolean isReady()
+    {
+        return ready;
+    }
+
+    protected synchronized void setValue( Object newValue )
+    {
+        result = newValue;
+        ready = true;
+        notifyAll();
+    }
+
+    protected synchronized Object getValue()
+    {
+        return result;
+    }
+}

Propchange: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSession.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSession.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSession.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSession.java Sun Jun 12 04:25:23 2005
@@ -21,8 +21,6 @@
 import java.net.SocketAddress;
 import java.util.Set;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * A handle which represents connection between two endpoints regardless of 
  * transport types.
@@ -51,17 +49,17 @@
      * Writes the specified <code>message</code> to remote peer.  This
      * operation is asynchronous; {@link IoHandler#messageSent(IoSession, Object)}
      * will be invoked when the message is actually sent to remote peer.
-     * You can also ait for the returned {@link FutureResult} if you want
+     * You can also ait for the returned {@link WriteFuture} if you want
      * to wait for the session actually closed.
      */
-    FutureResult write( Object message );
+    WriteFuture write( Object message );
 
     /**
      * Closes this session immediately.  This operation is asynthronous.
-     * Wait for the returned {@link FutureResult} if you want to wait for
+     * Wait for the returned {@link CloseFuture} if you want to wait for
      * the session actually closed.
      */
-    FutureResult close();
+    CloseFuture close();
 
     /**
      * Returns an attachment of this session.

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionFilterChain.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionFilterChain.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionFilterChain.java Sun Jun 12 04:25:23 2005
@@ -18,7 +18,7 @@
  */
 package org.apache.mina.common;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
+import org.apache.mina.common.IoFilter.WriteRequest;
 
 /**
  * An {@link IoFilterChain} that forwards <tt>filterWrite</tt>
@@ -39,8 +39,8 @@
         this.managerChain = managerChain;
     }
     
-    protected void doWrite( IoSession session, Object message, FutureResult future )
+    protected void doWrite( IoSession session, WriteRequest writeRequest )
     {
-        managerChain.filterWrite( session, message, future );
+        managerChain.filterWrite( session, writeRequest );
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionManagerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionManagerFilterChain.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionManagerFilterChain.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/IoSessionManagerFilterChain.java Sun Jun 12 04:25:23 2005
@@ -18,7 +18,6 @@
  */
 package org.apache.mina.common;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
 
 /**
  * An {@link IoFilterChain} that forwards all events
@@ -84,10 +83,9 @@
             }
 
             public void filterWrite( NextFilter nextFilter,
-                                     IoSession session, Object message,
-                                     FutureResult future )
+                                     IoSession session, WriteRequest writeRequest )
             {
-                nextFilter.filterWrite( session, message, future );
+                nextFilter.filterWrite( session, writeRequest );
             }
         };
     }

Added: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/WriteFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/common/WriteFuture.java?rev=190245&view=auto
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/common/WriteFuture.java (added)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/common/WriteFuture.java Sun Jun 12 04:25:23 2005
@@ -0,0 +1,21 @@
+package org.apache.mina.common;
+
+public class WriteFuture extends IoFuture
+{
+    public boolean isWritten()
+    {
+        if( isReady() )
+        {
+            return ( ( Boolean ) getValue() ).booleanValue();
+        }
+        else
+        {
+            return false;
+        }
+    }
+    
+    public void setWritten( boolean written )
+    {
+        setValue( written? Boolean.TRUE : Boolean.FALSE );
+    }
+}

Propchange: directory/network/branches/dirmina-39/src/java/org/apache/mina/common/WriteFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/LoggingFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/LoggingFilter.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/LoggingFilter.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/LoggingFilter.java Sun Jun 12 04:25:23 2005
@@ -26,8 +26,6 @@
 import org.apache.mina.common.IoSession;
 import org.apache.mina.util.SessionLog;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * Logs all MINA protocol events to {@link Logger}.
  * 
@@ -113,9 +111,9 @@
         nextFilter.messageSent( session, message );
     }
 
-    public void filterWrite( NextFilter nextFilter, IoSession session, Object message, FutureResult future )
+    public void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest )
     {
-        SessionLog.log( defaultLevel, session, "WRITE: " + message );
-        nextFilter.filterWrite( session, message, future );
+        SessionLog.log( defaultLevel, session, "WRITE: " + writeRequest );
+        nextFilter.filterWrite( session, writeRequest );
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLFilter.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLFilter.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLFilter.java Sun Jun 12 04:25:23 2005
@@ -32,8 +32,6 @@
 import org.apache.mina.common.IoFilterAdapter;
 import org.apache.mina.common.IoSession;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * An SSL filter that encrypts and decrypts the data exchanged in the session.
  * This filter uses an {@link SSLEngine} which was introduced in Java 5, so 
@@ -295,9 +293,9 @@
         }
     }
 
-    public void filterWrite( NextFilter nextFilter, IoSession session, Object message, FutureResult future ) throws SSLException
+    public void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest ) throws SSLException
     {
-        ByteBuffer buf = ( ByteBuffer ) message;
+        ByteBuffer buf = ( ByteBuffer ) writeRequest.getMessage();
 
         SSLHandler handler = createSSLSessionHandler( nextFilter, session );
         if( log.isLoggable( Level.FINEST ) )
@@ -314,7 +312,7 @@
                 {
                     log.log( Level.FINEST, session + "   already encrypted: " + buf );
                 }
-                nextFilter.filterWrite( session, buf, future );
+                nextFilter.filterWrite( session, writeRequest );
                 return;
             }
             
@@ -336,7 +334,7 @@
                 {
                     log.log( Level.FINEST, session + " encrypted buf: " + encryptedBuffer);
                 }
-                nextFilter.filterWrite( session, encryptedBuffer, future );
+                nextFilter.filterWrite( session, new WriteRequest( encryptedBuffer, writeRequest.getFuture() ) );
                 return;
             }
             else
@@ -354,7 +352,7 @@
                     {
                         log.log( Level.FINEST, session + " Handshaking is not complete yet. Buffering write request." );
                     }
-                    handler.scheduleWrite( nextFilter, buf, future );
+                    handler.scheduleWrite( nextFilter, writeRequest );
                 }
             }
         }
@@ -430,8 +428,7 @@
             }
             //debug("outNetBuffer (after copy): {0}", sslHandler.getOutNetBuffer());
             
-            // TODO: FutureResult is not used here. Can we reuse it?
-            filterWrite( nextFilter, session, writeBuffer, new FutureResult() );
+            filterWrite( nextFilter, session, new WriteRequest( writeBuffer, null ) );
 
             // loop while more writes required to complete handshake
             while( sslHandler.needToCompleteInitialHandshake() )

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLHandler.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLHandler.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLHandler.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/SSLHandler.java Sun Jun 12 04:25:23 2005
@@ -30,10 +30,9 @@
 
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoFilter.NextFilter;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.Queue;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * A helper class using the SSLEngine API to decrypt/encrypt data.
  * <p>
@@ -185,9 +184,9 @@
         return ( initialHandshakeStatus == SSLEngineResult.HandshakeStatus.NEED_WRAP && !closed );
     }
     
-    public synchronized void scheduleWrite( NextFilter nextFilter, org.apache.mina.common.ByteBuffer buf, FutureResult future )
+    public synchronized void scheduleWrite( NextFilter nextFilter, WriteRequest writeRequest )
     {
-        scheduledWrites.push( new ScheduledWrite( nextFilter, buf, future ) );
+        scheduledWrites.push( new ScheduledWrite( nextFilter, writeRequest ) );
     }
     
     public synchronized void flushScheduledWrites() throws SSLException
@@ -198,9 +197,9 @@
         {
             if( log.isLoggable( Level.FINEST ) )
             {
-                log.log( Level.FINEST, session + " Flushing buffered write request: " + scheduledWrite.buf );
+                log.log( Level.FINEST, session + " Flushing buffered write request: " + scheduledWrite.writeRequest );
             }
-            parent.filterWrite( scheduledWrite.nextFilter, session, scheduledWrite.buf, scheduledWrite.future );
+            parent.filterWrite( scheduledWrite.nextFilter, session, scheduledWrite.writeRequest );
         }
     }
 
@@ -669,14 +668,12 @@
     private static class ScheduledWrite
     {
         private final NextFilter nextFilter;
-        private final org.apache.mina.common.ByteBuffer buf;
-        private final FutureResult future; 
+        private final WriteRequest writeRequest;
         
-        public ScheduledWrite( NextFilter nextFilter, org.apache.mina.common.ByteBuffer buf, FutureResult future )
+        public ScheduledWrite( NextFilter nextFilter, WriteRequest writeRequest )
         {
             this.nextFilter = nextFilter;
-            this.buf = buf;
-            this.future = future;
+            this.writeRequest = writeRequest;
         }
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/ThreadPoolFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/ThreadPoolFilter.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/ThreadPoolFilter.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/ThreadPoolFilter.java Sun Jun 12 04:25:23 2005
@@ -27,8 +27,6 @@
 import org.apache.mina.util.EventType;
 import org.apache.mina.util.ThreadPool;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * A Thread-pooling filter.  This filter forwards {@link IoHandler} events
  * to its thread pool.
@@ -120,8 +118,8 @@
         }
     }
 
-    public void filterWrite( NextFilter nextFilter, IoSession session, Object message, FutureResult future )
+    public void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest )
     {
-        nextFilter.filterWrite( session, message, future );
+        nextFilter.filterWrite( session, writeRequest );
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Sun Jun 12 04:25:23 2005
@@ -4,10 +4,9 @@
 import org.apache.mina.common.ByteBufferProxy;
 import org.apache.mina.common.IoFilterAdapter;
 import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteFuture;
 import org.apache.mina.util.Queue;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 public class ProtocolCodecFilter extends IoFilterAdapter
 {
     public static final String ENCODER = ProtocolCodecFilter.class.getName() + ".encoder";
@@ -76,20 +75,16 @@
         }
     }
     
-    public void filterWrite( NextFilter nextFilter, IoSession session, Object message, FutureResult future ) throws Exception
+    public void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest ) throws Exception
     {
         ProtocolEncoder encoder = getEncoder( session );
-        if( message == null )
-        {
-            throw new NullPointerException( "message" );
-        }
-
         ProtocolEncoderOutputImpl encoderOut = getEncoderOut( session );
         encoderOut.nextFilter = nextFilter;
-        encoderOut.message = message;
-        encoderOut.future = future;
         
-        encoder.encode( session, message, encoderOut );
+        encoder.encode( session, writeRequest.getMessage(), encoderOut );
+
+        encoderOut.message = writeRequest.getMessage();
+        encoderOut.future = writeRequest.getFuture();
         encoderOut.flush();
     }
     
@@ -153,17 +148,27 @@
         private final IoSession session;
         private NextFilter nextFilter;
         private Object message;
-        private FutureResult future;
+        private WriteFuture future;
         
         public ProtocolEncoderOutputImpl( IoSession session )
         {
             this.session = session;
         }
 
-        protected FutureResult doFlush( ByteBuffer buf )
+        protected WriteFuture doFlush( ByteBuffer buf )
         {
-            nextFilter.filterWrite( session, new MessageByteBuffer( buf, message ), future );
-            return null;
+            WriteFuture future;
+            if( message != null )
+            {
+                future = this.future;
+                nextFilter.filterWrite( session, new WriteRequest( new MessageByteBuffer( buf, message ), future ) );
+            }
+            else
+            {
+                future = new WriteFuture();
+                nextFilter.filterWrite( session, new WriteRequest( buf, future ) );
+            }
+            return future;
         }
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/ProtocolEncoderOutput.java Sun Jun 12 04:25:23 2005
@@ -19,8 +19,7 @@
 package org.apache.mina.filter.codec;
 
 import org.apache.mina.common.ByteBuffer;
-
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
+import org.apache.mina.common.WriteFuture;
 
 /**
  * Callback for {@link ProtocolEncoder} to generate encoded {@link ByteBuffer}s.
@@ -52,8 +51,8 @@
     /**
      * Flushes all buffers you wrote via {@link #write(ByteBuffer)} to
      * the session.  This operation is asynchronous; please wait for
-     * the returned {@link FutureResult} if you want to wait for
+     * the returned {@link WriteFuture} if you want to wait for
      * the buffers flushed.
      */
-    FutureResult flush();
+    WriteFuture flush();
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/SimpleProtocolEncoderOutput.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/SimpleProtocolEncoderOutput.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/SimpleProtocolEncoderOutput.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/filter/codec/SimpleProtocolEncoderOutput.java Sun Jun 12 04:25:23 2005
@@ -4,10 +4,9 @@
 package org.apache.mina.filter.codec;
 
 import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.WriteFuture;
 import org.apache.mina.util.Queue;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * A {@link ProtocolEncoderOutput} based on queue.
  *
@@ -71,30 +70,35 @@
         bufferQueue.push(newBuf);
     }
     
-    public FutureResult flush()
+    public WriteFuture flush()
     {
         Queue bufferQueue = this.bufferQueue;
-        FutureResult future = null;
-        for( ;; )
+        WriteFuture future = null;
+        if( bufferQueue.isEmpty() )
         {
-            ByteBuffer buf = ( ByteBuffer ) bufferQueue.pop();
-            if( buf == null )
+            future = doFlush( ByteBuffer.allocate( 0 ).flip() ); // write zero bytes
+        }
+        else
+        {
+            for( ;; )
             {
-                break;
+                ByteBuffer buf = ( ByteBuffer ) bufferQueue.pop();
+                if( buf == null )
+                {
+                    break;
+                }
+                
+                future = doFlush( buf );
             }
-            
-            future = doFlush( buf );
         }
         
         if( future == null )
         {
-            // Nothing is written; future is now.
-            future = new FutureResult();
-            future.set( Boolean.FALSE );
+            throw new IllegalStateException( "doFlush must return future." );
         }
         
         return future;
     }
     
-    protected abstract FutureResult doFlush( ByteBuffer buf );
+    protected abstract WriteFuture doFlush( ByteBuffer buf );
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java Sun Jun 12 04:25:23 2005
@@ -34,6 +34,7 @@
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSessionManagerFilterChain;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.ExceptionUtil;
 import org.apache.mina.util.Queue;
 
@@ -360,27 +361,29 @@
     {
         DatagramChannel ch = session.getChannel();
 
-        Queue writeBufferQueue = session.getWriteBufferQueue();
+        Queue writeRequestQueue = session.getWriteRequestQueue();
 
-        ByteBuffer buf;
+        WriteRequest req;
         for( ;; )
         {
-            synchronized( writeBufferQueue )
+            synchronized( writeRequestQueue )
             {
-                buf = ( ByteBuffer ) writeBufferQueue.first();
+                req = ( WriteRequest ) writeRequestQueue.first();
             }
 
-            if( buf == null )
+            if( req == null )
                 break;
 
+            ByteBuffer buf = ( ByteBuffer ) req.getMessage();
             if( buf.remaining() == 0 )
             {
                 // pop and fire event
-                synchronized( writeBufferQueue )
+                synchronized( writeRequestQueue )
                 {
-                    writeBufferQueue.pop();
+                    writeRequestQueue.pop();
                 }
 
+                req.getFuture().setWritten( true );
                 session.getManagerFilterChain().messageSent( session, buf );
                 continue;
             }
@@ -401,12 +404,13 @@
                                  & ( ~SelectionKey.OP_WRITE ) );
 
                 // pop and fire event
-                synchronized( writeBufferQueue )
+                synchronized( writeRequestQueue )
                 {
-                    writeBufferQueue.pop();
+                    writeRequestQueue.pop();
                 }
 
                 session.increaseWrittenBytes( writtenBytes );
+                req.getFuture().setWritten( true );
                 session.getManagerFilterChain().messageSent( session, buf.position( pos ) );
             }
         }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java Sun Jun 12 04:25:23 2005
@@ -28,12 +28,12 @@
 import java.util.Set;
 
 import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.ConnectFuture;
 import org.apache.mina.common.IoConnector;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionManagerFilterChain;
-import org.apache.mina.util.ExceptionUtil;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.Queue;
 
 /**
@@ -68,22 +68,22 @@
     {
     }
 
-    public IoSession connect( SocketAddress address, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, IoHandler handler ) throws IOException
     {
         return connect( address, null, handler);
     }
 
-    public IoSession connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
     {
         return connect( address, null, handler );
     }
 
-    public IoSession connect( SocketAddress address, SocketAddress localAddress, int timeout, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, SocketAddress localAddress, int timeout, IoHandler handler ) throws IOException
     {
         return connect( address, localAddress, handler );
     }
 
-    public IoSession connect( SocketAddress address, SocketAddress localAddress,
+    public ConnectFuture connect( SocketAddress address, SocketAddress localAddress,
                               IoHandler handler ) throws IOException
     {
         if( address == null )
@@ -133,27 +133,7 @@
         }
 
         selector.wakeup();
-
-        synchronized( request )
-        {
-            while( !request.done )
-            {
-                try
-                {
-                    request.wait();
-                }
-                catch( InterruptedException e )
-                {
-                }
-            }
-        }
-        
-        if( request.exception != null )
-        {
-            ExceptionUtil.throwException( request.exception );
-        }
-
-        return request.session;
+        return request;
     }
     
     private synchronized void startupWorker() throws IOException
@@ -357,27 +337,29 @@
     {
         DatagramChannel ch = session.getChannel();
 
-        Queue writeBufferQueue = session.getWriteBufferQueue();
+        Queue writeRequestQueue = session.getWriteRequestQueue();
 
-        ByteBuffer buf;
+        WriteRequest req;
         for( ;; )
         {
-            synchronized( writeBufferQueue )
+            synchronized( writeRequestQueue )
             {
-                buf = ( ByteBuffer ) writeBufferQueue.first();
+                req = ( WriteRequest ) writeRequestQueue.first();
             }
 
-            if( buf == null )
+            if( req == null )
                 break;
 
+            ByteBuffer buf = ( ByteBuffer ) req.getMessage();
             if( buf.remaining() == 0 )
             {
                 // pop and fire event
-                synchronized( writeBufferQueue )
+                synchronized( writeRequestQueue )
                 {
-                    writeBufferQueue.pop();
+                    writeRequestQueue.pop();
                 }
 
+                req.getFuture().setWritten( true );
                 session.getManagerFilterChain().messageSent( session, buf );
                 continue;
             }
@@ -397,12 +379,13 @@
                                  & ( ~SelectionKey.OP_WRITE ) );
 
                 // pop and fire event
-                synchronized( writeBufferQueue )
+                synchronized( writeRequestQueue )
                 {
-                    writeBufferQueue.pop();
+                    writeRequestQueue.pop();
                 }
 
                 session.increaseWrittenBytes( writtenBytes );
+                req.getFuture().setWritten( true );
                 session.getManagerFilterChain().messageSent( session, buf.position( pos ) );
             }
         }
@@ -427,6 +410,7 @@
             DatagramSession session = new DatagramSession(
                     filters, req.channel, req.handler );
 
+            boolean success = false;
             try
             {
                 req.handler.sessionCreated( session );
@@ -435,21 +419,17 @@
                         SelectionKey.OP_READ, session );
     
                 session.setSelectionKey( key );
+
+                req.setSession( session );
+                success = true;
             }
             catch( Throwable t )
             {
-                req.exception = t;
+                req.setException( t );
             }
             finally 
             {
-                synchronized( req )
-                {
-                    req.done = true;
-                    req.session = session;
-                    req.notify();
-                }
-                
-                if( req.exception != null )
+                if( !success )
                 {
                     try
                     {
@@ -503,17 +483,11 @@
         return filters;
     }
 
-    private static class RegistrationRequest
+    private static class RegistrationRequest extends ConnectFuture
     {
         private final DatagramChannel channel;
 
         private final IoHandler handler;
-        
-        private boolean done;
-        
-        private DatagramSession session;
-        
-        private Throwable exception;
 
         private RegistrationRequest( DatagramChannel channel,
                                      IoHandler handler )

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSession.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSession.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSession.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSession.java Sun Jun 12 04:25:23 2005
@@ -23,6 +23,7 @@
 import java.nio.channels.SelectionKey;
 
 import org.apache.mina.common.BaseIoSession;
+import org.apache.mina.common.CloseFuture;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
@@ -31,10 +32,10 @@
 import org.apache.mina.common.IoSessionManager;
 import org.apache.mina.common.IoSessionManagerFilterChain;
 import org.apache.mina.common.TransportType;
+import org.apache.mina.common.WriteFuture;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.Queue;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * An {@link IoSession} for datagram transport (UDP/IP).
  * 
@@ -51,7 +52,7 @@
 
     private final DatagramSessionConfig config;
 
-    private final Queue writeBufferQueue;
+    private final Queue writeRequestQueue;
 
     private final IoHandler handler;
 
@@ -61,7 +62,7 @@
 
     private SelectionKey key;
     
-    private final FutureResult closeFuture = new FutureResult();
+    private final CloseFuture closeFuture = new CloseFuture();
 
     /**
      * Creates a new instance.
@@ -73,7 +74,7 @@
         this.filterChain = new IoSessionFilterChain( managerFilterChain );
         this.ch = ch;
         this.config = new DatagramSessionConfig( ch );
-        this.writeBufferQueue = new Queue();
+        this.writeRequestQueue = new Queue();
         this.handler = defaultHandler;
         this.remoteAddress = ch.socket().getRemoteSocketAddress();
         this.localAddress = ch.socket().getLocalSocketAddress();
@@ -109,7 +110,12 @@
         return handler;
     }
     
-    public synchronized FutureResult close()
+    public void notifyClose()
+    {
+        closeFuture.setClosed( true );
+    }
+    
+    public CloseFuture close()
     {
         if( !closeFuture.isReady() )
         {
@@ -120,21 +126,21 @@
             }
             else
             {
-                closeFuture.set( Boolean.TRUE );
+                closeFuture.setClosed( true );
             }
         }
         return closeFuture;
     }
 
-    Queue getWriteBufferQueue()
+    Queue getWriteRequestQueue()
     {
-        return writeBufferQueue;
+        return writeRequestQueue;
     }
 
-    public FutureResult write( Object message )
+    public WriteFuture write( Object message )
     {
-        FutureResult future = new FutureResult();
-        filterChain.filterWrite( this, message, future );
+        WriteFuture future = new WriteFuture();
+        filterChain.filterWrite( this, new WriteRequest( message, future ) );
         return future;
     }
 

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSessionManagerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSessionManagerFilterChain.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSessionManagerFilterChain.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/DatagramSessionManagerFilterChain.java Sun Jun 12 04:25:23 2005
@@ -3,10 +3,9 @@
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionManagerFilterChain;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.Queue;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * An {@link IoFilterChain} for datagram transport (UDP/IP).
  * 
@@ -19,16 +18,16 @@
         super( processor );
     }
     
-    protected void doWrite( IoSession session, Object message, FutureResult future )
+    protected void doWrite( IoSession session, WriteRequest writeRequest )
     {
         DatagramSession s = ( DatagramSession ) session;
-        Queue writeBufferQueue = s.getWriteBufferQueue();
+        Queue writeRequestQueue = s.getWriteRequestQueue();
         
-        synchronized( writeBufferQueue )
+        synchronized( writeRequestQueue )
         {
-            writeBufferQueue.push( message );
+            writeRequestQueue.push( writeRequest );
         }
 
-        ( ( DatagramSessionManager ) getManager() ).flushSession( s, future );
+        ( ( DatagramSessionManager ) getManager() ).flushSession( s );
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketConnector.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketConnector.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketConnector.java Sun Jun 12 04:25:23 2005
@@ -29,10 +29,10 @@
 import java.util.Set;
 
 import org.apache.mina.common.BaseIoSessionManager;
+import org.apache.mina.common.ConnectFuture;
 import org.apache.mina.common.IoConnector;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionManagerFilterChain;
 import org.apache.mina.util.ExceptionUtil;
 import org.apache.mina.util.Queue;
@@ -64,22 +64,22 @@
     {
     }
 
-    public IoSession connect( SocketAddress address, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, IoHandler handler ) throws IOException
     {
         return connect( address, null, Integer.MAX_VALUE, handler);
     }
 
-    public IoSession connect( SocketAddress address, SocketAddress localAddress, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, SocketAddress localAddress, IoHandler handler ) throws IOException
     {
         return connect( address, localAddress, Integer.MAX_VALUE, handler);
     }
 
-    public IoSession connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
     {
         return connect( address, null, timeout, handler);
     }
 
-    public IoSession connect( SocketAddress address, SocketAddress localAddress,
+    public ConnectFuture connect( SocketAddress address, SocketAddress localAddress,
                               int timeout, IoHandler handler ) throws IOException
     {
         if( address == null )
@@ -114,7 +114,9 @@
             {
                 SocketSession session = newSession( ch, handler );
                 success = true;
-                return session;
+                ConnectFuture future = new ConnectFuture();
+                future.setSession( session );
+                return future;
             }
             
             success = true;
@@ -137,27 +139,8 @@
             startupWorker();
         }
         selector.wakeup();
-
-        synchronized( request )
-        {
-            while( !request.done )
-            {
-                try
-                {
-                    request.wait();
-                }
-                catch( InterruptedException e )
-                {
-                }
-            }
-        }
-
-        if( request.exception != null )
-        {
-            ExceptionUtil.throwException( request.exception );
-        }
-
-        return request.session;
+        
+        return request;
     }
     
     private synchronized void startupWorker() throws IOException
@@ -193,12 +176,7 @@
             }
             catch( IOException e )
             {
-                req.exception = e;
-                synchronized( req )
-                {
-                    req.done = true;
-                    req.notify();
-                }
+                req.setException( e );
             }
         }
     }
@@ -217,20 +195,22 @@
             SocketChannel ch = ( SocketChannel ) key.channel();
             ConnectionRequest entry = ( ConnectionRequest ) key.attachment();
 
+            boolean success = false;
             try
             {
                 ch.finishConnect();
                 SocketSession session = newSession( ch, entry.handler );
-                entry.session = session;
+                entry.setSession( session );
+                success = true;
             }
             catch( Throwable e )
             {
-                entry.exception = e;
+                entry.setException( e );
             }
             finally
             {
                 key.cancel();
-                if( entry.session == null )
+                if( !success )
                 {
                     try
                     {
@@ -241,12 +221,6 @@
                         exceptionMonitor.exceptionCaught( this, e );
                     }
                 }
-
-                synchronized( entry )
-                {
-                    entry.done = true;
-                    entry.notify();
-                }
             }
         }
 
@@ -269,14 +243,7 @@
 
             if( currentTime >= entry.deadline )
             {
-                entry.exception = new ConnectException();
-                entry.done = true;
-
-                synchronized( entry )
-                {
-                    entry.notify();
-                }
-
+                entry.setException( new ConnectException() );
                 key.cancel();
             }
         }
@@ -362,19 +329,13 @@
         }
     }
 
-    private static class ConnectionRequest
+    private static class ConnectionRequest extends ConnectFuture
     {
         private final SocketChannel channel;
         
         private final long deadline;
 
         private final IoHandler handler;
-        
-        private SocketSession session;
-
-        private boolean done;
-
-        private Throwable exception;
 
         private ConnectionRequest( SocketChannel channel, int timeout, IoHandler handler )
         {

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java Sun Jun 12 04:25:23 2005
@@ -29,6 +29,7 @@
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.WriteTimeoutException;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.Queue;
 
 /**
@@ -432,19 +433,23 @@
     
     private void releaseWriteBuffers( SocketSession session )
     {
-        Queue writeBufferQueue = session.getWriteBufferQueue();
-        ByteBuffer buf;
+        Queue writeRequestQueue = session.getWriteRequestQueue();
+        WriteRequest req;
         
-        while( ( buf = (ByteBuffer) writeBufferQueue.pop() ) != null )
+        while( ( req = ( WriteRequest ) writeRequestQueue.pop() ) != null )
         {
             try
             {
-                buf.release();
+                ( ( ByteBuffer ) req.getMessage() ).release();
             }
             catch( IllegalStateException e )
             {
                 session.getManagerFilterChain().exceptionCaught( session, e );
             }
+            finally
+            {
+                req.getFuture().setWritten( false );
+            }
         }
     }
 
@@ -452,26 +457,28 @@
     {
         SocketChannel ch = session.getChannel();
 
-        Queue writeBufferQueue = session.getWriteBufferQueue();
+        Queue writeRequestQueue = session.getWriteRequestQueue();
 
-        ByteBuffer buf;
+        WriteRequest req;
         for( ;; )
         {
-            synchronized( writeBufferQueue )
+            synchronized( writeRequestQueue )
             {
-                buf = ( ByteBuffer ) writeBufferQueue.first();
+                req = ( WriteRequest ) writeRequestQueue.first();
             }
 
-            if( buf == null )
+            if( req == null )
                 break;
 
+            ByteBuffer buf = ( ByteBuffer ) req.getMessage();
             if( buf.remaining() == 0 )
             {
-                synchronized( writeBufferQueue )
+                synchronized( writeRequestQueue )
                 {
-                    writeBufferQueue.pop();
+                    writeRequestQueue.pop();
                 }
                 
+                req.getFuture().setWritten( true );
                 session.getManagerFilterChain().messageSent( session, buf.reset() );
                 continue;
             }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSession.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSession.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSession.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSession.java Sun Jun 12 04:25:23 2005
@@ -23,6 +23,7 @@
 import java.nio.channels.SocketChannel;
 
 import org.apache.mina.common.BaseIoSession;
+import org.apache.mina.common.CloseFuture;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
@@ -30,10 +31,10 @@
 import org.apache.mina.common.IoSessionFilterChain;
 import org.apache.mina.common.IoSessionManagerFilterChain;
 import org.apache.mina.common.TransportType;
+import org.apache.mina.common.WriteFuture;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.Queue;
 
-import EDU.oswego.cs.dl.util.concurrent.FutureResult;
-
 /**
  * An {@link IoSession} for socket transport (TCP/IP).
  * 
@@ -50,7 +51,7 @@
 
     private final SocketSessionConfig config;
 
-    private final Queue writeBufferQueue;
+    private final Queue writeRequestQueue;
 
     private final IoHandler handler;
 
@@ -60,7 +61,7 @@
 
     private SelectionKey key;
     
-    private FutureResult closeFuture = new FutureResult();
+    private CloseFuture closeFuture = new CloseFuture();
 
     /**
      * Creates a new instance.
@@ -72,7 +73,7 @@
         this.filterChain = new IoSessionFilterChain( managerFilterChain );
         this.ch = ch;
         this.config = new SocketSessionConfig( this );
-        this.writeBufferQueue = new Queue();
+        this.writeRequestQueue = new Queue();
         this.handler = defaultHandler;
         this.remoteAddress = ch.socket().getRemoteSocketAddress();
         this.localAddress = ch.socket().getLocalSocketAddress();
@@ -108,7 +109,12 @@
         return handler;
     }
     
-    public synchronized FutureResult close( boolean wait )
+    public void notifyClose()
+    {
+        closeFuture.setClosed( true );
+    }
+    
+    public CloseFuture close()
     {
         if( !closeFuture.isReady() )
         {
@@ -118,14 +124,16 @@
         return closeFuture;
     }
 
-    Queue getWriteBufferQueue()
+    Queue getWriteRequestQueue()
     {
-        return writeBufferQueue;
+        return writeRequestQueue;
     }
 
-    public void write( Object message )
+    public WriteFuture write( Object message )
     {
-        filterChain.filterWrite( this, message );
+        WriteFuture future = new WriteFuture();
+        filterChain.filterWrite( this, new WriteRequest( message, future ) );
+        return future;
     }
 
     public TransportType getTransportType()

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSessionManagerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSessionManagerFilterChain.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSessionManagerFilterChain.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/socket/nio/SocketSessionManagerFilterChain.java Sun Jun 12 04:25:23 2005
@@ -5,6 +5,7 @@
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionManager;
 import org.apache.mina.common.IoSessionManagerFilterChain;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.Queue;
 
 /**
@@ -19,17 +20,17 @@
         super( manager );
     }
 
-    protected void doWrite( IoSession session, Object message, FutureResult future )
+    protected void doWrite( IoSession session, WriteRequest writeRequest )
     {
         SocketSession s = ( SocketSession ) session;
-        Queue writeBufferQueue = s.getWriteBufferQueue();
+        Queue writeRequestQueue = s.getWriteRequestQueue();
         
-        ( ( ByteBuffer ) message ).mark();
-        synchronized( writeBufferQueue )
+        ( ( ByteBuffer ) writeRequest.getMessage() ).mark();
+        synchronized( writeRequestQueue )
         {
-            writeBufferQueue.push( message );
+            writeRequestQueue.push( writeRequest );
         }
 
-        SocketIoProcessor.getInstance().flushSession( s, future );
+        SocketIoProcessor.getInstance().flushSession( s );
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java Sun Jun 12 04:25:23 2005
@@ -7,10 +7,10 @@
 import java.net.SocketAddress;
 
 import org.apache.mina.common.BaseIoSessionManager;
+import org.apache.mina.common.ConnectFuture;
 import org.apache.mina.common.IoConnector;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.IoSession;
 import org.apache.mina.transport.vmpipe.VmPipeAcceptor.Entry;
 import org.apache.mina.util.AnonymousSocketAddress;
 
@@ -39,22 +39,22 @@
         return filterChain;
     }
 
-    public IoSession connect( SocketAddress address, IoHandler handler ) throws IOException 
+    public ConnectFuture connect( SocketAddress address, IoHandler handler ) throws IOException 
     {
         return connect( address, null, Integer.MAX_VALUE, handler );
     }
 
-    public IoSession connect( SocketAddress address, SocketAddress localAddress, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, SocketAddress localAddress, IoHandler handler ) throws IOException
     {
         return connect( address, localAddress, Integer.MAX_VALUE, handler );
     }
 
-    public IoSession connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
     {
         return connect( address, null, timeout, handler );
     }
 
-    public IoSession connect( SocketAddress address, SocketAddress localAddress, int timeout, IoHandler handler ) throws IOException
+    public ConnectFuture connect( SocketAddress address, SocketAddress localAddress, int timeout, IoHandler handler ) throws IOException
     {
         if( address == null )
             throw new NullPointerException( "address" );
@@ -75,6 +75,8 @@
                                                    entry );
 
         VmPipeIdleStatusChecker.INSTANCE.addSession( session );
-        return session;
+        ConnectFuture future = new ConnectFuture();
+        future.setSession( session );
+        return future;
     }
 }

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSession.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSession.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSession.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSession.java Sun Jun 12 04:25:23 2005
@@ -7,12 +7,15 @@
 import java.net.SocketAddress;
 
 import org.apache.mina.common.BaseIoSession;
+import org.apache.mina.common.CloseFuture;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.IoSessionFilterChain;
 import org.apache.mina.common.TransportType;
+import org.apache.mina.common.WriteFuture;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.filter.codec.ProtocolDecoder;
 import org.apache.mina.filter.codec.ProtocolEncoder;
 import org.apache.mina.transport.vmpipe.VmPipeAcceptor.Entry;
@@ -127,22 +130,28 @@
         return null;
     }
 
-    public void close( boolean wait )
+    public CloseFuture close()
     {
         synchronized( lock )
         {
-            if( closed )
-                return;
-
-            closed = remoteSession.closed = true;
-            managerFilterChain.sessionClosed( this );
-            remoteSession.getManagerFilterChain().sessionClosed( remoteSession );
+            if( !closed )
+            {
+                closed = remoteSession.closed = true;
+                managerFilterChain.sessionClosed( this );
+                remoteSession.getManagerFilterChain().sessionClosed( remoteSession );
+            }
         }
+        
+        CloseFuture future = new CloseFuture();
+        future.setClosed( true );
+        return future;
     }
 
-    public void write( Object message )
+    public WriteFuture write( Object message )
     {
-        this.filterChain.filterWrite( this, message );
+        WriteFuture future = new WriteFuture();
+        this.filterChain.filterWrite( this, new WriteRequest( message, future ) );
+        return future;
     }
 
     public TransportType getTransportType()

Modified: directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSessionManagerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSessionManagerFilterChain.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSessionManagerFilterChain.java (original)
+++ directory/network/branches/dirmina-39/src/java/org/apache/mina/transport/vmpipe/VmPipeSessionManagerFilterChain.java Sun Jun 12 04:25:23 2005
@@ -3,6 +3,7 @@
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionManager;
 import org.apache.mina.common.IoSessionManagerFilterChain;
+import org.apache.mina.common.IoFilter.WriteRequest;
 
 class VmPipeSessionManagerFilterChain extends IoSessionManagerFilterChain {
 
@@ -11,15 +12,20 @@
         super( manager );
     }
 
-    protected void doWrite( IoSession session, Object message )
+    protected void doWrite( IoSession session, WriteRequest writeRequest )
     {
         VmPipeSession s = ( VmPipeSession ) session;
-        
         synchronized( s.lock )
         {
             if( s.closed )
-                throw new IllegalStateException( "Session is closed." );
-            s.remoteSession.getManagerFilterChain().messageReceived( s.remoteSession, message );
+            {
+                writeRequest.getFuture().setWritten( false );
+            }
+            else 
+            {
+                s.remoteSession.getManagerFilterChain().messageReceived( s.remoteSession, writeRequest.getMessage() );
+                writeRequest.getFuture().setWritten( true );
+            }
         }
     }
 }

Modified: directory/network/branches/dirmina-39/src/test/org/apache/mina/common/IoFilterChainTest.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/test/org/apache/mina/common/IoFilterChainTest.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/test/org/apache/mina/common/IoFilterChainTest.java (original)
+++ directory/network/branches/dirmina-39/src/test/org/apache/mina/common/IoFilterChainTest.java Sun Jun 12 04:25:23 2005
@@ -23,6 +23,8 @@
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
+import org.apache.mina.common.IoFilter.WriteRequest;
+
 /**
  * Tests {@link AbstractIoFilterChain}.
  * 
@@ -67,7 +69,7 @@
     {
         chain.sessionOpened( session );
         chain.messageReceived( session, new Object() );
-        chain.filterWrite( session, new Object() );
+        chain.filterWrite( session, new WriteRequest( new Object() ) );
         chain.sessionIdle( session, IdleStatus.READER_IDLE );
         chain.exceptionCaught( session, new Exception() );
         chain.sessionClosed( session );
@@ -133,10 +135,12 @@
             return handler;
         }
 
-        public void close( boolean wait ) {
+        public CloseFuture close() {
+            return null;
         }
 
-        public void write(Object message) {
+        public WriteFuture write(Object message) {
+            return null;
         }
 
         public TransportType getTransportType() {
@@ -194,9 +198,9 @@
             nextFilter.exceptionCaught( session, cause );
         }
 
-        public void filterWrite(NextFilter nextFilter, IoSession session, Object message) {
+        public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest ) {
             result += id + "FW";
-            nextFilter.filterWrite( session, message );
+            nextFilter.filterWrite( session, writeRequest );
         }
 
         public void messageReceived(NextFilter nextFilter, IoSession session, Object message) {
@@ -216,9 +220,9 @@
         {
         }
 
-        protected void doWrite( IoSession session, Object message )
+        protected void doWrite( IoSession session, WriteRequest writeRequest )
         {
-            messageSent( session, message );
+            messageSent( session, writeRequest.getMessage() );
         }
     }
     

Modified: directory/network/branches/dirmina-39/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java (original)
+++ directory/network/branches/dirmina-39/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java Sun Jun 12 04:25:23 2005
@@ -25,11 +25,13 @@
 import junit.framework.Assert;
 
 import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.ConnectFuture;
 import org.apache.mina.common.IoAcceptor;
 import org.apache.mina.common.IoConnector;
 import org.apache.mina.common.IoHandlerAdapter;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.TransportType;
+import org.apache.mina.common.WriteFuture;
 import org.apache.mina.examples.echoserver.ssl.BogusSSLContextFactory;
 import org.apache.mina.filter.SSLFilter;
 import org.apache.mina.transport.socket.nio.DatagramConnector;
@@ -127,11 +129,15 @@
     {
         EchoConnectorHandler handler = new EchoConnectorHandler();
         ByteBuffer readBuf = handler.readBuf;
-        IoSession session = connector.connect(
+        ConnectFuture future = connector.connect(
                 new InetSocketAddress( InetAddress.getLocalHost(), port ),
                 localAddress,
                 handler );
         
+        future.join();
+        IoSession session = future.getSession();
+        
+        WriteFuture writeFuture = null;
         for( int i = 0; i < 10; i ++ )
         {
             ByteBuffer buf = ByteBuffer.allocate( 16 );
@@ -139,7 +145,7 @@
             fillWriteBuffer( buf, i );
             buf.flip();
 
-            session.write( buf );
+            writeFuture = session.write( buf );
 
             // This will align message arrival order in UDP
             for( int j = 0; j < 30; j ++ )
@@ -163,7 +169,8 @@
             }
         }
 
-        session.close( true );
+        writeFuture.join();
+        session.close();
         
         Assert.assertEquals( 160, readBuf.position() );
         readBuf.flip();

Modified: directory/network/branches/dirmina-39/src/test/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/dirmina-39/src/test/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java?rev=190245&r1=190244&r2=190245&view=diff
==============================================================================
--- directory/network/branches/dirmina-39/src/test/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java (original)
+++ directory/network/branches/dirmina-39/src/test/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java Sun Jun 12 04:25:23 2005
@@ -27,16 +27,13 @@
 
 import org.apache.mina.common.BaseIoSession;
 import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.CloseFuture;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.TransportType;
-import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
-import org.apache.mina.filter.codec.ProtocolDecoder;
-import org.apache.mina.filter.codec.ProtocolDecoderOutput;
-import org.apache.mina.filter.codec.ProtocolEncoder;
-import org.apache.mina.filter.codec.ProtocolViolationException;
+import org.apache.mina.common.WriteFuture;
 
 /**
  * Tests {@link CumulativeProtocolDecoder}.
@@ -189,10 +186,12 @@
             return null;
         }
 
-        public void close( boolean wait ) {
+        public CloseFuture close() {
+            return null;
         }
 
-        public void write(Object message) {
+        public WriteFuture write( Object message ) {
+            return null;
         }
 
         public TransportType getTransportType() {