You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by mh...@apache.org on 2007/12/18 03:47:05 UTC

svn commit: r605069 - in /mina/trunk: core/ core/src/main/java/org/apache/mina/common/ core/src/main/java/org/apache/mina/transport/vmpipe/ core/src/test/java/org/apache/mina/transport/ transport-serial/src/main/java/org/apache/mina/transport/serial/

Author: mheath
Date: Mon Dec 17 18:47:03 2007
New Revision: 605069

URL: http://svn.apache.org/viewvc?rev=605069&view=rev
Log:
Fixed DIRMINA-495 - Add support for initializing the IoSession from the code that invokes the IoConnector.connect(...) method.

Added:
    mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionInitializer.java
Modified:
    mina/trunk/core/   (props changed)
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoConnector.java
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingConnectionlessIoAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IoConnector.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java
    mina/trunk/transport-serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java

Propchange: mina/trunk/core/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Dec 17 18:47:03 2007
@@ -10,3 +10,5 @@
 *.log
 .deployables
 .settings
+
+.clover

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoConnector.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoConnector.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoConnector.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoConnector.java Mon Dec 17 18:47:03 2007
@@ -21,7 +21,6 @@
 
 import java.net.SocketAddress;
 
-
 /**
  * A base implementation of {@link IoConnector}.
  *
@@ -78,15 +77,34 @@
             throw new IllegalStateException("defaultRemoteAddress is not set.");
         }
         
-        return connect(defaultRemoteAddress, null);
+        return connect(defaultRemoteAddress, null, null);
+    }
+    
+    public ConnectFuture connect(IoSessionInitializer ioSessionInitializer) {
+        SocketAddress defaultRemoteAddress = getDefaultRemoteAddress();
+        if (defaultRemoteAddress == null) {
+            throw new IllegalStateException("defaultRemoteAddress is not set.");
+        }
+        
+        return connect(defaultRemoteAddress, null, ioSessionInitializer);
     }
 
     public final ConnectFuture connect(SocketAddress remoteAddress) {
-        return connect(remoteAddress, null);
+        return connect(remoteAddress, null, null);
+    }
+    
+    public ConnectFuture connect(SocketAddress remoteAddress,
+            IoSessionInitializer callback) {
+        return connect(remoteAddress, null, callback);
+    }
+    
+    public ConnectFuture connect(SocketAddress remoteAddress,
+            SocketAddress localAddress) {
+        return connect(remoteAddress, localAddress, null);
     }
 
     public final ConnectFuture connect(SocketAddress remoteAddress,
-            SocketAddress localAddress) {
+            SocketAddress localAddress, IoSessionInitializer ioSessionInitializer) {
         if (isDisposing()) {
             throw new IllegalStateException("Already disposed.");
         }
@@ -146,7 +164,7 @@
             }
         }
 
-        return connect0(remoteAddress, localAddress);
+        return connect0(remoteAddress, localAddress, ioSessionInitializer);
     }
 
     /**
@@ -155,7 +173,7 @@
      * @param localAddress <tt>null</tt> if no local address is specified
      */
     protected abstract ConnectFuture connect0(SocketAddress remoteAddress,
-            SocketAddress localAddress);
+            SocketAddress localAddress, IoSessionInitializer ioSessionInitializer);
 
     /**
      * Adds required internal attributes and {@link IoFutureListener}s

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java Mon Dec 17 18:47:03 2007
@@ -670,7 +670,7 @@
         return listeners;
     }
     
-    protected final void finishSessionInitialization(IoSession session, IoFuture future) {
+    protected final void finishSessionInitialization(IoSession session, IoFuture future, IoSessionInitializer ioSessionInitializer) {
         // Update lastIoTime if needed.
         if (getLastReadTime() == 0) {
             setLastReadTime(getActivationTime());
@@ -706,6 +706,10 @@
         if (future != null && future instanceof ConnectFuture) {
             // DefaultIoFilterChain will notify the future. (We support ConnectFuture only for now).
             session.setAttribute(DefaultIoFilterChain.SESSION_OPENED_FUTURE, future);
+        }
+        
+        if (ioSessionInitializer != null) {
+            ioSessionInitializer.initSession(session);
         }
         
         finishSessionInitialization0(session, future);

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingConnectionlessIoAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingConnectionlessIoAcceptor.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingConnectionlessIoAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingConnectionlessIoAcceptor.java Mon Dec 17 18:47:03 2007
@@ -235,7 +235,7 @@
             session = newSession;
         }
 
-        finishSessionInitialization(session, null);
+        finishSessionInitialization(session, null, null);
 
         try {
             this.getFilterChainBuilder().buildFilterChain(session.getFilterChain());

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java Mon Dec 17 18:47:03 2007
@@ -307,7 +307,7 @@
                     break;
                 }
                 
-                finishSessionInitialization(session, null);
+                finishSessionInitialization(session, null, null);
 
                 // add the session to the SocketIoProcessor
                 session.getProcessor().add(session);

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java Mon Dec 17 18:47:03 2007
@@ -146,7 +146,7 @@
     @Override
     @SuppressWarnings("unchecked")
     protected final ConnectFuture connect0(SocketAddress remoteAddress,
-                                      SocketAddress localAddress) {
+                                      SocketAddress localAddress, IoSessionInitializer callback) {
         H handle = null;
         boolean success = false;
         try {
@@ -154,7 +154,7 @@
             if (connect(handle, remoteAddress)) {
                 ConnectFuture future = new DefaultConnectFuture();
                 T session = newSession(processor, handle);
-                finishSessionInitialization(session, future);
+                finishSessionInitialization(session, future, callback);
                 // Forward the remaining process to the IoProcessor.
                 session.getProcessor().add(session);
                 success = true;
@@ -174,7 +174,7 @@
             }
         }
 
-        ConnectionRequest request = new ConnectionRequest(handle);
+        ConnectionRequest request = new ConnectionRequest(handle, callback);
         connectQueue.add(request);
         startupWorker();
         wakeup();
@@ -252,7 +252,7 @@
             try {
                 if (finishConnect(handle)) {
                     T session = newSession(processor, handle);
-                    finishSessionInitialization(session, entry);
+                    finishSessionInitialization(session, entry, entry.getSessionCallback());
                     // Forward the remaining process to the IoProcessor.
                     session.getProcessor().add(session);
                     nHandles ++;
@@ -346,8 +346,9 @@
     protected final class ConnectionRequest extends DefaultConnectFuture {
         private final H handle;
         private final long deadline;
+        private final IoSessionInitializer ioSessionInitializer;
 
-        public ConnectionRequest(H handle) {
+        public ConnectionRequest(H handle, IoSessionInitializer callback) {
             this.handle = handle;
             long timeout = getConnectTimeoutMillis();
             if (timeout <= 0L) {
@@ -355,6 +356,7 @@
             } else {
                 this.deadline = System.currentTimeMillis() + timeout;
             }
+            this.ioSessionInitializer = callback;
         }
 
         public H getHandle() {
@@ -365,6 +367,10 @@
             return deadline;
         }
 
+        public IoSessionInitializer getSessionCallback() {
+            return ioSessionInitializer;
+        }
+        
         @Override
         public void cancel() {
             super.cancel();

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/IoConnector.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoConnector.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IoConnector.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IoConnector.java Mon Dec 17 18:47:03 2007
@@ -76,6 +76,18 @@
     ConnectFuture connect();
     
     /**
+     * Connects to the {@link #setDefaultRemoteAddress(SocketAddress) default
+     * remote address} and invokes the <code>sessionCallback</code> when the
+     * IoSession is created but before {@link IoHandler#sessionCreated(IoSession)}
+     * is invoked.
+     * 
+     * @param ioSessionInitializer  the callback to invoke when the {@link IoSession} object is created
+     * 
+     * @throws IllegalStateException if no default remote address is set.
+     */
+    ConnectFuture connect(IoSessionInitializer ioSessionInitializer);
+    
+    /**
      * Connects to the specified remote address.
      *
      * @return the {@link ConnectFuture} instance which is completed when the
@@ -84,6 +96,19 @@
     ConnectFuture connect(SocketAddress remoteAddress);
 
     /**
+     * Connects to the specified remote address and invokes
+     * the <code>sessionCallback</code> when the IoSession is created but before
+     * {@link IoHandler#sessionCreated(IoSession)} is invoked.
+     * 
+     * @param remoteAddress  the remote address to connect to
+     * @param ioSessionInitializer  the callback to invoke when the {@link IoSession} object is created
+     * 
+     * @return the {@link ConnectFuture} instance which is completed when the
+     *         connection attempt initiated by this call succeeds or fails.
+     */
+    ConnectFuture connect(SocketAddress remoteAddress, IoSessionInitializer ioSessionInitializer);
+
+    /**
      * Connects to the specified remote address binding to the specified local address.
      *
      * @return the {@link ConnectFuture} instance which is completed when the
@@ -91,4 +116,20 @@
      */
     ConnectFuture connect(SocketAddress remoteAddress,
             SocketAddress localAddress);
