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

svn commit: r600461 - in /mina/trunk: core/src/main/java/org/apache/mina/common/ core/src/main/java/org/apache/mina/transport/socket/ core/src/main/java/org/apache/mina/transport/socket/nio/ core/src/main/java/org/apache/mina/transport/vmpipe/ core/src...

Author: trustin
Date: Mon Dec  3 01:55:52 2007
New Revision: 600461

URL: http://svn.apache.org/viewvc?rev=600461&view=rev
Log:
* Added IoAcceptor.defaultLocalAddress(es) - bind() will use this property
* Added IoAcceptor.bind(SocketAddress...)
* Added IoAcceptor.unbind(SocketAddress...)
* Added IoAcceptor.unbindAll()


Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoAcceptor.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/DummySession.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IoAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/SocketAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java
    mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
    mina/trunk/core/src/test/java/org/apache/mina/filter/stream/StreamWriteFilterTest.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractTrafficControlTest.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeEventOrderTest.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeSessionCrossCommunicationTest.java
    mina/trunk/example/src/main/java/org/apache/mina/example/chat/Main.java
    mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java
    mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/codec/Server.java
    mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/stream/Main.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java
    mina/trunk/example/src/main/java/org/apache/mina/example/proxy/Main.java
    mina/trunk/example/src/main/java/org/apache/mina/example/reverser/Main.java
    mina/trunk/example/src/main/java/org/apache/mina/example/sumup/Server.java
    mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java
    mina/trunk/example/src/main/java/org/apache/mina/example/tennis/Main.java
    mina/trunk/example/src/main/java/org/apache/mina/example/udp/MemoryMonitor.java
    mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java
    mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java
    mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java
    mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketAcceptor.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoAcceptor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoAcceptor.java Mon Dec  3 01:55:52 2007
@@ -24,7 +24,9 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 
 /**
@@ -36,11 +38,14 @@
 public abstract class AbstractIoAcceptor 
         extends AbstractIoService implements IoAcceptor {
     
-    private final List<SocketAddress> localAddresses = new ArrayList<SocketAddress>();
-    private final List<SocketAddress> unmodifiableLocalAddresses =
-        Collections.unmodifiableList(localAddresses);
+    private final List<SocketAddress> defaultLocalAddresses =
+        new ArrayList<SocketAddress>();
+    private final List<SocketAddress> unmodifiableDefaultLocalAddresses =
+        Collections.unmodifiableList(defaultLocalAddresses);
+    private final Set<SocketAddress> boundAddresses =
+        new HashSet<SocketAddress>();
+
     private boolean disconnectOnUnbind = true;
-    private boolean bound;
 
     /**
      * The lock object which is acquired while bind or unbind operation is performed.
@@ -51,24 +56,42 @@
 
     protected AbstractIoAcceptor(IoSessionConfig sessionConfig) {
         super(sessionConfig);
+        defaultLocalAddresses.add(null);
     }
 
     public SocketAddress getLocalAddress() {
+        Set<SocketAddress> localAddresses = getLocalAddresses();
         if (localAddresses.isEmpty()) {
             return null;
+        } else {
+            return localAddresses.iterator().next();
+        }
+    }
+
+    public final Set<SocketAddress> getLocalAddresses() {
+        Set<SocketAddress> localAddresses = new HashSet<SocketAddress>();
+        synchronized (bindLock) {
+            localAddresses.addAll(boundAddresses);
+        }
+        return localAddresses;
+    }
+
+    public SocketAddress getDefaultLocalAddress() {
+        if (defaultLocalAddresses.isEmpty()) {
+            return null;
         }
-        return localAddresses.iterator().next();
+        return defaultLocalAddresses.iterator().next();
     }
 
-    public final void setLocalAddress(SocketAddress localAddress) {
-        setLocalAddresses(new SocketAddress[] { localAddress });
+    public final void setDefaultLocalAddress(SocketAddress localAddress) {
+        setDefaultLocalAddresses(new SocketAddress[] { localAddress });
     }
 
-    public final List<SocketAddress> getLocalAddresses() {
-        return unmodifiableLocalAddresses;
+    public final List<SocketAddress> getDefaultLocalAddresses() {
+        return unmodifiableDefaultLocalAddresses;
     }
 
-    public final void setLocalAddresses(Iterable<SocketAddress> localAddresses) {
+    public final void setDefaultLocalAddresses(Iterable<? extends SocketAddress> localAddresses) {
         if (localAddresses == null) {
             throw new NullPointerException("localAddresses");
         }
@@ -78,16 +101,16 @@
             list.add(a);
         }
         
-        setLocalAddresses(list.toArray(new SocketAddress[list.size()]));
+        setDefaultLocalAddresses(list.toArray(new SocketAddress[list.size()]));
     }
 
-    public final void setLocalAddresses(SocketAddress... localAddresses) {
+    public final void setDefaultLocalAddresses(SocketAddress... localAddresses) {
         if (localAddresses == null) {
             throw new NullPointerException("localAddresses");
         }
         
         synchronized (bindLock) {
-            if (bound) {
+            if (!boundAddresses.isEmpty()) {
                 throw new IllegalStateException(
                         "localAddress can't be set while the acceptor is bound.");
             }
@@ -95,13 +118,7 @@
             Collection<SocketAddress> newLocalAddresses = 
                 new ArrayList<SocketAddress>();
             for (SocketAddress a: localAddresses) {
-                if (a != null &&
-                    !getTransportMetadata().getAddressType().isAssignableFrom(
-                                a.getClass())) {
-                    throw new IllegalArgumentException("localAddress type: "
-                            + a.getClass().getSimpleName() + " (expected: "
-                            + getTransportMetadata().getAddressType().getSimpleName() + ")");
-                }
+                checkAddressType(a);
                 newLocalAddresses.add(a);
             }
             
@@ -109,8 +126,8 @@
                 throw new IllegalArgumentException("empty localAddresses");
             }
             
-            this.localAddresses.clear();
-            this.localAddresses.addAll(newLocalAddresses);
+            this.defaultLocalAddresses.clear();
+            this.defaultLocalAddresses.addAll(newLocalAddresses);
         }
     }
 
@@ -123,27 +140,64 @@
     }
 
     public final void bind() throws IOException {
+        bind(getDefaultLocalAddresses());
+    }
+
+    public final void bind(SocketAddress localAddress) throws IOException {
+        if (localAddress == null) {
+            throw new NullPointerException("localAddress");
+        }
+        
+        List<SocketAddress> localAddresses = new ArrayList<SocketAddress>(1);
+        localAddresses.add(localAddress);
+        bind(localAddresses);
+    }
+
+    public final void bind(
+            SocketAddress firstLocalAddress,
+            SocketAddress... otherLocalAddresses) throws IOException {
+        if (firstLocalAddress == null) {
+            throw new NullPointerException("firstLocalAddress");
+        }
+        if (otherLocalAddresses == null) {
+            throw new NullPointerException("otherLocalAddresses");
+        }
+        
+        List<SocketAddress> localAddresses = new ArrayList<SocketAddress>();
+        localAddresses.add(firstLocalAddress);
+        Collections.addAll(localAddresses, otherLocalAddresses);
+        bind(localAddresses);
+    }
+
+    public final void bind(Iterable<? extends SocketAddress> localAddresses) throws IOException {
         if (isDisposing()) {
             throw new IllegalStateException("Already disposed.");
         }
-
+        if (localAddresses == null) {
+            throw new NullPointerException("localAddresses");
+        }
+        
+        List<SocketAddress> localAddressesCopy = new ArrayList<SocketAddress>();
+        for (SocketAddress a: localAddresses) {
+            checkAddressType(a);
+            localAddressesCopy.add(a);
+        }
+        if (localAddressesCopy.isEmpty()) {
+            throw new IllegalArgumentException("localAddresses is empty.");
+        }
+        
+        boolean activate = false;
         synchronized (bindLock) {
-            if (bound) {
-                throw new IllegalStateException("Already bound to: "
-                        + getLocalAddresses());
+            if (boundAddresses.isEmpty()) {
+                activate = true;
             }
 
             if (getHandler() == null) {
                 throw new IllegalStateException("handler is not set.");
             }
             
-            if (localAddresses.isEmpty()) {
-                throw new IllegalStateException(
-                        "no local addresses were specified.");
-            }
-
             try {
-                bind0();
+                boundAddresses.addAll(bind0(localAddressesCopy));
             } catch (IOException e) {
                 throw e;
             } catch (RuntimeException e) {
@@ -152,48 +206,137 @@
                 throw new RuntimeIoException(
                         "Failed to bind to: " + getLocalAddresses(), e);
             }
-            bound = true;
         }
-        getListeners().fireServiceActivated();
+        
+        if (activate) {
+            getListeners().fireServiceActivated();
+        }
     }
 
     public final void unbind() {
+        if (getDefaultLocalAddress() == null) {
+            throw new IllegalStateException(
+                    "defaultLocalAddress is null (i.e. any).");
+        }
+        unbind(getDefaultLocalAddresses());
+    }
+
+    public final void unbind(SocketAddress localAddress) {
+        if (localAddress == null) {
+            throw new NullPointerException("localAddress");
+        }
+        
+        List<SocketAddress> localAddresses = new ArrayList<SocketAddress>(1);
+        localAddresses.add(localAddress);
+        unbind(localAddresses);
+    }
+
+    public final void unbind(SocketAddress firstLocalAddress,
+            SocketAddress... otherLocalAddresses) {
+        if (firstLocalAddress == null) {
+            throw new NullPointerException("firstLocalAddress");
+        }
+        if (otherLocalAddresses == null) {
+            throw new NullPointerException("otherLocalAddresses");
+        }
+        
+        List<SocketAddress> localAddresses = new ArrayList<SocketAddress>();
+        localAddresses.add(firstLocalAddress);
+        Collections.addAll(localAddresses, otherLocalAddresses);
+        unbind(localAddresses);
+    }
+
+    public final void unbindAll() {
+        unbind(getLocalAddresses());
+    }
+
+    public final void unbind(Iterable<? extends SocketAddress> localAddresses) {
+        if (localAddresses == null) {
+            throw new NullPointerException("localAddresses");
+        }
+        
+        boolean deactivate = false;
         synchronized (bindLock) {
-            if (!bound) {
+            if (boundAddresses.isEmpty()) {
                 return;
             }
 
-            try {
-                unbind0();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Throwable e) {
-                throw new RuntimeIoException(
-                        "Failed to unbind from: " + getLocalAddresses(), e);
+            List<SocketAddress> localAddressesCopy = new ArrayList<SocketAddress>();
+            int specifiedAddressCount = 0;
+            for (SocketAddress a: localAddresses) {
+                specifiedAddressCount ++;
+                if (a != null && boundAddresses.contains(a)) {
+                    localAddressesCopy.add(a);
+                }
+            }
+            if (specifiedAddressCount == 0) {
+                throw new IllegalArgumentException("localAddresses is empty.");
+            }
+            
+            if (!localAddressesCopy.isEmpty()) {
+                try {
+                    unbind0(localAddressesCopy);
+                } catch (RuntimeException e) {
+                    throw e;
+                } catch (Throwable e) {
+                    throw new RuntimeIoException(
+                            "Failed to unbind from: " + getLocalAddresses(), e);
+                }
+                
+                boundAddresses.removeAll(boundAddresses);
+                if (boundAddresses.isEmpty()) {
+                    deactivate = true;
+                }
             }
-            bound = false;
         }
 
-        getListeners().fireServiceDeactivated();
+        if (deactivate) {
+            getListeners().fireServiceDeactivated();
+        }
     }
 
     /**
      * Implement this method to perform the actual bind operation.
+     * @return the {@link Set} of the local addresses which is bound actually
      */
