static private TypeCode _OB_convertForeignTypeCodeHelper()

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;
    }