diff --git a/.changes/next-release/bugfix-AWSSDKforJavav2-52218bd.json b/.changes/next-release/bugfix-AWSSDKforJavav2-52218bd.json new file mode 100644 index 000000000000..5883aba1b9c8 --- /dev/null +++ b/.changes/next-release/bugfix-AWSSDKforJavav2-52218bd.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "AWS SDK for Java v2", + "contributor": "", + "description": "Update codegen to allow errors as event stream output members" +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/RemoveUnusedShapes.java b/codegen/src/main/java/software/amazon/awssdk/codegen/RemoveUnusedShapes.java index 90667eb7478d..1e55ade382bb 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/RemoveUnusedShapes.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/RemoveUnusedShapes.java @@ -26,6 +26,7 @@ import software.amazon.awssdk.codegen.model.intermediate.OperationModel; import software.amazon.awssdk.codegen.model.intermediate.ReturnTypeModel; import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.model.intermediate.ShapeType; import software.amazon.awssdk.codegen.model.intermediate.VariableModel; /** @@ -94,7 +95,7 @@ private static void addShapeAndMembers(String shapeName, if (members != null) { for (MemberModel member : members) { - List memberShapes = resolveMemberShapes(member); + List memberShapes = resolveMemberShapes(member, in); if (memberShapes == null) { continue; } @@ -111,7 +112,7 @@ private static void addShapeAndMembers(String shapeName, * both the key shape and the value shape of the map will be resolved, so that the * returning list could have more than one elements. */ - private static List resolveMemberShapes(MemberModel member) { + private static List resolveMemberShapes(MemberModel member, Map modelShapes) { if (member == null) { return new LinkedList<>(); @@ -119,16 +120,23 @@ private static List resolveMemberShapes(MemberModel member) { if (member.getEnumType() != null) { return Collections.singletonList(member.getEnumType()); } else if (member.isList()) { - return resolveMemberShapes(member.getListModel().getListMemberModel()); + return resolveMemberShapes(member.getListModel().getListMemberModel(), modelShapes); } else if (member.isMap()) { List memberShapes = new LinkedList<>(); - memberShapes.addAll(resolveMemberShapes(member.getMapModel().getKeyModel())); - memberShapes.addAll(resolveMemberShapes(member.getMapModel().getValueModel())); + memberShapes.addAll(resolveMemberShapes(member.getMapModel().getKeyModel(), modelShapes)); + memberShapes.addAll(resolveMemberShapes(member.getMapModel().getValueModel(), modelShapes)); return memberShapes; } else if (member.isSimple()) { // member is scalar, do nothing return new LinkedList<>(); } else { + // Exceptions have suffix appended, find shape by C2J name + for (ShapeModel shape : modelShapes.values()) { + if (shape.getShapeType().equals(ShapeType.Exception) && member.getC2jShape().equals(shape.getC2jName())) { + return Collections.singletonList(shape.getShapeName()); + } + } + // member is a structure. return Collections.singletonList(member.getVariable().getSimpleType()); } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/service-2.json b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/service-2.json index db3dfc5b7d2b..59574ff2817c 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/service-2.json +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/service-2.json @@ -68,6 +68,9 @@ "members": { "EventStream": { "shape": "EventStream" + }, + "EventStreamError": { + "shape": "EventStreamError" } } }, @@ -127,6 +130,16 @@ }, "event": true }, + "EventStreamError": { + "type": "structure", + "members": { + "message": { + "shape": "String" + } + }, + "exception": true, + "fault": true + }, "EventStreamOperationWithOnlyInputRequest": { "type": "structure", "required": [