in codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/ShapeSubstitutionsProcessor.java [222:316]
private void postprocessHandleEmitAsMember(
ShapeModel shape, IntermediateModel intermediateModel) {
/*
* For structure members whose shape is substituted, we need to add the
* additional marshalling/unmarshalling path to the corresponding member
* model
*/
for (Entry<String, Map<String, String>> ref : substitutedShapeMemberReferences.entrySet()) {
String parentShapeC2jName = ref.getKey();
Map<String, String> memberOriginalShapeMap = ref.getValue();
ShapeModel parentShape = Utils.findShapeModelByC2jName(
intermediateModel, parentShapeC2jName);
for (Entry<String, String> entry : memberOriginalShapeMap.entrySet()) {
String memberC2jName = entry.getKey();
String originalShapeC2jName = entry.getValue();
MemberModel member = parentShape.findMemberModelByC2jName(memberC2jName);
ShapeModel originalShape = Utils.findShapeModelByC2jName(intermediateModel, originalShapeC2jName);
MemberModel emitFromMember =
originalShape.findMemberModelByC2jName(
shapeSubstitutions.get(originalShapeC2jName)
.getEmitFromMember());
// Pass in the original member model's marshalling/unmarshalling location name
/**
* This customization is specifically added for
* EC2 where we replace all occurrences of AttributeValue with Value in
* the model classes. However the wire representation is not changed.
*
* TODO This customization has been added to preserve backwards
* compatibility of EC2 APIs. This should be removed as part of next major
* version bump.
*/
if (!shouldSkipAddingMarshallingPath(shapeSubstitutions.get(originalShapeC2jName), parentShapeC2jName)) {
member.getHttp().setAdditionalMarshallingPath(
emitFromMember.getHttp().getMarshallLocationName());
}
member.getHttp().setAdditionalUnmarshallingPath(
emitFromMember.getHttp().getUnmarshallLocationName());
}
}
/*
* For list shapes whose member shape is substituted, we need to add the
* additional path into the "http" metadata of all the shape members
* that reference to this list-type shape.
*/
for (Entry<String, Map<String, String>> ref : substitutedListMemberReferences.entrySet()) {
String parentShapeC2jName = ref.getKey();
// {listTypeMemberName -> nestedListMemberOriginalShape}
Map<String, String> nestedListMemberOriginalShapeMap = ref.getValue();
ShapeModel parentShape = Utils.findShapeModelByC2jName(
intermediateModel, parentShapeC2jName);
for (Entry<String, String> entry : nestedListMemberOriginalShapeMap.entrySet()) {
String listTypeMemberC2jName = entry.getKey();
String nestedListMemberOriginalShapeC2jName = entry.getValue();
MemberModel listTypeMember = parentShape.findMemberModelByC2jName(listTypeMemberC2jName);
ShapeModel nestedListMemberOriginalShape = Utils.findShapeModelByC2jName(intermediateModel,
nestedListMemberOriginalShapeC2jName);
MemberModel emitFromMember =
nestedListMemberOriginalShape.findMemberModelByC2jName(
shapeSubstitutions
.get(nestedListMemberOriginalShapeC2jName)
.getEmitFromMember()
);
/**
* This customization is specifically added for
* EC2 where we replace all occurrences of AttributeValue with Value in
* the model classes. However the wire representation is not changed.
*
* TODO This customization has been added to preserve backwards
* compatibility of EC2 APIs. This should be removed as part of next major
* version bump.
*/
if (!shouldSkipAddingMarshallingPath(shapeSubstitutions.get(nestedListMemberOriginalShapeC2jName),
parentShapeC2jName)) {
listTypeMember.getListModel().setMemberAdditionalMarshallingPath(
emitFromMember.getHttp().getMarshallLocationName());
}
listTypeMember.getListModel().setMemberAdditionalUnmarshallingPath(
emitFromMember.getHttp().getUnmarshallLocationName());
}
}
}