Skip to content

Demo of orig eventstream with shared events: add sdkEventType interface #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 9 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/next-release/bugfix-AWSSDKforJavav2-1924edd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "bugfix",
"category": "AWS SDK for Java v2",
"contributor": "",
"description": "Fix issue in generating event shapes shared between multiple eventstreams."
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,14 @@ public final TypeSpec poetSpec() {
.addMethod(knownValuesSpec())
.addMethod(createConstructor());

addSuperInterface(enumBuilder);
addDeprecated(enumBuilder);
addJavadoc(enumBuilder);
addEnumConstants(enumBuilder);

enumBuilder.addEnumConstant(UNKNOWN_TO_SDK_VERSION, TypeSpec.anonymousClassBuilder("null").build());

addAdditionalMethods(enumBuilder);
return enumBuilder.build();
}

Expand All @@ -74,6 +76,14 @@ protected final ShapeModel getShape() {
protected abstract void addJavadoc(Builder enumBuilder);

protected abstract void addEnumConstants(Builder enumBuilder);

protected void addSuperInterface(Builder enumBuilder) {
// no-op
}

protected void addAdditionalMethods(Builder enumBuilder) {
// no-op
}

private FieldSpec valueMapField() {
ParameterizedTypeName mapType = ParameterizedTypeName.get(ClassName.get(Map.class),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,11 @@ public static boolean doesShapeContainsEventStream(ShapeModel parentShape, Shape
* Returns true if the given event shape is a sub-member of any operation request.
*/
public static boolean isRequestEvent(IntermediateModel model, ShapeModel eventShape) {
return getBaseEventStreamShape(model, eventShape)
.map(stream -> model.getOperations().values()
.stream()
.anyMatch(o -> doesShapeContainsEventStream(o.getInputShape(), stream)))
.orElse(false);
return getBaseEventStreamShapes(model, eventShape)
.stream()
.anyMatch(streamShape -> model.getOperations().values()
.stream()
.anyMatch(o -> doesShapeContainsEventStream(o.getInputShape(), streamShape)));
}

private static boolean operationContainsEventStream(OperationModel opModel, ShapeModel eventStreamShape) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,17 @@
package software.amazon.awssdk.codegen.poet.eventstream;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import javax.lang.model.element.Modifier;
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;
import software.amazon.awssdk.core.SdkEventType;

public class EventTypeEnumSpec extends AbstractEnumClass {
private static final Object VALUE = "value";
private final String enumPackageName;
private final IntermediateModel intermediateModel;

Expand All @@ -32,6 +36,11 @@ public EventTypeEnumSpec(String enumPackageName, IntermediateModel intermediateM
this.intermediateModel = intermediateModel;
}

@Override
protected void addSuperInterface(TypeSpec.Builder enumBuilder) {
enumBuilder.addSuperinterface(ClassName.get(SdkEventType.class));
}

@Override
protected void addDeprecated(TypeSpec.Builder enumBuilder) {
// no-op
Expand All @@ -54,6 +63,18 @@ protected void addEnumConstants(TypeSpec.Builder enumBuilder) {
});
}

@Override
protected void addAdditionalMethods(TypeSpec.Builder enumBuilder) {
enumBuilder.addMethod(
MethodSpec.methodBuilder("id")
.addAnnotation(Override.class)
.returns(String.class)
.addModifiers(Modifier.PUBLIC)
.addStatement("return $T.valueOf($N)", String.class, VALUE)
.build()
);
}

@Override
public ClassName className() {
return ClassName.get(enumPackageName, "EventType");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import software.amazon.awssdk.codegen.poet.PoetUtils;
import software.amazon.awssdk.codegen.poet.eventstream.EventStreamUtils;
import software.amazon.awssdk.codegen.poet.model.TypeProvider.TypeNameOptions;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.utils.StringUtils;
Expand All @@ -71,6 +72,7 @@
*/
public class AwsServiceModel implements ClassSpec {

public static final String UNKNOWN_TO_SDK_VERSION = "UNKNOWN_TO_SDK_VERSION";
private final IntermediateModel intermediateModel;
private final ShapeModel shapeModel;
private final PoetExtension poetExtensions;
Expand Down Expand Up @@ -169,12 +171,10 @@ private TypeSpec eventStreamInterfaceSpec() {
.addType(helper.eventTypeEnumSpec());


ClassName eventTypeEnum = helper.eventTypeEnumClassName();
builder.addMethod(MethodSpec.methodBuilder("sdkEventType")
.addModifiers(Modifier.PUBLIC, Modifier.DEFAULT)
.returns(eventTypeEnum)
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
.returns(SdkEventType.class)
.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()) {
Expand Down Expand Up @@ -209,8 +209,22 @@ private TypeSpec eventStreamInterfaceSpec() {
}

private void addEventSupport(TypeSpec.Builder specBuilder) {
EventStreamUtils.getBaseEventStreamShapes(intermediateModel, shapeModel)
.forEach(eventStream -> addEventSupport(specBuilder, eventStream));
List<ShapeModel> eventStreamShapes = EventStreamUtils.getBaseEventStreamShapes(intermediateModel, shapeModel);
eventStreamShapes.forEach(eventStream -> addEventSupport(specBuilder, eventStream));

boolean legacyEvents = eventStreamShapes
.stream()
.anyMatch(this::useLegacyEventGenerationScheme);

if (!legacyEvents) {
specBuilder.addMethod(
MethodSpec.methodBuilder("sdkEventType")
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.returns(SdkEventType.class)
.addStatement("throw new $T($S)", UnsupportedOperationException.class, "Unknown Event")
.build());
}
}

private void addEventSupport(TypeSpec.Builder specBuilder, ShapeModel eventStream) {
Expand Down Expand Up @@ -284,14 +298,19 @@ private List<OperationModel> findOutputEventStreamOperations(Collection<Operatio

private CodeBlock buildUnknownEventStreamInitializer(Collection<OperationModel> outputOperations,
ClassName eventStreamModelClass) {
ClassName eventTypeEnum = eventStreamModelClass.nestedClass("EventType");
CodeBlock.Builder builder = CodeBlock.builder()
.add("new $T() {\n"
+ " @Override\n"
+ " public $T<$T<?>> sdkFields() {\n"
+ " return $T.emptyList();\n"
+ " }\n"
+ " @Override\n"
+ " public SdkEventType sdkEventType() {\n"
+ " return $T.$L;\n"
+ " }\n",
eventStreamModelClass, List.class, SdkField.class,
Collections.class
Collections.class, eventTypeEnum, UNKNOWN_TO_SDK_VERSION
);

for (OperationModel opModel : outputOperations) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.function.Consumer;
import java.util.function.Function;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.core.protocol.MarshallLocation;
Expand Down Expand Up @@ -148,6 +149,11 @@ public void accept(EventStreamOperationResponseHandler.Visitor visitor) {
throw new UnsupportedOperationException();
}

@Override
public SdkEventType sdkEventType() {
throw new UnsupportedOperationException("Unknown Event");
}

public interface Builder extends SdkPojo, CopyableBuilder<Builder, EventOne> {
/**
* Sets the value of the Foo property for this object.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.Set;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.services.jsonprotocoltests.model.eventstream.DefaultEventOne;
Expand All @@ -31,6 +32,11 @@ public List<SdkField<?>> sdkFields() {
return Collections.emptyList();
}

@Override
public SdkEventType sdkEventType() {
return EventType.UNKNOWN_TO_SDK_VERSION;
}

@Override
public void accept(EventStreamOperationResponseHandler.Visitor visitor) {
visitor.visitDefault(this);
Expand Down Expand Up @@ -75,9 +81,7 @@ static EventTwo.Builder eventthreeBuilder() {
/**
* The type of this event. Corresponds to the {@code :event-type} header on the Message.
*/
default EventType sdkEventType() {
return EventType.UNKNOWN_TO_SDK_VERSION;
}
SdkEventType sdkEventType();

/**
* Calls the appropriate visit method depending on the subtype of {@link EventStream}.
Expand All @@ -91,7 +95,7 @@ default EventType sdkEventType() {
* The known possible types of events for {@code EventStream}.
*/
@Generated("software.amazon.awssdk:codegen")
enum EventType {
enum EventType implements SdkEventType {
EVENT_ONE("EventOne"),

SECOND_EVENT_ONE("SecondEventOne"),
Expand Down Expand Up @@ -142,5 +146,10 @@ public static Set<EventType> knownValues() {
knownValues.remove(UNKNOWN_TO_SDK_VERSION);
return knownValues;
}

@Override
public String id() {
return String.valueOf(value);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.function.Consumer;
import java.util.function.Function;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.core.protocol.MarshallLocation;
Expand Down Expand Up @@ -148,6 +149,11 @@ public void accept(EventStreamOperationResponseHandler.Visitor visitor) {
throw new UnsupportedOperationException();
}

@Override
public SdkEventType sdkEventType() {
throw new UnsupportedOperationException("Unknown Event");
}

public interface Builder extends SdkPojo, CopyableBuilder<Builder, EventTwo> {
/**
* Sets the value of the Bar property for this object.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.function.Function;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.core.protocol.MarshallLocation;
Expand Down Expand Up @@ -145,6 +146,11 @@ private static <T> BiConsumer<Object, T> setter(BiConsumer<Builder, T> s) {
return (obj, val) -> s.accept((Builder) obj, val);
}

@Override
public SdkEventType sdkEventType() {
throw new UnsupportedOperationException("Unknown Event");
}

public interface Builder extends SdkPojo, CopyableBuilder<Builder, InputEvent> {
/**
* Sets the value of the ExplicitPayloadMember property for this object.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.Set;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.services.jsonprotocoltests.model.inputeventstream.DefaultInputEvent;
import software.amazon.awssdk.utils.internal.EnumUtils;

Expand All @@ -24,15 +25,13 @@ static InputEvent.Builder inputEventBuilder() {
/**
* The type of this event. Corresponds to the {@code :event-type} header on the Message.
*/
default EventType sdkEventType() {
return EventType.UNKNOWN_TO_SDK_VERSION;
}
SdkEventType sdkEventType();

/**
* The known possible types of events for {@code InputEventStream}.
*/
@Generated("software.amazon.awssdk:codegen")
enum EventType {
enum EventType implements SdkEventType {
INPUT_EVENT("InputEvent"),

UNKNOWN_TO_SDK_VERSION(null);
Expand Down Expand Up @@ -75,5 +74,10 @@ public static Set<EventType> knownValues() {
knownValues.remove(UNKNOWN_TO_SDK_VERSION);
return knownValues;
}

@Override
public String id() {
return String.valueOf(value);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.Set;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.services.jsonprotocoltests.model.inputeventstreamtwo.DefaultInputEventTwo;
import software.amazon.awssdk.utils.internal.EnumUtils;

Expand All @@ -24,15 +25,13 @@ static InputEventTwo.Builder inputEventTwoBuilder() {
/**
* The type of this event. Corresponds to the {@code :event-type} header on the Message.
*/
default EventType sdkEventType() {
return EventType.UNKNOWN_TO_SDK_VERSION;
}
SdkEventType sdkEventType();

/**
* The known possible types of events for {@code InputEventStreamTwo}.
*/
@Generated("software.amazon.awssdk:codegen")
enum EventType {
enum EventType implements SdkEventType {
INPUT_EVENT_TWO("InputEventTwo"),

UNKNOWN_TO_SDK_VERSION(null);
Expand Down Expand Up @@ -75,5 +74,10 @@ public static Set<EventType> knownValues() {
knownValues.remove(UNKNOWN_TO_SDK_VERSION);
return knownValues;
}

@Override
public String id() {
return String.valueOf(value);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.function.Function;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.core.SdkEventType;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.core.protocol.MarshallLocation;
Expand Down Expand Up @@ -190,6 +191,11 @@ private static <T> BiConsumer<Object, T> setter(BiConsumer<Builder, T> s) {
return (obj, val) -> s.accept((Builder) obj, val);
}

@Override
public SdkEventType sdkEventType() {
throw new UnsupportedOperationException("Unknown Event");
}

public interface Builder extends SdkPojo, CopyableBuilder<Builder, InputEventTwo> {
/**
* Sets the value of the ImplicitPayloadMemberOne property for this object.
Expand Down
Loading