| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package com.sun.jndi.cosnaming;  | 
 | 
 | 
 | 
import javax.naming.Name;  | 
 | 
import javax.naming.NamingException;  | 
 | 
 | 
 | 
import java.net.MalformedURLException;  | 
 | 
import com.sun.jndi.toolkit.url.UrlUtil;  | 
 | 
 | 
 | 
/**  | 
 | 
 * Extract components of a "corbaname" URL.  | 
 | 
 *  | 
 | 
 * The format of an corbaname URL is defined in INS 99-12-03 as follows.  | 
 | 
 *<p>  | 
 | 
 * corbaname url = "corbaname:" <corbaloc_obj> ["#" <string_name>]  | 
 | 
 * corbaloc_obj  = <obj_addr_list> ["/" <key_string>]  | 
 | 
 * obj_addr_list = as defined in a corbaloc URL  | 
 | 
 * key_string    = as defined in a corbaloc URL  | 
 | 
 * string_name   = stringified COS name | empty_string  | 
 | 
 *<p>  | 
 | 
 * Characters in <string_name> are escaped as follows.  | 
 | 
 * US-ASCII alphanumeric characters are not escaped. Any characters outside  | 
 | 
 * of this range are escaped except for the following:  | 
 | 
 *        ; / : ? @ & = + $ , - _ . ! ~ * ; ( )  | 
 | 
 * Escaped characters is escaped by using a % followed by its 2 hexadecimal  | 
 | 
 * numbers representing the octet.  | 
 | 
 *<p>  | 
 | 
 * The corbaname URL is parsed into two parts: a corbaloc URL and a COS name.  | 
 | 
 * The corbaloc URL is constructed by concatenation "corbaloc:" with  | 
 | 
 * <corbaloc_obj>.  | 
 | 
 * The COS name is <string_name> with the escaped characters resolved.  | 
 | 
 *<p>  | 
 | 
 * A corbaname URL is resolved by:  | 
 | 
 *<ol>  | 
 | 
 *<li>Construct a corbaloc URL by concatenating "corbaloc:" and <corbaloc_obj>.  | 
 | 
 *<li>Resolve the corbaloc URL to a NamingContext by using  | 
 | 
 *     nctx = ORB.string_to_object(corbalocUrl);  | 
 | 
 *<li>Resolve <string_name> in the NamingContext.  | 
 | 
 *</ol>  | 
 | 
 *  | 
 | 
 * @author Rosanna Lee  | 
 | 
 */  | 
 | 
 | 
 | 
public final class CorbanameUrl { | 
 | 
    private String stringName;  | 
 | 
    private String location;  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public String getStringName() { | 
 | 
        return stringName;  | 
 | 
    }  | 
 | 
 | 
 | 
    public Name getCosName() throws NamingException { | 
 | 
        return CNCtx.parser.parse(stringName);  | 
 | 
    }  | 
 | 
 | 
 | 
    public String getLocation() { | 
 | 
        return "corbaloc:" + location;  | 
 | 
    }  | 
 | 
 | 
 | 
    public CorbanameUrl(String url) throws MalformedURLException { | 
 | 
 | 
 | 
        if (!url.startsWith("corbaname:")) { | 
 | 
            throw new MalformedURLException("Invalid corbaname URL: " + url); | 
 | 
        }  | 
 | 
 | 
 | 
        int addrStart = 10;    | 
 | 
 | 
 | 
        int addrEnd = url.indexOf('#', addrStart); | 
 | 
        if (addrEnd < 0) { | 
 | 
            addrEnd = url.length();  | 
 | 
            stringName = "";  | 
 | 
        } else { | 
 | 
            stringName = UrlUtil.decode(url.substring(addrEnd+1));  | 
 | 
        }  | 
 | 
        location = url.substring(addrStart, addrEnd);  | 
 | 
 | 
 | 
        int keyStart = location.indexOf("/"); | 
 | 
        if (keyStart >= 0) { | 
 | 
              | 
 | 
            if (keyStart == (location.length() -1)) { | 
 | 
                location += "NameService";  | 
 | 
            }  | 
 | 
        } else { | 
 | 
            location += "/NameService";  | 
 | 
        }  | 
 | 
    }  | 
 | 
/*  | 
 | 
    // for testing only  | 
 | 
    public static void main(String[] args) { | 
 | 
        try { | 
 | 
            CorbanameUrl url = new CorbanameUrl(args[0]);  | 
 | 
 | 
 | 
            System.out.println("location: " + url.getLocation()); | 
 | 
            System.out.println("string name: " + url.getStringName()); | 
 | 
        } catch (MalformedURLException e) { | 
 | 
            e.printStackTrace();  | 
 | 
        }  | 
 | 
    }  | 
 | 
*/  | 
 | 
}  |