You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2006/01/21 03:18:50 UTC

svn commit: r370957 - in /directory/sandbox/trustin/mina-spi/core/src: main/java/org/apache/mina/common/ main/java/org/apache/mina/transport/socket/nio/ main/java/org/apache/mina/transport/vmpipe/ test/java/org/apache/mina/common/

Author: trustin
Date: Fri Jan 20 18:18:41 2006
New Revision: 370957

URL: http://svn.apache.org/viewcvs?rev=370957&view=rev
Log:
* Moved most methods in acceptor and connector to MINA
* Moved IoAcceptor and IoConnector interface into under IoServiceProvider

Removed:
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoAcceptor.java
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoConnector.java
Modified:
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoAddress.java
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoServiceProvider.java
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/MINA.java
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/DatagramServiceProvider.java
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/SocketServiceProvider.java
    directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeServiceProvider.java
    directory/sandbox/trustin/mina-spi/core/src/test/java/org/apache/mina/common/IoAddressTest.java

Modified: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoAddress.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoAddress.java?rev=370957&r1=370956&r2=370957&view=diff
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoAddress.java (original)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoAddress.java Fri Jan 20 18:18:41 2006
@@ -26,15 +26,15 @@
  */
 public class IoAddress
 {
-    private final String provider;
+    private final String providerType;
     private final String transportType;
     private final String address;
     
-    public IoAddress( String provider, String transportType, String address )
+    public IoAddress( String providerType, String transportType, String address )
     {
-        if( provider == null )
+        if( providerType == null )
         {
-            throw new NullPointerException( "provider" );
+            throw new NullPointerException( "providerType" );
         }
         if( transportType == null )
         {
@@ -45,20 +45,20 @@
             throw new NullPointerException( "address" );
         }
         
-        provider = provider.trim().toLowerCase();
+        providerType = providerType.trim().toLowerCase();
         transportType = transportType.trim().toLowerCase();
         address = address.trim();
         
-        if( provider.indexOf( ':' ) >= 0 )
+        if( providerType.indexOf( ':' ) >= 0 )
         {
-            throw new IllegalArgumentException( "provider: " + provider );
+            throw new IllegalArgumentException( "providerType: " + providerType );
         }
         if( transportType.indexOf( ':' ) >= 0 )
         {
             throw new IllegalArgumentException( "transportType: " + transportType );
         }
         
-        this.provider = provider;
+        this.providerType = providerType;
         this.transportType = transportType;
         this.address = address;
     }
@@ -73,7 +73,7 @@
         int startPos;
         int colonPos = uri.indexOf( ':' );
         checkColonPos( uri, colonPos );
-        provider = uri.substring( 0, colonPos ).trim().toLowerCase();
+        providerType = uri.substring( 0, colonPos ).trim().toLowerCase();
         startPos = colonPos + 1;
         
         colonPos = uri.indexOf( ':', startPos );
@@ -92,9 +92,9 @@
         }
     }
     
-    public String getProvider()
+    public String getProviderType()
     {
-        return provider;
+        return providerType;
     }
     
     public String getTransportType()
@@ -109,6 +109,6 @@
     
     public String toString()
     {
-        return provider + ':' + transportType + ':' + address;
+        return providerType + ':' + transportType + ':' + address;
     }
 }

