package org.wildfly.iiop.openjdk.naming;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2004 Gerald Brose.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
import java.util.Vector;
import org.omg.CORBA.INTERNAL;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextPackage.InvalidName;
/**
* A convenience class for names and converting between Names and their string representation
*
* @author Gerald Brose, FU Berlin
*/
public class Name implements java.io.Serializable {
private NameComponent[] fullName;
private NameComponent baseName;
/** context part of this Name */
private NameComponent[] ctxName;
public Name() {
fullName = null;
baseName = null;
ctxName = null;
}
/**
* create a name from an array of NameComponents
*/
public Name(NameComponent[] n) throws InvalidName {
if (n == null || n.length == 0)
throw new InvalidName();
fullName = n;
baseName = n[n.length - 1];
if (n.length > 1) {
ctxName = new NameComponent[n.length - 1];
for (int i = 0; i < n.length - 1; i++)
ctxName[i] = n[i];
} else
ctxName = null;
}
/**
* create a name from a stringified name
*/
public Name(String string_name) throws org.omg.CosNaming.NamingContextPackage.InvalidName {
this(toName(string_name));
}
/**
* create a name from a singleNameComponent
*/
public Name(org.omg.CosNaming.NameComponent n) throws org.omg.CosNaming.NamingContextPackage.InvalidName {
if (n == null)
throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
baseName = n;
fullName = new org.omg.CosNaming.NameComponent[1];
fullName[0] = n;
ctxName = null;
}
/**
* @return a NameComponent object representing the unstructured base name of this structured name
*/
public org.omg.CosNaming.NameComponent baseNameComponent() {
return baseName;
}
public String kind() {
return baseName.kind;
}
/**
* @return this name as an array of org.omg.CosNaming.NameComponent, neccessary for a number of operations on naming context
*/
public org.omg.CosNaming.NameComponent[] components() {
return fullName;
}
/**
* @return a Name object representing the name of the enclosing context
*/
public Name ctxName() {
// null if no further context
if (ctxName != null) {
try {
return new Name(ctxName);
} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
throw new INTERNAL(e.toString());
}
}
return null;
}
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof Name))
return false;
return (toString().equals(obj.toString()));
}
public Name fullName() throws org.omg.CosNaming.NamingContextPackage.InvalidName {
return new Name(fullName);
}
public int hashCode() {
return toString().hashCode();
}
/**
* @return the string representation of this name
*/
public String toString() {
try {
return toString(fullName);
} catch (InvalidName in) {
return "<invalid>";
}
}
/**
* @return a single NameComponent, parsed from sn
*/
private static org.omg.CosNaming.NameComponent getComponent(String sn)
throws org.omg.CosNaming.NamingContextPackage.InvalidName {
char ch;
int len = sn.length();
boolean inKind = false;
StringBuffer id = new StringBuffer();
StringBuffer kind = new StringBuffer();
for (int i = 0; i < len; i++) {
ch = sn.charAt(i);
if (ch == '\\') {
// Escaped character
i++;
if (i >= len) {
throw new InvalidName();
}
ch = sn.charAt(i);
} else if (ch == '.') {
// id/kind separator character
if (inKind) {
throw new InvalidName();
}
inKind = true;
continue;
}
if (inKind) {
kind.append(ch);
} else {
id.append(ch);
}
}
return (new org.omg.CosNaming.NameComponent(id.toString(), kind.toString()));
}
/**
*
* @return an a array of NameComponents
* @throws org.omg.CosNaming.NamingContextPackage.InvalidName
*/
public static org.omg.CosNaming.NameComponent[] toName(String sn) throws org.omg.CosNaming.NamingContextPackage.InvalidName {
if (sn == null || sn.length() == 0 || sn.startsWith("/"))
throw new InvalidName();
Vector v = new Vector();
int start = 0;
int i = 0;
for (; i < sn.length(); i++) {
if (sn.charAt(i) == '/' && sn.charAt(i - 1) != '\\') {
if (i - start == 0)
throw new InvalidName();
v.addElement(getComponent(sn.substring(start, i)));
start = i + 1;
}
}
if (start < i)
v.addElement(getComponent(sn.substring(start, i)));
org.omg.CosNaming.NameComponent[] result = new org.omg.CosNaming.NameComponent[v.size()];
for (int j = 0; j < result.length; j++) {
result[j] = (org.omg.CosNaming.NameComponent) v.elementAt(j);
}
return result;
}
/**
* @return the string representation of this NameComponent array
*/
public static String toString(org.omg.CosNaming.NameComponent[] n)
throws org.omg.CosNaming.NamingContextPackage.InvalidName {
if (n == null || n.length == 0)
throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
StringBuffer b = new StringBuffer();
for (int i = 0; i < n.length; i++) {
if (i > 0)
b.append("/");
if (n[i].id.length() > 0)
b.append(escape(n[i].id));
if (n[i].kind.length() > 0 || n[i].id.length() == 0)
b.append(".");
if (n[i].kind.length() > 0)
b.append(escape(n[i].kind));
}
return b.toString();
}
/**
* escape any occurrence of "/", "." and "\"
*/
private static String escape(String s) {
StringBuffer sb = new StringBuffer(s);
for (int i = 0; i < sb.length(); i++) {
if (sb.charAt(i) == '/' || sb.charAt(i) == '\\' || sb.charAt(i) == '.') {
sb.insert(i, '\\');
i++;
}
}
return sb.toString();
}
}