+    
+    /**
+     * Connects to the specified remote address binding to the specified local
+     * address and invokes the <code>sessionCallback</code> when the IoSession
+     * is created but before {@link IoHandler#sessionCreated(IoSession)} is
+     * invoked.
+     * 
+     * @param remoteAddress  the remote address to connect to
+     * @param localAddress  the local interface to bind to
+     * @param ioSessionInitializer  the callback to invoke when the {@link IoSession} object is created
+     *
+     * @return the {@link ConnectFuture} instance which is completed when the
+     *         connection attempt initiated by this call succeeds or fails.
+     */
+    ConnectFuture connect(SocketAddress remoteAddress,
+            SocketAddress localAddress, IoSessionInitializer ioSessionInitializer);
 }

Added: mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionInitializer.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionInitializer.java?rev=605069&view=auto
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionInitializer.java (added)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionInitializer.java Mon Dec 17 18:47:03 2007
@@ -0,0 +1,33 @@
+/*
+ *  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;
+
+/**
+ * Defines a callback for obtaining the {@link IoSession} during
+ * session initialization.
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ * @version $Rev: 600461 $, $Date: 2007-12-03 02:55:52 -0700 (Mon, 03 Dec 2007) $
+ */
+public interface IoSessionInitializer {
+
+    void initSession(IoSession session);
+    
+}

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java Mon Dec 17 18:47:03 2007
@@ -143,6 +143,6 @@
     }
 
     void doFinishSessionInitialization(IoSession session, IoFuture future) {
-        finishSessionInitialization(session, future);
+        finishSessionInitialization(session, future, null);
     }
 }

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java Mon Dec 17 18:47:03 2007
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.mina.common.AbstractIoConnector;
@@ -33,6 +34,7 @@
 import org.apache.mina.common.IoFuture;
 import org.apache.mina.common.IoFutureListener;
 import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoSessionInitializer;
 import org.apache.mina.common.TransportMetadata;
 
 /**
@@ -62,7 +64,7 @@
 
     @Override
     protected ConnectFuture connect0(SocketAddress remoteAddress,
-                                      SocketAddress localAddress) {
+                                      SocketAddress localAddress, IoSessionInitializer ioSessionInitializer) {
         VmPipe entry = VmPipeAcceptor.boundHandlers.get(remoteAddress);
         if (entry == null) {
             return DefaultConnectFuture.newFailedFuture(new IOException(
@@ -82,7 +84,7 @@
         VmPipeSessionImpl localSession = new VmPipeSessionImpl(this,
                 getListeners(), actualLocalAddress, getHandler(), entry);
 
-        finishSessionInitialization(localSession, future);
+        finishSessionInitialization(localSession, future, ioSessionInitializer);
 
         // and reclaim the local address when the connection is closed.
         localSession.getCloseFuture().addListener(LOCAL_ADDRESS_RECLAIMER);

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java Mon Dec 17 18:47:03 2007
@@ -20,6 +20,8 @@
 package org.apache.mina.transport;
 
 import java.net.InetSocketAddress;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 import junit.framework.Assert;
 import junit.framework.TestCase;
@@ -30,6 +32,7 @@
 import org.apache.mina.common.IoHandlerAdapter;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.RuntimeIoException;
+import org.apache.mina.common.IoSessionInitializer;
 import org.apache.mina.util.AvailablePortFinder;
 
 /**
@@ -116,5 +119,44 @@
         } finally {
             connector.dispose();
         }
+    }
+    
+    /**
+     * Test to make sure the SessionCallback gets invoked before IoHandler.sessionCreated.
+     */
+    public void testSessionCallbackInvocation() throws Exception {
+        final int callbackInvoked = 0;
+        final int sessionCreatedInvoked = 1;
+        final int sessionCreatedInvokedBeforeCallback = 2;
+        final boolean[] assertions = {false, false, false};
+        final CountDownLatch latch = new CountDownLatch(2);
+        
+        int port = AvailablePortFinder.getNextAvailable(1025);
+        IoAcceptor acceptor = createAcceptor();
+        acceptor.setHandler(new IoHandlerAdapter());
+        InetSocketAddress address = new InetSocketAddress(port);
+        acceptor.bind(address);
+
+        IoConnector connector = createConnector();
+        connector.setHandler(new IoHandlerAdapter() {
+           @Override
+            public void sessionCreated(IoSession session) throws Exception {
+                   assertions[sessionCreatedInvoked] = true;
+                   assertions[sessionCreatedInvokedBeforeCallback] = !assertions[callbackInvoked];
+                   latch.countDown();
+            } 
+        });
+        
+        connector.connect(address, new IoSessionInitializer() {
+            public void initSession(IoSession session) {
+                assertions[callbackInvoked] = true;
+                latch.countDown();
+            }
+        });
+        
+        assertTrue("Timed out waiting for callback and IoHandler.sessionCreated to be invoked", latch.await(5, TimeUnit.SECONDS));
+        assertTrue("Callback was not invoked", assertions[callbackInvoked]);
+        assertTrue("IoHandler.sessionCreated was not invoked", assertions[sessionCreatedInvoked]);
+        assertFalse("IoHandler.sessionCreated was invoked before session callback", assertions[sessionCreatedInvokedBeforeCallback]);
     }
 }

