You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/04/21 11:19:33 UTC

svn commit: r164015 - in /directory/network/trunk/src/java/org/apache/mina: common/ io/ io/datagram/ io/filter/ io/socket/ protocol/ protocol/io/ protocol/vmpipe/ util/

Author: trustin
Date: Thu Apr 21 02:19:31 2005
New Revision: 164015

URL: http://svn.apache.org/viewcvs?rev=164015&view=rev
Log:
* Added SessionManager interface that all acceptors and connectors extend
* Moved ExceptionMonitor and its default implementation to common package
* Added SessionInitializer

Added:
    directory/network/trunk/src/java/org/apache/mina/common/DefaultExceptionMonitor.java   (with props)
    directory/network/trunk/src/java/org/apache/mina/common/ExceptionMonitor.java   (with props)
    directory/network/trunk/src/java/org/apache/mina/common/SessionInitializer.java   (with props)
    directory/network/trunk/src/java/org/apache/mina/common/SessionManager.java   (with props)
    directory/network/trunk/src/java/org/apache/mina/util/BaseSessionManager.java   (with props)
    directory/network/trunk/src/java/org/apache/mina/util/ExceptionUtil.java   (with props)
Removed:
    directory/network/trunk/src/java/org/apache/mina/io/DefaultExceptionMonitor.java
    directory/network/trunk/src/java/org/apache/mina/io/ExceptionMonitor.java
Modified:
    directory/network/trunk/src/java/org/apache/mina/io/IoAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/io/IoConnector.java
    directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
    directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramProcessor.java
    directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.java
    directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java
    directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolConnector.java
    directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolConnector.java
    directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java
    directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java
    directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java

Added: directory/network/trunk/src/java/org/apache/mina/common/DefaultExceptionMonitor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/DefaultExceptionMonitor.java?rev=164015&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/DefaultExceptionMonitor.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/common/DefaultExceptionMonitor.java Thu Apr 21 02:19:31 2005
@@ -0,0 +1,115 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common;
+
+import java.lang.reflect.Method;
+import java.text.DateFormat;
+import java.util.Date;
+
+/**
+ * A default {@link ExceptionMonitor} implementation.  It logs uncaught
+ * exceptions using <a href="http://jakarta.apache.org/commons/logging/">Apache
+ * Jakarta Commons Logging</a> if available.  If not available, it prints it
+ * out to {@link System#err}.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class DefaultExceptionMonitor implements ExceptionMonitor
+{
+    private static final Object log;
+
+    private static final Method errorMethod;
+
+    static
+    {
+        Object tempLog = null;
+        Method tempErrorMethod = null;
+
+        try
+        {
+            Class logCls = Class.forName( "org.apache.commons.logging.Log" );
+            Class logFactoryCls = Class
+                    .forName( "org.apache.commons.logging.LogFactory" );
+            Method getLogMethod = logFactoryCls
+                    .getMethod( "getLog", new Class[] { String.class } );
+            tempLog = getLogMethod
+                    .invoke( null,
+                             new Object[] { DefaultExceptionMonitor.class
+                                     .getPackage().getName() } );
+            tempErrorMethod = logCls
+                    .getMethod( "error", new Class[] { Object.class,
+                                                      Throwable.class } );
+        }
+        catch( Exception e )
+        {
+            tempLog = null;
+            tempErrorMethod = null;
+        }
+
+        log = tempLog;
+        errorMethod = tempErrorMethod;
+    }
+
+    private final DateFormat df = DateFormat
+            .getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM );
+
+    private final Date date = new Date();
+
+    public void exceptionCaught( Object source, Throwable cause )
+    {
+        if( log == null )
+        {
+            logToStdErr( cause );
+        }
+        else
+        {
+            logToCommonsLogging( cause );
+        }
+    }
+
+    private void logToCommonsLogging( Throwable cause )
+    {
+        try
+        {
+            errorMethod.invoke( log, new Object[] { "Uncaught exception: ",
+                                                   cause } );
+        }
+        catch( Exception e )
+        {
+            logToStdErr( cause );
+        }
+    }
+
+    private void logToStdErr( Throwable cause )
+    {
+        synchronized( System.err )
+        {
+            date.setTime( System.currentTimeMillis() );
+
+            System.err.print( '[' );
+            System.err.print( df.format( date ) );
+            System.err.print( "] [" );
+            System.err.print( Thread.currentThread().getName() );
+            System.err.print( "] Uncaught exception: " );
+            cause.printStackTrace();
+        }
+    }
+
+}
\ No newline at end of file

Propchange: directory/network/trunk/src/java/org/apache/mina/common/DefaultExceptionMonitor.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/java/org/apache/mina/common/ExceptionMonitor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/ExceptionMonitor.java?rev=164015&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/ExceptionMonitor.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/common/ExceptionMonitor.java Thu Apr 21 02:19:31 2005
@@ -0,0 +1,36 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common;
+
+/**
+ * Monitors uncaught exceptions.  {@link #exceptionCaught(Object, Throwable)} is
+ * invoked when there are any uncaught exceptions.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ * 
+ * @see DefaultExceptionMonitor
+ */
+public interface ExceptionMonitor
+{
+    /**
+     * Invoked when there are any uncaught exceptions.
+     */
+    void exceptionCaught( Object source, Throwable cause );
+}
\ No newline at end of file

Propchange: directory/network/trunk/src/java/org/apache/mina/common/ExceptionMonitor.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/java/org/apache/mina/common/SessionInitializer.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/SessionInitializer.java?rev=164015&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/SessionInitializer.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/common/SessionInitializer.java Thu Apr 21 02:19:31 2005
@@ -0,0 +1,64 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common;
+
+import java.io.IOException;
+
+import org.apache.mina.io.IoAcceptor;
+import org.apache.mina.io.IoConnector;
+import org.apache.mina.protocol.ProtocolAcceptor;
+import org.apache.mina.protocol.ProtocolConnector;
+
+
+/**
+ * Initializes session just after it is created.
+ * You can adjust {@link SessionConfig} or set pre-define user-defined attributes
+ * using this before MINA actually starts communication.
+ * <p>
+ * Please specify your initializer when you call:
+ * <ul>
+ *   <li>{@link IoAcceptor}<tt>.bind(...)</tt></li>
+ *   <li>{@link IoConnector}<tt>.connect(...)</tt></li>
+ *   <li>{@link ProtocolAcceptor}<tt>.bind(...)</tt></li>
+ *   <li>{@link ProtocolConnector}<tt>.connect(...)</tt></li>
+ * </ul>
+ * <p>
+ * In case of bind, session is closed immediately and no event is fired if
+ * {@link #initializeSession(Session)} throws any exception.  The exception
+ * is notified to <tt>ExceptionMonitor</tt>.
+ * <p>
+ * In case of connect, session is closed immediately and caught exception
+ * is forwarded to user application context which called <tt>connect(...)</tt>
+ * method.
+ 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public interface SessionInitializer {
+
+    /**
+     * Initializes session just after it is created.
+     * You can adjust {@link SessionConfig} or set pre-define user-defined
+     * attributes using this before MINA actually starts communication. 
+     * Session is closed immediately and no event is fired if
+     * {@link #initializeSession(Session)} throws any exception.
+     * The exception is notified to <tt>ExceptionMonitor</tt>.
+     */
+    void initializeSession( Session session ) throws IOException;
+}

