Beispiel #1
0
  /**
   * 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;
  }