Modified: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoServiceProvider.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoServiceProvider.java?rev=370957&r1=370956&r2=370957&view=diff
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoServiceProvider.java (original)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/IoServiceProvider.java Fri Jan 20 18:18:41 2006
@@ -18,6 +18,10 @@
  */
 package org.apache.mina.common;
 
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.util.Collection;
+
 /**
  * TODO Document me
  * 
@@ -26,8 +30,74 @@
  */
 public interface IoServiceProvider
 {
-    String getName();
+    String getProviderType();
     String getTransportType();
-    IoAcceptor newAcceptor();
-    IoConnector newConnector();
+    IoAcceptor getAcceptor();
+    IoConnector getConnector();
+    
+    public interface IoAcceptor
+    {
+        /**
+         * Binds to the specified <code>address</code> and handles incoming
+         * connections with the specified <code>handler</code>.
+         *
+         * @param filterChainBuilder
+         *            an {@link IoFilterChainBuilder} that will modify the
+         *            {@link IoFilterChain} of a newly created {@link IoSession}
+         * @throws IOException if failed to bind
+         */
+        void bind( SocketAddress address, IoHandler handler, IoFilterChainBuilder filterChainBuilder ) throws IOException;
+
+        /**
+         * Unbinds from the specified <code>address</code> and disconnects all clients
+         * connected there.
+         */
+        void unbind( SocketAddress address );
+        
+        /**
+         * Returns all sessions currently connected to the specified local address.
+         * 
+         * @param address the local address to return all sessions for. Must have
+         *        been bound previously.
+         * @return the sessions.
+         * @throws IllegalArgumentException if the specified <tt>address</tt> has 
+         *         not been bound.
+         * @throws UnsupportedOperationException if this operation isn't supported
+         *         for the particular transport type implemented by this 
+         *         {@link IoAcceptor}.
+         */
+        Collection getManagedSessions( SocketAddress address );
+        
+        /**
+         * (Optional) Returns an {@link IoSession} that is bound to the specified
+         * <tt>localAddress</tt> and <tt>remoteAddress</tt> which reuses
+         * the <tt>localAddress</tt> that is already bound by {@link IoAcceptor}
+         * via {@link #bind(SocketAddress, IoHandler)}.
+         * <p>
+         * This operation is optional.  Please throw {@link UnsupportedOperationException}
+         * if the transport type doesn't support this operation.  This operation is
+         * usually implemented for connectionless transport types.
+         * 
+         * @throws UnsupportedOperationException if this operation is not supported
+         * @throws IllegalArgumentException if the specified <tt>localAddress</tt> is
+         *                                  not bound yet. (see {@link #bind(SocketAddress, IoHandler)})
+         */
+        IoSession newSession( SocketAddress remoteAddress, SocketAddress localAddress );
+    }
+    
+    public interface IoConnector
+    {
+        /**
+         * Connects to the specified <code>address</code>.  If communication starts
+         * successfully, events are fired to the specified
+         * <code>handler</code>.
+         * 
+         * @param filterChainBuilder
+         *            an {@link IoFilterChainBuilder} that will modify the
+         *            {@link IoFilterChain} of a newly created {@link IoSession}
+         * @return {@link ConnectFuture} that will tell the result of the connection attempt
+         */
+        ConnectFuture connect( SocketAddress address, SocketAddress localAddress,
+                               IoHandler handler, IoFilterChainBuilder filterChainBuilder );
+    }
 }

Modified: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/MINA.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/MINA.java?rev=370957&r1=370956&r2=370957&view=diff
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/MINA.java (original)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/common/MINA.java Fri Jan 20 18:18:41 2006
@@ -18,6 +18,9 @@
  */
 package org.apache.mina.common;
 
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
@@ -26,6 +29,13 @@
 import org.apache.mina.common.support.discovery.tools.Service;
 import org.apache.mina.util.IdentityHashSet;
 
+/**
+ * TODO Document me
+ * TODO Add UnsupportedAddressException
+ * 
+ * @author The Apache Directory Project (dev@directory.apache.org)
+ * @version $Rev$, $Date$
+ */
 public class MINA
 {
     private static final Map providers = new HashMap();
@@ -61,16 +71,12 @@
         {
             if( providers.get( key ) != null )
             {
-                throw new IllegalArgumentException( "Provider '" + provider.getName() + "' is already registered." );
+                throw new IllegalArgumentException( "Provider '" + key + "' is already registered." );
             }
             providers.put( key, provider );
         }
     }
 
