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/05 12:14:54 UTC

svn commit: r440315 - in /directory/trunks/mina/core/src: main/java/org/apache/mina/common/ main/java/org/apache/mina/common/support/ main/java/org/apache/mina/transport/socket/nio/ main/java/org/apache/mina/transport/socket/nio/support/ main/java/org/...

Author: trustin
Date: Tue Sep  5 03:14:53 2006
New Revision: 440315

URL: http://svn.apache.org/viewvc?view=rev&rev=440315
Log:
* Added IoSession.getServiceConfig()
* Added many methods to IoService
** add/removeListener( IoSericeListener )
** getManagedServiceAddresses() - this replaces IoAcceptor.getBoundAddresses()
** isManaged( SocketAddress ) - this replaces IoAcceptor.isBound()
** getManagedSessions( SocketAddress ) is retained as before
* Added IoServiceListener which listens to any changes in IoService and IoSession life cycle
* Added IoServiceListenerSupport which helps the implementation of IoServiceListener event notification for all transports
* Added IoServiceListenerSupportTest

Added:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceListener.java   (with props)
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java   (with props)
    directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/IoServiceListenerSupportTest.java   (with props)
Modified:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoAcceptor.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoService.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoSession.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoService.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/common/support/DelegatedIoAcceptor.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoConnector.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.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/SocketIoProcessor.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketSessionImpl.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.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/socket/nio/support/DatagramSessionImpl.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/common/IoFilterChainTest.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/filter/thread/ThreadPoolFilterRegressionTest.java
    directory/trunks/mina/core/src/test/java/org/apache/mina/handler/chain/ChainedIoHandlerTest.java

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoAcceptor.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoAcceptor.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoAcceptor.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoAcceptor.java Tue Sep  5 03:14:53 2006
@@ -21,7 +21,6 @@
 
 import java.io.IOException;
 import java.net.SocketAddress;
-import java.util.Set;
 
 /**
  * Accepts incoming connection, communicates with clients, and fires events to
@@ -71,21 +70,6 @@
      * Unbinds all addresses which were bound by this acceptor.
      */
     void unbindAll();
-    
-    /**
-     * Returns <tt>true</tt> if and only if the specified <tt>address</tt> is
-     * bound by this acceptor.
-     */
-    boolean isBound( SocketAddress address );
-    
-    /**
-     * Returns a set of {@link SocketAddress} objects representing the addresses 
-     * which have been bound by this acceptor.
-     * 
-     * @return the set of {@link SocketAddress} objects or an empty set if 
-     *         nothing has been bound.
-     */
-    Set getBoundAddresses();
     
     /**
      * (Optional) Returns an {@link IoSession} that is bound to the specified

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoService.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoService.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoService.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoService.java Tue Sep  5 03:14:53 2006
@@ -33,19 +33,46 @@
 public interface IoService
 {
     /**
+     * Adds an {@link IoServiceListener} that listens any events related with
+     * this service.
+     */
+    void addListener( IoServiceListener listener );
+    
+    /**
+     * Removed an existing {@link IoServiceListener} that listens any events
+     * related with this service.
+     */
+    void removeListener( IoServiceListener listener );
+    
+    /**
+     * Returns all {@link SocketAddress}es this service is managing.
+     * If this service is an {@link IoAcceptor}, a set of bind addresses will
+     * be returned.  If this service is an {@link IoConnector}, a set of remote
+     * addresses will be returned.
+     */
+    Set getManagedServiceAddresses();
+    
+    /**
+     * Returns <tt>true</tt> if this service is managing the specified <tt>serviceAddress</tt>.
+     * If this service is an {@link IoAcceptor}, <tt>serviceAddress</tt> is a bind address.
+     * If this service is an {@link IoConnector}, <tt>serviceAddress</tt> is a remote address.
+     */
+    boolean isManaged( SocketAddress serviceAddress );
+    
+    /**
      * Returns all sessions with the specified remote or local address,
      * which are currently managed by this service.
      * {@link IoAcceptor} will assume the specified <tt>address</tt> is a local
      * address, and {@link IoConnector} will assume it's a remote address.
      * 
-     * @param address the address to return all sessions for.
+     * @param serviceAddress the address to return all sessions for.
      * @return the sessions. An empty collection if there's no session.
      * @throws IllegalArgumentException if the specified <tt>address</tt> has 
      *         not been bound.
      * @throws UnsupportedOperationException if this operation isn't supported
      *         for the particular transport type implemented by this {@link IoService}.
      */
-    Set getManagedSessions( SocketAddress address );
+    Set getManagedSessions( SocketAddress serviceAddress );
 
     /**
      * Returns the default configuration which is used when you didn't specify

Added: directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceListener.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceListener.java?view=auto&rev=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceListener.java (added)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoServiceListener.java Tue Sep  5 03:14:53 2006
@@ -0,0 +1,73 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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;
+
+import java.net.SocketAddress;
+import java.util.EventListener;
+
+/**
+ * Something interested in being notified when the result
+ * of an {@link IoFuture} becomes available.
+ * 
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ * @version $Rev$, $Date$
+ */
+public interface IoServiceListener extends EventListener
+{
+    /**
+     * Invoked when a new service is activated by an {@link IoService}.
+     * 
+     * @param service the {@link IoService}
+     * @param serviceAddress the socket address of the {@link IoService} listens
+     *                       to manage sessions.  If the service is an {@link IoAcceptor},
+     *                       it is a bind address.  If the service is an {@link IoConnector},
+     *                       it is a remote address.
+     * @param handler the {@link IoHandler} that serves the new service
+     * @param config  the {@link IoServiceConfig} of the new service
+     */
+    void serviceActivated( IoService service, SocketAddress serviceAddress, IoHandler handler, IoServiceConfig config );
+    
+    /**
+     * Invoked when a service is deactivated by an {@link IoService}.
+     * 
+     * @param service the {@link IoService}
+     * @param serviceAddress the socket address of the {@link IoService} listens
+     *                       to manage sessions.  If the service is an {@link IoAcceptor},
+     *                       it is a bind address.  If the service is an {@link IoConnector},
+     *                       it is a remote address.
+     * @param handler the {@link IoHandler} that serves the service
+     * @param config  the {@link IoServiceConfig} of the service
+     */
+    void serviceDeactivated( IoService service, SocketAddress serviceAddress, IoHandler handler, IoServiceConfig config );
+    
+    /**
+     * Invoked when a new session is created by an {@link IoService}.
+     * 
+     * @param session the new session
+     */
+    void sessionCreated( IoSession session );
+    
+    /**
+     * Invoked when a session is being destroyed by an {@link IoService}.
+     * 
+     * @param session the session to be destroyed
+     */
+    void sessionDestroyed( IoSession session );
+}

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

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoSession.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoSession.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoSession.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/IoSession.java Tue Sep  5 03:14:53 2006
@@ -54,6 +54,11 @@
      * Returns the {@link IoService} which provides I/O service to this session.
      */
     IoService getService();
