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 2006/05/17 05:18:16 UTC

svn commit: r407136 - in /directory/trunks/mina/core/src: main/java/org/apache/mina/common/ main/java/org/apache/mina/common/support/ main/java/org/apache/mina/filter/ main/java/org/apache/mina/filter/codec/ main/java/org/apache/mina/transport/socket/n...

Author: trustin
Date: Tue May 16 20:18:15 2006
New Revision: 407136

URL: http://svn.apache.org/viewcvs?rev=407136&view=rev
Log:
Resolved issue: DIRMINA-217 (Make IoFuture and its subclasses interfaces)
* Changed IoFuture and its subclasses into interfaces
* Extracted their implementations to common.support.DefaultXxxFuture
* IoFilter.WriteRequest.UNUSED_FUTURE directly implements WriteFuture now.
  * This change broke StreamWriterFilterTest. I fixed it, too.

Added:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultCloseFuture.java   (with props)
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultConnectFuture.java   (with props)
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java   (with props)
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultWriteFuture.java   (with props)
    directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/
    directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java
      - copied, changed from r407121, directory/trunks/mina/core/src/test/java/org/apache/mina/common/FutureTest.java
Removed:
    directory/trunks/mina/core/src/test/java/org/apache/mina/common/FutureTest.java
Modified:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/CloseFuture.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/ConnectFuture.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFilter.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFuture.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/WriteFuture.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/StreamWriteFilter.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/StreamWriteFilterTest.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/CloseFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/CloseFuture.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/CloseFuture.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/CloseFuture.java Tue May 16 20:18:15 2006
@@ -34,44 +34,17 @@
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$
  */
-public class CloseFuture extends IoFuture
+public interface CloseFuture extends IoFuture
 {
     /**
-     * Creates a new instance.
-     */
-    public CloseFuture()
-    {
-    }
-    
-    /**
-     * Creates a new instance which uses the specified object as a lock.
-     */
-    public CloseFuture( Object lock )
-    {
-        super( lock );
-    }
-    
-    /**
      * Returns <tt>true</tt> if the close request is finished and the session is closed.
      */
-    public boolean isClosed()
-    {
-        if( isReady() )
-        {
-            return ( ( Boolean ) getValue() ).booleanValue();
-        }
-        else
-        {
-            return false;
-        }
-    }
+    boolean isClosed();
     
     /**
-     * This method is invoked by MINA internally.  Please do not call this method
-     * directly.
+     * Marks this future as closed and notifies all threads waiting for this
+     * future.  This method is invoked by MINA internally.  Please do not call
+     * this method directly.
      */
-    public void setClosed()
-    {
-        setValue( Boolean.TRUE );
-    }
+    void setClosed();
 }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/ConnectFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/ConnectFuture.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/ConnectFuture.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/ConnectFuture.java Tue May 16 20:18:15 2006
@@ -18,8 +18,6 @@
  */
 package org.apache.mina.common;
 
-import java.io.IOException;
-
 /**
  * An {@link IoFuture} for asynchronous connect requests.
  *
@@ -35,72 +33,32 @@
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$
  */
-public class ConnectFuture extends IoFuture
+public interface ConnectFuture extends IoFuture
 {
     /**
-     * Returns a new {@link ConnectFuture} which is already marked as 'failed to connect'.
-     */
-    public static ConnectFuture newFailedFuture( IOException exception )
-    {
-        ConnectFuture failedFuture = new ConnectFuture();
-        failedFuture.setException( exception );
-        return failedFuture;
-    }
-    
-    public ConnectFuture()
-    {
-    }
-    
-    /**
-     * Creates a new instance which uses the specified object as a lock.
-     */
-    public ConnectFuture( Object lock )
-    {
-        super( lock );
-    }
-
-    /**
      * Returns {@link IoSession} which is the result of connect operation.
      * 
      * @return <tt>null</tt> if the connect operation is not finished yet
-     * @throws IOException if connection attempt failed by an exception
+     * @throws RuntimeIOException if connection attempt failed by an exception
      */
-    public IoSession getSession() throws IOException
-    {
-        Object v = getValue();
-        if( v instanceof Throwable )
-        {
-            throw ( IOException ) new IOException( "Failed to get the session." ).initCause( ( Throwable ) v );
-        }
-        else
-        {
-            return ( IoSession ) v;
-        }
-    }
+    IoSession getSession() throws RuntimeIOException;
 
     /**
      * Returns <tt>true</tt> if the connect operation is finished successfully.
      */
-    public boolean isConnected()
-    {
-        return getValue() instanceof IoSession;
-    }
+    boolean isConnected();
     
     /**
-     * This method is invoked by MINA internally.  Please do not call this method
-     * directly.
+     * Sets the newly connected session and notifies all threads waiting for
+     * this future.  This method is invoked by MINA internally.  Please do not
+     * call this method directly.
      */
-    public void setSession( IoSession session )
-    {
-        setValue( session );
-    }
+    void setSession( IoSession session );
     
     /**
-     * This method is invoked by MINA internally.  Please do not call this method
-     * directly.
+     * Sets the exception caught due to connection failure and notifies all
+     * threads waiting for this future.  This method is invoked by MINA
+     * internally.  Please do not call this method directly.
      */
-    public void setException( Throwable exception )
-    {
-        setValue( exception );
-    }
+    void setException( Throwable exception );
 }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFilter.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFilter.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFilter.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFilter.java Tue May 16 20:18:15 2006