-	private static String getProviderKey(IoServiceProvider provider) {
-		return provider.getName() + ':' + provider.getTransportType();
-	}
-    
     public static boolean deregisterProvider( IoServiceProvider provider )
     {
         if( provider == null )
@@ -90,5 +96,166 @@
         {
             return new IdentityHashSet( providers.values() );
         }
+    }
+    
+    public static IoServiceProvider getProvider( String providerType, String transportType )
+    {
+    	return ( IoServiceProvider ) providers.get( getProviderKey( providerType, transportType ) );
+    }
+    
+    private static IoServiceProvider getProviderSafely( IoAddress address )
+    {
+    	IoServiceProvider p = getProvider( address.getProviderType(), address.getTransportType() );
+    	if( p != null )
+    	{
+    		return p;
+    	}
+    	
+    	throw new IllegalArgumentException( "Unsupported address: " + address );
+    }
+    
+	private static String getProviderKey( IoServiceProvider provider ) {
+		return getProviderKey( provider.getProviderType(), provider.getTransportType() );
+	}
+	
+	private static String getProviderKey( String providerType, String transportType )
+	{
+		return providerType + ':' + transportType;
+	}
+    
+	// Acceptor side
+	
+    /**
+     * Binds to the specified <code>address</code> and handles incoming
+     * connections with the specified <code>handler</code>.
+     * 
+     * @throws IOException if failed to bind
+     */
+    public static void bind( IoAddress address, IoHandler handler ) throws IOException
+    {
+    	bind( address, handler, IoFilterChainBuilder.NOOP );
+    }
+
+    /**
+     * Binds to the specified <code>address</code> and handles incoming
+     * connections with the specified <code>handler</code>.
+     *
+     * @param filterChainBuilder
+     *            an {@link IoFilterChainBuilder} that will modify the
+     *            {@link IoFilterChain} of a newly created {@link IoSession}
+     * @throws IOException if failed to bind
+     */
+    public static void bind( IoAddress address, IoHandler handler, IoFilterChainBuilder filterChainBuilder ) throws IOException
+    {
+    	IoAcceptor acceptor = getProviderSafely( address ).getAcceptor();
+    	acceptor.bind( address, handler, filterChainBuilder );
+    }
+
+    /**
+     * Unbinds from the specified <code>address</code> and disconnects all clients
+     * connected there.
+     */
+    public static void unbind( IoAddress address )
+    {
+    	IoAcceptor acceptor = getProviderSafely( address ).getAcceptor();
+    	acceptor.unbind( address );
+    }
+    
+    /**
+     * Returns all sessions currently connected to the specified local address.
+     * 
+     * @param address the local address to return all sessions for. Must have
+     *        been bound previously.
+     * @return the sessions.
+     * @throws IllegalArgumentException if the specified <tt>address</tt> has 
+     *         not been bound.
+     * @throws UnsupportedOperationException if this operation isn't supported
+     *         for the particular transport type implemented by this 
+     *         {@link IoAcceptor}.
+     */
+    public static Collection getManagedSessions( IoAddress address )
+    {
+    	IoAcceptor acceptor = getProviderSafely( address ).getAcceptor();
+    	return acceptor.getManagedSessions( address );
+    }
+    
+    /**
+     * (Optional) Returns an {@link IoSession} that is bound to the specified
+     * <tt>localAddress</tt> and <tt>remoteAddress</tt> which reuses
+     * the <tt>localAddress</tt> that is already bound by {@link IoAcceptor}
+     * via {@link #bind(SocketAddress, IoHandler)}.
+     * <p>
+     * This operation is optional.  Please throw {@link UnsupportedOperationException}
+     * if the transport type doesn't support this operation.  This operation is
+     * usually implemented for connectionless transport types.
+     * 
+     * @throws UnsupportedOperationException if this operation is not supported
+     * @throws IllegalArgumentException if the specified <tt>localAddress</tt> is
+     *                                  not bound yet. (see {@link #bind(SocketAddress, IoHandler)})
+     */
+    public static IoSession newSession( IoAddress remoteAddress, IoAddress localAddress )
+    {
+    	IoAcceptor acceptor = getProviderSafely( localAddress ).getAcceptor();
+    	return acceptor.newSession( remoteAddress, localAddress );
+    }
+    
+    // Connector side
+    
+    /**
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>handler</code>.
+     * 
+     * @return {@link ConnectFuture} that will tell the result of the connection attempt
+     */
+    public static ConnectFuture connect( IoAddress address, IoHandler handler )
+    {
+    	return connect( address, handler, IoFilterChainBuilder.NOOP );
+    }
+    
+    /**
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>handler</code>.
+     * 
+     * @param filterChainBuilder
+     *            an {@link IoFilterChainBuilder} that will modify the
+     *            {@link IoFilterChain} of a newly created {@link IoSession}
+     * @return {@link ConnectFuture} that will tell the result of the connection attempt
+     */
+    public static ConnectFuture connect( IoAddress address, IoHandler handler,
+                           IoFilterChainBuilder filterChainBuilder )
+    {
+    	return connect( address, null, handler, filterChainBuilder );
+    }
+
+    /**
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>handler</code>.
+     * 
+     * @param localAddress the local address the channel is bound to
+     * @return {@link ConnectFuture} that will tell the result of the connection attempt
+     */
+    public static ConnectFuture connect( IoAddress address, IoAddress localAddress, IoHandler handler )
+    {
+    	return connect( address, localAddress, handler, IoFilterChainBuilder.NOOP );
+    }
+
+    /**
+     * Connects to the specified <code>address</code>.  If communication starts
+     * successfully, events are fired to the specified
+     * <code>handler</code>.
+     * 
+     * @param filterChainBuilder
+     *            an {@link IoFilterChainBuilder} that will modify the
+     *            {@link IoFilterChain} of a newly created {@link IoSession}
+     * @return {@link ConnectFuture} that will tell the result of the connection attempt
+     */
+    public static ConnectFuture connect( IoAddress address, IoAddress localAddress,
+                                         IoHandler handler, IoFilterChainBuilder filterChainBuilder )
+    {
+    	IoConnector connector = getProviderSafely( address ).getConnector();
+    	return connector.connect( address, localAddress, handler, filterChainBuilder );
     }
 }

