/** * Allows the possibility of not checking the name when creating this typecode. This is to cater * for compact typecodes where the name may not be set. Checking of the name will always be true * for user driven requests * * @param id the id * @param name the name * @param discriminator_type the discriminator_type * @param members the members * @param checkName the check name * @return the type code */ public TypeCode create_union_tc( String id, String name, TypeCode discriminator_type, org.omg.CORBA.UnionMember[] members, boolean checkName) { checkTCRepositoryId(id); checkTCName(name, true); // check discriminator type TypeCode disc_tc = org.jacorb.orb.TypeCode.originalType(discriminator_type); if (disc_tc == null || !(disc_tc.kind().value() == TCKind._tk_short || disc_tc.kind().value() == TCKind._tk_long || disc_tc.kind().value() == TCKind._tk_longlong || disc_tc.kind().value() == TCKind._tk_ushort || disc_tc.kind().value() == TCKind._tk_ulong || disc_tc.kind().value() == TCKind._tk_ulonglong || disc_tc.kind().value() == TCKind._tk_char || disc_tc.kind().value() == TCKind._tk_boolean || disc_tc.kind().value() == TCKind._tk_enum)) { throw new BAD_PARAM("Illegal union discriminator type", 20, CompletionStatus.COMPLETED_NO); } // check that member names are legal (they do not need to be unique) for (int i = 0; i < members.length; i++) { checkTCMemberType(members[i].type); if (checkName) { try { checkTCName(members[i].name); } catch (BAD_PARAM e) { logger.debug("Typecode name check failed", e); throw new BAD_PARAM( "Illegal union member name: " + members[i].name, 17, CompletionStatus.COMPLETED_NO); } } // check that member type matches discriminator type or is default org.omg.CORBA.Any label = members[i].label; if (!discriminator_type.equivalent(label.type()) && !(label.type().kind().value() == TCKind._tk_octet && label.extract_octet() == (byte) 0)) { throw new BAD_PARAM( "Label type does not match discriminator type", 19, CompletionStatus.COMPLETED_NO); } // check that member labels are unique for (int j = 0; j < i; j++) { if (label.equal(members[j].label)) { throw new BAD_PARAM("Duplicate union case label", 18, CompletionStatus.COMPLETED_NO); } } } org.jacorb.orb.TypeCode typeCode = new org.jacorb.orb.TypeCode(id, name, discriminator_type, members); // resolve any recursive references to this TypeCode in its members return typeCode; }