Skip to content

Commit bfa24e7

Browse files
authored
Remove emptyMap case that would miss additionalAuthSchemes (#4364)
* Remove emptyMap case that would miss additionalAuthSchemes * Add test case with service level authType=none
1 parent 2aba2a0 commit bfa24e7

File tree

9 files changed

+195
-15
lines changed

9 files changed

+195
-15
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -643,11 +643,6 @@ private MethodSpec authSchemesMethod() {
643643
.returns(returns);
644644

645645
Set<Class<?>> concreteAuthSchemeClasses = authSchemeSpecUtils.allServiceConcreteAuthSchemeClasses();
646-
if (concreteAuthSchemeClasses.isEmpty()) {
647-
builder.addStatement("return $T.emptyMap()", Collections.class);
648-
return builder.build();
649-
}
650-
651646
builder.addStatement("$T schemes = new $T<>($L + this.additionalAuthSchemes.size())",
652647
returns, HashMap.class, concreteAuthSchemeClasses.size());
653648
for (Class<?> concreteAuthScheme : concreteAuthSchemeClasses) {

codegen/src/test/java/software/amazon/awssdk/codegen/poet/ClientTestModels.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public static IntermediateModel allOperationsWithAuthDifferentValueServiceModels
214214
return new IntermediateModelBuilder(models).build();
215215
}
216216

217-
public static IntermediateModel serviceWithNoAuth() {
217+
public static IntermediateModel operationWithNoAuth() {
218218
File serviceModel =
219219
new File(ClientTestModels.class.getResource("client/c2j/ops-with-no-auth/service-2.json").getFile());
220220
File customizationModel =
@@ -229,6 +229,21 @@ public static IntermediateModel serviceWithNoAuth() {
229229
return new IntermediateModelBuilder(models).build();
230230
}
231231

232+
public static IntermediateModel serviceWithNoAuth() {
233+
File serviceModel =
234+
new File(ClientTestModels.class.getResource("client/c2j/service-with-no-auth/service-2.json").getFile());
235+
File customizationModel =
236+
new File(ClientTestModels.class.getResource("client/c2j/service-with-no-auth/customization.config")
237+
.getFile());
238+
C2jModels models = C2jModels
239+
.builder()
240+
.serviceModel(getServiceModel(serviceModel))
241+
.customizationConfig(getCustomizationConfig(customizationModel))
242+
.build();
243+
244+
return new IntermediateModelBuilder(models).build();
245+
}
246+
232247
public static IntermediateModel serviceMiniS3() {
233248
File serviceModel =
234249
new File(ClientTestModels.class.getResource("client/c2j/mini-s3/service-2.json").getFile());

codegen/src/test/java/software/amazon/awssdk/codegen/poet/auth/scheme/AuthSchemeSpecTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ static List<TestCase> parameters() {
150150
.build(),
151151
// Service with operations with auth none
152152
TestCase.builder()
153-
.modelProvider(ClientTestModels::serviceWithNoAuth)
153+
.modelProvider(ClientTestModels::operationWithNoAuth)
154154
.classSpecProvider(ModelBasedAuthSchemeProviderSpec::new)
155-
.caseName("service-with-no-auth")
155+
.caseName("ops-with-no-auth")
156156
.outputFileSuffix("default-provider")
157157
.build(),
158158
// Service with signature version with the same value as S3

codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BuilderClassTest.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,23 @@ public void baseClientBuilderClass() throws Exception {
3939
}
4040

4141
@Test
42-
public void baseClientBuilderInterfaceWithBearerAuthClass() throws Exception {
42+
public void baseClientBuilderInterfaceWithBearerAuth() throws Exception {
4343
validateBearerAuthGeneration(BaseClientBuilderInterface::new, "test-bearer-auth-client-builder-interface.java");
4444
}
4545

4646
@Test
47-
public void baseClientBuilderInterfaceWithNoAuthClass() throws Exception {
48-
validateNoAuthAuthGeneration(BaseClientBuilderClass::new, "test-no-auth-auth-client-builder-class.java");
47+
public void baseClientBuilderClassWithBearerAuth() throws Exception {
48+
validateBearerAuthGeneration(BaseClientBuilderClass::new, "test-bearer-auth-client-builder-class.java");
4949
}
5050

5151
@Test
52-
public void baseClientBuilderWithBearerAuthClass() throws Exception {
53-
validateBearerAuthGeneration(BaseClientBuilderClass::new, "test-bearer-auth-client-builder-class.java");
52+
public void baseClientBuilderClassWithNoAuthOperation() throws Exception {
53+
validateNoAuthOperationAuthGeneration(BaseClientBuilderClass::new, "test-no-auth-ops-client-builder-class.java");
54+
}
55+
56+
@Test
57+
public void baseClientBuilderClassWithNoAuthService() throws Exception {
58+
validateNoAuthServiceAuthGeneration(BaseClientBuilderClass::new, "test-no-auth-service-client-builder-class.java");
5459
}
5560

5661
@Test
@@ -123,8 +128,13 @@ private void validateBearerAuthGeneration(Function<IntermediateModel, ClassSpec>
123128
assertThat(generatorConstructor.apply(ClientTestModels.bearerAuthServiceModels()), generatesTo(expectedClassName));
124129
}
125130

126-
private void validateNoAuthAuthGeneration(Function<IntermediateModel, ClassSpec> generatorConstructor,
127-
String expectedClassName) {
131+
private void validateNoAuthOperationAuthGeneration(Function<IntermediateModel, ClassSpec> generatorConstructor,
132+
String expectedClassName) {
133+
assertThat(generatorConstructor.apply(ClientTestModels.operationWithNoAuth()), generatesTo(expectedClassName));
134+
}
135+
136+
private void validateNoAuthServiceAuthGeneration(Function<IntermediateModel, ClassSpec> generatorConstructor,
137+
String expectedClassName) {
128138
assertThat(generatorConstructor.apply(ClientTestModels.serviceWithNoAuth()), generatesTo(expectedClassName));
129139
}
130140

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package software.amazon.awssdk.services.database;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
import software.amazon.awssdk.annotations.Generated;
9+
import software.amazon.awssdk.annotations.SdkInternalApi;
10+
import software.amazon.awssdk.awscore.client.builder.AwsDefaultClientBuilder;
11+
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
12+
import software.amazon.awssdk.core.client.config.SdkClientOption;
13+
import software.amazon.awssdk.core.interceptor.ClasspathInterceptorChainFactory;
14+
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
15+
import software.amazon.awssdk.http.auth.spi.AuthScheme;
16+
import software.amazon.awssdk.http.auth.spi.NoAuthAuthScheme;
17+
import software.amazon.awssdk.services.database.auth.scheme.DatabaseAuthSchemeProvider;
18+
import software.amazon.awssdk.services.database.auth.scheme.internal.DatabaseAuthSchemeInterceptor;
19+
import software.amazon.awssdk.services.database.endpoints.DatabaseEndpointProvider;
20+
import software.amazon.awssdk.services.database.endpoints.internal.DatabaseRequestSetEndpointInterceptor;
21+
import software.amazon.awssdk.services.database.endpoints.internal.DatabaseResolveEndpointInterceptor;
22+
import software.amazon.awssdk.utils.CollectionUtils;
23+
24+
/**
25+
* Internal base class for {@link DefaultDatabaseClientBuilder} and {@link DefaultDatabaseAsyncClientBuilder}.
26+
*/
27+
@Generated("software.amazon.awssdk:codegen")
28+
@SdkInternalApi
29+
abstract class DefaultDatabaseBaseClientBuilder<B extends DatabaseBaseClientBuilder<B, C>, C> extends
30+
AwsDefaultClientBuilder<B, C> {
31+
private final Map<String, AuthScheme<?>> additionalAuthSchemes = new HashMap<>();
32+
33+
@Override
34+
protected final String serviceEndpointPrefix() {
35+
return "database-service-endpoint";
36+
}
37+
38+
@Override
39+
protected final String serviceName() {
40+
return "Database";
41+
}
42+
43+
@Override
44+
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
45+
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
46+
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
47+
.option(SdkClientOption.AUTH_SCHEMES, authSchemes())
48+
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false));
49+
}
50+
51+
@Override
52+
protected final SdkClientConfiguration finalizeServiceConfiguration(SdkClientConfiguration config) {
53+
List<ExecutionInterceptor> endpointInterceptors = new ArrayList<>();
54+
endpointInterceptors.add(new DatabaseAuthSchemeInterceptor());
55+
endpointInterceptors.add(new DatabaseResolveEndpointInterceptor());
56+
endpointInterceptors.add(new DatabaseRequestSetEndpointInterceptor());
57+
ClasspathInterceptorChainFactory interceptorFactory = new ClasspathInterceptorChainFactory();
58+
List<ExecutionInterceptor> interceptors = interceptorFactory
59+
.getInterceptors("software/amazon/awssdk/services/database/execution.interceptors");
60+
List<ExecutionInterceptor> additionalInterceptors = new ArrayList<>();
61+
interceptors = CollectionUtils.mergeLists(endpointInterceptors, interceptors);
62+
interceptors = CollectionUtils.mergeLists(interceptors, additionalInterceptors);
63+
interceptors = CollectionUtils.mergeLists(interceptors, config.option(SdkClientOption.EXECUTION_INTERCEPTORS));
64+
SdkClientConfiguration.Builder builder = config.toBuilder();
65+
builder.option(SdkClientOption.EXECUTION_INTERCEPTORS, interceptors);
66+
return builder.build();
67+
}
68+
69+
@Override
70+
protected final String signingName() {
71+
return "database-service";
72+
}
73+
74+
private DatabaseEndpointProvider defaultEndpointProvider() {
75+
return DatabaseEndpointProvider.defaultProvider();
76+
}
77+
78+
public B authSchemeProvider(DatabaseAuthSchemeProvider authSchemeProvider) {
79+
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
80+
return thisBuilder();
81+
}
82+
83+
private DatabaseAuthSchemeProvider defaultAuthSchemeProvider() {
84+
return DatabaseAuthSchemeProvider.defaultProvider();
85+
}
86+
87+
@Override
88+
public B putAuthScheme(AuthScheme<?> authScheme) {
89+
additionalAuthSchemes.put(authScheme.schemeId(), authScheme);
90+
return thisBuilder();
91+
}
92+
93+
private Map<String, AuthScheme<?>> authSchemes() {
94+
Map<String, AuthScheme<?>> schemes = new HashMap<>(1 + this.additionalAuthSchemes.size());
95+
NoAuthAuthScheme noAuthAuthScheme = NoAuthAuthScheme.create();
96+
schemes.put(noAuthAuthScheme.schemeId(), noAuthAuthScheme);
97+
schemes.putAll(this.additionalAuthSchemes);
98+
return Collections.unmodifiableMap(schemes);
99+
}
100+
101+
protected static void validateClientOptions(SdkClientConfiguration c) {
102+
}
103+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{
2+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"version": "2.0",
3+
"metadata": {
4+
"apiVersion": "2023-06-08",
5+
"endpointPrefix": "database-service-endpoint",
6+
"globalEndpoint": "database-service.amazonaws.com",
7+
"protocol": "rest-json",
8+
"serviceAbbreviation": "Database Service",
9+
"serviceFullName": "Some Service That Has No Auth At All",
10+
"serviceId": "Database Service",
11+
"signingName": "database-service",
12+
"signatureVersion": "none",
13+
"auth": [],
14+
"uid": "database-service-2023-06-08",
15+
"xmlNamespace": "https://database-service.amazonaws.com/doc/2023-06-08/"
16+
},
17+
"operations": {
18+
"GetDatabaseVersion": {
19+
"name": "GetDatabaseVersion",
20+
"http": {
21+
"method": "GET",
22+
"requestUri": "/get-version/"
23+
},
24+
"input": {
25+
"shape": "GetDatabaseVersionRequest"
26+
},
27+
"output": {
28+
"shape": "GetDatabaseVersionResponse"
29+
},
30+
"documentation": "<p>Performs a get database version operation</p>"
31+
}
32+
},
33+
"shapes": {
34+
"GetDatabaseVersionRequest": {
35+
"type": "structure",
36+
"members": {
37+
"StringMember": {
38+
"shape": "String",
39+
"documentation": "<p>A string Member</p>"
40+
}
41+
}
42+
},
43+
"GetDatabaseVersionResponse": {
44+
"type": "structure",
45+
"members": {
46+
"StringMember": {
47+
"shape": "String",
48+
"documentation": "<p>A string Member</p>"
49+
}
50+
}
51+
},
52+
"String":{"type":"string"}
53+
},
54+
"documentation": "A Database Service with no auth on the service at all"
55+
}

0 commit comments

Comments
 (0)