From 51956029e0e3582b32a4d59b2992633dd97a8321 Mon Sep 17 00:00:00 2001 From: Saranya Somepalli Date: Thu, 13 Aug 2026 00:21:27 -0700 Subject: [PATCH] Remove old interpreted endpoint rules path, merge rules2 into rules, and delete legacy runtime resources --- .../emitters/tasks/EndpointProviderTasks.java | 23 +- .../RulesEngineRuntimeGeneratorTask2.java | 92 --- .../RulesEngineRuntimeLiteGeneratorTask.java | 57 -- .../customization/CustomizationConfig.java | 9 - .../AssignIdentifierVisitor.java | 2 +- .../{rules2 => rules}/AssignTypesVisitor.java | 2 +- .../BooleanAndExpression.java | 2 +- .../BooleanNotExpression.java | 2 +- .../CodeGeneratorVisitor.java | 2 +- .../CodegenExpressionBuidler.java | 2 +- .../{rules2 => rules}/ComputeScopeTree.java | 2 +- .../{rules2 => rules}/EndpointExpression.java | 2 +- .../poet/rules/EndpointProviderSpec.java | 486 ++++++--------- .../poet/rules/EndpointRulesSpecUtils.java | 12 - .../EndpointUrlCodeEmitter.java | 2 +- .../{rules2 => rules}/ErrorExpression.java | 2 +- .../{rules2 => rules}/ExpressionParser.java | 2 +- .../FunctionCallExpression.java | 2 +- .../{rules2 => rules}/HeadersExpression.java | 2 +- .../IndexedAccessExpression.java | 2 +- .../poet/{rules2 => rules}/LetExpression.java | 2 +- .../{rules2 => rules}/ListExpression.java | 2 +- .../LiteralBooleanExpression.java | 2 +- .../LiteralIntegerExpression.java | 2 +- .../LiteralStringExpression.java | 2 +- .../MemberAccessExpression.java | 2 +- .../MethodCallExpression.java | 2 +- .../PrepareForCodegenVisitor.java | 2 +- .../PropertiesExpression.java | 2 +- .../RenameForCodegenVisitor.java | 2 +- .../RewriteRuleExpressionVisitor.java | 2 +- .../{rules2 => rules}/RuleExpression.java | 2 +- .../RuleExpressionVisitor.java | 2 +- .../{rules2 => rules}/RuleFunctionMirror.java | 2 +- .../RuleRuntimeTypeMirror.java | 2 +- .../poet/rules/RuleSetCreationSpec.java | 431 ------------- .../{rules2 => rules}/RuleSetExpression.java | 2 +- .../poet/{rules2 => rules}/RuleType.java | 2 +- .../StringConcatExpression.java | 2 +- .../poet/{rules2 => rules}/SymbolTable.java | 2 +- .../poet/{rules2 => rules}/Tokenizer.java | 2 +- .../VariableReferenceExpression.java | 2 +- .../WalkRuleExpressionVisitor.java | 2 +- .../poet/rules2/EndpointProviderSpec2.java | 262 -------- .../awssdk/codegen/rules/Arn.java.resource | 112 ---- .../rules/BooleanEqualsFn.java.resource | 39 -- .../codegen/rules/Condition.java.resource | 92 --- ...ltEndpointAuthSchemeStrategy.java.resource | 45 -- ...intAuthSchemeStrategyFactory.java.resource | 63 -- .../rules/DefaultRuleEngine.java.resource | 12 - .../EndpointAttributeProvider.java.resource | 14 - .../EndpointAuthSchemeStrategy.java.resource | 10 - ...intAuthSchemeStrategyFactory.java.resource | 12 - .../rules/EndpointResult.java.resource | 132 ---- .../codegen/rules/EndpointRule.java.resource | 29 - .../rules/EndpointRuleset.java.resource | 117 ---- .../codegen/rules/ErrorRule.java.resource | 25 - .../awssdk/codegen/rules/Eval.java.resource | 6 - .../awssdk/codegen/rules/Expr.java.resource | 78 --- .../codegen/rules/ExprVisitor.java.resource | 31 - .../codegen/rules/FatScope.java.resource | 57 -- .../awssdk/codegen/rules/Fn.java.resource | 120 ---- .../awssdk/codegen/rules/FnNode.java.resource | 136 ----- .../codegen/rules/FnVisitor.java.resource | 28 - .../codegen/rules/GetAttr.java.resource | 240 -------- .../codegen/rules/Identifier.java.resource | 48 -- .../rules/InnerParseError.java.resource | 10 - .../awssdk/codegen/rules/Into.java.resource | 6 - .../codegen/rules/IntoSelf.java.resource | 9 - .../awssdk/codegen/rules/IsSet.java.resource | 25 - .../rules/IsValidHostLabel.java.resource | 42 -- .../IsVirtualHostableS3Bucket.java.resource | 46 -- .../codegen/rules/Literal.java.resource | 370 ------------ .../awssdk/codegen/rules/Not.java.resource | 33 - .../codegen/rules/Parameter.java.resource | 341 ----------- .../rules/ParameterReference.java.resource | 90 --- .../codegen/rules/ParameterType.java.resource | 40 -- .../codegen/rules/Parameters.java.resource | 79 --- .../codegen/rules/ParseArn.java.resource | 44 -- .../codegen/rules/ParseUrl.java.resource | 87 --- .../codegen/rules/PartitionFn.java.resource | 153 ----- .../awssdk/codegen/rules/Ref.java.resource | 54 -- .../awssdk/codegen/rules/Rule.java.resource | 87 --- .../{rules2 => rules}/RuleArn.java.resource | 0 .../codegen/rules/RuleEngine.java.resource | 18 - .../codegen/rules/RuleError.java.resource | 42 -- .../codegen/rules/RuleEvaluator.java.resource | 171 ------ .../RulePartition.java.resource | 0 .../RuleResult.java.resource | 0 .../{rules2 => rules}/RuleUrl.java.resource | 0 .../rules/RuleValueVisitor.java.resource | 15 - .../RulesFunctions.java.resource | 0 .../awssdk/codegen/rules/Scope.java.resource | 90 --- .../codegen/rules/SingleArgFn.java.resource | 20 - .../rules/SourceException.java.resource | 61 -- .../rules/StringEqualsFn.java.resource | 34 -- .../codegen/rules/Substring.java.resource | 62 -- .../codegen/rules/Template.java.resource | 247 -------- .../rules/TemplateVisitor.java.resource | 55 -- .../rules/ToParameterReference.java.resource | 6 - .../codegen/rules/TreeRule.java.resource | 26 - .../codegen/rules/UriEncodeFn.java.resource | 34 -- .../awssdk/codegen/rules/Value.java.resource | 448 -------------- .../codegen/rules/VarargFn.java.resource | 16 - .../codegen/rules2/Partitions.java.resource | 109 ---- .../rules/EndpointProviderClassSpecTest.java | 37 -- ...intProviderCompiledRulesClassSpecTest.java | 12 +- .../EndpointUrlCodeEmitterTest.java | 2 +- .../ExpressionParserTest.java | 2 +- .../poet/{rules2 => rules}/TokenizerTest.java | 2 +- .../poet/rules/endpoint-provider-class.java | 570 ++++-------------- ...int-provider-know-prop-override-class.java | 563 ++++------------- ...endpoint-provider-metric-values-class.java | 0 ...point-provider-unknown-property-class.java | 0 .../endpoint-provider-uri-cache-class.java | 0 .../poet/rules2/endpoint-provider-class.java | 162 ----- ...int-provider-know-prop-override-class.java | 162 ----- 117 files changed, 460 insertions(+), 6912 deletions(-) delete mode 100644 codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeGeneratorTask2.java delete mode 100644 codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeLiteGeneratorTask.java rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/AssignIdentifierVisitor.java (95%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/AssignTypesVisitor.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/BooleanAndExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/BooleanNotExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/CodeGeneratorVisitor.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/CodegenExpressionBuidler.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/ComputeScopeTree.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/EndpointExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/EndpointUrlCodeEmitter.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/ErrorExpression.java (97%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/ExpressionParser.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/FunctionCallExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/HeadersExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/IndexedAccessExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/LetExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/ListExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/LiteralBooleanExpression.java (97%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/LiteralIntegerExpression.java (97%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/LiteralStringExpression.java (97%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/MemberAccessExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/MethodCallExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/PrepareForCodegenVisitor.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/PropertiesExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RenameForCodegenVisitor.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RewriteRuleExpressionVisitor.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RuleExpression.java (96%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RuleExpressionVisitor.java (97%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RuleFunctionMirror.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RuleRuntimeTypeMirror.java (99%) delete mode 100644 codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleSetCreationSpec.java rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RuleSetExpression.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/RuleType.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/StringConcatExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/SymbolTable.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/Tokenizer.java (99%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/VariableReferenceExpression.java (98%) rename codegen/src/main/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/WalkRuleExpressionVisitor.java (98%) delete mode 100644 codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointProviderSpec2.java delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Arn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/BooleanEqualsFn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Condition.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategy.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategyFactory.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultRuleEngine.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAttributeProvider.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategy.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategyFactory.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointResult.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRule.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRuleset.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ErrorRule.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Eval.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Expr.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ExprVisitor.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FatScope.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Fn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnNode.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnVisitor.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/GetAttr.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Identifier.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/InnerParseError.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Into.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IntoSelf.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsSet.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsValidHostLabel.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsVirtualHostableS3Bucket.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Literal.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Not.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameter.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterReference.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterType.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameters.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseArn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseUrl.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/PartitionFn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Ref.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Rule.java.resource rename codegen/src/main/resources/software/amazon/awssdk/codegen/{rules2 => rules}/RuleArn.java.resource (100%) delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEngine.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleError.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEvaluator.java.resource rename codegen/src/main/resources/software/amazon/awssdk/codegen/{rules2 => rules}/RulePartition.java.resource (100%) rename codegen/src/main/resources/software/amazon/awssdk/codegen/{rules2 => rules}/RuleResult.java.resource (100%) rename codegen/src/main/resources/software/amazon/awssdk/codegen/{rules2 => rules}/RuleUrl.java.resource (100%) delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleValueVisitor.java.resource rename codegen/src/main/resources/software/amazon/awssdk/codegen/{rules2 => rules}/RulesFunctions.java.resource (100%) delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Scope.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SingleArgFn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SourceException.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/StringEqualsFn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Substring.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Template.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TemplateVisitor.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ToParameterReference.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TreeRule.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/UriEncodeFn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Value.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules/VarargFn.java.resource delete mode 100644 codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/Partitions.java.resource delete mode 100644 codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderClassSpecTest.java rename codegen/src/test/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/EndpointUrlCodeEmitterTest.java (99%) rename codegen/src/test/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/ExpressionParserTest.java (98%) rename codegen/src/test/java/software/amazon/awssdk/codegen/poet/{rules2 => rules}/TokenizerTest.java (97%) rename codegen/src/test/resources/software/amazon/awssdk/codegen/poet/{rules2 => rules}/endpoint-provider-metric-values-class.java (100%) rename codegen/src/test/resources/software/amazon/awssdk/codegen/poet/{rules2 => rules}/endpoint-provider-unknown-property-class.java (100%) rename codegen/src/test/resources/software/amazon/awssdk/codegen/poet/{rules2 => rules}/endpoint-provider-uri-cache-class.java (100%) delete mode 100644 codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-class.java delete mode 100644 codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-know-prop-override-class.java diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/EndpointProviderTasks.java b/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/EndpointProviderTasks.java index b72a33263c5b..1f18a9bdb372 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/EndpointProviderTasks.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/EndpointProviderTasks.java @@ -30,11 +30,10 @@ import software.amazon.awssdk.codegen.poet.rules.DefaultPartitionDataProviderSpec; import software.amazon.awssdk.codegen.poet.rules.EndpointParametersClassSpec; import software.amazon.awssdk.codegen.poet.rules.EndpointProviderInterfaceSpec; -import software.amazon.awssdk.codegen.poet.rules.EndpointProviderSpec; import software.amazon.awssdk.codegen.poet.rules.EndpointProviderTestSpec; import software.amazon.awssdk.codegen.poet.rules.EndpointResolverUtilsSpec; import software.amazon.awssdk.codegen.poet.rules.EndpointRulesClientTestSpec; -import software.amazon.awssdk.codegen.poet.rules2.EndpointProviderSpec2; +import software.amazon.awssdk.codegen.poet.rules.EndpointProviderSpec; public final class EndpointProviderTasks extends BaseGeneratorTasks { private final GeneratorTaskParams generatorTaskParams; @@ -49,14 +48,8 @@ protected List createTasks() throws Exception { List tasks = new ArrayList<>(); tasks.add(generateInterface()); tasks.add(generateParams()); - if (shouldGenerateCompiledEndpointRules()) { - tasks.add(generateDefaultProvider2()); - tasks.add(new RulesEngineRuntimeLiteGeneratorTask(generatorTaskParams)); - tasks.add(new RulesEngineRuntimeGeneratorTask2(generatorTaskParams)); - } else { - tasks.add(generateDefaultProvider()); - tasks.add(new RulesEngineRuntimeGeneratorTask(generatorTaskParams)); - } + tasks.add(generateDefaultProvider2()); + tasks.add(new RulesEngineRuntimeGeneratorTask(generatorTaskParams)); if (shouldGenerateJmesPathRuntime()) { tasks.add(new JmesPathRuntimeGeneratorTask(generatorTaskParams)); } @@ -82,12 +75,8 @@ private GeneratorTask generateParams() { return new PoetGeneratorTask(endpointRulesDir(), model.getFileHeader(), new EndpointParametersClassSpec(model)); } - private GeneratorTask generateDefaultProvider() { - return new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new EndpointProviderSpec(model)); - } - private GeneratorTask generateDefaultProvider2() { - return new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new EndpointProviderSpec2(model)); + return new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new EndpointProviderSpec(model)); } private GeneratorTask generateDefaultPartitionsProvider() { @@ -95,10 +84,6 @@ private GeneratorTask generateDefaultPartitionsProvider() { new DefaultPartitionDataProviderSpec(model)); } - private boolean shouldGenerateCompiledEndpointRules() { - CustomizationConfig customizationConfig = generatorTaskParams.getModel().getCustomizationConfig(); - return customizationConfig.isEnableGenerateCompiledEndpointRules(); - } private Collection generateInterceptors() { return Arrays.asList( diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeGeneratorTask2.java b/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeGeneratorTask2.java deleted file mode 100644 index 744177e9e50c..000000000000 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeGeneratorTask2.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.codegen.emitters.tasks; - -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; -import software.amazon.awssdk.codegen.emitters.GeneratorTask; -import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams; -import software.amazon.awssdk.codegen.emitters.SimpleGeneratorTask; -import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils; -import software.amazon.awssdk.utils.IoUtils; -import software.amazon.awssdk.utils.StringUtils; -import software.amazon.awssdk.utils.Validate; - -public final class RulesEngineRuntimeGeneratorTask2 extends BaseGeneratorTasks { - private final String engineInternalClassDir; - private final String engineInternalPackageName; - private final String fileHeader; - private final EndpointRulesSpecUtils endpointRulesSpecUtils; - - public RulesEngineRuntimeGeneratorTask2(GeneratorTaskParams generatorTaskParams) { - super(generatorTaskParams); - this.engineInternalClassDir = generatorTaskParams.getPathProvider().getEndpointRulesInternalDirectory(); - this.engineInternalPackageName = generatorTaskParams.getModel().getMetadata().getFullInternalEndpointRulesPackageName(); - this.fileHeader = generatorTaskParams.getModel().getFileHeader(); - this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(generatorTaskParams.getModel()); - } - - @Override - protected List createTasks() throws Exception { - List copyTasks = new ArrayList<>(); - List rulesEngineFiles = endpointRulesSpecUtils.rulesEngineResourceFiles2(); - for (String path : rulesEngineJavaFilePaths(rulesEngineFiles)) { - String newFileName = computeNewName(path); - copyTasks.add(new SimpleGeneratorTask(engineInternalClassDir, - newFileName, - fileHeader, - () -> rulesEngineFileContent("/" + path))); - } - - return copyTasks; - } - - private List rulesEngineJavaFilePaths(Collection runtimeEngineFiles) { - return runtimeEngineFiles.stream() - .filter(e -> e.endsWith(".java.resource")) - .collect(Collectors.toList()); - } - - private String rulesEngineFileContent(String path) { - return "package " + engineInternalPackageName + ";\n" + - "\n" - + loadResourceAsString(path); - } - - private String loadResourceAsString(String path) { - try { - return IoUtils.toUtf8String(loadResource(path)); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - private InputStream loadResource(String name) { - InputStream resourceAsStream = RulesEngineRuntimeGeneratorTask2.class.getResourceAsStream(name); - Validate.notNull(resourceAsStream, "Failed to load resource from %s", name); - return resourceAsStream; - } - - private String computeNewName(String path) { - String[] pathComponents = path.split("/"); - return StringUtils.replace(pathComponents[pathComponents.length - 1], ".resource", ""); - } -} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeLiteGeneratorTask.java b/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeLiteGeneratorTask.java deleted file mode 100644 index d223f2d6ace9..000000000000 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/RulesEngineRuntimeLiteGeneratorTask.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.codegen.emitters.tasks; - -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams; -import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig; - -/** A version of {@link software.amazon.awssdk.codegen.emitters.tasks.RulesEngineRuntimeGeneratorTask} that copies a minimal - * set of the interpreter related classes. This set represents the only classes that need to be copied when compiled rules are - * enabled. - * - * @see CustomizationConfig#isEnableGenerateCompiledEndpointRules() - */ -public final class RulesEngineRuntimeLiteGeneratorTask extends RulesEngineRuntimeGeneratorTask { - // Note: leading slashes are important to disambiguate between files that share the same suffix - private static final List FILES_TO_COPY = Stream.of("/Outputs.java.resource", - "/RegionOverride.java.resource", - "/Partition.java.resource", - "/PartitionDataProvider.java.resource", - "/AwsEndpointProviderUtils.java.resource", - "/Arn.java.resource", - "/Value.java.resource", - "/Identifier.java.resource", - "/EndpointAuthSchemeStrategy.java.resource", - "/EndpointAttributeProvider.java.resource", - "/EndpointAuthSchemeStrategyFactory.java.resource", - "/DefaultEndpointAuthSchemeStrategy.java.resource") - .collect(Collectors.toList()); - - public RulesEngineRuntimeLiteGeneratorTask(GeneratorTaskParams generatorTaskParams) { - super(generatorTaskParams); - } - - protected List rulesEngineJavaFilePaths(Collection runtimeEngineFiles) { - return super.rulesEngineJavaFilePaths(runtimeEngineFiles) - .stream() - .filter(e -> FILES_TO_COPY.stream().anyMatch(e::endsWith)) - .collect(Collectors.toList()); - } -} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java index d15ef90cd2e1..887143b21bf3 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java @@ -315,9 +315,6 @@ public class CustomizationConfig { private boolean s3ExpressAuthSupport; /** - * Set to true to enable compiled endpoint rules. Currently defaults to false. - */ - private boolean enableGenerateCompiledEndpointRules = false; /** * Customization related to auth scheme derived from endpoints. @@ -817,13 +814,7 @@ public void setUseS3ExpressSessionAuth(boolean useS3ExpressSessionAuth) { this.useS3ExpressSessionAuth = useS3ExpressSessionAuth; } - public boolean isEnableGenerateCompiledEndpointRules() { - return enableGenerateCompiledEndpointRules; - } - public void setEnableGenerateCompiledEndpointRules(boolean enableGenerateCompiledEndpointRules) { - this.enableGenerateCompiledEndpointRules = enableGenerateCompiledEndpointRules; - } public Map getSkipEndpointTests() { return skipEndpointTests; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/AssignIdentifierVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/AssignIdentifierVisitor.java similarity index 95% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/AssignIdentifierVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/AssignIdentifierVisitor.java index 61679386a5e1..1ff5df78053f 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/AssignIdentifierVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/AssignIdentifierVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; /** * Assigns an identifier to each rule then we use as a name for the generated method. diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/AssignTypesVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/AssignTypesVisitor.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/AssignTypesVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/AssignTypesVisitor.java index b13167acaac1..626c9f2f1319 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/AssignTypesVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/AssignTypesVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.List; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/BooleanAndExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/BooleanAndExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/BooleanAndExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/BooleanAndExpression.java index 1ea95065bafc..9f3d628d3932 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/BooleanAndExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/BooleanAndExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.Collections; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/BooleanNotExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/BooleanNotExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/BooleanNotExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/BooleanNotExpression.java index 93ee93dff9cd..f2efd0e050b1 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/BooleanNotExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/BooleanNotExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Objects; import software.amazon.awssdk.utils.Validate; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodeGeneratorVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/CodeGeneratorVisitor.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodeGeneratorVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/CodeGeneratorVisitor.java index 34d6a64a3154..0fa69d2923d9 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodeGeneratorVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/CodeGeneratorVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.CodeBlock; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodegenExpressionBuidler.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/CodegenExpressionBuidler.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodegenExpressionBuidler.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/CodegenExpressionBuidler.java index 6488f015ad7b..a57b88ed362f 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/CodegenExpressionBuidler.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/CodegenExpressionBuidler.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.List; import java.util.Map; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ComputeScopeTree.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ComputeScopeTree.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ComputeScopeTree.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ComputeScopeTree.java index 42f612f87418..0ee98f43d7cd 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ComputeScopeTree.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ComputeScopeTree.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayDeque; import java.util.ArrayList; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointExpression.java index 29fa872718bb..24206049728f 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Objects; import software.amazon.awssdk.utils.Validate; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderSpec.java index eb7d17b4e57f..ebf24263d54f 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderSpec.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderSpec.java @@ -17,189 +17,228 @@ import com.squareup.javapoet.ClassName; import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.MethodSpec; -import com.squareup.javapoet.ParameterSpec; -import com.squareup.javapoet.ParameterizedTypeName; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; -import com.squareup.javapoet.TypeVariableName; -import com.squareup.javapoet.WildcardTypeName; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.CompletableFuture; import javax.lang.model.element.Modifier; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; import software.amazon.awssdk.codegen.model.config.customization.EndpointAuthSchemeConfig; +import software.amazon.awssdk.codegen.model.config.customization.KeyTypePair; import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; import software.amazon.awssdk.codegen.model.intermediate.Metadata; import software.amazon.awssdk.codegen.model.rules.endpoints.BuiltInParameter; import software.amazon.awssdk.codegen.model.rules.endpoints.ParameterModel; +import software.amazon.awssdk.codegen.model.rules.endpoints.RuleModel; +import software.amazon.awssdk.codegen.model.service.EndpointRuleSetModel; import software.amazon.awssdk.codegen.poet.ClassSpec; import software.amazon.awssdk.codegen.poet.PoetUtils; +import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils; import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.endpoints.Endpoint; -import software.amazon.awssdk.endpoints.EndpointUrl; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.utils.CompletableFutureUtils; -import software.amazon.awssdk.utils.Logger; import software.amazon.awssdk.utils.Validate; public class EndpointProviderSpec implements ClassSpec { - private static final String RULE_SET_FIELD_NAME = "ENDPOINT_RULE_SET"; - private static final String LOGGER_FIELD_NAME = "LOG"; - private final IntermediateModel intermediateModel; private final EndpointRulesSpecUtils endpointRulesSpecUtils; + private final Map knownEndpointAttributes; + private final CodegenExpressionBuidler utils; + private final RuleRuntimeTypeMirror typeMirror; public EndpointProviderSpec(IntermediateModel intermediateModel) { this.intermediateModel = intermediateModel; this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(intermediateModel); + String packageName = intermediateModel.getMetadata().getFullInternalEndpointRulesPackageName(); + this.typeMirror = new RuleRuntimeTypeMirror(packageName); + EndpointRuleSetModel model = intermediateModel.getEndpointRuleSetModel(); + this.utils = createCodegenRulesUtil(model.getRules(), model.getParameters(), typeMirror); + this.knownEndpointAttributes = knownEndpointAttributes(intermediateModel); } - @Override - public TypeSpec poetSpec() { - FieldSpec endpointAuthSchemeStrategyFieldSpec = endpointAuthSchemeStrategyFieldSpec(); - TypeSpec.Builder b = PoetUtils.createClassBuilder(className()) - .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .addSuperinterface(endpointRulesSpecUtils.providerInterfaceName()) - .addField(logger()) - .addField(ruleSet()) - .addField(endpointAuthSchemeStrategyFieldSpec) - .addMethod(resolveEndpointMethod()) - .addMethod(toIdentifierValueMap()) - .addAnnotation(SdkInternalApi.class); + private static RuleType fromParameterModel(ParameterModel model) { + switch (model.getType().toLowerCase(Locale.ENGLISH)) { + case "boolean": + return RuleRuntimeTypeMirror.BOOLEAN; + case "string": + return RuleRuntimeTypeMirror.STRING; + case "stringarray": + return RuleRuntimeTypeMirror.LIST_OF_STRING; + default: + throw new IllegalStateException("Cannot find rule type for: " + model.getType()); + } + } - MethodSpec constructorMethod = constructorMethodSpec(endpointAuthSchemeStrategyFieldSpec.name); - MethodSpec valueAsEndpointOrThrowMethod = valueAsEndpointOrThrowMethodSpec(); + private static RuleModel createRootRule(List rules) { + RuleModel root = new RuleModel(); + root.setRules(rules); + root.setType("tree"); + root.setConditions(Collections.emptyList()); + return root; + } - b.addMethod(constructorMethod); - b.addMethod(valueAsEndpointOrThrowMethod); - b.addMethod(ruleSetBuildMethod(b)); - b.addMethod(equalsMethod()); - b.addMethod(hashCodeMethod()); - addKnownPropertiesMethodSpec(b, endpointAuthSchemeStrategyFieldSpec.name); + private static CodegenExpressionBuidler createCodegenRulesUtil(List rules, + Map parameters, + RuleRuntimeTypeMirror typeMirror) { + RuleSetExpression root = ExpressionParser.parseRuleSetExpression(createRootRule(rules)); + return CodegenExpressionBuidler.from(root, typeMirror, initSymbolTable(parameters)); + } - return b.build(); + private static SymbolTable initSymbolTable(Map parameters) { + SymbolTable.Builder builder = SymbolTable.builder(); + parameters.forEach((k, v) -> { + builder.putParam(k, fromParameterModel(v)); + if (v.getBuiltInEnum() == BuiltInParameter.AWS_REGION) { + // Region is a special case since it's already public API and uses an actual `Region` instance instead of + // `String`. We then introduce here a local with the same name but with String type such that we don't have + // to do the conversion everywhere a string represented region is used. + builder.regionParamName(k); + builder.putLocal(k, RuleRuntimeTypeMirror.STRING); + } + }); + return builder.build(); } - private FieldSpec endpointAuthSchemeStrategyFieldSpec() { - return FieldSpec.builder(endpointRulesSpecUtils.rulesRuntimeClassName("EndpointAuthSchemeStrategy"), - "endpointAuthSchemeStrategy", Modifier.PRIVATE, Modifier.FINAL) - .build(); + private static Map knownEndpointAttributes(IntermediateModel intermediateModel) { + Map knownEndpointAttributes = null; + EndpointAuthSchemeConfig config = intermediateModel.getCustomizationConfig().getEndpointAuthSchemeConfig(); + if (config != null) { + knownEndpointAttributes = config.getEndpointProviderTestKeys(); + } + if (knownEndpointAttributes == null) { + knownEndpointAttributes = Collections.emptyMap(); + } + return knownEndpointAttributes; } - private MethodSpec constructorMethodSpec(String endpointAuthSchemeFieldName) { - MethodSpec.Builder b = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC); - EndpointAuthSchemeConfig endpointAuthSchemeConfig = - intermediateModel.getCustomizationConfig().getEndpointAuthSchemeConfig(); - String factoryLocalVarName = "endpointAuthSchemeStrategyFactory"; - if (endpointAuthSchemeConfig != null && endpointAuthSchemeConfig.getAuthSchemeStrategyFactoryClass() != null) { - String endpointAuthSchemeStrategyFactory = endpointAuthSchemeConfig.getAuthSchemeStrategyFactoryClass(); - b.addStatement("$T $N = new $T()", - endpointRulesSpecUtils.rulesRuntimeClassName("EndpointAuthSchemeStrategyFactory"), - factoryLocalVarName, - PoetUtils.classNameFromFqcn(endpointAuthSchemeStrategyFactory)); - } else { - b.addStatement("$T $N = new $T()", - endpointRulesSpecUtils.rulesRuntimeClassName("EndpointAuthSchemeStrategyFactory"), - factoryLocalVarName, - endpointRulesSpecUtils.rulesRuntimeClassName("DefaultEndpointAuthSchemeStrategyFactory")); + @Override + public TypeSpec poetSpec() { + TypeSpec.Builder builder = PoetUtils.createClassBuilder(className()) + .addModifiers(Modifier.PUBLIC, Modifier.FINAL) + .addSuperinterface(endpointRulesSpecUtils.providerInterfaceName()) + .addAnnotation(SdkInternalApi.class); + + builder.addMethod(resolveEndpointMethod()); + List methods = new ArrayList<>(); + createRuleMethod(utils.root(), methods); + for (MethodSpec.Builder methodBuilder : methods) { + builder.addMethod(methodBuilder.build()); } - b.addStatement("this.$N = $N.endpointAuthSchemeStrategy()", endpointAuthSchemeFieldName, factoryLocalVarName); - return b.build(); + builder.addMethod(equalsMethod()); + builder.addMethod(hashCodeMethod()); + return builder.build(); } - private MethodSpec valueAsEndpointOrThrowMethodSpec() { - String valueParamName = "value"; - ParameterSpec param = ParameterSpec.builder(endpointRulesSpecUtils.rulesRuntimeClassName("Value"), valueParamName) - .build(); - MethodSpec.Builder b = MethodSpec.methodBuilder("valueAsEndpointOrThrow") - .returns(ClassName.get(Endpoint.class)) - .addParameter(param); + @Override + public ClassName className() { + Metadata md = intermediateModel.getMetadata(); + return ClassName.get(md.getFullInternalEndpointRulesPackageName(), + "Default" + endpointRulesSpecUtils.providerInterfaceName().simpleName()); + } - CodeBlock.Builder methodCode = - CodeBlock.builder() - .beginControlFlow("if ($N instanceof $T)", - valueParamName, - endpointRulesSpecUtils.rulesRuntimeClassName("Value.Endpoint")) - .addStatement("$T endpoint = $N.expectEndpoint()", - endpointRulesSpecUtils.rulesRuntimeClassName("Value.Endpoint"), valueParamName) - .addStatement("$T builder = Endpoint.builder()", Endpoint.Builder.class) - .addStatement("builder.endpointUrl($T.fromString(endpoint.getUrl()))", EndpointUrl.class) - .addStatement("$T headers = endpoint.getHeaders()", - ParameterizedTypeName.get(ClassName.get(Map.class), - TypeName.get(String.class), - ParameterizedTypeName.get(List.class, String.class))) - .beginControlFlow("if (headers != null)") - .addStatement("headers.forEach((name, values) -> values.forEach(v -> builder.putHeader(name, v)))") - .endControlFlow() - .addStatement("addKnownProperties(builder, endpoint.getProperties())") - .addStatement("return builder.build()") + private MethodSpec resolveEndpointMethod() { + MethodSpec.Builder builder = MethodSpec.methodBuilder("resolveEndpoint") + .addModifiers(Modifier.PUBLIC) + .returns(endpointRulesSpecUtils.resolverReturnType()) + .addAnnotation(Override.class) + .addParameter(endpointRulesSpecUtils.parametersClassName(), "params"); + + builder.addCode(validateRequiredParams()); + builder.beginControlFlow("try"); + String regionParamName = utils.regionParamName(); + if (regionParamName != null) { + builder.addStatement("$T region = params.$L()", Region.class, regionParamName); + builder.addStatement("$T regionId = region == null ? null : region.id()", String.class); + builder.addStatement("$T result = $L(params, regionId)", ruleResult(), utils.root().ruleId()); + } else { + builder.addStatement("$T result = $L(params)", ruleResult(), utils.root().ruleId()); + } + builder.beginControlFlow("if (result.canContinue())") + .addStatement("throw $T.create($S)", SdkClientException.class, "Rule engine did not reach an error or " + + "endpoint result") + .endControlFlow(); + + builder.beginControlFlow("if (result.isError())") + .addStatement("String errorMsg = result.error()") + .beginControlFlow("if (errorMsg.contains(\"Invalid ARN\") && errorMsg.contains(\":s3:::\"))") + .addStatement("errorMsg += $S", ". Use the bucket name instead of simple bucket ARNs in " + + "GetBucketLocationRequest.") + .endControlFlow() + .addStatement("throw $T.create(errorMsg)", SdkClientException.class) + .endControlFlow(); + + builder.addStatement("return $T.completedFuture(result.endpoint())", CompletableFuture.class); + builder.nextControlFlow("catch ($T error)", Exception.class); + builder.addStatement("return $T.failedFuture(error)", CompletableFutureUtils.class); + builder.endControlFlow(); + + return builder.build(); + } - .nextControlFlow("else if ($N instanceof $T)", - valueParamName, - endpointRulesSpecUtils.rulesRuntimeClassName("Value.Str")) - .addStatement("$T errorMsg = $N.expectString()", String.class, valueParamName) - .beginControlFlow("if (errorMsg.contains($S) && errorMsg.contains($S))", - "Invalid ARN", ":s3:::") - .addStatement("errorMsg += $S", ". Use the bucket name instead of simple bucket ARNs in " - + "GetBucketLocationRequest.") - .endControlFlow() - .addStatement("throw $T.create(errorMsg)", SdkClientException.class) - .nextControlFlow("else") - .addStatement("throw SdkClientException.create($S + $N)", - "Rule engine return neither an endpoint result or error value. Returned value was: ", - valueParamName) - .endControlFlow(); + private CodeBlock validateRequiredParams() { + CodeBlock.Builder b = CodeBlock.builder(); + Map parameters = intermediateModel.getEndpointRuleSetModel().getParameters(); + parameters.entrySet().stream() + .filter(e -> Boolean.TRUE.equals(e.getValue().isRequired())) + .forEach(e -> { + b.addStatement("$T.notNull($N.$N(), $S)", + Validate.class, + "params", + endpointRulesSpecUtils.paramMethodName(e.getKey()), + String.format("Parameter '%s' must not be null", e.getKey())); + }); - b.addCode(methodCode.build()); return b.build(); } - private void addKnownPropertiesMethodSpec(TypeSpec.Builder b, String endpointAuthSpecStrategyFieldName) { - EndpointAuthSchemeConfig endpointAuthSchemeConfig = - intermediateModel.getCustomizationConfig().getEndpointAuthSchemeConfig(); - if (endpointAuthSchemeConfig != null && endpointAuthSchemeConfig.getKnownEndpointProperties() != null) { - addKnownEndpointPropertiesMethodOverride(b, endpointAuthSchemeConfig.getKnownEndpointProperties()); - } else { - b.addMethod(defaultAddKnownEndpointPropertyMethod(endpointAuthSpecStrategyFieldName)); + private void createRuleMethod(RuleSetExpression expr, List methods) { + MethodSpec.Builder builder = methodBuilderForRule(expr); + methods.add(builder); + CodeBlock.Builder block = CodeBlock.builder(); + codegenExpr(expr, block); + builder.addCode(block.build()); + if (expr.isTree()) { + for (RuleSetExpression child : expr.children()) { + if (child.isTree()) { + createRuleMethod(child, methods); + } + } } } - private MethodSpec defaultAddKnownEndpointPropertyMethod(String endpointAuthSpecStrategyFieldName) { - String builderParamName = "builder"; - String propertiesParamName = "properties"; - MethodSpec.Builder b = addKnowPropertiesSignature(builderParamName, propertiesParamName); + private MethodSpec.Builder methodBuilderForRule(RuleSetExpression expr) { + MethodSpec.Builder builder = + MethodSpec.methodBuilder(expr.ruleId()) + .addModifiers(Modifier.PRIVATE, Modifier.STATIC) + .returns(ruleResult()); + ComputeScopeTree.Scope scope = utils.scopesByName().get(expr.ruleId()); + builder.addParameter(endpointRulesSpecUtils.parametersClassName(), "params"); + for (String param : scope.usesLocals()) { + if (scope.defines().contains(param)) { + continue; + } + RuleType type = utils.symbolTable().localType(param); + builder.addParameter(type.javaType(), param); + } + return builder; + } - CodeBlock.Builder switchStatementCode = CodeBlock.builder(); - switchStatementCode.beginControlFlow("switch (n)") - .add("case $S:\n", "authSchemes").indent() - .add(CodeBlock.builder() - .addStatement("$N.putAttribute($T.AUTH_SCHEMES, $N.createAuthSchemes(v))", - builderParamName, - AwsEndpointAttribute.class, - endpointAuthSpecStrategyFieldName) - .build()) - .addStatement("break") - .add("default:\n").indent() - .add(CodeBlock.builder() - .addStatement("$N.debug(() -> $S + n)", - LOGGER_FIELD_NAME, - "Ignoring unknown endpoint property: ") - .build()) - .addStatement("break") - .endControlFlow(); - CodeBlock.Builder methodCode = CodeBlock.builder(); - CodeBlock lambda = CodeBlock.builder() - .add("(n, v) -> {\n").indent() - .add(switchStatementCode.build()) - .unindent().add("}") - .build(); - methodCode.add("$N.forEach($L);", propertiesParamName, lambda); - b.addCode(methodCode.build()); - return b.build(); + private void codegenExpr(RuleSetExpression expr, CodeBlock.Builder builder) { + CodeGeneratorVisitor visitor = new CodeGeneratorVisitor(typeMirror, + utils.symbolTable(), + knownEndpointAttributes, + utils.scopesByName(), + builder); + visitor.visitRuleSetExpression(expr); + } + + private TypeName ruleResult() { + return typeMirror.rulesResult().type(); } private MethodSpec equalsMethod() { @@ -220,181 +259,4 @@ private MethodSpec hashCodeMethod() { .addStatement("return getClass().hashCode()") .build(); } - - private void addKnownEndpointPropertiesMethodOverride(TypeSpec.Builder b, String knowPropertyExpression) { - MethodSpec singlePropertyMethod = - MethodSpec.methodBuilder("addKnownProperty") - .addModifiers(Modifier.PRIVATE) - .addTypeVariable(TypeVariableName.get("T")) - .addParameter(ParameterSpec.builder( - ParameterizedTypeName.get(endpointRulesSpecUtils.rulesRuntimeClassName("EndpointAttributeProvider"), - TypeVariableName.get("T")), - "provider").build()) - .addParameter(Endpoint.Builder.class, "builder") - .addParameter(endpointRulesSpecUtils.rulesRuntimeClassName("Value"), "value") - .addStatement("builder.putAttribute(provider.attributeKey(), provider.attributeValue(value))") - .build(); - b.addMethod(singlePropertyMethod); - - String builderParamName = "builder"; - String propertiesParamName = "properties"; - MethodSpec.Builder methodBuilder = addKnowPropertiesSignature(builderParamName, propertiesParamName); - - TypeName wildcardEndpointAttrType = ParameterizedTypeName.get( - endpointRulesSpecUtils.rulesRuntimeClassName("EndpointAttributeProvider"), - WildcardTypeName.subtypeOf(Object.class)); - methodBuilder.addStatement("$T knownProperties = $N", - ParameterizedTypeName.get(ClassName.get(List.class), wildcardEndpointAttrType), - knowPropertyExpression); - methodBuilder.beginControlFlow("for ($T p: knownProperties)", wildcardEndpointAttrType); - methodBuilder.beginControlFlow("if ($N.containsKey(p.propertyName()))", propertiesParamName); - methodBuilder.addStatement("$N(p, $N, $N.get(p.propertyName()))", - singlePropertyMethod.name, - builderParamName, - propertiesParamName); - methodBuilder.endControlFlow(); - methodBuilder.endControlFlow(); - - b.addMethod(methodBuilder.build()); - } - - private MethodSpec.Builder addKnowPropertiesSignature(String builderParamName, String propertiesParamName) { - ParameterSpec builderParam = ParameterSpec.builder(ClassName.get(Endpoint.Builder.class), builderParamName).build(); - ParameterSpec propertiesParam = ParameterSpec - .builder(ParameterizedTypeName.get( - ClassName.get(Map.class), - ClassName.get(String.class), - endpointRulesSpecUtils.rulesRuntimeClassName("Value")), - propertiesParamName) - .build(); - return MethodSpec.methodBuilder("addKnownProperties") - .addModifiers(Modifier.PRIVATE) - .addParameter(builderParam) - .addParameter(propertiesParam); - } - - @Override - public ClassName className() { - Metadata md = intermediateModel.getMetadata(); - return ClassName.get(md.getFullInternalEndpointRulesPackageName(), - "Default" + endpointRulesSpecUtils.providerInterfaceName().simpleName()); - } - - private FieldSpec logger() { - return FieldSpec.builder(Logger.class, LOGGER_FIELD_NAME) - .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) - .initializer("$T.loggerFor($T.class)", Logger.class, className()) - .build(); - } - - private FieldSpec ruleSet() { - return FieldSpec.builder(endpointRulesSpecUtils.rulesRuntimeClassName("EndpointRuleset"), RULE_SET_FIELD_NAME) - .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) - .initializer("ruleSet()") - .build(); - } - - private MethodSpec toIdentifierValueMap() { - ParameterizedTypeName resultType = ParameterizedTypeName.get(ClassName.get(Map.class), - endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), - endpointRulesSpecUtils.rulesRuntimeClassName("Value")); - - String paramsName = "params"; - MethodSpec.Builder b = MethodSpec.methodBuilder("toIdentifierValueMap") - .addModifiers(Modifier.PRIVATE, Modifier.STATIC) - .addParameter(endpointRulesSpecUtils.parametersClassName(), paramsName) - .returns(resultType); - - Map params = intermediateModel.getEndpointRuleSetModel().getParameters(); - - String resultName = "paramsMap"; - b.addStatement("$T $N = new $T<>()", resultType, resultName, HashMap.class); - - params.forEach((name, model) -> { - String methodVarName = endpointRulesSpecUtils.paramMethodName(name); - - CodeBlock identifierExpr = - CodeBlock.of("$T.of($S)", endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), name); - - CodeBlock coerce; - // We treat region specially and generate it as the Region type, - // so we need to call id() to convert it back to string - if (model.getBuiltInEnum() == BuiltInParameter.AWS_REGION) { - coerce = CodeBlock.builder().add(".id()").build(); - } else { - coerce = CodeBlock.builder().build(); - } - - CodeBlock valueExpr = endpointRulesSpecUtils.valueCreationCode( - model.getType(), - CodeBlock.builder() - .add("$N.$N()$L", paramsName, methodVarName, coerce) - .build()); - - b.beginControlFlow("if ($N.$N() != null)", paramsName, methodVarName); - b.addStatement("$N.put($L, $L)", resultName, identifierExpr, valueExpr); - b.endControlFlow(); - }); - - b.addStatement("return $N", resultName); - - return b.build(); - } - - private MethodSpec resolveEndpointMethod() { - String paramsName = "endpointParams"; - - MethodSpec.Builder b = MethodSpec.methodBuilder("resolveEndpoint") - .addModifiers(Modifier.PUBLIC) - .returns(endpointRulesSpecUtils.resolverReturnType()) - .addAnnotation(Override.class) - .addParameter(endpointRulesSpecUtils.parametersClassName(), paramsName); - - b.addCode(validateRequiredParams()); - - b.addStatement("$T res = new $T().evaluate($N, toIdentifierValueMap($N))", - endpointRulesSpecUtils.rulesRuntimeClassName("Value"), - endpointRulesSpecUtils.rulesRuntimeClassName("DefaultRuleEngine"), - RULE_SET_FIELD_NAME, - paramsName); - - b.beginControlFlow("try"); - b.addStatement("return $T.completedFuture(valueAsEndpointOrThrow($N))", - CompletableFuture.class, - "res"); - b.endControlFlow(); - b.beginControlFlow("catch ($T error)", Exception.class); - b.addStatement("return $T.failedFuture(error)", CompletableFutureUtils.class); - b.endControlFlow(); - - return b.build(); - } - - private MethodSpec ruleSetBuildMethod(TypeSpec.Builder classBuilder) { - RuleSetCreationSpec ruleSetCreationSpec = new RuleSetCreationSpec(intermediateModel); - MethodSpec.Builder b = MethodSpec.methodBuilder("ruleSet") - .addModifiers(Modifier.PRIVATE, Modifier.STATIC) - .returns(endpointRulesSpecUtils.rulesRuntimeClassName("EndpointRuleset")) - .addStatement("return $L", ruleSetCreationSpec.ruleSetCreationExpr()); - - ruleSetCreationSpec.helperMethods().forEach(classBuilder::addMethod); - return b.build(); - } - - private CodeBlock validateRequiredParams() { - CodeBlock.Builder b = CodeBlock.builder(); - - Map parameters = intermediateModel.getEndpointRuleSetModel().getParameters(); - parameters.entrySet().stream() - .filter(e -> Boolean.TRUE.equals(e.getValue().isRequired())) - .forEach(e -> { - b.addStatement("$T.notNull($N.$N(), $S)", - Validate.class, - "endpointParams", - endpointRulesSpecUtils.paramMethodName(e.getKey()), - String.format("Parameter '%s' must not be null", e.getKey())); - }); - - return b.build(); - } } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointRulesSpecUtils.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointRulesSpecUtils.java index 04cc97420d5e..bd4410f814b9 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointRulesSpecUtils.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointRulesSpecUtils.java @@ -275,18 +275,6 @@ public List rulesEngineFilesFromDirectory(URL location) { } } - public List rulesEngineResourceFiles2() { - URL currentJarUrl = EndpointRulesSpecUtils.class.getProtectionDomain().getCodeSource().getLocation(); - try (JarFile jarFile = new JarFile(currentJarUrl.getFile())) { - return jarFile.stream() - .map(ZipEntry::getName) - .filter(e -> e.startsWith("software/amazon/awssdk/codegen/rules2/")) - .collect(Collectors.toList()); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - public Map parameters() { return intermediateModel.getEndpointRuleSetModel().getParameters(); } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointUrlCodeEmitter.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointUrlCodeEmitter.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointUrlCodeEmitter.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointUrlCodeEmitter.java index 957c0a72e933..3b77ecc6fc3e 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointUrlCodeEmitter.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointUrlCodeEmitter.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import com.squareup.javapoet.CodeBlock; import java.util.ArrayList; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ErrorExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ErrorExpression.java similarity index 97% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ErrorExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ErrorExpression.java index 7394adaf6637..8fe8aaddee81 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ErrorExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ErrorExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Objects; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ExpressionParser.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ExpressionParser.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ExpressionParser.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ExpressionParser.java index 189a8bb63cf0..6c58d2150464 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ExpressionParser.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ExpressionParser.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.TreeNode; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/FunctionCallExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/FunctionCallExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/FunctionCallExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/FunctionCallExpression.java index fba584cb68a9..e70d505cdc08 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/FunctionCallExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/FunctionCallExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.Collections; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/HeadersExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/HeadersExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/HeadersExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/HeadersExpression.java index 426d4137b726..d867832701d2 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/HeadersExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/HeadersExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Collections; import java.util.LinkedHashMap; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/IndexedAccessExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/IndexedAccessExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/IndexedAccessExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/IndexedAccessExpression.java index 6521f242658f..04d77a4baff3 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/IndexedAccessExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/IndexedAccessExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Objects; import software.amazon.awssdk.utils.Validate; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LetExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LetExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LetExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LetExpression.java index d812ce095681..571a79dcb826 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LetExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LetExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Collections; import java.util.LinkedHashMap; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ListExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ListExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ListExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ListExpression.java index 5d8bb9d87ef4..5284a9c784ec 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/ListExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ListExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.Collections; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralBooleanExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralBooleanExpression.java similarity index 97% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralBooleanExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralBooleanExpression.java index e87228a78445..9858a2b42ddc 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralBooleanExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralBooleanExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; /** * Represents a literal boolean value. E.g., {@code true} or {@code false}. diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralIntegerExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralIntegerExpression.java similarity index 97% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralIntegerExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralIntegerExpression.java index 439c4a1eaf69..a4a4969a43f9 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralIntegerExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralIntegerExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; /** * Represents a literal integer value. E.g., {@code 123}. diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralStringExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralStringExpression.java similarity index 97% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralStringExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralStringExpression.java index 253d79e3c18b..b8cd93389e74 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/LiteralStringExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/LiteralStringExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; /** * Represents a literal string value. E.g., {@code "accesspoint"}. diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/MemberAccessExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/MemberAccessExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/MemberAccessExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/MemberAccessExpression.java index 0c14a2e99264..6192f0b22a33 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/MemberAccessExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/MemberAccessExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Objects; import software.amazon.awssdk.utils.Validate; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/MethodCallExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/MethodCallExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/MethodCallExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/MethodCallExpression.java index e54f6d7e509d..25c27a2a5241 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/MethodCallExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/MethodCallExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.Collections; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/PrepareForCodegenVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/PrepareForCodegenVisitor.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/PrepareForCodegenVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/PrepareForCodegenVisitor.java index a453812bd5a0..ce90249b707e 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/PrepareForCodegenVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/PrepareForCodegenVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.List; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/PropertiesExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/PropertiesExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/PropertiesExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/PropertiesExpression.java index a40882aa0322..1eb914d3416b 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/PropertiesExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/PropertiesExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Collections; import java.util.LinkedHashMap; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RenameForCodegenVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RenameForCodegenVisitor.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RenameForCodegenVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RenameForCodegenVisitor.java index 1c09b51c398a..25fe2bbdd5d3 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RenameForCodegenVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RenameForCodegenVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import software.amazon.awssdk.codegen.internal.Utils; import software.amazon.awssdk.utils.internal.CodegenNamingUtils; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RewriteRuleExpressionVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RewriteRuleExpressionVisitor.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RewriteRuleExpressionVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RewriteRuleExpressionVisitor.java index c43e295c471e..9f76cdda0701 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RewriteRuleExpressionVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RewriteRuleExpressionVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.Collections; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleExpression.java similarity index 96% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleExpression.java index 475bbb366b6b..cae3f2b2f367 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; /** * Represents an expression within an endpoint rules set, either explicit or synthetically created for codegen. diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleExpressionVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleExpressionVisitor.java similarity index 97% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleExpressionVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleExpressionVisitor.java index 61d64ff4e647..907ddc800ec0 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleExpressionVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleExpressionVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; /** * Visitor for all the expressions defined in the endpoints rule sets. diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleFunctionMirror.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleFunctionMirror.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleFunctionMirror.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleFunctionMirror.java index 5578173275ee..2de2050e899f 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleFunctionMirror.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleFunctionMirror.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Collections; import java.util.LinkedHashMap; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleRuntimeTypeMirror.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleRuntimeTypeMirror.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleRuntimeTypeMirror.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleRuntimeTypeMirror.java index ff42af43d8f4..252e78770b40 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleRuntimeTypeMirror.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleRuntimeTypeMirror.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.TypeName; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleSetCreationSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleSetCreationSpec.java deleted file mode 100644 index 9ba974d74b28..000000000000 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleSetCreationSpec.java +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.codegen.poet.rules; - -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.core.TreeNode; -import com.fasterxml.jackson.jr.stree.JrsArray; -import com.fasterxml.jackson.jr.stree.JrsBoolean; -import com.fasterxml.jackson.jr.stree.JrsNumber; -import com.fasterxml.jackson.jr.stree.JrsObject; -import com.fasterxml.jackson.jr.stree.JrsString; -import com.fasterxml.jackson.jr.stree.JrsValue; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.MethodSpec; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import javax.lang.model.element.Modifier; -import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; -import software.amazon.awssdk.codegen.model.rules.endpoints.ConditionModel; -import software.amazon.awssdk.codegen.model.rules.endpoints.EndpointModel; -import software.amazon.awssdk.codegen.model.rules.endpoints.ParameterDeprecatedModel; -import software.amazon.awssdk.codegen.model.rules.endpoints.ParameterModel; -import software.amazon.awssdk.codegen.model.rules.endpoints.RuleModel; -import software.amazon.awssdk.codegen.model.service.EndpointRuleSetModel; -import software.amazon.awssdk.utils.MapUtils; - -public class RuleSetCreationSpec { - private static final String RULE_METHOD_PREFIX = "endpointRule_"; - - private final EndpointRulesSpecUtils endpointRulesSpecUtils; - private final EndpointRuleSetModel ruleSetModel; - - private int ruleCounter = 0; - - private final List helperMethods = new ArrayList<>(); - - public RuleSetCreationSpec(IntermediateModel intermediateModel) { - this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(intermediateModel); - this.ruleSetModel = intermediateModel.getEndpointRuleSetModel(); - } - - public CodeBlock ruleSetCreationExpr() { - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("EndpointRuleset")) - .add(".version($S)", ruleSetModel.getVersion()) - .add(".serviceId($S)", ruleSetModel.getServiceId()) - .add(".parameters($L)", parameters(ruleSetModel.getParameters())); - - ruleSetModel.getRules().stream() - .map(this::rule) - .forEach(m -> b.add(".addRule($N())", m.name)); - - b.add(".build()"); - return b.build(); - } - - public List helperMethods() { - return helperMethods; - } - - private CodeBlock parameters(Map params) { - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("Parameters")); - - params.forEach((name, model) -> { - b.add(".addParameter($L)", parameter(name, model)); - }); - - b.add(".build()"); - - return b.build(); - } - - private CodeBlock parameter(String name, ParameterModel model) { - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("Parameter")) - .add(".name($S)", name) - .add(".type($T.fromValue($S))", endpointRulesSpecUtils.rulesRuntimeClassName("ParameterType"), model.getType()) - .add(".required($L)", Boolean.TRUE.equals(model.isRequired())); - - if (model.getBuiltIn() != null) { - b.add(".builtIn($S)", model.getBuiltIn()); - } - - if (model.getDocumentation() != null) { - b.add(".documentation($S)", model.getDocumentation()); - } - - if (model.getDefault() != null) { - TreeNode defaultValue = model.getDefault(); - JsonToken token = defaultValue.asToken(); - CodeBlock value; - if (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE) { - value = endpointRulesSpecUtils.valueCreationCode("boolean", - CodeBlock.builder() - .add("$L", ((JrsBoolean) defaultValue).booleanValue()) - .build()); - } else if (token == JsonToken.VALUE_STRING) { - value = endpointRulesSpecUtils.valueCreationCode("string", - CodeBlock.builder() - .add("$S", ((JrsString) defaultValue).getValue()) - .build()); - } else if (token == JsonToken.START_ARRAY) { - validateStringArrayType(model); - value = endpointRulesSpecUtils.valueCreationCode("stringarray", - buildStringArrayDefaultValue((JrsArray) defaultValue)); - } else { - throw new RuntimeException("Can't set default value type " + token.name()); - } - b.add(".defaultValue($L)", value); - } - - if (model.getDeprecated() != null) { - ParameterDeprecatedModel deprecated = model.getDeprecated(); - b.add(".deprecated(new $T($S, $S))", - endpointRulesSpecUtils.rulesRuntimeClassName("Parameter.Deprecated"), - deprecated.getMessage(), - deprecated.getSince()); - } - - b.add(".build()"); - - return b.build(); - } - - private MethodSpec rule(RuleModel model) { - MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder(nextRuleMethodName()); - - methodBuilder.addModifiers(Modifier.PRIVATE, Modifier.STATIC); - methodBuilder.returns(endpointRulesSpecUtils.rulesRuntimeClassName("Rule")); - - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("Rule")); - - model.getConditions().forEach(c -> b.add(".addCondition($L)", condition(c))); - - if ("error".equals(model.getType())) { - b.add(".error($S)", model.getError()); - } else if ("tree".equals(model.getType())) { - CodeBlock.Builder rulesArray = CodeBlock.builder() - .add("$T.asList(", Arrays.class); - - int nRules = model.getRules().size(); - for (int i = 0; i < nRules; ++i) { - MethodSpec childRule = rule(model.getRules().get(i)); - rulesArray.add("$N()", childRule.name); - if (i + 1 < nRules) { - rulesArray.add(", "); - } - } - rulesArray.add(")"); - - b.add(".treeRule($L)", rulesArray.build()); - } else if ("endpoint".equals(model.getType())) { - CodeBlock endpoint = endpoint(model.getEndpoint()); - b.add(".endpoint($L)", endpoint); - } - - MethodSpec m = methodBuilder.addStatement("return $L", b.build()).build(); - - helperMethods.add(m); - - return m; - } - - private CodeBlock endpoint(EndpointModel model) { - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("EndpointResult")); - - TreeNode url = model.getUrl(); - b.add(".url($L)", expr(url)); - - if (model.getHeaders() != null) { - model.getHeaders().forEach((name, valueList) -> { - valueList.forEach(value -> b.add(".addHeaderValue($S, $L)", name, expr(value))); - }); - } - - if (model.getProperties() != null) { - // Explicitly only support known properties - model.getProperties().forEach((name, property) -> { - switch (name) { - case "authSchemes": - b.add(".addProperty($T.of($S), $T.fromTuple($T.asList(", - endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), - "authSchemes", - endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - Arrays.class); - - Iterator authSchemesIter = ((JrsArray) property).elements(); - - while (authSchemesIter.hasNext()) { - b.add("$T.fromRecord($T.of(", endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - MapUtils.class); - JrsObject authScheme = (JrsObject) authSchemesIter.next(); - - Iterator authSchemeFieldsIter = authScheme.fieldNames(); - while (authSchemeFieldsIter.hasNext()) { - String schemeProp = authSchemeFieldsIter.next(); - JrsValue propValue = authScheme.get(schemeProp); - b.add("$T.of($S), ", endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), schemeProp); - if ("signingRegionSet".equalsIgnoreCase(schemeProp)) { - b.add("$T.fromTuple($T.asList(", endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - Arrays.class); - Iterator signingRegions = ((JrsArray) propValue).elements(); - - while (signingRegions.hasNext()) { - JrsString region = (JrsString) signingRegions.next(); - b.add("$T.fromStr($S)", endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - region.getValue()); - - if (signingRegions.hasNext()) { - b.add(", "); - } - } - b.add("))"); - } else if ("disableDoubleEncoding".equalsIgnoreCase(schemeProp)) { - b.add("$T.fromBool($L)", endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - ((JrsBoolean) propValue).booleanValue()); - } else { - b.add("$T.fromStr($S)", endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - ((JrsString) propValue).getValue()); - } - - if (authSchemeFieldsIter.hasNext()) { - b.add(", "); - } - } - - b.add("))"); - - if (authSchemesIter.hasNext()) { - b.add(", "); - } - } - b.add(")))"); - - break; - case "bucketType": - b.add(".addProperty($T.of($S), $T.fromStr($S))", - endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), - "bucketType", - endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - ((JrsString) property).getValue()); - break; - case "useS3ExpressSessionAuth": - b.add(".addProperty($T.of($S), $T.fromBool($L))", - endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), - "useS3ExpressSessionAuth", - endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - ((JrsBoolean) property).booleanValue()); - break; - case "backend": - b.add(".addProperty($T.of($S), $T.fromStr($S))", - endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), - "backend", - endpointRulesSpecUtils.rulesRuntimeClassName("Literal"), - ((JrsString) property).getValue()); - break; - default: - break; - } - }); - } - - b.add(".build()"); - return b.build(); - } - - private CodeBlock condition(ConditionModel model) { - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("Condition")) - .add(".fn($L.validate())", fnNode(model)); - - if (model.getAssign() != null) { - b.add(".result($S)", model.getAssign()); - } - - b.add(".build()"); - - return b.build(); - } - - private CodeBlock fnNode(ConditionModel model) { - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("FnNode")) - .add(".fn($S)", model.getFn()) - .add(".argv($T.asList(", Arrays.class); - - List args = model.getArgv(); - for (int i = 0; i < args.size(); ++i) { - b.add("$L", expr(args.get(i))); - if (i + 1 < args.size()) { - b.add(","); - } - } - b.add("))"); - - b.add(".build()"); - - return b.build(); - } - - private CodeBlock expr(TreeNode n) { - if (n.isValueNode()) { - return valueExpr((JrsValue) n); - } - - if (n.isObject()) { - return objectExpr((JrsObject) n); - } - - throw new RuntimeException("Don't know how to create expression from " + n); - } - - private CodeBlock valueExpr(JrsValue n) { - CodeBlock.Builder b = CodeBlock.builder(); - - b.add("$T.of(", endpointRulesSpecUtils.rulesRuntimeClassName("Expr")); - JsonToken token = n.asToken(); - switch (token) { - case VALUE_STRING: - b.add("$S", ((JrsString) n).getValue()); - break; - case VALUE_NUMBER_INT: - b.add("$L", ((JrsNumber) n).getValue().intValue()); - break; - case VALUE_TRUE: - case VALUE_FALSE: - b.add("$L", ((JrsBoolean) n).booleanValue()); - break; - default: - throw new RuntimeException("Don't know how to create expression JSON type " + token); - } - - b.add(")"); - - return b.build(); - } - - private CodeBlock objectExpr(JrsObject n) { - CodeBlock.Builder b = CodeBlock.builder(); - - JrsValue ref = n.get("ref"); - JrsValue fn = n.get("fn"); - - if (ref != null) { - b.add("$T.ref($T.of($S))", - endpointRulesSpecUtils.rulesRuntimeClassName("Expr"), - endpointRulesSpecUtils.rulesRuntimeClassName("Identifier"), - ref.asText()); - } else if (fn != null) { - String name = fn.asText(); - CodeBlock.Builder fnNode = CodeBlock.builder(); - fnNode.add("$T.builder()", endpointRulesSpecUtils.rulesRuntimeClassName("FnNode")) - .add(".fn($S)", name); - - JrsArray argv = (JrsArray) n.get("argv"); - - fnNode.add(".argv($T.asList(", Arrays.class); - Iterator iter = argv.elements(); - - while (iter.hasNext()) { - fnNode.add(expr(iter.next())); - - if (iter.hasNext()) { - fnNode.add(","); - } - } - - fnNode.add(")).build().validate()"); - - b.add(fnNode.build()); - } - - return b.build(); - } - - private String nextRuleMethodName() { - String n = String.format("%s%d", RULE_METHOD_PREFIX, ruleCounter); - ruleCounter += 1; - return n; - } - - private static void validateStringArrayType(ParameterModel model) { - if (!"stringarray".equalsIgnoreCase(model.getType())) { - throw new RuntimeException(String.format("Only String array is supported but the type received is %s", - model.getType())); - } - } - - private CodeBlock buildStringArrayDefaultValue(JrsArray defaultValue) { - CodeBlock.Builder builder = CodeBlock.builder(); - Iterator elementValuesIter = defaultValue.elements(); - if (elementValuesIter.hasNext()) { - builder.add("$T.asList(", Arrays.class); - } - while (elementValuesIter.hasNext()) { - JrsValue v = elementValuesIter.next(); - builder.add("\"" + v.asText() + "\""); - if (elementValuesIter.hasNext()) { - builder.add(","); - } - } - builder.add(")"); - return builder.build(); - } -} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleSetExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleSetExpression.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleSetExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleSetExpression.java index 13a3ccafc51b..22c5f541e21f 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleSetExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleSetExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.Collections; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleType.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleType.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleType.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleType.java index fd86b78066d3..ed2344107e50 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/RuleType.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/RuleType.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.ParameterizedTypeName; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/StringConcatExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/StringConcatExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/StringConcatExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/StringConcatExpression.java index 106f3cc0291a..72713c0c22f6 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/StringConcatExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/StringConcatExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.Collections; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/SymbolTable.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/SymbolTable.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/SymbolTable.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/SymbolTable.java index 67176abfa146..50d51a8d60f6 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/SymbolTable.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/SymbolTable.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Collections; import java.util.LinkedHashMap; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/Tokenizer.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/Tokenizer.java similarity index 99% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/Tokenizer.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/Tokenizer.java index c1f48710c816..2d43a356223a 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/Tokenizer.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/Tokenizer.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.ArrayList; import java.util.List; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/VariableReferenceExpression.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/VariableReferenceExpression.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/VariableReferenceExpression.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/VariableReferenceExpression.java index ab208ac88422..b0311aad0755 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/VariableReferenceExpression.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/VariableReferenceExpression.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Objects; import software.amazon.awssdk.utils.Validate; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/WalkRuleExpressionVisitor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/WalkRuleExpressionVisitor.java similarity index 98% rename from codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/WalkRuleExpressionVisitor.java rename to codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/WalkRuleExpressionVisitor.java index de952b6d67da..fb164de3fc3e 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/WalkRuleExpressionVisitor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/WalkRuleExpressionVisitor.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import java.util.Collection; import java.util.List; diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointProviderSpec2.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointProviderSpec2.java deleted file mode 100644 index 831b8d88af83..000000000000 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules2/EndpointProviderSpec2.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.codegen.poet.rules2; - -import com.squareup.javapoet.ClassName; -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.MethodSpec; -import com.squareup.javapoet.TypeName; -import com.squareup.javapoet.TypeSpec; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import javax.lang.model.element.Modifier; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.codegen.model.config.customization.EndpointAuthSchemeConfig; -import software.amazon.awssdk.codegen.model.config.customization.KeyTypePair; -import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; -import software.amazon.awssdk.codegen.model.intermediate.Metadata; -import software.amazon.awssdk.codegen.model.rules.endpoints.BuiltInParameter; -import software.amazon.awssdk.codegen.model.rules.endpoints.ParameterModel; -import software.amazon.awssdk.codegen.model.rules.endpoints.RuleModel; -import software.amazon.awssdk.codegen.model.service.EndpointRuleSetModel; -import software.amazon.awssdk.codegen.poet.ClassSpec; -import software.amazon.awssdk.codegen.poet.PoetUtils; -import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.utils.CompletableFutureUtils; -import software.amazon.awssdk.utils.Validate; - -public class EndpointProviderSpec2 implements ClassSpec { - private final IntermediateModel intermediateModel; - private final EndpointRulesSpecUtils endpointRulesSpecUtils; - private final Map knownEndpointAttributes; - private final CodegenExpressionBuidler utils; - private final RuleRuntimeTypeMirror typeMirror; - - public EndpointProviderSpec2(IntermediateModel intermediateModel) { - this.intermediateModel = intermediateModel; - this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(intermediateModel); - String packageName = intermediateModel.getMetadata().getFullInternalEndpointRulesPackageName(); - this.typeMirror = new RuleRuntimeTypeMirror(packageName); - EndpointRuleSetModel model = intermediateModel.getEndpointRuleSetModel(); - this.utils = createCodegenRulesUtil(model.getRules(), model.getParameters(), typeMirror); - this.knownEndpointAttributes = knownEndpointAttributes(intermediateModel); - } - - private static RuleType fromParameterModel(ParameterModel model) { - switch (model.getType().toLowerCase(Locale.ENGLISH)) { - case "boolean": - return RuleRuntimeTypeMirror.BOOLEAN; - case "string": - return RuleRuntimeTypeMirror.STRING; - case "stringarray": - return RuleRuntimeTypeMirror.LIST_OF_STRING; - default: - throw new IllegalStateException("Cannot find rule type for: " + model.getType()); - } - } - - private static RuleModel createRootRule(List rules) { - RuleModel root = new RuleModel(); - root.setRules(rules); - root.setType("tree"); - root.setConditions(Collections.emptyList()); - return root; - } - - private static CodegenExpressionBuidler createCodegenRulesUtil(List rules, - Map parameters, - RuleRuntimeTypeMirror typeMirror) { - RuleSetExpression root = ExpressionParser.parseRuleSetExpression(createRootRule(rules)); - return CodegenExpressionBuidler.from(root, typeMirror, initSymbolTable(parameters)); - } - - private static SymbolTable initSymbolTable(Map parameters) { - SymbolTable.Builder builder = SymbolTable.builder(); - parameters.forEach((k, v) -> { - builder.putParam(k, fromParameterModel(v)); - if (v.getBuiltInEnum() == BuiltInParameter.AWS_REGION) { - // Region is a special case since it's already public API and uses an actual `Region` instance instead of - // `String`. We then introduce here a local with the same name but with String type such that we don't have - // to do the conversion everywhere a string represented region is used. - builder.regionParamName(k); - builder.putLocal(k, RuleRuntimeTypeMirror.STRING); - } - }); - return builder.build(); - } - - private static Map knownEndpointAttributes(IntermediateModel intermediateModel) { - Map knownEndpointAttributes = null; - EndpointAuthSchemeConfig config = intermediateModel.getCustomizationConfig().getEndpointAuthSchemeConfig(); - if (config != null) { - knownEndpointAttributes = config.getEndpointProviderTestKeys(); - } - if (knownEndpointAttributes == null) { - knownEndpointAttributes = Collections.emptyMap(); - } - return knownEndpointAttributes; - } - - @Override - public TypeSpec poetSpec() { - TypeSpec.Builder builder = PoetUtils.createClassBuilder(className()) - .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .addSuperinterface(endpointRulesSpecUtils.providerInterfaceName()) - .addAnnotation(SdkInternalApi.class); - - builder.addMethod(resolveEndpointMethod()); - List methods = new ArrayList<>(); - createRuleMethod(utils.root(), methods); - for (MethodSpec.Builder methodBuilder : methods) { - builder.addMethod(methodBuilder.build()); - } - builder.addMethod(equalsMethod()); - builder.addMethod(hashCodeMethod()); - return builder.build(); - } - - @Override - public ClassName className() { - Metadata md = intermediateModel.getMetadata(); - return ClassName.get(md.getFullInternalEndpointRulesPackageName(), - "Default" + endpointRulesSpecUtils.providerInterfaceName().simpleName()); - } - - private MethodSpec resolveEndpointMethod() { - MethodSpec.Builder builder = MethodSpec.methodBuilder("resolveEndpoint") - .addModifiers(Modifier.PUBLIC) - .returns(endpointRulesSpecUtils.resolverReturnType()) - .addAnnotation(Override.class) - .addParameter(endpointRulesSpecUtils.parametersClassName(), "params"); - - builder.addCode(validateRequiredParams()); - builder.beginControlFlow("try"); - String regionParamName = utils.regionParamName(); - if (regionParamName != null) { - builder.addStatement("$T region = params.$L()", Region.class, regionParamName); - builder.addStatement("$T regionId = region == null ? null : region.id()", String.class); - builder.addStatement("$T result = $L(params, regionId)", ruleResult(), utils.root().ruleId()); - } else { - builder.addStatement("$T result = $L(params)", ruleResult(), utils.root().ruleId()); - } - builder.beginControlFlow("if (result.canContinue())") - .addStatement("throw $T.create($S)", SdkClientException.class, "Rule engine did not reach an error or " - + "endpoint result") - .endControlFlow(); - - builder.beginControlFlow("if (result.isError())") - .addStatement("String errorMsg = result.error()") - .beginControlFlow("if (errorMsg.contains(\"Invalid ARN\") && errorMsg.contains(\":s3:::\"))") - .addStatement("errorMsg += $S", ". Use the bucket name instead of simple bucket ARNs in " - + "GetBucketLocationRequest.") - .endControlFlow() - .addStatement("throw $T.create(errorMsg)", SdkClientException.class) - .endControlFlow(); - - builder.addStatement("return $T.completedFuture(result.endpoint())", CompletableFuture.class); - builder.nextControlFlow("catch ($T error)", Exception.class); - builder.addStatement("return $T.failedFuture(error)", CompletableFutureUtils.class); - builder.endControlFlow(); - - return builder.build(); - } - - private CodeBlock validateRequiredParams() { - CodeBlock.Builder b = CodeBlock.builder(); - Map parameters = intermediateModel.getEndpointRuleSetModel().getParameters(); - parameters.entrySet().stream() - .filter(e -> Boolean.TRUE.equals(e.getValue().isRequired())) - .forEach(e -> { - b.addStatement("$T.notNull($N.$N(), $S)", - Validate.class, - "params", - endpointRulesSpecUtils.paramMethodName(e.getKey()), - String.format("Parameter '%s' must not be null", e.getKey())); - }); - - return b.build(); - } - - private void createRuleMethod(RuleSetExpression expr, List methods) { - MethodSpec.Builder builder = methodBuilderForRule(expr); - methods.add(builder); - CodeBlock.Builder block = CodeBlock.builder(); - codegenExpr(expr, block); - builder.addCode(block.build()); - if (expr.isTree()) { - for (RuleSetExpression child : expr.children()) { - if (child.isTree()) { - createRuleMethod(child, methods); - } - } - } - } - - private MethodSpec.Builder methodBuilderForRule(RuleSetExpression expr) { - MethodSpec.Builder builder = - MethodSpec.methodBuilder(expr.ruleId()) - .addModifiers(Modifier.PRIVATE, Modifier.STATIC) - .returns(ruleResult()); - ComputeScopeTree.Scope scope = utils.scopesByName().get(expr.ruleId()); - builder.addParameter(endpointRulesSpecUtils.parametersClassName(), "params"); - for (String param : scope.usesLocals()) { - if (scope.defines().contains(param)) { - continue; - } - RuleType type = utils.symbolTable().localType(param); - builder.addParameter(type.javaType(), param); - } - return builder; - } - - private void codegenExpr(RuleSetExpression expr, CodeBlock.Builder builder) { - CodeGeneratorVisitor visitor = new CodeGeneratorVisitor(typeMirror, - utils.symbolTable(), - knownEndpointAttributes, - utils.scopesByName(), - builder); - visitor.visitRuleSetExpression(expr); - } - - private TypeName ruleResult() { - return typeMirror.rulesResult().type(); - } - - private MethodSpec equalsMethod() { - return MethodSpec.methodBuilder("equals") - .addAnnotation(Override.class) - .addModifiers(Modifier.PUBLIC) - .returns(boolean.class) - .addParameter(Object.class, "rhs") - .addStatement("return rhs != null && getClass().equals(rhs.getClass())") - .build(); - } - - private MethodSpec hashCodeMethod() { - return MethodSpec.methodBuilder("hashCode") - .addAnnotation(Override.class) - .addModifiers(Modifier.PUBLIC) - .returns(int.class) - .addStatement("return getClass().hashCode()") - .build(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Arn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Arn.java.resource deleted file mode 100644 index cee045e523e3..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Arn.java.resource +++ /dev/null @@ -1,112 +0,0 @@ -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * An AWS Arn. - */ -@SdkInternalApi -public final class Arn { - private final String partition; - private final String service; - private final String region; - private final String accountId; - private final List resource; - - public Arn(String partition, String service, String region, String accountId, List resource) { - this.partition = partition; - this.service = service; - this.region = region; - this.accountId = accountId; - this.resource = resource; - } - - public static Optional parse(String arn) { - String[] base = arn.split(":", 6); - if (base.length != 6) { - return Optional.empty(); - } - // service, resource and `arn` may not be null - if (!base[0].equals("arn")) { - return Optional.empty(); - } - if (base[1].isEmpty() || base[2].isEmpty()) { - return Optional.empty(); - } - if (base[5].isEmpty()) { - return Optional.empty(); - } - return Optional.of(new Arn(base[1], base[2], base[3], base[4], - Arrays.stream(base[5].split("[:/]", -1)) - .collect(Collectors.toList()))); - } - - public String partition() { - return partition; - } - - public String service() { - return service; - } - - public String region() { - return region; - } - - public String accountId() { - return accountId; - } - - public List resource() { - return resource; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Arn arn = (Arn) o; - - if (partition != null ? !partition.equals(arn.partition) : arn.partition != null) { - return false; - } - if (service != null ? !service.equals(arn.service) : arn.service != null) { - return false; - } - if (region != null ? !region.equals(arn.region) : arn.region != null) { - return false; - } - if (accountId != null ? !accountId.equals(arn.accountId) : arn.accountId != null) { - return false; - } - return resource != null ? resource.equals(arn.resource) : arn.resource == null; - } - - @Override - public int hashCode() { - int result = partition != null ? partition.hashCode() : 0; - result = 31 * result + (service != null ? service.hashCode() : 0); - result = 31 * result + (region != null ? region.hashCode() : 0); - result = 31 * result + (accountId != null ? accountId.hashCode() : 0); - result = 31 * result + (resource != null ? resource.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "Arn[" + - "partition=" + partition + ", " + - "service=" + service + ", " + - "region=" + region + ", " + - "accountId=" + accountId + ", " + - "resource=" + resource + ']'; - } - -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/BooleanEqualsFn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/BooleanEqualsFn.java.resource deleted file mode 100644 index 1efb616d2d0d..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/BooleanEqualsFn.java.resource +++ /dev/null @@ -1,39 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.utils.Pair; - -@SdkInternalApi -public class BooleanEqualsFn extends Fn { - public static final String ID = "booleanEquals"; - - public BooleanEqualsFn(FnNode fnNode) { - super(fnNode); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitBoolEquals(this); - } - - public static BooleanEqualsFn ofExprs(Expr left, Expr right) { - return new BooleanEqualsFn(FnNode.ofExprs(ID, left, right)); - } - - public Expr getLeft() { - return expectTwoArgs().left(); - } - - public Expr getRight() { - return expectTwoArgs().right(); - } - - @Override - public Value eval(Scope scope) { - Pair args = expectTwoArgs(); - return RuleError.ctx("while evaluating booleanEquals", - () -> Value.fromBool(args.left().eval(scope).expectBool() == args.right().eval(scope).expectBool())); - } - - public static BooleanEqualsFn fromParam(Parameter param, Expr value) { - return ofExprs(param.expr(), value); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Condition.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Condition.java.resource deleted file mode 100644 index 711bc627cffb..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Condition.java.resource +++ /dev/null @@ -1,92 +0,0 @@ -import java.util.Map; -import java.util.Optional; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public final class Condition implements Eval, IntoSelf { - public static final String ASSIGN = "assign"; - - private final Expr fn; - private final Identifier result; - - private Condition(Builder builder) { - this.fn = builder.fn; - this.result = builder.result; - } - - public Expr getFn() { - return fn; - } - - public Optional getResult() { - return Optional.ofNullable(result); - } - - public static Condition fromNode(JsonNode node) { - Map objNode = node.asObject(); - - Builder b = builder(); - - Fn fn = FnNode.fromNode(node).validate(); - - b.fn(fn); - - JsonNode assignNode = objNode.get(ASSIGN); - if (assignNode != null) { - b.result(assignNode.asString()); - } - - return b.build(); - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - this.getResult().ifPresent(res -> sb.append(res).append(" = ")); - sb.append(this.fn); - return sb.toString(); - } - - @Override - public Value eval(Scope scope) { - Value value = this.fn.eval(scope); - if (!value.isNone()) { - this.getResult().ifPresent(res -> scope.insert(res, value)); - } - return value; - } - - public Expr expr() { - if (this.getResult().isPresent()) { - return Expr.ref(this.getResult().get()); - } else { - throw new RuntimeException("Cannot generate expr from a condition without a result"); - } - } - - - public static class Builder { - private Fn fn; - private Identifier result; - - public Builder fn(Fn fn) { - this.fn = fn; - return this; - } - - public Builder result(String result) { - this.result = Identifier.of(result); - return this; - } - - public Condition build() { - return new Condition(this); - } - - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategy.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategy.java.resource deleted file mode 100644 index 6f2a22e1ce9b..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategy.java.resource +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import software.amazon.awssdk.awscore.endpoints.authscheme.EndpointAuthScheme; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.utils.Logger; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public final class DefaultEndpointAuthSchemeStrategy implements EndpointAuthSchemeStrategy { - private static final Logger LOG = Logger.loggerFor(DefaultEndpointAuthSchemeStrategy.class); - - private final Map> knownAuthSchemesMapping; - - public DefaultEndpointAuthSchemeStrategy(Map> knownAuthSchemesMapping) { - this.knownAuthSchemesMapping = knownAuthSchemesMapping; - } - - @Override - public EndpointAuthScheme chooseAuthScheme(List authSchemes) { - return authSchemes.stream() - .filter(scheme -> knownAuthSchemesMapping.containsKey(scheme.name())) - .findFirst() - .orElseThrow(() -> SdkClientException.create("Endpoint did not contain any known auth schemes: " + authSchemes)); - } - - @Override - public List createAuthSchemes(Value authSchemesValue) { - Value.Array schemesArray = authSchemesValue.expectArray(); - List authSchemes = new ArrayList<>(); - for (int i = 0; i < schemesArray.size(); ++i) { - Value.Record scheme = schemesArray.get(i).expectRecord(); - String authSchemeName = scheme.get(Identifier.of("name")).expectString(); - Function mapper = knownAuthSchemesMapping.get(authSchemeName); - if (mapper == null) { - LOG.debug(() -> "Ignoring unknown auth scheme: " + authSchemeName); - continue; - } - authSchemes.add(mapper.apply(scheme)); - } - return authSchemes; - } -} - diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategyFactory.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategyFactory.java.resource deleted file mode 100644 index 2c819a232b8c..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultEndpointAuthSchemeStrategyFactory.java.resource +++ /dev/null @@ -1,63 +0,0 @@ -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import software.amazon.awssdk.awscore.endpoints.authscheme.EndpointAuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme; - -public final class DefaultEndpointAuthSchemeStrategyFactory implements EndpointAuthSchemeStrategyFactory { - private static final String SIGV4_NAME = "sigv4"; - private static final String SIGV4A_NAME = "sigv4a"; - - public EndpointAuthSchemeStrategy endpointAuthSchemeStrategy() { - Map> knownAuthSchemesMapping = new HashMap<>(); - knownAuthSchemesMapping.put(SIGV4A_NAME, this::sigV4A); - knownAuthSchemesMapping.put(SIGV4_NAME, this::sigV4); - return new DefaultEndpointAuthSchemeStrategy(knownAuthSchemesMapping); - } - - private EndpointAuthScheme sigV4A(Value.Record scheme) { - SigV4aAuthScheme.Builder schemeBuilder = SigV4aAuthScheme.builder(); - - Value signingName = scheme.get(Identifier.of("signingName")); - if (signingName != null) { - schemeBuilder.signingName(signingName.expectString()); - } - - Value signingRegionSet = scheme.get(Identifier.of("signingRegionSet")); - if (signingRegionSet != null) { - Value.Array signingRegionSetArray = signingRegionSet.expectArray(); - for (int j = 0; j < signingRegionSetArray.size(); ++j) { - schemeBuilder.addSigningRegion(signingRegionSetArray.get(j).expectString()); - } - } - - Value disableDoubleEncoding = scheme.get(Identifier.of("disableDoubleEncoding")); - if (disableDoubleEncoding != null) { - schemeBuilder.disableDoubleEncoding(disableDoubleEncoding.expectBool()); - } - - return schemeBuilder.build(); - } - - private EndpointAuthScheme sigV4(Value.Record scheme) { - SigV4AuthScheme.Builder schemeBuilder = SigV4AuthScheme.builder(); - - Value signingName = scheme.get(Identifier.of("signingName")); - if (signingName != null) { - schemeBuilder.signingName(signingName.expectString()); - } - - Value signingRegion = scheme.get(Identifier.of("signingRegion")); - if (signingRegion != null) { - schemeBuilder.signingRegion(signingRegion.expectString()); - } - - Value disableDoubleEncoding = scheme.get(Identifier.of("disableDoubleEncoding")); - if (disableDoubleEncoding != null) { - schemeBuilder.disableDoubleEncoding(disableDoubleEncoding.expectBool()); - } - - return schemeBuilder.build(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultRuleEngine.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultRuleEngine.java.resource deleted file mode 100644 index 70fc540c9013..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/DefaultRuleEngine.java.resource +++ /dev/null @@ -1,12 +0,0 @@ -import java.util.Map; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class DefaultRuleEngine implements RuleEngine { - private final RuleEvaluator evaluator = new RuleEvaluator(); - - @Override - public Value evaluate(EndpointRuleset ruleset, Map args) { - return evaluator.evaluateRuleset(ruleset, args); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAttributeProvider.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAttributeProvider.java.resource deleted file mode 100644 index 77e9645f46c9..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAttributeProvider.java.resource +++ /dev/null @@ -1,14 +0,0 @@ -import software.amazon.awssdk.endpoints.EndpointAttributeKey; -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * Link between an endpoint property and the {@link AwsEndpointAttribute} it represents. - * - @param the {@link AwsEndpointAttribute} type - */ -@SdkInternalApi -public interface EndpointAttributeProvider { - String propertyName(); - EndpointAttributeKey attributeKey(); - T attributeValue(Value value); -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategy.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategy.java.resource deleted file mode 100644 index 61217fb3c8e1..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategy.java.resource +++ /dev/null @@ -1,10 +0,0 @@ -import java.util.List; -import software.amazon.awssdk.awscore.endpoints.authscheme.EndpointAuthScheme; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface EndpointAuthSchemeStrategy { - EndpointAuthScheme chooseAuthScheme(List authSchemes); - - List createAuthSchemes(Value authSchemesValue); -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategyFactory.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategyFactory.java.resource deleted file mode 100644 index 294ea10bad0b..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointAuthSchemeStrategyFactory.java.resource +++ /dev/null @@ -1,12 +0,0 @@ -import java.util.function.Supplier; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface EndpointAuthSchemeStrategyFactory extends Supplier { - EndpointAuthSchemeStrategy endpointAuthSchemeStrategy(); - - @Override - default EndpointAuthSchemeStrategy get() { - return endpointAuthSchemeStrategy(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointResult.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointResult.java.resource deleted file mode 100644 index 8c40f6fba3c9..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointResult.java.resource +++ /dev/null @@ -1,132 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public final class EndpointResult { - private static final String URL = "url"; - private static final String PROPERTIES = "properties"; - private static final String HEADERS = "headers"; - - private Expr url; - private Map properties; - private Map> headers; - - private EndpointResult(Builder builder) { - this.url = builder.url; - this.properties = builder.properties; - this.headers = builder.headers; - } - - public Expr getUrl() { - return url; - } - - public Map getProperties() { - return properties; - } - - public Map> getHeaders() { - return headers; - } - - public static EndpointResult fromNode(JsonNode node) { - Map objNode = node.asObject(); - - Builder b = builder(); - - b.url(Expr.fromNode(objNode.get(URL))); - - JsonNode propertiesNode = objNode.get(PROPERTIES); - if (propertiesNode != null) { - propertiesNode.asObject().forEach((k, v) -> { - b.addProperty(Identifier.of(k), Literal.fromNode(v)); - }); - } - - JsonNode headersNode = objNode.get(HEADERS); - if (headersNode != null) { - headersNode.asObject().forEach((k, v) -> { - b.addHeader(k, v.asArray().stream().map(Literal::fromNode).collect(Collectors.toList())); - }); - } - - return b.build(); - } - - @Override - public String toString() { - return "Endpoint{" + - "url=" + url + - ", properties=" + properties + - ", headers=" + headers + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - EndpointResult endpoint = (EndpointResult) o; - - if (url != null ? !url.equals(endpoint.url) : endpoint.url != null) { - return false; - } - if (properties != null ? !properties.equals(endpoint.properties) : endpoint.properties != null) { - return false; - } - return headers != null ? headers.equals(endpoint.headers) : endpoint.headers == null; - } - - @Override - public int hashCode() { - int result = url != null ? url.hashCode() : 0; - result = 31 * result + (properties != null ? properties.hashCode() : 0); - result = 31 * result + (headers != null ? headers.hashCode() : 0); - return result; - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private Expr url; - private final Map properties = new HashMap<>(); - private final Map> headers = new HashMap<>(); - - public Builder url(Expr url) { - this.url = url; - return this; - } - - public Builder addProperty(Identifier name, Expr value) { - properties.put(name, value); - return this; - } - - public Builder addHeader(String name, List value) { - this.headers.put(name, value); - return this; - } - - public Builder addHeaderValue(String name, Expr value) { - List values = this.headers.computeIfAbsent(name, n -> new ArrayList<>()); - values.add(value); - return this; - } - - public EndpointResult build() { - return new EndpointResult(this); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRule.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRule.java.resource deleted file mode 100644 index c66b069a11ed..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRule.java.resource +++ /dev/null @@ -1,29 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public final class EndpointRule extends Rule { - private final EndpointResult endpoint; - - protected EndpointRule(Builder builder, EndpointResult endpoint) { - super(builder); - this.endpoint = endpoint; - } - - public EndpointResult getEndpoint() { - return endpoint; - } - - @Override - public T accept(RuleValueVisitor visitor) { - return visitor.visitEndpointRule(this.getEndpoint()); - } - - @Override - public String toString() { - return "EndpointRule{" + - "endpoint=" + endpoint + - ", conditions=" + conditions + - ", documentation='" + documentation + '\'' + - '}'; - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRuleset.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRuleset.java.resource deleted file mode 100644 index 8a9b30c838fe..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/EndpointRuleset.java.resource +++ /dev/null @@ -1,117 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -/** - * The set of rules that are used to compute the endpoint to use for a request. - */ -@SdkInternalApi -public final class EndpointRuleset { - private static final String SERVICE_ID = "serviceId"; - private static final String VERSION = "version"; - private static final String PARAMETERS = "parameters"; - private static final String RULES = "rules"; - - - private final String serviceId; - private final List rules; - private final String version; - private final Parameters parameters; - - private EndpointRuleset(Builder b) { - this.serviceId = b.serviceId; - this.rules = b.rules; - this.version = b.version; - this.parameters = b.parameters; - } - - public String getServiceId() { - return serviceId; - } - - public List getRules() { - return rules; - } - - public String getVersion() { - return version; - } - - public Parameters getParameters() { - return parameters; - } - - public static Builder builder() { - return new Builder(); - } - - public static EndpointRuleset fromNode(JsonNode node) { - Builder b = builder(); - - Map obj = node.asObject(); - - JsonNode serviceIdNode = obj.get(SERVICE_ID); - if (serviceIdNode != null) { - b.serviceId(serviceIdNode.asString()); - } - - JsonNode versionNode = obj.get(VERSION); - if (versionNode != null) { - b.version(versionNode.asString()); - } - - b.parameters(Parameters.fromNode(obj.get(PARAMETERS))); - - obj.get(RULES).asArray().forEach(rn -> b.addRule(Rule.fromNode(rn))); - - return b.build(); - } - - @Override - public String toString() { - return "EndpointRuleset{" + - "serviceId='" + serviceId + '\'' + - ", rules=" + rules + - ", version='" + version + '\'' + - ", parameters=" + parameters + - '}'; - } - - public static class Builder { - private String serviceId; - private final List rules = new ArrayList<>(); - private String version; - private Parameters parameters; - - public Builder serviceId(String serviceId) { - this.serviceId = serviceId; - return this; - } - - public Builder withDefaultVersion() { - this.version = "1.0"; - return this; - } - - public Builder version(String version) { - this.version = version; - return this; - } - - public Builder addRule(Rule rule) { - rules.add(rule); - return this; - } - - public Builder parameters(Parameters parameters) { - this.parameters = parameters; - return this; - } - - public EndpointRuleset build() { - return new EndpointRuleset(this); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ErrorRule.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ErrorRule.java.resource deleted file mode 100644 index 9dd7d97026f3..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ErrorRule.java.resource +++ /dev/null @@ -1,25 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class ErrorRule extends Rule { - private final Expr error; - - public ErrorRule(Builder builder, Expr error) { - super(builder); - this.error = error; - } - - @Override - public T accept(RuleValueVisitor v) { - return v.visitErrorRule(error); - } - - @Override - public String toString() { - return "ErrorRule{" + - "error=" + error + - ", conditions=" + conditions + - ", documentation='" + documentation + '\'' + - '}'; - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Eval.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Eval.java.resource deleted file mode 100644 index cd64069ac420..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Eval.java.resource +++ /dev/null @@ -1,6 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface Eval { - Value eval(Scope scope); -} \ No newline at end of file diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Expr.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Expr.java.resource deleted file mode 100644 index fdd6067db226..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Expr.java.resource +++ /dev/null @@ -1,78 +0,0 @@ -import java.util.Map; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public abstract class Expr implements Eval { - - public abstract R accept(ExprVisitor visitor); - - public GetAttr getAttr(String path) { - return GetAttr.builder().target(this).path(path).build(); - } - - public GetAttr getAttr(Identifier path) { - return GetAttr.builder().target(this).path(path.asString()).build(); - } - - public static Expr fromNode(JsonNode node) { - if (node.isObject()) { - Map objNode = node.asObject(); - JsonNode ref = objNode.get("ref"); - JsonNode fn = objNode.get("fn"); - if ((ref != null ? 1 : 0) + (fn != null ? 1 : 0) != 1) { - throw SourceException.builder().message("expected exactly one of `ref` or `fn` to be set").build(); - } - if (ref != null) { - return ref(Identifier.of(ref.asString())); - } - return RuleError.ctx("while parsing fn", () -> FnNode.fromNode(node).validate()); - } else if (node.isString()) { - return Literal.fromStr(node.asString()); - } else { - return Literal.fromNode(node); - } - } - - /** - * Parse a value from a "short form" used within a template - * - * @param shortForm - * @return - */ - public static Expr parseShortform(String shortForm) { - return RuleError.ctx("while parsing `" + shortForm + "` within a template", () -> { - if (shortForm.contains("#")) { - String[] parts = shortForm.split("#", 2); - String base = parts[0]; - String pattern = parts[1]; - return GetAttr.builder() - .target(ref(Identifier.of(base))) - .path(pattern).build(); - } else { - return ref(Identifier.of(shortForm)); - } - }); - } - - public String template() { - throw new RuntimeException(String.format("cannot convert %s to a string template", this)); - } - - public static Ref ref(Identifier name) { - return new Ref(name); - } - - public static Expr of(boolean value) { - return Literal.fromBool(value); - } - - public static Expr of(int value) { - return Literal.fromInteger(value); - } - - public static Expr of(String value) { - return Literal.fromStr(value); - } - -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ExprVisitor.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ExprVisitor.java.resource deleted file mode 100644 index 2cb0325d36f2..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ExprVisitor.java.resource +++ /dev/null @@ -1,31 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface ExprVisitor { - - R visitLiteral(Literal literal); - - R visitRef(Ref ref); - - R visitFn(Fn fn); - - abstract class Default implements ExprVisitor { - - public abstract R getDefault(); - - @Override - public R visitLiteral(Literal literal) { - return getDefault(); - } - - @Override - public R visitRef(Ref ref) { - return getDefault(); - } - - @Override - public R visitFn(Fn fn) { - return getDefault(); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FatScope.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FatScope.java.resource deleted file mode 100644 index 2da5c6d152ba..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FatScope.java.resource +++ /dev/null @@ -1,57 +0,0 @@ -import java.util.HashMap; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public final class FatScope { - private final HashMap types; - private final HashMap facts; - - public FatScope(HashMap types, HashMap facts) { - this.types = types; - this.facts = facts; - } - - public FatScope() { - this(new HashMap<>(), new HashMap<>()); - } - - public HashMap types() { - return types; - } - - public HashMap facts() { - return facts; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - FatScope fatScope = (FatScope) o; - - if (types != null ? !types.equals(fatScope.types) : fatScope.types != null) { - return false; - } - return facts != null ? facts.equals(fatScope.facts) : fatScope.facts == null; - } - - @Override - public int hashCode() { - int result = types != null ? types.hashCode() : 0; - result = 31 * result + (facts != null ? facts.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "FatScope[" + - "types=" + types + ", " + - "facts=" + facts + ']'; - } - -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Fn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Fn.java.resource deleted file mode 100644 index f25fbdfc5d9e..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Fn.java.resource +++ /dev/null @@ -1,120 +0,0 @@ -import java.util.List; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.utils.Pair; - -@SdkInternalApi -public abstract class Fn extends Expr implements Into { - protected FnNode fnNode; - - public Fn(FnNode fnNode) { - this.fnNode = fnNode; - } - - /** - * Convert this fn into a condition - */ - public Condition condition() { - return new Condition.Builder().fn(this).build(); - } - - public Condition condition(String result) { - return new Condition.Builder().fn(this).result(result).build(); - } - - public abstract T acceptFnVisitor(FnVisitor visitor); - - public R accept(ExprVisitor visitor) { - return visitor.visitFn(this); - } - - /** - * Returns the name of this function, eg. {@code isSet}, {@code parseUrl} - * @return The name - */ - public String getName() { - return fnNode.getId(); - } - - /** - * @return The arguments to this function - */ - public List getArgv() { - return fnNode.getArgv(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - - Fn fn = (Fn) o; - - return fnNode != null ? fnNode.equals(fn.fnNode) : fn.fnNode == null; - } - - @Override - public int hashCode() { - return fnNode != null ? fnNode.hashCode() : 0; - } - - @Override - public String toString() { - return String.format("%s(%s)", fnNode.getId(), - fnNode.getArgv().stream().map(Expr::toString).collect(Collectors.joining(", "))); - } - - protected Expr expectOneArg() { - List argv = this.fnNode.getArgv(); - if (argv.size() == 1) { - return argv.get(0); - } else { - throw RuleError.builder() - .cause(SourceException.builder() - .message("expected 1 argument but found " + argv.size()) - .build()) - .build(); - } - } - - protected Pair expectTwoArgs() { - List argv = this.fnNode.getArgv(); - if (argv.size() == 2) { - return Pair.of(argv.get(0), argv.get(1)); - } else { - throw RuleError.builder() - .cause(SourceException.builder() - .message("expected 2 arguments but found " + argv.size()) - .build()) - .build(); - } - - } - - protected List expectVariableArgs(int expectedNumberArgs) { - List argv = this.fnNode.getArgv(); - if (argv.size() == expectedNumberArgs) { - return argv; - } else { - throw RuleError.builder() - .cause(SourceException.builder() - .message(String.format("expected %d arguments but found %d", - expectedNumberArgs, argv.size())) - .build()) - .build(); - } - - } - - @Override - public Condition into() { - return this.condition(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnNode.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnNode.java.resource deleted file mode 100644 index 776bc53a93e5..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnNode.java.resource +++ /dev/null @@ -1,136 +0,0 @@ -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -/** - * Parsed but not validated function contents containing the `fn` name and `argv` - */ -@SdkInternalApi -public final class FnNode { - private static final String ARGV = "argv"; - private static final String FN = "fn"; - - private final String fn; - private final List argv; - - private FnNode(Builder builder) { - this.fn = builder.fn; - this.argv = builder.argv; - } - - public static FnNode ofExprs(String fn, Expr... expr) { - return builder() - .fn(fn) - .argv(Arrays.stream(expr).collect(Collectors.toList())) - .build(); - } - - public Fn validate() { - switch (fn) { - case BooleanEqualsFn.ID: - return new BooleanEqualsFn(this); - case PartitionFn.ID: - return new PartitionFn(this); - case StringEqualsFn.ID: - return new StringEqualsFn(this); - case IsSet.ID: - return new IsSet(this); - case IsValidHostLabel.ID: - return new IsValidHostLabel(this); - case GetAttr.ID: - return new GetAttr(this); - case ParseArn.ID: - return new ParseArn(this); - case Not.ID: - return new Not(this); - case ParseUrl.ID: - return new ParseUrl(this); - case Substring.ID: - return new Substring(this); - case UriEncodeFn.ID: - return new UriEncodeFn(this); - case IsVirtualHostableS3Bucket.ID: - return new IsVirtualHostableS3Bucket(this); - default: - throw RuleError.builder() - .cause(SourceException.builder() - .message(String.format("`%s` is not a valid function", fn)) - .build()) - .build(); - } - } - - public String getId() { - return fn; - } - - public List getArgv() { - return argv; - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - FnNode fnNode = (FnNode) o; - - if (fn != null ? !fn.equals(fnNode.fn) : fnNode.fn != null) { - return false; - } - return argv != null ? argv.equals(fnNode.argv) : fnNode.argv == null; - } - - @Override - public int hashCode() { - int result = fn != null ? fn.hashCode() : 0; - result = 31 * result + (argv != null ? argv.hashCode() : 0); - return result; - } - - public static FnNode fromNode(JsonNode node) { - Map objNode = node.asObject(); - - return builder() - .fn(objNode.get(FN).asString()) - .argv(objNode.get(ARGV).asArray() - .stream() - .map(Expr::fromNode) - .collect(Collectors.toList())) - .build(); - } - - public static class Builder { - private String fn; - private List argv; - - public Builder() { - } - - public Builder argv(List argv) { - this.argv = argv; - return this; - } - - public Builder fn(String fn) { - this.fn = fn; - return this; - } - - public FnNode build() { - return new FnNode(this); - } - } - -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnVisitor.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnVisitor.java.resource deleted file mode 100644 index e51c9c2b0684..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/FnVisitor.java.resource +++ /dev/null @@ -1,28 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface FnVisitor { - R visitPartition(PartitionFn fn); - - R visitParseArn(ParseArn fn); - - R visitIsValidHostLabel(IsValidHostLabel fn); - - R visitBoolEquals(BooleanEqualsFn fn); - - R visitStringEquals(StringEqualsFn fn); - - R visitIsSet(IsSet fn); - - R visitNot(Not not); - - R visitGetAttr(GetAttr getAttr); - - R visitParseUrl(ParseUrl parseUrl); - - R visitSubstring(Substring substring); - - R visitUriEncode(UriEncodeFn fn); - - R visitIsVirtualHostLabelsS3Bucket(IsVirtualHostableS3Bucket fn); -} \ No newline at end of file diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/GetAttr.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/GetAttr.java.resource deleted file mode 100644 index ea775a619841..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/GetAttr.java.resource +++ /dev/null @@ -1,240 +0,0 @@ -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class GetAttr extends Fn { - public static final String ID = "getAttr"; - - public GetAttr(FnNode node) { - super(node); - } - - @Override - public Value eval(Scope scope) { - Value root = target().eval(scope); - List path; - try { - path = path(); - } catch (InnerParseError e) { - throw new RuntimeException(e); - } - for (Part part : path) { - root = part.eval(root); - } - return root; - } - - public interface Part { - - Value eval(Value container); - - final class Key implements Part { - private final Identifier key; - - public Key(Identifier key) { - this.key = key; - } - - @Override - public String toString() { - return key.asString(); - } - - public static Key of(String key) { - return new Key(Identifier.of(key)); - } - - @Override - public Value eval(Value container) { - return container.expectRecord().get(key); - } - - public Identifier key() { - return key; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj == null || obj.getClass() != this.getClass()) { - return false; - } - Key that = (Key) obj; - return Objects.equals(this.key, that.key); - } - - @Override - public int hashCode() { - return key != null ? key.hashCode() : 0; - } - } - - final class Index implements Part { - private final int index; - - public Index(int index) { - this.index = index; - } - - @Override - public Value eval(Value container) { - return container.expectArray().get(index); - } - - @Override - public String toString() { - return String.format("[%s]", index); - } - - public int index() { - return index; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj == null || obj.getClass() != this.getClass()) { - return false; - } - Index that = (Index) obj; - return this.index == that.index; - } - - @Override - public int hashCode() { - return index; - } - } - } - - - private static GetAttr fromBuilder(Builder builder) { - return new GetAttr(FnNode - .builder() - .fn("getAttr") - .argv( - Arrays.asList( - builder.target, - Literal.fromStr(String.join(".", builder.path)))) - .build()); - } - - public static Builder builder() { - return new Builder(); - } - - public Expr target() { - return expectTwoArgs().left(); - } - - public List path() throws InnerParseError { - Expr right = expectTwoArgs().right(); - if (right instanceof Literal) { - Literal path = (Literal) right; - return parse(path.expectLiteralString()); - } else { - throw SourceException.builder().message("second argument must be a string literal").build(); - } - } - - private static List parse(String path) throws InnerParseError { - String[] components = path.split("\\."); - List result = new ArrayList<>(); - for (String component : components) { - if (component.contains("[")) { - int slicePartIndex = component.indexOf("["); - String slicePart = component.substring(slicePartIndex); - if (!slicePart.endsWith("]")) { - throw new InnerParseError("Invalid path component: %s. Must end with `]`"); - } - try { - String number = slicePart.substring(1, slicePart.length() - 1); - int slice = Integer.parseInt(number); - if (slice < 0) { - throw new InnerParseError("Invalid path component: slice index must be >= 0"); - } - if (slicePartIndex > 0) { - result.add(Part.Key.of(component.substring(0, slicePartIndex))); - } - result.add(new Part.Index(slice)); - } catch (NumberFormatException ex) { - throw new InnerParseError(String.format("%s could not be parsed as a number", slicePart)); - } - } else { - result.add(Part.Key.of(component)); - } - } - if (result.isEmpty()) { - throw new InnerParseError("Invalid argument to GetAttr: path may not be empty"); - } - return result; - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitGetAttr(this); - } - - @Override - public String toString() { - StringBuilder out = new StringBuilder(); - out.append(target()); - try { - for (Part part : path()) { - out.append("."); - out.append(part); - } - } catch (InnerParseError e) { - throw new RuntimeException(e); - } - return out.toString(); - } - - @Override - public String template() { - String target = ((Ref) this.target()).getName().asString(); - StringBuilder pathPart = new StringBuilder(); - - List partList; - try { - partList = path(); - } catch (InnerParseError e) { - throw new RuntimeException(e); - } - for (int i = 0; i < partList.size(); i ++) { - if (i != 0) { - if (partList.get(i) instanceof Part.Key) { - pathPart.append("."); - } - } - pathPart.append(partList.get(i).toString()); - } - return "{" + target + "#" + pathPart + "}"; - } - - public static class Builder { - Expr target; - String path; - - public Builder target(Expr target) { - this.target = target; - return this; - } - - public Builder path(String path) { - this.path = path; - return this; - } - - public GetAttr build() { - return GetAttr.fromBuilder(this); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Identifier.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Identifier.java.resource deleted file mode 100644 index 3e4160fd8118..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Identifier.java.resource +++ /dev/null @@ -1,48 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * Identifiers for variables declared within the rule engine, e.g. from an {@code assign} statement. - */ -@SdkInternalApi -public final class Identifier { - private String name; - - public Identifier(String name) { - this.name = name; - } - - public static Identifier fromString(String name) { - return new Identifier(name); - } - - public static Identifier of(String name) { - return new Identifier(name); - } - - public String asString() { - return name; - } - - public String toString() { - return name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Identifier that = (Identifier) o; - - return name != null ? name.equals(that.name) : that.name == null; - } - - @Override - public int hashCode() { - return name != null ? name.hashCode() : 0; - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/InnerParseError.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/InnerParseError.java.resource deleted file mode 100644 index 005230e0e789..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/InnerParseError.java.resource +++ /dev/null @@ -1,10 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class InnerParseError extends RuntimeException { - private static final long serialVersionUID = -7808901449079805477L; - - public InnerParseError(String message) { - super(message); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Into.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Into.java.resource deleted file mode 100644 index 88bbae20edc8..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Into.java.resource +++ /dev/null @@ -1,6 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface Into { - T into(); -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IntoSelf.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IntoSelf.java.resource deleted file mode 100644 index f58965e81098..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IntoSelf.java.resource +++ /dev/null @@ -1,9 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface IntoSelf> extends Into { - @Override - default T into() { - return (T) this; - } -} \ No newline at end of file diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsSet.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsSet.java.resource deleted file mode 100644 index e537d4918135..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsSet.java.resource +++ /dev/null @@ -1,25 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class IsSet extends SingleArgFn { - public static final String ID = "isSet"; - - public IsSet(FnNode fnNode) { - super(fnNode); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitIsSet(this); - } - - public static IsSet ofExpr(Expr expr) { - return new IsSet(FnNode.ofExprs(ID, expr)); - } - - @Override - protected Value evalArg(Value arg) { - return Value.fromBool(!arg.isNone()); - } - -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsValidHostLabel.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsValidHostLabel.java.resource deleted file mode 100644 index 3dddcf1366fb..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsValidHostLabel.java.resource +++ /dev/null @@ -1,42 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class IsValidHostLabel extends VarargFn { - public static final String ID = "isValidHostLabel"; - - public IsValidHostLabel(FnNode fnNode) { - super(fnNode); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitIsValidHostLabel(this); - } - - public static IsValidHostLabel ofExprs(Expr expr, boolean allowDots) { - return new IsValidHostLabel(FnNode.ofExprs(ID, expr, Expr.of(allowDots))); - } - - public Expr hostLabel() { - return expectTwoArgs().left(); - } - - public Expr allowDots() { - return expectTwoArgs().right(); - } - - @Override - public Value eval(Scope scope) { - String hostLabel = expectTwoArgs().left().eval(scope).expectString(); - // TODO: use compiled Pattern - if (allowDots(scope)) { - return Value.fromBool(hostLabel.matches("[a-zA-Z\\d][a-zA-Z\\d\\-.]{0,62}")); - } else { - return Value.fromBool(hostLabel.matches("[a-zA-Z\\d][a-zA-Z\\d\\-]{0,62}")); - } - } - - private boolean allowDots(Scope scope) { - return allowDots().eval(scope).expectBool(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsVirtualHostableS3Bucket.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsVirtualHostableS3Bucket.java.resource deleted file mode 100644 index 679fc1c6b4c6..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/IsVirtualHostableS3Bucket.java.resource +++ /dev/null @@ -1,46 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class IsVirtualHostableS3Bucket extends VarargFn { - public static final String ID = "aws.isVirtualHostableS3Bucket"; - - public IsVirtualHostableS3Bucket(FnNode fnNode) { - super(fnNode); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitIsVirtualHostLabelsS3Bucket(this); - } - - public static IsVirtualHostableS3Bucket ofExprs(Expr expr, boolean allowDots) { - return new IsVirtualHostableS3Bucket(FnNode.ofExprs(ID, expr, Expr.of(allowDots))); - } - - public Expr hostLabel() { - return expectTwoArgs().left(); - } - - public Expr allowDots() { - return expectTwoArgs().right(); - } - - @Override - public Value eval(Scope scope) { - String hostLabel = expectTwoArgs().left().eval(scope).expectString(); - if (allowDots(scope)) { - // TODO: use compiled Pattern - return Value.fromBool( - hostLabel.matches("[a-z\\d][a-z\\d\\-.]{1,61}[a-z\\d]") - && !hostLabel.matches("(\\d+\\.){3}\\d+") // don't allow ip address - && !hostLabel.matches(".*[.-]{2}.*") // don't allow names like bucket-.name or bucket.-name - ); - } else { - return Value.fromBool(hostLabel.matches("[a-z\\d][a-z\\d\\-]{1,61}[a-z\\d]")); - } - } - - private boolean allowDots(Scope scope) { - return allowDots().eval(scope).expectBool(); - } -} \ No newline at end of file diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Literal.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Literal.java.resource deleted file mode 100644 index 5e191fdc1136..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Literal.java.resource +++ /dev/null @@ -1,370 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public class Literal extends Expr { - public interface Visitor { - - T visitBool(boolean b); - - T visitStr(Template value); - - T visitObject(Map members); - - T visitTuple(List members); - - T visitInt(int value); - } - - private final Lit source; - - private Literal(Lit source) { - this.source = source; - } - - public T accept(Visitor visitor) { - return this.source.accept(visitor); - } - - public String expectLiteralString() { - if (source instanceof Str) { - Str s = (Str) source; - - return s.value.expectLiteral(); - } else { - throw RuleError.builder() - .cause(SourceException.builder() - .message("Expected a literal string, got " + source) - .build()) - .build(); - } - } - - @Override - public R accept(ExprVisitor visitor) { - return visitor.visitLiteral(this); - } - - @Override - public Value eval(Scope scope) { - return source.accept(new Visitor() { - @Override - public Value visitInt(int value) { - return Value.fromInteger(value); - } - - @Override - public Value visitBool(boolean b) { - return Value.fromBool(b); - } - - @Override - public Value visitStr(Template value) { - return value.eval(scope); - } - - @Override - public Value visitObject(Map members) { - Map tpe = new HashMap<>(); - members.forEach((k, v) -> { - tpe.put(k, v.eval(scope)); - }); - return Value.fromRecord(tpe); - } - - @Override - public Value visitTuple(List members) { - List tuples = new ArrayList<>(); - for (Literal el : ((Tuple) source).members) { - tuples.add(el.eval(scope)); - } - return Value.fromArray(tuples); - } - }); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - - Literal literal = (Literal) o; - - return source != null ? source.equals(literal.source) : literal.source == null; - } - - @Override - public int hashCode() { - return source != null ? source.hashCode() : 0; - } - - public String toString() { - return source.toString(); - } - - public static Literal fromNode(JsonNode node) { - Lit lit; - if (node.isArray()) { - List array = node.asArray().stream().map(Literal::fromNode).collect(Collectors.toList()); - lit = new Tuple(array); - } else if (node.isBoolean()) { - lit = new Bool(node.asBoolean()); - } else if (node.isNull()) { - throw SdkClientException.create("null node not supported"); - } else if (node.isNumber()) { - lit = new Int(Integer.parseInt(node.asNumber())); - } else if (node.isObject()) { - Map obj = new HashMap<>(); - node.asObject().forEach((k, v) -> obj.put(Identifier.of(k), fromNode(v))); - lit = new Obj(obj); - } else if (node.isString()) { - lit = new Str(new Template(node.asString())); - } else { - throw SdkClientException.create("Unable to create literal from " + node); - } - return new Literal(lit); - } - - public static Literal fromTuple(List authSchemes) { - return new Literal(new Tuple(authSchemes)); - } - - public static Literal fromRecord(Map record) { - return new Literal(new Obj(record)); - } - - public static Literal fromStr(Template value) { - return new Literal(new Str(value)); - } - - public static Literal fromStr(String s) { - return fromStr(new Template(s)); - } - - public static Literal fromInteger(int value) { - return new Literal(new Int(value)); - } - - public static Literal fromBool(boolean value) { - return new Literal(new Bool(value)); - } - - private interface Lit { - T accept(Visitor visitor); - } - - static final class Int implements Lit { - private final Integer value; - - Int(Integer value) { - this.value = value; - } - - @Override - public T accept(Visitor visitor) { - return visitor.visitInt(value); - } - - @Override - public String toString() { - return Integer.toString(value); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Int anInt = (Int) o; - - return value != null ? value.equals(anInt.value) : anInt.value == null; - } - - @Override - public int hashCode() { - return value != null ? value.hashCode() : 0; - } - } - - static final class Tuple implements Lit { - private final List members; - - Tuple(List members) { - this.members = members; - } - - @Override - public T accept(Visitor visitor) { - return visitor.visitTuple(members); - } - - @Override - public String toString() { - return members.stream().map(Literal::toString).collect(Collectors.joining(", ", "[", "]")); - } - - public List members() { - return members; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Tuple tuple = (Tuple) o; - - return members != null ? members.equals(tuple.members) : tuple.members == null; - } - - @Override - public int hashCode() { - return members != null ? members.hashCode() : 0; - } - } - - static final class Obj implements Lit { - private final Map members; - - Obj(Map members) { - this.members = members; - } - - @Override - public T accept(Visitor visitor) { - return visitor.visitObject(members); - } - - @Override - public String toString() { - return members.toString(); - } - - public Map members() { - return members; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Obj obj = (Obj) o; - - return members != null ? members.equals(obj.members) : obj.members == null; - } - - @Override - public int hashCode() { - return members != null ? members.hashCode() : 0; - } - } - - static final class Bool implements Lit { - private final boolean value; - - Bool(boolean value) { - this.value = value; - } - - @Override - public T accept(Visitor visitor) { - return visitor.visitBool(value); - } - - @Override - public String toString() { - return Boolean.toString(value); - } - - public Boolean value() { - return value; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Bool bool = (Bool) o; - - return value == bool.value; - } - - @Override - public int hashCode() { - return value ? 1 : 0; - } - } - - - static final class Str implements Lit { - private final Template value; - - Str(Template value) { - this.value = value; - } - - @Override - public T accept(Visitor visitor) { - return visitor.visitStr(value); - } - - @Override - public String toString() { - return value.toString(); - } - - public Template value() { - return value; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Str str = (Str) o; - - return value != null ? value.equals(str.value) : str.value == null; - } - - @Override - public int hashCode() { - return value != null ? value.hashCode() : 0; - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Not.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Not.java.resource deleted file mode 100644 index 74b2f28acd77..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Not.java.resource +++ /dev/null @@ -1,33 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class Not extends SingleArgFn { - - public static final String ID = "not"; - - public Not(FnNode fnNode) { - super(fnNode); - } - - public static Not ofExpr(Expr expr) { - return new Not(FnNode.ofExprs(ID, expr)); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitNot(this); - } - - public static Not ofExprs(Expr expr) { - return new Not(FnNode.ofExprs(ID, expr)); - } - - @Override - protected Value evalArg(Value arg) { - return Value.fromBool(!arg.expectBool()); - } - - public Expr target() { - return expectOneArg(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameter.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameter.java.resource deleted file mode 100644 index 436ca3aa9851..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameter.java.resource +++ /dev/null @@ -1,341 +0,0 @@ -import java.util.Map; -import java.util.Optional; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public final class Parameter implements ToParameterReference { - public static final String TYPE = "type"; - public static final String DEPRECATED = "deprecated"; - public static final String DOCUMENTATION = "documentation"; - public static final String DEFAULT = "default"; - private static final String BUILT_IN = "builtIn"; - private static final String REQUIRED = "required"; - - private final ParameterType type; - private final Identifier name; - private final Value value; - private final String builtIn; - private final Value defaultValue; - private final Deprecated deprecated; - private final String documentation; - private final boolean required; - - public Parameter(Builder builder) { - if (builder.defaultValue != null && !builder.required) { - throw new RuntimeException("When a default value is set, the field must also be marked as required"); - } - this.type = builder.type; - this.name = builder.name; - this.builtIn = builder.builtIn; - this.value = builder.value; - this.required = builder.required; - this.deprecated = builder.deprecated; - this.documentation = builder.documentation; - this.defaultValue = builder.defaultValue; - } - - public Optional getBuiltIn() { - return Optional.ofNullable(builtIn); - } - - public Optional getDefaultValue() { - return Optional.ofNullable(defaultValue); - } - - public boolean isRequired() { - return required; - } - - public Optional getDeprecated() { - return Optional.ofNullable(deprecated); - } - - public static Parameter fromNode(String name, JsonNode node) throws RuleError { - Map objNode = node.asObject(); - - Builder b = builder(); - b.name(name); - b.type(ParameterType.fromNode(objNode.get(TYPE))); - - JsonNode builtIn = objNode.get(BUILT_IN); - if (builtIn != null) { - b.builtIn(builtIn.asString()); - } - - JsonNode documentation = objNode.get(DOCUMENTATION); - if (documentation != null) { - b.documentation(documentation.asString()); - } - - JsonNode defaultNode = objNode.get(DEFAULT); - if (defaultNode != null) { - b.defaultValue(Value.fromNode(defaultNode)); - } - - JsonNode required = objNode.get(REQUIRED); - if (required != null) { - b.required(required.asBoolean()); - } else { - b.required(false); - } - - JsonNode deprecated = objNode.get(DEPRECATED); - if (deprecated != null) { - b.deprecated(Deprecated.fromNode(deprecated)); - } - - return b.build(); - } - - public ParameterType getType() { - return type; - } - - public Identifier getName() { - return name; - } - - public boolean isBuiltIn() { - return builtIn != null; - } - - public Optional getValue() { - return Optional.ofNullable(value); - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(name).append(": ").append(type); - if (builtIn != null) { - sb.append("; builtIn(").append(builtIn).append(")"); - } - if (required) { - sb.append("; required"); - } - getDeprecated().ifPresent(dep -> sb.append("; ").append(deprecated).append("!")); - return sb.toString(); - } - - @Override - public ParameterReference toParameterReference() { - return ParameterReference.builder() - .name(getName().asString()) - .build(); - } - - public String template() { - return "{" + name + "}"; - } - - public Expr expr() { - return Expr.ref(this.name); - } - - public BooleanEqualsFn eq(boolean b) { - return BooleanEqualsFn.fromParam(this, Expr.of(b)); - } - - public BooleanEqualsFn eq(Expr e) { - return BooleanEqualsFn.fromParam(this, e); - } - - public Optional getDocumentation() { - return Optional.ofNullable(documentation); - } - - /** - * The default value for this Parameter - * @return The value. This value must match the type of this parameter. - */ - public Optional getDefault() { - return Optional.ofNullable(this.defaultValue); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Parameter parameter = (Parameter) o; - - if (required != parameter.required) { - return false; - } - if (type != parameter.type) { - return false; - } - if (name != null ? !name.equals(parameter.name) : parameter.name != null) { - return false; - } - if (value != null ? !value.equals(parameter.value) : parameter.value != null) { - return false; - } - if (builtIn != null ? !builtIn.equals(parameter.builtIn) : parameter.builtIn != null) { - return false; - } - if (defaultValue != null ? !defaultValue.equals(parameter.defaultValue) : parameter.defaultValue != null) { - return false; - } - if (deprecated != null ? !deprecated.equals(parameter.deprecated) : parameter.deprecated != null) { - return false; - } - return documentation != null ? documentation.equals(parameter.documentation) : parameter.documentation == null; - } - - @Override - public int hashCode() { - int result = type != null ? type.hashCode() : 0; - result = 31 * result + (name != null ? name.hashCode() : 0); - result = 31 * result + (value != null ? value.hashCode() : 0); - result = 31 * result + (builtIn != null ? builtIn.hashCode() : 0); - result = 31 * result + (defaultValue != null ? defaultValue.hashCode() : 0); - result = 31 * result + (required ? 1 : 0); - result = 31 * result + (deprecated != null ? deprecated.hashCode() : 0); - result = 31 * result + (documentation != null ? documentation.hashCode() : 0); - return result; - } - - public static final class Deprecated { - private static final String MESSAGE = "message"; - private static final String SINCE = "since"; - private final String message; - private final String since; - - public Deprecated(String message, String since) { - this.message = message; - this.since = since; - } - - public static Deprecated fromNode(JsonNode node) { - Map objNode = node.asObject(); - - String message = null; - String since = null; - - JsonNode messageNode = objNode.get(MESSAGE); - if (messageNode != null) { - message = messageNode.asString(); - } - - JsonNode sinceNode = objNode.get(SINCE); - if (sinceNode != null) { - since = sinceNode.asString(); - } - - return new Deprecated(message, since); - } - - public String message() { - return message; - } - - public String since() { - return since; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Deprecated that = (Deprecated) o; - - if (message != null ? !message.equals(that.message) : that.message != null) { - return false; - } - return since != null ? since.equals(that.since) : that.since == null; - } - - @Override - public int hashCode() { - int result = message != null ? message.hashCode() : 0; - result = 31 * result + (since != null ? since.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "Deprecated[" + - "message=" + message + ", " + - "since=" + since + ']'; - } - - } - - public static final class Builder { - private ParameterType type; - private Identifier name; - private String builtIn; - - private Deprecated deprecated; - - private Value value; - private boolean required; - private String documentation; - - private Value defaultValue; - - public Builder type(ParameterType type) { - this.type = type; - return this; - } - - public Builder deprecated(Deprecated deprecated) { - this.deprecated = deprecated; - return this; - } - - public Builder name(String name) { - this.name = Identifier.of(name); - return this; - } - - public Builder name(Identifier name) { - this.name = name; - return this; - } - - public Builder builtIn(String builtIn) { - this.builtIn = builtIn; - return this; - } - - public Builder value(Value value) { - this.value = value; - return this; - } - - public Builder defaultValue(Value defaultValue) { - this.defaultValue = defaultValue; - return this; - } - - public Parameter build() { - return new Parameter(this); - } - - public Builder required(boolean required) { - this.required = required; - return this; - } - - public Builder documentation(String s) { - this.documentation = s; - return this; - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterReference.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterReference.java.resource deleted file mode 100644 index d94f999fac71..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterReference.java.resource +++ /dev/null @@ -1,90 +0,0 @@ -import java.util.Objects; -import java.util.Optional; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public final class ParameterReference implements ToParameterReference { - private final String name; - private final String context; - - private ParameterReference(Builder builder) { - this.name = builder.name; - this.context = builder.context; - } - - public String getName() { - return name; - } - - public Optional getContext() { - return Optional.ofNullable(context); - } - - public static ParameterReference from(String reference) { - String[] split = reference.split("\\.", 2); - return from(split[0], split.length == 2 ? split[1] : null); - } - - public static ParameterReference from(String name, String context) { - Builder builder = builder().name(name); - if (context != null) { - builder.context(context); - } - return builder.build(); - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public ParameterReference toParameterReference() { - return this; - } - - @Override - public String toString() { - if (context == null) { - return name; - } - return name + "." + context; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ParameterReference that = (ParameterReference) o; - return getName().equals(that.getName()) && Objects.equals(getContext(), that.getContext()); - } - - @Override - public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + (context != null ? context.hashCode() : 0); - return result; - } - - public static class Builder { - private String name; - private String context; - - public Builder name(String name) { - this.name = name; - return this; - } - - public Builder context(String context) { - this.context = context; - return this; - } - - public ParameterReference build() { - return new ParameterReference(this); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterType.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterType.java.resource deleted file mode 100644 index 54a89bd124fb..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParameterType.java.resource +++ /dev/null @@ -1,40 +0,0 @@ -import java.util.Locale; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public enum ParameterType { - STRING("String"), - BOOLEAN("Boolean"), - STRING_ARRAY("StringArray"), - ; - - private final String name; - - ParameterType(String name) { - this.name = name; - } - - @Override - public String toString() { - return name; - } - - public static ParameterType fromNode(JsonNode node) { - return fromValue(node.asString()); - } - - public static ParameterType fromValue(String value) { - switch (value.toLowerCase(Locale.ENGLISH)) { - case "string": - return STRING; - case "boolean": - return BOOLEAN; - case "stringarray": - return STRING_ARRAY; - default: - throw SdkClientException.create("Unknown parameter type: " + value); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameters.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameters.java.resource deleted file mode 100644 index 0eb97572cd9b..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Parameters.java.resource +++ /dev/null @@ -1,79 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public class Parameters { - private final List parameters; - - private Parameters(Builder b) { - this.parameters = b.parameters; - } - - public List toList() { - return parameters; - } - - public Optional get(Identifier name) { - return parameters.stream().filter((param) -> param.getName().equals(name)).findFirst(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Parameters that = (Parameters) o; - - return parameters != null ? parameters.equals(that.parameters) : that.parameters == null; - } - - @Override - public int hashCode() { - return parameters != null ? parameters.hashCode() : 0; - } - - @Override - public String toString() { - return "Parameters{" + - "parameters=" + parameters + - '}'; - } - - public static Parameters fromNode(JsonNode node) { - Map paramsObj = node.asObject(); - - Builder b = builder(); - - paramsObj.forEach((name, obj) -> { - b.addParameter(Parameter.fromNode(name, obj)); - }); - - return b.build(); - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private List parameters = new ArrayList<>(); - - public Builder addParameter(Parameter parameter) { - this.parameters.add(parameter); - return this; - } - - public Parameters build() { - return new Parameters(this); - } - } - -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseArn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseArn.java.resource deleted file mode 100644 index a94ea0522b28..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseArn.java.resource +++ /dev/null @@ -1,44 +0,0 @@ -import java.util.Optional; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.utils.MapUtils; - -@SdkInternalApi -public class ParseArn extends SingleArgFn { - public static final String ID = "aws.parseArn"; - public static final Identifier PARTITION = Identifier.of("partition"); - public static final Identifier SERVICE = Identifier.of("service"); - public static final Identifier REGION = Identifier.of("region"); - public static final Identifier ACCOUNT_ID = Identifier.of("accountId"); - private static final Identifier RESOURCE_ID = Identifier.of("resourceId"); - - public ParseArn(FnNode fnNode) { - super(fnNode); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitParseArn(this); - } - - public static ParseArn ofExprs(Expr expr) { - return new ParseArn(FnNode.ofExprs(ID, expr)); - } - - @Override - protected Value evalArg(Value arg) { - String value = arg.expectString(); - Optional arnOpt = Arn.parse(value); - return arnOpt.map(arn -> - (Value) Value.fromRecord(MapUtils.of( - PARTITION, Value.fromStr(arn.partition()), - SERVICE, Value.fromStr(arn.service()), - REGION, Value.fromStr(arn.region()), - ACCOUNT_ID, Value.fromStr(arn.accountId()), - RESOURCE_ID, Value.fromArray(arn.resource().stream() - .map(v -> (Value) Value.fromStr(v)) - .collect(Collectors.toList())) - )) - ).orElse(new Value.None()); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseUrl.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseUrl.java.resource deleted file mode 100644 index 6894cefb167c..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ParseUrl.java.resource +++ /dev/null @@ -1,87 +0,0 @@ -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.utils.MapUtils; -import software.amazon.awssdk.utils.StringUtils; - -/** - * Function to parse a URI from a string. - */ -@SdkInternalApi -public class ParseUrl extends SingleArgFn { - public static final String ID = "parseURL"; - - public static final Identifier SCHEME = Identifier.of("scheme"); - public static final Identifier AUTHORITY = Identifier.of("authority"); - public static final Identifier PATH = Identifier.of("path"); - public static final Identifier NORMALIZED_PATH = Identifier.of("normalizedPath"); - public static final Identifier IS_IP = Identifier.of("isIp"); - - public ParseUrl(FnNode fnNode) { - super(fnNode); - } - - public static ParseUrl ofExprs(Expr expr) { - return new ParseUrl(FnNode.ofExprs(ID, expr)); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitParseUrl(this); - } - - @Override - protected Value evalArg(Value arg) { - String url = arg.expectString(); - try { - URL parsed = new URL(url); - String path = parsed.getPath(); - if (parsed.getQuery() != null) { - return Value.none(); - - } - boolean isIpAddr = false; - String host = parsed.getHost(); - if (host.startsWith("[") && host.endsWith("]")) { - isIpAddr = true; - } - String[] dottedParts = host.split("\\."); - if (dottedParts.length == 4) { - if (Arrays.stream(dottedParts).allMatch(part -> { - try { - int value = Integer.parseInt(part); - return value >= 0 && value <= 255; - } catch (NumberFormatException ex) { - return false; - } - })) { - isIpAddr = true; - } - } - String normalizedPath; - if (StringUtils.isBlank(path)) { - normalizedPath = "/"; - } else { - StringBuilder builder = new StringBuilder(); - if (!path.startsWith("/")) { - builder.append("/"); - } - builder.append(path); - if (!path.endsWith("/")) { - builder.append("/"); - } - normalizedPath = builder.toString(); - } - return Value.fromRecord(MapUtils.of( - SCHEME, Value.fromStr(parsed.getProtocol()), - AUTHORITY, Value.fromStr(parsed.getAuthority()), - PATH, Value.fromStr(path), - NORMALIZED_PATH, Value.fromStr(normalizedPath), - IS_IP, Value.fromBool(isIpAddr) - )); - } catch (MalformedURLException e) { - return Value.none(); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/PartitionFn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/PartitionFn.java.resource deleted file mode 100644 index eac93ca36887..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/PartitionFn.java.resource +++ /dev/null @@ -1,153 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; -import java.util.regex.Pattern; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.utils.MapUtils; - -@SdkInternalApi -public class PartitionFn extends SingleArgFn { - public static final String ID = "aws.partition"; - - public static final Identifier NAME = Identifier.of("name"); - public static final Identifier DNS_SUFFIX = Identifier.of("dnsSuffix"); - public static final Identifier DUAL_STACK_DNS_SUFFIX = Identifier.of("dualStackDnsSuffix"); - public static final Identifier SUPPORTS_FIPS = Identifier.of("supportsFIPS"); - public static final Identifier SUPPORTS_DUAL_STACK = Identifier.of("supportsDualStack"); - public static final Identifier IMPLICIT_GLOBAL_REGION = Identifier.of("implicitGlobalRegion"); - public static final Identifier INFERRED = Identifier.of("inferred"); - - private final LazyValue partitionData = LazyValue.builder() - .initializer(this::loadPartitionData) - .build(); - - private final LazyValue awsPartition = LazyValue.builder() - .initializer(this::findAwsPartition) - .build(); - - public PartitionFn(FnNode node) { - super(node); - } - - public static PartitionFn ofExprs(Expr expr) { - return new PartitionFn(FnNode.ofExprs(ID, expr)); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitPartition(this); - } - - public static PartitionFn fromParam(Parameter param) { - return PartitionFn.ofExprs(param.expr()); - } - - @Override - public Value evalArg(Value arg) { - String regionName = arg.expectString(); - - PartitionData data = partitionData.value(); - - Partition matchedPartition; - boolean inferred = false; - - // Known region - matchedPartition = data.regionMap.get(regionName); - if (matchedPartition == null) { - // try matching on region name pattern - for (Partition p : data.partitions) { - Pattern regex = Pattern.compile(p.regionRegex()); - if (regex.matcher(regionName).matches()) { - matchedPartition = p; - inferred = true; - break; - } - } - } - - // Couldn't find the region by name or pattern matching. Fallback to 'aws' partition. - if (matchedPartition == null) { - matchedPartition = awsPartition.value(); - } - - Outputs matchedOutputs = matchedPartition.outputs(); - return Value.fromRecord(MapUtils.of( - NAME, Value.fromStr(matchedPartition.id()), - DNS_SUFFIX, Value.fromStr(matchedOutputs.dnsSuffix()), - DUAL_STACK_DNS_SUFFIX, Value.fromStr(matchedOutputs.dualStackDnsSuffix()), - SUPPORTS_FIPS, Value.fromBool(matchedOutputs.supportsFips()), - SUPPORTS_DUAL_STACK, Value.fromBool(matchedOutputs.supportsDualStack()), - IMPLICIT_GLOBAL_REGION, Value.fromStr(matchedOutputs.implicitGlobalRegion()), - INFERRED, Value.fromBool(inferred))); - } - - private PartitionData loadPartitionData() { - PartitionDataProvider provider = new DefaultPartitionDataProvider(); - - // TODO: support custom partitions.json - Partitions partitions = provider.loadPartitions(); - - PartitionData partitionData = new PartitionData(); - - partitions.partitions().forEach(part -> { - partitionData.partitions.add(part); - part.regions().forEach((name, override) -> { - partitionData.regionMap.put(name, part); - }); - }); - - return partitionData; - } - - private Partition findAwsPartition() { - return partitionData.value() - .partitions - .stream() - .filter(p -> p.id().equalsIgnoreCase("aws")) - .findFirst().orElse(null); - } - - private static class PartitionData { - private final List partitions = new ArrayList<>(); - private final Map regionMap = new HashMap<>(); - } - - - private static final class LazyValue { - private final Supplier initializer; - private T value; - private boolean initialized; - - private LazyValue(Builder builder) { - this.initializer = builder.initializer; - } - - public T value() { - if (!initialized) { - value = initializer.get(); - initialized = true; - } - return value; - } - - public static Builder builder() { - return new Builder<>(); - } - - public static class Builder { - private Supplier initializer; - - public Builder initializer(Supplier initializer) { - this.initializer = initializer; - return this; - } - - public LazyValue build() { - return new LazyValue<>(this); - } - } - } - -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Ref.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Ref.java.resource deleted file mode 100644 index e2ef45422202..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Ref.java.resource +++ /dev/null @@ -1,54 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * A reference to a field. - */ -@SdkInternalApi -public class Ref extends Expr { - private final Identifier name; - - public Ref(Identifier name) { - this.name = name; - } - - @Override - public R accept(ExprVisitor visitor) { - return visitor.visitRef(this); - } - - public Identifier getName() { - return name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Ref ref = (Ref) o; - return name.equals(ref.name); - } - - @Override - public String template() { - return String.format("{%s}", name); - } - - @Override - public String toString() { - return name.asString(); - } - - @Override - public int hashCode() { - return name != null ? name.hashCode() : 0; - } - - @Override - public Value eval(Scope scope) { - return scope.getValue(this.name).orElse(new Value.None()); - } -} \ No newline at end of file diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Rule.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Rule.java.resource deleted file mode 100644 index 4253316b2d98..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Rule.java.resource +++ /dev/null @@ -1,87 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -@SdkInternalApi -public abstract class Rule { - public static final String CONDITIONS = "conditions"; - public static final String DOCUMENTATION = "documentation"; - public static final String ENDPOINT = "endpoint"; - public static final String ERROR = "error"; - - public static final String TREE = "tree"; - public static final String RULES = "rules"; - public static final String TYPE = "type"; - - protected final List conditions; - protected final String documentation; - - protected Rule(Builder builder) { - this.conditions = builder.conditions; - this.documentation = builder.documentation; - } - - public List getConditions() { - return conditions; - } - - public abstract T accept(RuleValueVisitor v); - - public static Rule fromNode(JsonNode node) { - Map objNode = node.asObject(); - - Builder builder = builder(); - - objNode.get(CONDITIONS).asArray().forEach(cn -> builder.addCondition(Condition.fromNode(cn))); - - JsonNode documentation = objNode.get(DOCUMENTATION); - if (documentation != null) { - builder.documentation(documentation.asString()); - } - - String type = objNode.get(TYPE).asString(); - switch (type) { - case ENDPOINT: return builder.endpoint(EndpointResult.fromNode(objNode.get(ENDPOINT))); - case ERROR: return builder.error(objNode.get(ERROR).asString()); - case TREE: return builder.treeRule(objNode.get(RULES).asArray() - .stream() - .map(Rule::fromNode) - .collect(Collectors.toList())); - default: throw new IllegalStateException("Unexpected rule type: " + type); - } - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private String documentation; - private final List conditions = new ArrayList<>(); - - public Builder addCondition(Condition condition) { - this.conditions.add(condition); - return this; - } - - public Builder documentation(String documentation) { - this.documentation = documentation; - return this; - } - - public EndpointRule endpoint(EndpointResult endpoint) { - return new EndpointRule(this, endpoint); - } - - public ErrorRule error(String error) { - return new ErrorRule(this, Literal.fromStr(error)); - } - - public TreeRule treeRule(List rules) { - return new TreeRule(this, rules); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RuleArn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleArn.java.resource similarity index 100% rename from codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RuleArn.java.resource rename to codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleArn.java.resource diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEngine.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEngine.java.resource deleted file mode 100644 index 20052f2d61b9..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEngine.java.resource +++ /dev/null @@ -1,18 +0,0 @@ -import java.util.Map; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface RuleEngine { - /** - * Evaluate the given {@link EndpointRuleset} using the named values in {@code args} as input into the rule set. - * - * @param ruleset The rule set to evaluate. - * @param args The arguments. - * @return The computed value. - */ - Value evaluate(EndpointRuleset ruleset, Map args); - - static RuleEngine defaultEngine() { - return new DefaultRuleEngine(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleError.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleError.java.resource deleted file mode 100644 index dda246ab3680..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleError.java.resource +++ /dev/null @@ -1,42 +0,0 @@ -import java.util.function.Supplier; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.core.exception.SdkException; - -@SdkInternalApi -public class RuleError extends SdkException { - - protected RuleError(BuilderImpl builder) { - super(builder); - } - - public static Builder builder() { - return new BuilderImpl(); - } - - public interface Builder extends SdkException.Builder { - @Override - RuleError build(); - } - - public static T ctx(String message, Supplier f) { - try { - return f.get(); - } catch (Exception e) { - throw builder().message(message).cause(e).build(); - } - } - - public static T ctx(String message, Runnable f) { - return ctx(message, () -> { - f.run(); - return null; - }); - } - - private static class BuilderImpl extends SdkException.BuilderImpl implements Builder { - @Override - public RuleError build() { - return new RuleError(this); - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEvaluator.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEvaluator.java.resource deleted file mode 100644 index 8ff203fa43ef..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleEvaluator.java.resource +++ /dev/null @@ -1,171 +0,0 @@ -import java.util.List; -import java.util.Map; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class RuleEvaluator implements FnVisitor, ExprVisitor { - private final Scope scope = new Scope<>(); - - public Value evaluateRuleset(EndpointRuleset ruleset, Map input) { - return scope.inScope( - () -> { - ruleset - .getParameters() - .toList() - .forEach( - param -> { - param.getDefault().ifPresent(value -> scope.insert(param.getName(), value)); - }); - input.forEach(scope::insert); - for (Rule rule : ruleset.getRules()) { - Value result = handleRule(rule); - if (!result.isNone()) { - return result; - } - } - throw new RuntimeException("No rules in ruleset matched"); - }); - } - - @Override - public Value visitLiteral(Literal literal) { - return literal.eval(scope); - } - - @Override - public Value visitRef(Ref ref) { - return scope - .getValue(ref.getName()) - .orElseThrow( - () -> new RuntimeException(String.format("Invalid ruleset: %s was not in scope", ref))); - } - - @Override - public Value visitFn(Fn fn) { - return fn.acceptFnVisitor(this); - } - - @Override - public Value visitPartition(PartitionFn fn) { - return fn.eval(scope); - } - - @Override - public Value visitParseArn(ParseArn fn) { - return fn.eval(scope); - } - - @Override - public Value visitIsValidHostLabel(IsValidHostLabel fn) { - return fn.eval(scope); - } - - @Override - public Value visitBoolEquals(BooleanEqualsFn fn) { - return fn.eval(scope); - } - - @Override - public Value visitStringEquals(StringEqualsFn fn) { - return fn.eval(scope); - } - - @Override - public Value visitIsSet(IsSet fn) { - return fn.eval(scope); - } - - @Override - public Value visitNot(Not not) { - return Value.fromBool(!not.target().accept(this).expectBool()); - } - - @Override - public Value visitGetAttr(GetAttr getAttr) { - return getAttr.eval(scope); - } - - @Override - public Value visitParseUrl(ParseUrl parseUrl) { - return parseUrl.eval(scope); - } - - @Override - public Value visitSubstring(Substring fn) { - return fn.eval(scope); - } - - @Override - public Value visitUriEncode(UriEncodeFn fn) { - return fn.eval(scope); - } - - @Override - public Value visitIsVirtualHostLabelsS3Bucket(IsVirtualHostableS3Bucket fn) { - return fn.eval(scope); - } - - private Value handleRule(Rule rule) { - RuleEvaluator self = this; - return scope.inScope( - () -> { - for (Condition condition : rule.getConditions()) { - Value value = evaluateCondition(condition); - if (value.isNone() || value.equals(Value.fromBool(false))) { - return Value.none(); - } - } - return rule.accept(new RuleValueVisitor() { - @Override - public Value visitTreeRule(List rules) { - for (Rule subrule : rules) { - Value result = handleRule(subrule); - if (!result.isNone()) { - return result; - } - } - throw new RuntimeException( - String.format("no rules inside of tree rule matched—invalid rules (%s)", this)); - } - - @Override - public Value visitErrorRule(Expr error) { - return error.accept(self); - } - - @Override - public Value visitEndpointRule(EndpointResult endpoint) { - return generateEndpoint(endpoint); - } - }); - }); - } - - public Value evaluateCondition(Condition condition) { - Value value = condition.getFn().accept(this); - if (!value.isNone()) { - condition.getResult().ifPresent(res -> scope.insert(res, value)); - } - return value; - } - - public Value generateEndpoint(EndpointResult endpoint) { - Value.Endpoint.Builder builder = Value.Endpoint.builder() - .url(endpoint.getUrl() - .accept(this) - .expectString()); - endpoint.getProperties() - .forEach( - (key, value) -> { - builder.property(key.toString(), value.accept(this)); - }); - endpoint - .getHeaders() - .forEach( - (name, exprs) -> { - exprs.forEach(expr -> builder.addHeader(name, expr.accept(this).expectString())); - }); - - return builder.build(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RulePartition.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RulePartition.java.resource similarity index 100% rename from codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RulePartition.java.resource rename to codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RulePartition.java.resource diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RuleResult.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleResult.java.resource similarity index 100% rename from codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RuleResult.java.resource rename to codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleResult.java.resource diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RuleUrl.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleUrl.java.resource similarity index 100% rename from codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RuleUrl.java.resource rename to codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleUrl.java.resource diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleValueVisitor.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleValueVisitor.java.resource deleted file mode 100644 index fdbd1823c9e0..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RuleValueVisitor.java.resource +++ /dev/null @@ -1,15 +0,0 @@ -import java.util.List; -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * Visitor for the right-hand side of rules (tree, error, endpoint) - * @param The return type of the visitor - */ -@SdkInternalApi -public interface RuleValueVisitor { - R visitTreeRule(List rules); - - R visitErrorRule(Expr error); - - R visitEndpointRule(EndpointResult endpoint); -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RulesFunctions.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RulesFunctions.java.resource similarity index 100% rename from codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/RulesFunctions.java.resource rename to codegen/src/main/resources/software/amazon/awssdk/codegen/rules/RulesFunctions.java.resource diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Scope.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Scope.java.resource deleted file mode 100644 index 55ce7596b1e8..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Scope.java.resource +++ /dev/null @@ -1,90 +0,0 @@ -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.HashMap; -import java.util.Optional; -import java.util.function.Supplier; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class Scope { - private final Deque> scope; - - public Scope() { - this.scope = new ArrayDeque<>(); - this.scope.push(new FatScope()); - } - - public void push() { - scope.push(new FatScope<>()); - } - - public void pop() { - scope.pop(); - } - - public void insert(String name, T value) { - this.insert(Identifier.of(name), value); - } - - public void insert(Identifier name, T value) { - this.scope.getFirst().types().put(name, value); - } - - public void insertFact(Expr name, T value) { - this.scope.getFirst().facts().put(name, value); - } - - public U inScope(Supplier func) { - this.push(); - try { - return func.get(); - } finally { - this.pop(); - } - } - - @Override - public String toString() { - HashMap toPrint = new HashMap<>(); - for (FatScope layer: scope) { - toPrint.putAll(layer.types()); - } - return toPrint.toString(); - } - - /** - * Search the fact stack for an explicitly calculated value for [expr] - *

- * Currently, this is only impacted by the `isSet` function which will record - * `T`, rather than {@code Option} for its arguments - * - * @param expr The expression to evaluate - * @return The value from the scope - */ - public Optional eval(Expr expr) { - for (FatScope layer : scope) { - if (layer.facts().containsKey(expr)) { - return Optional.of(layer.facts().get(expr)); - } - } - return Optional.empty(); - } - - public T expectValue(Identifier name) { - for (FatScope layer : scope) { - if (layer.types().containsKey(name)) { - return layer.types().get(name); - } - } - throw new InnerParseError(String.format("No field named %s", name)); - } - - public Optional getValue(Identifier name) { - for (FatScope layer : scope) { - if (layer.types().containsKey(name)) { - return Optional.of(layer.types().get(name)); - } - } - return Optional.empty(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SingleArgFn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SingleArgFn.java.resource deleted file mode 100644 index 5c65095bf654..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SingleArgFn.java.resource +++ /dev/null @@ -1,20 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public abstract class SingleArgFn extends Fn { - - public SingleArgFn(FnNode fnNode) { - super(fnNode); - } - - public Expr target() { - return expectOneArg(); - } - - @Override - public Value eval(Scope scope) { - return evalArg(expectOneArg().eval(scope)); - } - - protected abstract Value evalArg(Value arg); -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SourceException.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SourceException.java.resource deleted file mode 100644 index 01c42c05a68e..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/SourceException.java.resource +++ /dev/null @@ -1,61 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.core.exception.SdkException; - -@SdkInternalApi -public class SourceException extends SdkException { - private SourceException(Builder b) { - super(b); - } - - public static Builder builder() { - return new BuilderImpl(); - } - - interface Builder extends SdkException.Builder { - @Override - Builder cause(Throwable cause); - - @Override - Builder writableStackTrace(Boolean writableStackTrace); - - @Override - Builder message(String message); - - @Override - SourceException build(); - - @Override - Builder numAttempts(Integer numAttempts); - } - - public static class BuilderImpl extends SdkException.BuilderImpl implements Builder { - @Override - public Builder cause(Throwable cause) { - super.cause(cause); - return this; - } - - @Override - public Builder message(String message) { - super.message(message); - return this; - } - - @Override - public Builder writableStackTrace(Boolean writableStackTrace) { - super.writableStackTrace(writableStackTrace); - return this; - } - - @Override - public SourceException build() { - return new SourceException(this); - } - - @Override - public Builder numAttempts(Integer numAttempts) { - super.numAttempts(numAttempts); - return this; - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/StringEqualsFn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/StringEqualsFn.java.resource deleted file mode 100644 index 9166e78826e6..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/StringEqualsFn.java.resource +++ /dev/null @@ -1,34 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.utils.Pair; - -@SdkInternalApi -public class StringEqualsFn extends Fn { - public static final String ID = "stringEquals"; - - public StringEqualsFn(FnNode fnNode) { - super(fnNode); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitStringEquals(this); - } - - public static StringEqualsFn ofExprs(Expr expr, Expr of) { - return new StringEqualsFn(FnNode.ofExprs(ID, expr, of)); - } - - public Expr getLeft() { - return expectTwoArgs().left(); - } - - public Expr getRight() { - return expectTwoArgs().right(); - } - - @Override - public Value eval(Scope scope) { - Pair args = expectTwoArgs(); - return Value.fromBool(args.left().eval(scope).expectString().equals(args.right().eval(scope).expectString())); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Substring.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Substring.java.resource deleted file mode 100644 index 3c260388a0a8..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Substring.java.resource +++ /dev/null @@ -1,62 +0,0 @@ -import java.util.List; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class Substring extends VarargFn { - public static final String ID = "substring"; - public static final Identifier SUBSTRING = Identifier.of("substring"); - private static final int EXPECTED_NUMBER_ARGS = 4; - - public Substring(FnNode fnNode) { - super(fnNode); - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitSubstring(this); - } - - public static Substring ofExprs(Expr expr, int startIndex, int stopIndex, Boolean reverse) { - return new Substring(FnNode.ofExprs(ID, expr, Expr.of(startIndex), Expr.of(stopIndex), Expr.of(reverse))); - } - - public Expr stringToParse() { - return expectVariableArgs(EXPECTED_NUMBER_ARGS).get(0); - } - - public Expr startIndex() { - return expectVariableArgs(EXPECTED_NUMBER_ARGS).get(1); - } - - public Expr stopIndex() { - return expectVariableArgs(EXPECTED_NUMBER_ARGS).get(2); - } - - public Expr reverse() { - return expectVariableArgs(EXPECTED_NUMBER_ARGS).get(3); - } - - @Override - public Value eval(Scope scope) { - List args = expectVariableArgs(EXPECTED_NUMBER_ARGS); - String str = args.get(0).eval(scope).expectString(); - int startIndex = args.get(1).eval(scope).expectInt(); - int stopIndex = args.get(2).eval(scope).expectInt(); - boolean reverse = args.get(3).eval(scope).expectBool(); - - if (startIndex >= stopIndex || str.length() - 1 < stopIndex) { - return new Value.None(); - } - - String substr; - if (reverse) { - String reversedStr = new StringBuilder(str).reverse().toString(); - substr = new StringBuilder(reversedStr.substring(startIndex, stopIndex)).reverse().toString(); - } else { - substr = str.substring(startIndex, stopIndex); - } - - return Value.fromStr(substr); - - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Template.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Template.java.resource deleted file mode 100644 index fcf3799098d1..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Template.java.resource +++ /dev/null @@ -1,247 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * Template represents a "Template Literal". This is a literal string within the rules language. A template can contain 0 or more - * dynamic sections. The dynamic sections use getAttr short-form: - *

- * `https://{Region}.{partition#dnsSuffix}` -------- ------------ | | Dynamic getAttr short - * form - */ -@SdkInternalApi -public class Template { - private final List parts; - - Template(String template) { - this.parts = RuleError.ctx("when parsing template", () -> parseTemplate(template)); - } - - public Stream accept(TemplateVisitor visitor) { - if (isStatic()) { - return Stream.of(visitor.visitStaticTemplate(expectLiteral())); - } - if (parts.size() == 1) { - // must be dynamic because previous branch handled single-element static template - return Stream.of(visitor.visitSingleDynamicTemplate(((Dynamic) parts.get(0)).expr)); - } - Stream start = Stream.of(visitor.startMultipartTemplate()); - Stream components = parts.stream().map(part -> part.accept(visitor)); - Stream end = Stream.of(visitor.finishMultipartTemplate()); - return Stream.concat(start, Stream.concat(components, end)); - } - - public List getParts() { - return parts; - } - - public boolean isStatic() { - return this.parts.stream().allMatch(it -> it instanceof Literal); - } - - public String expectLiteral() { - assert isStatic(); - return this.parts.stream().map(Part::toString).collect(Collectors.joining()); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Template template = (Template) o; - - return parts != null ? parts.equals(template.parts) : template.parts == null; - } - - @Override - public int hashCode() { - return parts != null ? parts.hashCode() : 0; - } - - public static Template fromString(String s) { - return new Template(s); - } - - @Override - public String toString() { - return String.format("\"%s\"", this.parts.stream().map(Part::toString).collect(Collectors.joining())); - } - - public Value eval(Scope scope) { - return Value.fromStr(parts.stream().map(part -> part.eval(scope)).collect(Collectors.joining())); - } - - private List parseTemplate(String template) { - List out = new ArrayList<>(); - Optional templateStart = Optional.empty(); - int depth = 0; - int templateEnd = 0; - for (int i = 0; i < template.length(); i++) { - if (template.substring(i).startsWith("{{")) { - i++; - continue; - } - if (template.substring(i).startsWith("}}")) { - i++; - continue; - } - if (template.charAt(i) == '{') { - if (depth == 0) { - if (templateEnd != i) { - out.add(Literal.unescape(template.substring(templateEnd, i))); - } - templateStart = Optional.of(i + 1); - } - depth++; - } - if (template.charAt(i) == '}') { - depth--; - if (depth < 0) { - throw new InnerParseError("unmatched `}` in template"); - } - if (depth == 0) { - out.add(Dynamic.parse(template.substring(templateStart.get(), i))); - templateStart = Optional.empty(); - } - templateEnd = i + 1; - } - } - if (depth != 0) { - throw new InnerParseError("unmatched `{` in template"); - } - if (templateEnd < template.length()) { - out.add(Literal.unescape(template.substring(templateEnd))); - } - return out; - } - - public abstract static class Part { - abstract String eval(Scope scope); - - abstract T accept(TemplateVisitor visitor); - } - - public static class Literal extends Part { - private final String value; - - public Literal(String value) { - if (value.isEmpty()) { - throw new RuntimeException("value cannot blank"); - } - this.value = value; - } - - public static Literal unescape(String value) { - return new Literal(value.replace("{{", "{").replace("}}", "}")); - } - - public String getValue() { - return value; - } - - @Override - public String toString() { - return this.value; - } - - @Override - String eval(Scope scope) { - return this.value; - } - - @Override - T accept(TemplateVisitor visitor) { - return visitor.visitStaticElement(this.value); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - - Literal literal = (Literal) o; - - return value != null ? value.equals(literal.value) : literal.value == null; - } - - @Override - public int hashCode() { - return value != null ? value.hashCode() : 0; - } - } - - public static class Dynamic extends Part { - private final String raw; - private final Expr expr; - - private Dynamic(String raw, Expr expr) { - this.raw = raw; - this.expr = expr; - } - - @Override - public String toString() { - return String.format("{dyn %s}", this.raw); - } - - @Override - String eval(Scope scope) { - return RuleError.ctx("while evaluating " + this, () -> expr.eval(scope).expectString()); - } - - @Override - T accept(TemplateVisitor visitor) { - return visitor.visitDynamicElement(this.expr); - } - - public Expr getExpr() { - return expr; - } - - public static Dynamic parse(String value) { - return new Dynamic(value, Expr.parseShortform(value)); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - - Dynamic dynamic = (Dynamic) o; - - if (raw != null ? !raw.equals(dynamic.raw) : dynamic.raw != null) { - return false; - } - return expr != null ? expr.equals(dynamic.expr) : dynamic.expr == null; - } - - @Override - public int hashCode() { - int result = raw != null ? raw.hashCode() : 0; - result = 31 * result + (expr != null ? expr.hashCode() : 0); - return result; - } - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TemplateVisitor.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TemplateVisitor.java.resource deleted file mode 100644 index a83584414a74..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TemplateVisitor.java.resource +++ /dev/null @@ -1,55 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * For code generating from a template, use a `TemplateVisitor`. Template visitor is written to enable optimized - * behavior for static templates with no dynamic components. - * @param The return type of this visitor - */ -@SdkInternalApi -public interface TemplateVisitor { - /** - * The template contains a single static string, eg. `"https://mystaticendpoing.com"` - * @param value: The static value of the template. - * @return T - */ - T visitStaticTemplate(String value); - - /** - * The template contains a single dynamic element, eg. `{Region}`. In this case, string formatting is not required. - * The type of the value is guaranteed to be a string. - * @param value: The single expression that represents this template. - * @return T - */ - T visitSingleDynamicTemplate(Expr value); - - /** - * Visit a static element within a multipart template. This will only be called after - * {@link #startMultipartTemplate()} has been invoked. - * @param value A static element within a larger template - * @return T - */ - T visitStaticElement(String value); - - /** - * Visit a dynamic element within a multipart template. This will only be called after - * {@link #startMultipartTemplate()} has been invoked. - * @param value The dynamic template value - * @return T - */ - T visitDynamicElement(Expr value); - - /** - * Invoked prior to visiting a multipart template like `https://{Region}.{dnsSuffix}`. This function will - * be followed by invocations of {@link #visitStaticTemplate(String)} and - * {@link #visitDynamicElement(Expr)}. - * @return T - */ - T startMultipartTemplate(); - - /** - * Invoked at the conclusion of visiting a multipart template like `https://{Region}.{dnsSuffix}`. This allows - * implementations to do something like call `string.join()` or `stringbuilder.toString()`. - * @return T - */ - T finishMultipartTemplate(); -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ToParameterReference.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ToParameterReference.java.resource deleted file mode 100644 index 26049b384187..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/ToParameterReference.java.resource +++ /dev/null @@ -1,6 +0,0 @@ -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public interface ToParameterReference { - ParameterReference toParameterReference(); -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TreeRule.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TreeRule.java.resource deleted file mode 100644 index 63b6c9002825..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/TreeRule.java.resource +++ /dev/null @@ -1,26 +0,0 @@ -import java.util.List; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -public class TreeRule extends Rule { - private final List rules; - - protected TreeRule(Builder builder, List rules) { - super(builder); - this.rules = rules; - } - - @Override - public T accept(RuleValueVisitor v) { - return v.visitTreeRule(rules); - } - - @Override - public String toString() { - return "TreeRule{" + - "conditions=" + conditions + - ", documentation='" + documentation + '\'' + - ", rules=" + rules + - '}'; - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/UriEncodeFn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/UriEncodeFn.java.resource deleted file mode 100644 index cb5d4e8614ef..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/UriEncodeFn.java.resource +++ /dev/null @@ -1,34 +0,0 @@ -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.core.exception.SdkClientException; - -@SdkInternalApi -public class UriEncodeFn extends SingleArgFn { - public static final String ID = "uriEncode"; - private static final String[] ENCODED_CHARACTERS = new String[]{"+", "*", "%7E"}; - private static final String[] ENCODED_CHARACTERS_REPLACEMENTS = new String[]{"%20", "%2A", "~"}; - - public UriEncodeFn(FnNode fnNode) { - super(fnNode); - } - - @Override - protected Value evalArg(Value arg) { - String url = arg.expectString(); - try { - String encoded = URLEncoder.encode(url, "UTF-8"); - for (int i = 0; i < ENCODED_CHARACTERS.length; i++) { - encoded = encoded.replace(ENCODED_CHARACTERS[i], ENCODED_CHARACTERS_REPLACEMENTS[i]); - } - return Value.fromStr(encoded); - } catch (UnsupportedEncodingException e) { - throw SdkClientException.create("Unable to URI encode value: " + url, e); - } - } - - @Override - public T acceptFnVisitor(FnVisitor visitor) { - return visitor.visitUriEncode(this); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Value.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Value.java.resource deleted file mode 100644 index e32aa87ac5df..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/Value.java.resource +++ /dev/null @@ -1,448 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; - -/** - * Base class for the types of values computable by the {@link RuleEngine}. - */ -@SdkInternalApi -public abstract class Value { - - public boolean isNone() { - return false; - } - - public String expectString() { - throw new RuntimeException("Expected string but was: " + this); - } - - public boolean expectBool() { - throw new RuntimeException("Expected bool but was: " + this); - } - - public Record expectRecord() { - throw new RuntimeException("Expected object but was: " + this); - } - - public Endpoint expectEndpoint() { - throw new RuntimeException("Expected endpoint, found " + this); - } - - public Array expectArray() { - throw new RuntimeException("Expected array, found " + this); - } - - public int expectInt() { - throw new RuntimeException("Expected int, found " + this); - } - - public static Value fromNode(JsonNode node) { - if (node.isArray()) { - return new Array(node.asArray().stream().map(Value::fromNode).collect(Collectors.toList())); - } else if (node.isBoolean()) { - return fromBool(node.asBoolean()); - } else if (node.isNull()) { - throw SdkClientException.create("null cannot be used as a literal"); - } else if (node.isNumber()) { - return fromInteger(Integer.parseInt(node.asNumber())); - } else if (node.isObject()) { - HashMap out = new HashMap<>(); - node.asObject().forEach((k, v) -> out.put(Identifier.of(k), fromNode(v))); - return fromRecord(out); - } else if (node.isString()) { - return fromStr(node.asString()); - } - throw SdkClientException.create("Unable to create Value from " + node); - } - - public static Endpoint endpointFromNode(JsonNode source) { - return Endpoint.fromNode(source); - } - - /** - * A string value. - */ - public static class Str extends Value { - private final String value; - - private Str(String value) { - this.value = value; - } - - @Override - public String expectString() { - return value; - } - - @Override - public String toString() { - return "Str{" + - "value='" + value + '\'' + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Str str = (Str) o; - - return value != null ? value.equals(str.value) : str.value == null; - } - - @Override - public int hashCode() { - return value != null ? value.hashCode() : 0; - } - } - - /** - * An integer value. - */ - public static class Int extends Value { - private final int value; - - private Int(int value) { - this.value = value; - } - - @Override - public int expectInt() { - return value; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Int anInt = (Int) o; - - return value == anInt.value; - } - - @Override - public int hashCode() { - return value; - } - } - - /** - * A boolean value. - */ - public static class Bool extends Value { - private final boolean value; - - private Bool(boolean value) { - this.value = value; - } - - @Override - public boolean expectBool() { - return value; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Bool bool = (Bool) o; - - return value == bool.value; - } - - @Override - public int hashCode() { - return value ? 1 : 0; - } - } - - /** - * An array value. - */ - public static class Array extends Value { - private List inner; - - private Array(List inner) { - this.inner = inner; - } - - @Override - public Array expectArray() { - return this; - } - - public Value get(int idx) { - if (this.inner.size() > idx) { - return this.inner.get(idx); - } else { - return new Value.None(); - } - } - - public int size() { - return inner.size(); - } - - @Override - public String toString() { - return "Array{" + - "inner=" + inner + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Array array = (Array) o; - - return inner != null ? inner.equals(array.inner) : array.inner == null; - } - - @Override - public int hashCode() { - return inner != null ? inner.hashCode() : 0; - } - } - - /** - * A record (map) value. - */ - public static class Record extends Value { - private final Map value; - - private Record(Map value) { - this.value = value; - } - - public Value get(Identifier id) { - return value.get(id); - } - - public Map getValue() { - return value; - } - - public void forEach(BiConsumer fn) { - value.forEach(fn); - } - - @Override - public Record expectRecord() { - return this; - } - - @Override - public String toString() { - return "Record{" + - "value=" + value + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Record record = (Record) o; - - return value != null ? value.equals(record.value) : record.value == null; - } - - @Override - public int hashCode() { - return value != null ? value.hashCode() : 0; - } - } - - public static class Endpoint extends Value { - private static final String URL = "url"; - private static final String PROPERTIES = "properties"; - private static final String HEADERS = "headers"; - - private final String url; - private final Map properties; - private final Map> headers; - - private Endpoint(Builder b) { - this.url = b.url; - this.properties = b.properties; - this.headers = b.headers; - } - - public String getUrl() { - return url; - } - - public Map getProperties() { - return properties; - } - - public Map> getHeaders() { - return headers; - } - - @Override - public Endpoint expectEndpoint() { - return this; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Endpoint endpoint = (Endpoint) o; - - if (url != null ? !url.equals(endpoint.url) : endpoint.url != null) { - return false; - } - if (properties != null ? !properties.equals(endpoint.properties) : endpoint.properties != null) { - return false; - } - return headers != null ? headers.equals(endpoint.headers) : endpoint.headers == null; - } - - @Override - public int hashCode() { - int result = url != null ? url.hashCode() : 0; - result = 31 * result + (properties != null ? properties.hashCode() : 0); - result = 31 * result + (headers != null ? headers.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "Endpoint{" + - "url='" + url + '\'' + - ", properties=" + properties + - ", headers=" + headers + - '}'; - } - - public static Endpoint fromNode(JsonNode node) { - Builder b = builder(); - - Map objNode = node.asObject(); - - b.url(objNode.get(URL).asString()); - - JsonNode propertiesNode = objNode.get(PROPERTIES); - if (propertiesNode != null) { - propertiesNode.asObject() - .forEach((k, v) -> { - b.property(k, Value.fromNode(v)); - }); - } - - JsonNode headersNode = objNode.get(HEADERS); - if (headersNode != null) { - headersNode.asObject() - .forEach((k, v) -> v.asArray().forEach(e -> b.addHeader(k, e.asString()))); - } - - return b.build(); - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private String url; - private final Map properties = new HashMap<>(); - private final Map> headers = new HashMap<>(); - - public Builder url(String url) { - this.url = url; - return this; - } - - public Builder properties(Map properties) { - this.properties.clear(); - this.properties.putAll(properties); - return this; - } - - public Builder property(String name, Value value) { - this.properties.put(name, value); - return this; - } - - public Builder addHeader(String name, String value) { - List values = this.headers.computeIfAbsent(name, (k) -> new ArrayList<>()); - values.add(value); - return this; - } - - public Endpoint build() { - return new Endpoint(this); - } - } - } - - public static class None extends Value { - @Override - public boolean isNone() { - return true; - } - } - - public static Str fromStr(String value) { - return new Str(value); - } - - public static Int fromInteger(int value) { - return new Int(value); - } - - public static Bool fromBool(boolean value) { - return new Bool(value); - } - - public static Array fromArray(List value) { - return new Array(value); - } - - public static Record fromRecord(Map value) { - return new Record(value); - } - - public static None none() { - return new None(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/VarargFn.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/VarargFn.java.resource deleted file mode 100644 index e671494ea3ba..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules/VarargFn.java.resource +++ /dev/null @@ -1,16 +0,0 @@ -import java.util.List; -import software.amazon.awssdk.annotations.SdkInternalApi; - -@SdkInternalApi -abstract class VarargFn extends Fn { - - VarargFn(FnNode fnNode) { - super(fnNode); - } - - public abstract Value eval(Scope scope); - - protected List args() { - return this.fnNode.getArgv(); - } -} diff --git a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/Partitions.java.resource b/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/Partitions.java.resource deleted file mode 100644 index c53df6f93822..000000000000 --- a/codegen/src/main/resources/software/amazon/awssdk/codegen/rules2/Partitions.java.resource +++ /dev/null @@ -1,109 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; -import software.amazon.awssdk.utils.ToString; - -@SdkInternalApi -public final class Partitions { - private static final String VERSION = "version"; - private static final String PARTITIONS = "partitions"; - - private final String version; - private final List partitions; - - private Partitions(Builder builder) { - this.version = builder.version; - this.partitions = new ArrayList<>(builder.partitions); - } - - public String version() { - return version; - } - - public List partitions() { - return partitions; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Partitions that = (Partitions) o; - - if (version != null ? !version.equals(that.version) : that.version != null) { - return false; - } - return partitions != null ? partitions.equals(that.partitions) : that.partitions == null; - } - - @Override - public int hashCode() { - int result = version != null ? version.hashCode() : 0; - result = 31 * result + (partitions != null ? partitions.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return ToString.builder("Partitions") - .add("version", version) - .add("partitions", partitions) - .build(); - } - - public static Partitions fromNode(JsonNode node) { - Map objNode = node.asObject(); - - Builder b = builder(); - - JsonNode version = objNode.get(VERSION); - if (version != null) { - b.version(version.asString()); - } - - JsonNode partitions = objNode.get(PARTITIONS); - if (partitions != null) { - partitions.asArray().forEach(partNode -> b.addPartition(Partition.fromNode(partNode))); - } - - return b.build(); - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private String version; - private List partitions = new ArrayList<>(); - - public Builder version(String version) { - this.version = version; - return this; - } - - public Builder partitions(List partitions) { - this.partitions.clear(); - if (partitions != null) { - this.partitions.addAll(partitions); - } - return this; - } - - public Builder addPartition(Partition p) { - this.partitions.add(p); - return this; - } - - public Partitions build() { - return new Partitions(this); - } - } -} diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderClassSpecTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderClassSpecTest.java deleted file mode 100644 index e2f10b7fefab..000000000000 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderClassSpecTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.codegen.poet.rules; - -import static org.hamcrest.MatcherAssert.assertThat; -import static software.amazon.awssdk.codegen.poet.PoetMatchers.generatesTo; - -import org.junit.jupiter.api.Test; -import software.amazon.awssdk.codegen.poet.ClassSpec; -import software.amazon.awssdk.codegen.poet.ClientTestModels; - -public class EndpointProviderClassSpecTest { - @Test - public void endpointProviderClass() { - ClassSpec endpointProviderSpec = new EndpointProviderSpec(ClientTestModels.queryServiceModels()); - assertThat(endpointProviderSpec, generatesTo("endpoint-provider-class.java")); - } - - @Test - void knowPropertiesOverride() { - ClassSpec endpointProviderSpec = new EndpointProviderSpec(ClientTestModels.queryServiceModelsWithOverrideKnowProperties()); - assertThat(endpointProviderSpec, generatesTo("endpoint-provider-know-prop-override-class.java")); - } -} diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderCompiledRulesClassSpecTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderCompiledRulesClassSpecTest.java index abf2ed3e3e22..d98884ab58b9 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderCompiledRulesClassSpecTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointProviderCompiledRulesClassSpecTest.java @@ -21,41 +21,41 @@ import org.junit.jupiter.api.Test; import software.amazon.awssdk.codegen.poet.ClassSpec; import software.amazon.awssdk.codegen.poet.ClientTestModels; -import software.amazon.awssdk.codegen.poet.rules2.EndpointProviderSpec2; +import software.amazon.awssdk.codegen.poet.rules.EndpointProviderSpec; class EndpointProviderCompiledRulesClassSpecTest { @Test public void endpointProviderClass() { - ClassSpec endpointProviderSpec = new EndpointProviderSpec2(ClientTestModels.queryServiceModels()); + ClassSpec endpointProviderSpec = new EndpointProviderSpec(ClientTestModels.queryServiceModels()); assertThat(endpointProviderSpec, generatesTo("endpoint-provider-class.java")); } @Test void knowPropertiesOverride() { ClassSpec endpointProviderSpec = - new EndpointProviderSpec2(ClientTestModels.queryServiceModelsWithOverrideKnowProperties()); + new EndpointProviderSpec(ClientTestModels.queryServiceModelsWithOverrideKnowProperties()); assertThat(endpointProviderSpec, generatesTo("endpoint-provider-know-prop-override-class.java")); } @Test void unknownEndpointProperties() { ClassSpec endpointProviderSpec = - new EndpointProviderSpec2(ClientTestModels.queryServiceModelsWithUnknownEndpointProperties()); + new EndpointProviderSpec(ClientTestModels.queryServiceModelsWithUnknownEndpointProperties()); assertThat(endpointProviderSpec, generatesTo("endpoint-provider-unknown-property-class.java")); } @Test void endpointProviderClassWithUriCache() { ClassSpec endpointProviderSpec = - new EndpointProviderSpec2(ClientTestModels.queryServiceModelsWithUriCache()); + new EndpointProviderSpec(ClientTestModels.queryServiceModelsWithUriCache()); assertThat(endpointProviderSpec, generatesTo("endpoint-provider-uri-cache-class.java")); } @Test void endpointProviderClassWithMetricValues() { ClassSpec endpointProviderSpec = - new EndpointProviderSpec2(ClientTestModels.queryServiceModelsWithUnknownEndpointMetricValues()); + new EndpointProviderSpec(ClientTestModels.queryServiceModelsWithUnknownEndpointMetricValues()); assertThat(endpointProviderSpec, generatesTo("endpoint-provider-metric-values-class.java")); } } diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/EndpointUrlCodeEmitterTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointUrlCodeEmitterTest.java similarity index 99% rename from codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/EndpointUrlCodeEmitterTest.java rename to codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointUrlCodeEmitterTest.java index c95c81ac3416..c52eff82764f 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/EndpointUrlCodeEmitterTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointUrlCodeEmitterTest.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import static org.assertj.core.api.Assertions.assertThat; diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/ExpressionParserTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/ExpressionParserTest.java similarity index 98% rename from codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/ExpressionParserTest.java rename to codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/ExpressionParserTest.java index 18138ba69a0f..31c1834a9cd3 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/ExpressionParserTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/ExpressionParserTest.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/TokenizerTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/TokenizerTest.java similarity index 97% rename from codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/TokenizerTest.java rename to codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/TokenizerTest.java index f9d14eb3076d..61a1a620d147 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules2/TokenizerTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/TokenizerTest.java @@ -13,7 +13,7 @@ * permissions and limitations under the License. */ -package software.amazon.awssdk.codegen.poet.rules2; +package software.amazon.awssdk.codegen.poet.rules; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-class.java index ebfa49bad424..7810a21ca78e 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-class.java @@ -1,474 +1,153 @@ package software.amazon.awssdk.services.query.endpoints.internal; import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; +import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme; +import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme; import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.endpoints.Endpoint; import software.amazon.awssdk.endpoints.EndpointUrl; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.query.endpoints.QueryEndpointParams; import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider; import software.amazon.awssdk.utils.CompletableFutureUtils; -import software.amazon.awssdk.utils.Logger; -import software.amazon.awssdk.utils.MapUtils; import software.amazon.awssdk.utils.Validate; @Generated("software.amazon.awssdk:codegen") @SdkInternalApi public final class DefaultQueryEndpointProvider implements QueryEndpointProvider { - private static final Logger LOG = Logger.loggerFor(DefaultQueryEndpointProvider.class); - - private static final EndpointRuleset ENDPOINT_RULE_SET = ruleSet(); - - private final EndpointAuthSchemeStrategy endpointAuthSchemeStrategy; - - public DefaultQueryEndpointProvider() { - EndpointAuthSchemeStrategyFactory endpointAuthSchemeStrategyFactory = new DefaultEndpointAuthSchemeStrategyFactory(); - this.endpointAuthSchemeStrategy = endpointAuthSchemeStrategyFactory.endpointAuthSchemeStrategy(); - } - @Override - public CompletableFuture resolveEndpoint(QueryEndpointParams endpointParams) { - Validate.notNull(endpointParams.region(), "Parameter 'region' must not be null"); - Value res = new DefaultRuleEngine().evaluate(ENDPOINT_RULE_SET, toIdentifierValueMap(endpointParams)); + public CompletableFuture resolveEndpoint(QueryEndpointParams params) { + Validate.notNull(params.region(), "Parameter 'region' must not be null"); try { - return CompletableFuture.completedFuture(valueAsEndpointOrThrow(res)); + Region region = params.region(); + String regionId = region == null ? null : region.id(); + RuleResult result = endpointRule0(params, regionId); + if (result.canContinue()) { + throw SdkClientException.create("Rule engine did not reach an error or endpoint result"); + } + if (result.isError()) { + String errorMsg = result.error(); + if (errorMsg.contains("Invalid ARN") && errorMsg.contains(":s3:::")) { + errorMsg += ". Use the bucket name instead of simple bucket ARNs in GetBucketLocationRequest."; + } + throw SdkClientException.create(errorMsg); + } + return CompletableFuture.completedFuture(result.endpoint()); } catch (Exception error) { return CompletableFutureUtils.failedFuture(error); } } - private static Map toIdentifierValueMap(QueryEndpointParams params) { - Map paramsMap = new HashMap<>(); - if (params.region() != null) { - paramsMap.put(Identifier.of("region"), Value.fromStr(params.region().id())); - } - if (params.useDualStackEndpoint() != null) { - paramsMap.put(Identifier.of("useDualStackEndpoint"), Value.fromBool(params.useDualStackEndpoint())); - } - if (params.useFipsEndpoint() != null) { - paramsMap.put(Identifier.of("useFIPSEndpoint"), Value.fromBool(params.useFipsEndpoint())); - } - if (params.accountId() != null) { - paramsMap.put(Identifier.of("AccountId"), Value.fromStr(params.accountId())); - } - if (params.accountIdEndpointMode() != null) { - paramsMap.put(Identifier.of("AccountIdEndpointMode"), Value.fromStr(params.accountIdEndpointMode())); - } - if (params.listOfStrings() != null) { - paramsMap.put(Identifier.of("listOfStrings"), - Value.fromArray(params.listOfStrings().stream().map(Value::fromStr).collect(Collectors.toList()))); - } - if (params.defaultListOfStrings() != null) { - paramsMap.put(Identifier.of("defaultListOfStrings"), - Value.fromArray(params.defaultListOfStrings().stream().map(Value::fromStr).collect(Collectors.toList()))); - } - if (params.endpointId() != null) { - paramsMap.put(Identifier.of("endpointId"), Value.fromStr(params.endpointId())); - } - if (params.defaultTrueParam() != null) { - paramsMap.put(Identifier.of("defaultTrueParam"), Value.fromBool(params.defaultTrueParam())); - } - if (params.defaultStringParam() != null) { - paramsMap.put(Identifier.of("defaultStringParam"), Value.fromStr(params.defaultStringParam())); - } - if (params.deprecatedParam() != null) { - paramsMap.put(Identifier.of("deprecatedParam"), Value.fromStr(params.deprecatedParam())); - } - if (params.booleanContextParam() != null) { - paramsMap.put(Identifier.of("booleanContextParam"), Value.fromBool(params.booleanContextParam())); - } - if (params.stringContextParam() != null) { - paramsMap.put(Identifier.of("stringContextParam"), Value.fromStr(params.stringContextParam())); - } - if (params.operationContextParam() != null) { - paramsMap.put(Identifier.of("operationContextParam"), Value.fromStr(params.operationContextParam())); - } - if (params.customEndpointArray() != null) { - paramsMap.put(Identifier.of("CustomEndpointArray"), - Value.fromArray(params.customEndpointArray().stream().map(Value::fromStr).collect(Collectors.toList()))); - } - if (params.arnList() != null) { - paramsMap.put(Identifier.of("ArnList"), - Value.fromArray(params.arnList().stream().map(Value::fromStr).collect(Collectors.toList()))); - } - return paramsMap; + private static RuleResult endpointRule0(QueryEndpointParams params, String region) { + return endpointRule1(params, region); } - Endpoint valueAsEndpointOrThrow(Value value) { - if (value instanceof Value.Endpoint) { - Value.Endpoint endpoint = value.expectEndpoint(); - Endpoint.Builder builder = Endpoint.builder(); - builder.endpointUrl(EndpointUrl.fromString(endpoint.getUrl())); - Map> headers = endpoint.getHeaders(); - if (headers != null) { - headers.forEach((name, values) -> values.forEach(v -> builder.putHeader(name, v))); + private static RuleResult endpointRule1(QueryEndpointParams params, String region) { + RulePartition partitionResult = RulesFunctions.awsPartition(region); + if (partitionResult != null) { + RuleResult result = endpointRule2(params, partitionResult); + if (result.isResolved()) { + return result; + } + result = endpointRule6(params, region, partitionResult); + if (result.isResolved()) { + return result; } - addKnownProperties(builder, endpoint.getProperties()); - return builder.build(); - } else if (value instanceof Value.Str) { - String errorMsg = value.expectString(); - if (errorMsg.contains("Invalid ARN") && errorMsg.contains(":s3:::")) { - errorMsg += ". Use the bucket name instead of simple bucket ARNs in GetBucketLocationRequest."; + return RuleResult.error(region + " is not a valid HTTP host-label"); + if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint() + && params.arnList() != null) { + String firstArn = RulesFunctions.listAccess(params.arnList(), 0); + if (firstArn != null) { + RuleArn parsedArn = RulesFunctions.awsParseArn(firstArn); + if (parsedArn != null) { + String arnResourceId = RulesFunctions.listAccess(parsedArn.resourceId(), 0); + if (arnResourceId != null) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", arnResourceId + "." + params.endpointId() + + ".query." + partitionResult.dualStackDnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + } + } } - throw SdkClientException.create(errorMsg); - } else { - throw SdkClientException.create("Rule engine return neither an endpoint result or error value. Returned value was: " - + value); } + return RuleResult.carryOn(); } - private static Rule endpointRule_2() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")), Expr.of(true))).build() - .validate()).build()).error("FIPS endpoints not supported with multi-region endpoints"); - } - - private static Rule endpointRule_3() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))).build() - .validate())).build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://{endpointId}.query.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_4() { - return Rule.builder() - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://{endpointId}.query.{partitionResult#dnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_1() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("endpointId")))) - .build().validate()).build()) - .treeRule(Arrays.asList(endpointRule_2(), endpointRule_3(), endpointRule_4())); - } - - private static Rule endpointRule_6() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")), Expr.of(true))).build() - .validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build() - .validate())).build().validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://query-fips.{region}.{partitionResult#dnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_7() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))).build() - .validate())).build().validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://query.{region}.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*"))))), Literal - .fromRecord(MapUtils.of(Identifier.of("name"), Literal.fromStr("sigv4"), - Identifier.of("signingName"), Literal.fromStr("query"), - Identifier.of("signingRegion"), Literal.fromStr("{region}")))))).build()); - } - - private static Rule endpointRule_8() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")), Expr.of(true))).build() - .validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://query-fips.{region}.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_9() { - return Rule.builder().endpoint( - EndpointResult.builder().url(Expr.of("https://query.{region}.{partitionResult#dnsSuffix}")).build()); - } - - private static Rule endpointRule_5() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isValidHostLabel") - .argv(Arrays.asList(Expr.ref(Identifier.of("region")), Expr.of(false))).build() - .validate()).build()) - .treeRule(Arrays.asList(endpointRule_6(), endpointRule_7(), endpointRule_8(), endpointRule_9())); - } - - private static Rule endpointRule_10() { - return Rule.builder().error("{region} is not a valid HTTP host-label"); - } - - private static Rule endpointRule_11() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))).build() - .validate())).build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("ArnList")))).build() - .validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("getAttr") - .argv(Arrays.asList(Expr.ref(Identifier.of("ArnList")), Expr.of("[0]"))).build() - .validate()).result("FirstArn").build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("aws.parseArn").argv(Arrays.asList(Expr.ref(Identifier.of("FirstArn")))) - .build().validate()).result("ParsedArn").build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("getAttr") - .argv(Arrays.asList(Expr.ref(Identifier.of("ParsedArn")), Expr.of("resourceId[0]"))) - .build().validate()).result("ArnResourceId").build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://{ArnResourceId}.{endpointId}.query.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_0() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("aws.partition").argv(Arrays.asList(Expr.ref(Identifier.of("region")))) - .build().validate()).result("partitionResult").build()) - .treeRule(Arrays.asList(endpointRule_1(), endpointRule_5(), endpointRule_10(), endpointRule_11())); - } - - private static EndpointRuleset ruleSet() { - return EndpointRuleset - .builder() - .version("1.2") - .serviceId("query") - .parameters( - Parameters - .builder() - .addParameter( - Parameter.builder().name("region").type(ParameterType.fromValue("string")).required(true) - .builtIn("AWS::Region").documentation("The region to send requests to").build()) - .addParameter( - Parameter.builder().name("useDualStackEndpoint").type(ParameterType.fromValue("boolean")) - .required(false).builtIn("AWS::UseDualStack").build()) - .addParameter( - Parameter.builder().name("useFIPSEndpoint").type(ParameterType.fromValue("boolean")) - .required(false).builtIn("AWS::UseFIPS").build()) - .addParameter( - Parameter.builder().name("AccountId").type(ParameterType.fromValue("String")) - .required(false).builtIn("AWS::Auth::AccountId").build()) - .addParameter( - Parameter.builder().name("AccountIdEndpointMode").type(ParameterType.fromValue("String")) - .required(false).builtIn("AWS::Auth::AccountIdEndpointMode").build()) - .addParameter( - Parameter.builder().name("listOfStrings").type(ParameterType.fromValue("StringArray")) - .required(false).build()) - .addParameter( - Parameter - .builder() - .name("defaultListOfStrings") - .type(ParameterType.fromValue("stringarray")) - .required(false) - .defaultValue( - Value.fromArray(Arrays.asList("item1", "item2", "item3").stream() - .map(Value::fromStr).collect(Collectors.toList()))).build()) - .addParameter( - Parameter.builder().name("endpointId").type(ParameterType.fromValue("string")) - .required(false).build()) - .addParameter( - Parameter.builder().name("defaultTrueParam").type(ParameterType.fromValue("boolean")) - .required(false).documentation("A param that defauls to true") - .defaultValue(Value.fromBool(true)).build()) - .addParameter( - Parameter.builder().name("defaultStringParam").type(ParameterType.fromValue("string")) - .required(false).defaultValue(Value.fromStr("hello endpoints")).build()) - .addParameter( - Parameter.builder().name("deprecatedParam").type(ParameterType.fromValue("string")) - .required(false).deprecated(new Parameter.Deprecated("Don't use!", "2021-01-01")) - .build()) - .addParameter( - Parameter.builder().name("booleanContextParam").type(ParameterType.fromValue("boolean")) - .required(false).build()) - .addParameter( - Parameter.builder().name("stringContextParam").type(ParameterType.fromValue("string")) - .required(false).build()) - .addParameter( - Parameter.builder().name("operationContextParam").type(ParameterType.fromValue("string")) - .required(false).build()) - .addParameter( - Parameter.builder().name("CustomEndpointArray") - .type(ParameterType.fromValue("StringArray")).required(false) - .documentation("Parameter from the customization config").build()) - .addParameter( - Parameter.builder().name("ArnList").type(ParameterType.fromValue("StringArray")) - .required(false).documentation("Parameter from the customization config").build()) - .build()).addRule(endpointRule_0()).build(); + private static RuleResult endpointRule2(QueryEndpointParams params, RulePartition partitionResult) { + if (params.endpointId() != null) { + if (params.useFipsEndpoint() != null && params.useFipsEndpoint()) { + return RuleResult.error("FIPS endpoints not supported with multi-region endpoints"); + } + if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint()) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dualStackDnsSuffix(), + -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl(EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query").signingRegionSet(Arrays.asList("*")) + .build())).build()); + } + return RuleResult.carryOn(); + } + + private static RuleResult endpointRule6(QueryEndpointParams params, String region, RulePartition partitionResult) { + if (RulesFunctions.isValidHostLabel(region, false)) { + if (params.useFipsEndpoint() != null && params.useFipsEndpoint() && params.useDualStackEndpoint() == null) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl(EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + if (params.useDualStackEndpoint() != null && params.useDualStackEndpoint() && params.useFipsEndpoint() == null) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dualStackDnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build(), + SigV4AuthScheme.builder().signingName("query").signingRegion(region).build())).build()); + } + if (params.useDualStackEndpoint() != null && params.useFipsEndpoint() != null && params.useDualStackEndpoint() + && params.useFipsEndpoint()) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dualStackDnsSuffix(), -1, + "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + return RuleResult.endpoint(Endpoint.builder() + .endpointUrl(EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dnsSuffix(), -1, "")).build()); + } + return RuleResult.carryOn(); } @Override @@ -480,17 +159,4 @@ public boolean equals(Object rhs) { public int hashCode() { return getClass().hashCode(); } - - private void addKnownProperties(Endpoint.Builder builder, Map properties) { - properties.forEach((n, v) -> { - switch (n) { - case "authSchemes": - builder.putAttribute(AwsEndpointAttribute.AUTH_SCHEMES, endpointAuthSchemeStrategy.createAuthSchemes(v)); - break; - default: - LOG.debug(() -> "Ignoring unknown endpoint property: " + n); - break; - } - }); - } } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-know-prop-override-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-know-prop-override-class.java index 800cd3da6498..7810a21ca78e 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-know-prop-override-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-know-prop-override-class.java @@ -1,465 +1,153 @@ package software.amazon.awssdk.services.query.endpoints.internal; import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; +import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme; +import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme; import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.endpoints.Endpoint; import software.amazon.awssdk.endpoints.EndpointUrl; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.query.endpoints.QueryEndpointParams; import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider; import software.amazon.awssdk.utils.CompletableFutureUtils; -import software.amazon.awssdk.utils.Logger; -import software.amazon.awssdk.utils.MapUtils; import software.amazon.awssdk.utils.Validate; @Generated("software.amazon.awssdk:codegen") @SdkInternalApi public final class DefaultQueryEndpointProvider implements QueryEndpointProvider { - private static final Logger LOG = Logger.loggerFor(DefaultQueryEndpointProvider.class); - - private static final EndpointRuleset ENDPOINT_RULE_SET = ruleSet(); - - private final EndpointAuthSchemeStrategy endpointAuthSchemeStrategy; - - public DefaultQueryEndpointProvider() { - EndpointAuthSchemeStrategyFactory endpointAuthSchemeStrategyFactory = new DefaultEndpointAuthSchemeStrategyFactory(); - this.endpointAuthSchemeStrategy = endpointAuthSchemeStrategyFactory.endpointAuthSchemeStrategy(); - } - @Override - public CompletableFuture resolveEndpoint(QueryEndpointParams endpointParams) { - Validate.notNull(endpointParams.region(), "Parameter 'region' must not be null"); - Value res = new DefaultRuleEngine().evaluate(ENDPOINT_RULE_SET, toIdentifierValueMap(endpointParams)); + public CompletableFuture resolveEndpoint(QueryEndpointParams params) { + Validate.notNull(params.region(), "Parameter 'region' must not be null"); try { - return CompletableFuture.completedFuture(valueAsEndpointOrThrow(res)); + Region region = params.region(); + String regionId = region == null ? null : region.id(); + RuleResult result = endpointRule0(params, regionId); + if (result.canContinue()) { + throw SdkClientException.create("Rule engine did not reach an error or endpoint result"); + } + if (result.isError()) { + String errorMsg = result.error(); + if (errorMsg.contains("Invalid ARN") && errorMsg.contains(":s3:::")) { + errorMsg += ". Use the bucket name instead of simple bucket ARNs in GetBucketLocationRequest."; + } + throw SdkClientException.create(errorMsg); + } + return CompletableFuture.completedFuture(result.endpoint()); } catch (Exception error) { return CompletableFutureUtils.failedFuture(error); } } - private static Map toIdentifierValueMap(QueryEndpointParams params) { - Map paramsMap = new HashMap<>(); - if (params.region() != null) { - paramsMap.put(Identifier.of("region"), Value.fromStr(params.region().id())); - } - if (params.useDualStackEndpoint() != null) { - paramsMap.put(Identifier.of("useDualStackEndpoint"), Value.fromBool(params.useDualStackEndpoint())); - } - if (params.useFipsEndpoint() != null) { - paramsMap.put(Identifier.of("useFIPSEndpoint"), Value.fromBool(params.useFipsEndpoint())); - } - if (params.accountId() != null) { - paramsMap.put(Identifier.of("AccountId"), Value.fromStr(params.accountId())); - } - if (params.accountIdEndpointMode() != null) { - paramsMap.put(Identifier.of("AccountIdEndpointMode"), Value.fromStr(params.accountIdEndpointMode())); - } - if (params.listOfStrings() != null) { - paramsMap.put(Identifier.of("listOfStrings"), - Value.fromArray(params.listOfStrings().stream().map(Value::fromStr).collect(Collectors.toList()))); - } - if (params.defaultListOfStrings() != null) { - paramsMap.put(Identifier.of("defaultListOfStrings"), - Value.fromArray(params.defaultListOfStrings().stream().map(Value::fromStr).collect(Collectors.toList()))); - } - if (params.endpointId() != null) { - paramsMap.put(Identifier.of("endpointId"), Value.fromStr(params.endpointId())); - } - if (params.defaultTrueParam() != null) { - paramsMap.put(Identifier.of("defaultTrueParam"), Value.fromBool(params.defaultTrueParam())); - } - if (params.defaultStringParam() != null) { - paramsMap.put(Identifier.of("defaultStringParam"), Value.fromStr(params.defaultStringParam())); - } - if (params.deprecatedParam() != null) { - paramsMap.put(Identifier.of("deprecatedParam"), Value.fromStr(params.deprecatedParam())); - } - if (params.booleanContextParam() != null) { - paramsMap.put(Identifier.of("booleanContextParam"), Value.fromBool(params.booleanContextParam())); - } - if (params.stringContextParam() != null) { - paramsMap.put(Identifier.of("stringContextParam"), Value.fromStr(params.stringContextParam())); - } - if (params.operationContextParam() != null) { - paramsMap.put(Identifier.of("operationContextParam"), Value.fromStr(params.operationContextParam())); - } - if (params.arnList() != null) { - paramsMap.put(Identifier.of("ArnList"), - Value.fromArray(params.arnList().stream().map(Value::fromStr).collect(Collectors.toList()))); - } - return paramsMap; + private static RuleResult endpointRule0(QueryEndpointParams params, String region) { + return endpointRule1(params, region); } - Endpoint valueAsEndpointOrThrow(Value value) { - if (value instanceof Value.Endpoint) { - Value.Endpoint endpoint = value.expectEndpoint(); - Endpoint.Builder builder = Endpoint.builder(); - builder.endpointUrl(EndpointUrl.fromString(endpoint.getUrl())); - Map> headers = endpoint.getHeaders(); - if (headers != null) { - headers.forEach((name, values) -> values.forEach(v -> builder.putHeader(name, v))); + private static RuleResult endpointRule1(QueryEndpointParams params, String region) { + RulePartition partitionResult = RulesFunctions.awsPartition(region); + if (partitionResult != null) { + RuleResult result = endpointRule2(params, partitionResult); + if (result.isResolved()) { + return result; + } + result = endpointRule6(params, region, partitionResult); + if (result.isResolved()) { + return result; } - addKnownProperties(builder, endpoint.getProperties()); - return builder.build(); - } else if (value instanceof Value.Str) { - String errorMsg = value.expectString(); - if (errorMsg.contains("Invalid ARN") && errorMsg.contains(":s3:::")) { - errorMsg += ". Use the bucket name instead of simple bucket ARNs in GetBucketLocationRequest."; + return RuleResult.error(region + " is not a valid HTTP host-label"); + if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint() + && params.arnList() != null) { + String firstArn = RulesFunctions.listAccess(params.arnList(), 0); + if (firstArn != null) { + RuleArn parsedArn = RulesFunctions.awsParseArn(firstArn); + if (parsedArn != null) { + String arnResourceId = RulesFunctions.listAccess(parsedArn.resourceId(), 0); + if (arnResourceId != null) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", arnResourceId + "." + params.endpointId() + + ".query." + partitionResult.dualStackDnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + } + } } - throw SdkClientException.create(errorMsg); - } else { - throw SdkClientException.create("Rule engine return neither an endpoint result or error value. Returned value was: " - + value); } + return RuleResult.carryOn(); } - private static Rule endpointRule_2() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")), Expr.of(true))).build() - .validate()).build()).error("FIPS endpoints not supported with multi-region endpoints"); - } - - private static Rule endpointRule_3() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))).build() - .validate())).build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://{endpointId}.query.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_4() { - return Rule.builder() - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://{endpointId}.query.{partitionResult#dnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_1() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("endpointId")))) - .build().validate()).build()) - .treeRule(Arrays.asList(endpointRule_2(), endpointRule_3(), endpointRule_4())); - } - - private static Rule endpointRule_6() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")), Expr.of(true))).build() - .validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build() - .validate())).build().validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://query-fips.{region}.{partitionResult#dnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_7() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))).build() - .validate())).build().validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://query.{region}.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*"))))), Literal - .fromRecord(MapUtils.of(Identifier.of("name"), Literal.fromStr("sigv4"), - Identifier.of("signingName"), Literal.fromStr("query"), - Identifier.of("signingRegion"), Literal.fromStr("{region}")))))).build()); - } - - private static Rule endpointRule_8() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")), Expr.of(true))).build() - .validate()).build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://query-fips.{region}.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_9() { - return Rule.builder().endpoint( - EndpointResult.builder().url(Expr.of("https://query.{region}.{partitionResult#dnsSuffix}")).build()); - } - - private static Rule endpointRule_5() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isValidHostLabel") - .argv(Arrays.asList(Expr.ref(Identifier.of("region")), Expr.of(false))).build() - .validate()).build()) - .treeRule(Arrays.asList(endpointRule_6(), endpointRule_7(), endpointRule_8(), endpointRule_9())); - } - - private static Rule endpointRule_10() { - return Rule.builder().error("{region} is not a valid HTTP host-label"); - } - - private static Rule endpointRule_11() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode - .builder() - .fn("not") - .argv(Arrays.asList(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useFIPSEndpoint")))).build() - .validate())).build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")))).build().validate()) - .build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("booleanEquals") - .argv(Arrays.asList(Expr.ref(Identifier.of("useDualStackEndpoint")), Expr.of(true))) - .build().validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("isSet").argv(Arrays.asList(Expr.ref(Identifier.of("ArnList")))).build() - .validate()).build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("getAttr") - .argv(Arrays.asList(Expr.ref(Identifier.of("ArnList")), Expr.of("[0]"))).build() - .validate()).result("FirstArn").build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("aws.parseArn").argv(Arrays.asList(Expr.ref(Identifier.of("FirstArn")))) - .build().validate()).result("ParsedArn").build()) - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("getAttr") - .argv(Arrays.asList(Expr.ref(Identifier.of("ParsedArn")), Expr.of("resourceId[0]"))) - .build().validate()).result("ArnResourceId").build()) - .endpoint( - EndpointResult - .builder() - .url(Expr.of("https://{ArnResourceId}.{endpointId}.query.{partitionResult#dualStackDnsSuffix}")) - .addProperty( - Identifier.of("authSchemes"), - Literal.fromTuple(Arrays.asList(Literal.fromRecord(MapUtils.of(Identifier.of("name"), - Literal.fromStr("sigv4a"), Identifier.of("signingName"), - Literal.fromStr("query"), Identifier.of("signingRegionSet"), - Literal.fromTuple(Arrays.asList(Literal.fromStr("*")))))))).build()); - } - - private static Rule endpointRule_0() { - return Rule - .builder() - .addCondition( - Condition - .builder() - .fn(FnNode.builder().fn("aws.partition").argv(Arrays.asList(Expr.ref(Identifier.of("region")))) - .build().validate()).result("partitionResult").build()) - .treeRule(Arrays.asList(endpointRule_1(), endpointRule_5(), endpointRule_10(), endpointRule_11())); - } - - private static EndpointRuleset ruleSet() { - return EndpointRuleset - .builder() - .version("1.2") - .serviceId("query") - .parameters( - Parameters - .builder() - .addParameter( - Parameter.builder().name("region").type(ParameterType.fromValue("string")).required(true) - .builtIn("AWS::Region").documentation("The region to send requests to").build()) - .addParameter( - Parameter.builder().name("useDualStackEndpoint").type(ParameterType.fromValue("boolean")) - .required(false).builtIn("AWS::UseDualStack").build()) - .addParameter( - Parameter.builder().name("useFIPSEndpoint").type(ParameterType.fromValue("boolean")) - .required(false).builtIn("AWS::UseFIPS").build()) - .addParameter( - Parameter.builder().name("AccountId").type(ParameterType.fromValue("String")) - .required(false).builtIn("AWS::Auth::AccountId").build()) - .addParameter( - Parameter.builder().name("AccountIdEndpointMode").type(ParameterType.fromValue("String")) - .required(false).builtIn("AWS::Auth::AccountIdEndpointMode").build()) - .addParameter( - Parameter.builder().name("listOfStrings").type(ParameterType.fromValue("StringArray")) - .required(false).build()) - .addParameter( - Parameter - .builder() - .name("defaultListOfStrings") - .type(ParameterType.fromValue("stringarray")) - .required(false) - .defaultValue( - Value.fromArray(Arrays.asList("item1", "item2", "item3").stream() - .map(Value::fromStr).collect(Collectors.toList()))).build()) - .addParameter( - Parameter.builder().name("endpointId").type(ParameterType.fromValue("string")) - .required(false).build()) - .addParameter( - Parameter.builder().name("defaultTrueParam").type(ParameterType.fromValue("boolean")) - .required(false).documentation("A param that defauls to true") - .defaultValue(Value.fromBool(true)).build()) - .addParameter( - Parameter.builder().name("defaultStringParam").type(ParameterType.fromValue("string")) - .required(false).defaultValue(Value.fromStr("hello endpoints")).build()) - .addParameter( - Parameter.builder().name("deprecatedParam").type(ParameterType.fromValue("string")) - .required(false).deprecated(new Parameter.Deprecated("Don't use!", "2021-01-01")) - .build()) - .addParameter( - Parameter.builder().name("booleanContextParam").type(ParameterType.fromValue("boolean")) - .required(false).build()) - .addParameter( - Parameter.builder().name("stringContextParam").type(ParameterType.fromValue("string")) - .required(false).build()) - .addParameter( - Parameter.builder().name("operationContextParam").type(ParameterType.fromValue("string")) - .required(false).build()) - .addParameter( - Parameter.builder().name("ArnList").type(ParameterType.fromValue("StringArray")) - .required(false).documentation("Parameter from the customization config").build()) - .build()).addRule(endpointRule_0()).build(); + private static RuleResult endpointRule2(QueryEndpointParams params, RulePartition partitionResult) { + if (params.endpointId() != null) { + if (params.useFipsEndpoint() != null && params.useFipsEndpoint()) { + return RuleResult.error("FIPS endpoints not supported with multi-region endpoints"); + } + if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint()) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dualStackDnsSuffix(), + -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl(EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query").signingRegionSet(Arrays.asList("*")) + .build())).build()); + } + return RuleResult.carryOn(); + } + + private static RuleResult endpointRule6(QueryEndpointParams params, String region, RulePartition partitionResult) { + if (RulesFunctions.isValidHostLabel(region, false)) { + if (params.useFipsEndpoint() != null && params.useFipsEndpoint() && params.useDualStackEndpoint() == null) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl(EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + if (params.useDualStackEndpoint() != null && params.useDualStackEndpoint() && params.useFipsEndpoint() == null) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dualStackDnsSuffix(), -1, "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build(), + SigV4AuthScheme.builder().signingName("query").signingRegion(region).build())).build()); + } + if (params.useDualStackEndpoint() != null && params.useFipsEndpoint() != null && params.useDualStackEndpoint() + && params.useFipsEndpoint()) { + return RuleResult.endpoint(Endpoint + .builder() + .endpointUrl( + EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dualStackDnsSuffix(), -1, + "")) + .putAttribute( + AwsEndpointAttribute.AUTH_SCHEMES, + Arrays.asList(SigV4aAuthScheme.builder().signingName("query") + .signingRegionSet(Arrays.asList("*")).build())).build()); + } + return RuleResult.endpoint(Endpoint.builder() + .endpointUrl(EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dnsSuffix(), -1, "")).build()); + } + return RuleResult.carryOn(); } @Override @@ -471,17 +159,4 @@ public boolean equals(Object rhs) { public int hashCode() { return getClass().hashCode(); } - - private void addKnownProperty(EndpointAttributeProvider provider, Endpoint.Builder builder, Value value) { - builder.putAttribute(provider.attributeKey(), provider.attributeValue(value)); - } - - private void addKnownProperties(Endpoint.Builder builder, Map properties) { - List> knownProperties = software.module.test.KNOWN_PROPS; - for (EndpointAttributeProvider p : knownProperties) { - if (properties.containsKey(p.propertyName())) { - addKnownProperty(p, builder, properties.get(p.propertyName())); - } - } - } } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-metric-values-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-metric-values-class.java similarity index 100% rename from codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-metric-values-class.java rename to codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-metric-values-class.java diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-unknown-property-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-unknown-property-class.java similarity index 100% rename from codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-unknown-property-class.java rename to codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-unknown-property-class.java diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-uri-cache-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-uri-cache-class.java similarity index 100% rename from codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-uri-cache-class.java rename to codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules/endpoint-provider-uri-cache-class.java diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-class.java deleted file mode 100644 index 7810a21ca78e..000000000000 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-class.java +++ /dev/null @@ -1,162 +0,0 @@ -package software.amazon.awssdk.services.query.endpoints.internal; - -import java.util.Arrays; -import java.util.concurrent.CompletableFuture; -import software.amazon.awssdk.annotations.Generated; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.endpoints.Endpoint; -import software.amazon.awssdk.endpoints.EndpointUrl; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.query.endpoints.QueryEndpointParams; -import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider; -import software.amazon.awssdk.utils.CompletableFutureUtils; -import software.amazon.awssdk.utils.Validate; - -@Generated("software.amazon.awssdk:codegen") -@SdkInternalApi -public final class DefaultQueryEndpointProvider implements QueryEndpointProvider { - @Override - public CompletableFuture resolveEndpoint(QueryEndpointParams params) { - Validate.notNull(params.region(), "Parameter 'region' must not be null"); - try { - Region region = params.region(); - String regionId = region == null ? null : region.id(); - RuleResult result = endpointRule0(params, regionId); - if (result.canContinue()) { - throw SdkClientException.create("Rule engine did not reach an error or endpoint result"); - } - if (result.isError()) { - String errorMsg = result.error(); - if (errorMsg.contains("Invalid ARN") && errorMsg.contains(":s3:::")) { - errorMsg += ". Use the bucket name instead of simple bucket ARNs in GetBucketLocationRequest."; - } - throw SdkClientException.create(errorMsg); - } - return CompletableFuture.completedFuture(result.endpoint()); - } catch (Exception error) { - return CompletableFutureUtils.failedFuture(error); - } - } - - private static RuleResult endpointRule0(QueryEndpointParams params, String region) { - return endpointRule1(params, region); - } - - private static RuleResult endpointRule1(QueryEndpointParams params, String region) { - RulePartition partitionResult = RulesFunctions.awsPartition(region); - if (partitionResult != null) { - RuleResult result = endpointRule2(params, partitionResult); - if (result.isResolved()) { - return result; - } - result = endpointRule6(params, region, partitionResult); - if (result.isResolved()) { - return result; - } - return RuleResult.error(region + " is not a valid HTTP host-label"); - if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint() - && params.arnList() != null) { - String firstArn = RulesFunctions.listAccess(params.arnList(), 0); - if (firstArn != null) { - RuleArn parsedArn = RulesFunctions.awsParseArn(firstArn); - if (parsedArn != null) { - String arnResourceId = RulesFunctions.listAccess(parsedArn.resourceId(), 0); - if (arnResourceId != null) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", arnResourceId + "." + params.endpointId() - + ".query." + partitionResult.dualStackDnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - } - } - } - } - return RuleResult.carryOn(); - } - - private static RuleResult endpointRule2(QueryEndpointParams params, RulePartition partitionResult) { - if (params.endpointId() != null) { - if (params.useFipsEndpoint() != null && params.useFipsEndpoint()) { - return RuleResult.error("FIPS endpoints not supported with multi-region endpoints"); - } - if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint()) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dualStackDnsSuffix(), - -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl(EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query").signingRegionSet(Arrays.asList("*")) - .build())).build()); - } - return RuleResult.carryOn(); - } - - private static RuleResult endpointRule6(QueryEndpointParams params, String region, RulePartition partitionResult) { - if (RulesFunctions.isValidHostLabel(region, false)) { - if (params.useFipsEndpoint() != null && params.useFipsEndpoint() && params.useDualStackEndpoint() == null) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl(EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - if (params.useDualStackEndpoint() != null && params.useDualStackEndpoint() && params.useFipsEndpoint() == null) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dualStackDnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build(), - SigV4AuthScheme.builder().signingName("query").signingRegion(region).build())).build()); - } - if (params.useDualStackEndpoint() != null && params.useFipsEndpoint() != null && params.useDualStackEndpoint() - && params.useFipsEndpoint()) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dualStackDnsSuffix(), -1, - "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - return RuleResult.endpoint(Endpoint.builder() - .endpointUrl(EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dnsSuffix(), -1, "")).build()); - } - return RuleResult.carryOn(); - } - - @Override - public boolean equals(Object rhs) { - return rhs != null && getClass().equals(rhs.getClass()); - } - - @Override - public int hashCode() { - return getClass().hashCode(); - } -} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-know-prop-override-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-know-prop-override-class.java deleted file mode 100644 index 7810a21ca78e..000000000000 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/rules2/endpoint-provider-know-prop-override-class.java +++ /dev/null @@ -1,162 +0,0 @@ -package software.amazon.awssdk.services.query.endpoints.internal; - -import java.util.Arrays; -import java.util.concurrent.CompletableFuture; -import software.amazon.awssdk.annotations.Generated; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.endpoints.Endpoint; -import software.amazon.awssdk.endpoints.EndpointUrl; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.query.endpoints.QueryEndpointParams; -import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider; -import software.amazon.awssdk.utils.CompletableFutureUtils; -import software.amazon.awssdk.utils.Validate; - -@Generated("software.amazon.awssdk:codegen") -@SdkInternalApi -public final class DefaultQueryEndpointProvider implements QueryEndpointProvider { - @Override - public CompletableFuture resolveEndpoint(QueryEndpointParams params) { - Validate.notNull(params.region(), "Parameter 'region' must not be null"); - try { - Region region = params.region(); - String regionId = region == null ? null : region.id(); - RuleResult result = endpointRule0(params, regionId); - if (result.canContinue()) { - throw SdkClientException.create("Rule engine did not reach an error or endpoint result"); - } - if (result.isError()) { - String errorMsg = result.error(); - if (errorMsg.contains("Invalid ARN") && errorMsg.contains(":s3:::")) { - errorMsg += ". Use the bucket name instead of simple bucket ARNs in GetBucketLocationRequest."; - } - throw SdkClientException.create(errorMsg); - } - return CompletableFuture.completedFuture(result.endpoint()); - } catch (Exception error) { - return CompletableFutureUtils.failedFuture(error); - } - } - - private static RuleResult endpointRule0(QueryEndpointParams params, String region) { - return endpointRule1(params, region); - } - - private static RuleResult endpointRule1(QueryEndpointParams params, String region) { - RulePartition partitionResult = RulesFunctions.awsPartition(region); - if (partitionResult != null) { - RuleResult result = endpointRule2(params, partitionResult); - if (result.isResolved()) { - return result; - } - result = endpointRule6(params, region, partitionResult); - if (result.isResolved()) { - return result; - } - return RuleResult.error(region + " is not a valid HTTP host-label"); - if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint() - && params.arnList() != null) { - String firstArn = RulesFunctions.listAccess(params.arnList(), 0); - if (firstArn != null) { - RuleArn parsedArn = RulesFunctions.awsParseArn(firstArn); - if (parsedArn != null) { - String arnResourceId = RulesFunctions.listAccess(parsedArn.resourceId(), 0); - if (arnResourceId != null) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", arnResourceId + "." + params.endpointId() - + ".query." + partitionResult.dualStackDnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - } - } - } - } - return RuleResult.carryOn(); - } - - private static RuleResult endpointRule2(QueryEndpointParams params, RulePartition partitionResult) { - if (params.endpointId() != null) { - if (params.useFipsEndpoint() != null && params.useFipsEndpoint()) { - return RuleResult.error("FIPS endpoints not supported with multi-region endpoints"); - } - if (params.useFipsEndpoint() == null && params.useDualStackEndpoint() != null && params.useDualStackEndpoint()) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dualStackDnsSuffix(), - -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl(EndpointUrl.fromComponents("https", params.endpointId() + ".query." + partitionResult.dnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query").signingRegionSet(Arrays.asList("*")) - .build())).build()); - } - return RuleResult.carryOn(); - } - - private static RuleResult endpointRule6(QueryEndpointParams params, String region, RulePartition partitionResult) { - if (RulesFunctions.isValidHostLabel(region, false)) { - if (params.useFipsEndpoint() != null && params.useFipsEndpoint() && params.useDualStackEndpoint() == null) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl(EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - if (params.useDualStackEndpoint() != null && params.useDualStackEndpoint() && params.useFipsEndpoint() == null) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dualStackDnsSuffix(), -1, "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build(), - SigV4AuthScheme.builder().signingName("query").signingRegion(region).build())).build()); - } - if (params.useDualStackEndpoint() != null && params.useFipsEndpoint() != null && params.useDualStackEndpoint() - && params.useFipsEndpoint()) { - return RuleResult.endpoint(Endpoint - .builder() - .endpointUrl( - EndpointUrl.fromComponents("https", "query-fips." + region + "." + partitionResult.dualStackDnsSuffix(), -1, - "")) - .putAttribute( - AwsEndpointAttribute.AUTH_SCHEMES, - Arrays.asList(SigV4aAuthScheme.builder().signingName("query") - .signingRegionSet(Arrays.asList("*")).build())).build()); - } - return RuleResult.endpoint(Endpoint.builder() - .endpointUrl(EndpointUrl.fromComponents("https", "query." + region + "." + partitionResult.dnsSuffix(), -1, "")).build()); - } - return RuleResult.carryOn(); - } - - @Override - public boolean equals(Object rhs) { - return rhs != null && getClass().equals(rhs.getClass()); - } - - @Override - public int hashCode() { - return getClass().hashCode(); - } -}