@@ -245,7 +245,51 @@
      */
     public static class WriteRequest
     {
-        private static final WriteFuture UNUSED_FUTURE = new WriteFuture();
+        private static final WriteFuture UNUSED_FUTURE = new WriteFuture()
+        {
+            public boolean isWritten()
+            {
+                return false;
+            }
+
+            public void setWritten( boolean written )
+            {
+            }
+            
+            public IoSession getSession()
+            {
+                return null;
+            }
+
+            public Object getLock()
+            {
+                return this;
+            }
+
+            public void join()
+            {
+            }
+
+            public boolean join( long timeoutInMillis )
+            {
+                return true;
+            }
+
+            public boolean isReady()
+            {
+                return true;
+            }
+
+            public Callback getCallback()
+            {
+                return null;
+            }
+
+            public void setCallback( Callback callback )
+            {
+                throw new IllegalStateException( "You can't set a callback for a dummy future." );
+            }
+        };
         
         private final Object message;
         private final WriteFuture future;

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFuture.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFuture.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoFuture.java Tue May 16 20:18:15 2006
@@ -25,13 +25,8 @@
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$
  */
-public class IoFuture
+public interface IoFuture
 {
-    private final Object lock;
-    private Object result;
-    private Callback callback;
-    private boolean ready;
-
     /**
      * Something interested in being notified when the result
      * of an {@link IoFuture} becomes available.
@@ -45,184 +40,45 @@
          * @param future  The source {@link IoFuture} which called this
          *                callback.
          */
-        public void operationComplete( IoFuture future );
+        void operationComplete( IoFuture future );
     }
 
     /**
-     * Creates a new instance.
-     */
-    public IoFuture()
-    {
-        this.lock = this;
-    }
-    
-    /**
-     * Creates a new instance which uses the specified object as a lock.
+     * Returns the {@link IoSession} which is associated with this future.
      */
-    public IoFuture( Object lock )
-    {
-        if( lock == null )
-        {
-            throw new NullPointerException( "lock" );
-        }
-        this.lock = lock;
-    }
+    IoSession getSession();
     
     /**
      * Returns the lock object this future acquires.
      */
-    public Object getLock()
-    {
-        return lock;
-    }
+    Object getLock();
     
     /**
      * Wait for the asynchronous operation to end.
      */
-    public void join()
-    {
-        synchronized( lock )
-        {
-            while( !ready )
-            {
-                try
-                {
-                    lock.wait();
-                }
-                catch( InterruptedException e )
-                {
-                }
-            }
-        }
-    }
+    void join();
 
     /**
      * Wait for the asynchronous operation to end with the specified timeout.
      * 
      * @return <tt>true</tt> if the operation is finished.
      */
-    public boolean join( long timeoutInMillis )
-    {
-        long startTime = ( timeoutInMillis <= 0 ) ? 0 : System
-                .currentTimeMillis();
-        long waitTime = timeoutInMillis;
-        
-        synchronized( lock )
-        {
-            if( ready )
-            {
-                return ready;
-            }
-            else if( waitTime <= 0 )
-            {
-                return ready;
-            }
-
-            for( ;; )
-            {
-                try
-                {
-                    lock.wait( waitTime );
-                }
-                catch( InterruptedException e )
-                {
-                }
-
-                if( ready )
-                    return true;
-                else
-                {
-                    waitTime = timeoutInMillis - ( System.currentTimeMillis() - startTime );
-                    if( waitTime <= 0 )
-                    {
-                        return ready;
-                    }
-                }
-            }
-        }
-    }
+    boolean join( long timeoutInMillis );
 
     /**
      * Returns if the asynchronous operation is finished.
      */
-    public boolean isReady()
-    {
-        synchronized( lock )
-        {
-            return ready;
-        }
-    }
-
-    /**
-     * Sets the result of the asynchronous operation, and mark it as finished.
-     */
-    protected void setValue( Object newValue )
-    {
-        synchronized( lock )
-        {
-            // Allow only once.
-            if( ready )
-            {
-                return;
-            }
-
-            result = newValue;
-            ready = true;
-            lock.notifyAll();
-    
-            if( callback != null )
-            {
-                invokeCallback();
-            }
-        }
-    }
+    boolean isReady();
 
     /**
-     * Returns the result of the asynchronous operation.
-     */
-    protected Object getValue()
-    {
-        synchronized( lock )
-        {
-            return result;
-        }
-    }
-    
-    /**
      * Returns a {@link Callback} which is associated with this future.
      */
-    public Callback getCallback()
-    {
-        synchronized( lock )
-        {
-            return callback;
-        }
-    }
+    Callback getCallback();
     
     /**
      * Sets a {@link Callback} to be notified when a result
      * becomes available.  If tth result has already become obtained,
      * the specified callback is notified immediately
      */
-    public void setCallback( Callback callback ) 
-    {
-        if( callback == null )
-        {
-            throw new NullPointerException( "callback" );
-        }
-
-        synchronized( lock )
-        {
-            this.callback = callback;
-            if( ready )
-            {
-                invokeCallback();
-            }
-        }
-    }
-
-    private void invokeCallback()
-    {
-        callback.operationComplete( this );
-    }
+    void setCallback( Callback callback );
 }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/WriteFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/WriteFuture.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/WriteFuture.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/WriteFuture.java Tue May 16 20:18:15 2006
