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/09/08 05:38:21 UTC

svn commit: r441365 - in /directory/trunks/mina: core/src/main/java/org/apache/mina/common/ core/src/main/java/org/apache/mina/common/support/ core/src/main/java/org/apache/mina/filter/ core/src/main/java/org/apache/mina/filter/executor/ core/src/test/...

Author: trustin
Date: Thu Sep  7 20:38:20 2006
New Revision: 441365

URL: http://svn.apache.org/viewvc?view=rev&rev=441365
Log:
Resolved issue: DIRMINA-245 (MINA does not fire read events)
Resolved issue: DIRMINA-260 (Utilize backport-util-concurrent Executor)
* Renamed:
** ThreadPoolFilter -> ExecutorFilter
** PooledThreadModel -> ExecutorThreadModel
** org.apache.mina.filter.thread -> org.apache.mina.filter.executor


Added:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/ExecutorThreadModel.java
      - copied, changed from r441348, directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java
      - copied, changed from r441348, directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilter.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilterMBean.java
      - copied, changed from r441348, directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilterMBean.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
      - copied, changed from r441349, directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ThreadPoolFilterRegressionTest.java
    directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorExecutor.java
      - copied, changed from r441348, directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorThreadPool.java
Removed:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/LeaderFollowersThreadPool.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPool.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilter.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilterMBean.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ThreadPoolFilterRegressionTest.java
    directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorThreadPool.java
Modified:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceConfig.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/filter/ReadThrottleFilterBuilder.java

