in core/src/main/java/flex/messaging/io/amf/translator/decoder/DecoderFactory.java [113:175]
public static ActionScriptDecoder getDecoder(Object encodedObject, Class desiredClass) {
if (encodedObject != null) {
// If we already have a suitable instance, return immediately!
if (desiredClass.isAssignableFrom(encodedObject.getClass()))
return nativeDecoder;
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 collectionDecoder;
if (Map.class.isAssignableFrom(desiredClass))
return mapDecoder;
if (desiredClass.isArray())
return arrayDecoder;
// 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 typedObjectDecoder;
if (Date.class.isAssignableFrom(desiredClass))
return dateDecoder;
if (Calendar.class.isAssignableFrom(desiredClass))
return calendarDecoder;
}
// 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;
if (desiredClass.isEnum())
return enumDecoder;
DecoderFactory.invalidType(encodedObject, desiredClass);
// Never reached...
return nativeDecoder;
}