Propchange: directory/network/trunk/src/java/org/apache/mina/common/SessionInitializer.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/java/org/apache/mina/common/SessionManager.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/SessionManager.java?rev=164015&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/SessionManager.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/common/SessionManager.java Thu Apr 21 02:19:31 2005
@@ -0,0 +1,44 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.common;
+
+/**
+ * Base interface for all acceptors and connectors that manage
+ * sessions.
+ * <p>
+ * You can monitor any uncaught exceptions by setting {@link ExceptionMonitor}
+ * by calling {@link #setExceptionMonitor(ExceptionMonitor)}.  The default
+ * monitor is {@link DefaultExceptionMonitor}.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public interface SessionManager {
+    
+    /**
+     * Returns the current exception monitor.
+     */
+    ExceptionMonitor getExceptionMonitor();
+
+    /**
+     * Sets the uncaught exception monitor.  If <code>null</code> is specified,
+     * a new instance of {@link DefaultExceptionMonitor} will be set.
+     */
+    void setExceptionMonitor( ExceptionMonitor monitor );
+}

Propchange: directory/network/trunk/src/java/org/apache/mina/common/SessionManager.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Modified: directory/network/trunk/src/java/org/apache/mina/io/IoAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/IoAcceptor.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/IoAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/IoAcceptor.java Thu Apr 21 02:19:31 2005
@@ -21,6 +21,9 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 
+import org.apache.mina.common.SessionInitializer;
+import org.apache.mina.common.SessionManager;
+
 /**
  * Accepts incoming connection, communicates with clients, and fires events to
  * {@link IoHandler}s.
@@ -39,15 +42,13 @@
  * <p>
  * {@link IoHandlerFilter}s can be added and removed at any time to filter
  * events just like Servlet filters and they are effective immediately.
- * <p>
- * You can monitor any uncaught exceptions by setting {@link ExceptionMonitor}
- * by calling {@link #setExceptionMonitor(ExceptionMonitor)}.  The default
- * monitor is {@link DefaultExceptionMonitor}.
  * 
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
+ * 
+ * @see SessionInitializer
  */
-public interface IoAcceptor
+public interface IoAcceptor extends SessionManager
 {
     /**
      * Binds to the specified <code>address</code> and handles incoming
@@ -58,20 +59,17 @@
     void bind( SocketAddress address, IoHandler handler ) throws IOException;
 
     /**
-     * Unbinds from the specified <code>address</code>.
+     * Binds to the specified <code>address</code> and handles incoming
+     * connections with the specified <code>handler</code>.
+     * 
+     * @throws IOException if failed to bind
      */
-    void unbind( SocketAddress address );
+    void bind( SocketAddress address, IoHandler handler, SessionInitializer initializer ) throws IOException;
 
-    IoHandlerFilterChain getFilterChain();
-    
     /**
-     * Returns the current exception monitor.
+     * Unbinds from the specified <code>address</code>.
      */
-    ExceptionMonitor getExceptionMonitor();
+    void unbind( SocketAddress address );
 
-    /**
-     * Sets the uncaught exception monitor.  If <code>null</code> is specified,
-     * a new instance of {@link DefaultExceptionMonitor} will be set.
-     */
-    void setExceptionMonitor( ExceptionMonitor monitor );
+    IoHandlerFilterChain getFilterChain();
 }

Modified: directory/network/trunk/src/java/org/apache/mina/io/IoConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/IoConnector.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/IoConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/IoConnector.java Thu Apr 21 02:19:31 2005
@@ -21,6 +21,9 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 
+import org.apache.mina.common.SessionInitializer;
+import org.apache.mina.common.SessionManager;
+
 /**
  * Connects to endpoint, communicates with the server, and fires events to
  * {@link IoHandler}s.
@@ -39,15 +42,13 @@
  * <p>
  * {@link IoHandlerFilter}s can be added and removed at any time to filter
  * events just like Servlet filters and they are effective immediately.
- * <p>
- * You can monitor any uncaught exceptions by setting {@link ExceptionMonitor}
- * by calling {@link #setExceptionMonitor(ExceptionMonitor)}.  The default
- * monitor is {@link DefaultExceptionMonitor}.
  * 
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
+ * 
+ * @see SessionInitializer
  */
-public interface IoConnector
+public interface IoConnector extends SessionManager
 {
     /**
      * Connects to the specified <code>address</code>.  If communication starts
@@ -91,16 +92,48 @@
     IoSession connect( SocketAddress address, SocketAddress localAddress,
                        int timeout, IoHandler handler ) throws IOException;
 
-    IoHandlerFilterChain getFilterChain();
+    /**
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>handler</code>.  This method blocks.
+     * 
+     * @throws IOException if failed to connect
+     */
+    IoSession connect( SocketAddress address, IoHandler handler,
+                       SessionInitializer initializer ) throws IOException;
 
     /**
-     * Returns the current exception monitor.
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>handler</code>.  This method blocks.
+     * 
+     * @param localAddress the local address the channel is bound to
+     * @throws IOException if failed to connect
      */
-    ExceptionMonitor getExceptionMonitor();
+    IoSession connect( SocketAddress address, SocketAddress localAddress,
+                       IoHandler handler, SessionInitializer initializer ) throws IOException;
 
     /**
-     * Sets the uncaught exception monitor.  If <code>null</code> is specified,
-     * a new instance of {@link DefaultExceptionMonitor} will be set.
+     * Connects to the specified <code>address</code> with timeout.  If
+     * communication starts successfully, events are fired to the specified
+     * <code>handler</code>.  This method blocks.
+     * 
+     * @throws IOException if failed to connect
      */
-    void setExceptionMonitor( ExceptionMonitor monitor );
+    IoSession connect( SocketAddress address, int timeout, IoHandler handler,
+                       SessionInitializer initializer ) throws IOException;
+    
+    /**
+     * Connects to the specified <code>address</code> with timeout.  If
+     * communication starts successfully, events are fired to the specified
+     * <code>handler</code>.  This method blocks.
+     * 
+     * @param localAddress the local address the channel is bound to
+     * @throws IOException if failed to connect
+     */
+    IoSession connect( SocketAddress address, SocketAddress localAddress,
+                       int timeout, IoHandler handler,
+                       SessionInitializer initializer ) throws IOException;
+
+    IoHandlerFilterChain getFilterChain();
 }

Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Thu Apr 21 02:19:31 2005
@@ -30,11 +30,11 @@
 import java.util.Set;
 
 import org.apache.mina.common.ByteBuffer;
