diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java index 0e09eca03747..225cd61d2dea 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java @@ -38,6 +38,7 @@ public static CodegenCustomizationProcessor getProcessorFor( new RemoveExceptionMessagePropertyProcessor(), new UseLegacyEventGenerationSchemeProcessor(), new NewAndLegacyEventStreamProcessor(), + new EventStreamSharedEventProcessor(config.getDuplicateAndRenameSharedEvents()), new S3RemoveBucketFromUriProcessor(), new S3ControlRemoveAccountIdHostPrefixProcessor(), new ExplicitStringPayloadQueryProtocolProcessor(), diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/EventStreamSharedEventProcessor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/EventStreamSharedEventProcessor.java new file mode 100644 index 000000000000..5df2a8f1fb50 --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/EventStreamSharedEventProcessor.java @@ -0,0 +1,128 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.customization.processors; + +import java.util.HashMap; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.codegen.customization.CodegenCustomizationProcessor; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.model.service.Member; +import software.amazon.awssdk.codegen.model.service.ServiceModel; +import software.amazon.awssdk.codegen.model.service.Shape; + +/** + * Processor for eventstreams with shared events. This Processor does two things: 1. Apply the duplicateAndRenameSharedEvents + * customization 2. Raise helpful error messages on untransfromed shared events. + */ +public final class EventStreamSharedEventProcessor implements CodegenCustomizationProcessor { + private static final Logger log = LoggerFactory.getLogger(EventStreamSharedEventProcessor.class); + + private final Map> duplicateAndRenameSharedEvents; + + public EventStreamSharedEventProcessor(Map> duplicateAndRenameSharedEvents) { + this.duplicateAndRenameSharedEvents = duplicateAndRenameSharedEvents; + } + + @Override + public void preprocess(ServiceModel serviceModel) { + if (duplicateAndRenameSharedEvents == null || duplicateAndRenameSharedEvents.isEmpty()) { + return; + } + + for (Map.Entry> eventStreamEntry : duplicateAndRenameSharedEvents.entrySet()) { + + String eventStreamName = eventStreamEntry.getKey(); + Shape eventStreamShape = serviceModel.getShapes().get(eventStreamName); + + validateIsEventStream(eventStreamShape, eventStreamName); + + Map eventStreamMembers = eventStreamShape.getMembers(); + for (Map.Entry eventEntry : eventStreamEntry.getValue().entrySet()) { + Member eventMemberToModify = eventStreamMembers.get(eventEntry.getKey()); + + if (eventMemberToModify == null) { + throw new IllegalStateException( + String.format("Cannot find event member [%s] in the eventstream [%s] when processing " + + "customization config duplicateAndRenameSharedEvents.%s", + eventEntry.getKey(), eventStreamName, eventStreamName)); + } + + String shapeToDuplicate = eventMemberToModify.getShape(); + Shape eventMemberShape = serviceModel.getShape(shapeToDuplicate); + + if (eventMemberShape == null || !eventMemberShape.isEvent()) { + throw new IllegalStateException( + String.format("Error: [%s] must be an Event shape when processing " + + "customization config duplicateAndRenameSharedEvents.%s", + eventEntry.getKey(), eventStreamName)); + } + + String newShapeName = eventEntry.getValue(); + if (serviceModel.getShapes().containsKey(newShapeName)) { + throw new IllegalStateException( + String.format("Error: [%s] is already in the model when processing " + + "customization config duplicateAndRenameSharedEvents.%s", + newShapeName, eventStreamName)); + } + serviceModel.getShapes().put(newShapeName, eventMemberShape); + eventMemberToModify.setShape(newShapeName); + log.info("Duplicated and renamed event member on {} from {} -> {}", + eventStreamName, shapeToDuplicate, newShapeName); + } + } + } + + private static void validateIsEventStream(Shape shape, String name) { + if (shape == null) { + throw new IllegalStateException( + String.format("Cannot find eventstream shape [%s] in the model when processing " + + "customization config duplicateAndRenameSharedEvents.%s", name, name)); + } + if (!shape.isEventstream()) { + throw new IllegalStateException( + String.format("Error: [%s] must be an EventStream when processing " + + "customization config duplicateAndRenameSharedEvents.%s", name, name)); + } + } + + @Override + public void postprocess(IntermediateModel intermediateModel) { + // validate that there are no events shared between multiple eventstreams. + // events may be used multiple times in the same eventstream. + Map seenEvents = new HashMap<>(); + + for (ShapeModel shapeModel : intermediateModel.getShapes().values()) { + if (shapeModel.isEventStream()) { + shapeModel.getMembers().forEach(m -> { + ShapeModel memberShape = intermediateModel.getShapes().get(m.getC2jShape()); + if (memberShape != null && memberShape.isEvent()) { + if (seenEvents.containsKey(memberShape.getShapeName()) + && !seenEvents.get(memberShape.getShapeName()).equals(shapeModel.getShapeName())) { + throw new IllegalStateException( + String.format("Event shape `%s` is shared between multiple EventStreams. Apply the " + + "duplicateAndRenameSharedEvents customization to resolve the issue.", + memberShape.getShapeName())); + } + seenEvents.put(memberShape.getShapeName(), shapeModel.getShapeName()); + } + }); + } + } + } +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java index 32cecd79feb5..18e1176edd08 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java @@ -210,6 +210,12 @@ public class CustomizationConfig { */ private Map> useLegacyEventGenerationScheme = new HashMap<>(); + /** + * Customization to instruct the code generator to duplicate and rename an event that is shared + * by multiple EventStreams. + */ + private Map> duplicateAndRenameSharedEvents = new HashMap<>(); + /** * How the code generator should behave when it encounters shapes with underscores in the name. */ @@ -654,6 +660,14 @@ public void setUseLegacyEventGenerationScheme(Map> useLegac this.useLegacyEventGenerationScheme = useLegacyEventGenerationScheme; } + public Map> getDuplicateAndRenameSharedEvents() { + return duplicateAndRenameSharedEvents; + } + + public void setDuplicateAndRenameSharedEvents(Map> duplicateAndRenameSharedEvents) { + this.duplicateAndRenameSharedEvents = duplicateAndRenameSharedEvents; + } + public UnderscoresInNameBehavior getUnderscoresInNameBehavior() { return underscoresInNameBehavior; } diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/customization/processors/EventStreamSharedEventProcessorTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/customization/processors/EventStreamSharedEventProcessorTest.java new file mode 100644 index 000000000000..a1cbe2d528a5 --- /dev/null +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/customization/processors/EventStreamSharedEventProcessorTest.java @@ -0,0 +1,123 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.customization.processors; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.io.File; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import software.amazon.awssdk.codegen.C2jModels; +import software.amazon.awssdk.codegen.IntermediateModelBuilder; +import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig; +import software.amazon.awssdk.codegen.model.service.ServiceModel; +import software.amazon.awssdk.codegen.model.service.Shape; +import software.amazon.awssdk.codegen.utils.ModelLoaderUtils; +import software.amazon.awssdk.utils.ImmutableMap; + +public class EventStreamSharedEventProcessorTest { + private static final String RESOURCE_ROOT = "/software/amazon/awssdk/codegen/customization/processors" + + "/eventstreamsharedeventprocessor/"; + + private ServiceModel serviceModel; + + @Before + public void setUp() { + File serviceModelFile = + new File(EventStreamSharedEventProcessorTest.class.getResource(RESOURCE_ROOT + "service-2.json").getFile()); + serviceModel = ModelLoaderUtils.loadModel(ServiceModel.class, serviceModelFile); + } + + @Test + public void duplicatesAndRenamesSharedEvent() { + File customizationConfigFile = + new File(EventStreamSharedEventProcessorTest.class.getResource(RESOURCE_ROOT + "customization.config").getFile()); + CustomizationConfig config = ModelLoaderUtils.loadModel(CustomizationConfig.class, customizationConfigFile); + + EventStreamSharedEventProcessor processor = + new EventStreamSharedEventProcessor(config.getDuplicateAndRenameSharedEvents()); + processor.preprocess(serviceModel); + + Shape newEventShape = serviceModel.getShape("PayloadB"); + assertNotNull(newEventShape); + assertEquals(serviceModel.getShape("Payload"), newEventShape); + + Shape streamB = serviceModel.getShape("StreamB"); + assertEquals("PayloadB", streamB.getMembers().get("Payload").getShape()); + } + + @Test + public void modelWithSharedEvents_raises() { + CustomizationConfig emptyConfig = CustomizationConfig.create(); + + assertThatThrownBy(() -> new IntermediateModelBuilder( + C2jModels.builder() + .serviceModel(serviceModel) + .customizationConfig(emptyConfig) + .build()).build()) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Event shape `Payload` is shared between multiple EventStreams"); + } + + @Test + public void invalidCustomization_missingShape() { + Map> duplicateAndRenameSharedEvents = ImmutableMap.of("MissingShape", null); + + EventStreamSharedEventProcessor processor = + new EventStreamSharedEventProcessor(duplicateAndRenameSharedEvents); + assertThatThrownBy(() -> processor.preprocess(serviceModel)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Cannot find eventstream shape [MissingShape]"); + } + + @Test + public void invalidCustomization_notEventStream() { + Map> duplicateAndRenameSharedEvents = ImmutableMap.of("Payload", null); + + EventStreamSharedEventProcessor processor = + new EventStreamSharedEventProcessor(duplicateAndRenameSharedEvents); + assertThatThrownBy(() -> processor.preprocess(serviceModel)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Error: [Payload] must be an EventStream"); + } + + @Test + public void invalidCustomization_invalidMember() { + Map> duplicateAndRenameSharedEvents = ImmutableMap.of( + "StreamB", ImmutableMap.of("InvalidMember", "Payload")); + + EventStreamSharedEventProcessor processor = + new EventStreamSharedEventProcessor(duplicateAndRenameSharedEvents); + assertThatThrownBy(() -> processor.preprocess(serviceModel)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Cannot find event member [InvalidMember] in the eventstream [StreamB]"); + } + + @Test + public void invalidCustomization_shapeAlreadyExists() { + Map> duplicateAndRenameSharedEvents = ImmutableMap.of( + "StreamB", ImmutableMap.of("Payload", "Payload")); + + EventStreamSharedEventProcessor processor = + new EventStreamSharedEventProcessor(duplicateAndRenameSharedEvents); + assertThatThrownBy(() -> processor.preprocess(serviceModel)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Error: [Payload] is already in the model"); + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/customization/processors/eventstreamsharedeventprocessor/customization.config b/codegen/src/test/resources/software/amazon/awssdk/codegen/customization/processors/eventstreamsharedeventprocessor/customization.config new file mode 100644 index 000000000000..69408d1fa3d3 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/customization/processors/eventstreamsharedeventprocessor/customization.config @@ -0,0 +1,7 @@ +{ + "duplicateAndRenameSharedEvents": { + "StreamB": { + "Payload": "PayloadB" + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/customization/processors/eventstreamsharedeventprocessor/service-2.json b/codegen/src/test/resources/software/amazon/awssdk/codegen/customization/processors/eventstreamsharedeventprocessor/service-2.json new file mode 100644 index 000000000000..95272895c5c6 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/customization/processors/eventstreamsharedeventprocessor/service-2.json @@ -0,0 +1,86 @@ +{ + "version": "2.0", + "metadata": { + "apiVersion": "2010-05-08", + "endpointPrefix": "shared-event-stream-service", + "globalEndpoint": "shared-event-stream.amazonaws.com", + "protocol": "rest-json", + "serviceAbbreviation": "Shared Event Stream Service", + "serviceFullName": "Service that shares event streams", + "serviceId":"Shared Event Stream Service", + "signatureVersion": "v4", + "uid": "shared-event-stream-service-2010-05-08", + "xmlNamespace": "https://shared-event-stream-service.amazonaws.com/doc/2010-05-08/" + }, + "operations": { + "StreamAOperation" : { + "name": "StreamAOperation", + "http": { + "method": "GET", + "requestUri": "/stream-a" + }, + "output": { + "shape": "StreamAOutput" + } + }, + "StreamBOperation" : { + "name": "StreamBOperation", + "http": { + "method": "GET", + "requestUri": "/stream-b" + }, + "output": { + "shape": "StreamBOutput" + } + } + }, + "shapes": { + "String": { + "type": "string" + }, + "StreamAOutput": { + "type": "structure", + "members": { + "EventStream": { + "shape": "StreamA" + } + } + }, + "StreamA": { + "type": "structure", + "members": { + "Payload": { + "shape": "Payload" + } + }, + "eventstream": true + }, + "StreamBOutput": { + "type": "structure", + "members": { + "EventStream": { + "shape": "StreamB" + } + } + }, + "StreamB": { + "type": "structure", + "members": { + "Payload": { + "shape": "Payload" + } + }, + "eventstream": true + }, + "Payload": { + "type": "structure", + "members": { + "chunk": { + "shape": "String" + } + }, + "event": true + } + }, + "documentation": "A service that streams births and deaths" +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/emitters/customizations/processors/uselegacyeventgenerationscheme/service-2.json b/codegen/src/test/resources/software/amazon/awssdk/codegen/emitters/customizations/processors/uselegacyeventgenerationscheme/service-2.json index 711cc1b26827..0f80d8959de4 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/emitters/customizations/processors/uselegacyeventgenerationscheme/service-2.json +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/emitters/customizations/processors/uselegacyeventgenerationscheme/service-2.json @@ -452,7 +452,7 @@ "type": "structure", "members": { "InputEventOne": { - "shape": "InputEvent" + "shape": "InputEventOne" }, "InputEventTwo": { "shape": "InputEventTwo" @@ -460,6 +460,15 @@ }, "eventstream": true }, + "InputEventOne": { + "type": "structure", + "members": { + "Foo": { + "shape": "String" + } + }, + "event": true + }, "InputEventTwo": { "type": "structure", "members": { diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/json/service-2.json b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/json/service-2.json index feb37978acfa..b662c73dac59 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/json/service-2.json +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/json/service-2.json @@ -491,7 +491,7 @@ "type": "structure", "members": { "InputEventOne": { - "shape": "InputEvent" + "shape": "InputEventOne" }, "InputEventTwo": { "shape": "InputEventTwo" @@ -499,6 +499,16 @@ }, "eventstream": true }, + "InputEventOne": { + "type": "structure", + "members": { + "ExplicitPayloadMember": { + "shape":"ExplicitPayloadMember", + "eventpayload":true + } + }, + "event": true + }, "InputEventTwo": { "type": "structure", "members": { diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/rest-json/service-2.json b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/rest-json/service-2.json index ecb840af8ad6..dbf7ac56c651 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/rest-json/service-2.json +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/rest-json/service-2.json @@ -523,7 +523,7 @@ "type": "structure", "members": { "InputEventOne": { - "shape": "InputEvent" + "shape": "InputEventOne" }, "InputEventTwo": { "shape": "InputEventTwo" @@ -531,6 +531,16 @@ }, "eventstream": true }, + "InputEventOne": { + "type": "structure", + "members": { + "ExplicitPayloadMember": { + "shape":"ExplicitPayloadMember", + "eventpayload":true + } + }, + "event": true + }, "InputEventTwo": { "type": "structure", "members": { diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-aws-json-async-client-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-aws-json-async-client-class.java index 7298068aa6ad..07b3c04f999d 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-aws-json-async-client-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-aws-json-async-client-class.java @@ -104,6 +104,7 @@ import software.amazon.awssdk.services.json.transform.EventStreamOperationWithOnlyOutputRequestMarshaller; import software.amazon.awssdk.services.json.transform.GetWithoutRequiredMembersRequestMarshaller; import software.amazon.awssdk.services.json.transform.InputEventMarshaller; +import software.amazon.awssdk.services.json.transform.InputEventOneMarshaller; import software.amazon.awssdk.services.json.transform.InputEventTwoMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithChecksumRequiredRequestMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithNoneAuthTypeRequestMarshaller; @@ -424,7 +425,7 @@ public CompletableFuture eventStreamO HttpResponseHandler errorResponseHandler = createErrorResponseHandler(protocolFactory, operationMetadata); EventStreamTaggedUnionJsonMarshaller eventMarshaller = EventStreamTaggedUnionJsonMarshaller.builder() - .putMarshaller(DefaultInputEventOne.class, new InputEventMarshaller(protocolFactory)) + .putMarshaller(DefaultInputEventOne.class, new InputEventOneMarshaller(protocolFactory)) .putMarshaller(DefaultInputEventTwo.class, new InputEventTwoMarshaller(protocolFactory)).build(); SdkPublisher eventPublisher = SdkPublisher.adapt(requestStream); Publisher adapted = eventPublisher.map(event -> eventMarshaller.marshall(event)).map( diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-cbor-async-client-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-cbor-async-client-class.java index 8953d6a681c1..eaad98458b42 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-cbor-async-client-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-cbor-async-client-class.java @@ -105,6 +105,7 @@ import software.amazon.awssdk.services.json.transform.EventStreamOperationWithOnlyOutputRequestMarshaller; import software.amazon.awssdk.services.json.transform.GetWithoutRequiredMembersRequestMarshaller; import software.amazon.awssdk.services.json.transform.InputEventMarshaller; +import software.amazon.awssdk.services.json.transform.InputEventOneMarshaller; import software.amazon.awssdk.services.json.transform.InputEventTwoMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithChecksumRequiredRequestMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithNoneAuthTypeRequestMarshaller; @@ -428,7 +429,7 @@ public CompletableFuture eventStreamO HttpResponseHandler errorResponseHandler = createErrorResponseHandler(protocolFactory, operationMetadata); EventStreamTaggedUnionJsonMarshaller eventMarshaller = EventStreamTaggedUnionJsonMarshaller.builder() - .putMarshaller(DefaultInputEventOne.class, new InputEventMarshaller(protocolFactory)) + .putMarshaller(DefaultInputEventOne.class, new InputEventOneMarshaller(protocolFactory)) .putMarshaller(DefaultInputEventTwo.class, new InputEventTwoMarshaller(protocolFactory)).build(); SdkPublisher eventPublisher = SdkPublisher.adapt(requestStream); Publisher adapted = eventPublisher.map(event -> eventMarshaller.marshall(event)).map( diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-async-client-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-async-client-class.java index 4a99f346bc6c..a3368c615b3e 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-async-client-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/sra/test-json-async-client-class.java @@ -115,6 +115,7 @@ import software.amazon.awssdk.services.json.transform.GetOperationWithChecksumRequestMarshaller; import software.amazon.awssdk.services.json.transform.GetWithoutRequiredMembersRequestMarshaller; import software.amazon.awssdk.services.json.transform.InputEventMarshaller; +import software.amazon.awssdk.services.json.transform.InputEventOneMarshaller; import software.amazon.awssdk.services.json.transform.InputEventTwoMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithChecksumRequiredRequestMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithRequestCompressionRequestMarshaller; @@ -505,7 +506,7 @@ public CompletableFuture eventStreamO HttpResponseHandler errorResponseHandler = createErrorResponseHandler(protocolFactory, operationMetadata); EventStreamTaggedUnionJsonMarshaller eventMarshaller = EventStreamTaggedUnionJsonMarshaller.builder() - .putMarshaller(DefaultInputEventOne.class, new InputEventMarshaller(protocolFactory)) + .putMarshaller(DefaultInputEventOne.class, new InputEventOneMarshaller(protocolFactory)) .putMarshaller(DefaultInputEventTwo.class, new InputEventTwoMarshaller(protocolFactory)).build(); SdkPublisher eventPublisher = SdkPublisher.adapt(requestStream); Publisher adapted = eventPublisher.map(event -> eventMarshaller.marshall(event)).map( diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-json-async-client-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-json-async-client-class.java index 9384c1c5d766..112738279d9b 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-json-async-client-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-aws-json-async-client-class.java @@ -110,6 +110,7 @@ import software.amazon.awssdk.services.json.transform.EventStreamOperationWithOnlyOutputRequestMarshaller; import software.amazon.awssdk.services.json.transform.GetWithoutRequiredMembersRequestMarshaller; import software.amazon.awssdk.services.json.transform.InputEventMarshaller; +import software.amazon.awssdk.services.json.transform.InputEventOneMarshaller; import software.amazon.awssdk.services.json.transform.InputEventTwoMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithChecksumRequiredRequestMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithNoneAuthTypeRequestMarshaller; @@ -433,7 +434,7 @@ public CompletableFuture eventStreamO HttpResponseHandler errorResponseHandler = createErrorResponseHandler(protocolFactory, operationMetadata); EventStreamTaggedUnionJsonMarshaller eventMarshaller = EventStreamTaggedUnionJsonMarshaller.builder() - .putMarshaller(DefaultInputEventOne.class, new InputEventMarshaller(protocolFactory)) + .putMarshaller(DefaultInputEventOne.class, new InputEventOneMarshaller(protocolFactory)) .putMarshaller(DefaultInputEventTwo.class, new InputEventTwoMarshaller(protocolFactory)).build(); SdkPublisher eventPublisher = SdkPublisher.adapt(requestStream); Publisher adapted = eventPublisher.map(event -> eventMarshaller.marshall(event)).map( diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-cbor-async-client-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-cbor-async-client-class.java index 308abd62a314..0f6716911796 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-cbor-async-client-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-cbor-async-client-class.java @@ -111,6 +111,7 @@ import software.amazon.awssdk.services.json.transform.EventStreamOperationWithOnlyOutputRequestMarshaller; import software.amazon.awssdk.services.json.transform.GetWithoutRequiredMembersRequestMarshaller; import software.amazon.awssdk.services.json.transform.InputEventMarshaller; +import software.amazon.awssdk.services.json.transform.InputEventOneMarshaller; import software.amazon.awssdk.services.json.transform.InputEventTwoMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithChecksumRequiredRequestMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithNoneAuthTypeRequestMarshaller; @@ -437,7 +438,7 @@ public CompletableFuture eventStreamO HttpResponseHandler errorResponseHandler = createErrorResponseHandler(protocolFactory, operationMetadata); EventStreamTaggedUnionJsonMarshaller eventMarshaller = EventStreamTaggedUnionJsonMarshaller.builder() - .putMarshaller(DefaultInputEventOne.class, new InputEventMarshaller(protocolFactory)) + .putMarshaller(DefaultInputEventOne.class, new InputEventOneMarshaller(protocolFactory)) .putMarshaller(DefaultInputEventTwo.class, new InputEventTwoMarshaller(protocolFactory)).build(); SdkPublisher eventPublisher = SdkPublisher.adapt(requestStream); Publisher adapted = eventPublisher.map(event -> eventMarshaller.marshall(event)).map( diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-json-async-client-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-json-async-client-class.java index 1dfb81af4d68..53ae5d7e1e2f 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-json-async-client-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-json-async-client-class.java @@ -122,6 +122,7 @@ import software.amazon.awssdk.services.json.transform.GetOperationWithChecksumRequestMarshaller; import software.amazon.awssdk.services.json.transform.GetWithoutRequiredMembersRequestMarshaller; import software.amazon.awssdk.services.json.transform.InputEventMarshaller; +import software.amazon.awssdk.services.json.transform.InputEventOneMarshaller; import software.amazon.awssdk.services.json.transform.InputEventTwoMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithChecksumRequiredRequestMarshaller; import software.amazon.awssdk.services.json.transform.OperationWithRequestCompressionRequestMarshaller; @@ -516,7 +517,7 @@ public CompletableFuture eventStreamO HttpResponseHandler errorResponseHandler = createErrorResponseHandler(protocolFactory, operationMetadata); EventStreamTaggedUnionJsonMarshaller eventMarshaller = EventStreamTaggedUnionJsonMarshaller.builder() - .putMarshaller(DefaultInputEventOne.class, new InputEventMarshaller(protocolFactory)) + .putMarshaller(DefaultInputEventOne.class, new InputEventOneMarshaller(protocolFactory)) .putMarshaller(DefaultInputEventTwo.class, new InputEventTwoMarshaller(protocolFactory)).build(); SdkPublisher eventPublisher = SdkPublisher.adapt(requestStream); Publisher adapted = eventPublisher.map(event -> eventMarshaller.marshall(event)).map( diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventone.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventone.java index a7aa376fa3f1..4f30f0d35c4c 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventone.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventone.java @@ -2,17 +2,17 @@ import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.services.json.model.InputEvent; +import software.amazon.awssdk.services.json.model.InputEventOne; import software.amazon.awssdk.services.json.model.InputEventStreamTwo; /** - * A specialization of {@code software.amazon.awssdk.services.json.model.InputEvent} that represents the + * A specialization of {@code software.amazon.awssdk.services.json.model.InputEventOne} that represents the * {@code InputEventStreamTwo$InputEventOne} event. Do not use this class directly. Instead, use the static builder * methods on {@link software.amazon.awssdk.services.json.model.InputEventStreamTwo}. */ @SdkInternalApi @Generated("software.amazon.awssdk:codegen") -public final class DefaultInputEventOne extends InputEvent { +public final class DefaultInputEventOne extends InputEventOne { private static final long serialVersionUID = 1L; DefaultInputEventOne(BuilderImpl builderImpl) { @@ -33,12 +33,12 @@ public InputEventStreamTwo.EventType sdkEventType() { return InputEventStreamTwo.EventType.INPUT_EVENT_ONE; } - public interface Builder extends InputEvent.Builder { + public interface Builder extends InputEventOne.Builder { @Override DefaultInputEventOne build(); } - private static final class BuilderImpl extends InputEvent.BuilderImpl implements Builder { + private static final class BuilderImpl extends InputEventOne.BuilderImpl implements Builder { private BuilderImpl() { } @@ -52,4 +52,3 @@ public DefaultInputEventOne build() { } } } - 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 5d8c43c448a7..db3dfc5b7d2b 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 @@ -142,7 +142,7 @@ "type": "structure", "members": { "InputEventOne": { - "shape": "InputEvent" + "shape": "InputEventOne" }, "InputEventTwo": { "shape": "InputEventTwo" @@ -150,6 +150,16 @@ }, "eventstream": true }, + "InputEventOne": { + "type": "structure", + "members": { + "ExplicitPayloadMember": { + "shape":"ExplicitPayloadMember", + "eventpayload":true + } + }, + "event": true + }, "InputEventTwo": { "type": "structure", "members": {