private void readValue()

in yoko-core/src/main/java/org/apache/yoko/orb/CORBA/Any.java [98:292]


    private void readValue(org.omg.CORBA.portable.InputStream in) {
        int kind = origType_.kind().value();

        logger.fine("Reading ANY value of kind " + kind); 
        //
        // Spec says that calling read_value when a Streamable has
        // previously been inserted will update the Streamable
        //
        if (value_ instanceof org.omg.CORBA.portable.Streamable
                && kind != org.omg.CORBA.TCKind._tk_value
                && kind != org.omg.CORBA.TCKind._tk_value_box
                && kind != org.omg.CORBA.TCKind._tk_abstract_interface) {
            ((org.omg.CORBA.portable.Streamable) value_)._read(in);
            return;
        }

        switch (kind) {
        case org.omg.CORBA.TCKind._tk_null:
        case org.omg.CORBA.TCKind._tk_void:
            value_ = null;
            break;

        case org.omg.CORBA.TCKind._tk_short:
            value_ = new Integer(in.read_short());
            break;

        case org.omg.CORBA.TCKind._tk_long:
            value_ = new Integer(in.read_long());
            break;

        case org.omg.CORBA.TCKind._tk_longlong:
            value_ = new Long(in.read_longlong());
            break;

        case org.omg.CORBA.TCKind._tk_ushort:
            value_ = new Integer(in.read_ushort());
            break;

        case org.omg.CORBA.TCKind._tk_ulong:
            value_ = new Integer(in.read_ulong());
            break;

        case org.omg.CORBA.TCKind._tk_ulonglong:
            value_ = new Long(in.read_ulonglong());
            break;

        case org.omg.CORBA.TCKind._tk_float:
            value_ = new Float(in.read_float());
            break;

        case org.omg.CORBA.TCKind._tk_double:
            value_ = new Double(in.read_double());
            break;

        case org.omg.CORBA.TCKind._tk_boolean:
            value_ = Boolean.valueOf(in.read_boolean());
            break;

        case org.omg.CORBA.TCKind._tk_char:
            value_ = new Character(in.read_char());
            break;

        case org.omg.CORBA.TCKind._tk_wchar:
            value_ = new Character(in.read_wchar());
            break;

        case org.omg.CORBA.TCKind._tk_octet:
            value_ = new Byte(in.read_octet());
            break;

        case org.omg.CORBA.TCKind._tk_any:
            value_ = in.read_any();
            break;

        case org.omg.CORBA.TCKind._tk_TypeCode:
            value_ = in.read_TypeCode();
            break;

        case org.omg.CORBA.TCKind._tk_Principal:
            value_ = in.read_Principal();
            break;

        case org.omg.CORBA.TCKind._tk_objref:
            value_ = in.read_Object();
            break;

        case org.omg.CORBA.TCKind._tk_struct:
        case org.omg.CORBA.TCKind._tk_except:
        case org.omg.CORBA.TCKind._tk_union:
        case org.omg.CORBA.TCKind._tk_sequence:
        case org.omg.CORBA.TCKind._tk_array: {
            org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer();
            OutputStream out = new OutputStream(buf);
            out._OB_ORBInstance(orbInstance_);
            out.write_InputStream(in, origType_);
            InputStream is = (InputStream) out.create_input_stream();
            // This is not necessary
            // in._OB_ORBInstance(orbInstance_);
            value_ = is;
            break;
        }

        case org.omg.CORBA.TCKind._tk_value:
        case org.omg.CORBA.TCKind._tk_value_box:
        case org.omg.CORBA.TCKind._tk_abstract_interface: {
            try {
                InputStream is = (InputStream) in;
// this is a useful tracepoint, but produces a lot of data, so turn on only 
// if really needed. 
//              if (logger.isLoggable(Level.FINEST)) {
//                  logger.finest("Reading value from \n\n" + is.dumpData()); 
//              }
                is.read_value(this, type_);
            } catch (ClassCastException ex) {
                try {
                    org.omg.CORBA_2_3.portable.InputStream is = (org.omg.CORBA_2_3.portable.InputStream) in;
                    value_ = is.read_value(type_.id());
                } catch (org.omg.CORBA.TypeCodePackage.BadKind e) {
                    org.apache.yoko.orb.OB.Assert._OB_assert(e);
                }
            }
            break;
        }

        case org.omg.CORBA.TCKind._tk_enum:
            value_ = new Integer(in.read_ulong());
            break;

        case org.omg.CORBA.TCKind._tk_string: {
            try {
                String str = in.read_string();
                int len = origType_.length();
                if (len != 0 && str.length() > len)
                    throw new org.omg.CORBA.MARSHAL("string length ("
                            + str.length() + ") exceeds " + "bound (" + len
                            + ")",  
                            org.apache.yoko.orb.OB.MinorCodes.MinorReadStringOverflow, 
                            CompletionStatus.COMPLETED_NO);
                value_ = str;
            } catch (org.omg.CORBA.TypeCodePackage.BadKind ex) {
                org.apache.yoko.orb.OB.Assert._OB_assert(ex);
            }
            break;
        }

        case org.omg.CORBA.TCKind._tk_wstring: {
            try {
                String str = in.read_wstring();
                int len = origType_.length();
                if (len != 0 && str.length() > len)
                    throw new org.omg.CORBA.MARSHAL("wstring length ("
                            + str.length() + ") exceeds " + "bound (" + len
                            + ")", 
                            org.apache.yoko.orb.OB.MinorCodes.MinorReadWStringOverflow, 
                            CompletionStatus.COMPLETED_NO);
                value_ = str;
            } catch (org.omg.CORBA.TypeCodePackage.BadKind ex) {
                org.apache.yoko.orb.OB.Assert._OB_assert(ex);
            }
            break;
        }

        case org.omg.CORBA.TCKind._tk_fixed: {
            try {
                value_ = in.read_fixed().movePointLeft(origType_.fixed_scale());
            } catch (org.omg.CORBA.TypeCodePackage.BadKind ex) {
                org.apache.yoko.orb.OB.Assert._OB_assert(ex);
            }

            break;
        }

        case org.omg.CORBA.TCKind._tk_native:
            throw new org.omg.CORBA.MARSHAL(
                org.apache.yoko.orb.OB.MinorCodes
                    .describeMarshal(org.apache.yoko.orb.OB.MinorCodes.MinorNativeNotSupported),
                org.apache.yoko.orb.OB.MinorCodes.MinorNativeNotSupported,  
                CompletionStatus.COMPLETED_NO);

        case org.omg.CORBA_2_4.TCKind._tk_local_interface:
            throw new org.omg.CORBA.MARSHAL(
                org.apache.yoko.orb.OB.MinorCodes
                    .describeMarshal(org.apache.yoko.orb.OB.MinorCodes.MinorLocalObject),
                org.apache.yoko.orb.OB.MinorCodes.MinorLocalObject,
                org.omg.CORBA.CompletionStatus.COMPLETED_NO);

        case org.omg.CORBA.TCKind._tk_alias:
        default:
            throw new org.omg.CORBA.DATA_CONVERSION(
                org.apache.yoko.orb.OB.MinorCodes
                    .describeDataConversion(org.apache.yoko.orb.OB.MinorCodes.MinorNoAlias),
                org.apache.yoko.orb.OB.MinorCodes.MinorNoAlias,
                org.omg.CORBA.CompletionStatus.COMPLETED_NO);
        }
    }