From 55240ac8dc5a587e0eb9a70f59b8b1c2682e77d5 Mon Sep 17 00:00:00 2001 From: Ran Vaknin Date: Tue, 24 Sep 2024 06:56:53 +0000 Subject: [PATCH] fix(sdk-codegen): update errorType and correct imports in ProcessAwsQueryWaiters --- .../codegen/ProcessAwsQueryWaiters.java | 107 ++++++++++++++++++ ....codegen.integration.TypeScriptIntegration | 1 + 2 files changed, 108 insertions(+) create mode 100644 codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/ProcessAwsQueryWaiters.java diff --git a/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/ProcessAwsQueryWaiters.java b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/ProcessAwsQueryWaiters.java new file mode 100644 index 0000000000000..3f1108f909a3f --- /dev/null +++ b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/ProcessAwsQueryWaiters.java @@ -0,0 +1,107 @@ +/* + * Copyright 2019 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.smithy.aws.typescript.codegen; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import software.amazon.smithy.aws.traits.protocols.AwsQueryErrorTrait; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.knowledge.TopDownIndex; +import software.amazon.smithy.model.node.ObjectNode; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.traits.ErrorTrait; +import software.amazon.smithy.model.transform.ModelTransformer; +import software.amazon.smithy.typescript.codegen.TypeScriptSettings; +import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; +import software.amazon.smithy.utils.SmithyInternalApi; +import software.amazon.smithy.waiters.Acceptor; +import software.amazon.smithy.waiters.Matcher; +import software.amazon.smithy.waiters.WaitableTrait; +import software.amazon.smithy.waiters.Waiter; + + +@SmithyInternalApi +public final class ProcessAwsQueryWaiters implements TypeScriptIntegration { + + @Override + public Model preprocessModel(Model model, TypeScriptSettings settings) { + Map errorCodeToShapeId = new HashMap<>(); + + ServiceShape serviceShape = settings.getService(model); + TopDownIndex topDownIndex = TopDownIndex.of(model); + for (OperationShape operationShape : topDownIndex.getContainedOperations(serviceShape)) { + for (ShapeId errorShapeId : operationShape.getErrors()) { + Shape errorShape = model.expectShape(errorShapeId); + if (errorShape.hasTrait(ErrorTrait.class) && errorShape.hasTrait(AwsQueryErrorTrait.class)) { + AwsQueryErrorTrait awsQueryTrait = errorShape.expectTrait(AwsQueryErrorTrait.class); + errorCodeToShapeId.put(awsQueryTrait.getCode(), errorShape.getId().getName()); + } + } + } + + List modifiedShapes = new ArrayList<>(); + + for (OperationShape operationShape : topDownIndex.getContainedOperations(serviceShape)) { + OperationShape.Builder operationBuilder = operationShape.toBuilder(); + if (operationShape.hasTrait(WaitableTrait.class)) { + operationBuilder.removeTrait(WaitableTrait.ID); + WaitableTrait waiterTrait = operationShape.expectTrait(WaitableTrait.class); + WaitableTrait.Builder waitableTraitBuilder = (WaitableTrait.Builder) waiterTrait.toBuilder(); + for (Map.Entry entry : waiterTrait.getWaiters().entrySet()) { + String name = entry.getKey(); + Waiter waiter = entry.getValue(); + Waiter.Builder waiterBuilder = (Waiter.Builder) waiter.toBuilder(); + waiterBuilder.clearAcceptors(); + for (Acceptor acceptor : waiter.getAcceptors()) { + ObjectNode acceptorNode = acceptor.toNode().expectObjectNode(); + Matcher matcher = acceptor.getMatcher(); + if (matcher instanceof Matcher.ErrorTypeMember) { + ObjectNode matcherNode = matcher.toNode().expectObjectNode(); + + String errorCode = matcherNode.expectStringMember("errorType").getValue(); + if (errorCodeToShapeId.containsKey(errorCode)) { + matcherNode = matcherNode.toBuilder() + .withMember("errorType", errorCodeToShapeId.get(errorCode)) + .build(); + + acceptorNode = acceptorNode.toBuilder() + .withMember("matcher", matcherNode) + .build(); + } + } + waiterBuilder.addAcceptor(Acceptor.fromNode(acceptorNode)); + } + waitableTraitBuilder.put(name, waiterBuilder.build()); + } + operationBuilder.addTrait(waitableTraitBuilder.build()); + } + modifiedShapes.add(operationBuilder.build()); + } + + if (!modifiedShapes.isEmpty()) { + ModelTransformer transformer = ModelTransformer.create(); + model = transformer.replaceShapes(model, modifiedShapes); + } + + return model; + } +} diff --git a/codegen/smithy-aws-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration b/codegen/smithy-aws-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration index 9eca961da6ebd..bbd08fcd1b318 100644 --- a/codegen/smithy-aws-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration +++ b/codegen/smithy-aws-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration @@ -27,6 +27,7 @@ software.amazon.smithy.aws.typescript.codegen.AddDocumentClientPlugin software.amazon.smithy.aws.typescript.codegen.AddEndpointDiscoveryPlugin software.amazon.smithy.aws.typescript.codegen.AddHttpChecksumDependency software.amazon.smithy.aws.typescript.codegen.AddSigv4aPlugin +software.amazon.smithy.aws.typescript.codegen.ProcessAwsQueryWaiters software.amazon.smithy.aws.typescript.codegen.auth.http.integration.AwsSdkCustomizeHttpBearerTokenAuth software.amazon.smithy.aws.typescript.codegen.auth.http.integration.SupportSigV4Auth software.amazon.smithy.aws.typescript.codegen.auth.http.integration.AwsSdkCustomizeSigV4Auth