|
56 | 56 | import software.amazon.awssdk.codegen.poet.PoetUtils;
|
57 | 57 | import software.amazon.awssdk.core.ApiName;
|
58 | 58 | import software.amazon.awssdk.core.internal.waiters.WaiterAttribute;
|
| 59 | +import software.amazon.awssdk.core.retry.backoff.BackoffStrategy; |
59 | 60 | import software.amazon.awssdk.core.retry.backoff.FixedDelayBackoffStrategy;
|
60 | 61 | import software.amazon.awssdk.core.waiters.WaiterAcceptor;
|
61 | 62 | import software.amazon.awssdk.core.waiters.WaiterOverrideConfiguration;
|
@@ -102,6 +103,7 @@ public TypeSpec poetSpec() {
|
102 | 103 | typeSpecBuilder.addMethod(staticErrorCodeMethod());
|
103 | 104 | typeSpecBuilder.addMethods(waiterOperations());
|
104 | 105 | typeSpecBuilder.addMethods(waiterAcceptorInitializers());
|
| 106 | + typeSpecBuilder.addMethods(waiterConfigInitializers()); |
105 | 107 | typeSpecBuilder.addFields(waitersFields());
|
106 | 108 | additionalTypeSpecModification(typeSpecBuilder);
|
107 | 109 |
|
@@ -173,31 +175,55 @@ private MethodSpec constructor() {
|
173 | 175 | return ctor.build();
|
174 | 176 | }
|
175 | 177 |
|
| 178 | + private List<MethodSpec> waiterConfigInitializers() { |
| 179 | + List<MethodSpec> initializers = new ArrayList<>(); |
| 180 | + waiters.forEach((k, v) -> initializers.add(waiterConfigInitializer(k, v))); |
| 181 | + return initializers; |
| 182 | + } |
| 183 | + |
| 184 | + private MethodSpec waiterConfigInitializer(String waiterKey, WaiterDefinition waiterDefinition) { |
| 185 | + ClassName overrideConfig = ClassName.get(WaiterOverrideConfiguration.class); |
| 186 | + MethodSpec.Builder configMethod = |
| 187 | + MethodSpec.methodBuilder(waiterFieldName(waiterKey) + "Config") |
| 188 | + .addModifiers(PRIVATE, STATIC) |
| 189 | + .addParameter(overrideConfig, "overrideConfig") |
| 190 | + .returns(overrideConfig); |
| 191 | + |
| 192 | + configMethod.addStatement("$T<$T> optionalOverrideConfig = Optional.ofNullable(overrideConfig)", |
| 193 | + Optional.class, |
| 194 | + WaiterOverrideConfiguration.class); |
| 195 | + configMethod.addStatement("int maxAttempts = optionalOverrideConfig.flatMap(WaiterOverrideConfiguration::maxAttempts)" |
| 196 | + + ".orElse($L)", |
| 197 | + waiterDefinition.getMaxAttempts()); |
| 198 | + configMethod.addStatement("$T backoffStrategy = optionalOverrideConfig." |
| 199 | + + "flatMap(WaiterOverrideConfiguration::backoffStrategy).orElse($T.create($T.ofSeconds($L)))", |
| 200 | + BackoffStrategy.class, |
| 201 | + FixedDelayBackoffStrategy.class, |
| 202 | + Duration.class, |
| 203 | + waiterDefinition.getDelay()); |
| 204 | + configMethod.addStatement("$T waitTimeout = optionalOverrideConfig.flatMap(WaiterOverrideConfiguration::waitTimeout)" |
| 205 | + + ".orElse(null)", |
| 206 | + Duration.class); |
| 207 | + |
| 208 | + configMethod.addStatement("return WaiterOverrideConfiguration.builder().maxAttempts(maxAttempts).backoffStrategy" |
| 209 | + + "(backoffStrategy).waitTimeout(waitTimeout).build()"); |
| 210 | + return configMethod.build(); |
| 211 | + } |
| 212 | + |
176 | 213 | private CodeBlock waiterFieldInitialization(Map.Entry<String, WaiterDefinition> waiterDefinition) {
|
177 | 214 | String waiterKey = waiterDefinition.getKey();
|
178 |
| - String waiterName = lowercaseFirstChar(waiterKey); |
179 | 215 | WaiterDefinition waiter = waiterDefinition.getValue();
|
180 |
| - String overrideConfigurationVarName = waiterName + "Strategy"; |
181 | 216 | OperationModel opModel = operationModel(waiter);
|
182 | 217 | CodeBlock.Builder codeBlockBuilder = CodeBlock
|
183 |
| - .builder() |
184 |
| - .addStatement("$T $N = builder.overrideConfiguration == null ? $T.builder().maxAttempts($L)" |
185 |
| - + ".backoffStrategy($T.create($T.ofSeconds($L))).build() : builder.overrideConfiguration", |
186 |
| - WaiterOverrideConfiguration.class, |
187 |
| - overrideConfigurationVarName, |
188 |
| - WaiterOverrideConfiguration.class, |
189 |
| - waiter.getMaxAttempts(), |
190 |
| - FixedDelayBackoffStrategy.class, |
191 |
| - Duration.class, |
192 |
| - waiter.getDelay()); |
193 |
| - |
| 218 | + .builder(); |
194 | 219 |
|
195 | 220 | String waiterFieldName = waiterFieldName(waiterKey);
|
196 |
| - codeBlockBuilder.add("this.$L = $T.builder($T.class).overrideConfiguration($L).acceptors($LAcceptors())", |
| 221 | + codeBlockBuilder.add("this.$L = $T.builder($T.class)" |
| 222 | + + ".acceptors($LAcceptors()).overrideConfiguration($LConfig(builder.overrideConfiguration))", |
197 | 223 | waiterFieldName,
|
198 | 224 | waiterClassName,
|
199 | 225 | ClassName.get(modelPackage, opModel.getReturnType().getReturnType()),
|
200 |
| - overrideConfigurationVarName, |
| 226 | + waiterFieldName, |
201 | 227 | waiterFieldName);
|
202 | 228 |
|
203 | 229 | additionalWaiterConfig().ifPresent(codeBlockBuilder::add);
|
@@ -275,9 +301,33 @@ private List<MethodSpec> waiterOperations() {
|
275 | 301 | private Stream<MethodSpec> waiterOperations(Map.Entry<String, WaiterDefinition> waiterDefinition) {
|
276 | 302 | List<MethodSpec> methods = new ArrayList<>();
|
277 | 303 | methods.add(waiterOperation(waiterDefinition));
|
| 304 | + methods.add(waiterOperationWithOverrideConfig(waiterDefinition)); |
278 | 305 | return methods.stream();
|
279 | 306 | }
|
280 | 307 |
|
| 308 | + private MethodSpec waiterOperationWithOverrideConfig(Map.Entry<String, WaiterDefinition> waiterDefinition) { |
| 309 | + String waiterMethodName = waiterDefinition.getKey(); |
| 310 | + OperationModel opModel = operationModel(waiterDefinition.getValue()); |
| 311 | + |
| 312 | + ClassName overrideConfig = ClassName.get(WaiterOverrideConfiguration.class); |
| 313 | + ClassName requestType = ClassName.get(modelPackage, opModel.getInput().getVariableType()); |
| 314 | + |
| 315 | + String waiterFieldName = waiterFieldName(waiterDefinition.getKey()); |
| 316 | + MethodSpec.Builder builder = methodSignatureWithReturnType(waiterMethodName, opModel) |
| 317 | + .addParameter(requestType, opModel.getInput().getVariableName()) |
| 318 | + .addParameter(overrideConfig, "overrideConfig") |
| 319 | + .addModifiers(PUBLIC) |
| 320 | + .addAnnotation(Override.class) |
| 321 | + .addStatement("return $L.$L(() -> client.$N(applyWaitersUserAgent($N)), $LConfig(overrideConfig))", |
| 322 | + waiterFieldName, |
| 323 | + waiterClassName.simpleName().equals("Waiter") ? "run" : "runAsync", |
| 324 | + lowercaseFirstChar(waiterDefinition.getValue().getOperation()), |
| 325 | + opModel.getInput().getVariableName(), |
| 326 | + waiterFieldName); |
| 327 | + |
| 328 | + return builder.build(); |
| 329 | + } |
| 330 | + |
281 | 331 | private MethodSpec waiterOperation(Map.Entry<String, WaiterDefinition> waiterDefinition) {
|
282 | 332 | String waiterMethodName = waiterDefinition.getKey();
|
283 | 333 | OperationModel opModel = operationModel(waiterDefinition.getValue());
|
|
0 commit comments