Produce best-of-breed repid to class name conversion
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
index 72d2d75..2663c2c 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
@@ -363,136 +363,4 @@
return clzdesc;
}
-
- public static String idToClass(String repid) {
- // debug
- logger.finer("idToClass " + repid);
-
- if (repid.startsWith("IDL:")) {
-
- ByteString id = new ByteString(repid);
-
- try {
- int end = id.lastIndexOf(':');
- ByteString s = end < 0 ? id.substring(4) : id.substring(4, end);
-
- ByteBuffer bb = new ByteBuffer();
-
- //
- // reverse order of dot-separated name components up
- // till the first slash.
- //
- int firstSlash = s.indexOf('/');
- if (firstSlash > 0) {
- ByteString prefix = s.substring(0, firstSlash);
- ByteString[] elems = prefix.split('.');
-
- for (int i = elems.length - 1; i >= 0; i--) {
- bb.append(fixName(elems[i]));
- bb.append('.');
- }
-
- s = s.substring(firstSlash + 1);
- }
-
- //
- // Append slash-separated name components ...
- //
- ByteString[] elems = s.split('/');
- for (int i = 0; i < elems.length; i++) {
- bb.append(fixName(elems[i]));
- if (i != elems.length - 1)
- bb.append('.');
- }
-
- String result = bb.toString();
-
- logger.finer("idToClassName " + repid + " => " + result);
-
- return result;
- } catch (IndexOutOfBoundsException ex) {
- logger.log(Level.FINE, "idToClass " + ex.getMessage(), ex);
- return null;
- }
-
- } else if (repid.startsWith("RMI:")) {
- int end = repid.indexOf(':', 4);
- return end < 0 ? repid.substring(4) : repid.substring(4, end);
- }
-
- return null;
- }
-
- static String fixName(String name) {
- return (new ByteString(name)).toString();
- }
-
- static ByteString fixName(ByteString name) {
- if (keyWords.contains(name)) {
- ByteBuffer buf = new ByteBuffer();
- buf.append('_');
- buf.append(name);
- return buf.toByteString();
- }
-
- ByteString result = name;
- ByteString current = name;
-
- boolean match = true;
- while (match) {
-
- int len = current.length();
- match = false;
-
- for (ByteString reservedPostfix : reservedPostfixes) {
- if (current.endsWith(reservedPostfix)) {
- ByteBuffer buf = new ByteBuffer();
- buf.append('_');
- buf.append(result);
- result = buf.toByteString();
-
- int resultLen = reservedPostfix.length();
- if (len > resultLen)
- current = current.substring(0, len - resultLen);
- else
- current = new ByteString("");
-
- match = true;
- break;
- }
- }
-
- }
-
- return name;
- }
-
- private static final Set<ByteString> keyWords;
- private static final Set<ByteString> reservedPostfixes;
-
- static {
- keyWords = createByteStringSet(
- "abstract", "boolean", "break", "byte", "case",
- "catch", "char", "class", "clone", "const", "continue",
- "default", "do", "double", "else", "equals", "extends",
- "false", "final", "finalize", "finally", "float", "for",
- "getClass", "goto", "hashCode", "if", "implements", "import",
- "instanceof", "int", "interface", "long", "native", "new",
- "notify", "notifyAll", "null", "package", "private",
- "protected", "public", "return", "short", "static", "super",
- "switch", "synchronized", "this", "throw", "throws",
- "toString", "transient", "true", "try", "void", "volatile",
- "wait", "while");
- reservedPostfixes = createByteStringSet(
- "Helper", "Holder", "Operations", "POA", "POATie", "Package", "ValueFactory");
- }
-
- private static Set<ByteString> createByteStringSet(String...words) {
- final Set<ByteString> set = new HashSet<>(words.length);
- for (String word : words) {
- set.add(new ByteString(word));
- }
- return Collections.unmodifiableSet(set);
- }
-
}
diff --git a/yoko-util/src/main/java/org/apache/yoko/util/cmsf/RepIds.java b/yoko-util/src/main/java/org/apache/yoko/util/cmsf/RepIds.java
index 4f61ee3..af0ca63 100644
--- a/yoko-util/src/main/java/org/apache/yoko/util/cmsf/RepIds.java
+++ b/yoko-util/src/main/java/org/apache/yoko/util/cmsf/RepIds.java
@@ -1,5 +1,6 @@
package org.apache.yoko.util.cmsf;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
@@ -8,6 +9,7 @@
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
+import java.util.regex.Pattern;
import javax.rmi.CORBA.Util;
@@ -90,71 +92,72 @@
return result;
}
+ private static final Pattern dotPattern = Pattern.compile("\\.");
+ private static final Pattern slashPattern = Pattern.compile("/");
+
private static String toClassName(QueryImpl query) {
final String repid = query.repid;
final String suffix = query.suffix;
String result = null;
-
if (repid.startsWith("IDL:")) {
- try {
- StringBuffer buf = new StringBuffer();
-
- int end = repid.lastIndexOf(':');
- String s;
- if (end < 0)
- s = repid.substring(4);
- else
- s = repid.substring(4, end);
-
- //
- // If the ID contains a prefix, then fix each of the
- // dotted components of the prefix
- //
- int slash = s.indexOf('/');
- if (slash > 0) {
- String prefix = s.substring(0, slash);
- String rest = s.substring(slash + 1);
- java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(
- prefix, ".");
- while (tokenizer.hasMoreTokens()) {
- String tok = tokenizer.nextToken();
- buf.append(fixName(tok));
- buf.append('.');
- }
- s = rest;
- }
-
- //
- // "Fix" the remainder of the ID
- //
- java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(
- s, "/");
- while (tokenizer.hasMoreTokens()) {
- String tok = tokenizer.nextToken();
- buf.append(fixName(tok));
- if (tokenizer.hasMoreTokens())
- buf.append('.');
- }
-
- result = buf.toString() + suffix;
- } catch (IndexOutOfBoundsException ex) // if id has bad format
- {
- result = null;
- }
- }
- else if (repid.startsWith ("RMI:")) {
- int end = repid.indexOf (':', 4);
- result = end < 0
- ? repid.substring (4)
- : repid.substring (4, end);
+ result = idlToClassName(repid);
+ } else if (repid.startsWith("RMI:")) {
+ result = rmiToClassName(repid);
}
if (result != null) {
+ result += suffix;
result = removeUnicodeEscapes(result);
}
return result;
}
+ private static String rmiToClassName(final String repid) {
+ String result;
+ final int end = repid.indexOf (':', 4);
+ result = end < 0 ? repid.substring (4) : repid.substring (4, end);
+ return result;
+ }
+
+ private static String idlToClassName(final String repid) {
+ try {
+ final StringBuilder sb = new StringBuilder(repid.length());
+
+ final int end = repid.lastIndexOf(':');
+ String s = end < 0 ? repid.substring(4) : repid.substring(4, end);
+
+ //
+ // reverse order of dot-separated name components up
+ // till the first slash.
+ //
+ final int firstSlash = s.indexOf('/');
+ if (firstSlash > 0) {
+ String prefix = s.substring(0, firstSlash);
+ String[] elems = dotPattern.split(prefix);
+ Collections.reverse(Arrays.asList(elems)); //reverses the order in the underlying array - i.e. 'elems'
+ for (String elem: elems) {
+ sb.append(fixName(elem));
+ sb.append('.');
+ }
+
+ s = s.substring(firstSlash + 1);
+ }
+
+ //
+ // Append slash-separated name components ...
+ //
+ for (String elem: slashPattern.split(s)) {
+ sb.append(fixName(elem)).append('.');
+ }
+ sb.deleteCharAt(sb.length() - 1); // eliminate final '.'
+
+ return sb.toString();
+ } catch (IndexOutOfBoundsException ex) {
+ // id has bad format
+ return null;
+ }
+ }
+
private static String removeUnicodeEscapes(String in) {
// if no escape sequences are in the string, this is easy
int escape = in.indexOf("\\U");
@@ -162,12 +165,10 @@
return in;
}
- // get a string buffer at least as long as the input string
- StringBuffer out = new StringBuffer(in.length());
+ StringBuilder out = new StringBuilder(in.length());
int start = 0;
while (escape >= 0) {
- // add the next real segment to the buffer
out.append(in.substring(start, escape));
// step over the escape sequence
escape += 2;