Skip to content

Commit 0599016

Browse files
committed
Append paginator user agent for pagination methods
1 parent 417d0c5 commit 0599016

File tree

8 files changed

+307
-132
lines changed

8 files changed

+307
-132
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.awssdk.codegen.poet.client;
1717

1818
import static com.squareup.javapoet.TypeSpec.Builder;
19+
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applyPaginatorUserAgentMethod;
1920
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.getCustomResponseHandler;
2021
import static software.amazon.awssdk.codegen.poet.client.SyncClientClass.getProtocolSpecs;
2122

@@ -67,6 +68,9 @@ public TypeSpec poetSpec() {
6768
.addMethods(protocolSpec.additionalMethods())
6869
.addMethod(protocolSpec.initProtocolFactory(model));
6970

71+
if (model.hasPaginators()) {
72+
classBuilder.addMethod(applyPaginatorUserAgentMethod(poetExtensions, model));
73+
}
7074
protocolSpec.createErrorResponseHandler().ifPresent(classBuilder::addMethod);
7175

7276
return classBuilder.build();
@@ -119,7 +123,7 @@ protected MethodSpec.Builder operationBody(MethodSpec.Builder builder, Operation
119123
@Override
120124
protected MethodSpec.Builder paginatedMethodBody(MethodSpec.Builder builder, OperationModel opModel) {
121125
return builder.addModifiers(Modifier.PUBLIC)
122-
.addStatement("return new $T(this, $L)",
126+
.addStatement("return new $T(this, applyPaginatorUserAgent($L))",
123127
poetExtensions.getResponseClassForPaginatedAsyncOperation(opModel.getOperationName()),
124128
opModel.getInput().getVariableName());
125129
}

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,23 @@
2121
import com.squareup.javapoet.ParameterSpec;
2222
import com.squareup.javapoet.ParameterizedTypeName;
2323
import com.squareup.javapoet.TypeName;
24+
import com.squareup.javapoet.TypeVariableName;
2425
import java.util.Optional;
2526
import java.util.function.Consumer;
2627
import javax.lang.model.element.Modifier;
28+
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
29+
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2730
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
2831
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
32+
import software.amazon.awssdk.codegen.poet.PoetExtensions;
33+
import software.amazon.awssdk.core.ApiName;
2934
import software.amazon.awssdk.core.http.HttpResponseHandler;
35+
import software.amazon.awssdk.core.util.VersionInfo;
3036
import software.amazon.awssdk.utils.Validate;
3137

3238
final class ClientClassUtils {
39+
private static final String PAGINATOR_USER_AGENT = "PAGINATED";
40+
3341
private ClientClassUtils() {
3442
}
3543

@@ -79,4 +87,39 @@ static MethodSpec consumerBuilderVariant(MethodSpec spec, String javadoc) {
7987

8088
return result.build();
8189
}
90+
91+
static MethodSpec applyPaginatorUserAgentMethod(PoetExtensions poetExtensions, IntermediateModel model) {
92+
93+
TypeVariableName typeVariableName =
94+
TypeVariableName.get("T", poetExtensions.getModelClass(model.getSdkRequestBaseClassName()));
95+
96+
ParameterizedTypeName parameterizedTypeName = ParameterizedTypeName
97+
.get(ClassName.get(Consumer.class), ClassName.get(AwsRequestOverrideConfiguration.Builder.class));
98+
99+
CodeBlock codeBlock = CodeBlock.builder()
100+
.addStatement("$T userAgentApplier = b -> b.addApiName($T.builder().version"
101+
+ "($T.SDK_VERSION).name($S).build())",
102+
parameterizedTypeName, ApiName.class,
103+
VersionInfo.class,
104+
PAGINATOR_USER_AGENT)
105+
.addStatement("$T overrideConfiguration =\n"
106+
+ " request.overrideConfiguration().map(c -> c.toBuilder()"
107+
+ ".applyMutation"
108+
+ "(userAgentApplier).build())\n"
109+
+ " .orElse((AwsRequestOverrideConfiguration.builder()"
110+
+ ".applyMutation"
111+
+ "(userAgentApplier).build()))", AwsRequestOverrideConfiguration.class)
112+
.addStatement("return (T) request.toBuilder().overrideConfiguration"
113+
+ "(overrideConfiguration).build()")
114+
.build();
115+
116+
return MethodSpec.methodBuilder("applyPaginatorUserAgent")
117+
.addModifiers(Modifier.PRIVATE)
118+
.addParameter(typeVariableName, "request")
119+
.addTypeVariable(typeVariableName)
120+
.addCode(codeBlock)
121+
.returns(typeVariableName)
122+
.build();
123+
}
124+
82125
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static javax.lang.model.element.Modifier.FINAL;
1919
import static javax.lang.model.element.Modifier.PRIVATE;
20+
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applyPaginatorUserAgentMethod;
2021
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.getCustomResponseHandler;
2122

2223
import com.squareup.javapoet.ClassName;
@@ -81,7 +82,9 @@ public TypeSpec poetSpec() {
8182

8283
classBuilder.addMethod(closeMethod());
8384

84-
classBuilder.addMethods(protocolSpec.additionalMethods());
85+
if (model.hasPaginators()) {
86+
classBuilder.addMethod(applyPaginatorUserAgentMethod(poetExtensions, model));
87+
}
8588

8689
return classBuilder.build();
8790
}
@@ -147,7 +150,7 @@ private List<MethodSpec> paginatedMethods(OperationModel opModel) {
147150
.addAnnotation(Override.class)
148151
.returns(poetExtensions.getResponseClassForPaginatedSyncOperation(
149152
opModel.getOperationName()))
150-
.addStatement("return new $T(this, $L)",
153+
.addStatement("return new $T(this, applyPaginatorUserAgent($L))",
151154
poetExtensions.getResponseClassForPaginatedSyncOperation(
152155
opModel.getOperationName()),
153156
opModel.getInput().getVariableName())

0 commit comments

Comments
 (0)