-import org.apache.mina.io.DefaultExceptionMonitor;
-import org.apache.mina.io.ExceptionMonitor;
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.io.IoAcceptor;
 import org.apache.mina.io.IoHandler;
 import org.apache.mina.io.IoHandlerFilterChain;
+import org.apache.mina.util.ExceptionUtil;
 import org.apache.mina.util.Queue;
 
 /**
@@ -61,8 +61,6 @@
 
     private final Queue flushingSessions = new Queue();
 
-    private ExceptionMonitor exceptionMonitor = new DefaultExceptionMonitor();
-
     private Worker worker;
 
     /**
@@ -78,6 +76,12 @@
     public void bind( SocketAddress address, IoHandler handler )
             throws IOException
     {
+        bind( address, handler, null );
+    }
+
+    public void bind( SocketAddress address, IoHandler handler, SessionInitializer initializer )
+            throws IOException
+    {
         if( address == null )
             throw new NullPointerException( "address" );
         if( handler == null )
@@ -89,7 +93,7 @@
         if( ( ( InetSocketAddress ) address ).getPort() == 0 )
             throw new IllegalArgumentException( "Unsupported port number: 0" );
 
-        RegistrationRequest request = new RegistrationRequest( address, handler );
+        RegistrationRequest request = new RegistrationRequest( address, handler, initializer );
         synchronized( this )
         {
             synchronized( registerQueue )
@@ -117,22 +121,7 @@
         if( request.exception != null )
         {
             request.exception.fillInStackTrace();
-            if( request.exception instanceof IOException )
-            {
-                throw ( IOException ) request.exception;
-            }
-            else if( request.exception instanceof RuntimeException )
-            {
-                throw ( RuntimeException ) request.exception;
-            }
-            else if( request.exception instanceof Error )
-            {
-                throw ( Error ) request.exception;
-            }
-            else
-            {
-                throw new IllegalStateException();
-            }
+            ExceptionUtil.throwException( request.exception );
         }
     }
 
@@ -266,18 +255,31 @@
 
             DatagramChannel ch = ( DatagramChannel ) key.channel();
 
+            RegistrationRequest req = ( RegistrationRequest ) key.attachment();
             DatagramSession session = new DatagramSession(
-                    filters, ch, ( IoHandler ) key.attachment() );
+                    filters, ch, req.handler );
             session.setSelectionKey( key );
-
-            if( key.isReadable() )
+            
+            try
             {
-                readSession( session );
-            }
+                if( req.initializer != null )
+                {
+                    req.initializer.initializeSession( session );
+                }
 
-            if( key.isWritable() )
+                if( key.isReadable() )
+                {
+                    readSession( session );
+                }
+
+                if( key.isWritable() )
+                {
+                    scheduleFlush( session );
+                }
+            }
+            catch( Throwable t )
             {
-                scheduleFlush( session );
+                exceptionMonitor.exceptionCaught( this, t );
             }
         }
     }
@@ -432,7 +434,7 @@
                 ch = DatagramChannel.open();
                 ch.configureBlocking( false );
                 ch.socket().bind( req.address );
-                ch.register( selector, SelectionKey.OP_READ, req.handler );
+                ch.register( selector, SelectionKey.OP_READ, req );
                 channels.put( req.address, ch );
             }
             catch( Throwable t )
@@ -523,14 +525,18 @@
         
         private final IoHandler handler;
         
+        private final SessionInitializer initializer;
+        
         private Throwable exception; 
         
         private boolean done;
         
-        private RegistrationRequest( SocketAddress address, IoHandler handler )
+        private RegistrationRequest( SocketAddress address, IoHandler handler,
+                                     SessionInitializer initializer )
         {
             this.address = address;
             this.handler = handler;
+            this.initializer = initializer;
         }
     }
 
@@ -544,20 +550,5 @@
         {
             this.address = address;
         }
-    }
-
-    public ExceptionMonitor getExceptionMonitor()
-    {
-        return exceptionMonitor;
-    }
-
-    public void setExceptionMonitor( ExceptionMonitor monitor )
-    {
-        if( monitor == null )
-        {
-            monitor = new DefaultExceptionMonitor();
-        }
-
-        this.exceptionMonitor = monitor;
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java Thu Apr 21 02:19:31 2005
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
-import java.nio.channels.ClosedChannelException;
 import java.nio.channels.DatagramChannel;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
@@ -29,12 +28,12 @@
 import java.util.Set;
 
 import org.apache.mina.common.ByteBuffer;
-import org.apache.mina.io.DefaultExceptionMonitor;
-import org.apache.mina.io.ExceptionMonitor;
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.io.IoConnector;
 import org.apache.mina.io.IoHandler;
 import org.apache.mina.io.IoHandlerFilterChain;
 import org.apache.mina.io.IoSession;
+import org.apache.mina.util.ExceptionUtil;
 import org.apache.mina.util.Queue;
 
 /**
@@ -43,8 +42,7 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class DatagramConnector extends DatagramProcessor implements
-        IoConnector
+public class DatagramConnector extends DatagramProcessor implements IoConnector
 {
     private static volatile int nextId = 0;
 
@@ -60,8 +58,6 @@
 
     private final Queue flushingSessions = new Queue();
 
-    private ExceptionMonitor exceptionMonitor = new DefaultExceptionMonitor();
-
     private Worker worker;
 
     /**
@@ -74,14 +70,43 @@
         selector = Selector.open();
     }
 
-    public IoSession connect( SocketAddress address, IoHandler handler )
-            throws IOException
+    public IoSession connect( SocketAddress address, IoHandler handler ) throws IOException
     {
-        return connect( address, null, handler );
+        return connect( address, null, handler, null );
     }
-    
+
+    public IoSession connect( SocketAddress address, SocketAddress localAddress, IoHandler handler ) throws IOException
+    {
+        return connect( address, localAddress, handler, null );
+    }
+
+    public IoSession connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
+    {
+        return connect( address, null, handler, null );
+    }
+
+    public IoSession connect( SocketAddress address, SocketAddress localAddress, int timeout, IoHandler handler ) throws IOException
+    {
+        return connect( address, localAddress, handler, null );
+    }
+
+    public IoSession connect( SocketAddress address, IoHandler handler, SessionInitializer initializer ) throws IOException
+    {
+        return connect( address, null, handler, initializer );
+    }
+
+    public IoSession connect( SocketAddress address, int timeout, IoHandler handler, SessionInitializer initializer ) throws IOException
+    {
+        return connect( address, null, handler, initializer );
+    }
+
+    public IoSession connect( SocketAddress address, SocketAddress localAddress, int timeout, IoHandler handler, SessionInitializer initializer ) throws IOException
+    {
+        return connect( address, localAddress, handler, initializer );
+    }
+
     public IoSession connect( SocketAddress address, SocketAddress localAddress,
-                              IoHandler handler ) throws IOException
+                              IoHandler handler, SessionInitializer initializer ) throws IOException
     {
         if( address == null )
             throw new NullPointerException( "address" );
@@ -118,7 +143,7 @@
             }
         }
 
-        RegistrationRequest request = new RegistrationRequest( ch, handler );
+        RegistrationRequest request = new RegistrationRequest( ch, handler, initializer );
         synchronized( this )
         {
             synchronized( registerQueue )
@@ -132,7 +157,7 @@
 
         synchronized( request )
         {
-            while( request.session == null )
+            while( !request.done )
             {
                 try
                 {
@@ -143,6 +168,12 @@
                 }
             }
         }
+        
+        if( request.exception != null )
+        {
+            request.exception.fillInStackTrace();
+            ExceptionUtil.throwException( request.exception );
+        }
 
         return request.session;
     }
@@ -156,18 +187,6 @@
         }
     }
 
-    public IoSession connect( SocketAddress address,
-                              int timeout, IoHandler handler ) throws IOException
-    {
-        return connect( address, null, timeout, handler );
-    }
-
-    public IoSession connect( SocketAddress address, SocketAddress localAddress,
-                              int timeout, IoHandler handler ) throws IOException
-    {
-        return connect( address, localAddress, handler );
-    }
-
     void closeSession( DatagramSession session )
     {
         synchronized( this )
@@ -396,7 +415,7 @@
         }
     }
 
-    private void registerNew() throws ClosedChannelException
+    private void registerNew()
     {
         if( registerQueue.isEmpty() )
             return;
@@ -415,15 +434,43 @@
             DatagramSession session = new DatagramSession(
                     filters, req.channel, req.handler );
 
-            SelectionKey key = req.channel.register( selector,
-                    SelectionKey.OP_READ, session );
+            try
+            {
+                SelectionKey key = req.channel.register( selector,
+                        SelectionKey.OP_READ, session );
+    
+                session.setSelectionKey( key );
 
-            session.setSelectionKey( key );
+                if( req.initializer != null )
+                {
+                    req.initializer.initializeSession( session );
+                }
 
-            synchronized( req )
+            }
+            catch( Throwable t )
             {
-                req.session = session;
-                req.notify();
+                req.exception = t;
+            }
+            finally 
+            {
+                synchronized( req )
+                {
+                    req.done = true;
+                    req.session = session;
+                    req.notify();
+                }
+                
+                if( req.exception != null )
+                {
+                    try
+                    {
+                        req.channel.close();
+                    }
+                    catch (IOException e)
+                    {
+                        exceptionMonitor.exceptionCaught( this, e );
+                    }
+                }
             }
         }
     }
@@ -469,29 +516,21 @@
         private final DatagramChannel channel;
 
         private final IoHandler handler;
+        
+        private final SessionInitializer initializer;
 
+        private boolean done;
+        
         private DatagramSession session;
+        
+        private Throwable exception;
 
         private RegistrationRequest( DatagramChannel channel,
-                                    IoHandler handler )
+                                     IoHandler handler, SessionInitializer initializer )
         {
             this.channel = channel;
             this.handler = handler;
+            this.initializer = initializer;
         }
-    }
-
-    public ExceptionMonitor getExceptionMonitor()
-    {
-        return exceptionMonitor;
-    }
-
-    public void setExceptionMonitor( ExceptionMonitor monitor )
-    {
-        if( monitor == null )
-        {
-            monitor = new DefaultExceptionMonitor();
-        }
-
-        this.exceptionMonitor = monitor;
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramProcessor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramProcessor.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramProcessor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramProcessor.java Thu Apr 21 02:19:31 2005
@@ -18,6 +18,8 @@
  */
 package org.apache.mina.io.datagram;
 
