}
return tc;
}
public static TypeCode getUnionTypeCode(ORB orb, Object obj, List<CorbaTypeMap> typeMaps) {
Union unionType = (Union)obj;
TypeCode discTC = getTypeCode(orb, unionType.getDiscriminator(), typeMaps);
Map<String, UnionMember> members = new LinkedHashMap<String, UnionMember>();
List<Unionbranch> branches = unionType.getUnionbranch();
for (Iterator<Unionbranch> branchIter = branches.iterator(); branchIter.hasNext();) {
Unionbranch branch = branchIter.next();
List<CaseType> cases = branch.getCase();
for (Iterator<CaseType> caseIter = cases.iterator(); caseIter.hasNext();) {
CaseType cs = caseIter.next();
UnionMember member = new UnionMember();
member.name = branch.getName();
member.type = getTypeCode(orb, branch.getIdltype(), typeMaps);
member.label = orb.create_any();
// We need to insert the labels in a way that depends on the type of the discriminator.
// According to the CORBA specification, the following types are permissable as
// discriminator types:
// * signed & unsigned short
// * signed & unsigned long
// * signed & unsigned long long
// * char
// * boolean
switch (discTC.kind().value()) {
case TCKind._tk_short:
member.label.insert_short(Short.parseShort(cs.getLabel()));
break;
case TCKind._tk_ushort:
member.label.insert_ushort(Short.parseShort(cs.getLabel()));
break;
case TCKind._tk_long:
member.label.insert_long(Integer.parseInt(cs.getLabel()));
break;
case TCKind._tk_ulong:
member.label.insert_ulong(Integer.parseInt(cs.getLabel()));
break;
case TCKind._tk_longlong:
member.label.insert_longlong(Long.parseLong(cs.getLabel()));
break;
case TCKind._tk_ulonglong:
member.label.insert_ulonglong(Long.parseLong(cs.getLabel()));
break;
case TCKind._tk_char:
member.label.insert_char(cs.getLabel().charAt(0));
break;
case TCKind._tk_boolean:
member.label.insert_boolean(Boolean.parseBoolean(cs.getLabel()));
break;
default:
// TODO: Throw exception since this is an unsupported discriminator type
}
// Yoko orb is strict on how the case labels are stored for each member. So we can't
// simply insert the labels as strings
members.put(cs.getLabel(), member);
}
}
return orb.create_union_tc(unionType.getRepositoryID(),
unionType.getName(),
discTC,
(UnionMember[])members.values().toArray(new UnionMember[members.size()]));
}