-    protected abstract void bind0() throws Exception;
+    protected abstract Set<SocketAddress> bind0(
+            List<? extends SocketAddress> localAddresses) throws Exception;
 
     /**
      * Implement this method to perform the actual unbind operation.
      */
-    protected abstract void unbind0() throws Exception;
+    protected abstract void unbind0(
+            List<? extends SocketAddress> localAddresses) throws Exception;
     
     @Override
     public String toString() {
         TransportMetadata m = getTransportMetadata();
         return '(' + m.getProviderName() + ' ' + m.getName() + " acceptor: " + 
                (isActive()?
-                       "localAddress: " + getLocalAddresses() +
+                       "localAddress(es): " + getLocalAddresses() +
                        ", managedSessionCount: " + getManagedSessionCount() :
                            "not bound") + ')'; 
+    }
+
+    private void checkAddressType(SocketAddress a) {
+        if (a != null &&
+            !getTransportMetadata().getAddressType().isAssignableFrom(
+                        a.getClass())) {
+            throw new IllegalArgumentException("localAddress type: "
+                    + a.getClass().getSimpleName() + " (expected: "
+                    + getTransportMetadata().getAddressType().getSimpleName() + ")");
+        }
+    }
+    
+    protected static class AcceptorOperationFuture extends ServiceOperationFuture {
+        private final List<SocketAddress> localAddresses;
+        
+        public AcceptorOperationFuture(List<? extends SocketAddress> localAddresses) {
+            this.localAddresses = new ArrayList<SocketAddress>(localAddresses);
+        }
+        
+        public final List<SocketAddress> getLocalAddresses() {
+            return Collections.unmodifiableList(localAddresses);
+        }
     }
 }

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=600461&r1=600460&r2=600461&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  3 01:55:52 2007
@@ -720,20 +720,20 @@
     @SuppressWarnings("unused")
     protected void finishSessionInitialization0(IoSession session, IoFuture future) {}
 