Copied: directory/trunks/mina/core/src/main/java/org/apache/mina/common/ExecutorThreadModel.java (from r441348, directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java)
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/ExecutorThreadModel.java?view=diff&rev=441365&p1=directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java&r1=441348&p2=directory/trunks/mina/core/src/main/java/org/apache/mina/common/ExecutorThreadModel.java&r2=441365
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/ExecutorThreadModel.java Thu Sep  7 20:38:20 2006
@@ -22,62 +22,53 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.mina.filter.executor.ThreadPool;
-import org.apache.mina.filter.executor.ThreadPoolFilter;
+import org.apache.mina.filter.executor.ExecutorFilter;
+
+import edu.emory.mathcs.backport.java.util.concurrent.Executor;
+import edu.emory.mathcs.backport.java.util.concurrent.ThreadFactory;
+import edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor;
+import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * A {@link ThreadModel} which represents a thread model with an independant
- * thread pool per service.
- * <p>
- * Please note that reusing an instance of this model means a thread pool
- * is shared among multiple services.  If don't want to shared a thread pool,
- * please create each instance of this model whenever you bind a service or
- * connect to a remote service.
- * </p>
+ * A {@link ThreadModel} which represents a thread model with an {@link Executor}
+ * (from <a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">backport-util-concurrent</a>)
+ * per service.  The default underlying {@link Executor} is {@link ThreadPoolExecutor},
+ * so you can safely downcast the returned {@link Executor} of {@link #getExecutor()} to
+ * {@link ThreadPoolExecutor} by default.
  * 
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev$, $Date$
  */
-public class PooledThreadModel implements ThreadModel
+public class ExecutorThreadModel implements ThreadModel
 {
     /**
-     * @see ThreadPool#DEFAULT_MAXIMUM_POOL_SIZE
-     */
-    public static final int DEFAULT_MAXIMUM_POOL_SIZE = ThreadPool.DEFAULT_MAXIMUM_POOL_SIZE;
-
-    /**
-     * @see ThreadPool#DEFAULT_KEEP_ALIVE_TIME
-     */
-    public static final int DEFAULT_KEEP_ALIVE_TIME = ThreadPool.DEFAULT_KEEP_ALIVE_TIME;
-    
-    /**
      * Maps a service name to a PooledThreadModel instance.
      * Without this map, we might create extremely many thread pools that leads the system to
      * coma. */
     private static final Map service2model = new HashMap();
     
     /**
-     * Returns a {@link PooledThreadModel} instance for the specified <tt>serviceName</tt>.
+     * Returns a {@link ExecutorThreadModel} instance for the specified <tt>serviceName</tt>.
      * Please note that all returned instances will be managed globally; the same instance
      * will be returned if you specified the same service name.  Please try to specify
      * different names for different services.
      * 
      * @param serviceName the name of the service that needs thread pooling
      */
-    public static PooledThreadModel getInstance( String serviceName )
+    public static ExecutorThreadModel getInstance( String serviceName )
     {
         if( serviceName == null )
         {
             throw new NullPointerException( "serviceName" );
         }
 
-        PooledThreadModel model;
+        ExecutorThreadModel model;
         synchronized( service2model )
         {
-            model = ( PooledThreadModel ) service2model.get( serviceName );
+            model = ( ExecutorThreadModel ) service2model.get( serviceName );
             if( model == null )
             {
-                model = new PooledThreadModel( serviceName );
+                model = new ExecutorThreadModel( serviceName );
                 service2model.put( serviceName, model );
             }
         }
@@ -85,42 +76,67 @@
         return model;
     }
     
-    private ThreadPoolFilter filter = new ThreadPoolFilter();
+    private final String threadNamePrefix;
+    private final ExecutorFilter defaultFilter;
+    private ExecutorFilter filter = new ExecutorFilter();
 
-    private PooledThreadModel( String threadNamePrefix )
+    private ExecutorThreadModel( String threadNamePrefix )
     {
-        this( threadNamePrefix, DEFAULT_MAXIMUM_POOL_SIZE );
-    }
+        this.threadNamePrefix = threadNamePrefix;
+        
+        // Create the default filter
+        defaultFilter = new ExecutorFilter();
+        ThreadPoolExecutor tpe = ( ThreadPoolExecutor ) defaultFilter.getExecutor();
+        final ThreadFactory originalThreadFactory = tpe.getThreadFactory();
+        ThreadFactory newThreadFactory = new ThreadFactory()
+        {
+            private final AtomicInteger threadId = new AtomicInteger( 0 );
 
-    private PooledThreadModel( String threadNamePrefix, int maxThreads )
-    {
-        getThreadPool().setMaximumPoolSize( maxThreads );
-        getThreadPool().setThreadNamePrefix( threadNamePrefix );
+            public Thread newThread( Runnable runnable )
+            {
+                Thread t = originalThreadFactory.newThread( runnable );
+                t.setName( ExecutorThreadModel.this.threadNamePrefix + '-' + threadId.incrementAndGet() );
+                t.setDaemon( true );
+                return t;
+            }
+        };
+        tpe.setThreadFactory( newThreadFactory );
+        
+        // Set to default.
+        setExecutor( null );
     }
 
     /**
-     * Returns the underlying {@link ThreadPool} of this model.
+     * Returns the underlying {@link Executor} of this model.
      * You can change various properties such as the number of threads
-     * by calling methods of {@link ThreadPool}.
+     * by calling methods of the {@link Executor} implementation.
      */
-    public ThreadPool getThreadPool()
+    public Executor getExecutor()
     {
-        return filter.getThreadPool();
+        return filter.getExecutor();
     }
     
     /**
-     * Changes the underlying {@link ThreadPool} of this model.
-     * Previous settings such as thread name prefix and the number
-     * of threads should be configured again. Only newly created
-     * {@link IoSession}s will be affected.
+     * Changes the underlying {@link Executor} of this model.
+     * Previous settings such as the number of threads should be configured again.
+     * Only newly created {@link IoSession}s will be affected.
+     * 
+     * @param executor <tt>null</tt> to revert to the default setting
      */
-    public void setThreadPool( ThreadPool threadPool )
+    public void setExecutor( Executor executor )
     {
-        filter = new ThreadPoolFilter( threadPool );
+        if( executor == null )
+        {
+            filter = defaultFilter;
+        }
+        else
+        {
+            filter = new ExecutorFilter( executor );
+        }
     }
 
     public void buildFilterChain( IoFilterChain chain ) throws Exception
     {
-        chain.addFirst( PooledThreadModel.class.getName(), filter );
+        chain.addFirst( ExecutorThreadModel.class.getName(), filter );
     }
 }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceConfig.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceConfig.java?view=diff&rev=441365&r1=441364&r2=441365
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceConfig.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceConfig.java Thu Sep  7 20:38:20 2006
@@ -63,10 +63,10 @@
     
     /**
      * Returns the default {@link ThreadModel} of the {@link IoService}.
-     * The default value is a {@link PooledThreadModel}() whose service name is
+     * The default value is a {@link ExecutorThreadModel}() whose service name is
      * <tt>'AnonymousIoService'</tt> and which has 16 maximum active threads.
-     * It is strongly recommended to set a new {@link PooledThreadModel} by calling
-     * {@link PooledThreadModel#getInstance(String)}.
+     * It is strongly recommended to set a new {@link ExecutorThreadModel} by calling
+     * {@link ExecutorThreadModel#getInstance(String)}.
      */
     ThreadModel getThreadModel();
     
@@ -74,10 +74,10 @@
      * Sets the default {@link ThreadModel} of the {@link IoService}.
      * If you specify <tt>null</tt>, this property will be set to the
      * default value.
-     * The default value is a {@link PooledThreadModel}() whose service name is
+     * The default value is a {@link ExecutorThreadModel}() whose service name is
      * <tt>'AnonymousIoService'</tt> and which has 16 maximum active threads.
-     * It is strongly recommended to set a new {@link PooledThreadModel} by calling
-     * {@link PooledThreadModel#getInstance(String)}.
+     * It is strongly recommended to set a new {@link ExecutorThreadModel} by calling
+     * {@link ExecutorThreadModel#getInstance(String)}.
      */
     void setThreadModel( ThreadModel threadModel );
     

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java?view=diff&rev=441365&r1=441364&r2=441365
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java Thu Sep  7 20:38:20 2006
@@ -24,7 +24,7 @@
 import org.apache.mina.common.DefaultIoFilterChainBuilder;
 import org.apache.mina.common.IoFilterChainBuilder;
 import org.apache.mina.common.IoServiceConfig;
-import org.apache.mina.common.PooledThreadModel;
+import org.apache.mina.common.ExecutorThreadModel;
 import org.apache.mina.common.ThreadModel;
 
 /**
@@ -43,7 +43,7 @@
     /**
      * The default thread model.
      */
-    private final ThreadModel defaultThreadModel = PooledThreadModel.getInstance("AnonymousIoService");
+    private final ThreadModel defaultThreadModel = ExecutorThreadModel.getInstance("AnonymousIoService");
     
     /**
      * Current thread model.

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/ReadThrottleFilterBuilder.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/ReadThrottleFilterBuilder.java?view=diff&rev=441365&r1=441364&r2=441365
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/ReadThrottleFilterBuilder.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/ReadThrottleFilterBuilder.java Thu Sep  7 20:38:20 2006
@@ -27,7 +27,7 @@
 import org.apache.mina.common.IoFilterAdapter;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.executor.ThreadPoolFilter;
+import org.apache.mina.filter.executor.ExecutorFilter;
 
 /**
  * This filter will automatically disable reads on an <code>IoSession</code> once the data batched for that session in
@@ -111,7 +111,7 @@
         {
             IoFilterChain.Entry entry = (IoFilterChain.Entry)i.next();
 
-            if( entry.getFilter().getClass().isAssignableFrom( ThreadPoolFilter.class ) )
+            if( entry.getFilter().getClass().isAssignableFrom( ExecutorFilter.class ) )
             {
                 return entry.getName();
             }

Copied: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java (from r441348, directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilter.java)
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java?view=diff&rev=441365&p1=directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilter.java&r1=441348&p2=directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java&r2=441365
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilter.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java Thu Sep  7 20:38:20 2006
@@ -25,77 +25,63 @@
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.IoFilterAdapter;
 import org.apache.mina.common.IoFilterChain;
-import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
+import org.apache.mina.common.ThreadModel;
 import org.apache.mina.util.ByteBufferUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import edu.emory.mathcs.backport.java.util.concurrent.Executor;
+import edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue;
+import edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor;
+import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
+
 /**
- * A Thread-pooling filter.  This filter forwards {@link IoHandler} events to its thread pool.
+ * A filter that forward events to {@link Executor} in
+ * <a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">backport-util-concurrent</a>.
+ * You can apply various thread model by inserting this filter to the {@link IoFilterChain}.
+ * This filter is usually inserted by {@link ThreadModel} automatically, so you don't need
+ * to add this filter in most cases.
  * <p>
- * Use the {@link #init()} and {@link #destroy()} methods to force this filter
- * to start/stop processing events. Alternatively, {@link #init()} will be
- * called automatically the first time an instance of this filter is added
- * to a filter chain. Calling {@link #destroy()} is not required either since
- * all workers are daemon threads which means that any workers still alive
- * when the JVM terminates will die automatically.
+ * Please note that this filter doesn't manage the life cycle of the underlying
+ * {@link Executor}.  You have to destroy or stop it by yourself.
  *
  * <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev: 350169 $, $Date: 2005-12-01 00:17:41 -0500 (Thu, 01 Dec 2005) $
  */
-public class ThreadPoolFilter extends IoFilterAdapter
+public class ExecutorFilter extends IoFilterAdapter
 {
-    private static final Logger logger = LoggerFactory.getLogger( ThreadPoolFilter.class.getName() );
-    private final ThreadPool threadPool;
+    private static final Logger logger = LoggerFactory.getLogger( ExecutorFilter.class.getName() );
+    private final Executor executor;
 
     /**
      * Creates a new instace with the default thread pool implementation
-     * (@link LeaderFollowersThreadPool}).
+     * (<tt>new ThreadPoolExecutor(16, 16, 60, TimeUnit.SECONDS, new LinkedBlockingQueue() )</tt>).
      */
-    public ThreadPoolFilter()
+    public ExecutorFilter()
     {
-        this( new LeaderFollowersThreadPool() );
+        this( new ThreadPoolExecutor(16, 16, 60, TimeUnit.SECONDS, new LinkedBlockingQueue() ) );
     }
     
     /**
-     * Creates a new instance with the specified <tt>threadPool</tt>.
+     * Creates a new instance with the specified <tt>executor</tt>.
      */
-    public ThreadPoolFilter( ThreadPool threadPool )
+    public ExecutorFilter( Executor executor )
     {
-        if( threadPool == null )
+        if( executor == null )
         {
-            throw new NullPointerException( "threadPool" );
+            throw new NullPointerException( "executor" );
         }
 
-        this.threadPool = threadPool;
-    }
-
-    public void init()
-    {
-        threadPool.init();
-    }
-
-    public void destroy()
-    {
-        threadPool.destroy();
-    }
-    
-    public void onPreAdd( IoFilterChain parent, String name, NextFilter nextFilter )
-            throws Exception
-    {
-        if( !getThreadPool().isStarted() )
-        {
-            init();
-        }
+        this.executor = executor;
     }
 
     /**
-     * Returns the underlying {@link ThreadPool} instance this filter uses.
+     * Returns the underlying {@link Executor} instance this filter uses.
      */
-    public ThreadPool getThreadPool()
+    public Executor getExecutor()
     {
-        return threadPool;
+        return executor;
     }
 
     private void fireEvent( NextFilter nextFilter, IoSession session,
@@ -114,7 +100,7 @@
                     logger.debug( "Launching thread for " + session.getRemoteAddress() );
                 }
 
-                threadPool.submit( new ProcessEventsRunnable( buf ) );
+                executor.execute( new ProcessEventsRunnable( buf ) );
             }
         }
     }

Copied: directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilterMBean.java (from r441348, directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilterMBean.java)
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilterMBean.java?view=diff&rev=441365&p1=directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilterMBean.java&r1=441348&p2=directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilterMBean.java&r2=441365
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ThreadPoolFilterMBean.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilterMBean.java Thu Sep  7 20:38:20 2006
@@ -19,7 +19,7 @@
  */
 package org.apache.mina.filter.executor;
 
-public interface ThreadPoolFilterMBean
+public interface ExecutorFilterMBean
 {
     String getThreadNamePrefix();
 

Copied: directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java (from r441349, directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ThreadPoolFilterRegressionTest.java)
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java?view=diff&rev=441365&p1=directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ThreadPoolFilterRegressionTest.java&r1=441349&p2=directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java&r2=441365
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ThreadPoolFilterRegressionTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java Thu Sep  7 20:38:20 2006
@@ -33,42 +33,29 @@
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.TransportType;
-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.AbstractIoFilterChain;
 import org.apache.mina.common.support.BaseIoSession;
-import org.apache.mina.common.support.DefaultWriteFuture;
-import org.apache.mina.filter.executor.ThreadPoolFilter;
 
-public class ThreadPoolFilterRegressionTest extends TestCase
-{
-    private static final IoFilterChain FILTER_PARENT = new AbstractIoFilterChain( new DummySession() )
-    {
-        protected void doWrite( IoSession session, WriteRequest writeRequest )
-        {
-        }
-        protected void doClose( IoSession session )
-        {
-        }
-    };
+import edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor;
+import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
 
-    private ThreadPoolFilter filter;
+public class ExecutorFilterRegressionTest extends TestCase
+{
+    private ExecutorFilter filter;
     
-    public ThreadPoolFilterRegressionTest()
+    public ExecutorFilterRegressionTest()
     {
     }
     
     public void setUp() throws Exception
     {
-        filter = new ThreadPoolFilter();
-        filter.init();
+        filter = new ExecutorFilter();
     }
     
     public void tearDown() throws Exception
     {
-        filter.destroy();
-        Assert.assertEquals( 0, filter.getThreadPool().getPoolSize() );
+        ( ( ThreadPoolExecutor ) filter.getExecutor() ).shutdown();
         filter = null;
     }
     
@@ -90,8 +77,8 @@
         };
         final int loop = 1000000;
         final int end = sessions.length - 1;
-        final ThreadPoolFilter filter = this.filter;
-        filter.getThreadPool().setKeepAliveTime( 3000 );
+        final ExecutorFilter filter = this.filter;
+        ( ( ThreadPoolExecutor ) filter.getExecutor() ).setKeepAliveTime( 3, TimeUnit.SECONDS );
         
         for( int i = 0; i < loop ; i++ )
         {
@@ -108,54 +95,14 @@
             }
         }
         
-        Thread.sleep( 3500 );
+        Thread.sleep( 1000 );
         
-        Assert.assertEquals( 1, filter.getThreadPool().getPoolSize() );
         for( int i = end; i >= 0; i-- )
         {
             Assert.assertEquals( loop - 1, sessions[ i ].lastCount.intValue() );
         }
     }
     
-    public void testShutdown() throws Exception
-    {
-        final IoSession[] sessions = new IoSession[]
-        {
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-            new DummySession(),
-        };
-        final int end = sessions.length - 1;
-        final NextFilter nextFilter = new DummyNextFilter();
-
-        for( int i = 0; i < 100000; i ++ )
-        {
-            if( i % 1000 == 0 )
-            {
-                System.out.println( "Shutdown: " + i );
-            }
-            
-            WriteFuture future = null;
-            for( int j = end; j >= 0; j-- )
-            {
-                future = new DefaultWriteFuture( sessions[ j ] );
-                filter.messageReceived( nextFilter, sessions[ j ], future );
-            }
-            
-            future.join();
-            
-            filter.onPostRemove( FILTER_PARENT, "", null );
-            filter.onPostAdd( FILTER_PARENT, "", null );
-        }
-    }
-    
     private static class EventOrderCounter extends BaseIoSession
     {
         private Integer lastCount = null;
@@ -292,120 +239,8 @@
         }
     }
     
-    private static class DummySession extends BaseIoSession
-    {
-        protected void updateTrafficMask()
-        {
-        }
-
-        public IoHandler getHandler()
-        {
-            return null;
-        }
-
-        public IoFilterChain getFilterChain()
-        {
-            return null;
-        }
-
-        public CloseFuture close()
-        {
-            return null;
-        }
-
-        public TransportType getTransportType()
-        {
-            return null;
-        }
-
-        public SocketAddress getRemoteAddress()
-        {
-            return null;
-        }
-
-        public SocketAddress getLocalAddress()
-        {
-            return null;
-        }
-
-        public int getScheduledWriteRequests()
-        {
-            return 0;
-        }
-
-        public boolean isClosing()
-        {
-            return false;
-        }
-
-        public IoService getService()
-        {
-            return null;
-        }
-
-        public IoServiceConfig getServiceConfig()
-        {
-            return null;
-        }
-
-        public IoSessionConfig getConfig()
-        {
-            return null;
-        }
-
-        public SocketAddress getServiceAddress()
-        {
-            return null;
-        }
-
-        public int getScheduledWriteBytes()
-        {
-            return 0;
-        }
-    }
-    
-    private static class DummyNextFilter implements NextFilter
-    {
-        public void sessionCreated( IoSession session )
-        {
-        }
-
-        public void sessionOpened( IoSession session )
-        {
-        }
-
-        public void sessionClosed( IoSession session )
-        {
-        }
-
-        public void sessionIdle( IoSession session, IdleStatus status )
-        {
-        }
-
-        public void exceptionCaught( IoSession session, Throwable cause )
-        {
-        }
-
-        public void messageReceived( IoSession session, Object message )
-        {
-            ( ( DefaultWriteFuture ) message ).setWritten( true );
-        }
-
-        public void messageSent( IoSession session, Object message )
-        {
-        }
-
-        public void filterWrite( IoSession session, WriteRequest writeRequest )
-        {
-        }
-
-        public void filterClose( IoSession session )
-        {
-        }
-    }
-    
     public static void main( String[] args )
     {
-        junit.textui.TestRunner.run( ThreadPoolFilterRegressionTest.class );
+        junit.textui.TestRunner.run( ExecutorFilterRegressionTest.class );
     }
 }

