Skip to content

Commit 61e51b0

Browse files
authored
Changed extension naming to strict names instead of inference (#3069)
1 parent 9aeaa9c commit 61e51b0

File tree

8 files changed

+82
-59
lines changed

8 files changed

+82
-59
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.codegen.model.config.customization;
17+
18+
/**
19+
* Whether the service has API extensions defined apart from the service model.
20+
*/
21+
public class ClientExtensions {
22+
23+
private boolean sync = false;
24+
private boolean async = false;
25+
26+
public boolean getSync() {
27+
return sync;
28+
}
29+
30+
public void setSync(boolean sync) {
31+
this.sync = sync;
32+
}
33+
34+
public boolean getAsync() {
35+
return async;
36+
}
37+
38+
public void setAsync(boolean async) {
39+
this.async = async;
40+
}
41+
42+
}

codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,9 @@ public class CustomizationConfig {
197197
private RetryMode defaultRetryMode;
198198

199199
/**
200-
* The name of the interface that the client interface should extend.
200+
* If the client has API extensions to include.
201201
*/
202-
private String extensionInterface;
203-
202+
private ClientExtensions clientExtensions;
204203

205204
private CustomizationConfig() {
206205
}
@@ -507,11 +506,11 @@ public void setServiceConfig(ServiceConfig serviceConfig) {
507506
this.serviceConfig = serviceConfig;
508507
}
509508

510-
public String getExtensionInterface() {
511-
return extensionInterface;
509+
public ClientExtensions getClientExtensions() {
510+
return clientExtensions;
512511
}
513512

514-
public void setExtensionInterface(String extensionInterface) {
515-
this.extensionInterface = extensionInterface;
513+
public void setClientExtensions(ClientExtensions clientExtensions) {
514+
this.clientExtensions = clientExtensions;
516515
}
517516
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/PoetUtils.java

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
package software.amazon.awssdk.codegen.poet;
1717

18-
import static software.amazon.awssdk.utils.StringUtils.isEmpty;
1918
import static software.amazon.awssdk.utils.StringUtils.isNotBlank;
2019

2120
import com.squareup.javapoet.AnnotationSpec;
@@ -27,24 +26,21 @@
2726
import com.squareup.javapoet.TypeSpec;
2827
import com.squareup.javapoet.TypeVariableName;
2928
import java.util.Arrays;
30-
import java.util.Optional;
3129
import java.util.function.Consumer;
3230
import javax.lang.model.element.Modifier;
33-
import org.slf4j.Logger;
34-
import org.slf4j.LoggerFactory;
3531
import software.amazon.awssdk.annotations.Generated;
36-
import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig;
3732
import software.amazon.awssdk.codegen.model.intermediate.DocumentationModel;
3833
import software.amazon.awssdk.codegen.model.intermediate.HasDeprecation;
3934

4035
public final class PoetUtils {
4136

42-
private static final Logger log = LoggerFactory.getLogger(PoetUtils.class);
43-
4437
private static final AnnotationSpec GENERATED = AnnotationSpec.builder(Generated.class)
4538
.addMember("value", "$S", "software.amazon.awssdk:codegen")
4639
.build();
4740

41+
private static final String EXTENSION_PACKAGE = ".extensions";
42+
private static final String EXTENSION_INTERFACE_SUFFIX = "SdkExtension";
43+
4844
private PoetUtils() {
4945
}
5046

@@ -117,21 +113,9 @@ public static JavaFile buildJavaFile(ClassSpec spec) {
117113
return builder.build();
118114
}
119115

120-
public static Optional<ClassName> findExtensionInterface(ClassName clientInterfaceName,
121-
CustomizationConfig customizationConfig) {
122-
String extensionInterfaceFqcn = customizationConfig.getExtensionInterface();
123-
124-
if (!isEmpty(extensionInterfaceFqcn)) {
125-
ClassName interfaceName = classNameFromFqcn(extensionInterfaceFqcn);
126-
log.info(String.format("Found client extension interface %s.", interfaceName));
127-
if (!interfaceName.packageName().contains(clientInterfaceName.packageName())) {
128-
throw new IllegalArgumentException(
129-
String.format("Extension interface package is not part of service client package. "
130-
+ "Client package: %s. Extension interface package: %s",
131-
clientInterfaceName.packageName(), interfaceName.packageName()));
132-
}
133-
return Optional.of(interfaceName);
134-
}
135-
return Optional.empty();
116+
public static ClassName extensionInterfaceClassName(ClassName clientInterfaceName) {
117+
String packageName = clientInterfaceName.packageName() + EXTENSION_PACKAGE;
118+
String className = clientInterfaceName.simpleName() + EXTENSION_INTERFACE_SUFFIX;
119+
return ClassName.get(packageName, className);
136120
}
137121
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static java.util.stream.Collectors.toList;
2020
import static software.amazon.awssdk.codegen.internal.Constant.SYNC_CLIENT_DESTINATION_PATH_PARAM_NAME;
2121
import static software.amazon.awssdk.codegen.internal.Constant.SYNC_CLIENT_SOURCE_PATH_PARAM_NAME;
22+
import static software.amazon.awssdk.codegen.poet.PoetUtils.extensionInterfaceClassName;
2223
import static software.amazon.awssdk.codegen.poet.client.AsyncClientInterface.STREAMING_TYPE_VARIABLE;
2324

2425
import com.squareup.javapoet.ClassName;
@@ -43,6 +44,8 @@
4344
import software.amazon.awssdk.codegen.docs.DocConfiguration;
4445
import software.amazon.awssdk.codegen.docs.SimpleMethodOverload;
4546
import software.amazon.awssdk.codegen.docs.WaiterDocs;
47+
import software.amazon.awssdk.codegen.model.config.customization.ClientExtensions;
48+
import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig;
4649
import software.amazon.awssdk.codegen.model.config.customization.UtilitiesMethod;
4750
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
4851
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
@@ -94,7 +97,7 @@ public TypeSpec poetSpec() {
9497
ServiceMetadataProvider.class)
9598
.build());
9699

97-
Optional<ClassName> extensionClass = PoetUtils.findExtensionInterface(className, model.getCustomizationConfig());
100+
Optional<ClassName> extensionClass = findExtensionInterface(className, model.getCustomizationConfig());
98101
extensionClass.ifPresent(result::addSuperinterface);
99102

100103
PoetUtils.addJavadoc(result::addJavadoc, getJavadoc());
@@ -506,4 +509,14 @@ private MethodSpec waiterMethod() {
506509
.addJavadoc(WaiterDocs.waiterMethodInClient(poetExtensions.getSyncWaiterInterface()))
507510
.build();
508511
}
512+
513+
private static Optional<ClassName> findExtensionInterface(ClassName clientInterfaceName,
514+
CustomizationConfig customizationConfig) {
515+
ClientExtensions clientExtensions = customizationConfig.getClientExtensions();
516+
517+
if (clientExtensions != null && clientExtensions.getSync()) {
518+
return Optional.of(extensionInterfaceClassName(clientInterfaceName));
519+
}
520+
return Optional.empty();
521+
}
509522
}

codegen/src/test/java/software/amazon/awssdk/codegen/poet/utils/PoetUtilsTest.java

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.junit.jupiter.api.Test;
2424
import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig;
2525
import software.amazon.awssdk.codegen.poet.PoetUtils;
26-
import software.amazon.awssdk.codegen.poet.client.SyncClientInterface;
2726

2827
/**
2928
* Validate functionality of {@link PoetUtils} methods.
@@ -32,29 +31,11 @@ public class PoetUtilsTest {
3231

3332
@Test
3433
public void findExtensionInterface_whenNotExists_returnEmpty() {
35-
ClassName cl = ClassName.get("software.amazon.awssdk.sdkservice", "SdkServiceClient");
36-
CustomizationConfig customizationConfig = CustomizationConfig.create();
37-
Optional<ClassName> extensionClass = PoetUtils.findExtensionInterface(cl, customizationConfig);
38-
assertThat(extensionClass).isEmpty();
34+
ClassName clientName = ClassName.get("software.amazon.awssdk.sdkservice", "SdkServiceClient");
35+
ClassName extensionClass = PoetUtils.extensionInterfaceClassName(clientName);
36+
assertThat(extensionClass).isNotNull();
37+
assertThat(extensionClass.canonicalName())
38+
.isEqualTo("software.amazon.awssdk.sdkservice.extensions.SdkServiceClientSdkExtension");
3939
}
4040

41-
@Test
42-
public void findExtensionInterface_whenExists_returnClass() {
43-
ClassName cl = ClassName.get("software.amazon.awssdk.sdkservice","SdkServiceClient");
44-
CustomizationConfig customizationConfig = CustomizationConfig.create();
45-
customizationConfig.setExtensionInterface("software.amazon.awssdk.sdkservice.SdkServiceClientExtensionMethods");
46-
Optional<ClassName> extensionClass = PoetUtils.findExtensionInterface(cl, customizationConfig);
47-
assertThat(extensionClass).isPresent();
48-
assertThat(extensionClass.get().canonicalName()).isEqualTo("software.amazon.awssdk.sdkservice.SdkServiceClientExtensionMethods");
49-
}
50-
51-
@Test
52-
public void findExtensionInterface_differentPackages_throwsException() {
53-
ClassName cl = ClassName.get("software.amazon.awssdk.sdkservice","SdkServiceClient");
54-
CustomizationConfig customizationConfig = CustomizationConfig.create();
55-
customizationConfig.setExtensionInterface("software.amazon.awssdk.someotherpackage.SdkServiceClientExtensionMethods");
56-
assertThatThrownBy(() -> PoetUtils.findExtensionInterface(cl, customizationConfig))
57-
.isInstanceOf(IllegalArgumentException.class)
58-
.hasMessageContaining("package");
59-
}
6041
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
{
2-
"extensionInterface": "software.amazon.awssdk.services.sdkextensions.extensions.SdkExtensionsClientExtensionMethods"
2+
"clientExtensions": {
3+
"sync": true
4+
}
35
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/test-clientextensions-sync-interface.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import software.amazon.awssdk.core.SdkClient;
99
import software.amazon.awssdk.core.exception.SdkClientException;
1010
import software.amazon.awssdk.regions.ServiceMetadata;
11-
import software.amazon.awssdk.services.sdkextensions.extensions.SdkExtensionsClientExtensionMethods;
11+
import software.amazon.awssdk.services.sdkextensions.extensions.SdkExtensionsClientSdkExtension;
1212
import software.amazon.awssdk.services.sdkextensions.model.OneOperationRequest;
1313
import software.amazon.awssdk.services.sdkextensions.model.OneOperationResponse;
1414
import software.amazon.awssdk.services.sdkextensions.model.SdkExtensionsException;
@@ -21,7 +21,7 @@
2121
@Generated("software.amazon.awssdk:codegen")
2222
@SdkPublicApi
2323
@ThreadSafe
24-
public interface SdkExtensionsClient extends SdkClient, SdkExtensionsClientExtensionMethods {
24+
public interface SdkExtensionsClient extends SdkClient, SdkExtensionsClientSdkExtension {
2525
String SERVICE_NAME = "clientextensions";
2626

2727
/**

services/s3/src/main/resources/codegen-resources/customization.config

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,7 @@
160160
"clientConfiguration"
161161
]
162162
},
163-
"extensionInterface": "software.amazon.awssdk.services.s3.extensions.S3ClientExtensionMethods"
163+
"clientExtensions": {
164+
"sync": true
165+
}
164166
}

0 commit comments

Comments
 (0)