Author: trustin
Date: Fri Nov  9 02:38:28 2007
New Revision: 593485

URL: http://svn.apache.org/viewvc?rev=593485&view=rev
Log:
Related issue: DIRMINA-341 (Allow binding multiple SocketAddresses per 
IoAcceptor.)
* Added IoAcceptor.localAddresses property

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IoAcceptor.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=593485&r1=593484&r2=593485&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 
Fri Nov  9 02:38:28 2007
@@ -21,6 +21,11 @@
 
 import java.io.IOException;
 import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 
 /**
@@ -29,12 +34,13 @@
  * @author The Apache MINA Project ([EMAIL PROTECTED])
  * @version $Rev$, $Date$
  */
-public abstract class AbstractIoAcceptor extends AbstractIoService implements
-        IoAcceptor {
-    private SocketAddress localAddress;
-
+public abstract class AbstractIoAcceptor 
+        extends AbstractIoService implements IoAcceptor {
+    
+    private final Set<SocketAddress> localAddresses = new 
HashSet<SocketAddress>();
+    private final Set<SocketAddress> unmodifiableLocalAddresses =
+        Collections.unmodifiableSet(localAddresses);
     private boolean disconnectOnUnbind = true;
-
     private boolean bound;
 
     /**
@@ -49,25 +55,62 @@
     }
 
     public SocketAddress getLocalAddress() {
-        return localAddress;
+        return localAddresses.iterator().next();
     }
 
     public void setLocalAddress(SocketAddress localAddress) {
-        if (localAddress != null
-                && !getTransportMetadata().getAddressType().isAssignableFrom(
-                        localAddress.getClass())) {
-            throw new IllegalArgumentException("localAddress type: "
-                    + localAddress.getClass() + " (expected: "
-                    + getTransportMetadata().getAddressType() + ")");
+        if (localAddress == null) {
+            throw new NullPointerException("localAddress");
         }
+        
+        setLocalAddresses(localAddress);
+    }
 
+    public Set<SocketAddress> getLocalAddresses() {
+        return unmodifiableLocalAddresses;
+    }
+
+    public void setLocalAddresses(Set<SocketAddress> localAddresses) {
+        if (localAddresses == null) {
+            throw new NullPointerException("localAddresses");
+        }
+        
+        setLocalAddresses(
+                localAddresses.toArray(new 
SocketAddress[localAddresses.size()]));
+    }
+
+    public void setLocalAddresses(SocketAddress... localAddresses) {
+        if (localAddresses == null) {
+            throw new NullPointerException("localAddresses");
+        }
+        
         synchronized (bindLock) {
             if (bound) {
                 throw new IllegalStateException(
                         "localAddress can't be set while the acceptor is 
bound.");
             }
 
-            this.localAddress = localAddress;
+            Collection<SocketAddress> newLocalAddresses = 
+                new ArrayList<SocketAddress>();
+            for (SocketAddress a: localAddresses) {
+                if (a == null) {
+                    continue;
+                }
+                if (!getTransportMetadata().getAddressType().isAssignableFrom(
+                                a.getClass())) {
+                    throw new IllegalArgumentException("localAddress type: "
+                            + a.getClass().getSimpleName() + " (expected: "
+                            + 
getTransportMetadata().getAddressType().getSimpleName() + ")");
+                }
+                newLocalAddresses.add(a);
+            }
+            
+            if (newLocalAddresses.isEmpty()) {
+                throw new IllegalArgumentException("empty localAddresses");
+            }
+            
+            this.localAddresses.clear();
+            this.localAddresses.addAll(newLocalAddresses);
         }
     }
 

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=593485&r1=593484&r2=593485&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 Fri 
Nov  9 02:38:28 2007
@@ -21,6 +21,7 @@
 
 import java.io.IOException;
 import java.net.SocketAddress;
+import java.util.Set;
 
 /**
  * Accepts incoming connection, communicates with clients, and fires events to
@@ -42,9 +43,18 @@
  */
 public interface IoAcceptor extends IoService {
     /**
-     * Returns the local address to bind.
+     * 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 [EMAIL PROTECTED] 
#setLocalAddresses(SocketAddress...)}.
      */
     SocketAddress getLocalAddress();
+    
+    /**
+     * Returns a [EMAIL PROTECTED] Set} of the local address to bind.
+     *
+     * @throws IllegalStateException if this service is already running.
+     */
+    Set<SocketAddress> getLocalAddresses();
 
     /**
      * Sets the local address to bind.
@@ -52,6 +62,24 @@
      * @throws IllegalStateException if this service is already running.
      */
     void setLocalAddress(SocketAddress localAddress);
+    
+    /**
+     * Sets the local addresses to bind.  If more than one address is
+     * specified, [EMAIL PROTECTED] #bind()} method binds to all the addresses 
with
+     * the same [EMAIL PROTECTED] IoHandler}.
+     *
+     * @throws IllegalStateException if this service is already running.
+     */
+    void setLocalAddresses(SocketAddress... localAddresses);
+    
+    /**
+     * Sets the local addresses to bind.  If more than one address is
+     * specified, [EMAIL PROTECTED] #bind()} method binds to all the addresses 
with
+     * the same [EMAIL PROTECTED] IoHandler}.
+     *
+     * @throws IllegalStateException if this service is already running.
+     */
+    void setLocalAddresses(Set<SocketAddress> localAddresses);
 
     /**
      * Returns <tt>true</tt> if and only if all clients are disconnected


Reply via email to