Skip to content

Commit 940be6d

Browse files
committed
Rest Xml marshaller refactor
1 parent 28a5f48 commit 940be6d

File tree

61 files changed

+2264
-99
lines changed

Some content is hidden

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

61 files changed

+2264
-99
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/MarshallerGeneratorTasks.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import software.amazon.awssdk.codegen.emitters.GeneratorTask;
2929
import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams;
3030
import software.amazon.awssdk.codegen.model.intermediate.Metadata;
31+
import software.amazon.awssdk.codegen.model.intermediate.Protocol;
3132
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
3233
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
3334
import software.amazon.awssdk.codegen.poet.eventstream.EventStreamUtils;
@@ -61,15 +62,15 @@ private boolean shouldGenerate(ShapeModel shapeModel) {
6162
info("Skip generating marshaller class for " + shapeModel.getShapeName());
6263
return false;
6364
}
65+
6466
ShapeType shapeType = shapeModel.getShapeType();
6567
return (ShapeType.Request == shapeType || (ShapeType.Model == shapeType && metadata.isJsonProtocol()))
6668
// The event stream shape is a container for event subtypes and isn't something that needs to ever be marshalled
6769
&& !shapeModel.isEventStream();
6870
}
6971

7072
private Stream<GeneratorTask> createTask(String javaShapeName, ShapeModel shapeModel) throws Exception {
71-
if (metadata.isJsonProtocol()) {
72-
73+
if (metadata.isJsonProtocol() || isRestXml()) {
7374
return ShapeType.Request == shapeModel.getShapeType() ||
7475
(ShapeType.Model == shapeModel.getShapeType() && shapeModel.isEvent()
7576
&& EventStreamUtils.isRequestEvent(model, shapeModel))
@@ -84,6 +85,10 @@ private Stream<GeneratorTask> createTask(String javaShapeName, ShapeModel shapeM
8485
transformClassDir));
8586
}
8687

88+
private boolean isRestXml() {
89+
return Protocol.REST_XML == metadata.getProtocol();
90+
}
91+
8792
private GeneratorTask createMarshallerTask(String javaShapeName, Template template,
8893
String marshallerClassName, String marshallerDirectory) throws IOException {
8994
Map<String, Object> marshallerDataModel = ImmutableMap.<String, Object>builder()

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/AsyncClientClass.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import static com.squareup.javapoet.TypeSpec.Builder;
1919
import static java.util.Collections.singletonList;
20+
import static javax.lang.model.element.Modifier.FINAL;
21+
import static javax.lang.model.element.Modifier.PRIVATE;
2022
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applyPaginatorUserAgentMethod;
2123
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applySignerOverrideMethod;
2224
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.getCustomResponseHandler;
@@ -42,10 +44,12 @@
4244
import software.amazon.awssdk.awscore.eventstream.EventStreamTaggedUnionJsonMarshaller;
4345
import software.amazon.awssdk.awscore.internal.client.handler.AwsClientHandlerUtils;
4446
import software.amazon.awssdk.awscore.protocol.json.AwsJsonProtocolFactory;
47+
import software.amazon.awssdk.awscore.protocol.xml.AwsXmlProtocolFactory;
4548
import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams;
4649
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
4750
import software.amazon.awssdk.codegen.model.intermediate.MemberModel;
4851
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
52+
import software.amazon.awssdk.codegen.model.intermediate.Protocol;
4953
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
5054
import software.amazon.awssdk.codegen.poet.PoetExtensions;
5155
import software.amazon.awssdk.codegen.poet.PoetUtils;
@@ -101,6 +105,10 @@ public TypeSpec poetSpec() {
101105
classBuilder.addField(AwsJsonProtocolFactory.class, "jsonProtocolFactory", Modifier.PRIVATE, Modifier.FINAL);
102106
}
103107

108+
if (model.getMetadata().getProtocol() == Protocol.REST_XML) {
109+
classBuilder.addField(AwsXmlProtocolFactory.class, "protocolFactory", PRIVATE, FINAL);
110+
}
111+
104112
if (model.hasPaginators()) {
105113
classBuilder.addMethod(applyPaginatorUserAgentMethod(poetExtensions, model));
106114
}
@@ -129,6 +137,9 @@ private MethodSpec constructor(Builder classBuilder) {
129137
if (model.getMetadata().isCborProtocol()) {
130138
builder.addStatement("this.jsonProtocolFactory = init(false)");
131139
}
140+
if (model.getMetadata().getProtocol() == Protocol.REST_XML) {
141+
builder.addStatement("this.protocolFactory = AwsXmlProtocolFactory.builder().build()");
142+
}
132143
if (hasOperationWithEventStreamOutput()) {
133144
classBuilder.addField(FieldSpec.builder(ClassName.get(Executor.class), "executor",
134145
Modifier.PRIVATE, Modifier.FINAL)

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/SyncClientClass.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.stream.Collectors;
3131
import javax.lang.model.element.Modifier;
3232
import software.amazon.awssdk.annotations.SdkInternalApi;
33+
import software.amazon.awssdk.awscore.protocol.xml.AwsXmlProtocolFactory;
3334
import software.amazon.awssdk.codegen.docs.SimpleMethodOverload;
3435
import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams;
3536
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
@@ -84,6 +85,10 @@ public TypeSpec poetSpec() {
8485

8586
classBuilder.addMethod(closeMethod());
8687

88+
if (model.getMetadata().getProtocol() == Protocol.REST_XML) {
89+
classBuilder.addField(AwsXmlProtocolFactory.class, "protocolFactory", PRIVATE, FINAL);
90+
}
91+
8792
if (model.hasPaginators()) {
8893
classBuilder.addMethod(applyPaginatorUserAgentMethod(poetExtensions, model));
8994
}
@@ -122,6 +127,10 @@ private MethodSpec constructor() {
122127
} else {
123128
builder.addStatement("this.$N = init()", protocolSpec.protocolFactory(model).name);
124129
}
130+
131+
if (model.getMetadata().getProtocol() == Protocol.REST_XML) {
132+
builder.addStatement("this.protocolFactory = AwsXmlProtocolFactory.builder().build()");
133+
}
125134
return builder.build();
126135
}
127136

@@ -186,7 +195,7 @@ static ProtocolSpec getProtocolSpecs(PoetExtensions poetExtensions, Protocol pro
186195
switch (protocol) {
187196
case QUERY:
188197
case REST_XML:
189-
return new QueryXmlProtocolSpec(poetExtensions);
198+
return new QueryXmlProtocolSpec(poetExtensions, protocol);
190199
case EC2:
191200
return new Ec2ProtocolSpec(poetExtensions);
192201
case AWS_JSON:

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818
import com.squareup.javapoet.MethodSpec;
1919
import java.util.ArrayList;
2020
import java.util.List;
21+
import software.amazon.awssdk.codegen.model.intermediate.Protocol;
2122
import software.amazon.awssdk.codegen.poet.PoetExtensions;
2223

2324
public class Ec2ProtocolSpec extends QueryXmlProtocolSpec {
2425

2526
public Ec2ProtocolSpec(PoetExtensions poetExtensions) {
26-
super(poetExtensions);
27+
super(poetExtensions, Protocol.EC2);
2728
}
2829

2930
@Override

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,32 @@
3131
import software.amazon.awssdk.awscore.http.response.DefaultErrorResponseHandler;
3232
import software.amazon.awssdk.awscore.http.response.StaxResponseHandler;
3333
import software.amazon.awssdk.awscore.protocol.xml.StandardErrorUnmarshaller;
34-
import software.amazon.awssdk.awscore.protocol.xml.StaxOperationMetadata;
3534
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
3635
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
36+
import software.amazon.awssdk.codegen.model.intermediate.Protocol;
3737
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
3838
import software.amazon.awssdk.codegen.poet.PoetExtensions;
3939
import software.amazon.awssdk.codegen.poet.PoetUtils;
4040
import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
4141
import software.amazon.awssdk.core.http.HttpResponseHandler;
42+
import software.amazon.awssdk.core.internal.protocol.restxml.unmarshall.StaxOperationMetadata;
4243
import software.amazon.awssdk.core.runtime.transform.StreamingRequestMarshaller;
4344
import software.amazon.awssdk.core.runtime.transform.Unmarshaller;
4445
import software.amazon.awssdk.utils.StringUtils;
4546

4647
public class QueryXmlProtocolSpec implements ProtocolSpec {
4748

4849
private final PoetExtensions poetExtensions;
50+
private final Protocol protocol;
4951
private final TypeName unmarshallerType = ParameterizedTypeName.get(Unmarshaller.class,
5052
AwsServiceException.class,
5153
Node.class);
5254
private final TypeName listOfUnmarshallersType = ParameterizedTypeName.get(ClassName.get("java.util", "List"),
5355
unmarshallerType);
5456

55-
public QueryXmlProtocolSpec(PoetExtensions poetExtensions) {
57+
public QueryXmlProtocolSpec(PoetExtensions poetExtensions, Protocol protocol) {
5658
this.poetExtensions = poetExtensions;
59+
this.protocol = protocol;
5760
}
5861

5962
@Override
@@ -118,7 +121,9 @@ public CodeBlock errorResponseHandler(OperationModel opModel) {
118121
public CodeBlock executionHandler(OperationModel opModel) {
119122
TypeName responseType = poetExtensions.getModelClass(opModel.getReturnType().getReturnType());
120123
ClassName requestType = poetExtensions.getModelClass(opModel.getInput().getVariableType());
124+
121125
ClassName marshaller = poetExtensions.getTransformClass(opModel.getInputShape().getShapeName() + "Marshaller");
126+
122127
CodeBlock.Builder codeBlock = CodeBlock
123128
.builder()
124129
.add("\n\nreturn clientHandler.execute(new $T<$T, $T>()" +
@@ -131,13 +136,16 @@ public CodeBlock executionHandler(OperationModel opModel) {
131136
"responseHandler",
132137
"errorResponseHandler",
133138
opModel.getInput().getVariableName());
139+
134140
if (opModel.hasStreamingInput()) {
135-
return codeBlock.add(".withMarshaller(new $T(new $T(), requestBody)));",
141+
return codeBlock.add(".withMarshaller(new $T(new $T($L), requestBody)));",
136142
ParameterizedTypeName.get(ClassName.get(StreamingRequestMarshaller.class), requestType),
137-
marshaller)
143+
marshaller,
144+
protocol == Protocol.REST_XML ? "protocolFactory" : "")
138145
.build();
139146
}
140-
return codeBlock.add(".withMarshaller(new $T()) $L);", marshaller,
147+
return codeBlock.add(".withMarshaller(new $T($L)) $L);", marshaller,
148+
protocol == Protocol.REST_XML ? "protocolFactory" : "",
141149
opModel.hasStreamingOutput() ? ", responseTransformer" : "").build();
142150
}
143151

@@ -150,7 +158,7 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
150158
String asyncRequestBody = opModel.hasStreamingInput() ? ".withAsyncRequestBody(requestBody)"
151159
: "";
152160
return CodeBlock.builder().add("\n\nreturn clientHandler.execute(new $T<$T, $T>()\n" +
153-
".withMarshaller(new $T())" +
161+
".withMarshaller(new $T($L))" +
154162
".withResponseHandler(responseHandler)" +
155163
".withErrorResponseHandler($N)\n" +
156164
asyncRequestBody +
@@ -159,6 +167,7 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
159167
requestType,
160168
pojoResponseType,
161169
marshaller,
170+
protocol == Protocol.REST_XML ? "protocolFactory" : "",
162171
"errorResponseHandler",
163172
opModel.getInput().getVariableName(),
164173
opModel.hasStreamingOutput() ? ", asyncResponseTransformer" : "")

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,11 @@ private CodeBlock createListTrait(MemberModel m) {
239239
.add("$T.builder()\n"
240240
+ ".memberLocationName($S)\n"
241241
+ ".memberFieldInfo($L)\n"
242+
+ ".flattened($L)\n"
242243
+ ".build()", ClassName.get(ListTrait.class),
243244
m.getListModel().getMemberLocationName(),
244-
containerSdkFieldInitializer(m.getListModel().getListMemberModel()))
245+
containerSdkFieldInitializer(m.getListModel().getListMemberModel()),
246+
m.getHttp().isFlattened())
245247
.build();
246248
}
247249

codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/MarshallerSpec.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import software.amazon.awssdk.codegen.poet.transform.protocols.EventStreamJsonMarshallerSpec;
3333
import software.amazon.awssdk.codegen.poet.transform.protocols.JsonMarshallerSpec;
3434
import software.amazon.awssdk.codegen.poet.transform.protocols.MarshallerProtocolSpec;
35+
import software.amazon.awssdk.codegen.poet.transform.protocols.XmlMarshallerSpec;
3536
import software.amazon.awssdk.core.Request;
3637
import software.amazon.awssdk.core.exception.SdkClientException;
3738
import software.amazon.awssdk.core.runtime.transform.Marshaller;
@@ -63,6 +64,7 @@ public MarshallerSpec(IntermediateModel intermediateModel, ShapeModel shapeModel
6364

6465
@Override
6566
public TypeSpec poetSpec() {
67+
6668
return TypeSpec.classBuilder(className)
6769
.addJavadoc("{@link $T} Marshaller", requestClassName)
6870
.addModifiers(Modifier.PUBLIC)
@@ -121,8 +123,11 @@ private MarshallerProtocolSpec getProtocolSpecs(software.amazon.awssdk.codegen.m
121123
case ION:
122124
case AWS_JSON:
123125
return getJsonMarshallerSpec();
124-
case QUERY:
126+
125127
case REST_XML:
128+
return new XmlMarshallerSpec(intermediateModel, shapeModel);
129+
130+
case QUERY:
126131
case EC2:
127132
case API_GATEWAY:
128133
throw new UnsupportedOperationException("Not yet supported.");

0 commit comments

Comments
 (0)