+import org.apache.mina.util.BaseSessionManager;
+
 /**
  * A base class for {@link DatagramAcceptor} and {@link DatagramConnector}.
  * Session interacts with this abstract class instead of those two concrete
@@ -26,7 +28,7 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-abstract class DatagramProcessor
+abstract class DatagramProcessor extends BaseSessionManager
 {
     /**
      * Requests this processor to flush the write buffer of the specified

Modified: directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.java Thu Apr 21 02:19:31 2005
@@ -30,7 +30,7 @@
 import javax.net.ssl.SSLHandshakeException;
 
 import org.apache.mina.common.ByteBuffer;
-import org.apache.mina.io.DefaultExceptionMonitor;
+import org.apache.mina.common.DefaultExceptionMonitor;
 import org.apache.mina.io.IoHandlerFilterAdapter;
 import org.apache.mina.io.IoSession;
 

Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java Thu Apr 21 02:19:31 2005
@@ -30,11 +30,11 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.mina.io.DefaultExceptionMonitor;
-import org.apache.mina.io.ExceptionMonitor;
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.io.IoAcceptor;
 import org.apache.mina.io.IoHandler;
 import org.apache.mina.io.IoHandlerFilterChain;
+import org.apache.mina.util.BaseSessionManager;
 import org.apache.mina.util.Queue;
 
 /**
@@ -43,7 +43,7 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$, $Date$
  */
-public class SocketAcceptor implements IoAcceptor
+public class SocketAcceptor extends BaseSessionManager implements IoAcceptor
 {
     private static volatile int nextId = 0;
 
@@ -61,8 +61,6 @@
     
     private int backlog = 50;
 
-    private ExceptionMonitor exceptionMonitor = new DefaultExceptionMonitor();
-
     private Worker worker;
 
 
@@ -76,7 +74,6 @@
         selector = Selector.open();
     }
 
-
     /**
      * Binds to the specified <code>address</code> and handles incoming
      * connections with the specified <code>handler</code>.  Backlog value
@@ -86,6 +83,19 @@
      */
     public void bind( SocketAddress address, IoHandler handler ) throws IOException
     {
+        bind( address, handler, null );
+    }
+
+    /**
+     * Binds to the specified <code>address</code> and handles incoming
+     * connections with the specified <code>handler</code>.  Backlog value
+     * is configured to the value of <code>backlog</code> property.
+     *
+     * @throws IOException if failed to bind
+     */
+    public void bind( SocketAddress address, IoHandler handler,
+                      SessionInitializer initializer ) throws IOException
+    {
         if( address == null )
         {
             throw new NullPointerException( "address" );
@@ -106,7 +116,7 @@
             throw new IllegalArgumentException( "Unsupported port number: 0" );
         }
 
-        RegistrationRequest request = new RegistrationRequest( address, backlog, handler );
+        RegistrationRequest request = new RegistrationRequest( address, backlog, handler, initializer );
 
         synchronized( this )
         {
@@ -136,7 +146,6 @@
         if( request.exception != null )
         {
             request.exception.fillInStackTrace();
-
             throw request.exception;
         }
     }
@@ -291,9 +300,31 @@
                     continue;
                 }
    
