in yoko-core/src/main/java/org/apache/yoko/orb/CORBA/TypeCode.java [297:463]
private TypeCode getCompactTypeCodeRec(java.util.Vector history,
java.util.Vector compacted) {
if (recId_ != null) {
if (recType_ == null)
throw new org.omg.CORBA.BAD_TYPECODE(
org.apache.yoko.orb.OB.MinorCodes
.describeBadTypecode(org.apache.yoko.orb.OB.MinorCodes.MinorIncompleteTypeCode),
org.apache.yoko.orb.OB.MinorCodes.MinorIncompleteTypeCode,
org.omg.CORBA.CompletionStatus.COMPLETED_NO);
return recType_.getCompactTypeCodeRec(history, compacted);
}
//
// Avoid infinite loops
//
for (int i = 0; i < history.size(); i++)
if (this == history.elementAt(i))
return (TypeCode) compacted.elementAt(i);
history.addElement(this);
//
// Create the new compacted type code (needed for recursive type
// codes).
//
TypeCode result = new TypeCode();
compacted.addElement(result);
String[] names = null;
if (memberNames_ != null) {
names = new String[memberNames_.length];
for (int i = 0; i < memberNames_.length; i++)
names[i] = "";
}
TypeCode[] types = null;
if (memberTypes_ != null) {
types = new TypeCode[memberTypes_.length];
for (int i = 0; i < memberTypes_.length; i++)
types[i] = memberTypes_[i].getCompactTypeCodeRec(history,
compacted);
}
//
// Compact content type
//
TypeCode content = null;
if (contentType_ != null)
content = contentType_.getCompactTypeCodeRec(history, compacted);
//
// Compact discriminator type
//
TypeCode discriminator = null;
if (discriminatorType_ != null)
discriminator = discriminatorType_.getCompactTypeCodeRec(history,
compacted);
//
// Compact concrete base type
//
TypeCode concrete = null;
if (concreteBaseType_ != null)
concrete = concreteBaseType_.getCompactTypeCodeRec(history,
compacted);
switch (kind_.value()) {
case org.omg.CORBA.TCKind._tk_null:
case org.omg.CORBA.TCKind._tk_void:
case org.omg.CORBA.TCKind._tk_short:
case org.omg.CORBA.TCKind._tk_long:
case org.omg.CORBA.TCKind._tk_longlong:
case org.omg.CORBA.TCKind._tk_ushort:
case org.omg.CORBA.TCKind._tk_ulong:
case org.omg.CORBA.TCKind._tk_ulonglong:
case org.omg.CORBA.TCKind._tk_float:
case org.omg.CORBA.TCKind._tk_double:
case org.omg.CORBA.TCKind._tk_longdouble:
case org.omg.CORBA.TCKind._tk_boolean:
case org.omg.CORBA.TCKind._tk_char:
case org.omg.CORBA.TCKind._tk_wchar:
case org.omg.CORBA.TCKind._tk_octet:
case org.omg.CORBA.TCKind._tk_any:
case org.omg.CORBA.TCKind._tk_TypeCode:
case org.omg.CORBA.TCKind._tk_Principal:
result.kind_ = kind_;
break;
case org.omg.CORBA.TCKind._tk_fixed:
result.kind_ = kind_;
result.fixedDigits_ = fixedDigits_;
result.fixedScale_ = fixedScale_;
break;
case org.omg.CORBA.TCKind._tk_objref:
case org.omg.CORBA.TCKind._tk_abstract_interface:
case org.omg.CORBA.TCKind._tk_native:
case org.omg.CORBA_2_4.TCKind._tk_local_interface:
result.kind_ = kind_;
result.id_ = id_;
result.name_ = "";
break;
case org.omg.CORBA.TCKind._tk_struct:
case org.omg.CORBA.TCKind._tk_except:
result.kind_ = kind_;
result.id_ = id_;
result.name_ = "";
result.memberNames_ = names;
result.memberTypes_ = types;
break;
case org.omg.CORBA.TCKind._tk_union:
result.kind_ = kind_;
result.id_ = id_;
result.name_ = "";
result.memberNames_ = names;
result.memberTypes_ = types;
result.labels_ = labels_;
result.discriminatorType_ = discriminator;
break;
case org.omg.CORBA.TCKind._tk_enum:
result.kind_ = kind_;
result.id_ = id_;
result.name_ = "";
result.memberNames_ = names;
break;
case org.omg.CORBA.TCKind._tk_string:
case org.omg.CORBA.TCKind._tk_wstring:
result.kind_ = kind_;
result.length_ = length_;
break;
case org.omg.CORBA.TCKind._tk_sequence:
case org.omg.CORBA.TCKind._tk_array:
result.kind_ = kind_;
result.length_ = length_;
result.contentType_ = content;
break;
case org.omg.CORBA.TCKind._tk_alias:
case org.omg.CORBA.TCKind._tk_value_box:
result.kind_ = kind_;
result.id_ = id_;
result.name_ = "";
result.contentType_ = content;
break;
case org.omg.CORBA.TCKind._tk_value:
result.kind_ = kind_;
result.id_ = id_;
result.name_ = "";
result.memberNames_ = names;
result.memberTypes_ = types;
result.memberVisibility_ = memberVisibility_;
result.typeModifier_ = typeModifier_;
result.concreteBaseType_ = concrete;
break;
default:
org.apache.yoko.orb.OB.Assert._OB_assert("unsupported typecode");
}
return result;
}