You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pe...@apache.org on 2012/11/14 12:03:46 UTC
svn commit: r1409151 - in /river/jtsk/trunk/src:
net/jini/core/discovery/LookupLocator.java
org/apache/river/impl/net/UriString.java
Author: peter_firmstone
Date: Wed Nov 14 11:03:45 2012
New Revision: 1409151
URL: http://svn.apache.org/viewvc?rev=1409151&view=rev
Log:
River-414
Clean up LookupLocator as per mail list comments, removed SocketFactory prior to release.
Modified:
river/jtsk/trunk/src/net/jini/core/discovery/LookupLocator.java
river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java
Modified: river/jtsk/trunk/src/net/jini/core/discovery/LookupLocator.java
URL: http://svn.apache.org/viewvc/river/jtsk/trunk/src/net/jini/core/discovery/LookupLocator.java?rev=1409151&r1=1409150&r2=1409151&view=diff
==============================================================================
--- river/jtsk/trunk/src/net/jini/core/discovery/LookupLocator.java (original)
+++ river/jtsk/trunk/src/net/jini/core/discovery/LookupLocator.java Wed Nov 14 11:03:45 2012
@@ -32,23 +32,28 @@ import java.net.UnknownHostException;
import java.rmi.MarshalledObject;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.net.SocketFactory;
import net.jini.core.lookup.ServiceRegistrar;
import net.jini.discovery.ConstrainableLookupLocator;
import net.jini.discovery.LookupLocatorDiscovery;
+import org.apache.river.impl.net.UriString;
/**
* LookupLocator supports unicast discovery, using only version 1 of the
- * unicast discovery protocol. It's main purpose now is to contain a host name
- * and port number.
- * It is used as a parameter in LookupLocatorDiscovery constructors.
+ * unicast discovery protocol, which is deprecated.
+ * <p>
+ * It's main purpose now is to contain a host name and port number, it is now
+ * immutable, since River 2.2.1, this may break overriding classes.
+ *
+ * <p>
+ * LookupLocator is used as a parameter in LookupLocatorDiscovery constructors.
* LookupLocatorDiscovery has methods to perform Discovery using either
* version 1 or 2 with constraints.
* ConstrainableLookupLocator is a subclass which uses discovery V1 or V2
* and enables the use of constraints.
*
- *
- *
* @since 1.0
* @see LookupLocatorDiscovery
* @see ConstrainableLookupLocator
@@ -70,21 +75,14 @@ public class LookupLocator implements Se
*
* @serial
*/
- protected String host;
+ protected final String host;
/**
* The port number on the host at which to perform discovery.
*
* @serial
*/
- protected int port;
- /**
- * The socket factory that this <code>LookupLocator</code> uses to
- * create <code>Socket</code> objects.
- *
- * @serial
- **/
- protected SocketFactory sf;
-
+ protected final int port;
+
/**
* The timeout after which we give up waiting for a response from
* the lookup service.
@@ -137,64 +135,9 @@ public class LookupLocator implements Se
* @throws NullPointerException if <code>url</code> is <code>null</code>
*/
public LookupLocator(String url) throws MalformedURLException {
- if (url == null) {
- throw new NullPointerException("url is null");
- }
- URI uri = null;
- try {
- uri = new URI(url);
- } catch (URISyntaxException e) {
- MalformedURLException mue =
- new MalformedURLException("URI parsing failure: " + url);
- mue.initCause(e);
- throw mue;
- }
- if (!uri.isAbsolute()) {
- throw new MalformedURLException("no scheme specified: " + url);
- }
- if (uri.isOpaque()) {
- throw new MalformedURLException("not a hierarchical url: " + url);
- }
- if (!uri.getScheme().toLowerCase().equals("jini")) {
- throw new MalformedURLException(
- "Invalid URL scheme: " + url);
- }
- String uriPath = uri.getPath();
- if ((uriPath.length() != 0) && (!uriPath.equals("/"))) {
- throw new MalformedURLException(
- "URL path contains path segments: " + url);
- }
- if (uri.getQuery() != null) {
- throw new MalformedURLException(
- "invalid character, '?', in URL: " + url);
- }
- if (uri.getFragment() != null) {
- throw new MalformedURLException(
- "invalid character, '#', in URL: " + url);
- }
- // Make sure that it is a server-based authority, if the authority
- // component exists
- try {
- uri = uri.parseServerAuthority();
- if (uri.getUserInfo() != null) {
- throw new MalformedURLException(
- "invalid character, '@', in URL host: " + url);
- }
- if ((host = uri.getHost()) == null) {
- // authority component does not exist - not a hierarchical URL
- throw new MalformedURLException(
- "Not a hierarchical URL: " + url);
- }
- port = uri.getPort();
- if (port == -1) {
- port = discoveryPort;
- }
- } catch (URISyntaxException e) {
- handle3986Authority(uri);
- }
- if ((port <= 0) || (port >= 65536)) {
- throw new MalformedURLException("port number out of range: " + url);
- }
+ URI uri = parseURI(url);
+ host = uri.getHost();
+ port = uri.getPort();
}
/**
@@ -225,74 +168,67 @@ public class LookupLocator implements Se
* @throws NullPointerException if <code>host</code> is <code>null</code>
*/
public LookupLocator(String host, int port) {
- if (host == null)
- throw new NullPointerException("null host");
- if (port <= 0 || port >= 65536)
- throw new IllegalArgumentException("port number out of range");
- URI uri;
+ if (host == null) throw new NullPointerException("null host");
+ StringBuilder sb = new StringBuilder();
+ sb.append("jini://").append(host).append(":").append(port);
+ try {
+ URI uri = parseURI(sb.toString());
+ this.host = uri.getHost();
+ this.port = uri.getPort();
+ } catch (MalformedURLException ex) {
+ throw new IllegalArgumentException("host cannot be parsed", ex);
+ }
+ }
+
+ private URI parseURI(String url) throws MalformedURLException{
+ if (url == null) {
+ throw new NullPointerException("url is null");
+ }
+ URI uri = null;
try {
- // Use URI to validate the host.
- // We pass in the port to handle the case where the host is in the
- // form of a valid IPv6 address with a port appended to it.
- uri = new URI(null, null, host, port, null, null, null);
- if (uri.getUserInfo() != null) {
- throw new IllegalArgumentException(
- "invalid character, '@', in host: " + host);
- }
- this.host = host;
- this.port = port;
+ url = UriString.escapeIllegalCharacters(url);
+ uri = new URI(url);
+ uri = UriString.normalise(uri);
} catch (URISyntaxException e) {
- uri = try3986Authority(host, port);
- assert ((this.port > 0) && (this.port < 65536));
+ MalformedURLException mue =
+ new MalformedURLException("URI parsing failure: " + url);
+ mue.initCause(e);
+ throw mue;
}
+ if (!uri.isAbsolute()) throw new MalformedURLException("no scheme specified: " + url);
+ if (uri.isOpaque()) throw new MalformedURLException("not a hierarchical url: " + url);
+ if (!uri.getScheme().toLowerCase().equals("jini")) throw new MalformedURLException("Invalid URL scheme: " + url);
+
String uriPath = uri.getPath();
- if (uriPath.length() != 0) {
- throw new IllegalArgumentException(
- "invalid character, '/', in host: " + host);
- }
- if (uri.getQuery() != null) {
- throw new IllegalArgumentException(
- "invalid character, '?', in host: " + host);
- }
- if (uri.getFragment() != null) {
- throw new IllegalArgumentException(
- "invalid character, '#', in host: " + host);
+ if ((uriPath.length() != 0) && (!uriPath.equals("/"))) {
+ throw new MalformedURLException(
+ "URL path contains path segments: " + url);
}
- }
-
- /**
- * Construct a new <code>LookupLocator</code> object, set to perform unicast
- * discovery to the input <code>host</code> and <code>port</code> using the socketFactory.
- * The
- * <code>host</code>, <code>port</code> and <code>sf</code> fields will be populated with the
- * <code>host</code>, <code>port</code> and <code>sf</code> arguments. No host name
- * resolution is attempted.
- * <p>The <code>host</code>
- * argument must meet any one of the following syntactical requirements:
- * <ul>
- * <li>A host as required by a <i>server-based naming authority</i> in
- * section 3.2.2 of <a href="http://www.ietf.org/rfc/rfc2396.txt">
- * <i>RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax</i></a>
- * <li>A literal IPv6 address as defined by
- * <a href="http://www.ietf.org/rfc/rfc2732.txt">
- * <i>RFC 2732: Format for Literal IPv6 Addresses in URL's</i></a>
- * <li>A literal IPv6 address as defined by
- * <a href="http://www.ietf.org/rfc/rfc3513.txt">
- * <i>RFC 3513: Internet Protocol Version 6 (IPv6) Addressing Architecture
- * </i></a>
- * </ul>
- *
- * @param host the name of the host to contact
- * @param port the number of the port to connect to
- * @param sf the factory to use for creating the socket
- * @throws IllegalArgumentException if <code>port</code> is not between
- * 1 and 65535 (both included) or if <code>host</code> cannot be parsed.
- * @throws NullPointerException if <code>host</code> is <code>null</code>
- */
- public LookupLocator(String host, int port, SocketFactory sf)
- {
- this(host,port);
- this.sf = sf ;
+ if (uri.getQuery() != null) throw new MalformedURLException("invalid character, '?', in URL: " + url);
+ if (uri.getFragment() != null) throw new MalformedURLException("invalid character, '#', in URL: " + url);
+ if (uri.getUserInfo() != null) throw new MalformedURLException("invalid character, '@', in URL host: " + url);
+ if ((uri.getHost()) == null) {
+ // authority component does not exist - not a hierarchical URL
+ throw new MalformedURLException(
+ "Not a hierarchical URL: " + url);
+ }
+ int port = uri.getPort();
+ if (port == -1) {
+ port = discoveryPort;
+ try {
+ uri = new URI(uri.getScheme(), uri.getRawUserInfo(), uri.getHost(), port, uri.getRawPath(), uri.getRawQuery(), uri.getRawFragment());
+ } catch (URISyntaxException e) {
+ MalformedURLException mue =
+ new MalformedURLException("recreation of URI with discovery port failed");
+ mue.initCause(e);
+ throw mue;
+ }
+ }
+
+ if ((uri.getPort() <= 0) || (uri.getPort() >= 65536)) {
+ throw new MalformedURLException("port number out of range: " + url);
+ }
+ return uri;
}
/**
@@ -371,12 +307,7 @@ public class LookupLocator implements Se
} catch (UnknownHostException uhe) {
// Cannot resolve the host name, maybe the socket implementation
// can do it for us.
- Socket sock ;
- if( sf == null ) {
- sock = new Socket(host, port);
- } else {
- sock = sf.createSocket(host, port);
- }
+ Socket sock = new Socket(host, port);
return getRegistrarFromSocket(sock, timeout);
}
IOException ioEx = null;
@@ -384,12 +315,7 @@ public class LookupLocator implements Se
ClassNotFoundException cnfEx = null;
for (int i = 0; i < addrs.length; i++) {
try {
- Socket sock ;
- if( sf == null ) {
- sock = new Socket(addrs[i], port);
- } else {
- sock = sf.createSocket(addrs[i], port);
- }
+ Socket sock = new Socket(addrs[i], port);
return getRegistrarFromSocket(sock, timeout);
} catch (ClassNotFoundException ex) {
cnfEx = ex;
@@ -471,8 +397,7 @@ public class LookupLocator implements Se
}
if (o instanceof LookupLocator) {
LookupLocator oo = (LookupLocator) o;
- return port == oo.port && host.equalsIgnoreCase(oo.host) &&
- Util.sameClassAndEquals(sf, oo.sf);
+ return port == oo.port && host.equalsIgnoreCase(oo.host);
}
return false;
}
@@ -482,8 +407,7 @@ public class LookupLocator implements Se
* <code>port</code> field values.
*/
public int hashCode() {
- return host.toLowerCase().hashCode() ^ port ^
- (sf != null ? sf.hashCode() : 0);
+ return host.toLowerCase().hashCode() ^ port;
}
// Checks if the host is an RFC 3513 IPv6 literal and converts it into
@@ -496,74 +420,4 @@ public class LookupLocator implements Se
return host;
}
}
-
- private URI try3986Authority(String host, int port)
- {
- try {
- URI u = new URI("jini://" + host + ":" + port);
- handle3986Authority(u);
- return u;
- } catch (URISyntaxException use) {
- // has to be an invalid host
- IllegalArgumentException iae =
- new IllegalArgumentException("syntax error in host: " +
- host);
- iae.initCause(use);
- throw iae;
- } catch (MalformedURLException mue) {
- IllegalArgumentException iae =
- new IllegalArgumentException("syntax error in host: " +
- host);
- iae.initCause(mue);
- throw iae;
- }
- }
- private void handle3986Authority(URI uri) throws MalformedURLException {
- assert (!uri.isOpaque());
- String authority;
- if ((authority = uri.getAuthority()) == null) {
- throw new MalformedURLException("Missing authority: " + uri);
- }
- if (authority.indexOf('@') != -1) {
- throw new MalformedURLException("invalid character, '@', in host: "
- + uri);
- }
- parseHostPort(authority, uri);
- }
-
- private void parseHostPort(String authority, URI uri)
- throws MalformedURLException
- {
- int index = authority.lastIndexOf(':');
- if (index == -1) {
- port = discoveryPort;
- host = authority;
- return;
- }
- // Check for any other colons
- if (authority.indexOf(':') != index) {
- throw new MalformedURLException(": not allowed in host name: "
- + uri);
- }
- String portString = authority.substring(index + 1);
- int portInt;
- if (portString.length() == 0) {
- throw new MalformedURLException("invalid port in authority: " +
- uri);
- } else {
- try {
- portInt = Integer.parseInt(portString);
- } catch (NumberFormatException ne) {
- MalformedURLException mue = new MalformedURLException(
- "invalid port in authority: " + uri);
- mue.initCause(ne);
- throw mue;
- }
- }
- port = portInt;
- host = authority.substring(0, index);
- if (host.length() == 0) {
- throw new MalformedURLException("zero length host name: " + uri);
- }
- }
}
Modified: river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java
URL: http://svn.apache.org/viewvc/river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java?rev=1409151&r1=1409150&r2=1409151&view=diff
==============================================================================
--- river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java (original)
+++ river/jtsk/trunk/src/org/apache/river/impl/net/UriString.java Wed Nov 14 11:03:45 2012
@@ -485,9 +485,8 @@ public class UriString {
}
path = sb.toString();
}
- // TODO: query and fragment normalisation.
-
- return new URI(scheme, uri.getRawUserInfo(), host, uri.getPort(), path, uri.getQuery(), uri.getFragment());
+ // Query and Fragment not subject to normalisation
+ return new URI(scheme, uri.getRawUserInfo(), host, uri.getPort(), path, uri.getRawQuery(), uri.getRawFragment());
}