Skip to content

Commit fc6d3e6

Browse files
committed
Adding functionality to config preferred authschemeProvider
1 parent 39d95ee commit fc6d3e6

File tree

4 files changed

+192
-0
lines changed

4 files changed

+192
-0
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/AuthSchemeGeneratorTasks.java

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import software.amazon.awssdk.codegen.poet.auth.scheme.EndpointAwareAuthSchemeParamsSpec;
2929
import software.amazon.awssdk.codegen.poet.auth.scheme.EndpointBasedAuthSchemeProviderSpec;
3030
import software.amazon.awssdk.codegen.poet.auth.scheme.ModelBasedAuthSchemeProviderSpec;
31+
import software.amazon.awssdk.codegen.poet.auth.scheme.PreferredAuthSchemeProviderSpec;
3132

3233
public final class AuthSchemeGeneratorTasks extends BaseGeneratorTasks {
3334
private final GeneratorTaskParams generatorTaskParams;
@@ -45,6 +46,7 @@ protected List<GeneratorTask> createTasks() {
4546
tasks.add(generateProviderInterface());
4647
tasks.add(generateDefaultParamsImpl());
4748
tasks.add(generateModelBasedProvider());
49+
tasks.add(generatePreferenceProvider());
4850
tasks.add(generateAuthSchemeInterceptor());
4951
if (authSchemeSpecUtils.useEndpointBasedAuthProvider()) {
5052
tasks.add(generateEndpointBasedProvider());
@@ -69,6 +71,10 @@ private GeneratorTask generateModelBasedProvider() {
6971
return new PoetGeneratorTask(authSchemeInternalDir(), model.getFileHeader(), new ModelBasedAuthSchemeProviderSpec(model));
7072
}
7173

74+
private GeneratorTask generatePreferenceProvider() {
75+
return new PoetGeneratorTask(authSchemeInternalDir(), model.getFileHeader(), new PreferredAuthSchemeProviderSpec(model));
76+
}
77+
7278
private GeneratorTask generateEndpointBasedProvider() {
7379
return new PoetGeneratorTask(authSchemeInternalDir(), model.getFileHeader(),
7480
new EndpointBasedAuthSchemeProviderSpec(model));

codegen/src/main/java/software/amazon/awssdk/codegen/poet/auth/scheme/AuthSchemeProviderSpec.java

+76
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@
1717

1818
import com.squareup.javapoet.ClassName;
1919
import com.squareup.javapoet.CodeBlock;
20+
import com.squareup.javapoet.FieldSpec;
2021
import com.squareup.javapoet.MethodSpec;
2122
import com.squareup.javapoet.ParameterizedTypeName;
2223
import com.squareup.javapoet.TypeName;
2324
import com.squareup.javapoet.TypeSpec;
25+
import java.util.ArrayList;
26+
import java.util.List;
2427
import java.util.function.Consumer;
2528
import javax.lang.model.element.Modifier;
29+
import software.amazon.awssdk.annotations.SdkInternalApi;
2630
import software.amazon.awssdk.annotations.SdkPublicApi;
2731
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2832
import software.amazon.awssdk.codegen.poet.ClassSpec;
@@ -54,6 +58,9 @@ public TypeSpec poetSpec() {
5458
.addMethod(resolveAuthSchemeMethod())
5559
.addMethod(resolveAuthSchemeConsumerBuilderMethod())
5660
.addMethod(defaultProviderMethod())
61+
.addMethod(staticBuilderMethodSpec())
62+
.addType(builderInterfaceSpec())
63+
.addType(builderClassSpec())
5764
.build();
5865
}
5966

@@ -104,4 +111,73 @@ private CodeBlock interfaceJavadoc() {
104111

105112
return b.build();
106113
}
114+
115+
private MethodSpec staticBuilderMethodSpec() {
116+
return MethodSpec.methodBuilder("builder")
117+
.addJavadoc("Create a builder for the auth scheme provider.")
118+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
119+
.returns(className().nestedClass("Builder"))
120+
.addStatement("return new $T()", ClassName.get(className().packageName(),
121+
className().simpleName(),
122+
className().simpleName() + "Builder")
123+
)
124+
.build();
125+
}
126+
127+
128+
private TypeSpec builderInterfaceSpec() {
129+
return TypeSpec.interfaceBuilder("Builder")
130+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
131+
.addMethod(MethodSpec.methodBuilder("build")
132+
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
133+
.addJavadoc("Returns a {@link $T} object that is created from the "
134+
+ "properties that have been set on the builder.",
135+
className())
136+
.returns(className())
137+
.build())
138+
139+
.addMethod(MethodSpec.methodBuilder("withPreferredAuthSchemes")
140+
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
141+
.addJavadoc("Set the preferred auth schemes in order of preference.")
142+
.returns(className().nestedClass("Builder"))
143+
.addParameter(
144+
ParameterizedTypeName.get(List.class, String.class),
145+
"authSchemePreference"
146+
)
147+
.build())
148+
.build();
149+
}
150+
151+
private TypeSpec builderClassSpec() {
152+
return TypeSpec.classBuilder(authSchemeSpecUtils.authSchemeProviderBuilderName())
153+
.addAnnotation(SdkInternalApi.class)
154+
.addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC)
155+
.addSuperinterface(className().nestedClass("Builder"))
156+
.addField(
157+
FieldSpec
158+
.builder(ParameterizedTypeName.get(List.class, String.class), "authSchemePreference")
159+
.addModifiers(Modifier.PRIVATE)
160+
.build())
161+
.addMethod(
162+
MethodSpec
163+
.methodBuilder("withPreferredAuthSchemes").addAnnotation(Override.class)
164+
.addModifiers(Modifier.PUBLIC)
165+
.addParameter(
166+
ParameterizedTypeName.get(List.class, String.class),
167+
"authSchemePreference"
168+
)
169+
.returns(className().nestedClass("Builder"))
170+
.addStatement("this.authSchemePreference = new $T<>(authSchemePreference)", ArrayList.class).addStatement("return this")
171+
.build())
172+
.addMethod(
173+
MethodSpec
174+
.methodBuilder("build").addAnnotation(Override.class)
175+
.addModifiers(Modifier.PUBLIC)
176+
.returns(className())
177+
.addStatement("return new $T(defaultProvider(), authSchemePreference)",
178+
authSchemeSpecUtils.preferredAuthSchemeProviderName())
179+
.build())
180+
.build();
181+
}
107182
}
183+

codegen/src/main/java/software/amazon/awssdk/codegen/poet/auth/scheme/AuthSchemeSpecUtils.java

+9
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ public ClassName modeledAuthSchemeProviderName() {
9797
return ClassName.get(internalPackage(), "Modeled" + providerInterfaceName().simpleName());
9898
}
9999

100+
public ClassName preferredAuthSchemeProviderName() {
101+
return ClassName.get(internalPackage(), "Preferred" + providerInterfaceName().simpleName());
102+
}
103+
104+
public ClassName authSchemeProviderBuilderName() {
105+
return ClassName.get(basePackage(),
106+
intermediateModel.getMetadata().getServiceName() + "AuthSchemeProviderBuilder");
107+
}
108+
100109
public ClassName authSchemeInterceptor() {
101110
return ClassName.get(internalPackage(), intermediateModel.getMetadata().getServiceName() + "AuthSchemeInterceptor");
102111
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
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.poet.auth.scheme;
17+
18+
import com.squareup.javapoet.ClassName;
19+
import com.squareup.javapoet.MethodSpec;
20+
import com.squareup.javapoet.ParameterizedTypeName;
21+
import com.squareup.javapoet.TypeSpec;
22+
import java.util.ArrayList;
23+
import java.util.Collections;
24+
import java.util.List;
25+
import javax.lang.model.element.Modifier;
26+
import software.amazon.awssdk.annotations.SdkInternalApi;
27+
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
28+
import software.amazon.awssdk.codegen.poet.ClassSpec;
29+
import software.amazon.awssdk.codegen.poet.PoetUtils;
30+
import software.amazon.awssdk.utils.CollectionUtils;
31+
32+
public class PreferredAuthSchemeProviderSpec implements ClassSpec {
33+
private final AuthSchemeSpecUtils authSchemeSpecUtils;
34+
35+
public PreferredAuthSchemeProviderSpec(IntermediateModel intermediateModel) {
36+
this.authSchemeSpecUtils = new AuthSchemeSpecUtils(intermediateModel);
37+
}
38+
39+
@Override
40+
public ClassName className() {
41+
return authSchemeSpecUtils.preferredAuthSchemeProviderName();
42+
}
43+
44+
@Override
45+
public TypeSpec poetSpec() {
46+
return PoetUtils.createClassBuilder(className())
47+
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
48+
.addAnnotation(SdkInternalApi.class)
49+
.addField(
50+
authSchemeSpecUtils.providerInterfaceName(), "delegate",
51+
Modifier.PRIVATE, Modifier.FINAL)
52+
.addField(
53+
ParameterizedTypeName.get(List.class, String.class), "authSchemePreference",
54+
Modifier.PRIVATE, Modifier.FINAL)
55+
.addSuperinterface(authSchemeSpecUtils.providerInterfaceName())
56+
.addMethod(constructor())
57+
.addMethod(resolveAuthSchemeMethod())
58+
.build();
59+
}
60+
61+
private MethodSpec constructor() {
62+
return MethodSpec
63+
.constructorBuilder()
64+
.addModifiers(Modifier.PUBLIC)
65+
.addParameter(authSchemeSpecUtils.providerInterfaceName(), "delegate")
66+
.addParameter(ParameterizedTypeName.get(List.class, String.class), "authSchemePreference")
67+
.addStatement("this.delegate = delegate")
68+
.addStatement("this.authSchemePreference = authSchemePreference != null ? authSchemePreference : $T.emptyList()",
69+
Collections.class)
70+
.build();
71+
}
72+
73+
private MethodSpec resolveAuthSchemeMethod() {
74+
MethodSpec.Builder b = MethodSpec.methodBuilder("resolveAuthScheme")
75+
.addModifiers(Modifier.PUBLIC)
76+
.addAnnotation(Override.class)
77+
.returns(authSchemeSpecUtils.resolverReturnType())
78+
.addParameter(authSchemeSpecUtils.parametersInterfaceName(), "params");
79+
b.addJavadoc("Resolve the auth schemes based on the given set of parameters.");
80+
b.addStatement("$T candidateAuthSchemes = delegate.resolveAuthScheme(params)",
81+
authSchemeSpecUtils.resolverReturnType());
82+
b.beginControlFlow("if ($T.isNullOrEmpty(authSchemePreference))", CollectionUtils.class)
83+
.addStatement("return candidateAuthSchemes")
84+
.endControlFlow();
85+
86+
b.addStatement("$T authSchemes = new $T<>()", authSchemeSpecUtils.resolverReturnType(), ArrayList.class);
87+
b.beginControlFlow("authSchemePreference.forEach( preferredSchemeId -> ")
88+
.addStatement("candidateAuthSchemes.stream().filter(a -> a.schemeId().equals(preferredSchemeId)).findFirst()"
89+
+ ".ifPresent(a -> authSchemes.add(a))")
90+
.endControlFlow(")");
91+
92+
b.beginControlFlow("candidateAuthSchemes.forEach(candidate -> ")
93+
.beginControlFlow("if (!authSchemes.contains(candidate))")
94+
.addStatement("authSchemes.add(candidate)")
95+
.endControlFlow()
96+
.endControlFlow(")");
97+
98+
b.addStatement("return authSchemes");
99+
return b.build();
100+
}
101+
}

0 commit comments

Comments
 (0)