+    
+    /**
+     * Returns the {@link IoServiceConfig} of this session.
+     */
+    IoServiceConfig getServiceConfig();
 
     /**
      * Returns the {@link IoHandler} which handles this session.

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoService.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoService.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoService.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoService.java Tue Sep  5 03:14:53 2006
@@ -25,6 +25,7 @@
 import org.apache.mina.common.DefaultIoFilterChainBuilder;
 import org.apache.mina.common.IoFilterChainBuilder;
 import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceListener;
 
 /**
  * Base implementation of {@link IoService}s.
@@ -39,13 +40,13 @@
      */
     private IoFilterChainBuilder filterChainBuilder = new DefaultIoFilterChainBuilder();
 
-    protected BaseIoService()
-    {
-    }
+    /**
+     * Maintains the {@link IoServiceListener}s of this service.
+     */
+    private final IoServiceListenerSupport listeners = new IoServiceListenerSupport();
     
-    public Set getManagedSessions( SocketAddress address )
+    protected BaseIoService()
     {
-        throw new UnsupportedOperationException();
     }
     
     public IoFilterChainBuilder getFilterChainBuilder()
@@ -73,5 +74,35 @@
             throw new IllegalStateException(
                     "Current filter chain builder is not a DefaultIoFilterChainBuilder." );
         }
+    }
+    
+    public void addListener( IoServiceListener listener )
+    {
+        getListeners().add( listener );
+    }
+    
+    public void removeListener( IoServiceListener listener )
+    {
+        getListeners().remove( listener );
+    }
+    
+    public Set getManagedServiceAddresses()
+    {
+        return getListeners().getManagedServiceAddresses();
+    }
+
+    public Set getManagedSessions( SocketAddress serviceAddress )
+    {
+        return getListeners().getManagedSessions( serviceAddress );
+    }
+
+    public boolean isManaged( SocketAddress serviceAddress )
+    {
+        return getListeners().isManaged( serviceAddress );
+    }
+
+    protected IoServiceListenerSupport getListeners()
+    {
+        return listeners;
     }
 }

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=440315&r1=440314&r2=440315
==============================================================================
--- 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 Tue Sep  5 03:14:53 2006
@@ -40,7 +40,11 @@
      */
     private IoFilterChainBuilder filterChainBuilder = new DefaultIoFilterChainBuilder();
     
+    /**
+     * The default thread model.
+     */
     private final ThreadModel defaultThreadModel = PooledThreadModel.getInstance("AnonymousIoService");
