Skip to content

Commit f67a509

Browse files
committed
Various refactoring for JSON (un)marshallers and fixes. Tests and support for Timestamp format trait
1 parent 59a4edb commit f67a509

File tree

97 files changed

+3654
-1100
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+3654
-1100
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/AddShapes.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ private MemberModel generateMemberModel(String c2jMemberName, Member c2jMemberDe
163163
.withDocumentation(c2jMemberDefinition.getDocumentation()))
164164
.withSetterModel(new VariableModel(variableName, variableType, variableDeclarationType))
165165
.withGetterModel(new ReturnTypeModel(variableType))
166+
.withTimestampFormat(resolveTimestampFormat(c2jMemberDefinition, c2jShape))
166167
.withJsonValue(c2jMemberDefinition.getJsonValue());
167168
memberModel.setDocumentation(c2jMemberDefinition.getDocumentation());
168169
memberModel.setDeprecated(c2jMemberDefinition.isDeprecated());
@@ -204,6 +205,11 @@ private MemberModel generateMemberModel(String c2jMemberName, Member c2jMemberDe
204205
return memberModel;
205206
}
206207

208+
private String resolveTimestampFormat(Member c2jMemberDefinition, Shape c2jShape) {
209+
return c2jMemberDefinition.getTimestampFormat() != null ?
210+
c2jMemberDefinition.getTimestampFormat() : c2jShape.getTimestampFormat();
211+
}
212+
207213
private ParameterHttpMapping generateParameterHttpMapping(Shape parentShape,
208214
String memberName,
209215
Member member,

codegen/src/main/java/software/amazon/awssdk/codegen/IntermediateModelBuilder.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import static software.amazon.awssdk.codegen.AddMetadata.constructMetadata;
1919
import static software.amazon.awssdk.codegen.RemoveUnusedShapes.removeUnusedShapes;
2020

21-
import java.io.IOException;
2221
import java.util.ArrayList;
2322
import java.util.Collections;
2423
import java.util.HashMap;

codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/IntermediateModel.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import software.amazon.awssdk.codegen.internal.Utils;
3232
import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig;
3333
import software.amazon.awssdk.codegen.model.service.PaginatorDefinition;
34-
import software.amazon.awssdk.codegen.naming.DefaultNamingStrategy;
3534
import software.amazon.awssdk.codegen.naming.NamingStrategy;
3635
import software.amazon.awssdk.core.SdkResponseMetadata;
3736
import software.amazon.awssdk.utils.IoUtils;

codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/MemberModel.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ public class MemberModel extends DocumentationModel {
7676

7777
private boolean isJsonValue;
7878

79+
private String timestampFormat;
80+
7981
public String getName() {
8082
return name;
8183
}
@@ -466,6 +468,19 @@ public MemberModel withJsonValue(boolean jsonValue) {
466468
return this;
467469
}
468470

471+
public String getTimestampFormat() {
472+
return timestampFormat;
473+
}
474+
475+
public void setTimestampFormat(String timestampFormat) {
476+
this.timestampFormat = timestampFormat;
477+
}
478+
479+
public MemberModel withTimestampFormat(String timestampFormat) {
480+
setTimestampFormat(timestampFormat);
481+
return this;
482+
}
483+
469484
/**
470485
* @return Implementation of {@link PathMarshaller} to use if this member is bound the the URI.
471486
* @throws IllegalStateException If this member is not bound to the URI. Templates should first check

codegen/src/main/java/software/amazon/awssdk/codegen/model/service/Member.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public class Member {
4444
@JsonProperty("jsonvalue")
4545
private boolean jsonValue;
4646

47+
private String timestampFormat;
48+
4749
public String getShape() {
4850
return shape;
4951
}
@@ -139,4 +141,12 @@ public boolean getJsonValue() {
139141
public void setJsonValue(boolean jsonValue) {
140142
this.jsonValue = jsonValue;
141143
}
144+
145+
public String getTimestampFormat() {
146+
return timestampFormat;
147+
}
148+
149+
public void setTimestampFormat(String timestampFormat) {
150+
this.timestampFormat = timestampFormat;
151+
}
142152
}

codegen/src/main/java/software/amazon/awssdk/codegen/model/service/Shape.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public class Shape {
6767
@JsonProperty(value = "event")
6868
private boolean isEvent;
6969

70+
private String timestampFormat;
71+
7072
public boolean isFault() {
7173
return fault;
7274
}
@@ -238,4 +240,12 @@ public boolean isEvent() {
238240
public void setIsEvent(boolean event) {
239241
isEvent = event;
240242
}
243+
244+
public String getTimestampFormat() {
245+
return timestampFormat;
246+
}
247+
248+
public void setTimestampFormat(String timestampFormat) {
249+
this.timestampFormat = timestampFormat;
250+
}
241251
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/JsonProtocolSpec.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import java.util.stream.Collectors;
3131
import javax.lang.model.element.Modifier;
3232
import software.amazon.awssdk.awscore.eventstream.EventStreamAsyncResponseTransformer;
33-
import software.amazon.awssdk.awscore.eventstream.EventStreamTaggedUnionJsonUnmarshaller;
33+
import software.amazon.awssdk.awscore.eventstream.EventStreamTaggedUnionPojoSupplier;
3434
import software.amazon.awssdk.awscore.exception.AwsServiceException;
3535
import software.amazon.awssdk.awscore.internal.protocol.json.AwsJsonProtocol;
3636
import software.amazon.awssdk.awscore.protocol.json.AwsJsonProtocolFactory;
@@ -145,16 +145,14 @@ public CodeBlock responseHandler(IntermediateModel model, OperationModel opModel
145145
JsonOperationMetadata.class,
146146
true,
147147
false,
148-
ClassName.get(EventStreamTaggedUnionJsonUnmarshaller.class));
148+
ClassName.get(EventStreamTaggedUnionPojoSupplier.class));
149149

150150
eventStreamUtils.getEventStreamMembers()
151151
.forEach(m -> {
152-
String unmarshallerClassName = m.getShape().getVariable().getVariableType() + "Unmarshaller";
153-
builder.add(".addUnmarshaller(\"$L\", $T.getInstance())\n",
154-
m.getC2jName(),
155-
poetExtensions.getTransformClass(unmarshallerClassName));
152+
builder.add(".addSdkPojoSupplier(\"$L\", $T::builder)\n",
153+
m.getC2jName(), poetExtensions.getModelClass(m.getName()));
156154
});
157-
builder.add(".defaultUnmarshaller((in) -> $T.UNKNOWN)\n"
155+
builder.add(".defaultSdkPojoSupplier(() -> $T.UNKNOWN)\n"
158156
+ ".build());\n", eventStreamUtils.eventStreamBaseClass());
159157
}
160158
return builder.build();

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.squareup.javapoet.TypeVariableName;
2626
import com.squareup.javapoet.WildcardTypeName;
2727
import java.util.ArrayList;
28+
import java.util.Collections;
2829
import java.util.List;
2930
import java.util.Objects;
3031
import java.util.Optional;
@@ -88,16 +89,23 @@ public TypeSpec poetSpec() {
8889
ClassName responseHandlerClass = eventStreamUtils.responseHandlerType();
8990
return PoetUtils.createInterfaceBuilder(modelClass)
9091
.addAnnotation(SdkPublicApi.class)
92+
.addSuperinterface(ClassName.get(SdkPojo.class))
9193
.addJavadoc("Base interface for all event types of the $L API.", eventStreamUtils.getApiName())
9294
.addField(FieldSpec.builder(modelClass, "UNKNOWN")
9395
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
9496
.initializer(CodeBlock.builder()
9597
.add("new $T() {\n"
98+
+ " @Override\n"
99+
+ " public $T<$T<?>> sdkFields() {\n"
100+
+ " return $T.emptyList();\n"
101+
+ " }\n"
96102
+ " @Override\n"
97103
+ " public void accept($T.Visitor visitor) {\n"
98104
+ " visitor.visitDefault(this);\n"
99105
+ " }\n"
100-
+ " };\n", modelClass, responseHandlerClass
106+
+ " };\n",
107+
modelClass, List.class, SdkField.class,
108+
Collections.class, responseHandlerClass
101109
)
102110
.build())
103111
.addJavadoc("Special type of {@link $T} for unknown types of events that this "
@@ -206,7 +214,7 @@ public ClassName className() {
206214
return shapeModelSpec.className();
207215
}
208216

209-
private ClassName builderClassName(){
217+
private ClassName builderClassName() {
210218
return className().nestedClass("Builder");
211219
}
212220

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,16 @@
3131
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
3232
import software.amazon.awssdk.codegen.naming.NamingStrategy;
3333
import software.amazon.awssdk.codegen.poet.PoetExtensions;
34+
import software.amazon.awssdk.core.protocol.MarshallLocation;
35+
import software.amazon.awssdk.core.protocol.MarshallingType;
36+
import software.amazon.awssdk.core.protocol.SdkField;
3437
import software.amazon.awssdk.core.protocol.traits.IdempotencyTrait;
3538
import software.amazon.awssdk.core.protocol.traits.JsonValueTrait;
3639
import software.amazon.awssdk.core.protocol.traits.ListTrait;
3740
import software.amazon.awssdk.core.protocol.traits.LocationTrait;
3841
import software.amazon.awssdk.core.protocol.traits.MapTrait;
39-
import software.amazon.awssdk.core.protocol.MarshallLocation;
40-
import software.amazon.awssdk.core.protocol.MarshallingType;
41-
import software.amazon.awssdk.core.protocol.SdkField;
4242
import software.amazon.awssdk.core.protocol.traits.PayloadTrait;
43+
import software.amazon.awssdk.core.protocol.traits.TimestampFormatTrait;
4344

4445
/**
4546
* Provides Poet specs related to shape models.
@@ -148,12 +149,15 @@ private CodeBlock traits(MemberModel m) {
148149
if (m.getHttp().getIsPayload()) {
149150
traits.add(createPayloadTrait());
150151
}
151-
if(m.isJsonValue()) {
152+
if (m.isJsonValue()) {
152153
traits.add(createJsonValueTrait());
153154
}
154-
if(m.isIdempotencyToken()) {
155+
if (m.isIdempotencyToken()) {
155156
traits.add(createIdempotencyTrait());
156157
}
158+
if (m.getTimestampFormat() != null) {
159+
traits.add(createTimestampFormatTrait(m));
160+
}
157161
if (!traits.isEmpty()) {
158162
return CodeBlock.builder()
159163
.add(".traits(" + traits.stream().map(t -> "$L").collect(Collectors.joining(", ")) + ")",
@@ -164,6 +168,15 @@ private CodeBlock traits(MemberModel m) {
164168
}
165169
}
166170

171+
private CodeBlock createTimestampFormatTrait(MemberModel m) {
172+
TimestampFormatTrait.Format format = TimestampFormatTrait.Format.fromString(m.getTimestampFormat());
173+
ClassName traitClass = ClassName.get(TimestampFormatTrait.class);
174+
ClassName formatClass = ClassName.get(TimestampFormatTrait.Format.class);
175+
return CodeBlock.builder()
176+
.add("$T.create($T.$L)", traitClass, formatClass, format.name())
177+
.build();
178+
}
179+
167180
private CodeBlock createLocationTrait(MemberModel m) {
168181
return CodeBlock.builder()
169182
// TODO will marshall and unmarshall location name ever differ?

codegen/src/test/java/software/amazon/awssdk/codegen/naming/DefaultNamingStrategyTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,19 +276,19 @@ public void getServiceName_ThrowsException_WhenServiceIdHasWhiteSpace() {
276276
@Test
277277
public void getSdkFieldFieldName_SingleWord() {
278278
assertThat(strat.getSdkFieldFieldName(new MemberModel().withName("foo")))
279-
.isEqualTo("FOO");
279+
.isEqualTo("FOO_FIELD");
280280
}
281281

282282
@Test
283283
public void getSdkFieldFieldName_CamalCaseConvertedToScreamCase() {
284284
assertThat(strat.getSdkFieldFieldName(new MemberModel().withName("fooBar")))
285-
.isEqualTo("FOO_BAR");
285+
.isEqualTo("FOO_BAR_FIELD");
286286
}
287287

288288
@Test
289289
public void getSdkFieldFieldName_PascalCaseConvertedToScreamCase() {
290290
assertThat(strat.getSdkFieldFieldName(new MemberModel().withName("FooBar")))
291-
.isEqualTo("FOO_BAR");
291+
.isEqualTo("FOO_BAR_FIELD");
292292
}
293293

294294
private void validateConversion(String input, String expectedOutput) {

0 commit comments

Comments
 (0)