Modified: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/DatagramServiceProvider.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/DatagramServiceProvider.java?rev=370957&r1=370956&r2=370957&view=diff
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/DatagramServiceProvider.java (original)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/DatagramServiceProvider.java Fri Jan 20 18:18:41 2006
@@ -24,7 +24,10 @@
 
 public class DatagramServiceProvider implements IoServiceProvider
 {
-    public String getName()
+	private final IoAcceptor acceptor = new DatagramAcceptor();
+	private final IoConnector connector = new DatagramConnector();
+	
+    public String getProviderType()
     {
         return "nio";
     }
@@ -34,13 +37,13 @@
     	return "datagram";
     }
 
-    public IoAcceptor newAcceptor()
+    public IoAcceptor getAcceptor()
     {
-        return new DatagramAcceptor();
+        return acceptor;
     }
 
-    public IoConnector newConnector()
+    public IoConnector getConnector()
     {
-        return new DatagramConnector();
+        return connector;
     }
 }

Modified: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/SocketServiceProvider.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/SocketServiceProvider.java?rev=370957&r1=370956&r2=370957&view=diff
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/SocketServiceProvider.java (original)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/socket/nio/SocketServiceProvider.java Fri Jan 20 18:18:41 2006
@@ -24,7 +24,10 @@
 
 public class SocketServiceProvider implements IoServiceProvider
 {
-    public String getName()
+	private final IoAcceptor acceptor = new SocketAcceptor();
+	private final IoConnector connector = new SocketConnector();
+	
+    public String getProviderType()
     {
         return "nio";
     }
@@ -34,13 +37,13 @@
     	return "socket";
     }
 
-    public IoAcceptor newAcceptor()
+    public IoAcceptor getAcceptor()
     {
-        return new SocketAcceptor();
+        return acceptor;
     }
 
-    public IoConnector newConnector()
+    public IoConnector getConnector()
     {
-        return new SocketConnector();
+        return connector;
     }
 }

Modified: directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeServiceProvider.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeServiceProvider.java?rev=370957&r1=370956&r2=370957&view=diff
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeServiceProvider.java (original)
+++ directory/sandbox/trustin/mina-spi/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeServiceProvider.java Fri Jan 20 18:18:41 2006
@@ -24,8 +24,10 @@
 
 public class VmPipeServiceProvider implements IoServiceProvider
 {
+	private final IoAcceptor acceptor = new VmPipeAcceptor();
+	private final IoConnector connector = new VmPipeConnector();
 
-    public String getName()
+    public String getProviderType()
     {
         return "vm";
     }
@@ -35,13 +37,13 @@
     	return "pipe";
     }
 
-    public IoAcceptor newAcceptor()
+    public IoAcceptor getAcceptor()
     {
-        return new VmPipeAcceptor();
+        return acceptor;
     }
 
-    public IoConnector newConnector()
+    public IoConnector getConnector()
     {
-        return new VmPipeConnector();
+        return connector;
     }
 }

Modified: directory/sandbox/trustin/mina-spi/core/src/test/java/org/apache/mina/common/IoAddressTest.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trustin/mina-spi/core/src/test/java/org/apache/mina/common/IoAddressTest.java?rev=370957&r1=370956&r2=370957&view=diff
==============================================================================
--- directory/sandbox/trustin/mina-spi/core/src/test/java/org/apache/mina/common/IoAddressTest.java (original)
+++ directory/sandbox/trustin/mina-spi/core/src/test/java/org/apache/mina/common/IoAddressTest.java Fri Jan 20 18:18:41 2006
@@ -70,7 +70,7 @@
     public void testConstructor2() throws Exception
     {
         IoAddress uri = new IoAddress( "nio:socket:192.168.0.1:8080" );
-        Assert.assertEquals( "nio", uri.getProvider() );
+        Assert.assertEquals( "nio", uri.getProviderType() );
         Assert.assertEquals( "socket", uri.getTransportType() );
         Assert.assertEquals( "192.168.0.1:8080", uri.getAddress() );
     }