Copied: directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorExecutor.java (from r441348, directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorThreadPool.java)
URL: http://svn.apache.org/viewvc/directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorExecutor.java?view=diff&rev=441365&p1=directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorThreadPool.java&r1=441348&p2=directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorExecutor.java&r2=441365
==============================================================================
--- directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorThreadPool.java (original)
+++ directory/trunks/mina/java5/src/main/java/org/apache/mina/filter/executor/ExecutorExecutor.java Thu Sep  7 20:38:20 2006
@@ -19,29 +19,23 @@
  */
 package org.apache.mina.filter.executor;
 
-import java.util.concurrent.Executor;
-
-import org.apache.mina.filter.executor.ThreadPool;
+import edu.emory.mathcs.backport.java.util.concurrent.Executor;
 
 /**
- * {@link ThreadPool} implementation that hands excecution off to an
- * {@link Executor}.  This pool doesn't manage the life cycle of the
- * underlying {@link Executor} at all.  {@link #isStarted()} will always
- * return <tt>true</tt>.  Other properties won't be supported, either.
- * Please get the underlying {@link Executor} by calling {@link #getExecutor()}
- * to adjust implementation-specific parameters.
+ * A <a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">backport-util-concurrent</a>
+ * {@link Executor} which adapts Java 5 <tt>java.util.concurrent.</tt>{@link java.util.concurrent.Executor}.
  *
  * @author The Apache Directory Project (mina-dev@directory.apache.org)
  * @version $Rev: 400068 $, $Date: 2006-05-05 12:56:58Z $
  */