Modified: mina/trunk/transport-serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java
URL: http://svn.apache.org/viewvc/mina/trunk/transport-serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java?rev=605069&r1=605068&r2=605069&view=diff
==============================================================================
--- mina/trunk/transport-serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java (original)
+++ mina/trunk/transport-serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java Mon Dec 17 18:47:03 2007
@@ -34,6 +34,7 @@
 import org.apache.mina.common.DefaultConnectFuture;
 import org.apache.mina.common.IoConnector;
 import org.apache.mina.common.IoFuture;
+import org.apache.mina.common.IoSessionInitializer;
 import org.apache.mina.common.TransportMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,7 +55,7 @@
 
     @Override
     protected ConnectFuture connect0(SocketAddress remoteAddress,
-            SocketAddress localAddress) {
+            SocketAddress localAddress, IoSessionInitializer ioSessionInitializer) {
 
         CommPortIdentifier portId;
         Enumeration<?> portList = CommPortIdentifier.getPortIdentifiers();
@@ -82,7 +83,7 @@
                         ConnectFuture future = new DefaultConnectFuture();
                         SerialSessionImpl session = new SerialSessionImpl(
                                 this, getListeners(), portAddress, serialPort);
-                        finishSessionInitialization(session, future);
+                        finishSessionInitialization(session, future, ioSessionInitializer);
                         session.start();
                         return future;
                     } catch (PortInUseException e) {