string GetTypeUnmarshallerName(JsonData extendedData)
{
// Check to see if customizations is overriding.
var overrideType = this.model.Customizations.OverrideDataType(OwningShape.Name, this._name);
if (overrideType != null)
return overrideType.Unmarshaller;
var extendsNode = extendedData[ServiceModel.ShapeKey];
if (extendsNode == null)
throw new Exception("Missing extends for member " + this._name);
var memberShape = this.model.DocumentRoot[ServiceModel.ShapesKey][extendsNode.ToString()];
var typeNode = memberShape[Shape.TypeKey];
if (typeNode == null)
throw new Exception("Type is missing for shape " + extendsNode.ToString());
switch (typeNode.ToString())
{
case "string":
return "StringUnmarshaller";
case "blob":
return "MemoryStreamUnmarshaller";
case "boolean":
return "BoolUnmarshaller";
case "double":
return "DoubleUnmarshaller";
case "float":
return "FloatUnmarshaller";
case "integer":
return "IntUnmarshaller";
case "long":
return "LongUnmarshaller";
case "timestamp":
return "DateTimeUnmarshaller";
case "structure":
var shapeName = extendsNode.ToString();
var renamedShape = this.model.Customizations.GetOverrideShapeName(shapeName);
var substitutedShape = this.model.Customizations.GetSubstituteShapeName(shapeName);
if (!string.IsNullOrWhiteSpace(renamedShape))
{
shapeName = renamedShape;
}
else if(!string.IsNullOrWhiteSpace(substitutedShape))
{
shapeName = substitutedShape;
}
return shapeName + "Unmarshaller";
case "map":
var keyType = DetermineType(memberShape[Shape.KeyKey], true);
var keyTypeUnmarshaller = GetTypeUnmarshallerName(memberShape[Shape.KeyKey]);
var valueType = DetermineType(memberShape[Shape.ValueKey], true);
var valueTypeUnmarshaller = GetTypeUnmarshallerName(memberShape[Shape.ValueKey]);
return string.Format("DictionaryUnmarshaller<{0}, {1}, {2}, {3}>",
keyType, valueType, keyTypeUnmarshaller, valueTypeUnmarshaller);
case "list":
var listType = DetermineType(memberShape[Member.MemberKey], true);
var listTypeUnmarshaller = GetTypeUnmarshallerName(memberShape[Member.MemberKey]);
return string.Format("ListUnmarshaller<{0}, {1}>",
listType, listTypeUnmarshaller);
default:
throw new Exception("Unknown type " + typeNode.ToString());
}
}