@@ -41,64 +41,17 @@
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$
  */
-public class WriteFuture extends IoFuture
+public interface WriteFuture extends IoFuture
 {
     /**
-     * Returns a new {@link WriteFuture} which is already marked as 'written'.
-     */
-    public static WriteFuture newWrittenFuture()
-    {
-        WriteFuture unwrittenFuture = new WriteFuture();
-        unwrittenFuture.setWritten( true );
-        return unwrittenFuture;
-    }
-
-    /**
-     * Returns a new {@link WriteFuture} which is already marked as 'not written'.
-     */
-    public static WriteFuture newNotWrittenFuture()
-    {
-        WriteFuture unwrittenFuture = new WriteFuture();
-        unwrittenFuture.setWritten( false );
-        return unwrittenFuture;
-    }
-    
-    /**
-     * Creates a new instance.
-     */
-    public WriteFuture()
-    {
-    }
-    
-    /**
-     * Creates a new instance which uses the specified object as a lock.
-     */
-    public WriteFuture( Object lock )
-    {
-        super( lock );
-    }
-    
-    /**
      * Returns <tt>true</tt> if the write operation is finished successfully.
      */
-    public boolean isWritten()
-    {
-        if( isReady() )
-        {
-            return ( ( Boolean ) getValue() ).booleanValue();
-        }
-        else
-        {
-            return false;
-        }
-    }
+    boolean isWritten();
 
     /**
-     * This method is invoked by MINA internally.  Please do not call this method
-     * directly.
+     * Sets whether the message is written or not, and notifies all threads
+     * waiting for this future.  This method is invoked by MINA internally.
+     * Please do not call this method directly.
      */
-    public void setWritten( boolean written )
-    {
-        setValue( written? Boolean.TRUE : Boolean.FALSE );
-    }
+    void setWritten( boolean written );
 }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java Tue May 16 20:18:15 2006
@@ -18,23 +18,23 @@
  */
 package org.apache.mina.common.support;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.IoFilter;
-import org.apache.mina.common.IoFilter.NextFilter;
-import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.common.IoFilterAdapter;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoFilterLifeCycleException;
 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.ByteBufferUtil;
 import org.apache.mina.util.SessionLog;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 /**
  * An abstract implementation of {@link IoFilterChain} that provides
  * common operations for developers to implement their own transport layer.
@@ -528,6 +528,7 @@
         {
             exceptionCaught( session, t );
         }
+        
         Entry head = this.head;
         callNextMessageSent( head, session, request.getMessage() );
     }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java Tue May 16 20:18:15 2006
@@ -46,7 +46,7 @@
     /** 
      * A future that will be set 'closed' when the connection is closed.
      */
-    private final CloseFuture closeFuture = new CloseFuture( this );
+    private final CloseFuture closeFuture = new DefaultCloseFuture( this );
     private boolean closing;
 
     // Configuration variables