-                SocketSession session = new SocketSession( filters, ch, ( IoHandler ) key.attachment() );
-   
-                SocketIoProcessor.getInstance().addSession( session );
+                boolean success = false;
+                try
+                {
+                    RegistrationRequest req = ( RegistrationRequest ) key.attachment();
+                    SocketSession session = new SocketSession( filters, ch, req.handler );
+                    
+                    if( req.initializer != null )
+                    {
+                        req.initializer.initializeSession( session );
+                    }
+                    
+                    SocketIoProcessor.getInstance().addSession( session );
+                    success = true;
+                }
+                catch( Throwable t )
+                {
+                    exceptionMonitor.exceptionCaught( SocketAcceptor.this, t );
+                }
+                finally
+                {
+                    if( !success )
+                    {
+                        ch.close();
+                    }
+                }
             }
         }
     }
@@ -330,7 +361,7 @@
 
                 ssc.socket().bind( req.address, req.backlog );
 
-                ssc.register( selector, SelectionKey.OP_ACCEPT, req.handler );
+                ssc.register( selector, SelectionKey.OP_ACCEPT, req );
 
                 channels.put( req.address, ssc );
             }
@@ -433,17 +464,19 @@
 
         private final IoHandler handler;
         
+        private final SessionInitializer initializer;
+        
         private IOException exception; 
         
         private boolean done;
         
-        private RegistrationRequest( SocketAddress address, int backlog, IoHandler handler )
+        private RegistrationRequest( SocketAddress address, int backlog, IoHandler handler,
+                                     SessionInitializer initializer )
         {
             this.address = address;
-
             this.backlog = backlog;
-
             this.handler = handler;
+            this.initializer = initializer;
         }
     }
 
@@ -460,22 +493,5 @@
         {
             this.address = address;
         }
