Author: trustin Date: Mon Feb 7 00:19:28 2005 New Revision: 151711 URL: http://svn.apache.org/viewcvs?view=rev&rev=151711 Log: Implemented registry package. Added: incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/ incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/Main.java (with props) incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/package.html (with props) incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/SimpleServiceRegistry.java (with props) Removed: incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/SimpleService.java Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/common/TransportType.java incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/Service.java incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/ServiceRegistry.java incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/package.html incubator/directory/network/mina/trunk/xdocs/index.xml Added: incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/Main.java URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/Main.java?view=auto&rev=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/Main.java (added) +++ incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/Main.java Mon Feb 7 00:19:28 2005 @@ -0,0 +1,45 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.examples.registry; + +import org.apache.mina.common.TransportType; +import org.apache.mina.examples.echoserver.EchoProtocolHandler; +import org.apache.mina.examples.reverser.ReverseProtocolProvider; +import org.apache.mina.registry.Service; +import org.apache.mina.registry.ServiceRegistry; +import org.apache.mina.registry.SimpleServiceRegistry; + +/** + * This example demonstrates the usage of {@link ServiceRegistry} in + * org.apache.mina.registry package. + * + * This application starts up echo and reverse protocol server. + * + * @author Trustin Lee (trustin@apache.org) + * @version $Rev$, $Date$, + */ +public class Main +{ + public static void main( String[] args ) throws Exception + { + ServiceRegistry registry = new SimpleServiceRegistry(); + + // Register echo service + registry.bind( new Service( "echo", TransportType.SOCKET, 8080 ), + new EchoProtocolHandler() ); + registry.bind( new Service( "echo", TransportType.DATAGRAM, 8080 ), + new EchoProtocolHandler() ); + + // Register reverse service + registry.bind( new Service( "reverse", TransportType.SOCKET, 8081 ), + new ReverseProtocolProvider() ); + registry.bind( + new Service( "reverse", TransportType.DATAGRAM, 8081 ), + new ReverseProtocolProvider() ); + registry.bind( new Service( "reverse", TransportType.VM_PIPE, 8081 ), + new ReverseProtocolProvider() ); + + System.out.println(registry.getAllServices()); + } +} Propchange: incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/Main.java ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Added: incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/package.html URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/package.html?view=auto&rev=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/package.html (added) +++ incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/package.html Mon Feb 7 00:19:28 2005 @@ -0,0 +1,8 @@ + + + + + +Demonstrates the usage of org.apache.mina.registry package. + + Propchange: incubator/directory/network/mina/trunk/src/examples/org/apache/mina/examples/registry/package.html ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/common/TransportType.java URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/common/TransportType.java?view=diff&r1=151710&r2=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/java/org/apache/mina/common/TransportType.java (original) +++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/common/TransportType.java Mon Feb 7 00:19:28 2005 @@ -18,32 +18,37 @@ */ package org.apache.mina.common; +import java.io.InvalidObjectException; +import java.io.ObjectStreamException; +import java.io.Serializable; + /** * Represents network transport types. * * @author Trustin Lee (trustin@apache.org) * @version $Rev$, $Date$ */ -public class TransportType +public class TransportType implements Serializable { + private static final long serialVersionUID = 3258132470497883447L; + /** * Transport type: TCP/IP (SocketChannel) */ public static final TransportType SOCKET = new TransportType( "SOCKET", - false ); + false ); /** * Transport type: UDP/IP (DatagramChannel) */ public static final TransportType DATAGRAM = new TransportType( - "DATAGRAM", - true ); + "DATAGRAM", true ); /** * Transport type: VM pipe (direct message exchange) */ public static final TransportType VM_PIPE = new TransportType( "VM_PIPE", - false ); + false ); private final String strVal; @@ -71,4 +76,17 @@ { return strVal; } -} \ No newline at end of file + + private Object readResolve() throws ObjectStreamException + { + if( strVal.equals( SOCKET.toString() ) ) + return SOCKET; + if( strVal.equals( DATAGRAM.toString() ) ) + return DATAGRAM; + if( strVal.equals( VM_PIPE.toString() ) ) + return VM_PIPE; + else + throw new InvalidObjectException( "Unknown transport type: " + + this ); + } +} Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?view=diff&r1=151710&r2=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original) +++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Mon Feb 7 00:19:28 2005 @@ -136,8 +136,7 @@ ch = ( DatagramChannel ) channels.get( address ); if( ch == null ) - throw new IllegalArgumentException( "Unknown address: " - + address ); + return; SelectionKey key = ch.keyFor( selector ); channels.remove( address ); Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java?view=diff&r1=151710&r2=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java (original) +++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketAcceptor.java Mon Feb 7 00:19:28 2005 @@ -146,8 +146,7 @@ ssc = ( ServerSocketChannel ) channels.get( address ); if( ssc == null ) - throw new IllegalArgumentException( "Unknown address: " - + address ); + return; SelectionKey key = ssc.keyFor( selector ); channels.remove( address ); Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/Service.java URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/Service.java?view=diff&r1=151710&r2=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/Service.java (original) +++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/Service.java Mon Feb 7 00:19:28 2005 @@ -18,6 +18,8 @@ */ package org.apache.mina.registry; +import java.io.Serializable; + import org.apache.mina.common.TransportType; /** @@ -26,11 +28,92 @@ * @author Trustin Lee (trustin@apache.org) * @version $Rev$, $Date$ */ -public interface Service +public class Service implements Serializable, Cloneable { - String getName(); + private static final long serialVersionUID = 3258407344110383155L; + + private final String name; + + private final TransportType transportType; + + private final int port; + + /** + * Creates a new instance with the specified protocol name, transport type, + * and port number. + */ + public Service( String name, TransportType transportType, int port ) + { + if( name == null ) + throw new NullPointerException( "name" ); + if( transportType == null ) + throw new NullPointerException( "transportType" ); + if( port < 0 || port > 65535 ) + throw new IllegalArgumentException( "port: " + port ); + + this.name = name; + this.transportType = transportType; + this.port = port; + } + + /** + * Returns the name of this service (protocol). + */ + public String getName() + { + return name; + } + + /** + * Returns the transport type this service uses. + */ + public TransportType getTransportType() + { + return transportType; + } + + /** + * Returns the port number this service is bound on. + */ + public int getPort() + { + return port; + } + + public int hashCode() + { + return ( ( name.hashCode() * 37 ) ^ transportType.hashCode() * 37 ) + ^ port; + } + + public boolean equals( Object o ) + { + if( o == null ) + return false; + if( this == o ) + return true; + if( !( o instanceof Service ) ) + return false; - TransportType getTransportType(); + Service that = ( Service ) o; + return this.name.equals( that.name ) + && this.transportType == that.transportType + && this.port == that.port; + } - int getPort(); -} \ No newline at end of file + public Object clone() + { + try + { + return super.clone(); + } + catch( CloneNotSupportedException e ) + { + throw new InternalError(); + } + } + + public String toString() { + return "(" + transportType + ", " + name + ", " + port + ')'; + } +} Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/ServiceRegistry.java URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/ServiceRegistry.java?view=diff&r1=151710&r2=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/ServiceRegistry.java (original) +++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/ServiceRegistry.java Mon Feb 7 00:19:28 2005 @@ -19,13 +19,13 @@ package org.apache.mina.registry; import java.io.IOException; -import java.util.Iterator; +import java.util.Set; import org.apache.mina.common.TransportType; import org.apache.mina.io.IoHandler; import org.apache.mina.io.IoHandlerFilter; -import org.apache.mina.protocol.ProtocolHandler; import org.apache.mina.protocol.ProtocolHandlerFilter; +import org.apache.mina.protocol.ProtocolProvider; /** * Interface for the internet service registry. The registry is used by MINA @@ -37,51 +37,94 @@ */ public interface ServiceRegistry { - void bind( Service service, IoHandler sessionHandler ) throws IOException; + /** + * Binds the specified I/O handler to the specified service. + */ + void bind( Service service, IoHandler ioHandler ) throws IOException; - void bind( Service service, ProtocolHandler sessionHandler ) + /** + * Binds the specified protocol provider to the specified service. + */ + void bind( Service service, ProtocolProvider protocolProvider ) throws IOException; + /** + * Unbinds the specified service (and its aggregated I/O handler or + * protocol provider). + */ void unbind( Service service ); + /** + * Adds the specified filter to the acceptors of all transport types + * in this registry. + */ void addFilter( int priority, IoHandlerFilter filter ); - + + /** + * Adds the specified filter to the acceptors of all transport types + * in this registry. + */ void addFilter( int priority, ProtocolHandlerFilter filter ); + + /** + * Adds the specified filter to the acceptor of the specified transport + * type with the specified priority. + */ + void addFilter( TransportType transportType, int priority, + IoHandlerFilter filter ); - void addFilter( Service service, int priority, IoHandlerFilter filter ); - - void addFilter( Service service, int priority, ProtocolHandlerFilter filter ); + /** + * Adds the specified filter to the acceptor of the specified transport + * type with the specified priority. + */ + void addFilter( TransportType transportType, int priority, + ProtocolHandlerFilter filter ); + /** + * Removes the specified filter from the acceptors of all transport types + * in this registry. + */ void removeFilter( IoHandlerFilter filter ); + /** + * Removes the specified filter from the acceptors of all transport types + * in this registry. + */ void removeFilter( ProtocolHandlerFilter filter ); - Service getByName( String name, TransportType transportType ); - - Service getByPort( int port, TransportType transportType ); - - Iterator getAll(); + /** + * Removes the specified filter from the acceptor of the specified + * transport type. + */ + void removeFilter( TransportType transportType, IoHandlerFilter filter ); - Iterator getByTransportType( TransportType transportType ); + /** + * Removes the specified filter from the acceptor of the specified + * transport type. + */ + void removeFilter( TransportType transportType, + ProtocolHandlerFilter filter ); /** - * Gets an iteration over all the entries for a service by the name of the - * service. - * - * @param name - * the authoritative name of the service - * @return an Iterator over InetServiceEntry objects + * Returns {@link Set} of all services bound in this registry. */ - Iterator getByName( String name ); + Set getAllServices(); + + /** + * Returns {@link Set} of services bound in this registry with the + * specified service(or protocol) name. + */ + Set getServices(String name); /** - * Gets an iteration over all the entries for a service by port number. - * This method returns an Iterator over the set of InetServiceEntry objects - * since more than one transport protocol can be used on the same port. - * - * @param port - * the port one which the service resides - * @return an Iterator over InetServiceEntry objects + * Returns {@link Set} of services bound in this registry with the + * specified transport type. + */ + Set getServices(TransportType transportType); + + /** + * Returns {@link Set} of services bound in this registry with the + * specified port number. */ - Iterator getByPort( int port ); -} \ No newline at end of file + Set getServices(int port); +} Added: incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/SimpleServiceRegistry.java URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/SimpleServiceRegistry.java?view=auto&rev=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/SimpleServiceRegistry.java (added) +++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/SimpleServiceRegistry.java Mon Feb 7 00:19:28 2005 @@ -0,0 +1,311 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.registry; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.apache.mina.common.TransportType; +import org.apache.mina.io.IoAcceptor; +import org.apache.mina.io.IoHandler; +import org.apache.mina.io.IoHandlerFilter; +import org.apache.mina.io.datagram.DatagramAcceptor; +import org.apache.mina.io.filter.IoThreadPoolFilter; +import org.apache.mina.io.socket.SocketAcceptor; +import org.apache.mina.protocol.ProtocolAcceptor; +import org.apache.mina.protocol.ProtocolHandlerFilter; +import org.apache.mina.protocol.ProtocolProvider; +import org.apache.mina.protocol.filter.ProtocolThreadPoolFilter; +import org.apache.mina.protocol.io.IoProtocolAcceptor; +import org.apache.mina.protocol.vmpipe.VmPipeAcceptor; +import org.apache.mina.protocol.vmpipe.VmPipeAddress; + +/** + * A simple implementation of {@link ServiceRegistry}. + * + * This service registry supports socket, datagram, VM-pipe transport types, + * and thread pools were added by default. + * + * @author Trustin Lee (trustin@apache.org) + * @version $Rev$, $Date$, + */ +public class SimpleServiceRegistry implements ServiceRegistry +{ + protected final IoAcceptor socketIoAcceptor = new SocketAcceptor(); + + protected final IoAcceptor datagramIoAcceptor = new DatagramAcceptor(); + + protected final ProtocolAcceptor socketProtocolAcceptor = new IoProtocolAcceptor( + socketIoAcceptor ); + + protected final ProtocolAcceptor datagramProtocolAcceptor = new IoProtocolAcceptor( + datagramIoAcceptor ); + + protected final ProtocolAcceptor vmPipeAcceptor = new VmPipeAcceptor(); + + protected final IoThreadPoolFilter ioThreadPoolFilter = new IoThreadPoolFilter(); + + protected final ProtocolThreadPoolFilter protocolThreadPoolFilter = new ProtocolThreadPoolFilter(); + + private final Set services = new HashSet(); + + public SimpleServiceRegistry() throws IOException + { + socketIoAcceptor.addFilter( IoHandlerFilter.MAX_PRIORITY, + ioThreadPoolFilter ); + datagramIoAcceptor.addFilter( IoHandlerFilter.MAX_PRIORITY, + ioThreadPoolFilter ); + socketProtocolAcceptor.addFilter( ProtocolHandlerFilter.MAX_PRIORITY, + protocolThreadPoolFilter ); + datagramProtocolAcceptor.addFilter( + ProtocolHandlerFilter.MAX_PRIORITY, protocolThreadPoolFilter ); + vmPipeAcceptor.addFilter( ProtocolHandlerFilter.MAX_PRIORITY, + protocolThreadPoolFilter ); + } + + public synchronized void bind( Service service, IoHandler ioHandler ) + throws IOException + { + IoAcceptor acceptor = findIoAcceptor( service.getTransportType() ); + acceptor.bind( new InetSocketAddress( service.getPort() ), ioHandler ); + startThreadPools(); + services.add( service ); + } + + public synchronized void bind( Service service, + ProtocolProvider protocolProvider ) + throws IOException + { + ProtocolAcceptor acceptor = findProtocolAcceptor( service + .getTransportType() ); + if( acceptor instanceof VmPipeAcceptor ) + { + acceptor.bind( new VmPipeAddress( service.getPort() ), + protocolProvider ); + } + else + { + acceptor.bind( new InetSocketAddress( service.getPort() ), + protocolProvider ); + } + startThreadPools(); + services.add( service ); + } + + public synchronized void unbind( Service service ) + { + ProtocolAcceptor acceptor = findProtocolAcceptor( service + .getTransportType() ); + acceptor.unbind( new InetSocketAddress( service.getPort() ) ); + acceptor.unbind( new VmPipeAddress( service.getPort() ) ); + services.remove( service ); + stopThreadPools(); + } + + public synchronized void addFilter( int priority, IoHandlerFilter filter ) + { + boolean s = false; + boolean d = false; + try + { + socketIoAcceptor.addFilter( priority, filter ); + s = true; + datagramIoAcceptor.addFilter( priority, filter ); + d = true; + } + finally + { + if( !s || !d ) + { + // rollback + if( s ) + { + socketIoAcceptor.removeFilter( filter ); + } + + if( d ) + { + datagramIoAcceptor.removeFilter( filter ); + } + } + } + } + + public synchronized void addFilter( int priority, + ProtocolHandlerFilter filter ) + { + boolean s = false; + boolean d = false; + boolean v = false; + try + { + socketProtocolAcceptor.addFilter( priority, filter ); + s = true; + datagramProtocolAcceptor.addFilter( priority, filter ); + d = true; + vmPipeAcceptor.addFilter( priority, filter ); + v = true; + } + finally + { + if( !s || !d || !v ) + { + // rollback + if( s ) + { + socketProtocolAcceptor.removeFilter( filter ); + } + + if( d ) + { + datagramProtocolAcceptor.removeFilter( filter ); + } + + if( v ) + { + vmPipeAcceptor.removeFilter( filter ); + } + } + } + } + + public synchronized void addFilter( TransportType transportType, + int priority, IoHandlerFilter filter ) + { + IoAcceptor acceptor = findIoAcceptor( transportType ); + acceptor.addFilter( priority, filter ); + } + + public synchronized void addFilter( TransportType transportType, + int priority, + ProtocolHandlerFilter filter ) + { + ProtocolAcceptor acceptor = findProtocolAcceptor( transportType ); + acceptor.addFilter( priority, filter ); + } + + public synchronized void removeFilter( IoHandlerFilter filter ) + { + socketIoAcceptor.removeFilter( filter ); + datagramIoAcceptor.removeFilter( filter ); + } + + public synchronized void removeFilter( ProtocolHandlerFilter filter ) + { + socketProtocolAcceptor.removeFilter( filter ); + datagramProtocolAcceptor.removeFilter( filter ); + vmPipeAcceptor.removeFilter( filter ); + } + + public synchronized void removeFilter( TransportType transportType, + IoHandlerFilter filter ) + { + IoAcceptor acceptor = findIoAcceptor( transportType ); + acceptor.removeFilter( filter ); + } + + public synchronized void removeFilter( TransportType transportType, + ProtocolHandlerFilter filter ) + { + ProtocolAcceptor acceptor = findProtocolAcceptor( transportType ); + acceptor.removeFilter( filter ); + } + + public synchronized Set getAllServices() + { + return new HashSet( services ); + } + + public synchronized Set getServices( String name ) + { + Set result = new HashSet(); + Iterator it = services.iterator(); + while( it.hasNext() ) + { + Service s = ( Service ) it.next(); + if( name.equals( s.getName() ) ) + { + result.add( s ); + } + } + return result; + } + + public Set getServices( TransportType transportType ) + { + Set result = new HashSet(); + Iterator it = services.iterator(); + while( it.hasNext() ) + { + Service s = ( Service ) it.next(); + if( s.getTransportType() == transportType ) + { + result.add( s ); + } + } + return result; + } + + public Set getServices( int port ) + { + Set result = new HashSet(); + Iterator it = services.iterator(); + while( it.hasNext() ) + { + Service s = ( Service ) it.next(); + if( s.getPort() == port ) + { + result.add( s ); + } + } + return result; + } + + protected IoAcceptor findIoAcceptor( TransportType transportType ) + { + if( transportType == TransportType.SOCKET ) + return socketIoAcceptor; + else if( transportType == TransportType.DATAGRAM ) + return datagramIoAcceptor; + else + throw new IllegalArgumentException( + "Unsupported transport type: " + transportType ); + + } + + protected ProtocolAcceptor findProtocolAcceptor( + TransportType transportType ) + { + if( transportType == TransportType.SOCKET ) + return socketProtocolAcceptor; + else if( transportType == TransportType.DATAGRAM ) + return datagramProtocolAcceptor; + else if( transportType == TransportType.VM_PIPE ) + return vmPipeAcceptor; + else + throw new IllegalArgumentException( + "Unsupported transport type: " + transportType ); + } + + private void startThreadPools() + { + if( !services.isEmpty() ) + return; + + ioThreadPoolFilter.start(); + protocolThreadPoolFilter.start(); + } + + private void stopThreadPools() + { + if( !services.isEmpty() ) + return; + + ioThreadPoolFilter.stop(); + protocolThreadPoolFilter.stop(); + } +} Propchange: incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/SimpleServiceRegistry.java ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/package.html URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/package.html?view=diff&r1=151710&r2=151711 ============================================================================== --- incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/package.html (original) +++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/registry/package.html Mon Feb 7 00:19:28 2005 @@ -3,6 +3,6 @@ -This package is not yet implemented. +A frontend package that makes setting up MINA easier. Modified: incubator/directory/network/mina/trunk/xdocs/index.xml URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/xdocs/index.xml?view=diff&r1=151710&r2=151711 ============================================================================== --- incubator/directory/network/mina/trunk/xdocs/index.xml (original) +++ incubator/directory/network/mina/trunk/xdocs/index.xml Mon Feb 7 00:19:28 2005 @@ -61,6 +61,11 @@ Both + Registry + A frontend package that makes setting up MINA easier. + Server (registry) + + SumUp Migration from Netty SumUp example. Both