GERONIMOTCK-142 Transform repository ID names to valid ones

git-svn-id: https://svn.apache.org/repos/asf/geronimo/yoko/trunk@1365466 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
index 3abc6d2..cb8e99a 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
@@ -37,6 +37,7 @@
 import java.util.logging.Logger;
 import java.util.logging.Level;
 
+import org.apache.yoko.rmi.util.StringUtil;
 import org.omg.CORBA.MARSHAL;
 import org.omg.CORBA.TypeCode;
 import org.omg.CORBA.ValueMember;
@@ -101,7 +102,7 @@
     public String getRepositoryID() {
         if (_repid == null) {
             StringBuffer buf = new StringBuffer("RMI:");
-            buf.append(getJavaClass().getName());
+            buf.append(StringUtil.convertToValidIDLNames(getJavaClass().getName()));
             buf.append(":");
 
             String hashCode = Long.toHexString(_hash_code).toUpperCase();
@@ -823,6 +824,8 @@
             // read custom marshalling value header
             byte streamFormatVersion = reader.readByte();
             boolean writeDefaultStateCalled = reader.readBoolean();
+            logger.log(Level.FINE, "Reading value in streamFormatVersion=" + streamFormatVersion 
+                    + " IsCalleddefaultWriteObject=" + writeDefaultStateCalled);
         }
 
         if (_read_object_method != null) {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/util/StringUtil.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/util/StringUtil.java
index c59afe4..2eebc67 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/util/StringUtil.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/util/StringUtil.java
@@ -73,4 +73,71 @@
 
         return result.toString();
     }
+    
+    public static final byte[] HEX_CHARS = {
+        (byte)'0',
+        (byte)'1',
+        (byte)'2',
+        (byte)'3',
+        (byte)'4',
+        (byte)'5',
+        (byte)'6',
+        (byte)'7',
+        (byte)'8',
+        (byte)'9',
+        (byte)'A',
+        (byte)'B',
+        (byte)'C',
+        (byte)'D',
+        (byte)'E',
+        (byte)'F',
+    };
+
+    public static final byte[] VALID_IDL_CHARS = {
+        0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
+        0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
+        0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,1,0,
+        1,1,1,1, 1,1,1,1, 1,1,0,0, 0,0,0,0,
+        0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
+        1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,1,
+        0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
+        1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0,
+        0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
+        0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
+        0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
+        0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
+        1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
+        0,1,1,1, 1,1,1,0, 1,1,1,1, 1,0,0,1,
+        1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
+        0,1,1,1, 1,1,1,0, 1,1,1,1, 1,0,0,1,
+    };
+
+    public static String convertToValidIDLNames(String str) {
+
+        int length = str.length();
+        if (length == 0) {
+            return str;
+        }
+        
+        StringBuilder builder = new StringBuilder();
+        
+        for (char c : str.toCharArray()) {
+            if (c > 255 || VALID_IDL_CHARS[c] == 0) {
+                builder.append("\\U" +
+                        (char)HEX_CHARS[(c & 0xF000) >>> 12] +
+                        (char)HEX_CHARS[(c & 0x0F00) >>> 8] +
+                        (char)HEX_CHARS[(c & 0x00F0) >>> 4] +
+                        (char)HEX_CHARS[(c & 0x000F)] );
+            } else {
+                builder.append(c);
+            }
+        }
+        
+        if (builder.length() > 0) {
+            str = builder.toString();
+        }
+        
+        return str;
+    }
+    
 }