+    
     /**
      * Current thread model.
      */

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoAcceptor.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoAcceptor.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoAcceptor.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoAcceptor.java Tue Sep  5 03:14:53 2006
@@ -28,6 +28,7 @@
 import org.apache.mina.common.IoFilterChainBuilder;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.IoServiceListener;
 import org.apache.mina.common.IoSession;
 
 /**
@@ -76,19 +77,19 @@
         delegate.unbindAll();
     }
     
-    public boolean isBound( SocketAddress address )
+    public boolean isManaged( SocketAddress address )
     {
-        return delegate.isBound( address );
+        return delegate.isManaged( address );
     }
 
-    public Set getBoundAddresses()
+    public Set getManagedServiceAddresses()
     {
-        return delegate.getBoundAddresses();
+        return delegate.getManagedServiceAddresses();
     }
 
-    public Set getManagedSessions( SocketAddress address )
+    public Set getManagedSessions( SocketAddress serviceAddress )
     {
-        return delegate.getManagedSessions( address );
+        return delegate.getManagedSessions( serviceAddress );
     }
 
     public IoSession newSession( SocketAddress remoteAddress, SocketAddress localAddress )
@@ -114,5 +115,15 @@
     public DefaultIoFilterChainBuilder getFilterChain()
     {
         return delegate.getFilterChain();
+    }
+
+    public void addListener( IoServiceListener listener )
+    {
+        delegate.addListener( listener );
+    }
+
+    public void removeListener( IoServiceListener listener )
+    {
+        delegate.removeListener( listener );
     }
 }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoConnector.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoConnector.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoConnector.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/DelegatedIoConnector.java Tue Sep  5 03:14:53 2006
@@ -28,6 +28,7 @@
 import org.apache.mina.common.IoFilterChainBuilder;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.IoServiceListener;
 
 /**
  * A delegated {@link IoConnector} that wraps the other {@link IoConnector}.
@@ -77,9 +78,19 @@
         return delegate.connect( address, localAddress, handler, config );
     }
 
-    public Set getManagedSessions( SocketAddress address )
+    public boolean isManaged( SocketAddress serviceAddress )
     {
-        return delegate.getManagedSessions( address );
+        return delegate.isManaged( serviceAddress );
+    }
+    
+    public Set getManagedServiceAddresses()
+    {
+        return delegate.getManagedServiceAddresses();
+    }
+
+    public Set getManagedSessions( SocketAddress serviceAddress )
+    {
+        return delegate.getManagedSessions( serviceAddress );
     }
     
     public IoServiceConfig getDefaultConfig()
@@ -100,5 +111,15 @@
     public DefaultIoFilterChainBuilder getFilterChain()
     {
         return delegate.getFilterChain();
+    }
+
+    public void addListener( IoServiceListener listener )
+    {
+        delegate.addListener( listener );
+    }
+
+    public void removeListener( IoServiceListener listener )
+    {
+        delegate.removeListener( listener );
     }
 }

Added: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java?view=auto&rev=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java (added)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoServiceListenerSupport.java Tue Sep  5 03:14:53 2006
@@ -0,0 +1,339 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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 java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.mina.common.IoAcceptorConfig;
+import org.apache.mina.common.IoConnector;
+import org.apache.mina.common.IoFuture;
+import org.apache.mina.common.IoFutureListener;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.util.IdentityHashSet;
+
+/**
+ * A helper which provides addition and removal of {@link IoServiceListener}s and firing
+ * events.
+ * 
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ * @version $Rev$, $Date$
+ */
+public class IoServiceListenerSupport
+{
+    /**
+     * A list of {@link IoServiceListener}s.
+     */
+    private final List listeners = new ArrayList();
+
+    /**
+     * Tracks managed <tt>serviceAddress</tt>es.
+     */
+    private final Set managedServiceAddresses = new HashSet();
+    
+    /**
+     * Tracks managed sesssions with <tt>serviceAddress</tt> as a key.
+     */
+    private final Map managedSessions = new HashMap();
+    
+    /**
+     * Creates a new instance.
+     */
+    public IoServiceListenerSupport()
+    {
+    }
+    
+    /**
+     * Adds a new listener.
+     */
+    public void add( IoServiceListener listener )
+    {
+        synchronized( listeners )
+        {
+            listeners.add( listener );
+        }
+    }
+
+    /**
+     * Removes an existing listener.
+     */
+    public void remove( IoServiceListener listener )
+    {
+        synchronized( listeners )
+        {
+            listeners.remove( listener );
+        }
+    }
+    
+    public Set getManagedServiceAddresses()
+    {
+        return Collections.unmodifiableSet( managedServiceAddresses );
+    }
+
+    public boolean isManaged( SocketAddress serviceAddress )
+    {
+        synchronized( managedServiceAddresses )
+        {
+            return managedServiceAddresses.contains( serviceAddress );
+        }
+    }
+
+    public Set getManagedSessions( SocketAddress serviceAddress )
+    {
+        Set sessions;
+        synchronized( managedSessions )
+        {
+            sessions = ( Set )managedSessions.get( serviceAddress );
+            if( sessions == null )
+            {
+                sessions = new IdentityHashSet();
+            }
+        }
+        
+        return Collections.unmodifiableSet( sessions );
+    }
+
+    /**
+     * Calls {@link IoServiceListener#serviceActivated(IoService, SocketAddress, IoHandler, IoServiceConfig)}
+     * for all registered listeners.
+     */
+    public void fireServiceActivated(
+            IoService service, SocketAddress serviceAddress,
+            IoHandler handler, IoServiceConfig config )
+    {
+        synchronized( managedServiceAddresses )
+        {
+            if( !managedServiceAddresses.add( serviceAddress ) )
+            {
+                return;
+            }
+        }
+
+        synchronized( listeners )
+        {
+            for( Iterator i = listeners.iterator(); i.hasNext(); )
+            {
+                ( ( IoServiceListener ) i.next() ).serviceActivated(
+                        service, serviceAddress, handler, config );
+            }
+        }
+    }
+    
+    /**
+     * Calls {@link IoServiceListener#serviceDeactivated(IoService, SocketAddress, IoHandler, IoServiceConfig)}
+     * for all registered listeners.
+     */
+    public synchronized void fireServiceDeactivated(
+            IoService service, SocketAddress serviceAddress,
+            IoHandler handler, IoServiceConfig config )
+    {
+        synchronized( managedServiceAddresses )
+        {
+            if( !managedServiceAddresses.remove( serviceAddress ) )
+            {
+                return;
+            }
+        }
+        
+        try
+        {
+            synchronized( listeners )
+            {
+                for( Iterator i = listeners.iterator(); i.hasNext(); )
+                {
+                    ( ( IoServiceListener ) i.next() ).serviceDeactivated(
+                            service, serviceAddress, handler, config );
+                }
+            }
+        }
+        finally
+        {
+            disconnectSessions( serviceAddress, config );
+        }
+    }
+    
+    
+    /**
+     * Calls {@link IoServiceListener#sessionCreated(IoSession)} for all registered listeners.
+     */
+    public void fireSessionCreated( IoSession session )
+    {
+        SocketAddress serviceAddress = session.getServiceAddress();
+        
+        boolean firstSession = false;
+        Set sessions;
+        synchronized( managedSessions )
+        {
+            sessions = ( Set ) managedSessions.get( serviceAddress );
+            if( sessions == null )
+            {
+                sessions = new IdentityHashSet();
+                managedSessions.put( serviceAddress, sessions );
+                firstSession = true;
+            }
+        }
+        
+        if( session.getService() instanceof IoConnector && firstSession )
+        {
+            fireServiceActivated(
+                    session.getService(), session.getServiceAddress(),
+                    session.getHandler(), session.getServiceConfig() );
+        }
+
+        synchronized( sessions )
+        {
+            if ( !sessions.add( session ) )
+            {
+                return;
+            }
+        }
+
+        synchronized( listeners )
+        {
+            for( Iterator i = listeners.iterator(); i.hasNext(); )
+            {
+                ( ( IoServiceListener ) i.next() ).sessionCreated( session );
+            }
+        }
+    }
+    
+    /**
+     * Calls {@link IoServiceListener#sessionDestroyed(IoSession)} for all registered listeners.
+     */
+    public void fireSessionDestroyed( IoSession session )
+    {
+        SocketAddress serviceAddress = session.getServiceAddress();
+        
+        Set sessions;
+        synchronized( managedSessions )
+        {
+            sessions = ( Set ) managedSessions.get( serviceAddress );
+        }
+        
+        if( sessions == null )
+        {
+            return;
+        }
+        
+        boolean lastSession = false;
+        synchronized( sessions )
+        {
+            sessions.remove( session );
+            if( sessions.isEmpty() )
+            {
+                synchronized( managedSessions )
+                {
+                    managedSessions.remove( serviceAddress );
+                }
+                lastSession = true;
+            }
+        }
+        
+
+        try
+        {
+            synchronized( listeners )
+            {
+                for( Iterator i = listeners.iterator(); i.hasNext(); )
+                {
+                    ( ( IoServiceListener ) i.next() ).sessionDestroyed( session );
+                }
+            }
+        }
+        finally
+        {
+            if( session.getService() instanceof IoConnector && lastSession )
+            {
+                fireServiceDeactivated(
+                        session.getService(), session.getServiceAddress(),
+                        session.getHandler(), session.getServiceConfig() );
+            }
+        }
+    }
+
+    private void disconnectSessions( SocketAddress serviceAddress, IoServiceConfig config )
+    {
+        if( !( config instanceof IoAcceptorConfig ) )
+        {
+            return;
+        }
+
+        if( !( ( IoAcceptorConfig ) config ).isDisconnectOnUnbind() )
+        {
+            return;
+        }
+
+        Set sessions;
+        synchronized( managedSessions )
+        {
+            sessions = ( Set ) managedSessions.get( serviceAddress );
+        }
+        
+        if( sessions == null )
+        {
+            return;
+        }
+
+        final Object lock = new Object();
+        synchronized( sessions )
+        {
+            for( Iterator i = sessions.iterator(); i.hasNext(); )
+            {
+                ( ( IoSession ) i.next() ).close().addListener( new IoFutureListener()
+                {
+                    public void operationComplete( IoFuture future )
+                    {
+                        synchronized( lock )
+                        {
+                            //noinspection NakedNotify
+                            lock.notifyAll();
+                        }
+                    }
+                } );
+            }
+        }
+
+        try
+        {
+            synchronized( lock )
+            {
+                while( !managedSessions.isEmpty() )
+                {
+                    lock.wait( 1000 );
+                }
+            }
+        }
+        catch( InterruptedException ie )
+        {
+            // Ignored
+        }
+    }
+}

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

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java Tue Sep  5 03:14:53 2006
@@ -27,11 +27,7 @@
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -39,14 +35,9 @@
 
 import org.apache.mina.common.ExceptionMonitor;
 import org.apache.mina.common.IoAcceptor;
