Correct ValueMembers creation, caching for ValueDescriptor, ArrayDescriptor
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 2cedbfa..ca4e0b1 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
@@ -185,27 +185,20 @@
_out.write_value((Serializable)value, getRepositoryID());
}
- ValueMember[] getValueMembers() {
+ @Override
+ protected final ValueMember[] genValueMembers() {
+ final ValueMember[] members = new ValueMember[1];
+ final TypeDescriptor elemDesc = repo.getDescriptor(elementType);
+ final String elemRepID = elemDesc.getRepositoryID();
- if (_value_members == null) {
+ final ORB orb = ORB.init();
+ TypeCode memberTC = orb.create_sequence_tc(0, elemDesc.getTypeCode());
- _value_members = new ValueMember[1];
-
- TypeDescriptor elemDesc = repo.getDescriptor(elementType);
-
- String elemRepID = elemDesc.getRepositoryID();
-
- ORB orb = ORB.init();
- TypeCode memberTC = orb.create_sequence_tc(0, elemDesc
- .getTypeCode());
-
- _value_members[0] = new ValueMember("", // member has no name!
+ members[0] = new ValueMember("", // member has no name!
elemRepID, this.getRepositoryID(), "1.0", memberTC, null,
(short) 1);
- // public
- }
- return _value_members;
+ return members;
}
@Override
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 e6b1849..eb91e9f 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
@@ -821,19 +821,20 @@
return _hash_code;
}
- protected ValueMember[] _value_members = null;
-
- private ValueMember[] getValueMembers() {
- getTypeCode(); // ensure recursion through typecode for non-array types
-
- if (_value_members == null) {
- _value_members = new ValueMember[_fields.length];
- for (int i = 0; i < _fields.length; i++) {
- _value_members[i] = _fields[i].getValueMember(repo);
- }
+ private volatile ValueMember[] valueMembers = null;
+ protected ValueMember[] genValueMembers() {
+ final ValueMember[] members = new ValueMember[_fields.length];
+ for (int i = 0; i < _fields.length; i++) {
+ members[i] = _fields[i].getValueMember(repo);
}
- return _value_members;
+ return members;
+ }
+ final ValueMember[] getValueMembers() {
+ getTypeCode(); // ensure recursion through typecode for non-array types
+
+ if (null == valueMembers) valueMembers = genValueMembers();
+ return valueMembers;
}
@Override