@@ -134,11 +134,11 @@
         {
             if( isClosing() || !isConnected() )
             {
-                return WriteFuture.newNotWrittenFuture();
+                return DefaultWriteFuture.newNotWrittenFuture( this );
             }
         }
 
-        WriteFuture future = new WriteFuture();
+        WriteFuture future = new DefaultWriteFuture( this );
         write0( new WriteRequest( message, future, remoteAddress ) );
         
         return future;

Added: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultCloseFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultCloseFuture.java?rev=407136&view=auto
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultCloseFuture.java (added)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultCloseFuture.java Tue May 16 20:18:15 2006
@@ -0,0 +1,64 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common.support;
+
+import org.apache.mina.common.CloseFuture;
+import org.apache.mina.common.IoSession;
+
+/**
+ * A default implementation of {@link CloseFuture}.
+ * 
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ * @version $Rev$, $Date$
+ */
+public class DefaultCloseFuture extends DefaultIoFuture implements CloseFuture
+{
+    /**
+     * Creates a new instance.
+     */
+    public DefaultCloseFuture( IoSession session )
+    {
+        super( session );
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    public DefaultCloseFuture( IoSession session, Object lock )
+    {
+        super( session, lock );
+    }
+    
+    public boolean isClosed()
+    {
+        if( isReady() )
+        {
+            return ( ( Boolean ) getValue() ).booleanValue();
+        }
+        else
+        {
+            return false;
+        }
+    }
+    
+    public void setClosed()
+    {
+        setValue( Boolean.TRUE );
+    }
+}

Propchange: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultCloseFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultConnectFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultConnectFuture.java?rev=407136&view=auto
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultConnectFuture.java (added)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultConnectFuture.java Tue May 16 20:18:15 2006
@@ -0,0 +1,90 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common.support;
+
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.RuntimeIOException;
+
+/**
+ * A default implementation of {@link ConnectFuture}.
+ *
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ * @version $Rev$, $Date$
+ */
+public class DefaultConnectFuture extends DefaultIoFuture implements ConnectFuture
+{
+    /**
+     * Returns a new {@link ConnectFuture} which is already marked as 'failed to connect'.
+     */
+    public static ConnectFuture newFailedFuture( Throwable exception )
+    {
+        DefaultConnectFuture failedFuture = new DefaultConnectFuture();
+        failedFuture.setException( exception );
+        return failedFuture;
+    }
+    
+    /**
+     * Creates a new instance.
+     */
+    public DefaultConnectFuture()
+    {
+        super( null );
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    public DefaultConnectFuture( Object lock )
+    {
+        super( null, lock );
+    }
+
+    public IoSession getSession() throws RuntimeIOException
+    {
+        Object v = getValue();
+        if( v instanceof RuntimeIOException )
+        {
+            throw ( RuntimeIOException ) v;
+        }
+        else if( v instanceof Throwable )
+        {
+            throw ( RuntimeIOException ) new RuntimeIOException( "Failed to get the session." ).initCause( ( Throwable ) v );
+        }
+        else
+        {
+            return ( IoSession ) v;
+        }
+    }
+
+    public boolean isConnected()
+    {
+        return getValue() instanceof IoSession;
+    }
+    
+    public void setSession( IoSession session )
+    {
+        setValue( session );
+    }
+    
+    public void setException( Throwable exception )
+    {
+        setValue( exception );
+    }
+}

Propchange: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultConnectFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java?rev=407136&view=auto
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java (added)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java Tue May 16 20:18:15 2006
@@ -0,0 +1,202 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common.support;
+
+import org.apache.mina.common.IoFuture;
+import org.apache.mina.common.IoSession;
+
+/**
+ * A default implementation of {@link IoFuture}.
+ *  
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ * @version $Rev$, $Date$
+ */
+public class DefaultIoFuture implements IoFuture
+{
+    private final IoSession session;
+    private final Object lock;
+    private Object result;
+    private Callback callback;
+    private boolean ready;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param session an {@link IoSession} which is associated with this future
+     */
+    public DefaultIoFuture( IoSession session )
+    {
+        this.session = session;
+        this.lock = this;
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    public DefaultIoFuture( IoSession session, Object lock )
+    {
+        if( lock == null )
+        {
+            throw new NullPointerException( "lock" );
+        }
+        this.session = session;
+        this.lock = lock;
+    }
+    
+    public IoSession getSession()
+    {
+        return session;
+    }
+    
+    public Object getLock()
+    {
+        return lock;
+    }
+    
+    public void join()
+    {
+        synchronized( lock )
+        {
+            while( !ready )
+            {
+                try
+                {
+                    lock.wait();
+                }
+                catch( InterruptedException e )
+                {
+                }
+            }
+        }
+    }
+
+    public boolean join( long timeoutInMillis )
+    {
+        long startTime = ( timeoutInMillis <= 0 ) ? 0 : System
+                .currentTimeMillis();
+        long waitTime = timeoutInMillis;
+        
+        synchronized( lock )
+        {
+            if( ready )
+            {
+                return ready;
+            }
+            else if( waitTime <= 0 )
+            {
+                return ready;
+            }
+
+            for( ;; )
+            {
+                try
+                {
+                    lock.wait( waitTime );
+                }
+                catch( InterruptedException e )
+                {
+                }
+
+                if( ready )
+                    return true;
+                else
+                {
+                    waitTime = timeoutInMillis - ( System.currentTimeMillis() - startTime );
+                    if( waitTime <= 0 )
+                    {
+                        return ready;
+                    }
+                }
+            }
+        }
+    }
+
+    public boolean isReady()
+    {
+        synchronized( lock )
+        {
+            return ready;
+        }
+    }
+
+    /**
+     * Sets the result of the asynchronous operation, and mark it as finished.
+     */
+    protected void setValue( Object newValue )
+    {
+        synchronized( lock )
+        {
+            // Allow only once.
+            if( ready )
+            {
+                return;
+            }
+
+            result = newValue;
+            ready = true;
+            lock.notifyAll();
+    
+            if( callback != null )
+            {
+                invokeCallback();
+            }
+        }
+    }
+
+    /**
+     * Returns the result of the asynchronous operation.
+     */
+    protected Object getValue()
+    {
+        synchronized( lock )
+        {
+            return result;
+        }
+    }
+    
+    public Callback getCallback()
+    {
+        synchronized( lock )
+        {
+            return callback;
+        }
+    }
+    
+    public void setCallback( Callback callback ) 
+    {
+        if( callback == null )
+        {
+            throw new NullPointerException( "callback" );
+        }
+
+        synchronized( lock )
+        {
+            this.callback = callback;
+            if( ready )
+            {
+                invokeCallback();
+            }
+        }
+    }
+
+    private void invokeCallback()
+    {
+        callback.operationComplete( this );
+    }
+}

Propchange: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultWriteFuture.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultWriteFuture.java?rev=407136&view=auto
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultWriteFuture.java (added)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultWriteFuture.java Tue May 16 20:18:15 2006
@@ -0,0 +1,84 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common.support;
+
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteFuture;
+
+/**
+ * A default implementation of {@link WriteFuture}.
+ * 
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ * @version $Rev$, $Date$
+ */
+public class DefaultWriteFuture extends DefaultIoFuture implements WriteFuture
+{
+    /**
+     * Returns a new {@link DefaultWriteFuture} which is already marked as 'written'.
+     */
+    public static WriteFuture newWrittenFuture( IoSession session )
+    {
+        DefaultWriteFuture unwrittenFuture = new DefaultWriteFuture( session );
+        unwrittenFuture.setWritten( true );
+        return unwrittenFuture;
+    }
+
+    /**
+     * Returns a new {@link DefaultWriteFuture} which is already marked as 'not written'.
+     */
+    public static WriteFuture newNotWrittenFuture( IoSession session )
+    {
+        DefaultWriteFuture unwrittenFuture = new DefaultWriteFuture( session );
+        unwrittenFuture.setWritten( false );
+        return unwrittenFuture;
+    }
+    
+    /**
+     * Creates a new instance.
+     */
+    public DefaultWriteFuture( IoSession session )
+    {
+        super( session );
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    public DefaultWriteFuture( IoSession session, Object lock )
+    {
+        super( session, lock );
+    }
+    
+    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/trunks/mina/core/src/main/java/org/apache/mina/common/support/DefaultWriteFuture.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/StreamWriteFilter.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/StreamWriteFilter.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/StreamWriteFilter.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/StreamWriteFilter.java Tue May 16 20:18:15 2006
@@ -34,8 +34,8 @@
  * from the stream into {@link ByteBuffer} objects and write those buffers
  * to the next filter. When end of stream has been reached this filter will
  * call {@link NextFilter#messageSent(IoSession, Object)} using the original
- * {@link InputStream} written to the session and call 
- * {@link org.apache.mina.common.WriteFuture#setWritten(boolean)} on the 
+ * {@link InputStream} written to the session and notifies 
+ * {@link org.apache.mina.common.WriteFuture} on the 
  * original {@link org.apache.mina.common.IoFilter.WriteRequest}.
  * <p>
  * This filter will ignore written messages which aren't {@link InputStream}

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Tue May 16 20:18:15 2006
@@ -25,6 +25,7 @@
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.WriteFuture;
+import org.apache.mina.common.support.DefaultWriteFuture;
 import org.apache.mina.filter.codec.support.SimpleProtocolDecoderOutput;
 import org.apache.mina.filter.codec.support.SimpleProtocolEncoderOutput;
 import org.apache.mina.util.Queue;
@@ -382,7 +383,7 @@
             }
             else
             {
-                future = new WriteFuture();
+                future = new DefaultWriteFuture( session );
                 nextFilter.filterWrite( session, new WriteRequest( buf, future ) );
             }
             return future;

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java Tue May 16 20:18:15 2006
@@ -18,15 +18,6 @@
  */
 package org.apache.mina.transport.socket.nio;
 
-import org.apache.mina.common.ConnectFuture;
-import org.apache.mina.common.ExceptionMonitor;
-import org.apache.mina.common.IoConnector;
-import org.apache.mina.common.IoConnectorConfig;
-import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.IoServiceConfig;
-import org.apache.mina.common.support.BaseIoConnector;
-import org.apache.mina.util.Queue;
-
 import java.io.IOException;
 import java.net.ConnectException;
 import java.net.InetSocketAddress;
@@ -39,6 +30,16 @@
 import java.util.Iterator;
 import java.util.Set;
 
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.ExceptionMonitor;
+import org.apache.mina.common.IoConnector;
+import org.apache.mina.common.IoConnectorConfig;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.support.BaseIoConnector;
+import org.apache.mina.common.support.DefaultConnectFuture;
+import org.apache.mina.util.Queue;
+
 /**
  * {@link IoConnector} for socket transport (TCP/IP).
  *
@@ -165,7 +166,7 @@
             {
                 SocketSessionImpl session = newSession( ch, handler, config );
                 success = true;
-                ConnectFuture future = new ConnectFuture();
+                DefaultConnectFuture future = new DefaultConnectFuture();
                 future.setSession( session );
                 return future;
             }
@@ -174,7 +175,7 @@
         }
         catch( IOException e )
         {
-            return ConnectFuture.newFailedFuture( e );
+            return DefaultConnectFuture.newFailedFuture( e );
         }
         finally
         {
@@ -209,7 +210,7 @@
                     ExceptionMonitor.getInstance().exceptionCaught( e2 );
                 }
 
-                return ConnectFuture.newFailedFuture( e );
+                return DefaultConnectFuture.newFailedFuture( e );
             }
         }
 
@@ -450,7 +451,7 @@
         }
     }
 
-    private class ConnectionRequest extends ConnectFuture
+    private class ConnectionRequest extends DefaultConnectFuture
     {
         private final SocketChannel channel;
         private final long deadline;

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java Tue May 16 20:18:15 2006
@@ -35,6 +35,7 @@
 import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.common.support.BaseIoConnector;
+import org.apache.mina.common.support.DefaultConnectFuture;
 import org.apache.mina.transport.socket.nio.DatagramConnectorConfig;
 import org.apache.mina.transport.socket.nio.DatagramSessionConfig;
 import org.apache.mina.util.Queue;
@@ -130,7 +131,7 @@
         }
         catch( IOException e )
         {
-            return ConnectFuture.newFailedFuture( e );
+            return DefaultConnectFuture.newFailedFuture( e );
         }
         finally
         {
@@ -167,7 +168,7 @@
                     ExceptionMonitor.getInstance().exceptionCaught( e2 );
                 }
 
-                return ConnectFuture.newFailedFuture( e );
+                return DefaultConnectFuture.newFailedFuture( e );
             }
             
             synchronized( registerQueue )
@@ -612,6 +613,7 @@
                 {
                     ExceptionMonitor.getInstance().exceptionCaught( e );
                 }
+                
                 session.getCloseFuture().setClosed();
                 key.cancel();
                 selector.wakeup(); // wake up again to trigger thread death
@@ -619,7 +621,7 @@
         }
     }
 
-    private static class RegistrationRequest extends ConnectFuture
+    private static class RegistrationRequest extends DefaultConnectFuture
     {
         private final DatagramChannel channel;
         private final IoHandler handler;

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java Tue May 16 20:18:15 2006
@@ -28,6 +28,7 @@
 import org.apache.mina.common.support.BaseIoConnector;
 import org.apache.mina.common.support.BaseIoConnectorConfig;
 import org.apache.mina.common.support.BaseIoSessionConfig;
+import org.apache.mina.common.support.DefaultConnectFuture;
 import org.apache.mina.transport.vmpipe.support.VmPipe;
 import org.apache.mina.transport.vmpipe.support.VmPipeSessionImpl;
 import org.apache.mina.util.AnonymousSocketAddress;
@@ -73,11 +74,11 @@
         VmPipe entry = ( VmPipe ) VmPipeAcceptor.boundHandlers.get( address );
         if( entry == null )
         {
-            return ConnectFuture.newFailedFuture(
+            return DefaultConnectFuture.newFailedFuture(
                     new IOException( "Endpoint unavailable: " + address ) );
         }
 
-        ConnectFuture future = new ConnectFuture();
+        DefaultConnectFuture future = new DefaultConnectFuture();
         try
         {
             VmPipeSessionImpl session =

Copied: directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java (from r407121, directory/trunks/mina/core/src/test/java/org/apache/mina/common/FutureTest.java)
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java?p2=directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java&p1=directory/trunks/mina/core/src/test/java/org/apache/mina/common/FutureTest.java&r1=407121&r2=407136&rev=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/common/FutureTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java Tue May 16 20:18:15 2006
@@ -16,17 +16,23 @@
  *   limitations under the License.
  *
  */
-package org.apache.mina.common;
+package org.apache.mina.common.support;
 
 import java.io.IOException;
 import java.net.SocketAddress;
 
 import junit.framework.TestCase;
 
-import org.apache.mina.common.support.BaseIoSession;
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.IoFuture;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoSessionConfig;
+import org.apache.mina.common.TransportType;
 
 /**
- * Tests {@link IoFuture}s.
+ * Tests {@link IoFuture} implementations.
  * 
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$ 
@@ -36,7 +42,7 @@
     
     public void testCloseFuture() throws Exception
     {
-        CloseFuture future = new CloseFuture();
+        DefaultCloseFuture future = new DefaultCloseFuture( null );
         assertFalse( future.isReady() );
         assertFalse( future.isClosed() );
         
@@ -53,7 +59,7 @@
     
     public void testConnectFuture() throws Exception
     {
-        ConnectFuture future = new ConnectFuture();
+        DefaultConnectFuture future = new DefaultConnectFuture();
         assertFalse( future.isReady() );
         assertFalse( future.isConnected() );
         assertNull( future.getSession() );
@@ -131,7 +137,7 @@
         assertTrue( future.isConnected() );
         assertEquals( session, future.getSession() );
         
-        future = new ConnectFuture();
+        future = new DefaultConnectFuture();
         thread = new TestThread( future );
         thread.start();
         future.setException( new IOException() );
@@ -146,14 +152,14 @@
             future.getSession();
             fail( "IOException should be thrown." );
         }
-        catch( IOException e )
+        catch( Exception e )
         {
         }
     }
     
     public void testWriteFuture() throws Exception
     {
-        WriteFuture future = new WriteFuture();
+        DefaultWriteFuture future = new DefaultWriteFuture( null );
         assertFalse( future.isReady() );
         assertFalse( future.isWritten() );
         
@@ -167,7 +173,7 @@
         assertTrue( future.isReady() );
         assertTrue( future.isWritten() );
 
-        future = new WriteFuture();
+        future = new DefaultWriteFuture( null );
         thread = new TestThread( future );
         thread.start();
         

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/filter/StreamWriteFilterTest.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/test/java/org/apache/mina/filter/StreamWriteFilterTest.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/filter/StreamWriteFilterTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/filter/StreamWriteFilterTest.java Tue May 16 20:18:15 2006
@@ -37,6 +37,7 @@
 import org.apache.mina.common.WriteFuture;
 import org.apache.mina.common.IoFilter.NextFilter;
 import org.apache.mina.common.IoFilter.WriteRequest;
+import org.apache.mina.common.support.DefaultWriteFuture;
 import org.apache.mina.transport.socket.nio.SocketAcceptor;
 import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
 import org.apache.mina.transport.socket.nio.SocketConnector;
@@ -78,7 +79,7 @@
         StreamWriteFilter filter = new StreamWriteFilter();
         
         InputStream stream = new ByteArrayInputStream( new byte[ 0 ] );
-        WriteRequest writeRequest = new WriteRequest( stream );
+        WriteRequest writeRequest = new WriteRequest( stream, new DummyWriteFuture() );
         
         /*
          * Record expectations
@@ -111,7 +112,7 @@
         StreamWriteFilter filter = new StreamWriteFilter();
         
         Object message = new Object();
-        WriteRequest writeRequest = new WriteRequest( message );
+        WriteRequest writeRequest = new WriteRequest( message, new DummyWriteFuture() );
         
         /*
          * Record expectations
@@ -135,8 +136,6 @@
          */
         mockNextFilter.verify();
         mockSession.verify();
-        
-        assertTrue( writeRequest.getFuture().isWritten() );
     }
     
     /**
@@ -149,7 +148,7 @@
         byte[] data = new byte[] { 1, 2, 3, 4 };
         
         InputStream stream = new ByteArrayInputStream( data );
-        WriteRequest writeRequest = new WriteRequest( stream );
+        WriteRequest writeRequest = new WriteRequest( stream, new DummyWriteFuture() );
         
         /*
          * Record expectations
@@ -203,7 +202,7 @@
         byte[] chunk3 = new byte[] { 9, 10 };
         
         InputStream stream = new ByteArrayInputStream( data );
-        WriteRequest writeRequest = new WriteRequest( stream );
+        WriteRequest writeRequest = new WriteRequest( stream, new DummyWriteFuture() );
         
         /*
          * Record expectations
@@ -275,7 +274,7 @@
         mockNextFilter.replay();
         mockSession.replay();
 
-        WriteRequest wr = new WriteRequest( new Object() );
+        WriteRequest wr = new WriteRequest( new Object(), new DummyWriteFuture() );
         filter.filterWrite( nextFilter, session, wr );
         assertEquals( 1, queue.size() );
         assertSame( wr, queue.pop() );
@@ -292,9 +291,9 @@
         StreamWriteFilter filter = new StreamWriteFilter();
 
         WriteRequest wrs[] = new WriteRequest[] { 
-                new WriteRequest( new Object() ),
-                new WriteRequest( new Object() ),
-                new WriteRequest( new Object() )
+                new WriteRequest( new Object(), new DummyWriteFuture() ),
+                new WriteRequest( new Object(), new DummyWriteFuture() ),
+                new WriteRequest( new Object(), new DummyWriteFuture() )
         };
         Queue queue = new Queue();
         queue.push( wrs[ 0 ] );
@@ -312,7 +311,7 @@
         session.removeAttribute( StreamWriteFilter.CURRENT_STREAM );
         mockSession.setReturnValue( stream );
         session.removeAttribute( StreamWriteFilter.INITIAL_WRITE_FUTURE );
-        mockSession.setReturnValue( new WriteFuture() );
+        mockSession.setReturnValue( new DefaultWriteFuture( session ) );
         session.removeAttribute( StreamWriteFilter.WRITE_REQUEST_QUEUE );
         mockSession.setReturnValue( queue );
         
@@ -579,6 +578,55 @@
                     && w1.getFuture().isWritten() == w2.getFuture().isWritten();
             }
             return super.argumentMatches( expected, actual );
+        }
+    }
+    
+    private static class DummyWriteFuture implements WriteFuture
+    {
+        private boolean written;
+        
+        public boolean isWritten()
+        {
+            return written;
+        }
+
+        public void setWritten( boolean written )
+        {
+            this.written = written;
+        }
+        
+        public IoSession getSession()
+        {
+            return null;
+        }
+
+        public Object getLock()
+        {
+            return this;
+        }
+
+        public void join()
+        {
+        }
+
+        public boolean join( long timeoutInMillis )
+        {
+            return true;
+        }
+
+        public boolean isReady()
+        {
+            return true;
+        }
+
+        public Callback getCallback()
+        {
+            return null;
+        }
+
+        public void setCallback( Callback callback )
+        {
+            throw new IllegalStateException( "You can't set a callback for a dummy future." );
         }
     }
 }

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/test/java/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java?rev=407136&r1=407135&r2=407136&view=diff
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java Tue May 16 20:18:15 2006
@@ -18,6 +18,7 @@
 import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.common.support.AbstractIoFilterChain;
 import org.apache.mina.common.support.BaseIoSession;
+import org.apache.mina.common.support.DefaultWriteFuture;
 
 public class ThreadPoolFilterRegressionTest extends TestCase
 {
@@ -118,7 +119,7 @@
             WriteFuture future = null;
             for( int j = end; j >= 0; j-- )
             {
-                future = new WriteFuture();
+                future = new DefaultWriteFuture( sessions[ j ] );
                 filter.messageReceived( nextFilter, sessions[ j ], future );
             }
             
@@ -351,7 +352,7 @@
 
         public void messageReceived( IoSession session, Object message )
         {
-            ( ( WriteFuture ) message ).setWritten( true );
+            ( ( DefaultWriteFuture ) message ).setWritten( true );
         }
 
         public void messageSent( IoSession session, Object message )