public static string DetermineAWSQueryMarshallName(Member member, Operation operation)
{
var isEC2Protocol = member.model.IsEC2Protocol;
CustomizationsModel.OperationModifiers modifiers = null;
if (operation != null)
modifiers = operation.OperationModifiers;
var marshallName = new StringBuilder();
if (modifiers != null)
{
var marshallOverride = modifiers.GetMarshallNameOverrides(member.OwningShape.Name, member.PropertyName);
if (marshallOverride != null)
{
var marshallOverrideName = !isEC2Protocol
? marshallOverride.MarshallName
: (string.IsNullOrEmpty(marshallOverride.MarshallLocationName)
? marshallOverride.MarshallName
: marshallOverride.MarshallLocationName);
marshallName.Append(TransformMarshallLocationName(isEC2Protocol, marshallOverrideName));
}
}
// if the operation didn't override the marshal location, is there a property modifier doing so?
if (marshallName.Length == 0 && member.PropertyModifier != null)
{
var locationName = TransformMarshallLocationName(isEC2Protocol, member.PropertyModifier.LocationName);
marshallName.Append(locationName);
}
// if the marshal name still isn't set, fall back to the model
if (marshallName.Length == 0)
{
var modelMarshallName = !isEC2Protocol
? member.MarshallName
: (string.IsNullOrEmpty(member.MarshallLocationName)
? member.MarshallName
: member.MarshallLocationName);
marshallName.Append(TransformMarshallLocationName(isEC2Protocol, modelMarshallName));
}
// also check if we need to emit from a submember as a result of shape substitution
var substituteShapeData = member.model.Customizations.GetSubstituteShapeData(member.ModelShape.Name);
if (substituteShapeData != null && substituteShapeData[CustomizationsModel.EmitFromMemberKey] != null)
{
var valueMember = (string) substituteShapeData[CustomizationsModel.EmitFromMemberKey];
var subMember = member.ModelShape.Members.Single(m => m.PropertyName.Equals(valueMember, StringComparison.Ordinal));
if (subMember != null)
{
var subExpression = string.IsNullOrEmpty(subMember.MarshallLocationName)
? subMember.MarshallName
: subMember.MarshallLocationName;
marshallName.AppendFormat(".{0}", TransformMarshallLocationName(isEC2Protocol, subExpression));
}
}
return marshallName.ToString();
}