-    }
-
-    
-    public ExceptionMonitor getExceptionMonitor()
-    {
-        return exceptionMonitor;
-    }
-
-
-    public void setExceptionMonitor( ExceptionMonitor monitor )
-    {
-        if( monitor == null )
-        {
-            monitor = new DefaultExceptionMonitor();
-        }
-
-        this.exceptionMonitor = monitor;
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java Thu Apr 21 02:19:31 2005
@@ -28,12 +28,12 @@
 import java.util.Iterator;
 import java.util.Set;
 
-import org.apache.mina.io.DefaultExceptionMonitor;
-import org.apache.mina.io.ExceptionMonitor;
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.io.IoConnector;
 import org.apache.mina.io.IoHandler;
 import org.apache.mina.io.IoHandlerFilterChain;
 import org.apache.mina.io.IoSession;
+import org.apache.mina.util.BaseSessionManager;
 import org.apache.mina.util.Queue;
 
 /**
@@ -42,7 +42,7 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class SocketConnector implements IoConnector
+public class SocketConnector extends BaseSessionManager implements IoConnector
 {
     private static volatile int nextId = 0;
 
@@ -52,8 +52,6 @@
 
     private final Selector selector;
 
-    private ExceptionMonitor exceptionMonitor = new DefaultExceptionMonitor();
-
     private final Queue connectQueue = new Queue();
 
     private Worker worker;
@@ -68,26 +66,44 @@
         selector = Selector.open();
     }
 
-    public IoSession connect( SocketAddress address, IoHandler handler )
-            throws IOException
+    public IoSession connect( SocketAddress address, IoHandler handler ) throws IOException
     {
-        return connect( address, null, handler );
+        return connect( address, null, Integer.MAX_VALUE, handler, null);
     }
 
-    public IoSession connect( SocketAddress address, SocketAddress localAddress,
-                              IoHandler handler ) throws IOException
+    public IoSession connect( SocketAddress address, SocketAddress localAddress, IoHandler handler ) throws IOException
+    {
+        return connect( address, localAddress, Integer.MAX_VALUE, handler, null);
+    }
+
+    public IoSession connect( SocketAddress address, int timeout, IoHandler handler ) throws IOException
+    {
+        return connect( address, null, timeout, handler, null);
+    }
+
+    public IoSession connect( SocketAddress address, SocketAddress localAddress, int timeout, IoHandler handler ) throws IOException
+    {
+        return connect( address, localAddress, timeout, handler, null);
+    }
+
+    public IoSession connect( SocketAddress address, IoHandler handler, SessionInitializer initializer ) throws IOException
+    {
+        return connect( address, null, Integer.MAX_VALUE, handler, initializer );
+    }
+
+    public IoSession connect( SocketAddress address, SocketAddress localAddress, IoHandler handler, SessionInitializer initializer ) throws IOException
     {
-        return connect( address, localAddress, Integer.MAX_VALUE, handler );
+        return connect( address, localAddress, Integer.MAX_VALUE, handler, initializer );
     }
 
-    public IoSession connect( SocketAddress address, int timeout,
-                              IoHandler handler ) throws IOException
+    public IoSession connect( SocketAddress address, int timeout, IoHandler handler, SessionInitializer initializer ) throws IOException
     {
-        return connect( address, null, timeout, handler );
+        return connect( address, null, timeout, handler, initializer );
     }
 
     public IoSession connect( SocketAddress address, SocketAddress localAddress,
-                              int timeout, IoHandler handler ) throws IOException
+                              int timeout, IoHandler handler,
+                              SessionInitializer initializer ) throws IOException
     {
         if( address == null )
             throw new NullPointerException( "address" );
@@ -106,7 +122,7 @@
                                                 + localAddress.getClass() );
 
         SocketChannel ch = SocketChannel.open();
-        boolean initialized = false;
+        boolean success = false;
         try
         {
             if( localAddress != null )
@@ -115,23 +131,22 @@
             }
             ch.configureBlocking( false );
     
-            boolean connected = ch.connect( address );
-            initialized = true;
-
-            if( connected )
+            if( ch.connect( address ) )
             {
-                return newSession( ch, handler );
+                return newSession( ch, handler, initializer );
             }
+            
+            success = true;
         }
         finally
         {
-            if( !initialized )
+            if( !success )
             {
                 ch.close();
             }
         }
 
-        ConnectionRequest request = new ConnectionRequest( ch, timeout, handler );
+        ConnectionRequest request = new ConnectionRequest( ch, timeout, handler, initializer );
         synchronized( this )
         {
             synchronized( connectQueue )
@@ -224,7 +239,7 @@
             try
             {
                 ch.finishConnect();
-                SocketSession session = newSession( ch, entry.handler );
+                SocketSession session = newSession( ch, entry.handler, entry.initializer );
                 entry.session = session;
             }
             catch( IOException e )
@@ -275,9 +290,13 @@
         }
     }
 
-    private SocketSession newSession( SocketChannel ch, IoHandler handler )
+    private SocketSession newSession( SocketChannel ch, IoHandler handler, SessionInitializer initializer ) throws IOException
     {
         SocketSession session = new SocketSession( filters, ch, handler );
+        if( initializer != null )
+        {
+            initializer.initializeSession( session );
+        }
         SocketIoProcessor.getInstance().addSession( session );
         return session;
     }
@@ -342,6 +361,8 @@
         private final long deadline;
 
         private final IoHandler handler;
+        
+        private final SessionInitializer initializer;
 
         private SocketSession session;
 
@@ -349,31 +370,17 @@
 
         private IOException exception;
 
-        private ConnectionRequest( SocketChannel channel, int timeout, IoHandler handler )
+        private ConnectionRequest( SocketChannel channel, int timeout, IoHandler handler, SessionInitializer initializer )
         {
             this.channel = channel;
             this.deadline = System.currentTimeMillis() + timeout * 1000L;
             this.handler = handler;
+            this.initializer = initializer;
         }
     }
 
     public IoHandlerFilterChain getFilterChain()
     {
         return filters;
-    }
-
-    public ExceptionMonitor getExceptionMonitor()
-    {
-        return exceptionMonitor;
-    }
-
-    public void setExceptionMonitor( ExceptionMonitor monitor )
-    {
-        if( monitor == null )
-        {
-            monitor = new DefaultExceptionMonitor();
-        }
-
-        this.exceptionMonitor = monitor;
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolAcceptor.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolAcceptor.java Thu Apr 21 02:19:31 2005
@@ -21,6 +21,9 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 
+import org.apache.mina.common.SessionInitializer;
+import org.apache.mina.common.SessionManager;
+
 /**
  * Accepts incoming connection, communicates with clients, and fires events to
  * {@link ProtocolHandler}s.
@@ -42,8 +45,10 @@
  * 
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
+ * 
+ * @see SessionInitializer
  */
-public interface ProtocolAcceptor
+public interface ProtocolAcceptor extends SessionManager
 {
     /**
      * Binds to the specified <code>address</code> and handles incoming
@@ -52,6 +57,15 @@
      * @throws IOException if failed to bind
      */
     void bind( SocketAddress address, ProtocolProvider protocolProvider )
+            throws IOException;
+
+    /**
+     * Binds to the specified <code>address</code> and handles incoming
+     * connections with the specified <code>protocolProvider</code>.
+     * 
+     * @throws IOException if failed to bind
+     */
+    void bind( SocketAddress address, ProtocolProvider protocolProvider, SessionInitializer initializer )
             throws IOException;
 
     /**

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolConnector.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/ProtocolConnector.java Thu Apr 21 02:19:31 2005
@@ -21,6 +21,9 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 
+import org.apache.mina.common.SessionInitializer;
+import org.apache.mina.common.SessionManager;
+
 /**
  * Connects to endpoint, communicates with the server, and fires events to
  * {@link ProtocolProvider}s.
@@ -42,8 +45,10 @@
  * 
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
+ * 
+ * @see SessionInitializer
  */
-public interface ProtocolConnector
+public interface ProtocolConnector extends SessionManager
 {
     /**
      * Connects to the specified <code>address</code>.  If communication starts
@@ -86,6 +91,52 @@
      */
     ProtocolSession connect( SocketAddress address, SocketAddress localAddress,
                              int timeout, ProtocolProvider protocolProvider ) throws IOException;
+
+    /**
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>protocolProvider</code>.  This method blocks.
+     * 
+     * @throws IOException if failed to connect
+     */
+    ProtocolSession connect( SocketAddress address,
+                             ProtocolProvider protocolProvider,
+                             SessionInitializer initializer ) throws IOException;
+
+    /**
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>protocolProvider</code>.  This method blocks.
+     * 
+     * @param localAddress the local address the channel is bound to
+     * @throws IOException if failed to connect
+     */
+    ProtocolSession connect( SocketAddress address, SocketAddress localAddress,
+                             ProtocolProvider protocolProvider,
+                             SessionInitializer initializer ) throws IOException;
+
+    /**
+     * Connects to the specified <code>address</code> with timeout.  If
+     * communication starts successfully, events are fired to the specified
+     * <code>protocolProvider</code>.  This method blocks.
+     * 
+     * @throws IOException if failed to connect
+     */
+    ProtocolSession connect( SocketAddress address, int timeout,
+                             ProtocolProvider protocolProvider,
+                             SessionInitializer initializer ) throws IOException;
+
+    /**
+     * Connects to the specified <code>address</code> with timeout.  If
+     * communication starts successfully, events are fired to the specified
+     * <code>protocolProvider</code>.  This method blocks.
+     * 
+     * @param localAddress the local address the channel is bound to
+     * @throws IOException if failed to connect
+     */
+    ProtocolSession connect( SocketAddress address, SocketAddress localAddress,
+                             int timeout, ProtocolProvider protocolProvider,
+                             SessionInitializer initializer ) throws IOException;
 
     ProtocolHandlerFilterChain getFilterChain();
 }

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolAcceptor.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolAcceptor.java Thu Apr 21 02:19:31 2005
@@ -6,6 +6,8 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 
+import org.apache.mina.common.ExceptionMonitor;
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.io.IoAcceptor;
 import org.apache.mina.protocol.ProtocolAcceptor;
 import org.apache.mina.protocol.ProtocolHandlerFilterChain;
@@ -49,6 +51,12 @@
     {
         acceptor.bind( address, adapter.adapt( provider ) );
     }
+    
+    public void bind( SocketAddress address, ProtocolProvider provider,
+                      SessionInitializer initializer ) throws IOException
+    {
+        acceptor.bind( address, adapter.adapt( provider ), initializer );
+    }
 
     public void unbind( SocketAddress address )
     {
@@ -58,5 +66,15 @@
     public ProtocolHandlerFilterChain getFilterChain()
     {
         return adapter.getFilterChain();
+    }
+
+    public ExceptionMonitor getExceptionMonitor()
+    {
+        return acceptor.getExceptionMonitor();
+    }
+
+    public void setExceptionMonitor( ExceptionMonitor monitor )
+    {
+        acceptor.setExceptionMonitor( monitor );
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolConnector.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/io/IoProtocolConnector.java Thu Apr 21 02:19:31 2005
@@ -6,6 +6,8 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 
+import org.apache.mina.common.ExceptionMonitor;
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.io.IoConnector;
 import org.apache.mina.io.IoSession;
 import org.apache.mina.protocol.ProtocolConnector;
@@ -77,8 +79,51 @@
         return adapter.toProtocolSession( session );
     }
 
+    public ProtocolSession connect( SocketAddress address,
+                                    ProtocolProvider provider,
+                                    SessionInitializer initializer ) throws IOException
+    {
+        IoSession session = connector.connect(
+                address, adapter.adapt( provider ), initializer );
+        return adapter.toProtocolSession( session );
+    }
+
+    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress,
+                                    ProtocolProvider provider, SessionInitializer initializer ) throws IOException
+    {
+        IoSession session = connector.connect(
+                address, localAddress, adapter.adapt( provider ), initializer );
+        return adapter.toProtocolSession( session );
+    }
+
+    public ProtocolSession connect( SocketAddress address, int timeout,
+                                    ProtocolProvider provider, SessionInitializer initializer ) throws IOException
+    {
+        IoSession session = connector.connect(
+                address, timeout, adapter.adapt( provider ), initializer );
+        return adapter.toProtocolSession( session );
+    }
+
+    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress,
+                                    int timeout, ProtocolProvider provider, SessionInitializer initializer ) throws IOException
+    {
+        IoSession session = connector.connect(
+                address, localAddress, timeout, adapter.adapt( provider ), initializer );
+        return adapter.toProtocolSession( session );
+    }
+
     public ProtocolHandlerFilterChain getFilterChain()
     {
         return adapter.getFilterChain();
+    }
+
+    public ExceptionMonitor getExceptionMonitor()
+    {
+        return connector.getExceptionMonitor();
+    }
+
+    public void setExceptionMonitor( ExceptionMonitor monitor )
+    {
+        connector.setExceptionMonitor( monitor );
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeAcceptor.java Thu Apr 21 02:19:31 2005
@@ -8,10 +8,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.protocol.ProtocolAcceptor;
 import org.apache.mina.protocol.ProtocolHandler;
 import org.apache.mina.protocol.ProtocolHandlerFilterChain;
 import org.apache.mina.protocol.ProtocolProvider;
+import org.apache.mina.util.BaseSessionManager;
 
 /**
  * Binds the specified {@link ProtocolProvider} to the specified
@@ -20,7 +22,7 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class VmPipeAcceptor implements ProtocolAcceptor
+public class VmPipeAcceptor extends BaseSessionManager implements ProtocolAcceptor
 {
     static final Map boundHandlers = new HashMap();
 
@@ -33,9 +35,14 @@
     {
         filters.addLast( "VMPipe", new VmPipeFilter() );
     }
+    
+    public void bind( SocketAddress address, ProtocolProvider protocolProvider ) throws IOException
+    {
+        bind( address, protocolProvider, null );
+    }
 
-    public void bind( SocketAddress address, ProtocolProvider protocolProvider )
-            throws IOException
+    public void bind( SocketAddress address, ProtocolProvider protocolProvider,
+                      SessionInitializer initializer ) throws IOException
     {
         if( address == null )
             throw new NullPointerException( "address" );
@@ -52,8 +59,12 @@
                 throw new IOException( "Address already bound: " + address );
             }
 
-            boundHandlers.put( address, new Entry( ( VmPipeAddress ) address,
-                    filters, protocolProvider.getHandler() ) );
+            boundHandlers.put( address, 
+                               new Entry( this,
+                                          ( VmPipeAddress ) address,
+                                          filters,
+                                          protocolProvider.getHandler(),
+                                          initializer ) );
         }
     }
 
@@ -75,19 +86,27 @@
 
     static class Entry
     {
+        final VmPipeAcceptor acceptor;
+        
         final VmPipeAddress address;
 
         final VmPipeFilterChain filters;
 
         final ProtocolHandler handler;
+        
+        final SessionInitializer initializer;
 
-        private Entry( VmPipeAddress address,
+        private Entry( VmPipeAcceptor acceptor,
+                       VmPipeAddress address,
                        VmPipeFilterChain filters,
-                       ProtocolHandler handler )
+                       ProtocolHandler handler,
+                       SessionInitializer initializer )
         {
+            this.acceptor = acceptor;
             this.address = address;
             this.filters = filters;
             this.handler = handler;
+            this.initializer = initializer;
         }
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeConnector.java Thu Apr 21 02:19:31 2005
@@ -6,11 +6,13 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.protocol.ProtocolConnector;
 import org.apache.mina.protocol.ProtocolHandlerFilterChain;
 import org.apache.mina.protocol.ProtocolProvider;
 import org.apache.mina.protocol.ProtocolSession;
 import org.apache.mina.protocol.vmpipe.VmPipeAcceptor.Entry;
+import org.apache.mina.util.BaseSessionManager;
 
 /**
  * Connects to {@link ProtocolProvider}s which is bound on the specified
@@ -19,7 +21,7 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$
  */
-public class VmPipeConnector implements ProtocolConnector
+public class VmPipeConnector extends BaseSessionManager implements ProtocolConnector
 {
     private final VmPipeFilterChain filters = new VmPipeFilterChain();
 
@@ -36,14 +38,44 @@
         return filters;
     }
 
-    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress,
-                                    ProtocolProvider protocolProvider ) throws IOException
+    public ProtocolSession connect( SocketAddress address, ProtocolProvider protocolProvider ) throws IOException 
     {
-        return connect( address, protocolProvider );
+        return connect( address, null, Integer.MAX_VALUE, protocolProvider, null );
+    }
+
+    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress, ProtocolProvider protocolProvider ) throws IOException
+    {
+        return connect( address, localAddress, Integer.MAX_VALUE, protocolProvider, null );
+    }
+
+    public ProtocolSession connect( SocketAddress address, int timeout, ProtocolProvider protocolProvider ) throws IOException
+    {
+        return connect( address, null, timeout, protocolProvider, null );
+    }
+
+    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress, int timeout, ProtocolProvider protocolProvider ) throws IOException
+    {
+        return connect( address, localAddress, timeout, protocolProvider, null );
+    }
+
+    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress, ProtocolProvider protocolProvider, SessionInitializer initializer ) throws IOException
+    {
+        return connect( address, localAddress, Integer.MAX_VALUE, protocolProvider, initializer );
+    }
+
+    public ProtocolSession connect( SocketAddress address, int timeout, ProtocolProvider protocolProvider, SessionInitializer initializer ) throws IOException
+    {
+        return connect( address, null, timeout, protocolProvider, initializer );
+    }
+
+    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress, int timeout, ProtocolProvider protocolProvider, SessionInitializer initializer ) throws IOException
+    {
+        return connect( address, localAddress, timeout, protocolProvider, initializer );
     }
 
     public ProtocolSession connect( SocketAddress address,
-                                    ProtocolProvider protocolProvider ) throws IOException
+                                    ProtocolProvider protocolProvider,
+                                    SessionInitializer initializer ) throws IOException
     {
         if( address == null )
             throw new NullPointerException( "address" );
@@ -57,28 +89,14 @@
         if( entry == null )
             throw new IOException( "Endpoint unavailable: " + address );
 
-        VmPipeSession session = new VmPipeSession(
-                                                   new Object(), // lock
+        VmPipeSession session = new VmPipeSession( new Object(), // lock
                                                    AnonymousVmPipeAddress.INSTANCE,
-                                                   entry.address,
                                                    filters,
-                                                   protocolProvider
-                                                           .getHandler(),
-                                                   entry.filters,
-                                                   entry.handler );
+                                                   protocolProvider.getHandler(),
+                                                   initializer,
+                                                   entry );
+
         VmPipeIdleStatusChecker.INSTANCE.addSession( session );
         return session;
-    }
-
-    public ProtocolSession connect( SocketAddress address, int timeout,
-                                    ProtocolProvider protocolProvider ) throws IOException
-    {
-        return connect( address, protocolProvider );
-    }
-
-    public ProtocolSession connect( SocketAddress address, SocketAddress localAddress,
-                                    int timeout, ProtocolProvider protocolProvider ) throws IOException
-    {
-        return connect( address, protocolProvider );
     }
 }

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java?rev=164015&r1=164014&r2=164015&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/vmpipe/VmPipeSession.java Thu Apr 21 02:19:31 2005
@@ -3,14 +3,17 @@
  */
 package org.apache.mina.protocol.vmpipe;
 