-    protected static final class ServiceOperationFuture extends DefaultIoFuture {
+    protected static class ServiceOperationFuture extends DefaultIoFuture {
         public ServiceOperationFuture() {
             super(null);
         }
 
-        public boolean isDone() {
+        public final boolean isDone() {
             return getValue() == Boolean.TRUE;
         }
 
-        public void setDone() {
+        public final void setDone() {
             setValue(Boolean.TRUE);
         }
 
-        public Exception getException() {
+        public final Exception getException() {
             if (getValue() instanceof Exception) {
                 return (Exception) getValue();
             } else {
@@ -741,7 +741,7 @@
             }
         }
 
-        public void setException(Exception exception) {
+        public final void setException(Exception exception) {
             if (exception == null) {
                 throw new NullPointerException("exception");
             }

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=600461&r1=600460&r2=600461&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  3 01:55:52 2007
@@ -56,8 +56,10 @@
     private final boolean createdExecutor;
     private final String threadName;
     private final IoProcessor<T> processor = new ConnectionlessAcceptorProcessor();
-    private final Queue<ServiceOperationFuture> registerQueue = new ConcurrentLinkedQueue<ServiceOperationFuture>();
-    private final Queue<ServiceOperationFuture> cancelQueue = new ConcurrentLinkedQueue<ServiceOperationFuture>();
+    private final Queue<AcceptorOperationFuture> registerQueue = 
+        new ConcurrentLinkedQueue<AcceptorOperationFuture>();
+    private final Queue<AcceptorOperationFuture> cancelQueue = 
+        new ConcurrentLinkedQueue<AcceptorOperationFuture>();
     private final Queue<T> flushingSessions = new ConcurrentLinkedQueue<T>();
     private final Map<SocketAddress, H> boundHandles =
         Collections.synchronizedMap(new HashMap<SocketAddress, H>());
@@ -118,8 +120,8 @@
     protected abstract boolean select(int timeout) throws Exception;
     protected abstract void wakeup();
     protected abstract Iterator<H> selectedHandles();
-    protected abstract H bind(SocketAddress localAddress) throws Exception;
-    protected abstract void unbind(H handle) throws Exception;
+    protected abstract H open(SocketAddress localAddress) throws Exception;
+    protected abstract void close(H handle) throws Exception;
     protected abstract SocketAddress localAddress(H handle) throws Exception;
     protected abstract boolean isReadable(H handle);
     protected abstract boolean isWritable(H handle);
@@ -130,7 +132,7 @@
 
     @Override
     protected IoFuture dispose0() throws Exception {
-        unbind();
+        unbindAll();
         if (!disposalFuture.isDone()) {
             startupWorker();
             wakeup();
@@ -139,8 +141,9 @@
     }
 
     @Override
-    protected final void bind0() throws Exception {
-        ServiceOperationFuture request = new ServiceOperationFuture();
+    protected final Set<SocketAddress> bind0(
+            List<? extends SocketAddress> localAddresses) throws Exception {
+        AcceptorOperationFuture request = new AcceptorOperationFuture(localAddresses);
 
         registerQueue.add(request);
         startupWorker();
@@ -156,12 +159,13 @@
         for (H handle: boundHandles.values()) {
             newLocalAddresses.add(localAddress(handle));
         }
-        setLocalAddresses(newLocalAddresses);
+        return newLocalAddresses;
     }
 
     @Override
-    protected final void unbind0() throws Exception {
-        ServiceOperationFuture request = new ServiceOperationFuture();
+    protected final void unbind0(
+            List<? extends SocketAddress> localAddresses) throws Exception {
+        AcceptorOperationFuture request = new AcceptorOperationFuture(localAddresses);
 
         cancelQueue.add(request);
         startupWorker();
@@ -479,29 +483,24 @@
     }
 
     private int registerHandles() {
-        if (registerQueue.isEmpty()) {
-            return 0;
-        }
-
-        for (; ;) {
-            ServiceOperationFuture req = registerQueue.poll();
+        for (;;) {
+            AcceptorOperationFuture req = registerQueue.poll();
             if (req == null) {
                 break;
             }
 
             Map<SocketAddress, H> newHandles = new HashMap<SocketAddress, H>();
-            List<SocketAddress> localAddresses = getLocalAddresses();
+            List<SocketAddress> localAddresses = req.getLocalAddresses();
             try {
                 for (SocketAddress a: localAddresses) {
-                    H handle = bind(a);
+                    H handle = open(a);
                     newHandles.put(localAddress(handle), handle);
                 }
-                
                 boundHandles.putAll(newHandles);
                 
                 getListeners().fireServiceActivated();
                 req.setDone();
-                return boundHandles.size();
+                return newHandles.size();
             } catch (Exception e) {
                 req.setException(e);
             } finally {
@@ -509,7 +508,7 @@
                 if (req.getException() != null) {
                     for (H handle: newHandles.values()) {
                         try {
-                            unbind(handle);
+                            close(handle);
                         } catch (Exception e) {
                             ExceptionMonitor.getInstance().exceptionCaught(e);
                         }
@@ -524,24 +523,29 @@
 
     private int unregisterHandles() {
         int nHandles = 0;
-        for (; ;) {
-            ServiceOperationFuture request = cancelQueue.poll();
+        for (;;) {
+            AcceptorOperationFuture request = cancelQueue.poll();
             if (request == null) {
                 break;
             }
 
             // close the channels
-            for (H handle: boundHandles.values()) {
+            for (SocketAddress a: request.getLocalAddresses()) {
+                H handle = boundHandles.remove(a);
+                if (handle == null) {
+                    continue;
+                }
+
                 try {
-                    unbind(handle);
+                    close(handle);
                     wakeup(); // wake up again to trigger thread death
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     ExceptionMonitor.getInstance().exceptionCaught(e);
+                } finally {
+                    nHandles ++;
                 }
-                nHandles ++;
             }
             
-            boundHandles.clear();
             request.setDone();
         }
         

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=600461&r1=600460&r2=600461&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  3 01:55:52 2007
@@ -55,10 +55,10 @@
 
     private final Object lock = new Object();
 
-    private final Queue<ServiceOperationFuture> registerQueue =
-        new ConcurrentLinkedQueue<ServiceOperationFuture>();
-    private final Queue<ServiceOperationFuture> cancelQueue =
-        new ConcurrentLinkedQueue<ServiceOperationFuture>();
+    private final Queue<AcceptorOperationFuture> registerQueue =
+        new ConcurrentLinkedQueue<AcceptorOperationFuture>();
+    private final Queue<AcceptorOperationFuture> cancelQueue =
+        new ConcurrentLinkedQueue<AcceptorOperationFuture>();
 
     private final Map<SocketAddress, H> boundHandles =
         Collections.synchronizedMap(new HashMap<SocketAddress, H>());
@@ -131,14 +131,14 @@
     protected abstract boolean select() throws Exception;
     protected abstract void wakeup();
     protected abstract Iterator<H> selectedHandles();
-    protected abstract H bind(SocketAddress localAddress) throws Exception;
+    protected abstract H open(SocketAddress localAddress) throws Exception;
     protected abstract SocketAddress localAddress(H handle) throws Exception;
     protected abstract T accept(IoProcessor<T> processor, H handle) throws Exception;
-    protected abstract void unbind(H handle) throws Exception;
+    protected abstract void close(H handle) throws Exception;
 
     @Override
     protected IoFuture dispose0() throws Exception {
-        unbind();
+        unbindAll();
         if (!disposalFuture.isDone()) {
             startupWorker();
             wakeup();
@@ -147,8 +147,8 @@
     }
 
     @Override
-    protected final void bind0() throws Exception {
-        ServiceOperationFuture request = new ServiceOperationFuture();
+    protected final Set<SocketAddress> bind0(List<? extends SocketAddress> localAddresses) throws Exception {
+        AcceptorOperationFuture request = new AcceptorOperationFuture(localAddresses);
 
         // adds the Registration request to the queue for the Workers
         // to handle
@@ -171,7 +171,8 @@
         for (H handle: boundHandles.values()) {
             newLocalAddresses.add(localAddress(handle));
         }
-        setLocalAddresses(newLocalAddresses);
+
+        return newLocalAddresses;
     }
 
     /**
@@ -198,8 +199,8 @@
     }
 
     @Override
-    protected final void unbind0() throws Exception {
-        ServiceOperationFuture future = new ServiceOperationFuture();
+    protected final void unbind0(List<? extends SocketAddress> localAddresses) throws Exception {
+        AcceptorOperationFuture future = new AcceptorOperationFuture(localAddresses);
 
         cancelQueue.add(future);
         startupWorker();
@@ -316,17 +317,17 @@
      */
     private int registerHandles() {
         for (;;) {
-            ServiceOperationFuture future = registerQueue.poll();
+            AcceptorOperationFuture future = registerQueue.poll();
             if (future == null) {
                 break;
             }
             
             Map<SocketAddress, H> newHandles = new HashMap<SocketAddress, H>();
-            List<SocketAddress> localAddresses = getLocalAddresses();
+            List<SocketAddress> localAddresses = future.getLocalAddresses();
             
             try {
                 for (SocketAddress a: localAddresses) {
-                    H handle = bind(a);
+                    H handle = open(a);
                     newHandles.put(localAddress(handle), handle);
                 }
                 
@@ -334,7 +335,7 @@
 
                 // and notify.
                 future.setDone();
-                return boundHandles.size();
+                return newHandles.size();
             } catch (Exception e) {
                 future.setException(e);
             } finally {
@@ -342,7 +343,7 @@
                 if (future.getException() != null) {
                     for (H handle: newHandles.values()) {
                         try {
-                            unbind(handle);
+                            close(handle);
                         } catch (Exception e) {
                             ExceptionMonitor.getInstance().exceptionCaught(e);
                         }
@@ -364,24 +365,28 @@
     private int unregisterHandles() {
         int cancelledHandles = 0;
         for (; ;) {
-            ServiceOperationFuture future = cancelQueue.poll();
+            AcceptorOperationFuture future = cancelQueue.poll();
             if (future == null) {
                 break;
             }
-
+            
             // close the channels
-            for (H handle: boundHandles.values()) {
+            for (SocketAddress a: future.getLocalAddresses()) {
+                H handle = boundHandles.remove(a);
+                if (handle == null) {
+                    continue;
+                }
+
                 try {
-                    unbind(handle);
+                    close(handle);
                     wakeup(); // wake up again to trigger thread death
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     ExceptionMonitor.getInstance().exceptionCaught(e);
+                } finally {
+                    cancelledHandles ++;
                 }
-                
-                cancelledHandles ++;
             }
             
-            boundHandles.clear();
             future.setDone();
         }
         

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java Mon Dec  3 01:55:52 2007
@@ -19,8 +19,9 @@
  */
 package org.apache.mina.common;
 
-import java.io.IOException;
 import java.net.SocketAddress;
+import java.util.List;
+import java.util.Set;
 
 /**
  * A dummy {@link IoSession} for unit-testing or non-network-use of
@@ -75,12 +76,12 @@
                 }) {
 
             @Override
-            protected void bind0() throws IOException {
+            protected Set<SocketAddress> bind0(List<? extends SocketAddress> localAddresses) throws Exception {
                 throw new UnsupportedOperationException();
             }
 
             @Override
-            protected void unbind0() {
+            protected void unbind0(List<? extends SocketAddress> localAddresses) throws Exception {
                 throw new UnsupportedOperationException();
             }
 
@@ -100,7 +101,6 @@
 
         // Set meaningless default values.
         acceptor.setHandler(new IoHandlerAdapter());
-        acceptor.setLocalAddress(ANONYMOUS_ADDRESS);
 
         this.service = acceptor;
 

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/IoAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoAcceptor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IoAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IoAcceptor.java Mon Dec  3 01:55:52 2007
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Accepts incoming connection, communicates with clients, and fires events to
@@ -43,43 +44,54 @@
  */
 public interface IoAcceptor extends IoService {
     /**
-     * Returns the local address to bind.  If more than one address are set,
-     * one of them will be returned, but it's not necessarily the firstly
-     * specified address in {@link #setLocalAddresses(SocketAddress...)}.
+     * Returns the local address which is bound currently.  If more than one
+     * address are bound, only one of them will be returned, but it's not
+     * necessarily the firstly bound address.
      */
     SocketAddress getLocalAddress();
     
     /**
-     * Returns a {@link List} of the local addresses to bind.
-     *
-     * @throws IllegalStateException if this service is already running.
+     * Returns a {@link Set} of the local addresses which are bound currently.
      */
-    List<SocketAddress> getLocalAddresses();
+    Set<SocketAddress> getLocalAddresses();
 
     /**
-     * Sets the local address to bind.
-     *
-     * @throws IllegalStateException if this service is already running.
+     * Returns the default local address to bind when no argument is specified
+     * in {@link #bind()} method.  Please note that the default will not be
+     * used if any local address is specified.  If more than one address are
+     * set, only one of them will be returned, but it's not necessarily the
+     * firstly specified address in {@link #setDefaultLocalAddresses(SocketAddress...)}.
+     * 
      */
-    void setLocalAddress(SocketAddress localAddress);
+    SocketAddress getDefaultLocalAddress();
     
     /**
-     * Sets the local addresses to bind.  If more than one address is
-     * specified, {@link #bind()} method binds to all the addresses with
-     * the same {@link IoHandler}.
-     *
-     * @throws IllegalStateException if this service is already running.
+     * Returns a {@link List} of the default local addresses to bind when no
+     * argument is specified in {@link #bind()} method.  Please note that the
+     * default will not be used if any local address is specified.
+     */
+    List<SocketAddress> getDefaultLocalAddresses();
+
+    /**
+     * Sets the default local address to bind when no argument is specified in
+     * {@link #bind()} method.  Please note that the default will not be used
+     * if any local address is specified.
      */
-    void setLocalAddresses(SocketAddress... localAddresses);
+    void setDefaultLocalAddress(SocketAddress localAddress);
     
     /**
-     * Sets the local addresses to bind.  If more than one address is
-     * specified, {@link #bind()} method binds to all the addresses with
-     * the same {@link IoHandler}.
-     *
-     * @throws IllegalStateException if this service is already running.
+     * Sets the default local addresses to bind when no argument is specified
+     * in {@link #bind()} method.  Please note that the default will not be
+     * used if any local address is specified.
+     */
+    void setDefaultLocalAddresses(SocketAddress... localAddresses);
+    
+    /**
+     * Sets the default local addresses to bind when no argument is specified
+     * in {@link #bind()} method.  Please note that the default will not be
+     * used if any local address is specified.
      */
-    void setLocalAddresses(Iterable<SocketAddress> localAddresses);
+    void setDefaultLocalAddresses(Iterable<? extends SocketAddress> localAddresses);
 
     /**
      * Returns <tt>true</tt> if and only if all clients are disconnected
@@ -94,18 +106,81 @@
     void setDisconnectOnUnbind(boolean disconnectOnUnbind);
 
     /**
-     * Bind to the configured local address and start to accept incoming connections.
+     * Binds to the default local address(es) and start to accept incoming
+     * connections.
      *
      * @throws IOException if failed to bind
      */
     void bind() throws IOException;
-
+    
+    /**
+     * Binds to the specified local address and start to accept incoming
+     * connections.
+     *
+     * @throws IOException if failed to bind
+     */
+    void bind(SocketAddress localAddress) throws IOException;
+    
     /**
-     * Unbind from the configured local address and stop to accept incoming connections.
-     * All managed connections will be closed if <tt>disconnectOnUnbind</tt> property is set.
-     * This method does nothing if not bound yet.
+     * Binds to the specified local addresses and start to accept incoming
+     * connections.
+     *
+     * @throws IOException if failed to bind
+     */
+    void bind(SocketAddress firstLocalAddress, SocketAddress... otherLocalAddresses) throws IOException;
+    
+    /**
+     * Binds to the specified local addresses and start to accept incoming
+     * connections.
+     *
+     * @throws IOException if failed to bind
+     */
+    void bind(Iterable<? extends SocketAddress> localAddresses) throws IOException;
+    
+    /**
+     * Unbinds from the default local address(es) and stop to accept incoming
+     * connections.  All managed connections will be closed if
+     * {@link #setDisconnectOnUnbind(boolean) disconnectOnUnbind} property is
+     * <tt>true</tt>.  This method returns silently if the default local
+     * address(es) are not bound yet.
      */
     void unbind();
+    
+    /**
+     * Unbinds from the specified local address and stop to accept incoming
+     * connections.  All managed connections will be closed if
+     * {@link #setDisconnectOnUnbind(boolean) disconnectOnUnbind} property is
+     * <tt>true</tt>.  This method returns silently if the default local
+     * address is not bound yet.
+     */
+    void unbind(SocketAddress localAddress);
+    
+    /**
+     * Unbinds from the specified local addresses and stop to accept incoming
+     * connections.  All managed connections will be closed if
+     * {@link #setDisconnectOnUnbind(boolean) disconnectOnUnbind} property is
+     * <tt>true</tt>.  This method returns silently if the default local
+     * addresses are not bound yet.
+     */
+    void unbind(SocketAddress firstLocalAddress, SocketAddress... otherLocalAddresses);
+    
+    /**
+     * Unbinds from the specified local addresses and stop to accept incoming
+     * connections.  All managed connections will be closed if
+     * {@link #setDisconnectOnUnbind(boolean) disconnectOnUnbind} property is
+     * <tt>true</tt>.  This method returns silently if the default local
+     * addresses are not bound yet.
+     */
+    void unbind(Iterable<? extends SocketAddress> localAddresses);
+    
+    /**
+     * Unbinds from all local addresses that this service is bound to and stops
+     * to accept incoming connections.  All managed connections will be closed
+     * if {@link #setDisconnectOnUnbind(boolean) disconnectOnUnbind} property
+     * is <tt>true</tt>.  This method returns silently if no local address is
+     * bound yet.
+     */
+    void unbindAll();
 
     /**
      * (Optional) Returns an {@link IoSession} that is bound to the specified

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramAcceptor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/DatagramAcceptor.java Mon Dec  3 01:55:52 2007
@@ -32,7 +32,8 @@
  */
 public interface DatagramAcceptor extends DatagramService, IoAcceptor {
     InetSocketAddress getLocalAddress();
-    void setLocalAddress(InetSocketAddress localAddress);
+    InetSocketAddress getDefaultLocalAddress();
+    void setDefaultLocalAddress(InetSocketAddress localAddress);
 
     /**
      * Returns the {@link IoSessionRecycler} for this service.

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/SocketAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/SocketAcceptor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/SocketAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/SocketAcceptor.java Mon Dec  3 01:55:52 2007
@@ -32,8 +32,9 @@
  * @version $Rev$, $Date$
  */
 public interface SocketAcceptor extends SocketService, IoAcceptor {
-    public InetSocketAddress getLocalAddress();
-    public void setLocalAddress(InetSocketAddress localAddress);
+    InetSocketAddress getLocalAddress();
+    InetSocketAddress getDefaultLocalAddress();
+    void setDefaultLocalAddress(InetSocketAddress localAddress);
 
     /**
      * @see ServerSocket#getReuseAddress()

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java Mon Dec  3 01:55:52 2007
@@ -88,13 +88,18 @@
     public InetSocketAddress getLocalAddress() {
         return (InetSocketAddress) super.getLocalAddress();
     }
+    
+    @Override
+    public InetSocketAddress getDefaultLocalAddress() {
+        return (InetSocketAddress) super.getDefaultLocalAddress();
+    }
 
-    public void setLocalAddress(InetSocketAddress localAddress) {
-        setLocalAddress((SocketAddress) localAddress);
+    public void setDefaultLocalAddress(InetSocketAddress localAddress) {
+        setDefaultLocalAddress((SocketAddress) localAddress);
     }
 
     @Override
-    protected DatagramChannel bind(SocketAddress localAddress) throws Exception {
+    protected DatagramChannel open(SocketAddress localAddress) throws Exception {
         DatagramChannel c = DatagramChannel.open();
         boolean success = false;
         try {
@@ -114,7 +119,7 @@
             success = true;
         } finally {
             if (!success) {
-                unbind(c);
+                close(c);
             }
         }
 
@@ -205,7 +210,7 @@
     }
 
     @Override
-    protected void unbind(DatagramChannel handle) throws Exception {
+    protected void close(DatagramChannel handle) throws Exception {
         SelectionKey key = handle.keyFor(selector);
         if (key != null) {
             key.cancel();

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java Mon Dec  3 01:55:52 2007
@@ -99,9 +99,14 @@
     public InetSocketAddress getLocalAddress() {
         return (InetSocketAddress) super.getLocalAddress();
     }
+    
+    @Override
+    public InetSocketAddress getDefaultLocalAddress() {
+        return (InetSocketAddress) super.getDefaultLocalAddress();
+    }
 
-    public void setLocalAddress(InetSocketAddress localAddress) {
-        setLocalAddress((SocketAddress) localAddress);
+    public void setDefaultLocalAddress(InetSocketAddress localAddress) {
+        setDefaultLocalAddress((SocketAddress) localAddress);
     }
 
     public boolean isReuseAddress() {
@@ -154,7 +159,7 @@
     }
 
     @Override
-    protected ServerSocketChannel bind(SocketAddress localAddress)
+    protected ServerSocketChannel open(SocketAddress localAddress)
             throws Exception {
         ServerSocketChannel c = ServerSocketChannel.open();
         boolean success = false;
@@ -165,12 +170,14 @@
             c.socket().setReceiveBufferSize(
                     getSessionConfig().getReceiveBufferSize());
             // and bind.
-            c.socket().bind(localAddress, getBacklog());
+            synchronized (c) {
+                c.socket().bind(localAddress, getBacklog());
+            }
             c.register(selector, SelectionKey.OP_ACCEPT);
             success = true;
         } finally {
             if (!success) {
-                unbind(c);
+                close(c);
             }
         }
         return c;
@@ -179,7 +186,9 @@
     @Override
     protected SocketAddress localAddress(ServerSocketChannel handle)
             throws Exception {
-        return handle.socket().getLocalSocketAddress();
+        synchronized (handle) {
+            return handle.socket().getLocalSocketAddress();
+        }
     }
 
     @Override
@@ -193,7 +202,7 @@
     }
 
     @Override
-    protected void unbind(ServerSocketChannel handle) throws Exception {
+    protected void close(ServerSocketChannel handle) throws Exception {
         SelectionKey key = handle.keyFor(selector);
         if (key != null) {
             key.cancel();

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=600461&r1=600460&r2=600461&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  3 01:55:52 2007
@@ -21,10 +21,11 @@
 
 import java.io.IOException;
 import java.net.SocketAddress;
-import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.mina.common.AbstractIoAcceptor;
 import org.apache.mina.common.IoFuture;
@@ -63,23 +64,27 @@
         return (VmPipeAddress) super.getLocalAddress();
     }
 
+    @Override
+    public VmPipeAddress getDefaultLocalAddress() {
+        return (VmPipeAddress) super.getDefaultLocalAddress();
+    }
+
     // This method is overriden to work around a problem with
     // bean property access mechanism.
 
-    public void setLocalAddress(VmPipeAddress localAddress) {
-        super.setLocalAddress(localAddress);
+    public void setDefaultLocalAddress(VmPipeAddress localAddress) {
+        super.setDefaultLocalAddress(localAddress);
     }
 
     @Override
     protected IoFuture dispose0() throws Exception {
-        unbind();
+        unbindAll();
         return null;
     }
 
     @Override
-    protected void bind0() throws IOException {
-        List<SocketAddress> localAddresses = getLocalAddresses();
-        List<SocketAddress> newLocalAddresses = new ArrayList<SocketAddress>();
+    protected Set<SocketAddress> bind0(List<? extends SocketAddress> localAddresses) throws IOException {
+        Set<SocketAddress> newLocalAddresses = new HashSet<SocketAddress>();
 
         synchronized (boundHandlers) {
             for (SocketAddress a: localAddresses) {
@@ -121,16 +126,16 @@
             }
         }
 
-        setLocalAddresses(newLocalAddresses);
+        return newLocalAddresses;
     }
 
     @Override
-    protected void unbind0() {
+    protected void unbind0(List<? extends SocketAddress> localAddresses) {
         synchronized (boundHandlers) {
-            boundHandlers.remove(getLocalAddress());
+            for (SocketAddress a: localAddresses) {
+                boundHandlers.remove(a);
+            }
         }
-
-        getListeners().fireServiceDeactivated();
     }
 
     public IoSession newSession(SocketAddress remoteAddress, SocketAddress localAddress) {

Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java Mon Dec  3 01:55:52 2007
@@ -82,7 +82,7 @@
 
     @Override
     protected void tearDown() throws Exception {
-        acceptor.unbind();
+        acceptor.dispose();
         super.tearDown();
     }
 
@@ -158,8 +158,7 @@
         chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
         SimpleIoHandler simpleIoHandler = new SimpleIoHandler();
         acceptor.setHandler(simpleIoHandler);
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
         acceptor.setFilterChainBuilder(chain);
         // create some clients
         NioSocketConnector connector = new NioSocketConnector();
@@ -192,8 +191,7 @@
         // configure the server
         SimpleIoHandler simpleIoHandler = new SimpleIoHandler();
         acceptor.setHandler(simpleIoHandler);
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
         acceptor.setFilterChainBuilder(chain);
         // create some clients
         NioSocketConnector connector = new NioSocketConnector();

Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/stream/StreamWriteFilterTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/stream/StreamWriteFilterTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/stream/StreamWriteFilterTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/stream/StreamWriteFilterTest.java Mon Dec  3 01:55:52 2007
@@ -351,18 +351,15 @@
         SenderHandler sender = new SenderHandler(stream);
         ReceiverHandler receiver = new ReceiverHandler(stream.size);
 
-        acceptor.setLocalAddress(address);
         acceptor.setHandler(sender);
-
         connector.setHandler(receiver);
-
-        acceptor.bind();
-
+        
+        acceptor.bind(address);
         connector.connect(address);
         sender.latch.await();
         receiver.latch.await();
 
-        acceptor.unbind();
+        acceptor.dispose();
 
         assertEquals(stream.bytesRead, receiver.bytesRead);
         assertEquals(stream.size, receiver.bytesRead);

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java Mon Dec  3 01:55:52 2007
@@ -76,7 +76,7 @@
         for (port = 1; port <= 65535; port++) {
             socketBound = false;
             try {
-                acceptor.setLocalAddress(createSocketAddress(port));
+                acceptor.setDefaultLocalAddress(createSocketAddress(port));
                 acceptor.bind();
                 socketBound = true;
                 break;
@@ -105,25 +105,26 @@
     @Override
     public void tearDown() {
         try {
-            acceptor.unbind();
+            acceptor.dispose();
         } catch (Exception e) {
             // ignore
         }
 
-        acceptor.setLocalAddress(null);
+        acceptor.setDefaultLocalAddress(null);
     }
 
     public void testAnonymousBind() throws Exception {
         acceptor.setHandler(new IoHandlerAdapter());
-        acceptor.setLocalAddress(null);
+        acceptor.setDefaultLocalAddress(null);
         acceptor.bind();
         Assert.assertNotNull(acceptor.getLocalAddress());
-        acceptor.unbind();
-        acceptor.setLocalAddress(createSocketAddress(0));
+        acceptor.unbind(acceptor.getLocalAddress());
+        Assert.assertNull(acceptor.getLocalAddress());
+        acceptor.setDefaultLocalAddress(createSocketAddress(0));
         acceptor.bind();
         Assert.assertNotNull(acceptor.getLocalAddress());
         Assert.assertTrue(getPort(acceptor.getLocalAddress()) != 0);
-        acceptor.unbind();
+        acceptor.unbind(acceptor.getLocalAddress());
     }
 
     public void testDuplicateBind() throws IOException {
@@ -131,8 +132,8 @@
 
         try {
             acceptor.bind();
-            Assert.fail("IllegalStateException is not thrown");
-        } catch (IllegalStateException e) {
+            Assert.fail("Exception is not thrown");
+        } catch (Exception e) {
         }
     }
 
@@ -190,7 +191,7 @@
 
         SocketAddress addr = createSocketAddress(port);
         EchoProtocolHandler handler = new EchoProtocolHandler();
-        acceptor.setLocalAddress(addr);
+        acceptor.setDefaultLocalAddress(addr);
         acceptor.setHandler(handler);
         for (int i = 0; i < 1048576; i++) {
             acceptor.bind();

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=600461&r1=600460&r2=600461&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  3 01:55:52 2007
@@ -41,15 +41,13 @@
 public abstract class AbstractConnectorTest extends TestCase {
 
     protected abstract IoAcceptor createAcceptor();
-
     protected abstract IoConnector createConnector();
 
     public void testConnectFutureSuccessTiming() throws Exception {
         int port = AvailablePortFinder.getNextAvailable(1025);
         IoAcceptor acceptor = createAcceptor();
-        acceptor.setLocalAddress(new InetSocketAddress(port));
         acceptor.setHandler(new IoHandlerAdapter());
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(port));
 
         try {
             final StringBuffer buf = new StringBuffer();
@@ -77,7 +75,7 @@
             future.getSession().close();
             Assert.assertEquals("123", buf.toString());
         } finally {
-            acceptor.unbind();
+            acceptor.dispose();
         }
     }
 
@@ -102,16 +100,21 @@
                 buf.append("Z");
             }
         });
-        ConnectFuture future = connector.connect(new InetSocketAddress(
-                "localhost", port));
-        future.awaitUninterruptibly();
-        buf.append("1");
+        
         try {
-            future.getSession().close();
-            fail();
-        } catch (RuntimeIoException e) {
-            // OK.
+            ConnectFuture future = connector.connect(new InetSocketAddress(
+                    "localhost", port));
+            future.awaitUninterruptibly();
+            buf.append("1");
+            try {
+                future.getSession().close();
+                fail();
+            } catch (RuntimeIoException e) {
+                // OK.
+            }
+            Assert.assertEquals("1", buf.toString());
+        } finally {
+            connector.dispose();
         }
-        Assert.assertEquals("1", buf.toString());
     }
 }

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractTrafficControlTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractTrafficControlTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractTrafficControlTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractTrafficControlTest.java Mon Dec  3 01:55:52 2007
@@ -55,16 +55,15 @@
         super.setUp();
 
         port = AvailablePortFinder.getNextAvailable();
-        acceptor.setLocalAddress(createServerSocketAddress(port));
         acceptor.setHandler(new ServerIoHandler());
-        acceptor.bind();
+        acceptor.bind(createServerSocketAddress(port));
     }
 
     @Override
     protected void tearDown() throws Exception {
         super.tearDown();
 
-        acceptor.unbind();
+        acceptor.dispose();
     }
 
     protected abstract ConnectFuture connect(int port, IoHandler handler)

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java Mon Dec  3 01:55:52 2007
@@ -43,10 +43,8 @@
  * @version $Rev$, $Date$
  */
 public class DatagramConfigTest extends TestCase {
-    private final IoAcceptor acceptor = new NioDatagramAcceptor();
-
-    private final IoConnector connector = new NioDatagramConnector();
-
+    private IoAcceptor acceptor;
+    private IoConnector connector;
     private String result;
 
     public DatagramConfigTest() {
@@ -55,6 +53,14 @@
     @Override
     protected void setUp() throws Exception {
         result = "";
+        acceptor = new NioDatagramAcceptor();
+        connector = new NioDatagramConnector();
+    }
+    
+    @Override
+    protected void tearDown() throws Exception {
+        acceptor.dispose();
+        connector.dispose();
     }
 
     public void testAcceptorFilterChain() throws Exception {
@@ -63,9 +69,8 @@
         IoHandler mockHandler = new MockHandler();
 
         acceptor.getFilterChain().addLast("mock", mockFilter);
-        acceptor.setLocalAddress(new InetSocketAddress(port));
         acceptor.setHandler(mockHandler);
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(port));
 
         try {
             connector.setHandler(new IoHandlerAdapter());
@@ -89,7 +94,7 @@
 
             Assert.assertEquals("FH", result);
         } finally {
-            acceptor.unbind();
+            acceptor.unbindAll();
         }
     }
 

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java Mon Dec  3 01:55:52 2007
@@ -40,13 +40,26 @@
  * @version $Rev$, $Date$
  */
 public class DatagramRecyclerTest extends TestCase {
-    private final NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
-
-    private final NioDatagramConnector connector = new NioDatagramConnector();
+    private NioDatagramAcceptor acceptor;
+    private NioDatagramConnector connector;
 
     public DatagramRecyclerTest() {
     }
 
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        acceptor = new NioDatagramAcceptor();
+        connector = new NioDatagramConnector();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        acceptor.dispose();
+        connector.dispose();
+    }
+
     public void testDatagramRecycler() throws Exception {
         int port = AvailablePortFinder.getNextAvailable(1024);
         ExpiringSessionRecycler recycler = new ExpiringSessionRecycler(1, 1);
@@ -54,10 +67,9 @@
         MockHandler acceptorHandler = new MockHandler();
         MockHandler connectorHandler = new MockHandler();
 
-        acceptor.setLocalAddress(new InetSocketAddress(port));
         acceptor.setHandler(acceptorHandler);
         acceptor.setSessionRecycler(recycler);
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(port));
 
         try {
             connector.setHandler(connectorHandler);
@@ -91,7 +103,7 @@
             Assert.assertEquals("CROPSECL", connectorHandler.result.toString());
             Assert.assertEquals("CROPRECL", acceptorHandler.result.toString());
         } finally {
-            acceptor.unbind();
+            acceptor.unbindAll();
         }
     }
     
@@ -102,11 +114,10 @@
         MockHandler acceptorHandler = new MockHandler();
         MockHandler connectorHandler = new MockHandler();
 
-        acceptor.setLocalAddress(new InetSocketAddress(port));
         acceptor.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 1);
         acceptor.setHandler(acceptorHandler);
         acceptor.setSessionRecycler(recycler);
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(port));
 
         try {
             connector.setHandler(connectorHandler);
@@ -155,7 +166,7 @@
             
             Assert.assertNotSame(oldSession, acceptorHandler.session);
         } finally {
-            acceptor.unbind();
+            acceptor.unbindAll();
         }
     }
 

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeEventOrderTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeEventOrderTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeEventOrderTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeEventOrderTest.java Mon Dec  3 01:55:52 2007
@@ -42,7 +42,6 @@
         IoConnector connector = new VmPipeConnector();
         //connector.getFilterChain().addLast( "logger", new LoggingFilter() );
 
-        acceptor.setLocalAddress(new VmPipeAddress(1));
         acceptor.setHandler(new IoHandlerAdapter() {
             @Override
             public void sessionOpened(IoSession session) throws Exception {
@@ -56,7 +55,7 @@
             }
         });
 
-        acceptor.bind();
+        acceptor.bind(new VmPipeAddress(1));
 
         final StringBuffer actual = new StringBuffer();
 
@@ -84,7 +83,7 @@
 
         future.awaitUninterruptibly();
         future.getSession().getCloseFuture().awaitUninterruptibly();
-        acceptor.unbind();
+        acceptor.dispose();
 
         // sessionClosed() might not be invoked yet
         // even if the connection is closed.
@@ -104,7 +103,6 @@
 
         final StringBuffer actual = new StringBuffer();
 
-        acceptor.setLocalAddress(new VmPipeAddress(1));
         acceptor.setHandler(new IoHandlerAdapter() {
 
             @Override
@@ -125,7 +123,7 @@
 
         });
 
-        acceptor.bind();
+        acceptor.bind(new VmPipeAddress(1));
 
         connector.setHandler(new IoHandlerAdapter() {
             @Override
@@ -144,7 +142,8 @@
 
         future.awaitUninterruptibly();
         future.getSession().getCloseFuture().awaitUninterruptibly();
-        acceptor.unbind();
+        acceptor.dispose();
+        connector.dispose();
 
         // sessionClosed() might not be invoked yet
         // even if the connection is closed.

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeSessionCrossCommunicationTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeSessionCrossCommunicationTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeSessionCrossCommunicationTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeSessionCrossCommunicationTest.java Mon Dec  3 01:55:52 2007
@@ -62,8 +62,7 @@
                 }
             }
         });
-        acceptor.setLocalAddress(address);
-        acceptor.bind();
+        acceptor.bind(address);
 
         connector.setHandler(new IoHandlerAdapter() {
             @Override
@@ -143,6 +142,6 @@
         }
 
         acceptor.setDisconnectOnUnbind(false);
-        acceptor.unbind();
+        acceptor.dispose();
     }
 }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/chat/Main.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/chat/Main.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/chat/Main.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/chat/Main.java Mon Dec  3 01:55:52 2007
@@ -19,6 +19,8 @@
  */
 package org.apache.mina.example.chat;
 
+import java.net.InetSocketAddress;
+
 import org.apache.mina.common.DefaultIoFilterChainBuilder;
 import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
@@ -28,8 +30,6 @@
 import org.apache.mina.filter.ssl.SslFilter;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 
-import java.net.InetSocketAddress;
-
 /**
  * (<b>Entry point</b>) Chat server
  *
@@ -61,9 +61,8 @@
         addLogger(chain);
 
         // Bind
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
         acceptor.setHandler(new ChatProtocolHandler());
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
 
         System.out.println("Listening on port " + PORT);
     }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java Mon Dec  3 01:55:52 2007
@@ -51,9 +51,8 @@
         }
 
         // Bind
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
         acceptor.setHandler(new EchoProtocolHandler());
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
 
         System.out.println("Listening on port " + PORT);
         

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/codec/Server.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/codec/Server.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/codec/Server.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/codec/Server.java Mon Dec  3 01:55:52 2007
@@ -57,10 +57,8 @@
                     new ProtocolCodecFilter(
                             new HttpServerProtocolCodecFactory()));
             acceptor.getFilterChain().addLast("logger", new LoggingFilter());
-
-            acceptor.setLocalAddress(new InetSocketAddress(port));
             acceptor.setHandler(new ServerHandler());
-            acceptor.bind();
+            acceptor.bind(new InetSocketAddress(port));
 
             System.out.println("Server now listening on port " + port);
         } catch (Exception ex) {

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/stream/Main.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/stream/Main.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/stream/Main.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/httpserver/stream/Main.java Mon Dec  3 01:55:52 2007
@@ -49,9 +49,8 @@
         }
 
         // Bind
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
         acceptor.setHandler(new HttpProtocolHandler());
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
 
         System.out.println("Listening on port " + PORT);
     }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java Mon Dec  3 01:55:52 2007
@@ -19,13 +19,13 @@
  */
 package org.apache.mina.example.imagine.step1.server;
 
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
 import org.apache.mina.example.imagine.step1.codec.ImageCodecFactory;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 
-import java.io.IOException;
-import java.net.InetSocketAddress;
-
 /**
  * entry point for the server used in the tutorial on protocol codecs
  *
@@ -40,9 +40,8 @@
         ImageServerIoHandler handler = new ImageServerIoHandler();
         NioSocketAcceptor acceptor = new NioSocketAcceptor();
         acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new ImageCodecFactory(false)));
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
         acceptor.setHandler(handler);
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
         System.out.println("server is listenig at port " + PORT);
     }
 }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/proxy/Main.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/proxy/Main.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/proxy/Main.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/proxy/Main.java Mon Dec  3 01:55:52 2007
@@ -62,10 +62,8 @@
                 new InetSocketAddress(args[1], Integer.parseInt(args[2])));
 
         // Start proxy.
-        acceptor.setLocalAddress(new InetSocketAddress(Integer
-                .parseInt(args[0])));
         acceptor.setHandler(handler);
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(Integer.parseInt(args[0])));
 
         System.out.println("Listening on port " + Integer.parseInt(args[0]));
     }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/reverser/Main.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/reverser/Main.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/reverser/Main.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/reverser/Main.java Mon Dec  3 01:55:52 2007
@@ -48,9 +48,8 @@
                         .forName("UTF-8"))));
 
         // Bind
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
         acceptor.setHandler(new ReverseProtocolHandler());
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
 
         System.out.println("Listening on port " + PORT);
     }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/sumup/Server.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/sumup/Server.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/sumup/Server.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/sumup/Server.java Mon Dec  3 01:55:52 2007
@@ -57,9 +57,8 @@
         }
         acceptor.getFilterChain().addLast("logger", new LoggingFilter());
 
-        acceptor.setLocalAddress(new InetSocketAddress(SERVER_PORT));
         acceptor.setHandler(new ServerSessionHandler());
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(SERVER_PORT));
 
         System.out.println("Listening on port " + SERVER_PORT);
     }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java Mon Dec  3 01:55:52 2007
@@ -64,7 +64,6 @@
                 new TextLineEncoder(), new CommandDecoder());
         acceptor.getFilterChain().addLast("codec", pcf);
         acceptor.setHandler(createIoHandler());
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
     }
 }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/tennis/Main.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/tennis/Main.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/tennis/Main.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/tennis/Main.java Mon Dec  3 01:55:52 2007
@@ -47,9 +47,8 @@
         VmPipeAddress address = new VmPipeAddress(8080);
 
         // Set up server
-        acceptor.setLocalAddress(address);
         acceptor.setHandler(new TennisPlayer());
-        acceptor.bind();
+        acceptor.bind(address);
 
         // Connect to the server.
         VmPipeConnector connector = new VmPipeConnector();
@@ -64,6 +63,6 @@
         // Wait until the match ends.
         session.getCloseFuture().awaitUninterruptibly();
 
-        acceptor.unbind();
+        acceptor.unbindAll();
     }
 }

Modified: mina/trunk/example/src/main/java/org/apache/mina/example/udp/MemoryMonitor.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/udp/MemoryMonitor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/udp/MemoryMonitor.java (original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/udp/MemoryMonitor.java Mon Dec  3 01:55:52 2007
@@ -60,7 +60,6 @@
     public MemoryMonitor() throws IOException {
 
         NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
         acceptor.setHandler(new MemoryMonitorHandler(this));
 
         DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
@@ -78,7 +77,7 @@
         frame.setLocation(300, 300);
         frame.setVisible(true);
 
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
         System.out.println("UDPServer listening on port " + PORT);
     }
 

Modified: mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java (original)
+++ mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/AbstractTest.java Mon Dec  3 01:55:52 2007
@@ -25,8 +25,8 @@
 
 import junit.framework.TestCase;
 
-import org.apache.mina.common.IoBuffer;
 import org.apache.mina.common.IoAcceptor;
+import org.apache.mina.common.IoBuffer;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionLogger;
 import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
@@ -108,7 +108,6 @@
             address = new InetSocketAddress(port);
 
             try {
-                socketAcceptor.setLocalAddress(address);
                 socketAcceptor.setHandler(new EchoProtocolHandler() {
                     @Override
                     public void sessionCreated(IoSession session) {
@@ -145,22 +144,21 @@
                         }
                     }
                 });
-                socketAcceptor.bind();
+                socketAcceptor.bind(address);
                 socketBound = true;
 
-                datagramAcceptor.setLocalAddress(address);
                 datagramAcceptor.setHandler(new EchoProtocolHandler());
-                datagramAcceptor.bind();
+                datagramAcceptor.bind(address);
                 datagramBound = true;
 
                 break;
             } catch (IOException e) {
             } finally {
                 if (socketBound && !datagramBound) {
-                    socketAcceptor.unbind();
+                    socketAcceptor.unbindAll();
                 }
                 if (datagramBound && !socketBound) {
-                    datagramAcceptor.unbind();
+                    datagramAcceptor.unbindAll();
                 }
             }
         }
@@ -177,8 +175,8 @@
     @Override
     protected void tearDown() throws Exception {
         if (boundAddress != null) {
-            socketAcceptor.unbind();
-            datagramAcceptor.unbind();
+            socketAcceptor.dispose();
+            datagramAcceptor.dispose();
         }
     }
 }

Modified: mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java (original)
+++ mina/trunk/example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java Mon Dec  3 01:55:52 2007
@@ -37,7 +37,7 @@
     @Override
     protected void tearDown() throws Exception {
         acceptor.setDisconnectOnUnbind(true);
-        acceptor.unbind();
+        acceptor.dispose();
         super.tearDown();
     }
 
@@ -60,11 +60,9 @@
                 new ProtocolCodecFilter(new TextLineCodecFactory(Charset
                         .forName("UTF-8"))));
 
-        acceptor.setLocalAddress(new InetSocketAddress(PORT));
-
         EchoHandler handler = new EchoHandler();
         acceptor.setHandler(handler);
-        acceptor.bind();
+        acceptor.bind(new InetSocketAddress(PORT));
         System.out.println("MINA server started.");
 
         Socket socket = getClientSocket(useSSL);

Modified: mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java
URL: http://svn.apache.org/viewvc/mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java (original)
+++ mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java Mon Dec  3 01:55:52 2007
@@ -21,7 +21,6 @@
 
         IoAcceptor service = new NioSocketAcceptor();
         service.setHandler(new IoHandlerAdapter());
-        service.setLocalAddress(new InetSocketAddress(8080));
         
         ExecutorFilter executorFilter = new ExecutorFilter(
                 new OrderedThreadPoolExecutor(
@@ -29,8 +28,7 @@
                         new IoEventQueueThrottle(1048576)));
         
         service.getFilterChain().addLast("executor", executorFilter);
-
-        service.bind();
+        service.bind(new InetSocketAddress(8080));
         
         server.registerMBean(
                 new IoServiceMBean(service),

Modified: mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketAcceptor.java?rev=600461&r1=600460&r2=600461&view=diff
==============================================================================
--- mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketAcceptor.java (original)
+++ mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketAcceptor.java Mon Dec  3 01:55:52 2007
@@ -71,7 +71,7 @@
     }
 
     @Override
-    protected Long bind(SocketAddress localAddress) throws Exception {
+    protected Long open(SocketAddress localAddress) throws Exception {
         InetSocketAddress la = (InetSocketAddress) localAddress;
         long handle = Socket.create(
                 Socket.APR_INET, Socket.SOCK_STREAM, Socket.APR_PROTO_TCP, pool);
@@ -113,7 +113,7 @@
             success = true;
         } finally {
             if (!success) {
-                unbind(handle);
+                close(handle);
             }
         }
         return handle;
@@ -218,7 +218,7 @@
     }
 
     @Override
-    protected void unbind(Long handle) throws Exception {
+    protected void close(Long handle) throws Exception {
         Poll.remove(pollset, handle);
         int result = Socket.close(handle);
         if (result != Status.APR_SUCCESS) {
@@ -258,8 +258,18 @@
         }
     }
 
-    public void setLocalAddress(InetSocketAddress localAddress) {
-        super.setLocalAddress(localAddress);
+    @Override
+    public InetSocketAddress getLocalAddress() {
+        return (InetSocketAddress) super.getLocalAddress();
+    }
+
+    @Override
+    public InetSocketAddress getDefaultLocalAddress() {
+        return (InetSocketAddress) super.getDefaultLocalAddress();
+    }
+
+    public void setDefaultLocalAddress(InetSocketAddress localAddress) {
+        super.setDefaultLocalAddress(localAddress);
     }
 
     public void setReuseAddress(boolean reuseAddress) {
@@ -282,11 +292,6 @@
         return (SocketSessionConfig) super.getSessionConfig();
     }
     
-    @Override
-    public InetSocketAddress getLocalAddress() {
-        return (InetSocketAddress) super.getLocalAddress();
-    }
-
     private void throwException(int code) throws IOException {
         throw new IOException(
                 org.apache.tomcat.jni.Error.strerror(-code) +