summaryrefslogtreecommitdiff
path: root/gnu/CORBA/NamingService/NameParser.java
diff options
context:
space:
mode:
authorAudrius Meskauskas <audriusa@Bioinformatics.org>2005-09-02 15:53:05 +0000
committerAudrius Meskauskas <audriusa@Bioinformatics.org>2005-09-02 15:53:05 +0000
commit16d2ccf44ebcc6f1caa902cb75a61bf2dc21b153 (patch)
tree496184a12d3273b47a091261c7f85b8eef8e47ef /gnu/CORBA/NamingService/NameParser.java
parent57449b75ee1714d1ce50d04f4db4db84f797068e (diff)
downloadclasspath-16d2ccf44ebcc6f1caa902cb75a61bf2dc21b153.tar.gz
2005-09-02 <AudriusA@Bioinformatics.org>
* gnu/CORBA/IOR_Delegate.java (request), gnu/CORBA/SocketRepository.java (get_socket), gnu/CORBA/gnuRequest (getParameterStream), gnu/CORBA/NamingService/NameParser.java, gnu/CORBA/NamingService/NamingServiceTransient.java: Rewritten. * gnu/CORBA/Functional_ORB.java (nameParser): New field. (string_to_object): Rewritten. (ior_to_object): Made public. * org/omg/CORBA/ORB.java (string_to_object): Documentation update.
Diffstat (limited to 'gnu/CORBA/NamingService/NameParser.java')
-rw-r--r--gnu/CORBA/NamingService/NameParser.java179
1 files changed, 146 insertions, 33 deletions
diff --git a/gnu/CORBA/NamingService/NameParser.java b/gnu/CORBA/NamingService/NameParser.java
index a415f2120..f886cf935 100644
--- a/gnu/CORBA/NamingService/NameParser.java
+++ b/gnu/CORBA/NamingService/NameParser.java
@@ -38,6 +38,7 @@
package gnu.CORBA.NamingService;
+import gnu.CORBA.Functional_ORB;
import gnu.CORBA.IOR;
import gnu.CORBA.Unexpected;
import gnu.CORBA.Version;
@@ -47,6 +48,12 @@ import org.omg.CORBA.DATA_CONVERSION;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Object;
import org.omg.CORBA.ORBPackage.InvalidName;
+import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.portable.ObjectImpl;
+import org.omg.CosNaming.NamingContext;
+import org.omg.CosNaming.NamingContextExtHelper;
+import org.omg.CosNaming.NamingContextHelper;
+import org.omg.CosNaming._NamingContextStub;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
@@ -67,11 +74,22 @@ import java.util.StringTokenizer;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class NameParser
+ extends snConverter
{
/**
- * The mandatory prefix.
+ * The corbaloc prefix.
*/
- public static final String CORBALOC = "corbaloc";
+ public static final String pxCORBALOC = "corbaloc";
+
+ /**
+ * The corbaname prefix.
+ */
+ public static final String pxCORBANAME = "corbaname";
+
+ /**
+ * The IOR prefix.
+ */
+ public static final String pxIOR = "ior";
/**
* Marks iiop protocol.
@@ -89,22 +107,46 @@ public class NameParser
public static final int DEFAULT_PORT = 2809;
/**
+ * The default name.
+ */
+ public static final String DEFAULT_NAME = "NameService";
+
+ /**
+ * The string to name converter, initialized on demand.
+ */
+ static snConverter converter;
+
+ /**
+ * The current position.
+ */
+ int p;
+
+ /**
+ * The address being parsed, splitted into tokens.
+ */
+ String[] t;
+
+ /**
* Parse CORBALOC.
*
* The expected format is: <br>
* 1. corbaloc:[iiop][version.subversion@]:host[:port]/key <br>
- * 2. corbaloc:rir:/key <br>
+ * 2. corbaloc:rir:[/key] <br>
+ * 3. corbaname:[iiop][version.subversion@]:host[:port]/key <br>
+ * 4. corbaname:rir:[/key] <br>
*
- * protocol defaults to IOP.
+ * Protocol defaults to IOP, the object key defaults to the NameService.
*
* @param corbaloc the string to parse.
* @param orb the ORB, needed to create IORs and resolve rir references.
*
- * @return the constructed IOR.
+ * @return the resolved object.
*/
- public static java.lang.Object corbaloc(String corbaloc, ORB orb)
+ public synchronized org.omg.CORBA.Object corbaloc(String corbaloc,
+ Functional_ORB orb)
throws BAD_PARAM
{
+ boolean corbaname;
// The alternative addresses, if given.
ArrayList alt_addr = new ArrayList();
@@ -122,22 +164,33 @@ public class NameParser
// The object key as string.
String key;
- StringTokenizer st = new StringTokenizer(corbaloc, ":@/.,", true);
+ StringTokenizer st = new StringTokenizer(corbaloc, ":@/.,#", true);
- String[] t = new String[st.countTokens()];
+ t = new String[st.countTokens()];
for (int i = 0; i < t.length; i++)
{
t[i] = st.nextToken();
}
- int p = 0;
+ p = 0;
+
+ if (t[p].startsWith(pxCORBANAME))
+ corbaname = true;
+ else if (t[p].equalsIgnoreCase(pxCORBALOC))
+ corbaname = false;
+ else if (t[p].equalsIgnoreCase(pxIOR))
+ {
+ IOR ior = IOR.parse(corbaloc);
+ return orb.ior_to_object(ior);
+ }
+ else
+ throw new DATA_CONVERSION("Unsupported protocol: '" + t[p] + "'");
- if (!t[p++].equalsIgnoreCase(CORBALOC))
- throw new BAD_PARAM("Must start with corbaloc:");
+ p++;
if (!t[p++].equals(":"))
- throw new BAD_PARAM("Must start with corbaloc:");
+ throw new BAD_PARAM("Syntax (':' expected after name prefix)");
// Check for rir:
if (t[p].equals(RIR))
@@ -146,25 +199,25 @@ public class NameParser
if (!t[p++].equals(":"))
throw new BAD_PARAM("':' expected after 'rir'");
- key = readKey(p, t);
-
+ key = readKey("/");
+
Object object;
try
{
object = orb.resolve_initial_references(key);
+ return corbaname ? resolve(object) : object;
}
catch (InvalidName e)
{
- throw new BAD_PARAM("Unknown initial reference '"+key+"'");
+ throw new BAD_PARAM("Unknown initial reference '" + key + "'");
}
- return object;
}
else
// Check for iiop.
if (t[p].equals(IIOP) || t[p].equals(":"))
{
IOR ior = new IOR();
-
+
Addresses: do
{ // Read addresses.
if (t[p].equals(":"))
@@ -203,9 +256,9 @@ public class NameParser
p++; // '@' at this point.
}
}
-
+
ior.Internet.version = new Version(major, minor);
-
+
// Then host data goes till '/' or ':'.
StringBuffer bhost = new StringBuffer(corbaloc.length());
while (!t[p].equals(":") && !t[p].equals("/") && !t[p].equals(","))
@@ -228,12 +281,12 @@ public class NameParser
throw new BAD_PARAM("Invalid port '" + t[p - 1] + "'");
}
}
-
+
ior.Internet.port = port;
-
+
// Id is not listed.
ior.Id = "";
-
+
if (t[p].equals(","))
p++;
else
@@ -241,28 +294,80 @@ public class NameParser
}
while (true);
- key = readKey(p, t);
+ key = readKey("/");
ior.key = key.getBytes();
-
- return ior;
+
+ org.omg.CORBA.Object object = orb.ior_to_object(ior);
+ return corbaname ? resolve(object) : object;
}
+
else
throw new DATA_CONVERSION("Unsupported protocol '" + t[p] + "'");
+ }
+ private org.omg.CORBA.Object resolve(org.omg.CORBA.Object object)
+ {
+ NamingContext ns;
+ String key = "?";
+ try
+ {
+ if (object instanceof NamingContext)
+ ns = (NamingContext) object;
+ else
+ {
+ Delegate delegate = ((ObjectImpl) object)._get_delegate();
+ ns = new _NamingContextStub(delegate);
+ }
+ }
+ catch (Exception ex)
+ {
+ BAD_PARAM bad = new BAD_PARAM("The CORBANAME target " + object
+ + " is not a NamingContext");
+ bad.minor = 10;
+ bad.initCause(ex);
+ throw bad;
+ }
+
+ if (converter == null)
+ converter = new snConverter();
+
+ try
+ {
+ key = readKey("#");
+ object = ns.resolve(converter.toName(key));
+ return object;
+ }
+ catch (Exception ex)
+ {
+ BAD_PARAM bad = new BAD_PARAM("Wrong CORBANAME '" + key + "'");
+ bad.minor = 10;
+ bad.initCause(ex);
+ throw bad;
+ }
}
- private static String readKey(int p, String[] t)
+ private String readKey(String delimiter)
throws BAD_PARAM
{
- if (!t[p].equals("/"))
- throw new BAD_PARAM("'/keyString' expected '" + t[p] + "' found");
+ if (p < t.length)
+ if (!t[p].equals(delimiter))
+ {
+ if (t[p].equals("#"))
+ return DEFAULT_NAME;
+ else
+ throw new BAD_PARAM("'" + delimiter + "String' expected '" + t[p]
+ + "' found");
+ }
StringBuffer bKey = new StringBuffer();
p++;
- while (p < t.length)
+ while (p < t.length && !t[p].equals("#"))
bKey.append(t[p++]);
+ if (bKey.length() == 0)
+ return DEFAULT_NAME;
+
try
{
return URLDecoder.decode(bKey.toString(), "UTF-8");
@@ -272,11 +377,13 @@ public class NameParser
throw new Unexpected("URLDecoder does not support UTF-8", e);
}
}
-
- static void corbalocT(String ior, ORB orb)
+
+ static NameParser n = new NameParser();
+
+ static void corbalocT(String ior, Functional_ORB orb)
{
System.out.println(ior);
- System.out.println(corbaloc(ior, orb));
+ System.out.println(n.corbaloc(ior, orb));
System.out.println();
}
@@ -284,7 +391,7 @@ public class NameParser
{
try
{
- ORB orb = ORB.init(args, null);
+ Functional_ORB orb = (Functional_ORB) ORB.init(args, null);
corbalocT("corbaloc:iiop:1.3@155axyz.com/Prod/aTradingService", orb);
corbalocT("corbaloc:iiop:2.7@255bxyz.com/Prod/bTradingService", orb);
corbalocT("corbaloc:iiop:355cxyz.com/Prod/cTradingService", orb);
@@ -295,6 +402,12 @@ public class NameParser
corbalocT("corbaloc:iiop:1.2@host1:3076/0", orb);
corbalocT("corbaloc:rir:/NameService", orb);
+ corbalocT("corbaloc:rir:/", orb);
+ corbalocT("corbaloc:rir:", orb);
+
+ corbalocT("corbaloc:rir:/NameService", orb);
+ corbalocT("corbaloc:rir:/", orb);
+ corbalocT("corbaloc:rir:", orb);
corbalocT("corbaloc::555xyz.com,:556xyz.com:80/Dev/NameService", orb);
}