package org.jacorb.naming;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2014 Gerald Brose / The JacORB Team.
*
* 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();
}
}