Skip to content

Commit 5744e9b

Browse files
joewyzmtdowling
authored andcommitted
Add bdd codegen for endpointruleset trait
1 parent ad28652 commit 5744e9b

File tree

6 files changed

+103
-37
lines changed

6 files changed

+103
-37
lines changed

codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/BddTest.java

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@
1212
import java.util.List;
1313
import java.util.Map;
1414
import org.junit.jupiter.api.Test;
15-
import smithy.java.codegen.server.bddTest.client.BddServiceClient;
15+
import smithy.java.codegen.server.bddTest.client.ServiceWithEndpointBddClient;
16+
import smithy.java.codegen.server.bddTest.client.ServiceWithEndpointRuleSetClient;
1617
import software.amazon.smithy.java.aws.client.restjson.RestJsonClientProtocol;
17-
import software.amazon.smithy.java.client.core.endpoint.Endpoint;
18-
import software.amazon.smithy.java.client.core.endpoint.EndpointResolver;
1918
import software.amazon.smithy.java.client.core.endpoint.EndpointResolverParams;
2019
import software.amazon.smithy.java.client.rulesengine.EndpointRulesPlugin;
2120
import software.amazon.smithy.java.context.Context;
@@ -31,24 +30,38 @@
3130

3231
public class BddTest {
3332
@Test
34-
public void testBddEndpointResolution() {
35-
BddServiceClient client = BddServiceClient.builder()
33+
public void testServiceWithEndpointBddResolution() {
34+
var client = ServiceWithEndpointBddClient.builder()
3635
.protocol(new RestJsonClientProtocol(PreludeSchemas.DOCUMENT.id()))
3736
.build();
3837

39-
EndpointResolver resolver = client.config().endpointResolver();
38+
var resolver = client.config().endpointResolver();
4039

41-
EndpointResolverParams params1 = createParams("us-east-1", false);
42-
Endpoint endpoint1 = resolver.resolveEndpoint(params1);
40+
var params1 = createParams("us-east-1", false);
41+
var endpoint1 = resolver.resolveEndpoint(params1);
4342
assertNotNull(endpoint1);
4443
assertEquals("https://service.us-east-1.amazonaws.com", endpoint1.uri().toString());
4544

46-
EndpointResolverParams params2 = createParams("us-east-2", true);
47-
Endpoint endpoint2 = resolver.resolveEndpoint(params2);
45+
var params2 = createParams("us-east-2", true);
46+
var endpoint2 = resolver.resolveEndpoint(params2);
4847
assertNotNull(endpoint2);
4948
assertEquals("https://service-fips.us-east-2.amazonaws.com", endpoint2.uri().toString());
5049
}
5150

51+
@Test
52+
public void testEndpointRuleSetResolution() {
53+
var client = ServiceWithEndpointRuleSetClient.builder()
54+
.protocol(new RestJsonClientProtocol(PreludeSchemas.DOCUMENT.id()))
55+
.build();
56+
57+
var resolver = client.config().endpointResolver();
58+
59+
var params = createParams("us-east-1", false);
60+
var endpoint = resolver.resolveEndpoint(params);
61+
assertNotNull(endpoint);
62+
assertEquals("https://us-east-1.amazonaws.com", endpoint.uri().toString());
63+
}
64+
5265
private EndpointResolverParams createParams(String Region, Boolean UseFips) {
5366
Map<String, Object> endpointParams = new HashMap<>();
5467
if (Region != null) {

codegen/plugins/client-codegen/src/it/resources/META-INF/smithy/bdd-test.smithy

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace smithy.java.codegen.server.test
55
use aws.protocols#restJson1
66
use smithy.rules#clientContextParams
77
use smithy.rules#endpointBdd
8+
use smithy.rules#endpointRuleSet
89

910
@clientContextParams(
1011
Region: {type: "string", documentation: "docs"}
@@ -61,9 +62,36 @@ use smithy.rules#endpointBdd
6162
"nodes": "/////wAAAAH/////AAAAAAX14QEF9eEC"
6263
})
6364
@restJson1
64-
service BddService {
65+
service ServiceWithEndpointBdd {
6566
version: "2022-01-01"
6667
operations:[
6768
Echo
6869
]
6970
}
71+
72+
@clientContextParams(
73+
Region: {type: "string", documentation: "docs"}
74+
)
75+
@endpointRuleSet({
76+
"version": "1.1",
77+
"parameters": {
78+
"Region": {
79+
"required": true,
80+
"type": "String",
81+
"documentation": "docs"
82+
}
83+
},
84+
"rules": [
85+
{
86+
"conditions": [],
87+
"documentation": "base rule",
88+
"endpoint": {
89+
"url": "https://{Region}.amazonaws.com",
90+
"properties": {},
91+
"headers": {}
92+
},
93+
"type": "endpoint"
94+
}
95+
]
96+
})
97+
service ServiceWithEndpointRuleSet {}

codegen/plugins/client-codegen/src/main/java/software/amazon/smithy/java/codegen/client/DirectedJavaClientCodegen.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import software.amazon.smithy.java.codegen.CodeGenerationContext;
1111
import software.amazon.smithy.java.codegen.JavaCodegenIntegration;
1212
import software.amazon.smithy.java.codegen.JavaCodegenSettings;
13-
import software.amazon.smithy.java.codegen.client.generators.BddInfoGenerator;
13+
import software.amazon.smithy.java.codegen.client.generators.BddFileGenerator;
1414
import software.amazon.smithy.java.codegen.client.generators.ClientImplementationGenerator;
1515
import software.amazon.smithy.java.codegen.client.generators.ClientInterfaceGenerator;
1616
import software.amazon.smithy.java.codegen.generators.ApiServiceGenerator;
@@ -26,6 +26,7 @@
2626
import software.amazon.smithy.java.codegen.generators.StructureGenerator;
2727
import software.amazon.smithy.java.codegen.generators.UnionGenerator;
2828
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
29+
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
2930
import software.amazon.smithy.utils.SmithyUnstableApi;
3031

3132
@SmithyUnstableApi
@@ -118,8 +119,9 @@ public void generateService(GenerateServiceDirective<CodeGenerationContext, Java
118119
new ServiceExceptionGenerator<>().accept(directive);
119120
}
120121

121-
if (directive.service().hasTrait(EndpointBddTrait.ID)) {
122-
new BddInfoGenerator().accept(directive);
122+
var service = directive.service();
123+
if (service.hasTrait(EndpointBddTrait.ID) || service.hasTrait(EndpointRuleSetTrait.ID)) {
124+
new BddFileGenerator().accept(directive);
123125
}
124126
}
125127

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,50 @@
55

66
package software.amazon.smithy.java.codegen.client.generators;
77

8+
import static java.lang.String.format;
9+
810
import java.io.IOException;
911
import java.nio.file.Files;
1012
import java.util.function.Consumer;
1113
import software.amazon.smithy.codegen.core.directed.GenerateServiceDirective;
14+
import software.amazon.smithy.java.client.rulesengine.Bytecode;
1215
import software.amazon.smithy.java.client.rulesengine.RulesEngineBuilder;
1316
import software.amazon.smithy.java.codegen.CodeGenerationContext;
1417
import software.amazon.smithy.java.codegen.JavaCodegenSettings;
18+
import software.amazon.smithy.model.shapes.ServiceShape;
19+
import software.amazon.smithy.rulesengine.logic.cfg.Cfg;
1520
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
21+
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
1622

17-
public class BddInfoGenerator
23+
public class BddFileGenerator
1824
implements Consumer<GenerateServiceDirective<CodeGenerationContext, JavaCodegenSettings>> {
1925
@Override
2026
public void accept(GenerateServiceDirective<CodeGenerationContext, JavaCodegenSettings> directive) {
2127
try {
2228
var baseDir = directive.fileManifest().getBaseDir();
23-
var fileDir = baseDir.resolve("resources/META-INF/endpoints/bdd-info.bin");
29+
var serviceName = directive.service().toShapeId().getName();
30+
var fileDir = baseDir.resolve(format("resources/META-INF/endpoints/%s.bdd", serviceName));
2431
var parentDir = fileDir.getParent();
2532
if (parentDir != null) {
2633
Files.createDirectories(parentDir);
2734
}
28-
var engineBuilder = new RulesEngineBuilder();
29-
var bddTrait = directive.service().expectTrait(EndpointBddTrait.class);
30-
var bytecode = engineBuilder.compile(bddTrait);
35+
var bytecode = compileBytecode(directive.service());
3136
Files.write(fileDir, bytecode.getBytecode());
3237
} catch (IOException e) {
3338
throw new RuntimeException("Failed to write BDD bytecode binary file", e);
3439
}
3540
}
41+
42+
private Bytecode compileBytecode(ServiceShape serviceShape) {
43+
EndpointBddTrait bddTrait;
44+
if (serviceShape.hasTrait(EndpointBddTrait.ID)) {
45+
bddTrait = serviceShape.expectTrait(EndpointBddTrait.class);
46+
} else {
47+
var endpointRuleSet = serviceShape.expectTrait(EndpointRuleSetTrait.class).getEndpointRuleSet();
48+
var cfg = Cfg.from(endpointRuleSet);
49+
bddTrait = EndpointBddTrait.from(cfg);
50+
}
51+
var engineBuilder = new RulesEngineBuilder();
52+
return engineBuilder.compile(bddTrait);
53+
}
3654
}

codegen/plugins/client-codegen/src/main/java/software/amazon/smithy/java/codegen/client/generators/ClientInterfaceGenerator.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import software.amazon.smithy.model.traits.PaginatedTrait;
6161
import software.amazon.smithy.model.traits.Trait;
6262
import software.amazon.smithy.rulesengine.traits.EndpointBddTrait;
63+
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
6364
import software.amazon.smithy.utils.SmithyInternalApi;
6465
import software.amazon.smithy.utils.StringUtils;
6566

@@ -180,8 +181,11 @@ final class RequestOverrideBuilder extends ${requestOverride:T}.OverrideBuilder<
180181
writer.putContext("interface", symbol);
181182
writer.putContext("impl", symbol.expectProperty(ClientSymbolProperties.CLIENT_IMPL));
182183
writer.putContext("hasDefaultTransport", settings.transport() != null);
183-
writer.putContext("hasBdd", directive.service().hasTrait(EndpointBddTrait.ID));
184-
writer.putContext("loadBddInfo", new LoadBddInfoGenerator(writer));
184+
writer.putContext("hasBdd",
185+
directive.service().hasTrait(EndpointBddTrait.ID)
186+
|| directive.service().hasTrait(EndpointRuleSetTrait.ID));
187+
writer.putContext("loadBddInfo",
188+
new LoadBddInfoGenerator(writer, directive.service().toShapeId().getName()));
185189
var hasTransportSettings = settings.transportSettings() != null && !settings.transportSettings()
186190
.isEmpty();
187191
writer.putContext("hasTransportSettings", hasTransportSettings);
@@ -566,19 +570,18 @@ private static List<Class<?>> getBuilderSettings(JavaCodegenSettings settings) {
566570
return result;
567571
}
568572

569-
private record LoadBddInfoGenerator(JavaWriter writer) implements Runnable {
573+
private record LoadBddInfoGenerator(JavaWriter writer, String serviceName) implements Runnable {
570574
@Override
571575
public void run() {
572576
writer.write("""
573-
try (var stream = getClass().getResourceAsStream("/META-INF/endpoints/bdd-info.bin")) {
574-
if (stream != null) {
575-
var bytecode = new $T().load(stream.readAllBytes());
576-
configBuilder().applyPlugin($T.from(bytecode));
577-
}
577+
try (var stream = getClass().getResourceAsStream("/META-INF/endpoints/$L.bdd")) {
578+
var bytecode = new $T().load(stream.readAllBytes());
579+
configBuilder().applyPlugin($T.from(bytecode));
578580
} catch ($T e) {
579581
throw new $T("Failed to load BDD bytecode binary file", e);
580582
}
581583
""",
584+
serviceName,
582585
RulesEngineBuilder.class,
583586
EndpointRulesPlugin.class,
584587
IOException.class,

codegen/plugins/client-codegen/src/test/java/software/amazon/smithy/java/codegen/client/TestServerJavaClientCodegenRunner.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,22 @@ public static void main(String[] args) {
5151
.fileManifest(FileManifest.create(Paths.get(System.getenv("output"))))
5252
.settings(
5353
ObjectNode.builder()
54-
.withMember("service", "smithy.java.codegen.server.test#BddService")
54+
.withMember("service", "smithy.java.codegen.server.test#ServiceWithEndpointBdd")
5555
.withMember("namespace", "smithy.java.codegen.server.bddTest")
56-
.withMember(
57-
"transport",
58-
ObjectNode.builder()
59-
.withMember("http-java", ObjectNode.builder().build())
60-
.build())
61-
.withMember("defaultPlugins",
62-
ArrayNode.fromStrings(TestClientPlugin.class.getCanonicalName()))
63-
.withMember("defaultSettings",
64-
ArrayNode.fromStrings(TestSettings.class.getCanonicalName()))
6556
.build())
6657
.model(model)
6758
.build();
6859
plugin.execute(bddContext);
60+
61+
PluginContext serviceWithEndpointRuleSetContext = PluginContext.builder()
62+
.fileManifest(FileManifest.create(Paths.get(System.getenv("output"))))
63+
.settings(
64+
ObjectNode.builder()
65+
.withMember("service", "smithy.java.codegen.server.test#ServiceWithEndpointRuleSet")
66+
.withMember("namespace", "smithy.java.codegen.server.bddTest")
67+
.build())
68+
.model(model)
69+
.build();
70+
plugin.execute(serviceWithEndpointRuleSetContext);
6971
}
7072
}

0 commit comments

Comments
 (0)