+import java.io.IOException;
 import java.net.SocketAddress;
 
 import org.apache.mina.common.SessionConfig;
+import org.apache.mina.common.SessionInitializer;
 import org.apache.mina.common.TransportType;
 import org.apache.mina.protocol.ProtocolDecoder;
 import org.apache.mina.protocol.ProtocolEncoder;
 import org.apache.mina.protocol.ProtocolHandler;
 import org.apache.mina.protocol.ProtocolSession;
+import org.apache.mina.protocol.vmpipe.VmPipeAcceptor.Entry;
 import org.apache.mina.util.BaseSession;
 
 /**
@@ -26,7 +29,7 @@
     private final SocketAddress remoteAddress;
 
     private final ProtocolHandler localHandler;
-
+    
     private final VmPipeSessionConfig config = new VmPipeSessionConfig();
 
     final VmPipeFilterChain localFilters;
@@ -43,22 +46,37 @@
      * Constructor for client-side session.
      */
     VmPipeSession( Object lock, SocketAddress localAddress,
-                  SocketAddress remoteAddress,
-                  VmPipeFilterChain localFilters,
-                  ProtocolHandler localHandler,
-                  VmPipeFilterChain removeFilters,
-                  ProtocolHandler remoteHandler )
+                   VmPipeFilterChain localFilters,
+                   ProtocolHandler localHandler,
+                   SessionInitializer initializer,
+                   Entry remoteEntry ) throws IOException
     {
         this.lock = lock;
         this.localAddress = localAddress;
         this.localHandler = localHandler;
         this.localFilters = localFilters;
-        this.remoteAddress = remoteAddress;
-        this.remoteFilters = removeFilters;
+        this.remoteAddress = remoteEntry.address;
+        this.remoteFilters = remoteEntry.filters;
 
-        remoteSession = new VmPipeSession( this, remoteHandler );
+        remoteSession = new VmPipeSession( this, remoteEntry.handler );
+        if( remoteEntry.initializer != null )
+        {
+            boolean success = false;
+            try
+            {
+                remoteEntry.initializer.initializeSession( remoteSession );
+                success = true;
+            }
+            catch( Throwable t )
+            {
+                remoteEntry.acceptor.getExceptionMonitor().exceptionCaught( remoteEntry.acceptor, t );
+                IOException e = new IOException( "Failed to initialize remote session." );
+                e.initCause( t );
+                throw e;
+            }
+        }
 
-        removeFilters.sessionOpened( remoteSession );
+        remoteEntry.filters.sessionOpened( remoteSession );
         localFilters.sessionOpened( this );
     }
 

