Encapsulate init of ModelElement fields and Descriptor repids
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java
index 80f8e42..8a64c50 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java
@@ -23,12 +23,9 @@
         super(type, repository);
     }
 
-    public String getRepositoryID() {
-        if (_repid == null)
-            _repid = "IDL:" + getJavaClass().getName().replace('.', '/')
-                    + ":1.0";
-
-        return _repid;
+    @Override
+    protected String genRepId() {
+        return String.format("IDL:%s:1.0", _java_class.getName().replace('.', '/'));
     }
 
     /** Read an instance of this value from a CDR stream */
@@ -60,7 +57,7 @@
         if (_type_code == null) {
             org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
             _type_code = orb.create_abstract_interface_tc(getRepositoryID(),
-                    getJavaClass().getName());
+                    _java_class.getName());
         }
 
         return _type_code;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java
index 39d2c3a..faabb00 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java
@@ -23,12 +23,9 @@
         super(type, rep);
     }
 
-    public String getRepositoryID() {
-        if (_repid == null)
-            _repid = "IDL:" + getJavaClass().getName().replace('.', '/')
-                    + ":1.0";
-
-        return _repid;
+    @Override
+    protected String genRepId() {
+        return String.format("IDL:%s:1.0", _java_class.getName().replace('.', '/'));
     }
 
     /** Read an instance of this value from a CDR stream */
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
index 0eccedb..1a5f7cb 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
@@ -35,45 +35,30 @@
     protected Class basicType;
 
     protected Class elementType;
-    // repository ID for the array class
-    String _repid = null;
     // repository ID for the contained elements
-    String _elementRepid = null;
+    private volatile String _elementRepid = null;
 
-    public String getRepositoryID() {
-        if (_repid != null)
-            return _repid;
+    @Override
+    protected String genRepId() {
+        if (elementType.isPrimitive() || elementType == Object.class)
+            return String.format("RMI:%s:%016X", _java_class.getName(), 0);
 
-        if (elementType.isPrimitive() || elementType == Object.class) {
-            _repid = "RMI:" + getJavaClass().getName() + ":0000000000000000";
-        } else {
-            TypeDescriptor desc = repo.getDescriptor(elementType);
-            String elemRep = desc.getRepositoryID();
-            String hash = elemRep.substring(elemRep.indexOf(':', 4));
-            _repid = "RMI:" + getJavaClass().getName() + hash;
-        }
-
-        // System.out.println ("REPID "+getJavaClass()+" >> "+_repid);
-
-        return _repid;
+        TypeDescriptor desc = repo.getDescriptor(elementType);
+        String elemRep = desc.getRepositoryID();
+        String hash = elemRep.substring(elemRep.indexOf(':', 4));
+        return String.format("RMI:%s:%s", _java_class.getName(), hash);
     }
 
-
-    public String getElementRepositoryID() {
-        if (_elementRepid != null) {
-            return _elementRepid;
-        }
-
+    private final String genElemRepId() {
         if (elementType.isPrimitive() || elementType == Object.class) {
             // use the descriptor type past the array type marker
-            _elementRepid = "RMI:" + getJavaClass().getName().substring(1) + ":0000000000000000";
-        } else {
-            TypeDescriptor desc = repo.getDescriptor(elementType);
-            _elementRepid = desc.getRepositoryID();
+            return String.format("RMI:%s:%016X", _java_class.getName().substring(1), 0);
         }
+        return repo.getDescriptor(elementType).getRepositoryID();
+    }
 
-        // System.out.println ("Element REPID "+getJavaClass()+" >> "+_elementRepid);
-
+    public String getElementRepositoryID() {
+        if (_elementRepid == null) _elementRepid = genElemRepId();
         return _elementRepid;
     }
 
@@ -178,17 +163,11 @@
      */
     public Object read(org.omg.CORBA.portable.InputStream in) {
         org.omg.CORBA_2_3.portable.InputStream _in = (org.omg.CORBA_2_3.portable.InputStream) in;
-        logger.fine("Reading an array value with repository id " + getRepositoryID() + " java class is " + getJavaClass()); 
+        logger.fine("Reading an array value with repository id " + getRepositoryID() + " java class is " + _java_class);
         
         // if we have a resolved class, read using that, otherwise fall back on the 
         // repository id. 
-        Class clz = getJavaClass(); 
-        if (clz == null) {
-            return _in.read_value(getRepositoryID());
-        }
-        else { 
-            return _in.read_value(clz);
-        }
+        return ((null == _java_class) ? _in.read_value(getRepositoryID()) : _in.read_value(_java_class));
     }
 
     /** Write an instance of this value to a CDR stream */
@@ -242,7 +221,7 @@
         Object[] arr = (Object[]) value;
         out.write_long(arr.length);
 
-        logger.finer("writing " + getJavaClass().getName() + " size="
+        logger.finer("writing " + _java_class.getName() + " size="
                 + arr.length);
 
         for (int i = 0; i < arr.length; i++) {
@@ -261,7 +240,7 @@
 
             offsetMap.put(key, arr);
 
-            logger.fine("reading " + getJavaClass().getName() + " size="
+            logger.fine("reading " + _java_class.getName() + " size="
                     + arr.length);
 
             for (int i = 0; i < length; i++) {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java
index 89fd716..166a202 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java
@@ -23,20 +23,11 @@
         super(type, repository);
     }
 
-    String ex_repid = null;
+    private volatile String ex_repid = null;
 
-    public String getExceptionRepositoryID() {
-        if (ex_repid == null) {
-            init_repid();
-        }
-
-        return ex_repid;
-    }
-
-    void init_repid() {
-        Class type = getJavaClass();
-        String name = type.getName();
-        String encname = null;
+    private String genExceptionRepId() {
+        String name = _java_class.getName();
+        final String encname;
 
         if (name.endsWith("Exception")) {
             encname = name.substring(0, name.length() - 7);
@@ -44,7 +35,11 @@
             encname = name + "Ex";
         }
 
-        ex_repid = "IDL:" + encname.replace('.', '/') + ":1.0";
+        return String.format("IDL:%s:1.0", encname.replace('.', '/'));
     }
 
+    public final String getExceptionRepositoryID() {
+        if (ex_repid == null) ex_repid = genExceptionRepId();
+        return ex_repid;
+    }
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java
index c90be24..9c7de4f 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java
@@ -36,7 +36,7 @@
     }
 
     @Override
-    public String getRepositoryID() {
+    protected String genRepId() {
         return repid;
     }
 
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java
index 7a06399..9d8f2c3 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java
@@ -38,7 +38,7 @@
     }
 
     @Override
-    public String getRepositoryID() {
+    protected String genRepId() {
         return repid;
     }
 
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java
index bdd4964..ad379af 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java
@@ -64,7 +64,7 @@
     FieldDescriptor findField(ValueMember valueMember) {
         FieldDescriptor result = null;
 
-        for (Class c = getJavaClass(); c != null; c = c.getSuperclass()) {
+        for (Class c = _java_class; c != null; c = c.getSuperclass()) {
             TypeDescriptor td = repo.getDescriptor(c);
             if (td instanceof ValueDescriptor) {
                 ValueDescriptor vd = (ValueDescriptor) td;
@@ -85,12 +85,8 @@
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.yoko.rmi.impl.TypeDescriptor#getRepositoryID()
-     */
-    public String getRepositoryID() {
+    @Override
+    protected String genRepId() {
         return repid;
     }
 
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java
index d7228d6..11dc546 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java
@@ -51,7 +51,7 @@
         super.init();
 
         try {
-            final Class type = getJavaClass();
+            final Class type = _java_class;
             final String helperName = type.getName() + "Helper";
             final Class helperClass = javax.rmi.CORBA.Util.loadClass(
                     helperName, null, type.getClassLoader());
@@ -98,7 +98,7 @@
 
         } catch (ClassNotFoundException ex) {
             throw new RuntimeException("cannot load IDL Helper class for "
-                    + getJavaClass(), ex);
+                    + _java_class, ex);
         }
     }
     
@@ -119,7 +119,7 @@
         // the CORBA Object interface are actual corba objects, and must be handled that way. 
         // Other IDLEntity classes are just transmitted by value. 
         if (isCorba) {
-            return _in.read_Object(getJavaClass()); 
+            return _in.read_Object(_java_class);
         }
         else {
 
@@ -142,7 +142,7 @@
 
     public Object readValue(org.omg.CORBA.portable.InputStream in) {
         if (isAbstract) {
-            throw new MARSHAL("IDL Entity " + getJavaClass().getName()
+            throw new MARSHAL("IDL Entity " + _java_class.getName()
                     + " is abstract");
         }
 
@@ -177,7 +177,7 @@
 
     public void writeValue(org.omg.CORBA.portable.OutputStream out, java.io.Serializable val) {
         if (isAbstract) {
-            throw new MARSHAL("IDL Entity " + getJavaClass().getName()
+            throw new MARSHAL("IDL Entity " + _java_class.getName()
                     + " is abstract");
         }
 
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java
index 1dfa274..16f1a51 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java
@@ -226,7 +226,7 @@
     public org.omg.CORBA.portable.OutputStream writeException(
             org.omg.CORBA.portable.ResponseHandler response, Throwable ex) {
         for (int i = 0; i < exception_types.length; i++) {
-            if (exception_types[i].getJavaClass().isInstance(ex)) {
+            if (exception_types[i]._java_class.isInstance(ex)) {
                 org.omg.CORBA.portable.OutputStream out = response
                         .createExceptionReply();
                 org.omg.CORBA_2_3.portable.OutputStream out2 = (org.omg.CORBA_2_3.portable.OutputStream) out;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
index 28d773b..e70afe6 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
@@ -39,7 +39,7 @@
     byte[] _id;
 
     Class getJavaClass() {
-        return _descriptor.getJavaClass();
+        return _descriptor._java_class;
     }
 
     RMIState getRMIState() {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java
index 20fb38c..4cd36cc 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java
@@ -23,37 +23,17 @@
         super(type, repository);
     }
 
-    String stub_repid = null;
-
-    public String getRepositoryID() {
-        if (stub_repid == null) {
-            init_repid();
-        }
-
-        return stub_repid;
-    }
-
-    void init_repid() {
-        Class type = getJavaClass();
-
-        Class[] ifaces = type.getInterfaces();
-
+    @Override
+    protected String genRepId() {
+        final Class[] ifaces = _java_class.getInterfaces();
         if (ifaces.length != 2 || ifaces[1] != org.apache.yoko.rmi.util.stub.Stub.class) {
             throw new RuntimeException("Unexpected RMIStub structure");
         }
 
-        String ifname = ifaces[0].getName();
-        String stubClassName = null;
-
-        int idx = ifname.lastIndexOf('.');
-        if (idx == -1) {
-            stubClassName = "_" + ifname + "_Stub";
-        } else {
-            stubClassName = ifname.substring(0, idx + 1) + "_"
-                    + ifname.substring(idx + 1) + "_Stub";
-        }
-
-        stub_repid = "RMI:" + stubClassName + ":0";
+        final String ifname = ifaces[0].getName();
+        final int idx = ifname.lastIndexOf('.');
+        return ((idx < 0) ? String.format("RMI:_%s_Stub:0", ifname) :
+                String.format("RMI:%s_%s_Stub:0", ifname.substring(0, idx + 1), ifname.substring(idx + 1)));
     }
 
     //
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java
index 74f4c06..d0855be 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java
@@ -42,7 +42,7 @@
     static final RMIStubHandler instance = new RMIStubHandler();
 
     public Object stubWriteReplace(RMIStub stub) {
-    Class type = stub._descriptor.getJavaClass();
+        Class type = stub._descriptor._java_class;
     return new org.apache.yoko.rmi.impl.RMIPersistentStub(stub, type);
     }
     
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java
index ca40f49..c660417 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java
@@ -20,8 +20,9 @@
 
 class RemoteClassDescriptor extends RemoteDescriptor {
 
-    public String getRepositoryID() {
-        return "IDL:" + getJavaClass().getName().replace('.', '/') + ":1.0";
+    @Override
+    protected String genRepId() {
+        return String.format("IDL:%s:1.0", _java_class.getName().replace('.', '/'));
     }
 
     RemoteClassDescriptor(Class type, TypeRepository repository) {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java
index 4154c49..5e91b4b 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java
@@ -54,9 +54,9 @@
         if (this instanceof RemoteInterfaceDescriptor) {
             result = (RemoteInterfaceDescriptor) this;
         } else {
-            Class[] remotes = collect_remote_interfaces(getJavaClass());
+            Class[] remotes = collect_remote_interfaces(_java_class);
             if (remotes.length == 0) {
-                throw new RuntimeException(getJavaClass().getName()
+                throw new RuntimeException(_java_class.getName()
                         + " has no remote interfaces");
             }
             Class most_specific_interface = remotes[0];
@@ -79,7 +79,7 @@
 
     public String[] all_interfaces() {
         if (_ids == null) {
-            Class[] ifaces = collect_remote_interfaces(getJavaClass());
+            Class[] ifaces = collect_remote_interfaces(_java_class);
             int len = ifaces.length;
             String[] ids = new String[len];
             for (int i = 0; i < len; i++) {
@@ -110,7 +110,7 @@
 
     void debugMethodMap() {
         if (logger.isLoggable(Level.FINER)) {
-            logger.finer("METHOD MAP FOR " + getJavaClass().getName());
+            logger.finer("METHOD MAP FOR " + _java_class.getName());
 
             Iterator it = method_map.keySet().iterator();
             while (it.hasNext()) {
@@ -165,7 +165,7 @@
         ArrayList method_list = new ArrayList();
 
         // first step is to build the helpers for any super classes
-        Class[] supers = getJavaClass().getInterfaces();
+        Class[] supers = _java_class.getInterfaces();
         super_descriptors = new ArrayList();
 
         Map all_methods = new HashMap();
@@ -266,7 +266,7 @@
     Method[] getLocalMethods() {
         ArrayList result = new ArrayList();
 
-        addNonRemoteInterfaceMethods(getJavaClass(), result);
+        addNonRemoteInterfaceMethods(_java_class, result);
 
         Method[] out = new Method[result.size()];
         result.toArray(out);
@@ -393,7 +393,7 @@
     /** Read an instance of this value from a CDR stream */
     public Object read(org.omg.CORBA.portable.InputStream in) {
         return javax.rmi.PortableRemoteObject.narrow(in.read_Object(),
-                getJavaClass());
+                _java_class);
     }
 
     /** Write an instance of this value to a CDR stream */
@@ -404,7 +404,7 @@
     org.omg.CORBA.TypeCode getTypeCode() {
         if (_type_code == null) {
             org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
-            return orb.create_interface_tc(getRepositoryID(), getJavaClass()
+            return orb.create_interface_tc(getRepositoryID(), _java_class
                     .getName());
         }
 
@@ -422,14 +422,14 @@
 
     void writeUnmarshalValue(java.io.PrintWriter pw, String inName) {
         pw.print('(');
-        pw.print(getJavaClass().getName());
+        pw.print(_java_class.getName());
         pw.print(')');
         pw.print(PortableRemoteObject.class.getName());
         pw.print(".narrow(");
         pw.print(inName);
         pw.print('.');
         pw.print("read_Object(),");
-        pw.print(getJavaClass().getName());
+        pw.print(_java_class.getName());
         pw.print(".class)");
     }
 
@@ -470,7 +470,7 @@
 
     void writeStubClass(java.io.PrintWriter pw) {
 
-        Class c = getJavaClass();
+        Class c = _java_class;
         String cname = c.getName();
         String fullname = stubClassName(c);
         //String stubname = fullname.substring(fullname.lastIndexOf('.') + 1);
@@ -515,7 +515,7 @@
     }
 
     String getStubClassName() {
-        Class c = getJavaClass();
+        Class c = _java_class;
         String cname = c.getName();
 
         String pkgname = null;
@@ -532,7 +532,7 @@
     }
 
     void addDependencies(Set classes) {
-        Class c = getJavaClass();
+        Class c = _java_class;
 
         if (c == java.rmi.Remote.class || classes.contains(c))
             return;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java
index 96e3a77..a30e822 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java
@@ -24,10 +24,6 @@
             org.omg.CORBA.TCKind tc) {
         super(type, repository);
         this.idl_name = idl_name;
-        // the simple type name is the same as the IDL name.  The 
-        // package name is null 
-        setTypeName(idl_name); 
-        setPackageName("");
 
         org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
         _type_code = orb.get_primitive_tc(tc);
@@ -38,6 +34,16 @@
         return idl_name;
     }
 
+    @Override
+    protected String genPackageName() {
+        return "";
+    }
+
+    @Override
+    protected String genTypeName() {
+        return idl_name;
+    }
+
     org.omg.CORBA.TypeCode getTypeCode() {
         return _type_code;
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java
index 8374213..9d5c38b 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java
@@ -25,9 +25,16 @@
     
     StringDescriptor(TypeRepository repository) {
         super(String.class, repository);
-        // strings have a special type and package name other than the java class name. 
-        setTypeName("WStringValue"); 
-        setPackageName("CORBA"); 
+    }
+
+    @Override
+    protected String genPackageName() {
+        return "CORBA";
+    }
+
+    @Override
+    protected String genTypeName() {
+        return "WStringValue";
     }
 
     /** Read an instance of this value from a CDR stream */
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
index 0641778..33730f3 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
@@ -30,37 +30,29 @@
 abstract class TypeDescriptor extends ModelElement {
     static Logger logger = Logger.getLogger(TypeDescriptor.class.getName());
 
-    private final Class _java_class;
+    final Class _java_class;
 
-    protected String _repid;
+    private volatile String _repid;
 
     protected RemoteInterfaceDescriptor remoteDescriptor;
 
     private FullKey _key;
 
-    private String package_name = "";    // the package name qualifier (if any)
-    protected void setPackageName(String name) {
-        package_name = name;
-    }
+    private String package_name;    // the package name qualifier (if any)
     public String getPackageName() {
+        checkInit();
         return package_name;
     }
 
-    private String type_name = "";       // the simple type name (minus package, if any)
-    protected void setTypeName(String name) {
-        type_name = name;
-    }
+    private String type_name;       // the simple type name (minus package, if any)
     public String getTypeName() {
+        checkInit();
         return type_name;
     }
 
-    public Class getJavaClass() {
-        return _java_class;
-    }
-
     public final FullKey getKey() {
         if (null == _key) {
-            _key = new FullKey(getRepositoryID(), getJavaClass());
+            _key = new FullKey(getRepositoryID(), _java_class);
         }
         return _key;
     }
@@ -117,26 +109,30 @@
     @Override
     public String toString() {
         return String.format("%s{class=\"%s\",repId=\"%s\"}",
-                this.getClass().getName(), getJavaClass(),
+                this.getClass().getName(), _java_class,
                 getRepositoryID());
     }
 
     protected TypeDescriptor(Class type, TypeRepository repository) {
         super(repository, type.getName());
         _java_class = type;
-        String typeName = type.getName();
-        // break up the simple type and package
-        int idx = typeName.lastIndexOf('.');
-        // if we have a package, split it into the component parts
-        if (idx >= 0) {
-            setPackageName(typeName.substring(0, idx));
-            setTypeName(typeName.substring(idx + 1));
-        }
-        else {
-            // no package...the type is the simple name
-            setPackageName(""); 
-            setTypeName(typeName); 
-        }
+    }
+
+    @Override
+    protected void init() {
+        package_name = genPackageName();
+        type_name = genTypeName();
+        super.init();
+    }
+
+    protected String genPackageName() {
+        int idx = java_name.lastIndexOf('.');
+        return ((idx < 0) ? "" : java_name.substring(0, idx));
+    }
+
+    protected String genTypeName() {
+        int idx = java_name.lastIndexOf('.');
+        return ((idx < 0) ? java_name : java_name.substring(idx + 1));
     }
 
     @Override
@@ -144,10 +140,12 @@
         return java_name.replace('.', '_');
     }
 
-    public String getRepositoryID() {
-        if (_repid == null)
-            _repid = "RMI:" + getJavaClass().getName() + ":0000000000000000";
+    protected String genRepId() {
+        return String.format("RMI:%s:%016X", _java_class.getName(), 0);
+    }
 
+    public final String getRepositoryID() {
+        if (_repid == null) _repid = genRepId();
         return _repid;
     }
 
@@ -290,7 +288,7 @@
             pw.print("^" + old);
         } else {
             Integer key = new Integer(System.identityHashCode(val));
-            pw.println(getJavaClass().getName() + "@"
+            pw.println(_java_class.getName() + "@"
                     + Integer.toHexString(key.intValue()));
         }
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
index 2131bb7..6343381 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
@@ -715,7 +715,7 @@
     static Object copyRMIStub(RMIStub stub) throws RemoteException {
         ClassLoader loader = getContextClassLoader();
 
-        if (getClassLoader(stub._descriptor.getJavaClass()) == loader) {
+        if (getClassLoader(stub._descriptor._java_class) == loader) {
             return stub;
         }
 
@@ -724,7 +724,7 @@
         Class<?> targetClass;
 
         try {
-            targetClass = Util.loadClass(desc.getJavaClass().getName(), stub
+            targetClass = Util.loadClass(desc._java_class.getName(), stub
                     ._get_codebase(), loader);
         } catch (ClassNotFoundException ex) {
             logger.log(Level.FINER, "copyRMIStub exception (current loader is: " + loader
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 a5dde95..a686f77 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
@@ -112,35 +112,18 @@
 
     protected boolean isEnum() { return false; }
 
-    public String getRepositoryID() {
-        if (_repid == null) {
-            StringBuilder buf = new StringBuilder("RMI:");
-            buf.append(StringUtil.convertToValidIDLNames(getJavaClass().getName()));
-            buf.append(":");
-
-            String hashCode = Long.toHexString(_hash_code).toUpperCase();
-            for (int i = 0; (i + hashCode.length()) != 16; i++)
-                buf.append('0');
-            buf.append(hashCode);
-
-            long serialVersionUID = getSerialVersionUID();
-
-            buf.append(":");
-            String serialID = Long.toHexString(serialVersionUID).toUpperCase();
-            for (int i = 0; (i + serialID.length()) != 16; i++)
-                buf.append('0');
-            buf.append(serialID);
-
-            _repid = buf.toString();
-        }
-
-        return _repid;
+    @Override
+    protected String genRepId() {
+        return String.format("RMI:%s:%016X:%016X", StringUtil.convertToValidIDLNames(_java_class.getName()),
+                _hash_code, getSerialVersionUID());
     }
 
-    public String getCustomRepositoryID() {
-        if (_custom_repid == null) {
-            _custom_repid = "RMI:org.omg.custom." + getRepositoryID().substring(4);
-        }
+    private String genCustomRepId() {
+        return String.format("RMI:org.omg.custom.%s", getRepositoryID().substring(4));
+    }
+
+    public final String getCustomRepositoryID() {
+        if (_custom_repid == null) _custom_repid = genCustomRepId();
         return _custom_repid;
     }
 
@@ -153,7 +136,7 @@
                 // skip //
             }
         }
-        ObjectStreamClass serialForm = ObjectStreamClass.lookup(getJavaClass());
+        ObjectStreamClass serialForm = ObjectStreamClass.lookup(_java_class);
 
         return (serialForm != null) ? serialForm.getSerialVersionUID() : 0L;
     }
@@ -161,6 +144,7 @@
     public void init() {
         try {
             init0();
+            super.init();
 
             if (_fields == null) {
                 throw new RuntimeException("fields==null after init!");
@@ -172,7 +156,7 @@
     }
 
     private void init0() {
-        final Class<?> type = getJavaClass();
+        final Class<?> type = _java_class;
         final Class<?> superClass = type.getSuperclass();
 
         _is_rmi_stub = RMIStub.class.isAssignableFrom(type);
@@ -238,7 +222,7 @@
                 // validate readObject
                 //
                 if ((_write_object_method == null) || !Modifier.isPrivate(_write_object_method.getModifiers())
-                        || Modifier.isStatic(_write_object_method.getModifiers()) || (_write_object_method.getDeclaringClass() != getJavaClass())) {
+                        || Modifier.isStatic(_write_object_method.getModifiers()) || (_write_object_method.getDeclaringClass() != _java_class)) {
 
                     _write_object_method = null;
 
@@ -508,7 +492,7 @@
     }
 
     protected void defaultWriteValue(ObjectWriter writer, Serializable val) throws IOException {
-        logger.finer("writing fields for " + getJavaClass());
+        logger.finer("writing fields for " + _java_class);
         FieldDescriptor[] fields = _fields;
 
         if (fields == null) {
@@ -565,7 +549,7 @@
                 throw (UnknownException) new UnknownException(ex.getTargetException()).initCause(ex.getTargetException());
 
             } catch (NullPointerException ex) {
-                logger.log(Level.WARNING, "unable to create instance of " + getJavaClass().getName(), ex);
+                logger.log(Level.WARNING, "unable to create instance of " + _java_class.getName(), ex);
                 logger.warning("constructor => " + _constructor);
 
                 throw ex;
@@ -618,7 +602,7 @@
             int key = System.identityHashCode(val);
             recurse.put(val, key);
 
-            pw.println(getJavaClass().getName() + "@" + Integer.toHexString(key) + "[");
+            pw.println(_java_class.getName() + "@" + Integer.toHexString(key) + "[");
 
             printFields(pw, recurse, val);
 
@@ -654,7 +638,7 @@
             return;
         }
 
-        logger.fine("reading fields for " + getJavaClass().getName());
+        logger.fine("reading fields for " + _java_class.getName());
 
         for (FieldDescriptor _field : _fields) {
 
@@ -677,7 +661,7 @@
             return Collections.EMPTY_MAP;
         }
 
-        logger.finer("reading fields for " + getJavaClass().getName());
+        logger.finer("reading fields for " + _java_class.getName());
 
         Map map = new HashMap();
 
@@ -696,7 +680,7 @@
             return;
         }
 
-        logger.finer("writing fields for " + getJavaClass().getName());
+        logger.finer("writing fields for " + _java_class.getName());
 
         for (FieldDescriptor _field : _fields) {
 
@@ -764,7 +748,7 @@
     }
 
     protected long computeHashCode() {
-        Class type = getJavaClass();
+        Class type = _java_class;
 
         if (_is_externalizable) {
             return 1L;
@@ -862,7 +846,7 @@
 
         TypeCode _base = ((_super_descriptor == null) ? null : _super_descriptor.getTypeCode());
 
-        Class javaClass = getJavaClass();
+        Class javaClass = _java_class;
         if (javaClass.isArray()) {
             TypeDescriptor desc = repo.getDescriptor(javaClass.getComponentType());
             _type_code = desc.getTypeCode();
@@ -882,7 +866,7 @@
     
     FullValueDescription getFullValueDescription() {
         FullValueDescription fvd = new FullValueDescription();
-        fvd.name = getJavaClass().getName();
+        fvd.name = _java_class.getName();
         fvd.id = getRepositoryID();
         fvd.is_abstract = false;
         fvd.is_custom = isCustomMarshalled();
@@ -918,7 +902,7 @@
         }
 
         ObjectDeserializer(FullValueDescription desc, RunTime runtime) throws IOException {
-            Class myClass = ValueDescriptor.this.getJavaClass();
+            Class myClass = _java_class;
             ValueMember[] members = desc.members;
             fields = new FieldDescriptor[members.length];
             for (int i = 0; i < members.length; i++) {
@@ -978,7 +962,7 @@
         } else {
             wdesc = (ValueDescriptor) repo.getDescriptor(oorig.getClass());
 
-            logger.finer("writeReplace -> " + getJavaClass().getName());
+            logger.finer("writeReplace -> " + _java_class.getName());
         }
 
         return wdesc.copyObject2(oorig, state);
@@ -1007,7 +991,7 @@
             writeValue(writer, oorig);
             return writer;
         } catch (IOException ex) {
-            String msg = String.format("%s writing %s", ex, getJavaClass().getName());
+            String msg = String.format("%s writing %s", ex, _java_class.getName());
             throw (MARSHAL) new MARSHAL(msg).initCause(ex);
         }
     }
@@ -1018,7 +1002,7 @@
             readValue(reader, copy);
             return readResolve(copy);
         } catch (IOException ex) {
-            String msg = String.format("%s reading instance of %s", ex, getJavaClass().getName());
+            String msg = String.format("%s reading instance of %s", ex, _java_class.getName());
             throw (MARSHAL) new MARSHAL(msg).initCause(ex);
         }
     }
@@ -1037,7 +1021,7 @@
 
         pw.print(paramName);
         pw.print(',');
-        MethodDescriptor.writeJavaType(pw, getJavaClass());
+        MethodDescriptor.writeJavaType(pw, _java_class);
         pw.print(".class)");
     }
 
@@ -1046,12 +1030,12 @@
         pw.print('.');
         pw.print("read_value");
         pw.print('(');
-        MethodDescriptor.writeJavaType(pw, getJavaClass());
+        MethodDescriptor.writeJavaType(pw, _java_class);
         pw.print(".class)");
     }
 
     void addDependencies(Set<Class<?>> classes) {
-        Class c = getJavaClass();
+        Class c = _java_class;
 
         if ((c == Object.class) || classes.contains(c))
             return;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
index 7d898c6..7004c25 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
@@ -26,7 +26,6 @@
 
 import org.omg.CORBA.CompletionStatus;
 import org.omg.CORBA.MARSHAL;
-import org.omg.CORBA.OBJECT_NOT_EXIST;
 import org.omg.CORBA.ValueDefPackage.FullValueDescription;
 import org.omg.SendingContext.RunTime;
 
@@ -173,7 +172,7 @@
         if (val instanceof RMIStub) {
 
             RMIStub stub = (RMIStub) val;
-            Class type = stub._descriptor.getJavaClass();
+            Class type = stub._descriptor._java_class;
 
             RMIState state = RMIState.current();
             Stub result = state.getStaticStub(stub._get_codebase(), type);