-import org.apache.mina.common.IoAcceptorConfig;
-import org.apache.mina.common.IoFuture;
-import org.apache.mina.common.IoFutureListener;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoServiceConfig;
-import org.apache.mina.common.IoSession;
 import org.apache.mina.common.support.BaseIoAcceptor;
-import org.apache.mina.util.IdentityHashSet;
 import org.apache.mina.util.Queue;
 
 /**
@@ -67,7 +58,6 @@
     private final String threadName = "SocketAcceptor-" + id;
     private final IoServiceConfig defaultConfig = new SocketAcceptorConfig();
     private final Map channels = new HashMap();
-    private final Hashtable sessions = new Hashtable();
 
     private final Queue registerQueue = new Queue();
     private final Queue cancelQueue = new Queue();
@@ -191,24 +181,6 @@
         }
     }
 
-    public Set getManagedSessions( SocketAddress address )
-    {
-        if( address == null )
-        {
-            throw new NullPointerException( "address" );
-        }
-
-        Set managedSessions = ( Set ) sessions.get( address );
-
-        if( managedSessions == null )
-        {
-            throw new IllegalArgumentException( "Address not bound: " + address );
-        }
-
-        return Collections.unmodifiableSet(
-            new IdentityHashSet( Arrays.asList( managedSessions.toArray() ) ) );
-    }
-
     public void unbind( SocketAddress address )
     {
         if( address == null )
@@ -216,7 +188,6 @@
             throw new NullPointerException( "address" );
         }
 
-        final Set managedSessions = ( Set ) sessions.get( address );
         CancellationRequest request = new CancellationRequest( address );
 
         try
@@ -260,63 +231,6 @@
 
             throw request.exception;
         }
-
-        // Disconnect all clients
-        IoServiceConfig cfg = request.registrationRequest.config;
-        boolean disconnectOnUnbind;
-        if( cfg instanceof IoAcceptorConfig )
-        {
-            disconnectOnUnbind = ( ( IoAcceptorConfig ) cfg ).isDisconnectOnUnbind();
-        }
-        else
-        {
-            disconnectOnUnbind = ( ( IoAcceptorConfig ) getDefaultConfig() ).isDisconnectOnUnbind();
-        }
-
-        if( disconnectOnUnbind && managedSessions != null )
-        {
-            IoSession[] tempSessions =
-                ( IoSession[] ) managedSessions.toArray( new IoSession[ managedSessions.size() ] );
-
-            final Object lock = new Object();
-
-            for( int i = 0; i < tempSessions.length; i++ )
-            {
-                if( !managedSessions.contains( tempSessions[i] ) )
-                {
-                    // The session has already been closed and have been 
-                    // removed from managedSessions by the SocketIoProcessor.
-                    continue;
-                }
-                tempSessions[i].close().addListener( new IoFutureListener()
-                {
-                    public void operationComplete( IoFuture future )
-                    {
-                        synchronized( lock )
-                        {
-                            //noinspection NakedNotify
-                            lock.notifyAll();
-                        }
-                    }
-                } );
-            }
-
-            try
-            {
-                synchronized( lock )
-                {
-                    while( !managedSessions.isEmpty() )
-                    {
-                        lock.wait( 1000 );
-                    }
-                }
-            }
-            catch( InterruptedException ie )
-            {
-                // Ignored
-            }
-
-        }
     }
 
     public void unbindAll()
@@ -333,22 +247,6 @@
         }
     }
 
-    public boolean isBound( SocketAddress address )
-    {
-        synchronized( channels )
-        {
-            return channels.containsKey( address );
-        }
-    }
-
-    public Set getBoundAddresses()
-    {
-        synchronized( channels )
-        {
-            return new HashSet( channels.keySet() );
-        }
-    }
-    
     private class Worker extends Thread
     {
         Worker()
@@ -444,8 +342,8 @@
                     RegistrationRequest req = ( RegistrationRequest ) key.attachment();
                     session = new SocketSessionImpl( SocketAcceptor.this,
                                                      nextProcessor(),
-                                                     ( Set ) sessions.get( req.address ),
-                                                     req.config.getSessionConfig(),
+                                                     getListeners(),
+                                                     req.config,
                                                      ch,
                                                      req.handler,
                                                      req.address );
@@ -453,7 +351,6 @@
                     req.config.getFilterChainBuilder().buildFilterChain( session.getFilterChain() );
                     req.config.getThreadModel().buildFilterChain( session.getFilterChain() );
                     ( ( SocketFilterChain ) session.getFilterChain() ).sessionCreated( session );
-                    session.getManagedSessions().add( session );
                     session.getIoProcessor().addNew( session );
                     success = true;
                 }
@@ -465,10 +362,6 @@
                 {
                     if( !success )
                     {
-                        if( session != null )
-                        {
-                            session.getManagedSessions().remove( session );
-                        }
                         ch.close();
                     }
                 }
@@ -537,7 +430,9 @@
                 {
                     channels.put( req.address, ssc );
                 }
-                sessions.put( req.address, Collections.synchronizedSet( new HashSet() ) );
+                
+                getListeners().fireServiceActivated(
+                        this, req.address, req.handler, req.config );
             }
             catch( IOException e )
             {
@@ -589,7 +484,6 @@
                 break;
             }
 
-            sessions.remove( request.address );
             ServerSocketChannel ssc;
             synchronized( channels )
             {
@@ -624,6 +518,14 @@
                 {
                     request.done = true;
                     request.notifyAll();
+                }
+                
+                if( request.exception == null )
+                {
+                    getListeners().fireServiceDeactivated(
+                            this, request.address,
+                            request.registrationRequest.handler,
+                            request.registrationRequest.config );
                 }
             }
         }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- 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 Sep  5 03:14:53 2006
@@ -26,8 +26,6 @@
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
@@ -59,7 +57,6 @@
     private final String threadName = "SocketConnector-" + id;
     private final IoServiceConfig defaultConfig = new SocketConnectorConfig();
     private final Queue connectQueue = new Queue();
-    private final Set managedSessions = Collections.synchronizedSet( new HashSet() );
     private final SocketIoProcessor[] ioProcessors;
     private final int processorCount;
 
@@ -351,8 +348,8 @@
     {
         SocketSessionImpl session = new SocketSessionImpl( this,
                                                            nextProcessor(),
-                                                           managedSessions,
-                                                           config.getSessionConfig(),
+                                                           getListeners(),
+                                                           config,
                                                            ch,
                                                            handler,
                                                            ch.socket().getRemoteSocketAddress() );
@@ -367,7 +364,6 @@
         {
             throw ( IOException ) new IOException( "Failed to create a session." ).initCause( e );
         }
-        session.getManagedSessions().add( session );
         session.getIoProcessor().addNew( session );
         return session;
     }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java Tue Sep  5 03:14:53 2006
@@ -168,13 +168,13 @@
             }
             catch( IOException e )
             {
-                session.getManagedSessions().remove( session );
                 registered = false;
                 ( ( SocketFilterChain ) session.getFilterChain() ).exceptionCaught( session, e );
             }
 
             if( registered )
             {
+                session.getServiceListeners().fireSessionCreated( session );
                 ( ( SocketFilterChain ) session.getFilterChain() ).sessionOpened( session );
             }
         }
@@ -224,7 +224,7 @@
             finally
             {
                 releaseWriteBuffers( session );
-                session.getManagedSessions().remove( session );
+                session.getServiceListeners().fireSessionDestroyed( session );
 
                 ( ( SocketFilterChain ) session.getFilterChain() ).sessionClosed( session );
             }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketSessionImpl.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketSessionImpl.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketSessionImpl.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/SocketSessionImpl.java Tue Sep  5 03:14:53 2006
@@ -19,24 +19,25 @@
  */
 package org.apache.mina.transport.socket.nio;
 
