Skip to content

Commit 27e7fc6

Browse files
committed
Modularizing protocol implementations
1 parent 55b1119 commit 27e7fc6

File tree

327 files changed

+2963
-1438
lines changed

Some content is hidden

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

327 files changed

+2963
-1438
lines changed

build-tools/src/main/resources/software/amazon/awssdk/spotbugs-suppressions.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@
2727
<Match>
2828
<Or>
2929
<!-- Container classes do not copy arrays for performance reasons at this time. -->
30-
<Class name="software.amazon.awssdk.core.protocol.json.JsonContent" />
30+
<Class name="software.amazon.awssdk.protocols.json.JsonContent" />
3131
</Or>
3232
<Bug pattern="EI_EXPOSE_REP,EI_EXPOSE_REP2" />
3333
</Match>
3434

3535
<!-- Delegate closes input stream. -->
3636
<Match>
37-
<Class name="software.amazon.awssdk.core.internal.protocol.json.IonFactory" />
37+
<Class name="software.amazon.awssdk.protocols.ion.internal.IonFactory" />
3838
<Method name="createParser" />
3939
<Bug pattern="OBL_UNSATISFIED_OBLIGATION" />
4040
</Match>
@@ -44,7 +44,7 @@
4444
<Match>
4545
<Or>
4646
<Class name="software.amazon.awssdk.services.dynamodb.datamodeling.DynamoDBMapper$BatchGetItemException"/>
47-
<Class name="software.amazon.awssdk.core.internal.protocol.json.IonFactory"/>
47+
<Class name="software.amazon.awssdk.protocols.ion.internal.IonFactory"/>
4848
</Or>
4949
<Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
5050
</Match>

codegen/pom.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,31 @@
110110
<groupId>org.reactivestreams</groupId>
111111
<artifactId>reactive-streams</artifactId>
112112
</dependency>
113+
<dependency>
114+
<groupId>software.amazon.awssdk</groupId>
115+
<artifactId>aws-json-protocol</artifactId>
116+
<version>${awsjavasdk.version}</version>
117+
</dependency>
118+
<dependency>
119+
<groupId>software.amazon.awssdk</groupId>
120+
<artifactId>aws-cbor-protocol</artifactId>
121+
<version>${awsjavasdk.version}</version>
122+
</dependency>
123+
<dependency>
124+
<groupId>software.amazon.awssdk</groupId>
125+
<artifactId>aws-ion-protocol</artifactId>
126+
<version>${awsjavasdk.version}</version>
127+
</dependency>
128+
<dependency>
129+
<groupId>software.amazon.awssdk</groupId>
130+
<artifactId>aws-query-protocol</artifactId>
131+
<version>${awsjavasdk.version}</version>
132+
</dependency>
133+
<dependency>
134+
<groupId>software.amazon.awssdk</groupId>
135+
<artifactId>protocol-core</artifactId>
136+
<version>${awsjavasdk.version}</version>
137+
</dependency>
113138

114139
<dependency>
115140
<artifactId>junit</artifactId>

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.Map;
2929
import software.amazon.awssdk.codegen.internal.TypeUtils;
3030
import software.amazon.awssdk.core.SdkBytes;
31-
import software.amazon.awssdk.core.protocol.SdkField;
3231
import software.amazon.awssdk.core.runtime.transform.PathMarshaller;
3332
import software.amazon.awssdk.utils.StringUtils;
3433

codegen/src/main/java/software/amazon/awssdk/codegen/naming/NamingStrategy.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import software.amazon.awssdk.codegen.model.intermediate.MemberModel;
1919
import software.amazon.awssdk.codegen.model.service.Shape;
20-
import software.amazon.awssdk.core.protocol.SdkField;
2120