-public class ExecutorThreadPool implements ThreadPool
+public class ExecutorExecutor implements Executor
 {
-    private final Executor executor;
+    private final java.util.concurrent.Executor executor;
 
     /**
      * Creates a new instance with the specified <tt>executor</tt>.
      */
-    public ExecutorThreadPool( Executor executor )
+    public ExecutorExecutor( java.util.concurrent.Executor executor )
     {
         this.executor = executor;
     }
@@ -49,58 +43,13 @@
     /**
      * Returns the underlying executor this thread pool wraps.
      */
-    public Executor getExecutor()
+    public java.util.concurrent.Executor getExecutor()
     {
         return executor;
     }
 
-    public void init()
-    {
-    }
-
-    public void destroy()
-    {
-    }
-
-    public void submit( Runnable runnable )
+    public void execute( Runnable runnable )
     {
         executor.execute( runnable );
-    }
-
-    public boolean isStarted()
-    {
-        return true;
-    }
-
-    public String getThreadNamePrefix()
-    {
-        return null;
-    }
-
-    public void setThreadNamePrefix( String threadNamePrefix )
-    {
-    }
-
-    public int getPoolSize()
-    {
-        return -1;
-    }
-
-    public int getMaximumPoolSize()
-    {
-        return -1;
-    }
-
-    public int getKeepAliveTime()
-    {
-        return -1;
-    }
-
-    public void setMaximumPoolSize( int maximumPoolSize )
-    {
-    }
-
-    public void setKeepAliveTime( int keepAliveTime )
-    {
     }
 }