-import org.apache.mina.common.IoFilter.WriteRequest;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.SocketChannel;
+
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.RuntimeIOException;
 import org.apache.mina.common.TransportType;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.common.support.BaseIoSession;
 import org.apache.mina.common.support.BaseIoSessionConfig;
+import org.apache.mina.common.support.IoServiceListenerSupport;
 import org.apache.mina.util.Queue;
 
-import java.net.SocketAddress;
-import java.net.SocketException;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.SocketChannel;
-import java.util.Set;
-
 /**
  * An {@link IoSession} for socket transport (TCP/IP).
  *
@@ -46,6 +47,7 @@
 class SocketSessionImpl extends BaseIoSession
 {
     private final IoService manager;
+    private final IoServiceConfig serviceConfig;
     private final SocketSessionConfig config = new SessionConfigImpl();
     private final SocketIoProcessor ioProcessor;
     private final SocketFilterChain filterChain;
@@ -55,7 +57,7 @@
     private final SocketAddress remoteAddress;
     private final SocketAddress localAddress;
     private final SocketAddress serviceAddress;
-    private final Set managedSessions;
+    private final IoServiceListenerSupport serviceListeners;
     private SelectionKey key;
     private int readBufferSize;
 
@@ -64,14 +66,14 @@
      */
     SocketSessionImpl( IoService manager,
                        SocketIoProcessor ioProcessor,
-                       Set managedSessions,
-                       IoSessionConfig config,
+                       IoServiceListenerSupport listeners,
+                       IoServiceConfig serviceConfig,
                        SocketChannel ch,
                        IoHandler defaultHandler,
                        SocketAddress serviceAddress )
     {
         this.manager = manager;
-        this.managedSessions = managedSessions;
+        this.serviceListeners = listeners;
         this.ioProcessor = ioProcessor;
         this.filterChain = new SocketFilterChain( this );
         this.ch = ch;
@@ -80,11 +82,13 @@
         this.remoteAddress = ch.socket().getRemoteSocketAddress();
         this.localAddress = ch.socket().getLocalSocketAddress();
         this.serviceAddress = serviceAddress;
+        this.serviceConfig = serviceConfig;
 
         // Apply the initial session settings
-        if( config instanceof SocketSessionConfig )
+        IoSessionConfig sessionConfig = serviceConfig.getSessionConfig();
+        if( sessionConfig instanceof SocketSessionConfig )
         {
-            SocketSessionConfig cfg = ( SocketSessionConfig ) config;
+            SocketSessionConfig cfg = ( SocketSessionConfig ) sessionConfig;
             this.config.setKeepAlive( cfg.isKeepAlive() );
             this.config.setOobInline( cfg.isOobInline() );
             this.config.setReceiveBufferSize( cfg.getReceiveBufferSize() );
@@ -105,6 +109,11 @@
     {
         return manager;
     }
+    
+    public IoServiceConfig getServiceConfig()
+    {
+        return serviceConfig;
+    }
 
     public IoSessionConfig getConfig()
     {
@@ -126,9 +135,9 @@
         return ch;
     }
 
-    Set getManagedSessions()
+    IoServiceListenerSupport getServiceListeners()
     {
-        return managedSessions;
+        return serviceListeners;
     }
 
     SelectionKey getSelectionKey()

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java Tue Sep  5 03:14:53 2006
@@ -228,7 +228,7 @@
         RegistrationRequest req = ( RegistrationRequest ) key.attachment();
         DatagramSessionImpl s = new DatagramSessionImpl(
                 wrapper, this,
-                req.config.getSessionConfig(), ch, req.handler,
+                req.config, ch, req.handler,
                 req.address );
         s.setRemoteAddress( remoteAddress );
         s.setSelectionKey( key );
@@ -370,7 +370,7 @@
             RegistrationRequest req = ( RegistrationRequest ) key.attachment();
             DatagramSessionImpl session = new DatagramSessionImpl(
                     wrapper, this,
-                    req.config.getSessionConfig(),
+                    req.config,
                     ch, req.handler,
                     req.address );
             session.setSelectionKey( key );
@@ -578,6 +578,9 @@
                 {
                     channels.put( req.address, ch );
                 }
+                
+                getListeners().fireServiceActivated(
+                        this, req.address, req.handler, req.config);
             }
             catch( Throwable t )
             {
@@ -642,6 +645,7 @@
                 else
                 {
                     SelectionKey key = ch.keyFor( selector );
+                    request.registrationRequest = ( RegistrationRequest ) key.attachment();
                     key.cancel();
                     selector.wakeup(); // wake up again to trigger thread death
                     ch.disconnect();
@@ -659,6 +663,14 @@
                     request.done = true;
                     request.notify();
                 }
+
+                if( request.exception == null )
+                {
+                    getListeners().fireServiceDeactivated(
+                            this, request.address,
+                            request.registrationRequest.handler,
+                            request.registrationRequest.config );
+                }
             }
         }
     }