2221
/**
2322
* Strategy to name various Java constructs based on the naming in the model and potentially customizations.

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import software.amazon.awssdk.awscore.client.handler.AwsAsyncClientHandler;
4242
import software.amazon.awssdk.awscore.eventstream.EventStreamTaggedUnionJsonMarshaller;
4343
import software.amazon.awssdk.awscore.internal.client.handler.AwsClientHandlerUtils;
44-
import software.amazon.awssdk.awscore.protocol.json.AwsJsonProtocolFactory;
4544
import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams;
4645
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
4746
import software.amazon.awssdk.codegen.model.intermediate.MemberModel;
@@ -56,6 +55,7 @@
5655
import software.amazon.awssdk.core.client.config.SdkAdvancedAsyncClientOption;
5756
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
5857
import software.amazon.awssdk.core.client.handler.AsyncClientHandler;
58+
import software.amazon.awssdk.protocols.json.AwsJsonProtocolFactory;
5959
import software.amazon.awssdk.utils.CompletableFutureUtils;
6060
import software.amazon.awssdk.utils.FunctionalUtils;
6161

@@ -70,7 +70,7 @@ public AsyncClientClass(GeneratorTaskParams dependencies) {
7070
this.model = dependencies.getModel();
7171
this.poetExtensions = dependencies.getPoetExtensions();
7272
this.className = poetExtensions.getClientClass(model.getMetadata().getAsyncClient());
73-
this.protocolSpec = getProtocolSpecs(poetExtensions, model.getMetadata().getProtocol());
73+
this.protocolSpec = getProtocolSpecs(poetExtensions, model);
7474
}
7575

7676
@Override
@@ -121,14 +121,15 @@ private MethodSpec constructor(Builder classBuilder) {
121121
.addParameter(SdkClientConfiguration.class, "clientConfiguration")
122122
.addStatement("this.clientHandler = new $T(clientConfiguration)",
123123
AwsAsyncClientHandler.class);
124+
FieldSpec protocolFactoryField = protocolSpec.protocolFactory(model);
124125
if (model.getMetadata().isJsonProtocol()) {
125-
builder.addStatement("this.$N = init($L)", protocolSpec.protocolFactory(model).name,
126-
model.getMetadata().isCborProtocol());
126+
builder.addStatement("this.$N = init($T.builder()).build()", protocolFactoryField.name,
127+
protocolFactoryField.type);
127128
} else {
128-
builder.addStatement("this.$N = init()", protocolSpec.protocolFactory(model).name);
129+
builder.addStatement("this.$N = init()", protocolFactoryField.name);
129130
}
130131
if (model.getMetadata().isCborProtocol()) {
131-
builder.addStatement("this.jsonProtocolFactory = init(false)");
132+
builder.addStatement("this.jsonProtocolFactory = init($T.builder()).build()", AwsJsonProtocolFactory.class);
132133
}
133134
if (hasOperationWithEventStreamOutput()) {
134135
classBuilder.addField(FieldSpec.builder(ClassName.get(Executor.class), "executor",

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.getCustomResponseHandler;
2323

2424
import com.squareup.javapoet.ClassName;
25+
import com.squareup.javapoet.FieldSpec;
2526
import com.squareup.javapoet.MethodSpec;
2627
import com.squareup.javapoet.TypeSpec;
2728
import com.squareup.javapoet.TypeSpec.Builder;
@@ -59,7 +60,7 @@ public SyncClientClass(GeneratorTaskParams taskParams) {
5960
this.model = taskParams.getModel();
6061
this.poetExtensions = taskParams.getPoetExtensions();
6162
this.className = poetExtensions.getClientClass(model.getMetadata().getSyncClient());
62-
this.protocolSpec = getProtocolSpecs(poetExtensions, model.getMetadata().getProtocol());
63+
this.protocolSpec = getProtocolSpecs(poetExtensions, model);
6364
}
6465

6566
@Override
@@ -119,11 +120,12 @@ private MethodSpec constructor() {
119120
.addStatement("this.clientHandler = new $T(clientConfiguration)",
120121
protocolSpec.getClientHandlerClass())
121122
.addStatement("this.clientConfiguration = clientConfiguration");
123+
FieldSpec protocolFactoryField = protocolSpec.protocolFactory(model);
122124
if (model.getMetadata().isJsonProtocol()) {
123-
builder.addStatement("this.$N = init($L)", protocolSpec.protocolFactory(model).name,
124-
model.getMetadata().isCborProtocol());
125+
builder.addStatement("this.$N = init($T.builder()).build()", protocolFactoryField.name,
126+
protocolFactoryField.type);
125127
} else {
126-
builder.addStatement("this.$N = init()", protocolSpec.protocolFactory(model).name);
128+
builder.addStatement("this.$N = init()", protocolFactoryField.name);
127129
}
128130
return builder.build();
129131
}
@@ -185,7 +187,8 @@ private MethodSpec closeMethod() {
185187
.build();
186188
}
187189

188-
static ProtocolSpec getProtocolSpecs(PoetExtensions poetExtensions, Protocol protocol) {
190+
static ProtocolSpec getProtocolSpecs(PoetExtensions poetExtensions, IntermediateModel model) {
191+
Protocol protocol = model.getMetadata().getProtocol();
189192
switch (protocol) {
190193
case QUERY:
191194
return new QueryXmlProtocolSpec(poetExtensions);
@@ -197,7 +200,7 @@ static ProtocolSpec getProtocolSpecs(PoetExtensions poetExtensions, Protocol pro
197200
case REST_JSON:
198201
case CBOR:
199202
case ION:
200-
return new JsonProtocolSpec(poetExtensions);
203+
return new JsonProtocolSpec(poetExtensions, model);
201204
case API_GATEWAY:
202205
throw new UnsupportedOperationException("Not yet supported.");
203206
default:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import com.squareup.javapoet.MethodSpec;
1919
import java.util.ArrayList;
2020
import java.util.List;
21-
import software.amazon.awssdk.awscore.protocol.query.AwsEc2ProtocolFactory;
2221
import software.amazon.awssdk.codegen.poet.PoetExtensions;
22+
import software.amazon.awssdk.protocols.query.AwsEc2ProtocolFactory;
2323

2424
public class Ec2ProtocolSpec extends QueryXmlProtocolSpec {
2525

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

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.squareup.javapoet.MethodSpec;
2424
import com.squareup.javapoet.ParameterizedTypeName;
2525
import com.squareup.javapoet.TypeName;
26+
import com.squareup.javapoet.TypeVariableName;
2627
import com.squareup.javapoet.WildcardTypeName;
2728
import java.util.List;
2829
import java.util.Optional;
@@ -33,8 +34,6 @@
3334
import software.amazon.awssdk.awscore.eventstream.EventStreamTaggedUnionPojoSupplier;
3435
import software.amazon.awssdk.awscore.eventstream.RestEventStreamAsyncResponseTransformer;
3536
import software.amazon.awssdk.awscore.exception.AwsServiceException;
36-
import software.amazon.awssdk.awscore.protocol.json.AwsJsonProtocol;
37-
import software.amazon.awssdk.awscore.protocol.json.AwsJsonProtocolFactory;
3837
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
3938
import software.amazon.awssdk.codegen.model.intermediate.Metadata;
4039
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
@@ -49,58 +48,73 @@
4948
import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
5049
import software.amazon.awssdk.core.http.HttpResponseHandler;
5150
import software.amazon.awssdk.core.protocol.VoidSdkResponse;
52-
import software.amazon.awssdk.core.protocol.json.JsonErrorResponseMetadata;
53-
import software.amazon.awssdk.core.protocol.json.JsonErrorShapeMetadata;
54-
import software.amazon.awssdk.core.protocol.json.JsonOperationMetadata;
5551
import software.amazon.awssdk.core.runtime.transform.StreamingRequestMarshaller;
52+
import software.amazon.awssdk.protocols.cbor.AwsCborProtocolFactory;
53+
import software.amazon.awssdk.protocols.ion.AwsIonProtocolFactory;
54+
import software.amazon.awssdk.protocols.json.AwsJsonProtocol;
55+
import software.amazon.awssdk.protocols.json.AwsJsonProtocolFactory;
56+
import software.amazon.awssdk.protocols.json.BaseAwsJsonProtocolFactory;
57+
import software.amazon.awssdk.protocols.json.JsonErrorResponseMetadata;
58+
import software.amazon.awssdk.protocols.json.JsonErrorShapeMetadata;
59+
import software.amazon.awssdk.protocols.json.JsonOperationMetadata;
5660

5761
public class JsonProtocolSpec implements ProtocolSpec {
5862

5963
private final PoetExtensions poetExtensions;
64+
private final IntermediateModel model;
6065

61-
public JsonProtocolSpec(PoetExtensions poetExtensions) {
66+
public JsonProtocolSpec(PoetExtensions poetExtensions, IntermediateModel model) {
6267
this.poetExtensions = poetExtensions;
68+
this.model = model;
6369
}
6470

6571
@Override
6672
public FieldSpec protocolFactory(IntermediateModel model) {
67-
return FieldSpec.builder(AwsJsonProtocolFactory.class, "protocolFactory")
73+
return FieldSpec.builder(protocolFactoryClass(), "protocolFactory")
6874
.addModifiers(Modifier.PRIVATE, Modifier.FINAL).build();
6975
}
7076

7177
@Override
7278
public MethodSpec initProtocolFactory(IntermediateModel model) {
7379
ClassName baseException = baseExceptionClassName(model);
74-
7580
Metadata metadata = model.getMetadata();
76-
ClassName protocolFactory = poetExtensions.getClientClass(metadata.getProtocolFactory());
81+
ParameterizedTypeName upperBound = ParameterizedTypeName.get(ClassName.get(BaseAwsJsonProtocolFactory.Builder.class),
82+
TypeVariableName.get("T"));
83+
TypeVariableName typeVariableName = TypeVariableName.get("T", upperBound);
7784

7885
MethodSpec.Builder methodSpec = MethodSpec.methodBuilder("init")
79-
.addParameter(TypeName.BOOLEAN, "supportsCbor")
80-
.returns(protocolFactory)
86+
.addTypeVariable(typeVariableName)
87+
.addParameter(typeVariableName, "builder")
88+
.returns(typeVariableName)
8189
.addModifiers(Modifier.PRIVATE)
8290
.addCode(
83-
"return $T.builder()\n" +
84-
".supportsCbor(supportsCbor)\n" +
85-
".supportsIon($L)\n" +
91+
"return builder\n" +
8692
".baseServiceExceptionClass($T.class)\n" +
8793
".protocol($T.$L)\n" +
8894
".protocolVersion($S)\n",
89-
AwsJsonProtocolFactory.class, metadata.isIonProtocol(), baseException,
90-
AwsJsonProtocol.class, protocolEnumName(metadata.getProtocol()),
91-
metadata.getJsonVersion());
95+
baseException, AwsJsonProtocol.class,
96+
protocolEnumName(metadata.getProtocol()), metadata.getJsonVersion());
9297

9398
if (metadata.getContentType() != null) {
9499
methodSpec.addCode(".withContentTypeOverride($S)", metadata.getContentType());
95100
}
96101

97102
errorUnmarshallers(model).forEach(methodSpec::addCode);
98-
99-
methodSpec.addCode(".build();");
103+
methodSpec.addCode(";");
100104

101105
return methodSpec.build();
102106
}
103107

108+
private Class<?> protocolFactoryClass() {
109+
if (model.getMetadata().isCborProtocol()) {
110+
return AwsCborProtocolFactory.class;
111+
} else if (model.getMetadata().isIonProtocol()) {
112+
return AwsIonProtocolFactory.class;
113+
} else {
114+
return AwsJsonProtocolFactory.class;
115+
}
116+
}
117+
104118
@Override
105119
public CodeBlock responseHandler(IntermediateModel model, OperationModel opModel) {
106120
TypeName pojoResponseType = getPojoResponseType(opModel);
@@ -244,9 +258,9 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper
244258
private String asyncResponseTransformerVariable(boolean isStreaming, boolean isRestJson, OperationModel opModel) {
245259
if (isStreaming) {
246260
if (opModel.hasEventStreamOutput() && isRestJson) {
247-
return ", restAsyncResponseTransformer";
261+
return ", restAsyncResponseTransformer";
248262
} else {
249-
return ", asyncResponseTransformer";
263+
return ", asyncResponseTransformer";
250264
}
251265
}
252266
return "";
@@ -346,7 +360,7 @@ public Optional<MethodSpec> createErrorResponseHandler() {
346360
TypeName responseHandlerOfException = ParameterizedTypeName.get(httpResponseHandler, sdkBaseException);
347361

348362
return Optional.of(MethodSpec.methodBuilder("createErrorResponseHandler")
349-
.addParameter(AwsJsonProtocolFactory.class, "protocolFactory")
363+
.addParameter(BaseAwsJsonProtocolFactory.class, "protocolFactory")
350364
.returns(responseHandlerOfException)
351365
.addModifiers(Modifier.PRIVATE)
352366
.addStatement("return protocolFactory.createErrorResponseHandler(new $T())",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.w3c.dom.Node;
3232
import software.amazon.awssdk.awscore.exception.AwsServiceException;
3333
import software.amazon.awssdk.awscore.http.response.DefaultErrorResponseHandler;
34-
import software.amazon.awssdk.awscore.protocol.query.AwsQueryProtocolFactory;
3534
import software.amazon.awssdk.awscore.protocol.xml.StandardErrorUnmarshaller;
3635
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
3736
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
@@ -42,6 +41,7 @@
4241
import software.amazon.awssdk.core.http.HttpResponseHandler;
4342
import software.amazon.awssdk.core.runtime.transform.StreamingRequestMarshaller;
4443
import software.amazon.awssdk.core.runtime.transform.Unmarshaller;
44+
import software.amazon.awssdk.protocols.query.AwsQueryProtocolFactory;
4545
import software.amazon.awssdk.utils.StringUtils;
4646

4747
public class QueryXmlProtocolSpec implements ProtocolSpec {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@
4848
import software.amazon.awssdk.codegen.poet.PoetExtensions;
4949
import software.amazon.awssdk.codegen.poet.PoetUtils;
5050
import software.amazon.awssdk.codegen.poet.eventstream.EventStreamUtils;
51-
import software.amazon.awssdk.core.protocol.SdkField;
52-
import software.amazon.awssdk.core.protocol.SdkPojo;
51+
import software.amazon.awssdk.core.SdkField;
52+
import software.amazon.awssdk.core.SdkPojo;
5353
import software.amazon.awssdk.core.runtime.TypeConverter;
5454
import software.amazon.awssdk.utils.builder.ToCopyableBuilder;
5555

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
3333
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
3434
import software.amazon.awssdk.codegen.poet.PoetExtensions;
35-
import software.amazon.awssdk.core.protocol.SdkField;
36-
import software.amazon.awssdk.core.protocol.SdkPojo;
35+
import software.amazon.awssdk.core.SdkField;
36+
import software.amazon.awssdk.core.SdkPojo;
3737
import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList;
3838
import software.amazon.awssdk.core.util.DefaultSdkAutoConstructMap;
3939
import software.amazon.awssdk.utils.builder.CopyableBuilder;

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@
3434
import software.amazon.awssdk.codegen.model.intermediate.ShapeType;
3535
import software.amazon.awssdk.codegen.naming.NamingStrategy;
3636
import software.amazon.awssdk.codegen.poet.PoetExtensions;
37+
import software.amazon.awssdk.core.SdkField;
3738
import software.amazon.awssdk.core.protocol.MarshallLocation;
3839
import software.amazon.awssdk.core.protocol.MarshallingType;
39-
import software.amazon.awssdk.core.protocol.SdkField;
40-
import software.amazon.awssdk.core.protocol.traits.DefaultValueTrait;
41-
import software.amazon.awssdk.core.protocol.traits.JsonValueTrait;
42-
import software.amazon.awssdk.core.protocol.traits.ListTrait;
43-
import software.amazon.awssdk.core.protocol.traits.LocationTrait;
44-
import software.amazon.awssdk.core.protocol.traits.MapTrait;
45-
import software.amazon.awssdk.core.protocol.traits.PayloadTrait;
46-
import software.amazon.awssdk.core.protocol.traits.TimestampFormatTrait;
40+
import software.amazon.awssdk.core.traits.DefaultValueTrait;
41+
import software.amazon.awssdk.core.traits.JsonValueTrait;
42+
import software.amazon.awssdk.core.traits.ListTrait;
43+
import software.amazon.awssdk.core.traits.LocationTrait;
44+
import software.amazon.awssdk.core.traits.MapTrait;
45+
import software.amazon.awssdk.core.traits.PayloadTrait;
46+
import software.amazon.awssdk.core.traits.TimestampFormatTrait;
4747

4848
/**
4949
* Provides Poet specs related to shape models.

0 commit comments

Comments
 (0)