Added: directory/network/trunk/src/java/org/apache/mina/util/BaseSessionManager.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/util/BaseSessionManager.java?rev=164015&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/util/BaseSessionManager.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/util/BaseSessionManager.java Thu Apr 21 02:19:31 2005
@@ -0,0 +1,56 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.util;
+
+import org.apache.mina.common.DefaultExceptionMonitor;
+import org.apache.mina.common.ExceptionMonitor;
+import org.apache.mina.common.SessionManager;
+
+/**
+ * Base implementation of {@link SessionManager}s.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class BaseSessionManager implements SessionManager {
+
+    /**
+     * Current exception monitor.
+     */
+    protected ExceptionMonitor exceptionMonitor = new DefaultExceptionMonitor();
+
+    protected BaseSessionManager()
+    {
+    }
+
+    public ExceptionMonitor getExceptionMonitor()
+    {
+        return exceptionMonitor;
+    }
+
+    public void setExceptionMonitor( ExceptionMonitor monitor )
+    {
+        if( monitor == null )
+        {
+            monitor = new DefaultExceptionMonitor();
+        }
+
+        this.exceptionMonitor = monitor;
+    }
+}

Propchange: directory/network/trunk/src/java/org/apache/mina/util/BaseSessionManager.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/java/org/apache/mina/util/ExceptionUtil.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/util/ExceptionUtil.java?rev=164015&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/util/ExceptionUtil.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/util/ExceptionUtil.java Thu Apr 21 02:19:31 2005
@@ -0,0 +1,54 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.util;
+
+import java.io.IOException;
+
+/**
+ * Exception utility.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class ExceptionUtil {
+
+    public static void throwException( Throwable t ) throws IOException
+    {
+        if( t instanceof IOException )
+        {
+            throw ( IOException ) t;
+        }
+        else if( t instanceof RuntimeException )
+        {
+            throw ( RuntimeException ) t;
+        }
+        else if( t instanceof Error )
+        {
+            throw ( Error ) t;
+        }
+        else
+        {
+            throw new RuntimeException( t );
+        }
+    }
+    
+    private ExceptionUtil()
+    {
+    }
+}

Propchange: directory/network/trunk/src/java/org/apache/mina/util/ExceptionUtil.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision