diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/AbstractEnumClass.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/AbstractEnumClass.java new file mode 100644 index 000000000000..3587914cd85e --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/AbstractEnumClass.java @@ -0,0 +1,115 @@ +/* + * 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.poet.common; + +import static software.amazon.awssdk.codegen.poet.PoetUtils.createEnumBuilder; +import static software.amazon.awssdk.codegen.poet.PoetUtils.toStringBuilder; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterizedTypeName; +import com.squareup.javapoet.TypeSpec; +import com.squareup.javapoet.TypeSpec.Builder; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.lang.model.element.Modifier; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.poet.ClassSpec; + +public abstract class AbstractEnumClass implements ClassSpec { + + private static final String VALUE = "value"; + private static final String UNKNOWN_TO_SDK_VERSION = "UNKNOWN_TO_SDK_VERSION"; + private final ShapeModel shape; + + public AbstractEnumClass(ShapeModel shape) { + this.shape = shape; + } + + @Override + public final TypeSpec poetSpec() { + Builder enumBuilder = createEnumBuilder(className()) + .addField(String.class, VALUE, Modifier.PRIVATE, Modifier.FINAL) + .addMethod(toStringBuilder().addStatement("return $T.valueOf($N)", String.class, VALUE).build()) + .addMethod(fromValueSpec()) + .addMethod(knownValuesSpec()) + .addMethod(createConstructor()); + + addDeprecated(enumBuilder); + addJavadoc(enumBuilder); + addEnumConstants(enumBuilder); + + enumBuilder.addEnumConstant(UNKNOWN_TO_SDK_VERSION, TypeSpec.anonymousClassBuilder("null").build()); + + return enumBuilder.build(); + } + + protected final ShapeModel getShape() { + return shape; + } + + protected abstract void addDeprecated(Builder enumBuilder); + + protected abstract void addJavadoc(Builder enumBuilder); + + protected abstract void addEnumConstants(Builder enumBuilder); + + private MethodSpec createConstructor() { + return MethodSpec.constructorBuilder() + .addModifiers(Modifier.PRIVATE) + .addParameter(String.class, VALUE) + .addStatement("this.$1N = $1N", VALUE) + .build(); + } + + private MethodSpec fromValueSpec() { + return MethodSpec.methodBuilder("fromValue") + .returns(className()) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addJavadoc("Use this in place of valueOf to convert the raw string returned by the service into the " + + "enum value.\n\n" + + "@param $N real value\n" + + "@return $T corresponding to the value\n", VALUE, className()) + .addParameter(String.class, VALUE) + .beginControlFlow("if ($N == null)", VALUE) + .addStatement("return null") + .endControlFlow() + .addStatement("return $1T.of($2T.values())\n" + + ".filter(e -> e.toString().equals($3N))\n" + + ".findFirst()\n" + + ".orElse(UNKNOWN_TO_SDK_VERSION)", + Stream.class, + className(), + VALUE) + .build(); + } + + private MethodSpec knownValuesSpec() { + return MethodSpec.methodBuilder("knownValues") + .returns(ParameterizedTypeName.get(ClassName.get(Set.class), className())) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addJavadoc("Use this in place of {@link #values()} to return a {@link Set} of all values known to the " + + "SDK.\n" + + "This will return all known enum values except {@link #$N}.\n\n" + + "@return a {@link $T} of known {@link $T}s", UNKNOWN_TO_SDK_VERSION, Set.class, className()) + .addStatement("return $T.of(values()).filter(v -> v != $N).collect($T.toSet())", + Stream.class, + UNKNOWN_TO_SDK_VERSION, + Collectors.class) + .build(); + } +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/EnumClass.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/EnumClass.java index ca70418ae2bb..072d2b10b4ec 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/EnumClass.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/EnumClass.java @@ -15,108 +15,39 @@ package software.amazon.awssdk.codegen.poet.common; -import static software.amazon.awssdk.codegen.poet.PoetUtils.addDeprecated; -import static software.amazon.awssdk.codegen.poet.PoetUtils.addJavadoc; -import static software.amazon.awssdk.codegen.poet.PoetUtils.createEnumBuilder; -import static software.amazon.awssdk.codegen.poet.PoetUtils.toStringBuilder; - import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.MethodSpec; -import com.squareup.javapoet.ParameterizedTypeName; import com.squareup.javapoet.TypeSpec; import com.squareup.javapoet.TypeSpec.Builder; -import java.util.Collections; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import javax.lang.model.element.Modifier; import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; -import software.amazon.awssdk.codegen.poet.ClassSpec; -import software.amazon.awssdk.codegen.poet.StaticImport; - -public final class EnumClass implements ClassSpec { +import software.amazon.awssdk.codegen.poet.PoetUtils; - private static final String VALUE = "value"; - private static final String UNKNOWN_TO_SDK_VERSION = "UNKNOWN_TO_SDK_VERSION"; - private final ShapeModel shape; - private final ClassName className; +public final class EnumClass extends AbstractEnumClass { + private final String enumPackageName; public EnumClass(String enumPackage, ShapeModel shape) { - this.shape = shape; - this.className = ClassName.get(enumPackage, shape.getShapeName()); + super(shape); + this.enumPackageName = enumPackage; } @Override - public TypeSpec poetSpec() { - Builder enumBuilder = createEnumBuilder(className) - .addField(String.class, VALUE, Modifier.PRIVATE, Modifier.FINAL) - .addMethod(toStringBuilder().addStatement("return $T.valueOf($N)", String.class, VALUE).build()) - .addMethod(fromValueSpec()) - .addMethod(knownValuesSpec()) - .addMethod(createConstructor()); - - addDeprecated(enumBuilder::addAnnotation, shape); - addJavadoc(enumBuilder::addJavadoc, shape); - - shape.getEnums().forEach( - e -> enumBuilder.addEnumConstant(e.getName(), TypeSpec.anonymousClassBuilder("$S", e.getValue()).build()) - ); - enumBuilder.addEnumConstant(UNKNOWN_TO_SDK_VERSION, TypeSpec.anonymousClassBuilder("null").build()); - - return enumBuilder.build(); + protected void addDeprecated(Builder enumBuilder) { + PoetUtils.addDeprecated(enumBuilder::addAnnotation, getShape()); } @Override - public ClassName className() { - return className; + protected void addJavadoc(Builder enumBuilder) { + PoetUtils.addJavadoc(enumBuilder::addJavadoc, getShape()); } @Override - public Iterable staticImports() { - return Collections.singleton(StaticImport.staticMethodImport(Collectors.class, "toSet")); - } - - private MethodSpec createConstructor() { - return MethodSpec.constructorBuilder() - .addModifiers(Modifier.PRIVATE) - .addParameter(String.class, VALUE) - .addStatement("this.$1N = $1N", VALUE) - .build(); - } - - private MethodSpec fromValueSpec() { - return MethodSpec.methodBuilder("fromValue") - .returns(className) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .addJavadoc("Use this in place of valueOf to convert the raw string returned by the service into the " + - "enum value.\n\n" + - "@param $N real value\n" + - "@return $T corresponding to the value\n", VALUE, className) - .addParameter(String.class, VALUE) - .beginControlFlow("if ($N == null)", VALUE) - .addStatement("return null") - .endControlFlow() - .addStatement("return $1T.of($2T.values())\n" + - ".filter(e -> e.toString().equals($3N))\n" + - ".findFirst()\n" + - ".orElse(UNKNOWN_TO_SDK_VERSION)", - Stream.class, - className, - VALUE) - .build(); + protected void addEnumConstants(Builder enumBuilder) { + getShape().getEnums().forEach( + e -> enumBuilder.addEnumConstant(e.getName(), TypeSpec.anonymousClassBuilder("$S", e.getValue()).build()) + ); } - private MethodSpec knownValuesSpec() { - return MethodSpec.methodBuilder("knownValues") - .returns(ParameterizedTypeName.get(ClassName.get(Set.class), className)) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .addJavadoc("Use this in place of {@link #values()} to return a {@link Set} of all values known to the " - + "SDK.\n" - + "This will return all known enum values except {@link #$N}.\n\n" - + "@return a {@link $T} of known {@link $T}s", UNKNOWN_TO_SDK_VERSION, Set.class, className) - .addStatement("return $T.of(values()).filter(v -> v != $N).collect(toSet())", - Stream.class, - UNKNOWN_TO_SDK_VERSION) - .build(); + @Override + public ClassName className() { + return ClassName.get(enumPackageName, getShape().getShapeName()); } } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamUtils.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamUtils.java index 20c39097bfb5..44267cd394fe 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamUtils.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamUtils.java @@ -16,6 +16,7 @@ package software.amazon.awssdk.codegen.poet.eventstream; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -95,6 +96,14 @@ public static Optional getBaseEventStreamShape(IntermediateModel mod .findFirst(); } + public static List getBaseEventStreamShapes(IntermediateModel model, ShapeModel eventShape) { + return model.getShapes().values() + .stream() + .filter(ShapeModel::isEventStream) + .filter(s -> s.getMembers().stream().anyMatch(m -> m.getShape().equals(eventShape))) + .collect(Collectors.toList()); + } + /** * Returns the stream of event members ('event: true') excluding exceptions * from the input event stream shape ('eventstream: true'). diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventTypeEnumSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventTypeEnumSpec.java new file mode 100644 index 000000000000..b404b44fcfec --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventTypeEnumSpec.java @@ -0,0 +1,61 @@ +/* + * 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.poet.eventstream; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.TypeSpec; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.naming.NamingStrategy; +import software.amazon.awssdk.codegen.poet.common.AbstractEnumClass; + +public class EventTypeEnumSpec extends AbstractEnumClass { + private final String enumPackageName; + private final IntermediateModel intermediateModel; + + public EventTypeEnumSpec(String enumPackageName, IntermediateModel intermediateModel, ShapeModel eventStream) { + super(eventStream); + this.enumPackageName = enumPackageName; + this.intermediateModel = intermediateModel; + } + + @Override + protected void addDeprecated(TypeSpec.Builder enumBuilder) { + // no-op + } + + @Override + protected void addJavadoc(TypeSpec.Builder enumBuilder) { + enumBuilder.addJavadoc("The known possible types of events for {@code $N}.", getShape().getShapeName()); + } + + @Override + protected void addEnumConstants(TypeSpec.Builder enumBuilder) { + NamingStrategy namingStrategy = intermediateModel.getNamingStrategy(); + getShape().getMembers().stream() + .filter(m -> m.getShape().isEvent()) + .forEach(m -> { + String value = m.getC2jName(); + String name = namingStrategy.getEnumValueName(value); + enumBuilder.addEnumConstant(name, TypeSpec.anonymousClassBuilder("$S", value).build()); + }); + } + + @Override + public ClassName className() { + return ClassName.get(enumPackageName, "EventType"); + } +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/AwsServiceModel.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/AwsServiceModel.java index d0c3f302e7ec..5957376eb94b 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/AwsServiceModel.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/AwsServiceModel.java @@ -48,6 +48,7 @@ import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; import software.amazon.awssdk.codegen.model.intermediate.ShapeType; import software.amazon.awssdk.codegen.model.intermediate.VariableModel; +import software.amazon.awssdk.codegen.naming.NamingStrategy; import software.amazon.awssdk.codegen.poet.ClassSpec; import software.amazon.awssdk.codegen.poet.PoetExtensions; import software.amazon.awssdk.codegen.poet.PoetUtils; @@ -123,10 +124,7 @@ public TypeSpec poetSpec() { } if (this.shapeModel.isEvent()) { - EventStreamUtils.getBaseEventStreamShape(intermediateModel, shapeModel).ifPresent( - eventStream -> addEventSupport(specBuilder, eventStream) - ); - + addEventSupport(specBuilder); } if (this.shapeModel.getDocumentation() != null) { @@ -146,12 +144,24 @@ private TypeSpec eventStreamInterfaceSpec() { Collection outputOperations = findOutputEventStreamOperations(opModels, shapeModel); + EventStreamSpecHelper helper = new EventStreamSpecHelper(shapeModel, intermediateModel); + ClassName modelClass = poetExtensions.getModelClassFromShape(shapeModel); TypeSpec.Builder builder = PoetUtils.createInterfaceBuilder(modelClass) .addAnnotation(SdkPublicApi.class) - .addMethods(eventStreamInterfaceEventBuilderMethods()); + .addMethods(eventStreamInterfaceEventBuilderMethods()) + .addType(helper.eventTypeEnumSpec()); + + + ClassName eventTypeEnum = helper.eventTypeEnumClassName(); + builder.addMethod(MethodSpec.methodBuilder("sdkEventType") + .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT) + .returns(eventTypeEnum) + .addJavadoc("The type of this event. Corresponds to the {@code :event-type} header on the Message.") + .addStatement("return $T.UNKNOWN_TO_SDK_VERSION", eventTypeEnum) + .build()); if (!outputOperations.isEmpty()) { CodeBlock unknownInitializer = buildUnknownEventStreamInitializer(outputOperations, @@ -184,6 +194,11 @@ private TypeSpec eventStreamInterfaceSpec() { + "in any request or response shape"); } + private void addEventSupport(TypeSpec.Builder specBuilder) { + EventStreamUtils.getBaseEventStreamShapes(intermediateModel, shapeModel) + .forEach(eventStream -> addEventSupport(specBuilder, eventStream)); + } + private void addEventSupport(TypeSpec.Builder specBuilder, ShapeModel eventStream) { ClassName eventStreamClassName = poetExtensions.getModelClassFromShape(eventStream); Collection opModels = EventStreamUtils.findOperationsWithEventStream(intermediateModel, @@ -203,6 +218,22 @@ private void addEventSupport(TypeSpec.Builder specBuilder, ShapeModel eventStrea specBuilder.addSuperinterface(eventStreamClassName); + boolean usesLegacyScheme = useLegacyEventGenerationScheme(eventStream); + Optional legacyEvent = findLegacyGenerationEventWithShape(eventStream); + + if (usesLegacyScheme && legacyEvent.isPresent()) { + NamingStrategy namingStrategy = intermediateModel.getNamingStrategy(); + ClassName eventTypeEnum = helper.eventTypeEnumClassName(); + specBuilder.addMethod(MethodSpec.methodBuilder("sdkEventType") + .addAnnotation(Override.class) + .addModifiers(PUBLIC) + .returns(eventTypeEnum) + .addStatement("return $T.$N", + eventTypeEnum, + namingStrategy.getEnumValueName(legacyEvent.get().getName())) + .build()); + } + if (onOutput) { ClassName modelClass = poetExtensions.getModelClass(shapeModel.getShapeName()); for (OperationModel opModel : outputOperations) { @@ -211,19 +242,6 @@ private void addEventSupport(TypeSpec.Builder specBuilder, ShapeModel eventStrea MethodSpec.Builder acceptMethodSpec = acceptMethodSpec(modelClass, responseHandlerClass) .addAnnotation(Override.class); - // This is hacky, but there's no better solution without - // extensive refactoring. We basically need to know if any of - // the *event types* within this even stream have this - // customization enabled, which requires knowing the - // MemberModel that has this given shape. - boolean usesLegacyScheme = false; - for (MemberModel member : eventStream.getMembers()) { - if (member.getShape().equals(shapeModel) && helper.useLegacyGenerationScheme(member)) { - usesLegacyScheme = true; - break; - } - } - if (usesLegacyScheme) { acceptMethodSpec.addStatement("visitor.visit(this)"); } else { @@ -681,7 +699,9 @@ private MethodSpec eventBuilderMethod(MemberModel event) { returnType = baseClass.nestedClass("Builder"); } - String methodName = String.format("%sBuilder", StringUtils.uncapitalize(event.getName())); + String eventClass = intermediateModel.getNamingStrategy().getShapeClassName(event.getName()); + String methodName = String.format("%sBuilder", StringUtils.uncapitalize(eventClass)); + return MethodSpec.methodBuilder(methodName) .addModifiers(PUBLIC, Modifier.STATIC) .returns(returnType) @@ -699,4 +719,29 @@ private List addModifier(List specs, Modifier modifier) private MethodSpec addModifier(MethodSpec spec, Modifier modifier) { return spec.toBuilder().addModifiers(modifier).build(); } + + private boolean useLegacyEventGenerationScheme(ShapeModel eventStream) { + EventStreamSpecHelper helper = new EventStreamSpecHelper(eventStream, intermediateModel); + // This is hacky, but there's no better solution without + // extensive refactoring. We basically need to know if any of + // the *event types* within this even stream have this + // customization enabled, which requires knowing the + // MemberModel that has this given shape. + for (MemberModel member : eventStream.getMembers()) { + if (member.getShape().equals(shapeModel) && helper.useLegacyGenerationScheme(member)) { + return true; + } + } + return false; + } + + private Optional findLegacyGenerationEventWithShape(ShapeModel eventStream) { + EventStreamSpecHelper helper = new EventStreamSpecHelper(eventStream, intermediateModel); + for (MemberModel member : eventStream.getMembers()) { + if (member.getShape().equals(shapeModel) && helper.useLegacyGenerationScheme(member)) { + return Optional.ofNullable(member); + } + } + return Optional.empty(); + } } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventModelSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventModelSpec.java index 54d27f7adb5b..9b5ad180cddb 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventModelSpec.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventModelSpec.java @@ -72,13 +72,14 @@ public TypeSpec poetSpec() { .addMethod(toBuilderMethod()) .addMethod(builderMethod()) .addMethods(acceptMethods()) + .addMethod(sdkEventTypeMethodSpec()) .addTypes(Arrays.asList(builderSpecs.builderInterface(), builderSpecs.beanStyleBuilder())) .build(); } private CodeBlock classJavadoc() { return CodeBlock.builder() - .add("A specialization of {@code $L} that represents the {@code $L#$L} event. Do not use this class " + + .add("A specialization of {@code $L} that represents the {@code $L$$$L} event. Do not use this class " + "directly. Instead, use the static builder methods on {@link $L}.", baseShapeModelSpec.className().canonicalName(), eventStream.getC2jName(), eventModel.getC2jName(), poetExtensions.getModelClass(eventStream.getShapeName())) @@ -151,4 +152,15 @@ private MethodSpec acceptMethodSpec(ClassName responseHandlerClass) { .addStatement("visitor.$N(this)", visitMethodName) .build(); } + + private MethodSpec sdkEventTypeMethodSpec() { + ClassName eventTypeEnumClass = eventStreamSpecHelper.eventTypeEnumClassName(); + String eventTypeValue = eventStreamSpecHelper.eventTypeEnumValue(eventModel); + return MethodSpec.methodBuilder("sdkEventType") + .addAnnotation(Override.class) + .addModifiers(PUBLIC) + .returns(eventTypeEnumClass) + .addStatement("return $T.$N", eventTypeEnumClass, eventTypeValue) + .build(); + } } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventStreamSpecHelper.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventStreamSpecHelper.java index cef21a138c28..f260357ba90d 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventStreamSpecHelper.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventStreamSpecHelper.java @@ -15,14 +15,20 @@ package software.amazon.awssdk.codegen.poet.model; +import static javax.lang.model.element.Modifier.PUBLIC; + import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.TypeSpec; import java.util.List; import java.util.Locale; import java.util.Map; +import javax.lang.model.element.Modifier; import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; import software.amazon.awssdk.codegen.model.intermediate.MemberModel; import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.naming.NamingStrategy; import software.amazon.awssdk.codegen.poet.PoetExtensions; +import software.amazon.awssdk.codegen.poet.eventstream.EventTypeEnumSpec; import software.amazon.awssdk.utils.internal.CodegenNamingUtils; public final class EventStreamSpecHelper { @@ -65,7 +71,24 @@ public ClassName eventClassName(MemberModel eventModel) { if (useLegacyGenerationScheme(eventModel)) { return poetExtensions.getModelClass(eventModel.getShape().getShapeName()); } - String simpleName = "Default" + CodegenNamingUtils.pascalCase(eventModel.getName()); + String simpleName = "Default" + intermediateModel.getNamingStrategy().getShapeClassName(eventModel.getName()); return ClassName.get(eventPackageName(), simpleName); } + + public ClassName eventTypeEnumClassName() { + return poetExtensions.getModelClass(eventStream.getShapeName()).nestedClass("EventType"); + } + + public TypeSpec eventTypeEnumSpec() { + return new EventTypeEnumSpec("", intermediateModel, eventStream) + .poetSpec() + .toBuilder() + .addModifiers(PUBLIC, Modifier.STATIC) + .build(); + } + + public String eventTypeEnumValue(MemberModel eventModel) { + NamingStrategy namingStrategy = intermediateModel.getNamingStrategy(); + return namingStrategy.getEnumValueName(eventModel.getName()); + } } diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/eventstream/EventModelSpecTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/eventstream/EventModelSpecTest.java index 8a30f15bfede..2b9312f442f2 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/eventstream/EventModelSpecTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/eventstream/EventModelSpecTest.java @@ -54,7 +54,8 @@ public void basicGeneration() { } private String referenceFileForShape() { - String fileName = "default" + event.getName().toLowerCase(Locale.ENGLISH) + ".java"; + String className = "Default" + intermediateModel.getNamingStrategy().getShapeClassName(event.getName()); + String fileName = className.toLowerCase(Locale.ENGLISH) + ".java"; return "/software/amazon/awssdk/codegen/poet/eventstream/" + fileName; } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/common/test-enum-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/common/test-enum-class.java index 4e84347f39f4..7cee8ad38cc6 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/common/test-enum-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/common/test-enum-class.java @@ -1,8 +1,7 @@ package software.amazon.awssdk.codegen.poet.common.model; -import static java.util.stream.Collectors.toSet; - import java.util.Set; +import java.util.stream.Collectors; import java.util.stream.Stream; import software.amazon.awssdk.annotations.Generated; @@ -39,16 +38,18 @@ public static TestEnumClass fromValue(String value) { if (value == null) { return null; } - return Stream.of(TestEnumClass.values()).filter(e -> e.toString().equals(value)).findFirst().orElse(UNKNOWN_TO_SDK_VERSION); + return Stream.of(TestEnumClass.values()).filter(e -> e.toString().equals(value)).findFirst() + .orElse(UNKNOWN_TO_SDK_VERSION); } /** - * Use this in place of {@link #values()} to return a {@link Set} of all values known to the SDK. - * This will return all known enum values except {@link #UNKNOWN_TO_SDK_VERSION}. + * Use this in place of {@link #values()} to return a {@link Set} of all values known to the SDK. This will return + * all known enum values except {@link #UNKNOWN_TO_SDK_VERSION}. * * @return a {@link Set} of known {@link TestEnumClass}s */ public static Set knownValues() { - return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(toSet()); + return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(Collectors.toSet()); } } + diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/customization.config b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/customization.config index 21b15d9542cb..2c63c0851048 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/customization.config +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/customization.config @@ -1,3 +1,2 @@ { - "underscoresInNameBehavior": "ALLOW" } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventone.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventone.java index b86198969b59..aeb554622792 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventone.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventone.java @@ -1,14 +1,16 @@ -package software.amazon.awssdk.services.jsonprotocoltests.model.eventstream; +package software.amazon.awssdk.services.json.model.eventstream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventOne; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventStreamOperationResponseHandler; +import software.amazon.awssdk.services.json.model.EventOne; +import software.amazon.awssdk.services.json.model.EventStream; +import software.amazon.awssdk.services.json.model.EventStreamOperationResponseHandler; +import software.amazon.awssdk.services.json.model.EventStreamOperationWithOnlyOutputResponseHandler; /** - * A specialization of {@code software.amazon.awssdk.services.jsonprotocoltests.model.EventOne} that represents the - * {@code EventStream#EventOne} event. Do not use this class directly. Instead, use the static builder methods on - * {@link software.amazon.awssdk.services.jsonprotocoltests.model.EventStream}. + * A specialization of {@code software.amazon.awssdk.services.json.model.EventOne} that represents the + * {@code EventStream$EventOne} event. Do not use this class directly. Instead, use the static builder methods on + * {@link software.amazon.awssdk.services.json.model.EventStream}. */ @SdkInternalApi @Generated("software.amazon.awssdk:codegen") @@ -33,6 +35,16 @@ public void accept(EventStreamOperationResponseHandler.Visitor visitor) { visitor.visitEventOne(this); } + @Override + public void accept(EventStreamOperationWithOnlyOutputResponseHandler.Visitor visitor) { + visitor.visitEventOne(this); + } + + @Override + public EventStream.EventType sdkEventType() { + return EventStream.EventType.EVENT_ONE; + } + public interface Builder extends EventOne.Builder { @Override DefaultEventOne build(); diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventtwo.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventtwo.java index 30ca72638ee5..3cff922db221 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventtwo.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaulteventtwo.java @@ -1,14 +1,16 @@ -package software.amazon.awssdk.services.jsonprotocoltests.model.eventstream; +package software.amazon.awssdk.services.json.model.eventstream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventStreamOperationResponseHandler; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventTwo; +import software.amazon.awssdk.services.json.model.EventStream; +import software.amazon.awssdk.services.json.model.EventStreamOperationResponseHandler; +import software.amazon.awssdk.services.json.model.EventStreamOperationWithOnlyOutputResponseHandler; +import software.amazon.awssdk.services.json.model.EventTwo; /** - * A specialization of {@code software.amazon.awssdk.services.jsonprotocoltests.model.EventTwo} that represents the - * {@code EventStream#EventTwo} event. Do not use this class directly. Instead, use the static builder methods on - * {@link software.amazon.awssdk.services.jsonprotocoltests.model.EventStream}. + * A specialization of {@code software.amazon.awssdk.services.json.model.EventTwo} that represents the + * {@code EventStream$EventTwo} event. Do not use this class directly. Instead, use the static builder methods on + * {@link software.amazon.awssdk.services.json.model.EventStream}. */ @SdkInternalApi @Generated("software.amazon.awssdk:codegen") @@ -33,6 +35,16 @@ public void accept(EventStreamOperationResponseHandler.Visitor visitor) { visitor.visitEventTwo(this); } + @Override + public void accept(EventStreamOperationWithOnlyOutputResponseHandler.Visitor visitor) { + visitor.visitEventTwo(this); + } + + @Override + public EventStream.EventType sdkEventType() { + return EventStream.EventType.EVENT_TWO; + } + public interface Builder extends EventTwo.Builder { @Override DefaultEventTwo build(); diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputevent.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputevent.java index 05996a2d8a1e..561229209981 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputevent.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputevent.java @@ -1,13 +1,14 @@ -package software.amazon.awssdk.services.jsonprotocoltests.model.inputeventstream; +package software.amazon.awssdk.services.json.model.inputeventstream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.services.jsonprotocoltests.model.InputEvent; +import software.amazon.awssdk.services.json.model.InputEvent; +import software.amazon.awssdk.services.json.model.InputEventStream; /** - * A specialization of {@code software.amazon.awssdk.services.jsonprotocoltests.model.InputEvent} that represents the - * {@code InputEventStream#InputEvent} event. Do not use this class directly. Instead, use the static builder methods on - * {@link software.amazon.awssdk.services.jsonprotocoltests.model.InputEventStream}. + * A specialization of {@code software.amazon.awssdk.services.json.model.InputEvent} that represents the + * {@code InputEventStream$InputEvent} event. Do not use this class directly. Instead, use the static builder methods on + * {@link software.amazon.awssdk.services.json.model.InputEventStream}. */ @SdkInternalApi @Generated("software.amazon.awssdk:codegen") @@ -27,6 +28,11 @@ public static Builder builder() { return new BuilderImpl(); } + @Override + public InputEventStream.EventType sdkEventType() { + return InputEventStream.EventType.INPUT_EVENT; + } + public interface Builder extends InputEvent.Builder { @Override DefaultInputEvent build(); 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 new file mode 100644 index 000000000000..a7aa376fa3f1 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventone.java @@ -0,0 +1,55 @@ +package software.amazon.awssdk.services.json.model.inputeventstreamtwo; + +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.InputEventStreamTwo; + +/** + * A specialization of {@code software.amazon.awssdk.services.json.model.InputEvent} 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 { + private static final long serialVersionUID = 1L; + + DefaultInputEventOne(BuilderImpl builderImpl) { + super(builderImpl); + } + + @Override + public Builder toBuilder() { + return new BuilderImpl(this); + } + + public static Builder builder() { + return new BuilderImpl(); + } + + @Override + public InputEventStreamTwo.EventType sdkEventType() { + return InputEventStreamTwo.EventType.INPUT_EVENT_ONE; + } + + public interface Builder extends InputEvent.Builder { + @Override + DefaultInputEventOne build(); + } + + private static final class BuilderImpl extends InputEvent.BuilderImpl implements Builder { + private BuilderImpl() { + } + + private BuilderImpl(DefaultInputEventOne event) { + super(event); + } + + @Override + public DefaultInputEventOne build() { + return new DefaultInputEventOne(this); + } + } +} + diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventtwo.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventtwo.java index bf65c08f3330..a35652e15407 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventtwo.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultinputeventtwo.java @@ -1,13 +1,14 @@ -package software.amazon.awssdk.services.jsonprotocoltests.model.inputeventstreamtwo; +package software.amazon.awssdk.services.json.model.inputeventstreamtwo; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.services.jsonprotocoltests.model.InputEventTwo; +import software.amazon.awssdk.services.json.model.InputEventStreamTwo; +import software.amazon.awssdk.services.json.model.InputEventTwo; /** - * A specialization of {@code software.amazon.awssdk.services.jsonprotocoltests.model.InputEventTwo} that represents the - * {@code InputEventStreamTwo#InputEventTwo} event. Do not use this class directly. Instead, use the static builder - * methods on {@link software.amazon.awssdk.services.jsonprotocoltests.model.InputEventStreamTwo}. + * A specialization of {@code software.amazon.awssdk.services.json.model.InputEventTwo} that represents the + * {@code InputEventStreamTwo$InputEventTwo} 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") @@ -27,6 +28,11 @@ public static Builder builder() { return new BuilderImpl(); } + @Override + public InputEventStreamTwo.EventType sdkEventType() { + return InputEventStreamTwo.EventType.INPUT_EVENT_TWO; + } + public interface Builder extends InputEventTwo.Builder { @Override DefaultInputEventTwo build(); diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventone.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventone.java index b9840b62c139..9cead3553735 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventone.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventone.java @@ -1,14 +1,16 @@ -package software.amazon.awssdk.services.jsonprotocoltests.model.eventstream; +package software.amazon.awssdk.services.json.model.eventstream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventOne; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventStreamOperationResponseHandler; +import software.amazon.awssdk.services.json.model.EventOne; +import software.amazon.awssdk.services.json.model.EventStream; +import software.amazon.awssdk.services.json.model.EventStreamOperationResponseHandler; +import software.amazon.awssdk.services.json.model.EventStreamOperationWithOnlyOutputResponseHandler; /** - * A specialization of {@code software.amazon.awssdk.services.jsonprotocoltests.model.EventOne} that represents the - * {@code EventStream#SecondEventOne} event. Do not use this class directly. Instead, use the static builder methods on - * {@link software.amazon.awssdk.services.jsonprotocoltests.model.EventStream}. + * A specialization of {@code software.amazon.awssdk.services.json.model.EventOne} that represents the + * {@code EventStream$secondEventOne} event. Do not use this class directly. Instead, use the static builder methods on + * {@link software.amazon.awssdk.services.json.model.EventStream}. */ @SdkInternalApi @Generated("software.amazon.awssdk:codegen") @@ -33,6 +35,16 @@ public void accept(EventStreamOperationResponseHandler.Visitor visitor) { visitor.visitSecondEventOne(this); } + @Override + public void accept(EventStreamOperationWithOnlyOutputResponseHandler.Visitor visitor) { + visitor.visitSecondEventOne(this); + } + + @Override + public EventStream.EventType sdkEventType() { + return EventStream.EventType.SECOND_EVENT_ONE; + } + public interface Builder extends EventOne.Builder { @Override DefaultSecondEventOne build(); diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventtwo.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventtwo.java index c30a8e5265ba..c64a196101c0 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventtwo.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/defaultsecondeventtwo.java @@ -1,21 +1,23 @@ -package software.amazon.awssdk.services.jsonprotocoltests.model.eventstream; +package software.amazon.awssdk.services.json.model.eventstream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventStreamOperationResponseHandler; -import software.amazon.awssdk.services.jsonprotocoltests.model.EventTwo; +import software.amazon.awssdk.services.json.model.EventStream; +import software.amazon.awssdk.services.json.model.EventStreamOperationResponseHandler; +import software.amazon.awssdk.services.json.model.EventStreamOperationWithOnlyOutputResponseHandler; +import software.amazon.awssdk.services.json.model.EventTwo; /** - * A specialization of {@code software.amazon.awssdk.services.jsonprotocoltests.model.EventTwo} that represents the - * {@code EventStream#SecondEventTwo} event. Do not use this class directly. Instead, use the static builder methods on - * {@link software.amazon.awssdk.services.jsonprotocoltests.model.EventStream}. + * A specialization of {@code software.amazon.awssdk.services.json.model.EventTwo} that represents the + * {@code EventStream$secondeventtwo} event. Do not use this class directly. Instead, use the static builder methods on + * {@link software.amazon.awssdk.services.json.model.EventStream}. */ @SdkInternalApi @Generated("software.amazon.awssdk:codegen") -public final class DefaultSecondEventTwo extends EventTwo { +public final class DefaultSecondeventtwo extends EventTwo { private static final long serialVersionUID = 1L; - DefaultSecondEventTwo(BuilderImpl builderImpl) { + DefaultSecondeventtwo(BuilderImpl builderImpl) { super(builderImpl); } @@ -30,25 +32,35 @@ public static Builder builder() { @Override public void accept(EventStreamOperationResponseHandler.Visitor visitor) { - visitor.visitSecondEventTwo(this); + visitor.visitSecondeventtwo(this); + } + + @Override + public void accept(EventStreamOperationWithOnlyOutputResponseHandler.Visitor visitor) { + visitor.visitSecondeventtwo(this); + } + + @Override + public EventStream.EventType sdkEventType() { + return EventStream.EventType.SECONDEVENTTWO; } public interface Builder extends EventTwo.Builder { @Override - DefaultSecondEventTwo build(); + DefaultSecondeventtwo build(); } private static final class BuilderImpl extends EventTwo.BuilderImpl implements Builder { private BuilderImpl() { } - private BuilderImpl(DefaultSecondEventTwo event) { + private BuilderImpl(DefaultSecondeventtwo event) { super(event); } @Override - public DefaultSecondEventTwo build() { - return new DefaultSecondEventTwo(this); + public DefaultSecondeventtwo build() { + return new DefaultSecondeventtwo(this); } } } 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 9d013117fcad..5d8c43c448a7 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 @@ -13,128 +13,6 @@ "xmlNamespace": "https://json-service.amazonaws.com/doc/2010-05-08/" }, "operations": { - "APostOperation": { - "name": "APostOperation", - "http": { - "method": "POST", - "requestUri": "/" - }, - "endpoint": { - "hostPrefix": "{StringMember}-foo." - }, - "input": { - "shape": "APostOperationRequest" - }, - "errors": [ - { - "shape": "InvalidInputException" - } - ], - "documentation": "

Performs a post operation to the query service and has no output

" - }, - "GetWithoutRequiredMembers": { - "name": "GetWithoutRequiredMembers", - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "GetWithoutRequiredMembersRequest" - }, - "errors": [ - { - "shape": "InvalidInputException" - } - ], - "documentation": "

Performs a post operation to the query service and has no output

" - }, - "APostOperationWithOutput": { - "name": "APostOperation", - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "APostOperationWithOutputRequest" - }, - "output": { - "shape": "APostOperationWithOutputResponse", - "resultWrapper": "APostOperationWithOutputResult" - }, - "errors": [ - { - "shape": "InvalidInputException" - } - ], - "documentation": "

Performs a post operation to the query service and has modelled output

" - }, - "StreamingInputOperation": { - "name": "StreamingInputOperation", - "http": { - "method": "POST", - "requestUri": "/2016-03-11/streamingInputOperation" - }, - "input": { - "shape": "StructureWithStreamingMember" - }, - "documentation": "Some operation with a streaming input" - }, - "StreamingOutputOperation": { - "name": "StreamingOutputOperation", - "http": { - "method": "POST", - "requestUri": "/2016-03-11/streamingOutputOperation" - }, - "output": { - "shape": "StructureWithStreamingMember" - }, - "documentation": "Some operation with a streaming output" - }, - "StreamingInputOutputOperation": { - "name": "StreamingInputOutputOperation", - "http": { - "method": "POST", - "requestUri": "/2016-03-11/streamingInputOutputOperation" - }, - "input": { - "shape": "StructureWithStreamingMember" - }, - "output": { - "shape": "StructureWithStreamingMember" - }, - "documentation": "Some operation with streaming input and streaming output", - "authtype":"v4-unsigned-body" - }, - "PaginatedOperationWithResultKey": { - "name": "PaginatedOperationWithResultKey", - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "PaginatedOperationWithResultKeyRequest" - }, - "output": { - "shape": "PaginatedOperationWithResultKeyResponse", - "resultWrapper": "PaginatedOperationWithResultKeyResult" - }, - "documentation": "Some paginated operation with result_key in paginators.json file" - }, - "PaginatedOperationWithoutResultKey": { - "name": "PaginatedOperationWithoutResultKey", - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "PaginatedOperationWithoutResultKeyRequest" - }, - "output": { - "shape": "PaginatedOperationWithoutResultKeyResponse", - "resultWrapper": "PaginatedOperationWithoutResultKeyResult" - }, - "documentation": "Some paginated operation without result_key in paginators.json file" - }, "EventStreamOperation": { "name": "EventStreamOperation", "http": { @@ -170,191 +48,6 @@ } }, "shapes": { - "APostOperationRequest": { - "type": "structure", - "required": [ - "SomeNestedMember", - "StringMember" - ], - "members": { - "SomeNestedMember": { - "shape": "nestedMember", - "documentation": "

a member that has nested members

" - }, - "OptionalMember": { - "shape": "dateType", - "documentation": "

An optional member

" - }, - "StringMember": { - "shape": "String", - "hostLabel": true, - "documentation": "

Member to compute the endpoint host

" - } - } - }, - "GetWithoutRequiredMembersRequest": { - "type": "structure", - "members": { - "SomeNestedMember": { - "shape": "nestedMember", - "documentation": "

a member that has nested members

" - }, - "OptionalMember": { - "shape": "dateType", - "documentation": "

An optional member

" - } - } - }, - "APostOperationWithOutputRequest": { - "type": "structure", - "required": [ - "SomeNestedMember" - ], - "members": { - "SomeNestedMember": { - "shape": "nestedMember", - "documentation": "

a member that has nested members

" - }, - "OptionalMember": { - "shape": "dateType", - "documentation": "

An optional member

" - } - } - }, - "APostOperationWithOutputResponse": { - "type": "structure", - "required": [ - "NestedMember" - ], - "members": { - "NestedMember": { - "shape": "nestedMember", - "documentation": "

A structure containing nested members

" - } - }, - "documentation": "

Contains the response to a successful APostOperationWithOutput request.

" - }, - "InvalidInputException": { - "type": "structure", - "members": { - "message": { - "shape": "invalidInputMessage" - } - }, - "documentation": "

The request was rejected because an invalid or out-of-range value was supplied for an input parameter.

", - "error": { - "code": "InvalidInput", - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "nestedMember": { - "type": "structure", - "required": [ - "SubMember", - "CreateDate" - ], - "members": { - "SubMember": { - "shape": "subMember", - "documentation": "

A sub-member

" - }, - "CreateDate": { - "shape": "dateType", - "documentation": "

The date and time, in ISO 8601 date-time format, when the member was created.

" - } - }, - "documentation": "

A shape with nested sub-members" - }, - "subMember": { - "type": "string", - "max": 63, - "min": 3, - "pattern": "^[a-z0-9](([a-z0-9]|-(?!-))*[a-z0-9])?$" - }, - "dateType": { - "type": "timestamp" - }, - "String": { - "type": "string" - }, - "invalidInputMessage": { - "type": "string" - }, - "StreamType": { - "type": "blob", - "streaming": true - }, - "StructureWithStreamingMember": { - "type": "structure", - "members": { - "StreamingMember": { - "shape": "StreamType", - "documentation": "This be a stream" - } - }, - "payload": "StreamingMember" - }, - "PaginatedOperationWithResultKeyRequest": { - "type": "structure", - "members": { - "NextToken": { - "shape": "subMember", - "documentation": "

Token for the next set of results

" - }, - "MaxResults": { - "shape": "subMember", - "documentation": "

Maximum number of results in a single page

" - } - } - }, - "PaginatedOperationWithResultKeyResponse": { - "type": "structure", - "members": { - "NextToken": { - "shape": "subMember", - "documentation": "

Token for the next set of results

" - }, - "Items": { - "shape": "ItemsList", - "documentation": "

Maximum number of results in a single page

" - } - }, - "documentation": "

Response type of a single page

" - }, - "ItemsList": { - "type": "list", - "member": { - "shape": "subMember" - } - }, - "PaginatedOperationWithoutResultKeyRequest": { - "type": "structure", - "required": [ - "NextToken" - ], - "members": { - "NextToken": { - "shape": "subMember", - "documentation": "

Token for the next set of results

" - }, - "MaxResults": { - "shape": "subMember", - "documentation": "

Maximum number of results in a single page

" - } - } - }, - "PaginatedOperationWithoutResultKeyResponse": { - "type": "structure", - "members": { - "NextToken": { - "shape": "subMember", - "documentation": "

Token for the next set of results

" - } - }, - "documentation": "

Response type of a single page

" - }, "EventStreamOperationRequest": { "type": "structure", "required": [ @@ -404,16 +97,13 @@ "EventOne": { "shape": "EventOne" }, - "event_two": { + "EventTwo": { "shape": "EventTwo" }, "secondEventOne": { "shape": "EventOne" }, - "second_event_two": { - "shape": "EventTwo" - }, - "third_event_two_customizedVisitMethod": { + "secondeventtwo": { "shape": "EventTwo" } }, @@ -476,7 +166,10 @@ }, "event": true }, - "ImplicitPayloadMemberOne":{"type":"blob"} + "ImplicitPayloadMemberOne":{"type":"blob"}, + "String": { + "type": "string" + } }, "documentation": "A service that is implemented using the query protocol" } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler-builder.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler-builder.java index 74a5786efd18..69698848f30b 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler-builder.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler-builder.java @@ -30,3 +30,4 @@ private Impl(DefaultEventStreamOperationResponseHandlerBuilder builder) { } } } + diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler.java index d6c803f01250..076be5e01271 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler.java @@ -92,7 +92,7 @@ default void visit(EventOne event) { * @param event * Event being visited */ - default void visit(EventTwo event) { + default void visitEventTheSecond(EventTwo event) { visitDefault(event); } @@ -107,17 +107,6 @@ default void visitSecondEventOne(EventOne event) { visitDefault(event); } - /** - * Invoked when a {@link EventTwo} is encountered. If this is not overridden, the event will be given to - * {@link #visitDefault(EventStream)}. - * - * @param event - * Event being visited - */ - default void visitSecondEventTwo(EventTwo event) { - visitDefault(event); - } - /** * Builder for {@link Visitor}. The {@link Visitor} class may also be extended for a more traditional style but * this builder allows for a more functional way of creating a visitor will callback methods. @@ -154,7 +143,7 @@ interface Builder { * Callback to process the event. * @return This builder for method chaining. */ - Builder onEventTwo(Consumer c); + Builder onEventTheSecond(Consumer c); /** * Callback to invoke when a {@link EventOne} is visited. @@ -164,15 +153,6 @@ interface Builder { * @return This builder for method chaining. */ Builder onSecondEventOne(Consumer c); - - /** - * Callback to invoke when a {@link EventTwo} is visited. - * - * @param c - * Callback to process the event. - * @return This builder for method chaining. - */ - Builder onSecondEventTwo(Consumer c); } } } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-visitor-builder.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-visitor-builder.java index 14bb7235c0c8..8006f121be83 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-visitor-builder.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-visitor-builder.java @@ -11,12 +11,10 @@ final class DefaultEventStreamOperationVisitorBuilder implements EventStreamOper private Consumer onEventOne; - private Consumer onEventTwo; + private Consumer onEventTheSecond; private Consumer onSecondEventOne; - private Consumer onSecondEventTwo; - @Override public EventStreamOperationResponseHandler.Visitor.Builder onDefault(Consumer c) { this.onDefault = c; @@ -35,8 +33,8 @@ public EventStreamOperationResponseHandler.Visitor.Builder onEventOne(Consumer c) { - this.onEventTwo = c; + public EventStreamOperationResponseHandler.Visitor.Builder onEventTheSecond(Consumer c) { + this.onEventTheSecond = c; return this; } @@ -46,35 +44,25 @@ public EventStreamOperationResponseHandler.Visitor.Builder onSecondEventOne(Cons return this; } - @Override - public EventStreamOperationResponseHandler.Visitor.Builder onSecondEventTwo(Consumer c) { - this.onSecondEventTwo = c; - return this; - } - @Generated("software.amazon.awssdk:codegen") static class VisitorFromBuilder implements EventStreamOperationResponseHandler.Visitor { private final Consumer onDefault; private final Consumer onEventOne; - private final Consumer onEventTwo; + private final Consumer onEventTheSecond; private final Consumer onSecondEventOne; - private final Consumer onSecondEventTwo; - VisitorFromBuilder(DefaultEventStreamOperationVisitorBuilder builder) { this.onDefault = builder.onDefault != null ? builder.onDefault : EventStreamOperationResponseHandler.Visitor.super::visitDefault; this.onEventOne = builder.onEventOne != null ? builder.onEventOne : EventStreamOperationResponseHandler.Visitor.super::visit; - this.onEventTwo = builder.onEventTwo != null ? builder.onEventTwo - : EventStreamOperationResponseHandler.Visitor.super::visit; + this.onEventTheSecond = builder.onEventTheSecond != null ? builder.onEventTheSecond + : EventStreamOperationResponseHandler.Visitor.super::visitEventTheSecond; this.onSecondEventOne = builder.onSecondEventOne != null ? builder.onSecondEventOne : EventStreamOperationResponseHandler.Visitor.super::visitSecondEventOne; - this.onSecondEventTwo = builder.onSecondEventTwo != null ? builder.onSecondEventTwo - : EventStreamOperationResponseHandler.Visitor.super::visitSecondEventTwo; } @Override @@ -88,19 +76,14 @@ public void visit(EventOne event) { } @Override - public void visit(EventTwo event) { - onEventTwo.accept(event); + public void visitEventTheSecond(EventTwo event) { + onEventTheSecond.accept(event); } @Override public void visitSecondEventOne(EventOne event) { onSecondEventOne.accept(event); } - - @Override - public void visitSecondEventTwo(EventTwo event) { - onSecondEventTwo.accept(event); - } } } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/eventstream.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/eventstream.java index 4f08c685d9e9..2eccc9546a7d 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/eventstream.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/eventstream.java @@ -2,12 +2,16 @@ import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.SdkField; import software.amazon.awssdk.core.SdkPojo; import software.amazon.awssdk.services.jsonprotocoltests.model.eventstream.DefaultEventOne; import software.amazon.awssdk.services.jsonprotocoltests.model.eventstream.DefaultEventTwo; +import software.amazon.awssdk.services.jsonprotocoltests.model.eventstream.DefaultEventthree; import software.amazon.awssdk.services.jsonprotocoltests.model.eventstream.DefaultSecondEventOne; import software.amazon.awssdk.services.jsonprotocoltests.model.eventstream.DefaultSecondEventTwo; @@ -60,6 +64,20 @@ static EventTwo.Builder secondEventTwoBuilder() { return DefaultSecondEventTwo.builder(); } + /** + * Create a builder for the {@code eventthree} event type for this stream. + */ + static EventTwo.Builder eventthreeBuilder() { + return DefaultEventthree.builder(); + } + + /** + * The type of this event. Corresponds to the {@code :event-type} header on the Message. + */ + default EventType sdkEventType() { + return EventType.UNKNOWN_TO_SDK_VERSION; + } + /** * Calls the appropriate visit method depending on the subtype of {@link EventStream}. * @@ -67,5 +85,59 @@ static EventTwo.Builder secondEventTwoBuilder() { * Visitor to invoke. */ void accept(EventStreamOperationResponseHandler.Visitor visitor); + + /** + * The known possible types of events for {@code EventStream}. + */ + @Generated("software.amazon.awssdk:codegen") + enum EventType { + EVENT_ONE("EventOne"), + + SECOND_EVENT_ONE("SecondEventOne"), + + EVENT_TWO("EventTwo"), + + SECOND_EVENT_TWO("SecondEventTwo"), + + EVENTTHREE("eventthree"), + + UNKNOWN_TO_SDK_VERSION(null); + + private final String value; + + private EventType(String value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + /** + * Use this in place of valueOf to convert the raw string returned by the service into the enum value. + * + * @param value + * real value + * @return EventType corresponding to the value + */ + public static EventType fromValue(String value) { + if (value == null) { + return null; + } + return Stream.of(EventType.values()).filter(e -> e.toString().equals(value)).findFirst() + .orElse(UNKNOWN_TO_SDK_VERSION); + } + + /** + * Use this in place of {@link #values()} to return a {@link Set} of all values known to the SDK. This will + * return all known enum values except {@link #UNKNOWN_TO_SDK_VERSION}. + * + * @return a {@link Set} of known {@link EventType}s + */ + public static Set knownValues() { + return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(Collectors.toSet()); + } + } } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstream.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstream.java index 80fca79c17f3..fb675ed1dc5a 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstream.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstream.java @@ -1,5 +1,8 @@ package software.amazon.awssdk.services.jsonprotocoltests.model; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.services.jsonprotocoltests.model.inputeventstream.DefaultInputEvent; @@ -16,5 +19,58 @@ public interface InputEventStream { static InputEvent.Builder inputEventBuilder() { return DefaultInputEvent.builder(); } + + /** + * The type of this event. Corresponds to the {@code :event-type} header on the Message. + */ + default EventType sdkEventType() { + return EventType.UNKNOWN_TO_SDK_VERSION; + } + + /** + * The known possible types of events for {@code InputEventStream}. + */ + @Generated("software.amazon.awssdk:codegen") + enum EventType { + INPUT_EVENT("InputEvent"), + + UNKNOWN_TO_SDK_VERSION(null); + + private final String value; + + private EventType(String value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + /** + * Use this in place of valueOf to convert the raw string returned by the service into the enum value. + * + * @param value + * real value + * @return EventType corresponding to the value + */ + public static EventType fromValue(String value) { + if (value == null) { + return null; + } + return Stream.of(EventType.values()).filter(e -> e.toString().equals(value)).findFirst() + .orElse(UNKNOWN_TO_SDK_VERSION); + } + + /** + * Use this in place of {@link #values()} to return a {@link Set} of all values known to the SDK. This will + * return all known enum values except {@link #UNKNOWN_TO_SDK_VERSION}. + * + * @return a {@link Set} of known {@link EventType}s + */ + public static Set knownValues() { + return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(Collectors.toSet()); + } + } } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstreamtwo.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstreamtwo.java index 8bc0a81c1614..8cb34dbcffb8 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstreamtwo.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/inputeventstreamtwo.java @@ -1,5 +1,8 @@ package software.amazon.awssdk.services.jsonprotocoltests.model; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.services.jsonprotocoltests.model.inputeventstreamtwo.DefaultInputEventTwo; @@ -16,5 +19,58 @@ public interface InputEventStreamTwo { static InputEventTwo.Builder inputEventTwoBuilder() { return DefaultInputEventTwo.builder(); } + + /** + * The type of this event. Corresponds to the {@code :event-type} header on the Message. + */ + default EventType sdkEventType() { + return EventType.UNKNOWN_TO_SDK_VERSION; + } + + /** + * The known possible types of events for {@code InputEventStreamTwo}. + */ + @Generated("software.amazon.awssdk:codegen") + enum EventType { + INPUT_EVENT_TWO("InputEventTwo"), + + UNKNOWN_TO_SDK_VERSION(null); + + private final String value; + + private EventType(String value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + /** + * Use this in place of valueOf to convert the raw string returned by the service into the enum value. + * + * @param value + * real value + * @return EventType corresponding to the value + */ + public static EventType fromValue(String value) { + if (value == null) { + return null; + } + return Stream.of(EventType.values()).filter(e -> e.toString().equals(value)).findFirst() + .orElse(UNKNOWN_TO_SDK_VERSION); + } + + /** + * Use this in place of {@link #values()} to return a {@link Set} of all values known to the SDK. This will + * return all known enum values except {@link #UNKNOWN_TO_SDK_VERSION}. + * + * @return a {@link Set} of known {@link EventType}s + */ + public static Set knownValues() { + return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(Collectors.toSet()); + } + } } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/service-2.json b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/service-2.json index 3e31e3d4ead7..4a688528c9cf 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/service-2.json +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/service-2.json @@ -417,6 +417,9 @@ }, "SecondEventTwo": { "shape": "EventTwo" + }, + "eventthree": { + "shape": "EventTwo" } }, "eventstream": true diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/sharedstream/eventstream.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/sharedstream/eventstream.java index 55371aa4d9cb..b5c60731b6e1 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/sharedstream/eventstream.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/sharedstream/eventstream.java @@ -2,6 +2,9 @@ import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.SdkField; @@ -41,6 +44,13 @@ static Person.Builder personBuilder() { return DefaultPerson.builder(); } + /** + * The type of this event. Corresponds to the {@code :event-type} header on the Message. + */ + default EventType sdkEventType() { + return EventType.UNKNOWN_TO_SDK_VERSION; + } + /** * Calls the appropriate visit method depending on the subtype of {@link EventStream}. * @@ -56,5 +66,51 @@ static Person.Builder personBuilder() { * Visitor to invoke. */ void accept(StreamDeathsResponseHandler.Visitor visitor); + + /** + * The known possible types of events for {@code EventStream}. + */ + @Generated("software.amazon.awssdk:codegen") + enum EventType { + PERSON("Person"), + + UNKNOWN_TO_SDK_VERSION(null); + + private final String value; + + private EventType(String value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + /** + * Use this in place of valueOf to convert the raw string returned by the service into the enum value. + * + * @param value + * real value + * @return EventType corresponding to the value + */ + public static EventType fromValue(String value) { + if (value == null) { + return null; + } + return Stream.of(EventType.values()).filter(e -> e.toString().equals(value)).findFirst() + .orElse(UNKNOWN_TO_SDK_VERSION); + } + + /** + * Use this in place of {@link #values()} to return a {@link Set} of all values known to the SDK. This will + * return all known enum values except {@link #UNKNOWN_TO_SDK_VERSION}. + * + * @return a {@link Set} of known {@link EventType}s + */ + public static Set knownValues() { + return Stream.of(values()).filter(v -> v != UNKNOWN_TO_SDK_VERSION).collect(Collectors.toSet()); + } + } }