@@ -691,6 +703,7 @@
     {
         private final SocketAddress address;
         private boolean done;
+        private RegistrationRequest registrationRequest;
         private RuntimeException exception;
         
         private CancellationRequest( SocketAddress address )

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- 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 Sep  5 03:14:53 2006
@@ -545,7 +545,7 @@
 
             DatagramSessionImpl session = new DatagramSessionImpl(
                     wrapper, this,
-                    req.config.getSessionConfig(),
+                    req.config,
                     req.channel, req.handler,
                     req.channel.socket().getRemoteSocketAddress() );
 

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramSessionImpl.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramSessionImpl.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramSessionImpl.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramSessionImpl.java Tue Sep  5 03:14:53 2006
@@ -28,6 +28,7 @@
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.RuntimeIOException;
@@ -48,6 +49,7 @@
 class DatagramSessionImpl extends BaseIoSession implements BroadcastIoSession
 {
     private final IoService wrapperManager;
+    private final IoServiceConfig serviceConfig;
     private final DatagramSessionConfig config = new SessionConfigImpl();
     private final DatagramService managerDelegate;
     private final DatagramFilterChain filterChain;
@@ -65,7 +67,7 @@
      */
     DatagramSessionImpl( IoService wrapperManager,
                          DatagramService managerDelegate,
-                         IoSessionConfig config,
+                         IoServiceConfig serviceConfig,
                          DatagramChannel ch, IoHandler defaultHandler,
                          SocketAddress serviceAddress )
     {
@@ -78,11 +80,13 @@
         this.remoteAddress = ch.socket().getRemoteSocketAddress();
         this.localAddress = ch.socket().getLocalSocketAddress();
         this.serviceAddress = serviceAddress;
+        this.serviceConfig = serviceConfig;
         
         // Apply the initial session settings
-        if( config instanceof DatagramSessionConfig )
+        IoSessionConfig sessionConfig = serviceConfig.getSessionConfig();
+        if( sessionConfig instanceof DatagramSessionConfig )
         {
-            DatagramSessionConfig cfg = ( DatagramSessionConfig ) config;
+            DatagramSessionConfig cfg = ( DatagramSessionConfig ) sessionConfig;
             this.config.setBroadcast( cfg.isBroadcast() );
             this.config.setReceiveBufferSize( cfg.getReceiveBufferSize() );
             this.readBufferSize = cfg.getReceiveBufferSize();
@@ -99,6 +103,11 @@
     public IoService getService()
     {
         return wrapperManager;
+    }
+    
+    public IoServiceConfig getServiceConfig()
+    {
+        return serviceConfig;
     }
     
     public IoSessionConfig getConfig()

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- 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 Sep  5 03:14:53 2006
@@ -85,11 +85,10 @@
             VmPipeSessionImpl session =
                 new VmPipeSessionImpl(
                         this,
+                        config,
                         new Object(), // lock
                         new AnonymousSocketAddress(),
                         handler,
-                        config.getFilterChainBuilder(),
-                        config.getThreadModel(),
                         entry );
             future.setSession( session );
         }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java Tue Sep  5 03:14:53 2006
@@ -25,12 +25,11 @@
 
 import org.apache.mina.common.ExceptionMonitor;
 import org.apache.mina.common.IoFilterChain;
-import org.apache.mina.common.IoFilterChainBuilder;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
-import org.apache.mina.common.ThreadModel;
 import org.apache.mina.common.TransportType;
 import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.common.support.BaseIoSession;
@@ -48,6 +47,7 @@
     private static final IoSessionConfig CONFIG = new BaseIoSessionConfig() {};
     
     private final IoService manager;
+    private final IoServiceConfig serviceConfig;
     private final SocketAddress localAddress;
     private final SocketAddress remoteAddress;
     private final SocketAddress serviceAddress;
@@ -61,11 +61,11 @@
     /**
      * Constructor for client-side session.
      */
-    public VmPipeSessionImpl( IoService manager, Object lock, SocketAddress localAddress,
-                   IoHandler handler, IoFilterChainBuilder filterChainBuilder, ThreadModel threadModel,
-                   VmPipe remoteEntry ) throws IOException
+    public VmPipeSessionImpl( IoService manager, IoServiceConfig serviceConfig, Object lock, SocketAddress localAddress,
+                   IoHandler handler, VmPipe remoteEntry ) throws IOException
     {
         this.manager = manager;
+        this.serviceConfig = serviceConfig;
         this.lock = lock;
         this.localAddress = localAddress;
         this.remoteAddress = this.serviceAddress = remoteEntry.getAddress();
@@ -97,8 +97,8 @@
         try
         {
             manager.getFilterChainBuilder().buildFilterChain( filterChain );
-            filterChainBuilder.buildFilterChain( filterChain );
-            threadModel.buildFilterChain( filterChain );
+            serviceConfig.getFilterChainBuilder().buildFilterChain( filterChain );
+            serviceConfig.getThreadModel().buildFilterChain( filterChain );
             handler.sessionCreated( this );
         }
         catch( Throwable t )
@@ -122,6 +122,7 @@
     private VmPipeSessionImpl( IoService manager, VmPipeSessionImpl remoteSession, VmPipe entry )
     {
         this.manager = manager;
+        this.serviceConfig = entry.getConfig();
         this.lock = remoteSession.lock;
         this.localAddress = this.serviceAddress = remoteSession.remoteAddress;
         this.remoteAddress = remoteSession.localAddress;
@@ -140,6 +141,11 @@
     public IoService getService()
     {
         return manager;
+    }
+    
+    public IoServiceConfig getServiceConfig()
+    {
+        return serviceConfig;
     }
     
     public IoSessionConfig getConfig()

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/common/IoFilterChainTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/common/IoFilterChainTest.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/common/IoFilterChainTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/common/IoFilterChainTest.java Tue Sep  5 03:14:53 2006
@@ -313,6 +313,11 @@
         public int getScheduledWriteBytes() {
             return 0;
         }
+
+        public IoServiceConfig getServiceConfig()
+        {
+            return null;
+        }
     }
 
     private class EventOrderTestFilter extends IoFilterAdapter
@@ -443,6 +448,11 @@
                 public int getScheduledWriteBytes()
                 {
                     return 0;
+                }
+
+                public IoServiceConfig getServiceConfig()
+                {
+                    return null;
                 }
             } );
         }

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/FutureTest.java Tue Sep  5 03:14:53 2006
@@ -28,6 +28,7 @@
 import org.apache.mina.common.IoFuture;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.TransportType;
@@ -127,6 +128,11 @@
             public int getScheduledWriteBytes()
             {
                 return 0;
+            }
+
+            public IoServiceConfig getServiceConfig()
+            {
+                return null;
             }
         };
         

