in yoko-core/src/main/java/org/apache/yoko/orb/CORBA/TypeCode.java [1006:1192]
static private TypeCode _OB_convertForeignTypeCodeHelper(
org.omg.CORBA.TypeCode tc, java.util.Hashtable history,
java.util.Vector recHistory) {
if (tc instanceof TypeCode)
return (TypeCode) tc;
TypeCode result = null;
try {
org.omg.CORBA.TCKind kind = tc.kind();
int kindValue = kind.value();
//
// Check for recursion
//
if (kindValue == org.omg.CORBA.TCKind._tk_struct
|| kindValue == org.omg.CORBA.TCKind._tk_except
|| kindValue == org.omg.CORBA.TCKind._tk_union
|| kindValue == org.omg.CORBA.TCKind._tk_value) {
for (int i = 0; i < recHistory.size(); i++)
if (tc == recHistory.elementAt(i)) {
result = new TypeCode();
result.recId_ = tc.id();
result.recType_ = (TypeCode) history.get(tc);
org.apache.yoko.orb.OB.Assert
._OB_assert(result.recType_ != null);
return result;
}
}
//
// Avoid creating the TypeCode again
//
result = (TypeCode) history.get(tc);
if (result != null)
return result;
result = new TypeCode();
history.put(tc, result);
switch (kindValue) {
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_ = tc.fixed_digits();
result.fixedScale_ = tc.fixed_scale();
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_ = tc.id();
result.name_ = tc.name();
break;
case org.omg.CORBA.TCKind._tk_struct:
case org.omg.CORBA.TCKind._tk_except: {
result.kind_ = kind;
result.id_ = tc.id();
result.name_ = tc.name();
int count = tc.member_count();
result.memberNames_ = new String[count];
for (int i = 0; i < count; i++)
result.memberNames_[i] = tc.member_name(i);
recHistory.addElement(tc);
result.memberTypes_ = new TypeCode[count];
for (int i = 0; i < count; i++)
result.memberTypes_[i] = _OB_convertForeignTypeCodeHelper(
tc.member_type(i), history, recHistory);
recHistory.setSize(recHistory.size() - 1);
break;
}
case org.omg.CORBA.TCKind._tk_union: {
result.kind_ = kind;
result.id_ = tc.id();
result.name_ = tc.name();
int count = tc.member_count();
result.memberNames_ = new String[count];
for (int i = 0; i < count; i++)
result.memberNames_[i] = tc.member_name(i);
recHistory.addElement(tc);
result.memberTypes_ = new TypeCode[count];
for (int i = 0; i < count; i++)
result.memberTypes_[i] = _OB_convertForeignTypeCodeHelper(
tc.member_type(i), history, recHistory);
recHistory.setSize(recHistory.size() - 1);
result.labels_ = new Any[count];
for (int i = 0; i < count; i++)
result.labels_[i] = new Any(tc.member_label(i));
//
// Discriminator can't be recursive, so no history needed
//
result.discriminatorType_ = _OB_convertForeignTypeCodeHelper(tc
.discriminator_type(), history, null);
break;
}
case org.omg.CORBA.TCKind._tk_enum: {
result.kind_ = kind;
result.id_ = tc.id();
result.name_ = tc.name();
int count = tc.member_count();
result.memberNames_ = new String[count];
for (int i = 0; i < count; i++)
result.memberNames_[i] = tc.member_name(i);
break;
}
case org.omg.CORBA.TCKind._tk_string:
case org.omg.CORBA.TCKind._tk_wstring:
result.kind_ = kind;
result.length_ = tc.length();
break;
case org.omg.CORBA.TCKind._tk_sequence:
case org.omg.CORBA.TCKind._tk_array:
result.kind_ = kind;
result.length_ = tc.length();
result.contentType_ = _OB_convertForeignTypeCodeHelper(tc
.content_type(), history, recHistory);
break;
case org.omg.CORBA.TCKind._tk_alias:
case org.omg.CORBA.TCKind._tk_value_box:
result.kind_ = kind;
result.id_ = tc.id();
result.name_ = tc.name();
result.contentType_ = _OB_convertForeignTypeCodeHelper(tc
.content_type(), history, recHistory);
break;
case org.omg.CORBA.TCKind._tk_value:
result.kind_ = kind;
result.id_ = tc.id();
result.name_ = tc.name();
int count = tc.member_count();
result.memberNames_ = new String[count];
for (int i = 0; i < count; i++)
result.memberNames_[i] = tc.member_name(i);
recHistory.addElement(tc);
result.memberTypes_ = new TypeCode[count];
for (int i = 0; i < count; i++)
result.memberTypes_[i] = _OB_convertForeignTypeCodeHelper(
tc.member_type(i), history, recHistory);
recHistory.setSize(recHistory.size() - 1);
result.memberVisibility_ = new short[count];
for (int i = 0; i < count; i++)
result.memberVisibility_[i] = tc.member_visibility(i);
result.typeModifier_ = tc.type_modifier();
result.concreteBaseType_ = _OB_convertForeignTypeCodeHelper(tc
.concrete_base_type(), history, recHistory);
break;
default:
org.apache.yoko.orb.OB.Assert._OB_assert("Unsupported typecode");
}
} catch (org.omg.CORBA.TypeCodePackage.BadKind ex) {
org.apache.yoko.orb.OB.Assert._OB_assert(ex);
} catch (org.omg.CORBA.TypeCodePackage.Bounds ex) {
org.apache.yoko.orb.OB.Assert._OB_assert(ex);
}
return result;
}