Introduce ModelElement.init() - use it for gathering idl_name
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/BooleanDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/BooleanDescriptor.java
index 2de50d2..24e22e6 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/BooleanDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/BooleanDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class BooleanDescriptor extends SimpleDescriptor {
+final class BooleanDescriptor extends SimpleDescriptor {
     BooleanDescriptor(TypeRepository repository) {
         super(Boolean.TYPE, repository, "boolean",
                 org.omg.CORBA.TCKind.tk_boolean);
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ByteDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ByteDescriptor.java
index b47b7d4..2c044cf 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ByteDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ByteDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class ByteDescriptor extends SimpleDescriptor {
+final class ByteDescriptor extends SimpleDescriptor {
     ByteDescriptor(TypeRepository repository) {
         super(Byte.TYPE, repository, "octet", org.omg.CORBA.TCKind.tk_octet);
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CharDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CharDescriptor.java
index 8334380..b8077b7 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CharDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CharDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class CharDescriptor extends SimpleDescriptor {
+final class CharDescriptor extends SimpleDescriptor {
     CharDescriptor(TypeRepository repository) {
         super(Character.TYPE, repository, "wchar",
                 org.omg.CORBA.TCKind.tk_wchar);
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DoubleDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DoubleDescriptor.java
index 2fd7ca6..8299776 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DoubleDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DoubleDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class DoubleDescriptor extends SimpleDescriptor {
+final class DoubleDescriptor extends SimpleDescriptor {
     DoubleDescriptor(TypeRepository repository) {
         super(Double.TYPE, repository, "double", org.omg.CORBA.TCKind.tk_double);
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FieldDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FieldDescriptor.java
index 00c2b1d..c4b1e89 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FieldDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FieldDescriptor.java
@@ -47,7 +47,7 @@
             java.lang.reflect.Field f, TypeRepository repo) {
         super(repo, name);
         this.type = type;
-        setIDLName(name);
+        init();
         declaringClass = owner;
 
         if (f != null) {
@@ -61,6 +61,11 @@
         }
     }
 
+    @Override
+    protected final String genIDLName() {
+        return java_name;
+    }
+
     ValueMember getValueMember(TypeRepository rep) {
         if (valuemember == null) {
             TypeDescriptor desc = rep.getDescriptor(type);
@@ -134,6 +139,13 @@
     }
 
     static FieldDescriptor get(Class owner, Class type, String name,
+                               java.lang.reflect.Field f, TypeRepository repository) {
+        FieldDescriptor desc = get0(owner, type, name, f, repository);
+        desc.init();
+        return desc;
+    }
+
+    private static FieldDescriptor get0(Class owner, Class type, String name,
             java.lang.reflect.Field f, TypeRepository repository) {
 
         if (type.isPrimitive()) {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FloatDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FloatDescriptor.java
index 271d272..a28eea0 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FloatDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FloatDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class FloatDescriptor extends SimpleDescriptor {
+final class FloatDescriptor extends SimpleDescriptor {
     FloatDescriptor(TypeRepository repository) {
         super(Float.TYPE, repository, "float", org.omg.CORBA.TCKind.tk_float);
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IntegerDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IntegerDescriptor.java
index ce67d33..1649929 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IntegerDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IntegerDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class IntegerDescriptor extends SimpleDescriptor {
+final class IntegerDescriptor extends SimpleDescriptor {
     IntegerDescriptor(TypeRepository repository) {
         super(Integer.TYPE, repository, "long", org.omg.CORBA.TCKind.tk_long);
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/LongDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/LongDescriptor.java
index 39e3b71..7b6e417 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/LongDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/LongDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class LongDescriptor extends SimpleDescriptor {
+final class LongDescriptor extends SimpleDescriptor {
     LongDescriptor(TypeRepository repository) {
         super(Long.TYPE, repository, "long_long",
                 org.omg.CORBA.TCKind.tk_longlong);
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 749bfe9..1dfa274 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
@@ -347,10 +347,11 @@
         }
 
         parameter_count = param_types.length;
-        generateIDLName();
+        super.init();
     }
 
-    void generateIDLName() {
+    @Override
+    protected String genIDLName() {
         String idl_name = null;
 
         if (isSetterMethod()) {
@@ -368,8 +369,7 @@
         if (isOverloaded) {
             idl_name = transformOverloading(idl_name);
         }
-
-        setIDLName(idl_name);
+        return idl_name;
     }
 
     private String attributeName() {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
index 24a3c59..4fa6b85 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
@@ -20,19 +20,27 @@
 
 abstract class ModelElement {
     protected final TypeRepository repo;
-    protected final String java_name;       // the java name of the type
-    private String idl_name;        // fully resolved package name
+    protected final String java_name;    // the java name of the type
+    private String idl_name;             // fully resolved package name
+    private volatile boolean notInit = true;
 
     protected ModelElement(TypeRepository repo, String java_name) {
         this.repo = repo;
         this.java_name = java_name;
     }
 
-    protected void setIDLName(String name) {
-        idl_name = name;
+    protected void init() {
+        idl_name = genIDLName();
+        notInit = false;
     }
-    
+
+    protected abstract String genIDLName();
+
+    final void checkInit() {
+        if (notInit) throw new IllegalStateException("Not initialized");
+    }
     public String getIDLName() {
+        checkInit();
         return idl_name;
     }
 }
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 1116043..ca40f49 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
@@ -27,8 +27,4 @@
     RemoteClassDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
     }
-
-    public void init() {
-        super.init();
-    }
 }
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 8aafb16..4154c49 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
@@ -140,9 +140,6 @@
         super(type, repository);
     }
 
-    public void init() {
-    }
-
     public MethodDescriptor[] getMethods() {
         if (operations == null) {
             init_methods();
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java
index c053fd5..72f8e91 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java
@@ -22,9 +22,4 @@
     RemoteInterfaceDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
     }
-
-    public void init() {
-        super.init();
-    }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ShortDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ShortDescriptor.java
index 6a3ce74..eb95f93 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ShortDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ShortDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class ShortDescriptor extends SimpleDescriptor {
+final class ShortDescriptor extends SimpleDescriptor {
     ShortDescriptor(TypeRepository repository) {
         super(Short.TYPE, repository, "short", org.omg.CORBA.TCKind.tk_short);
     }
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 eddf015..96e3a77 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
@@ -19,10 +19,11 @@
 package org.apache.yoko.rmi.impl;
 
 abstract class SimpleDescriptor extends TypeDescriptor {
+    private final String idl_name;
     SimpleDescriptor(Class type, TypeRepository repository, String idl_name,
             org.omg.CORBA.TCKind tc) {
         super(type, repository);
-        setIDLName(idl_name);
+        this.idl_name = idl_name;
         // the simple type name is the same as the IDL name.  The 
         // package name is null 
         setTypeName(idl_name); 
@@ -32,6 +33,11 @@
         _type_code = orb.get_primitive_tc(tc);
     }
 
+    @Override
+    protected String genIDLName() {
+        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 26a2dce..8374213 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
@@ -30,10 +30,6 @@
         setPackageName("CORBA"); 
     }
 
-    public void init() {
-        super.init();
-    }
-
     /** Read an instance of this value from a CDR stream */
     public Object read(org.omg.CORBA.portable.InputStream in) {
         return org.omg.CORBA.WStringValueHelper.read(in);
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 5c01684..0641778 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,7 +30,7 @@
 abstract class TypeDescriptor extends ModelElement {
     static Logger logger = Logger.getLogger(TypeDescriptor.class.getName());
 
-    protected final Class _java_class;
+    private final Class _java_class;
 
     protected String _repid;
 
@@ -125,7 +125,6 @@
         super(repository, type.getName());
         _java_class = type;
         String typeName = type.getName();
-        setIDLName(typeName.replace('.', '_'));
         // break up the simple type and package
         int idx = typeName.lastIndexOf('.');
         // if we have a package, split it into the component parts
@@ -140,6 +139,11 @@
         }
     }
 
+    @Override
+    protected String genIDLName() {
+        return java_name.replace('.', '_');
+    }
+
     public String getRepositoryID() {
         if (_repid == null)
             _repid = "RMI:" + getJavaClass().getName() + ":0000000000000000";
@@ -162,9 +166,6 @@
     public abstract void write(org.omg.CORBA.portable.OutputStream out,
             Object val);
 
-    public void init() {
-    }
-
     public boolean isCustomMarshalled() {
         return false;
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/VoidDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/VoidDescriptor.java
index 0ec6385..3c9ecfe 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/VoidDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/VoidDescriptor.java
@@ -18,7 +18,7 @@
 
 package org.apache.yoko.rmi.impl;
 
-class VoidDescriptor extends SimpleDescriptor {
+final class VoidDescriptor extends SimpleDescriptor {
     VoidDescriptor(TypeRepository repository) {
         super(Void.TYPE, repository, "void", org.omg.CORBA.TCKind.tk_void);
     }