All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.globus.util.GlobusURL Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 1999-2010 University of Chicago
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is
 * distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 *
 * See the License for the specific language governing permissions and limitations under the License.
 */
package org.globus.util;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * This class represents the URLs needed by various Globus services,
 * including:
 * 
    *
  • GASS
  • *
  • GRAM
  • *
  • FTP
  • *
  • GSIFTP
  • *
* * This class is not extended from URL since it is not intended to do stream * handling. Instead it is primarily for the parsing of Globus URLs and is * able to handle the extraction of user names and passwords from the URL * as well. It also can parse literal IPv6 addresses (as per RFC 2732). */ public class GlobusURL { protected String protocol = null; protected String host = null; protected String urlPath = null; protected String user = null; protected String pwd = null; protected String url = null; protected int port = -1; /** * Parses the url and extracts the url parts. * * @param url the url to parse. * @throws MalformedURLException if the url * is malformed. */ public GlobusURL(String url) throws MalformedURLException { int p1, p2; url = url.trim(); p1 = url.indexOf("://"); if (p1 == -1) { throw new MalformedURLException("Missing '[protocol]://'"); } protocol = url.substring(0, p1).toLowerCase(); p1 += 3; String base = null; p2 = url.indexOf('/', p1); if (p2 == -1) { /*throw new MalformedURLException("Missing '/' at [host]:[port]/");*/ base = url.substring(p1); urlPath = null; } else { base = url.substring(p1, p2); // this is after / p2++; if (p2 != url.length()) { urlPath = url.substring(p2); } else { urlPath = null; } } // this is [user]:[pwd]@[host]:[port] p1 = base.indexOf('@'); if (p1 == -1) { parseHostPort(base); } else { parseUserPwd( base.substring(0, p1) ); parseHostPort( base.substring(p1+1) ); } if (port == -1) { port = getPort(protocol); } if (protocol.equals("ftp") && user == null && pwd == null) { user = "anonymous"; pwd = "[email protected]"; } this.url = url; } /** * Creates a GlobusURL instance from URL instance. *
Note: Not all the url parts are * copied. */ public GlobusURL(URL url) { // TODO: does not handle the password:user spec protocol = url.getProtocol(); host = url.getHost(); port = url.getPort(); urlPath = url.getFile(); } public static int getPort(String protocol) { if (protocol.equals("ftp")) { return 21; } else if (protocol.equals("gsiftp") || protocol.equals("gridftp")) { return 2811; } else if (protocol.equals("http")) { return 80; } else if (protocol.equals("https")) { return 443; } else if (protocol.equals("ldap")) { return 389; } else if (protocol.equals("ldaps")) { return 636; } else { return -1; } } private void parseHostPort(String str) throws MalformedURLException { int start = 0; if (str.length() > 0 && str.charAt(0) == '[') { start = str.indexOf(']'); if (start == -1) { throw new MalformedURLException( "Missing ']' in IPv6 address: " + str ); } } int p1 = str.indexOf(':', start); if (p1 == -1) { host = str; } else { host = str.substring(0, p1); String pp = str.substring(p1+1); try { port = Integer.parseInt(pp); } catch(NumberFormatException e) { throw new MalformedURLException("Invalid port number: " + pp); } } } private void parseUserPwd(String str) { int p1; p1 = str.indexOf(':'); if (p1 == -1) { user = Util.decode(str); } else { user = Util.decode(str.substring(0, p1)); pwd = Util.decode(str.substring(p1+1)); } } /** * Returns the string representation of * an url. * * @return the url as string. */ public String getURL() { return url; } /** * Returns the protocol of an url. * * @return the protocol part of the url. */ public String getProtocol() { return protocol; } /** * Returns the host name of an url. * * @return the host name part of the url. */ public String getHost() { return host; } /** * Returns the port number of an url. * * @return the port name of the url. -1 if * the port was not specified. */ public int getPort() { return port; } /** * Returns the url path part of an url. * * @return the url path part of the url. * Returns null if the url path is * not specified. */ public String getPath() { return urlPath; } /** * Returns the user name of an url. * * @return the user name if present in the url, * otherwise returns null. */ public String getUser() { return user; } /** * Returns the password of an url. * * @return the password if present in the url, * otherwise returns null. */ public String getPwd() { return pwd; } /** * Compares two urls. * * @param obj could be a string representation of an url * or an instance of this class. * @return true if the urls are the same, false otherwise. */ public boolean equals(Object obj) { GlobusURL cUrl = null; if (obj instanceof String) { try { cUrl = new GlobusURL((String)obj); } catch(MalformedURLException e) { return false; } } else if (obj instanceof GlobusURL) { cUrl = (GlobusURL)obj; } else { return false; } // do the comparison // compare ports if (getPort() != cUrl.getPort()) return false; if (!compare(getProtocol(), cUrl.getProtocol(), false)) return false; if (!compare(getHost(), cUrl.getHost(), false)) return false; if (!compare(urlPath, cUrl.urlPath, false)) return false; if (!compare(getUser(), cUrl.getUser(), false)) return false; if (!compare(getPwd(), cUrl.getPwd(), false)) return false; return true; } private boolean compare(String s1, String s2, boolean ignoreCase) { if (s1 == null) { return (s2 == null); } else if (s2 == null) { return false; } else { return (ignoreCase) ? s1.equalsIgnoreCase(s2) : s1.equals(s2); } } public int hashCode() { int value = this.port; if (this.protocol != null) { value += this.protocol.hashCode(); } if (this.host != null) { value += this.host.hashCode(); } if (this.urlPath != null) { value += this.urlPath.hashCode(); } if (this.user != null) { value += this.user.hashCode(); } if (this.pwd != null) { value += this.pwd.hashCode(); } return value; } public String toString() { StringBuffer info = new StringBuffer(); info.append("Protocol : " + protocol + "\n"); info.append("Host name : " + host + "\n"); info.append("Port number : " + port + "\n"); info.append("Url path : " + urlPath + "\n"); info.append("User : " + user + "\n"); info.append("Pwd : " + pwd + "\n"); return info.toString(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy