public static ActionScriptDecoder getReferenceAwareDecoder()

in core/src/main/java/flex/messaging/io/amf/translator/decoder/DecoderFactory.java [186:250]


    public static ActionScriptDecoder getReferenceAwareDecoder(Object encodedObject, Class desiredClass) {
        if (encodedObject != null) {
            if (String.class.equals(desiredClass))
                return stringDecoder;

            // We check Number and Boolean here as well as the encodedObejct == null case
            // as they're very common property types...
            if (isNumber(desiredClass))
                return numberDecoder;

            if (isBoolean(desiredClass))
                return booleanDecoder;

            if (Collection.class.isAssignableFrom(desiredClass))
                return deepCollectionDecoder;

            if (Map.class.isAssignableFrom(desiredClass))
                return deepMapDecoder;

            if (desiredClass.isArray())
                return deepArrayDecoder;

            // Special Case - we have a typed ASObject and we're expecting it to
            // be converted into a new class... this would be an usual situation
            // for Mistral, however, since we now create strongly typed instances
            // from a stream.
            if (isTypedObject(encodedObject))
                return deepTypedObjectDecoder;

            if (Date.class.isAssignableFrom(desiredClass))
                return dateDecoder;

            if (Calendar.class.isAssignableFrom(desiredClass))
                return calendarDecoder;

            if (isCharacter(desiredClass))
                return characterDecoder;

            // Last resort, just try and return the object undecoded if it's the right type
            // We do this last because at this stage if it is a complex object we won't catch
            // any Typed Object translations for properties on this type...
            if (desiredClass.isAssignableFrom(encodedObject.getClass()))
                return nativeDecoder;
        }

        // Null may have been sent to a primitive Java type, in which case
        // we create a default value, such as new Integer(0) for int rather than create
        // a null Integer() instance...
        if (isNumber(desiredClass))
            return numberDecoder;

        if (isBoolean(desiredClass))
            return booleanDecoder;

        if (isCharacter(desiredClass))
            return characterDecoder;

        if (encodedObject == null)
            return nullDecoder;

        DecoderFactory.invalidType(encodedObject, desiredClass);

        // Never reached...
        return nativeDecoder;
    }