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