Skip to content

Commit d8c88cf

Browse files
authored
Merge pull request #2217 from dagnir/fix-legacy-generation
Fix eventstream legacy generation
2 parents 205ef25 + e0eddb1 commit d8c88cf

File tree

11 files changed

+88
-25
lines changed

11 files changed

+88
-25
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamVisitorBuilderImplSpec.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class EventStreamVisitorBuilderImplSpec extends EventStreamVisitorBuilder
4646
private final EventStreamSpecHelper eventStreamSpecHelper;
4747

4848
public EventStreamVisitorBuilderImplSpec(GeneratorTaskParams params, OperationModel operationModel) {
49-
super(params.getPoetExtensions(), operationModel);
49+
super(params.getPoetExtensions(), params.getModel(), operationModel);
5050
this.intermediateModel = params.getModel();
5151
this.poetExt = params.getPoetExtensions();
5252
this.opModel = operationModel;
@@ -108,7 +108,7 @@ protected MethodSpec.Builder applyVisitSubTypeMethodSpecUpdates(TypeSpec.Builder
108108
MemberModel event) {
109109
ClassName eventSubType = poetExt.getModelClass(event.getShape().getShapeName());
110110
TypeName eventConsumerType = consumerType(eventSubType);
111-
FieldSpec consumerField = FieldSpec.builder(eventConsumerType, eventConsumerName(event))
111+
FieldSpec consumerField = FieldSpec.builder(eventConsumerType, eventStreamSpecHelper.eventConsumerName(event))
112112
.addModifiers(Modifier.PRIVATE, Modifier.FINAL)
113113
.build();
114114
typeBuilder.addField(consumerField);
@@ -138,7 +138,7 @@ protected MethodSpec.Builder applyOnSubTypeMethodSpecUpdates(TypeSpec.Builder ty
138138
MemberModel event) {
139139
ClassName eventSubType = poetExt.getModelClass(event.getShape().getShapeName());
140140
TypeName eventConsumerType = consumerType(eventSubType);
141-
FieldSpec consumerField = FieldSpec.builder(eventConsumerType, eventConsumerName(event))
141+
FieldSpec consumerField = FieldSpec.builder(eventConsumerType, eventStreamSpecHelper.eventConsumerName(event))
142142
.addModifiers(Modifier.PRIVATE)
143143
.build();
144144
typeBuilder.addField(consumerField);

codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamVisitorBuilderInterfaceSpec.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@
2323
import java.util.function.Consumer;
2424
import javax.lang.model.element.Modifier;
2525
import software.amazon.awssdk.codegen.docs.DocumentationBuilder;
26+
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2627
import software.amazon.awssdk.codegen.model.intermediate.MemberModel;
2728
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
2829
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
2930
import software.amazon.awssdk.codegen.poet.ClassSpec;
3031
import software.amazon.awssdk.codegen.poet.PoetExtensions;
3132
import software.amazon.awssdk.codegen.poet.PoetUtils;
32-
import software.amazon.awssdk.utils.internal.CodegenNamingUtils;
33+
import software.amazon.awssdk.codegen.poet.model.EventStreamSpecHelper;
3334

3435
/**
3536
* Spec for builder interface for visitor.
@@ -39,12 +40,16 @@ public class EventStreamVisitorBuilderInterfaceSpec implements ClassSpec {
3940
private final OperationModel operationModel;
4041
private final ShapeModel eventStreamShape;
4142
private final ClassName visitorBuilderType;
43+
private final EventStreamSpecHelper eventStreamSpecHelper;
4244

43-
EventStreamVisitorBuilderInterfaceSpec(PoetExtensions poetExt, OperationModel opModel) {
45+
EventStreamVisitorBuilderInterfaceSpec(PoetExtensions poetExt,
46+
IntermediateModel intermediateModel,
47+
OperationModel opModel) {
4448
this.poetExt = poetExt;
4549
this.operationModel = opModel;
4650
this.eventStreamShape = EventStreamUtils.getEventStreamInResponse(operationModel.getOutputShape());
4751
this.visitorBuilderType = poetExt.eventStreamResponseHandlerVisitorBuilderType(opModel);
52+
this.eventStreamSpecHelper = new EventStreamSpecHelper(eventStreamShape, intermediateModel);
4853
}
4954

5055
@Override
@@ -121,13 +126,9 @@ protected MethodSpec.Builder applyOnSubTypeMethodSpecUpdates(TypeSpec.Builder ty
121126
private MethodSpec.Builder createOnSubTypeMethodSpec(MemberModel event) {
122127
ClassName eventSubType = poetExt.getModelClass(event.getShape().getShapeName());
123128
ParameterizedTypeName eventConsumerType = ParameterizedTypeName.get(ClassName.get(Consumer.class), eventSubType);
124-
return MethodSpec.methodBuilder(eventConsumerName(event))
129+
return MethodSpec.methodBuilder(eventStreamSpecHelper.eventConsumerName(event))
125130
.addModifiers(Modifier.PUBLIC)
126131
.addParameter(ParameterSpec.builder(eventConsumerType, "c").build())
127132
.returns(visitorBuilderType);
128133
}
129-
130-
protected final String eventConsumerName(MemberModel event) {
131-
return "on" + CodegenNamingUtils.pascalCase(event.getName());
132-
}
133134
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamVisitorInterfaceSpec.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@
3535
*/
3636
class EventStreamVisitorInterfaceSpec implements ClassSpec {
3737
private final PoetExtensions poetExt;
38+
private final IntermediateModel intermediateModel;
3839
private final OperationModel operationModel;
3940
private final ShapeModel eventStreamShape;
4041
private final ClassName eventStreamBaseClass;
4142
private final EventStreamSpecHelper eventStreamSpecHelper;
4243

4344
EventStreamVisitorInterfaceSpec(IntermediateModel intermediateModel, PoetExtensions poetExt, OperationModel operationModel) {
4445
this.poetExt = poetExt;
46+
this.intermediateModel = intermediateModel;
4547
this.operationModel = operationModel;
4648
this.eventStreamShape = EventStreamUtils.getEventStreamInResponse(operationModel.getOutputShape());
4749
this.eventStreamBaseClass = poetExt.getModelClassFromShape(eventStreamShape);
@@ -72,7 +74,8 @@ protected TypeSpec.Builder createTypeSpec() {
7274
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
7375
.addJavadoc("Visitor for subtypes of {@link $T}.", eventStreamBaseClass)
7476
.addMethod(createBuilderMethodSpec())
75-
.addType(new EventStreamVisitorBuilderInterfaceSpec(poetExt, operationModel).poetSpec());
77+
.addType(new EventStreamVisitorBuilderInterfaceSpec(poetExt, intermediateModel, operationModel)
78+
.poetSpec());
7679
}
7780

7881
protected TypeSpec.Builder finalizeTypeSpec(TypeSpec.Builder builder) {

codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/EventStreamSpecHelper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,11 @@ public String eventTypeEnumValue(MemberModel eventModel) {
9696
public String eventBuilderMethodName(MemberModel eventModel) {
9797
return String.format("%sBuilder", StringUtils.uncapitalize(eventModel.getName()));
9898
}
99+
100+
public String eventConsumerName(MemberModel eventModel) {
101+
if (useLegacyGenerationScheme(eventModel)) {
102+
return "on" + eventModel.getShape().getShapeName();
103+
}
104+
return "on" + eventModel.getName();
105+
}
99106
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/json/customization.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@
1515
"createMethodParams": ["param1", "param2", "param3"]
1616
},
1717
"useLegacyEventGenerationScheme": {
18-
"EventStream": ["EventOne", "event-two"]
18+
"EventStream": ["EventOne", "event-two", "eventThree"]
1919
}
2020
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/json/service-2.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,10 @@
417417
},
418418
"secondEventOne": {
419419
"shape": "EventOne"
420+
},
421+
// Legacy generation uses shape name == event name
422+
"eventThree": {
423+
"shape": "LegacyEventThree"
420424
}
421425
},
422426
"eventstream": true
@@ -439,6 +443,15 @@
439443
},
440444
"event": true
441445
},
446+
"LegacyEventThree": {
447+
"type": "structure",
448+
"members": {
449+
"Baz": {
450+
"shape": "String"
451+
}
452+
},
453+
"event": true
454+
},
442455
"EventStreamOperationWithOnlyInputRequest": {
443456
"type": "structure",
444457
"required": [

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-async-client-class.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ public CompletableFuture<Void> eventStreamOperation(EventStreamOperationRequest
305305
EventStreamTaggedUnionPojoSupplier.builder().putSdkPojoSupplier("EventOne", EventStream::eventOneBuilder)
306306
.putSdkPojoSupplier("EventTheSecond", EventStream::eventTheSecondBuilder)
307307
.putSdkPojoSupplier("secondEventOne", EventStream::secondEventOneBuilder)
308+
.putSdkPojoSupplier("eventThree", EventStream::eventThreeBuilder)
308309
.defaultSdkPojoSupplier(() -> new SdkPojoBuilder(EventStream.UNKNOWN)).build());
309310

310311
HttpResponseHandler<AwsServiceException> errorResponseHandler = createErrorResponseHandler(protocolFactory,
@@ -468,6 +469,7 @@ public CompletableFuture<Void> eventStreamOperationWithOnlyOutput(
468469
EventStreamTaggedUnionPojoSupplier.builder().putSdkPojoSupplier("EventOne", EventStream::eventOneBuilder)
469470
.putSdkPojoSupplier("EventTheSecond", EventStream::eventTheSecondBuilder)
470471
.putSdkPojoSupplier("secondEventOne", EventStream::secondEventOneBuilder)
472+
.putSdkPojoSupplier("eventThree", EventStream::eventThreeBuilder)
471473
.defaultSdkPojoSupplier(() -> new SdkPojoBuilder(EventStream.UNKNOWN)).build());
472474

473475
HttpResponseHandler<AwsServiceException> errorResponseHandler = createErrorResponseHandler(protocolFactory,

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-response-handler.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,17 @@ default void visitSecondEventOne(EventOne event) {
107107
visitDefault(event);
108108
}
109109

110+
/**
111+
* Invoked when a {@link LegacyEventThree} is encountered. If this is not overridden, the event will be given to
112+
* {@link #visitDefault(EventStream)}.
113+
*
114+
* @param event
115+
* Event being visited
116+
*/
117+
default void visit(LegacyEventThree event) {
118+
visitDefault(event);
119+
}
120+
110121
/**
111122
* Builder for {@link Visitor}. The {@link Visitor} class may also be extended for a more traditional style but
112123
* this builder allows for a more functional way of creating a visitor will callback methods.
@@ -153,6 +164,15 @@ interface Builder {
153164
* @return This builder for method chaining.
154165
*/
155166
Builder onSecondEventOne(Consumer<EventOne> c);
167+
168+
/**
169+
* Callback to invoke when a {@link LegacyEventThree} is visited.
170+
*
171+
* @param c
172+
* Callback to process the event.
173+
* @return This builder for method chaining.
174+
*/
175+
Builder onLegacyEventThree(Consumer<LegacyEventThree> c);
156176
}
157177
}
158178
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/eventstream/test-visitor-builder.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ final class DefaultEventStreamOperationVisitorBuilder implements EventStreamOper
1515

1616
private Consumer<EventOne> onSecondEventOne;
1717

18+
private Consumer<LegacyEventThree> onLegacyEventThree;
19+
1820
@Override
1921
public EventStreamOperationResponseHandler.Visitor.Builder onDefault(Consumer<EventStream> c) {
2022
this.onDefault = c;
@@ -44,6 +46,12 @@ public EventStreamOperationResponseHandler.Visitor.Builder onSecondEventOne(Cons
4446
return this;
4547
}
4648

49+
@Override
50+
public EventStreamOperationResponseHandler.Visitor.Builder onLegacyEventThree(Consumer<LegacyEventThree> c) {
51+
this.onLegacyEventThree = c;
52+
return this;
53+
}
54+
4755
@Generated("software.amazon.awssdk:codegen")
4856
static class VisitorFromBuilder implements EventStreamOperationResponseHandler.Visitor {
4957
private final Consumer<EventStream> onDefault;
@@ -54,6 +62,8 @@ static class VisitorFromBuilder implements EventStreamOperationResponseHandler.V
5462

5563
private final Consumer<EventOne> onSecondEventOne;
5664

65+
private final Consumer<LegacyEventThree> onLegacyEventThree;
66+
5767
VisitorFromBuilder(DefaultEventStreamOperationVisitorBuilder builder) {
5868
this.onDefault = builder.onDefault != null ? builder.onDefault
5969
: EventStreamOperationResponseHandler.Visitor.super::visitDefault;
@@ -63,6 +73,8 @@ static class VisitorFromBuilder implements EventStreamOperationResponseHandler.V
6373
: EventStreamOperationResponseHandler.Visitor.super::visitEventTheSecond;
6474
this.onSecondEventOne = builder.onSecondEventOne != null ? builder.onSecondEventOne
6575
: EventStreamOperationResponseHandler.Visitor.super::visitSecondEventOne;
76+
this.onLegacyEventThree = builder.onLegacyEventThree != null ? builder.onLegacyEventThree
77+
: EventStreamOperationResponseHandler.Visitor.super::visit;
6678
}
6779

6880
@Override
@@ -84,6 +96,11 @@ public void visitEventTheSecond(EventTwo event) {
8496
public void visitSecondEventOne(EventOne event) {
8597
onSecondEventOne.accept(event);
8698
}
99+
100+
@Override
101+
public void visit(LegacyEventThree event) {
102+
onLegacyEventThree.accept(event);
103+
}
87104
}
88105
}
89106

test/codegen-generated-classes-test/src/main/resources/codegen-resources/eventstreams/service-2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
"EventStream": {
7676
"type": "structure",
7777
"members": {
78-
"EventOne": {
78+
"TheEventOne": {
7979
"shape": "EventOne"
8080
},
8181
"LegacyGeneratedEvent": {

test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/eventstreams/EventDispatchTest.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class EventDispatchTest {
4747
private Consumer<EventStream> onDefaultConsumer;
4848

4949
@Mock
50-
private Consumer<EventOne> eventOneConsumer;
50+
private Consumer<EventOne> theEventOneConsumer;
5151

5252
@Mock
5353
private Consumer<EventOne> legacyGeneratedEventConsumer;
@@ -62,28 +62,28 @@ public class EventDispatchTest {
6262
public ExpectedException expected = ExpectedException.none();
6363

6464
@Test
65-
public void test_acceptEventOne_correctVisitorMethodCalled() {
66-
EventStream eventStream = EventStream.eventOneBuilder().build();
65+
public void test_acceptTheEventOne_correctVisitorMethodCalled() {
66+
EventStream eventStream = EventStream.theEventOneBuilder().build();
6767
eventStream.accept(visitor);
6868

69-
verify(visitor).visitEventOne(Mockito.eq((EventOne) eventStream));
69+
verify(visitor).visitTheEventOne(Mockito.eq((EventOne) eventStream));
7070
verifyNoMoreInteractions(visitor);
7171
}
7272

7373
@Test
74-
public void test_acceptEventOne_visitorBuiltWithBuilder_correctVisitorMethodCalled() {
74+
public void test_acceptTheEventOne_visitorBuiltWithBuilder_correctVisitorMethodCalled() {
7575
EventStreamOperationResponseHandler.Visitor visitor = visitorBuiltWithBuilder();
76-
EventStream eventStream = EventStream.eventOneBuilder().build();
76+
EventStream eventStream = EventStream.theEventOneBuilder().build();
7777

7878
eventStream.accept(visitor);
7979

80-
verify(eventOneConsumer).accept(eq((EventOne) eventStream));
80+
verify(theEventOneConsumer).accept(eq((EventOne) eventStream));
8181
verifyNoMoreConsumerInteractions();
8282
}
8383

8484
@Test
8585
public void test_acceptLegacyGeneratedEvent_correctVisitorMethodCalled() {
86-
EventStream eventStream = EventStream.legacyGeneratedEventBuilder().build();
86+
EventStream eventStream = EventOne.builder().build();
8787
eventStream.accept(visitor);
8888

8989
// Note: notice the visit() method rather than visitLegacyGeneratedEvent()
@@ -94,7 +94,7 @@ public void test_acceptLegacyGeneratedEvent_correctVisitorMethodCalled() {
9494
@Test
9595
public void test_acceptLegacyGeneratedEvent_visitorBuiltWithBuilder_correctVisitorMethodCalled() {
9696
EventStreamOperationResponseHandler.Visitor visitor = visitorBuiltWithBuilder();
97-
EventStream eventStream = EventStream.legacyGeneratedEventBuilder().build();
97+
EventStream eventStream = EventOne.builder().build();
9898

9999
eventStream.accept(visitor);
100100

@@ -155,15 +155,15 @@ public void test_acceptOnBaseClass_UnCustomizedEvent_throwsException() {
155155
private EventStreamOperationResponseHandler.Visitor visitorBuiltWithBuilder() {
156156
return EventStreamOperationResponseHandler.Visitor.builder()
157157
.onDefault(onDefaultConsumer)
158-
.onEventOne(eventOneConsumer)
158+
.onTheEventOne(theEventOneConsumer)
159159
.onEventTwo(eventTwoConsumer)
160-
.onLegacyGeneratedEvent(legacyGeneratedEventConsumer)
160+
.onEventOne(legacyGeneratedEventConsumer)
161161
.onSecondEventTwo(secondEventTwoConsumer)
162162
.build();
163163
}
164164

165165
private void verifyNoMoreConsumerInteractions() {
166-
verifyNoMoreInteractions(onDefaultConsumer, eventOneConsumer, eventTwoConsumer, legacyGeneratedEventConsumer,
166+
verifyNoMoreInteractions(onDefaultConsumer, theEventOneConsumer, eventTwoConsumer, legacyGeneratedEventConsumer,
167167
secondEventTwoConsumer);
168168
}
169169
}

0 commit comments

Comments
 (0)