Added: directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/IoServiceListenerSupportTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/IoServiceListenerSupportTest.java?view=auto&rev=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/IoServiceListenerSupportTest.java (added)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/common/support/IoServiceListenerSupportTest.java Tue Sep  5 03:14:53 2006
@@ -0,0 +1,296 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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 java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.mina.common.IoAcceptor;
+import org.apache.mina.common.IoAcceptorConfig;
+import org.apache.mina.common.IoConnector;
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoSessionConfig;
+import org.apache.mina.common.TransportType;
+import org.easymock.MockControl;
+
+/**
+ * Tests {@link IoServiceListenerSupport}.
+ * 
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ * @version $Rev$, $Date$ 
+ */
+public class IoServiceListenerSupportTest extends TestCase
+{
+    private static final SocketAddress ADDRESS = new InetSocketAddress( 8080 );
+
+    private IoServiceListenerSupport support;
+    
+    public void setUp() throws Exception
+    {
+        support = new IoServiceListenerSupport();
+    }
+    
+    public void testServiceLifecycle() throws Exception
+    {
+        MockControl listenerControl = MockControl.createControl( IoServiceListener.class );
+        IoServiceListener listener = ( IoServiceListener ) listenerControl.getMock();
+        
+        // Test activation
+        listener.serviceActivated( null, ADDRESS, null, null );
+        
+        listenerControl.replay();
+        
+        support.add( listener );
+        support.fireServiceActivated( null, ADDRESS, null, null );
+        
+        listenerControl.verify();
+        
+        Assert.assertEquals( 1, support.getManagedServiceAddresses().size() );
+        Assert.assertTrue( support.getManagedServiceAddresses().contains( ADDRESS ) );
+        
+        // Test deactivation & other side effects
+        listenerControl.reset();
+        listener.serviceDeactivated( null, ADDRESS, null, null );
+
+        listenerControl.replay();
+        //// Activate more than once
+        support.fireServiceActivated( null, ADDRESS, null, null );
+        //// Deactivate
+        support.fireServiceDeactivated( null, ADDRESS, null, null );
+        //// Deactivate more than once
+        support.fireServiceDeactivated( null, ADDRESS, null, null );
+        
+        listenerControl.verify();
+
+        Assert.assertEquals( 0, support.getManagedServiceAddresses().size() );
+        Assert.assertFalse( support.getManagedServiceAddresses().contains( ADDRESS ) );
+    }
+    
+    public void testSessionLifecycle() throws Exception
+    {
+        IoSession session = new TestSession( ADDRESS );
+        MockControl listenerControl = MockControl.createControl( IoServiceListener.class );
+        IoServiceListener listener = ( IoServiceListener ) listenerControl.getMock();
+        
+        // Test creation
+        listener.sessionCreated( session );
+        
+        listenerControl.replay();
+        
+        support.add( listener );
+        support.fireSessionCreated( session );
+        
+        listenerControl.verify();
+        
+        Assert.assertEquals( 1, support.getManagedSessions( ADDRESS ).size() );
+        Assert.assertTrue( support.getManagedSessions( ADDRESS ).contains( session ) );
+        
+        // Test destruction & other side effects
+        listenerControl.reset();
+        listener.sessionDestroyed( session );
+
+        listenerControl.replay();
+        //// Activate more than once
+        support.fireSessionCreated( session );
+        //// Deactivate
+        support.fireSessionDestroyed( session );
+        //// Deactivate more than once
+        support.fireSessionDestroyed( session );
+        
+        listenerControl.verify();
+
+        Assert.assertFalse( session.isClosing() );
+        Assert.assertEquals( 0, support.getManagedSessions( ADDRESS ).size() );
+        Assert.assertFalse( support.getManagedSessions( ADDRESS ).contains( session ) );
+    }
+    
+    public void testDisconnectOnUnbind() throws Exception
+    {
+        MockControl acceptorControl = MockControl.createControl( IoAcceptor.class );
+        IoAcceptor acceptor = ( IoAcceptor ) acceptorControl.getMock();
+        MockControl configControl = MockControl.createControl( IoAcceptorConfig.class );
+        IoAcceptorConfig config = ( IoAcceptorConfig ) configControl.getMock();
+        final IoSession session = new TestSession( acceptor, ADDRESS );
+        MockControl listenerControl = MockControl.createControl( IoServiceListener.class );
+        IoServiceListener listener = ( IoServiceListener ) listenerControl.getMock();
+        
+        // Activate a service and create a session.
+        listener.serviceActivated( acceptor, ADDRESS, null, config );
+        listener.sessionCreated( session );
+        
+        listenerControl.replay();
+        
+        support.add( listener );
+        support.fireServiceActivated( acceptor, ADDRESS, null, config );
+        support.fireSessionCreated( session );
+        
+        listenerControl.verify();
+        
+        // Deactivate a service and make sure the session is closed & destroyed.
+        listenerControl.reset();
+        listener.serviceDeactivated( acceptor, ADDRESS, null, config );
+        configControl.expectAndReturn(config.isDisconnectOnUnbind(), true );
+        listener.sessionDestroyed( session );
+
+        listenerControl.replay();
+        configControl.replay();
+        new Thread()
+        {
+            // Emulate I/O service
+            public void run()
+            {
+                try
+                {
+                    Thread.sleep( 2000 );
+                }
+                catch( InterruptedException e )
+                {
+                    e.printStackTrace();
+                }
+                support.fireSessionDestroyed( session );
+            }
+        }.start();
+        support.fireServiceDeactivated( acceptor, ADDRESS, null, config );
+        
+        listenerControl.verify();
+        configControl.verify();
+
+        Assert.assertTrue( session.isClosing() );
+        Assert.assertEquals( 0, support.getManagedSessions( ADDRESS ).size() );
+        Assert.assertFalse( support.getManagedSessions( ADDRESS ).contains( session ) );
+    }
+    
+    public void testConnectorActivation() throws Exception
+    {
+        MockControl connectorControl = MockControl.createControl( IoConnector.class );
+        IoConnector connector = ( IoConnector ) connectorControl.getMock();
+        final IoSession session = new TestSession( connector, ADDRESS );
+        MockControl listenerControl = MockControl.createControl( IoServiceListener.class );
+        IoServiceListener listener = ( IoServiceListener ) listenerControl.getMock();
+        
+        // Creating a session should activate a service automatically.
+        listener.serviceActivated( connector, ADDRESS, null, null );
+        listener.sessionCreated( session );
+        
+        listenerControl.replay();
+        
+        support.add( listener );
+        support.fireSessionCreated( session );
+        
+        listenerControl.verify();
+        
+        // Destroying a session should deactivate a service automatically.
+        listenerControl.reset();
+        listener.sessionDestroyed( session );
+        listener.serviceDeactivated( connector, ADDRESS, null, null );
+        
+        listenerControl.replay();
+        support.fireSessionDestroyed( session );
+        
+        listenerControl.verify();
+
+        Assert.assertEquals( 0, support.getManagedSessions( ADDRESS ).size() );
+        Assert.assertFalse( support.getManagedSessions( ADDRESS ).contains( session ) );
+    }
+    
+    private static class TestSession extends BaseIoSession
+    {
+        private final IoService service;
+        private final SocketAddress serviceAddress;
+        
+        public TestSession( SocketAddress serviceAddress )
+        {
+            this( null, serviceAddress );
+        }
+        
+        public TestSession( IoService service, SocketAddress serviceAddress )
+        {
+            this.service = service;
+            this.serviceAddress = serviceAddress;
+        }
+
+        protected void updateTrafficMask()
+        {
+        }
+
+        public IoSessionConfig getConfig()
+        {
+            return null;
+        }
+
+        public IoFilterChain getFilterChain()
+        {
+            return null;
+        }
+
+        public IoHandler getHandler()
+        {
+            return null;
+        }
+
+        public SocketAddress getLocalAddress()
+        {
+            return null;
+        }
+
+        public SocketAddress getRemoteAddress()
+        {
+            return null;
+        }
+
+        public int getScheduledWriteBytes()
+        {
+            return 0;
+        }
+
+        public int getScheduledWriteRequests()
+        {
+            return 0;
+        }
+
+        public IoService getService()
+        {
+            return service;
+        }
+
+        public SocketAddress getServiceAddress()
+        {
+            return serviceAddress;
+        }
+
+        public IoServiceConfig getServiceConfig()
+        {
+            return null;
+        }
+
+        public TransportType getTransportType()
+        {
+            return null;
+        }
+    }
+}

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

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/CumulativeProtocolDecoderTest.java Tue Sep  5 03:14:53 2006
@@ -30,6 +30,7 @@
 import org.apache.mina.common.CloseFuture;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoService;
 import org.apache.mina.common.IoSessionConfig;
