Skip to content

Commit eb4c3a2

Browse files
authored
Add useragent for service and version (#6212)
* Add changelog * Refactor test, edit changelog * Add user agent for service version * Add changelog * Remove extra changelog * Fix unit test * Fix fixture files * Fix more fixture files * Move useragent info to ServiceVersionInfo * Building useragent in client class instead of a constant * Refactor, add test * Removing empty string default
1 parent f1064f9 commit eb4c3a2

File tree

42 files changed

+1539
-1403
lines changed

Some content is hidden

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

42 files changed

+1539
-1403
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "",
5+
"description": "Add the sdk service client version to the useragent"
6+
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static software.amazon.awssdk.codegen.internal.Constant.EVENT_PUBLISHER_PARAM_NAME;
2727
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.addS3ArnableFieldCode;
2828
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applySignerOverrideMethod;
29+
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.transformServiceId;
2930
import static software.amazon.awssdk.codegen.poet.client.SyncClientClass.addRequestModifierCode;
3031
import static software.amazon.awssdk.codegen.poet.client.SyncClientClass.getProtocolSpecs;
3132

@@ -229,7 +230,14 @@ private MethodSpec constructor(TypeSpec.Builder classBuilder) {
229230
.addStatement("this.clientHandler = new $T(clientConfiguration)", AwsAsyncClientHandler.class)
230231
.addStatement("this.clientConfiguration = clientConfiguration.toBuilder()"
231232
+ ".option($T.SDK_CLIENT, this)"
232-
+ ".build()", SdkClientOption.class);
233+
+ ".option($T.API_METADATA, $S + \"#\" + $T.VERSION)"
234+
+ ".build()",
235+
SdkClientOption.class,
236+
SdkClientOption.class,
237+
transformServiceId(model.getMetadata().getServiceId()),
238+
ClassName.get(model.getMetadata().getFullClientInternalPackageName(),
239+
"ServiceVersionInfo"));
240+
233241
FieldSpec protocolFactoryField = protocolSpec.protocolFactory(model);
234242
if (model.getMetadata().isJsonProtocol()) {
235243
builder.addStatement("this.$N = init($T.builder()).build()", protocolFactoryField.name,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,4 +280,9 @@ public static MethodSpec updateRetryStrategyClientConfigurationMethod() {
280280
builder.addStatement("configuration.option($T.CONFIGURED_RETRY_CONFIGURATOR, null)", SdkClientOption.class);
281281
return builder.build();
282282
}
283+
284+
// According to User Agent 2.0 spec, replace spaces with underscores
285+
static String transformServiceId(String serviceId) {
286+
return serviceId.replace(" ", "_");
287+
}
283288
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static software.amazon.awssdk.codegen.poet.PoetUtils.classNameFromFqcn;
2424
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.addS3ArnableFieldCode;
2525
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applySignerOverrideMethod;
26+
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.transformServiceId;
2627

2728
import com.squareup.javapoet.ClassName;
2829
import com.squareup.javapoet.CodeBlock;
@@ -201,7 +202,13 @@ private MethodSpec constructor() {
201202
.addStatement("this.clientHandler = new $T(clientConfiguration)", protocolSpec.getClientHandlerClass())
202203
.addStatement("this.clientConfiguration = clientConfiguration.toBuilder()"
203204
+ ".option($T.SDK_CLIENT, this)"
204-
+ ".build()", SdkClientOption.class);
205+
+ ".option($T.API_METADATA, $S + \"#\" + $T.VERSION)"
206+
+ ".build()",
207+
SdkClientOption.class,
208+
SdkClientOption.class,
209+
transformServiceId(model.getMetadata().getServiceId()),
210+
ClassName.get(model.getMetadata().getFullClientInternalPackageName(),
211+
"ServiceVersionInfo"));
205212

206213
FieldSpec protocolFactoryField = protocolSpec.protocolFactory(model);
207214
if (model.getMetadata().isJsonProtocol()) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.squareup.javapoet.MethodSpec;
2323
import com.squareup.javapoet.TypeSpec;
2424
import javax.lang.model.element.Modifier;
25+
import software.amazon.awssdk.annotations.SdkInternalApi;
2526
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2627
import software.amazon.awssdk.codegen.poet.ClassSpec;
2728
import software.amazon.awssdk.codegen.poet.PoetExtension;
@@ -39,6 +40,7 @@ public TypeSpec poetSpec() {
3940
TypeSpec.Builder builder = TypeSpec.classBuilder("ServiceVersionInfo")
4041
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
4142
.addAnnotation(PoetUtils.generatedAnnotation())
43+
.addAnnotation(SdkInternalApi.class)
4244
.addField(FieldSpec.builder(
4345
String.class, "VERSION", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
4446
.initializer("$S", SDK_VERSION)

codegen/src/test/java/software/amazon/awssdk/codegen/poet/client/ServiceVersionInfoSpecTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,17 @@
3131
public class ServiceVersionInfoSpecTest {
3232

3333
// Fixture test that compares generated ServiceVersionInfo class against expected output.
34-
// The fixture file uses {{VERSION}} as a placeholder which gets replaced with the current
35-
// SDK version at test time, since the generated code injects the actual version at build time.
34+
// The fixture file uses {{VERSION}} as a placeholder for the SDK version. The placeholder get
35+
// replaced with actual value at test time, since the generated code injects the actual
36+
// version at build time.
3637
@Test
3738
void testServiceVersionInfoClass() {
3839
String currVersion = VersionInfo.SDK_VERSION;
3940
ClassSpec serviceVersionInfoSpec = new ServiceVersionInfoSpec(ClientTestModels.restJsonServiceModels());
4041

4142
String expectedContent = loadFixtureFile("test-service-version-info-class.java");
42-
expectedContent = expectedContent.replace("{{VERSION}}", currVersion);
43+
expectedContent = expectedContent
44+
.replace("{{VERSION}}", currVersion);
4345

4446
String actualContent = generateContent(serviceVersionInfoSpec);
4547

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/specs/test-service-version-info-class.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import java.lang.String;
44
import software.amazon.awssdk.annotations.Generated;
5+
import software.amazon.awssdk.annotations.SdkInternalApi;
56

67
@Generated("software.amazon.awssdk:codegen")
8+
@SdkInternalApi
79
public final class ServiceVersionInfo {
810
/**
911
* Returns the current version for the AWS SDK in which this class is running.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import software.amazon.awssdk.protocols.json.JsonOperationMetadata;
5959
import software.amazon.awssdk.retries.api.RetryStrategy;
6060
import software.amazon.awssdk.services.json.internal.JsonServiceClientConfigurationBuilder;
61+
import software.amazon.awssdk.services.json.internal.ServiceVersionInfo;
6162
import software.amazon.awssdk.services.json.model.APostOperationRequest;
6263
import software.amazon.awssdk.services.json.model.APostOperationResponse;
6364
import software.amazon.awssdk.services.json.model.APostOperationWithOutputRequest;
@@ -140,7 +141,8 @@ final class DefaultJsonAsyncClient implements JsonAsyncClient {
140141

141142
protected DefaultJsonAsyncClient(SdkClientConfiguration clientConfiguration) {
142143
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
143-
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
144+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this)
145+
.option(SdkClientOption.API_METADATA, "Json_Service" + "#" + ServiceVersionInfo.VERSION).build();
144146
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
145147
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
146148
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import software.amazon.awssdk.protocols.json.JsonOperationMetadata;
6060
import software.amazon.awssdk.retries.api.RetryStrategy;
6161
import software.amazon.awssdk.services.json.internal.JsonServiceClientConfigurationBuilder;
62+
import software.amazon.awssdk.services.json.internal.ServiceVersionInfo;
6263
import software.amazon.awssdk.services.json.model.APostOperationRequest;
6364
import software.amazon.awssdk.services.json.model.APostOperationResponse;
6465
import software.amazon.awssdk.services.json.model.APostOperationWithOutputRequest;
@@ -143,7 +144,9 @@ final class DefaultJsonAsyncClient implements JsonAsyncClient {
143144

144145
protected DefaultJsonAsyncClient(SdkClientConfiguration clientConfiguration) {
145146
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
146-
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
147+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this)
148+
.option(SdkClientOption.API_METADATA,
149+
"Json_Service" + "#" + ServiceVersionInfo.VERSION).build();
147150
this.protocolFactory = init(AwsCborProtocolFactory.builder()).build();
148151
this.jsonProtocolFactory = init(AwsJsonProtocolFactory.builder()).build();
149152
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import software.amazon.awssdk.retries.api.RetryStrategy;
6565
import software.amazon.awssdk.services.json.batchmanager.JsonAsyncBatchManager;
6666
import software.amazon.awssdk.services.json.internal.JsonServiceClientConfigurationBuilder;
67+
import software.amazon.awssdk.services.json.internal.ServiceVersionInfo;
6768
import software.amazon.awssdk.services.json.model.APostOperationRequest;
6869
import software.amazon.awssdk.services.json.model.APostOperationResponse;
6970
import software.amazon.awssdk.services.json.model.APostOperationWithOutputRequest;
@@ -153,7 +154,9 @@ final class DefaultJsonAsyncClient implements JsonAsyncClient {
153154

154155
protected DefaultJsonAsyncClient(SdkClientConfiguration clientConfiguration) {
155156
this.clientHandler = new AwsAsyncClientHandler(clientConfiguration);
156-
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this).build();
157+
this.clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.SDK_CLIENT, this)
158+
.option(SdkClientOption.API_METADATA,
159+
"Json_Service" + "#" + ServiceVersionInfo.VERSION).build();
157160
this.protocolFactory = init(AwsJsonProtocolFactory.builder()).build();
158161
this.executor = clientConfiguration.option(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR);
159162
this.executorService = clientConfiguration.option(SdkClientOption.SCHEDULED_EXECUTOR_SERVICE);

0 commit comments

Comments
 (0)