Skip to content

Commit 8e64ac3

Browse files
committed
fix(client-s3-control): codegen remove host prefix behavior
1 parent 1106124 commit 8e64ac3

File tree

2 files changed

+33
-26
lines changed

2 files changed

+33
-26
lines changed

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3Config.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import static software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention.HAS_CONFIG;
2020
import static software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention.HAS_MIDDLEWARE;
2121

22-
import java.util.ArrayList;
2322
import java.util.Collections;
2423
import java.util.HashSet;
2524
import java.util.List;
@@ -44,9 +43,12 @@
4443
import software.amazon.smithy.model.shapes.TimestampShape;
4544
import software.amazon.smithy.model.traits.DeprecatedTrait;
4645
import software.amazon.smithy.model.traits.DocumentationTrait;
46+
import software.amazon.smithy.model.traits.EndpointTrait;
4747
import software.amazon.smithy.model.traits.HttpHeaderTrait;
4848
import software.amazon.smithy.model.traits.HttpPayloadTrait;
4949
import software.amazon.smithy.model.traits.StreamingTrait;
50+
import software.amazon.smithy.model.transform.ModelTransformer;
51+
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
5052
import software.amazon.smithy.typescript.codegen.LanguageTarget;
5153
import software.amazon.smithy.typescript.codegen.TypeScriptDependency;
5254
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
@@ -81,22 +83,16 @@ public final class AddS3Config implements TypeScriptIntegration {
8183
+ "For more information, please go to https://github.com/aws/aws-sdk-js-v3#known-issues</p>";
8284

8385
/**
84-
* This removes the host prefix from the endpoint traits of the model.
85-
*
86-
*/
87-
public static Model removeHostPrefixTrait(Model model, TypeScriptSettings settings) {
88-
boolean checkEndPointRuleSet = model.hasTrait(EndpointRuleSetTrait.class)
89-
Set<Shape> shapesWithTraits = model.getShapesWithTrait(EndpointTrait.class);
90-
Model.Builder mb = model.toBuilder();
91-
for(Shape shape: shapesWithTraits) {
92-
OperationShape.Builder ob = OperationShape.shapeToBuilder(shape.asOperationShape().get());
93-
ob.removeTrait(EndpointTrait.ID);
94-
OperationShape operation = ob.build();
95-
mb.removeShape(operation.getId());
96-
mb.addShape(operation);
97-
}
98-
return mb.build();
99-
86+
* Remove the hostPrefix functionality by removing the endpoint traits.
87+
* Only applied if endpointRuleSet trait present on S3/S3Control services.
88+
*/
89+
public static Shape removeHostPrefixTrait(Shape shape) {
90+
return shape.asOperationShape()
91+
.map(OperationShape::shapeToBuilder)
92+
.map(builder -> ((OperationShape.Builder) builder).removeTrait(EndpointTrait.ID))
93+
.map(OperationShape.Builder::build)
94+
.map(s -> (Shape) s)
95+
.orElse(shape);
10096
}
10197

10298
@Override
@@ -114,9 +110,9 @@ public Model preprocessModel(Model model, TypeScriptSettings settings) {
114110
if (!isS3(serviceShape)) {
115111
return model;
116112
}
117-
removeHostPrefixTrait(model, settings);
118113

119114
Model.Builder modelBuilder = model.toBuilder();
115+
boolean hasRuleset = !model.getServiceShapesWithTrait(EndpointRuleSetTrait.class).isEmpty();
120116

121117
TopDownIndex topDownIndex = TopDownIndex.of(model);
122118
Set<StructureShape> inputShapes = new HashSet<>();
@@ -227,7 +223,13 @@ public Model preprocessModel(Model model, TypeScriptSettings settings) {
227223
}
228224
}
229225

230-
return modelBuilder.addShapes(inputShapes).build();
226+
Model builtModel = modelBuilder.addShapes(inputShapes).build();
227+
if (hasRuleset) {
228+
ModelTransformer.create().mapShapes(
229+
builtModel, AddS3Config::removeHostPrefixTrait
230+
);
231+
}
232+
return builtModel;
231233
}
232234

233235
@Override

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3ControlDependency.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Map;
2424
import java.util.Optional;
2525
import java.util.function.Consumer;
26+
import java.util.function.Function;
2627
import software.amazon.smithy.aws.traits.ServiceTrait;
2728
import software.amazon.smithy.codegen.core.SymbolProvider;
2829
import software.amazon.smithy.model.Model;
@@ -32,6 +33,7 @@
3233
import software.amazon.smithy.model.shapes.Shape;
3334
import software.amazon.smithy.model.traits.RequiredTrait;
3435
import software.amazon.smithy.model.transform.ModelTransformer;
36+
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
3537
import software.amazon.smithy.typescript.codegen.LanguageTarget;
3638
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
3739
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
@@ -90,16 +92,19 @@ public Model preprocessModel(Model model, TypeScriptSettings settings) {
9092
if (!isS3Control(settings.getService(model))) {
9193
return model;
9294
}
93-
model = AddS3Config.removeHostPrefixTrait(model, settings);
95+
boolean hasRuleset = !model.getServiceShapesWithTrait(EndpointRuleSetTrait.class).isEmpty();
9496
ServiceShape serviceShape = model.expectShape(settings.getService(), ServiceShape.class);
95-
return ModelTransformer.create().mapShapes(model, shape -> {
97+
Function<Shape, Shape> removeRequired = shape -> {
9698
Optional<MemberShape> modified = shape.asMemberShape()
97-
.filter(memberShape -> memberShape.getTarget().getName(serviceShape).equals("AccountId"))
98-
.filter(memberShape -> model.expectShape(memberShape.getTarget()).isStringShape())
99-
.filter(memberShape -> memberShape.isRequired())
100-
.map(memberShape -> Shape.shapeToBuilder(memberShape).removeTrait(RequiredTrait.ID).build());
99+
.filter(memberShape -> memberShape.getTarget().getName(serviceShape).equals("AccountId"))
100+
.filter(memberShape -> model.expectShape(memberShape.getTarget()).isStringShape())
101+
.filter(MemberShape::isRequired)
102+
.map(memberShape -> Shape.shapeToBuilder(memberShape).removeTrait(RequiredTrait.ID).build());
101103
return modified.isPresent() ? modified.get() : shape;
102-
});
104+
};
105+
return ModelTransformer.create().mapShapes(
106+
model, hasRuleset ? removeRequired.andThen(AddS3Config::removeHostPrefixTrait) : removeRequired
107+
);
103108
}
104109

105110
@Override

0 commit comments

Comments
 (0)