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());
     }