@@ -227,6 +228,11 @@
         }
 
         public IoService getService()
+        {
+            return null;
+        }
+
+        public IoServiceConfig getServiceConfig()
         {
             return null;
         }

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java Tue Sep  5 03:14:53 2006
@@ -30,6 +30,7 @@
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.TransportType;
@@ -188,6 +189,11 @@
         }
 
         public IoService getService()
+        {
+            return null;
+        }
+        
+        public IoServiceConfig getServiceConfig()
         {
             return null;
         }

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java Tue Sep  5 03:14:53 2006
@@ -28,6 +28,7 @@
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoService;
 import org.apache.mina.common.IoSessionConfig;
@@ -81,6 +82,11 @@
         }
 
         public IoService getService()
+        {
+            return null;
+        }
+
+        public IoServiceConfig getServiceConfig()
         {
             return null;
         }

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/filter/thread/ThreadPoolFilterRegressionTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/filter/thread/ThreadPoolFilterRegressionTest.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/filter/thread/ThreadPoolFilterRegressionTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/filter/thread/ThreadPoolFilterRegressionTest.java Tue Sep  5 03:14:53 2006
@@ -29,6 +29,7 @@
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.TransportType;
@@ -217,6 +218,11 @@
             return null;
         }
 
+        public IoServiceConfig getServiceConfig()
+        {
+            return null;
+        }
+
         public IoSessionConfig getConfig()
         {
             return null;
@@ -332,6 +338,11 @@
         }
 
         public IoService getService()
+        {
+            return null;
+        }
+
+        public IoServiceConfig getServiceConfig()
         {
             return null;
         }

Modified: directory/trunks/mina/core/src/test/java/org/apache/mina/handler/chain/ChainedIoHandlerTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/test/java/org/apache/mina/handler/chain/ChainedIoHandlerTest.java?view=diff&rev=440315&r1=440314&r2=440315
==============================================================================
--- directory/trunks/mina/core/src/test/java/org/apache/mina/handler/chain/ChainedIoHandlerTest.java (original)
+++ directory/trunks/mina/core/src/test/java/org/apache/mina/handler/chain/ChainedIoHandlerTest.java Tue Sep  5 03:14:53 2006
@@ -26,6 +26,7 @@
 
 import org.apache.mina.common.IoFilterChain;
 import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoServiceConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoService;
 import org.apache.mina.common.IoSessionConfig;
@@ -61,6 +62,11 @@
                     }
 
                     public IoService getService()
+                    {
+                        return null;
+                    }
+
+                    public IoServiceConfig getServiceConfig()
                     {
                         return null;
                     }