/* * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.jndi.url.rmi; import java.util.Hashtable; import java.rmi.registry.LocateRegistry; import javax.naming.*; import javax.naming.spi.ResolveResult; import com.sun.jndi.toolkit.url.GenericURLContext; import com.sun.jndi.rmi.registry.RegistryContext; /** * An RMI URL context resolves names that are URLs of the form * <pre> * rmi://[host][:port][/[object]] * or * rmi:[/][object] * </pre> * If an object is specified, the URL resolves to the named object. * Otherwise, the URL resolves to the specified RMI registry. * * @author Scott Seligman */ public class rmiURLContext extends GenericURLContext { public rmiURLContext(Hashtable env) { super(env); } /** * Resolves the registry portion of "url" to the corresponding * RMI registry, and returns the atomic object name as the * remaining name. */ protected ResolveResult getRootURLContext(String url, Hashtable env) throws NamingException { if (!url.startsWith("rmi:")) { throw (new IllegalArgumentException( "rmiURLContext: name is not an RMI URL: " + url)); } // Parse the URL. String host = null; int port = -1; String objName = null; int i = 4; // index into url, following the "rmi:" if (url.startsWith("//", i)) { // parse "//host:port" i += 2; // skip past "//" int slash = url.indexOf('/', i); if (slash < 0) { slash = url.length(); } if (url.startsWith("[", i)) { // at IPv6 literal int brac = url.indexOf(']', i + 1); if (brac < 0 || brac > slash) { throw new IllegalArgumentException( "rmiURLContext: name is an Invalid URL: " + url); } host = url.substring(i, brac + 1); // include brackets i = brac + 1; // skip past "[...]" } else { // at host name or IPv4 int colon = url.indexOf(':', i); int hostEnd = (colon < 0 || colon > slash) ? slash : colon; if (i < hostEnd) { host = url.substring(i, hostEnd); } i = hostEnd; // skip past host } if ((i + 1 < slash)) { if ( url.startsWith(":", i)) { // parse port i++; // skip past ":" port = Integer.parseInt(url.substring(i, slash)); } else { throw new IllegalArgumentException( "rmiURLContext: name is an Invalid URL: " + url); } } i = slash; } if ("".equals(host)) { host = null; } if (url.startsWith("/", i)) { // skip "/" before object name i++; } if (i < url.length()) { objName = url.substring(i); } // Represent object name as empty or single-component composite name. CompositeName remaining = new CompositeName(); if (objName != null) { remaining.add(objName); } // Debug //System.out.println("host=" + host + " port=" + port + // " objName=" + remaining.toString() + "\n"); // Create a registry context. Context regCtx = new RegistryContext(host, port, env); return (new ResolveResult(regCtx, remaining)); } }