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