private TypeCode getCompactTypeCodeRec()

in yoko-core/src/main/java/org/apache/yoko/orb/CORBA/TypeCode.java [297:463]


    private TypeCode getCompactTypeCodeRec(java.util.Vector history,
            java.util.Vector compacted) {
        if (recId_ != null) {
            if (recType_ == null)
                throw new org.omg.CORBA.BAD_TYPECODE(
                        org.apache.yoko.orb.OB.MinorCodes
                                .describeBadTypecode(org.apache.yoko.orb.OB.MinorCodes.MinorIncompleteTypeCode),
                        org.apache.yoko.orb.OB.MinorCodes.MinorIncompleteTypeCode,
                        org.omg.CORBA.CompletionStatus.COMPLETED_NO);
            return recType_.getCompactTypeCodeRec(history, compacted);
        }

        //
        // Avoid infinite loops
        //
        for (int i = 0; i < history.size(); i++)
            if (this == history.elementAt(i))
                return (TypeCode) compacted.elementAt(i);

        history.addElement(this);

        //
        // Create the new compacted type code (needed for recursive type
        // codes).
        //
        TypeCode result = new TypeCode();
        compacted.addElement(result);

        String[] names = null;
        if (memberNames_ != null) {
            names = new String[memberNames_.length];
            for (int i = 0; i < memberNames_.length; i++)
                names[i] = "";
        }

        TypeCode[] types = null;
        if (memberTypes_ != null) {
            types = new TypeCode[memberTypes_.length];
            for (int i = 0; i < memberTypes_.length; i++)
                types[i] = memberTypes_[i].getCompactTypeCodeRec(history,
                        compacted);
        }

        //
        // Compact content type
        //
        TypeCode content = null;
        if (contentType_ != null)
            content = contentType_.getCompactTypeCodeRec(history, compacted);

        //
        // Compact discriminator type
        //
        TypeCode discriminator = null;
        if (discriminatorType_ != null)
            discriminator = discriminatorType_.getCompactTypeCodeRec(history,
                    compacted);

        //
        // Compact concrete base type
        //
        TypeCode concrete = null;
        if (concreteBaseType_ != null)
            concrete = concreteBaseType_.getCompactTypeCodeRec(history,
                    compacted);

        switch (kind_.value()) {
        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_ = fixedDigits_;
            result.fixedScale_ = fixedScale_;
            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_ = id_;
            result.name_ = "";
            break;

        case org.omg.CORBA.TCKind._tk_struct:
        case org.omg.CORBA.TCKind._tk_except:
            result.kind_ = kind_;
            result.id_ = id_;
            result.name_ = "";
            result.memberNames_ = names;
            result.memberTypes_ = types;
            break;

        case org.omg.CORBA.TCKind._tk_union:
            result.kind_ = kind_;
            result.id_ = id_;
            result.name_ = "";
            result.memberNames_ = names;
            result.memberTypes_ = types;
            result.labels_ = labels_;
            result.discriminatorType_ = discriminator;
            break;

        case org.omg.CORBA.TCKind._tk_enum:
            result.kind_ = kind_;
            result.id_ = id_;
            result.name_ = "";
            result.memberNames_ = names;
            break;

        case org.omg.CORBA.TCKind._tk_string:
        case org.omg.CORBA.TCKind._tk_wstring:
            result.kind_ = kind_;
            result.length_ = length_;
            break;

        case org.omg.CORBA.TCKind._tk_sequence:
        case org.omg.CORBA.TCKind._tk_array:
            result.kind_ = kind_;
            result.length_ = length_;
            result.contentType_ = content;
            break;

        case org.omg.CORBA.TCKind._tk_alias:
        case org.omg.CORBA.TCKind._tk_value_box:
            result.kind_ = kind_;
            result.id_ = id_;
            result.name_ = "";
            result.contentType_ = content;
            break;

        case org.omg.CORBA.TCKind._tk_value:
            result.kind_ = kind_;
            result.id_ = id_;
            result.name_ = "";
            result.memberNames_ = names;
            result.memberTypes_ = types;
            result.memberVisibility_ = memberVisibility_;
            result.typeModifier_ = typeModifier_;
            result.concreteBaseType_ = concrete;
            break;

        default:
            org.apache.yoko.orb.OB.Assert._OB_assert("unsupported typecode");
        }

        return result;
    }