Skip to content

Commit bcede8f

Browse files
committed
Model bundle-specific args in the bundle itself
1 parent d215464 commit bcede8f

File tree

12 files changed

+113
-80
lines changed

12 files changed

+113
-80
lines changed

Diff for: aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsAuthProvider.java renamed to aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsServiceBundle.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@
3333
import software.amazon.smithy.modelbundle.api.BundleClientPluginProvider;
3434
import software.amazon.smithy.modelbundle.api.StaticAuthSchemePlugin;
3535

36-
final class AwsAuthProvider implements BundleClientPluginProvider {
36+
final class AwsServiceBundle implements BundleClientPluginProvider {
3737
private final AwsServiceMetadata serviceMetadata;
3838
private final AwsServicePlugin plugin;
3939

40-
AwsAuthProvider(AwsServiceMetadata serviceMetadata) {
40+
AwsServiceBundle(AwsServiceMetadata serviceMetadata) {
4141
this.serviceMetadata = serviceMetadata;
4242
this.plugin = new AwsServicePlugin();
4343
}

Diff for: aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsAuthProviderFactory.java renamed to aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsServiceBundlePluginFactory.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import software.amazon.smithy.modelbundle.api.BundleClientPluginProvider;
1111
import software.amazon.smithy.modelbundle.api.BundleClientPluginProviderFactory;
1212

13-
public final class AwsAuthProviderFactory implements BundleClientPluginProviderFactory {
14-
public AwsAuthProviderFactory() {
13+
public final class AwsServiceBundlePluginFactory implements BundleClientPluginProviderFactory {
14+
public AwsServiceBundlePluginFactory() {
1515

1616
}
1717

@@ -21,7 +21,7 @@ public String identifier() {
2121
}
2222

2323
@Override
24-
public BundleClientPluginProvider createAuthFactory(Document input) {
25-
return new AwsAuthProvider(input.asShape(AwsServiceMetadata.builder()));
24+
public BundleClientPluginProvider createPluginProvider(Document input) {
25+
return new AwsServiceBundle(input.asShape(AwsServiceMetadata.builder()));
2626
}
2727
}
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
software.amazon.smithy.java.aws.servicebundle.provider.AwsAuthProviderFactory
1+
software.amazon.smithy.java.aws.servicebundle.provider.AwsServiceBundlePluginFactory

Diff for: aws/aws-service-bundler/src/main/java/software/amazon/smithy/java/aws/servicebundle/bundler/AwsServiceBundler.java

+25-29
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.Locale;
1818
import java.util.Map;
1919
import java.util.Objects;
20+
import java.util.stream.Collectors;
2021
import software.amazon.smithy.aws.traits.auth.SigV4Trait;
2122
import software.amazon.smithy.awsmcp.model.AwsServiceMetadata;
2223
import software.amazon.smithy.awsmcp.model.PreRequest;
@@ -27,10 +28,10 @@
2728
import software.amazon.smithy.model.node.ObjectNode;
2829
import software.amazon.smithy.model.shapes.ModelSerializer;
2930
import software.amazon.smithy.model.shapes.ShapeId;
30-
import software.amazon.smithy.model.shapes.StructureShape;
3131
import software.amazon.smithy.model.traits.EndpointTrait;
3232
import software.amazon.smithy.modelbundle.api.Bundler;
3333
import software.amazon.smithy.modelbundle.api.model.Bundle;
34+
import software.amazon.smithy.modelbundle.api.model.GenericArguments;
3435
import software.amazon.smithy.modelbundle.api.model.Model;
3536

3637
final class AwsServiceBundler implements Bundler {
@@ -63,32 +64,6 @@ final class AwsServiceBundler implements Bundler {
6364
this.resolver = resolver;
6465
}
6566

66-
private static software.amazon.smithy.model.Model adapt(software.amazon.smithy.model.Model model) {
67-
var template = model.expectShape(PreRequest.$ID).asStructureShape().get();
68-
var b = model.toBuilder();
69-
70-
// mix in the PreRequest structure members
71-
for (var op : model.getOperationShapes()) {
72-
var input = model.expectShape(op.getInput().get(), StructureShape.class).toBuilder();
73-
for (var member : template.members()) {
74-
input.addMember(member.toBuilder()
75-
.id(ShapeId.from(input.getId().toString() + "$" + member.getMemberName()))
76-
.build());
77-
}
78-
b.addShape(input.build());
79-
}
80-
81-
for (var service : model.getServiceShapes()) {
82-
b.addShape(service.toBuilder()
83-
// trim the endpoint rules because they're huge and we don't need them
84-
.removeTrait(ShapeId.from("smithy.rules#endpointRuleSet"))
85-
.removeTrait(ENDPOINT_TESTS)
86-
.build());
87-
}
88-
89-
return b.build();
90-
}
91-
9267
@Override
9368
public Bundle bundle() {
9469
try {
@@ -122,15 +97,36 @@ public Bundle bundle() {
12297
.configType("aws")
12398
.serviceName(model.getServiceShapes().iterator().next().getId().toString())
12499
.model(Model.builder()
125-
.smithyModel(
126-
ObjectNode.printJson(ModelSerializer.builder().build().serialize(adapt(model))))
100+
.smithyModel(serializeModel(model))
101+
.build())
102+
.requestArguments(GenericArguments.builder()
103+
.identifier(PreRequest.$ID.toString())
104+
.model(Model.builder()
105+
.smithyModel(loadModel("/META-INF/smithy/bundle.smithy"))
106+
.build())
127107
.build())
128108
.build();
129109
} catch (Exception e) {
130110
throw new RuntimeException("Failed to bundle " + serviceName, e);
131111
}
132112
}
133113

114+
private static String serializeModel(software.amazon.smithy.model.Model model) {
115+
return ObjectNode.printJson(ModelSerializer.builder()
116+
.build()
117+
.serialize(model));
118+
}
119+
120+
private static String loadModel(String path) {
121+
try (var reader = new BufferedReader(new InputStreamReader(
122+
Objects.requireNonNull(AwsServiceBundler.class.getResourceAsStream(path)),
123+
StandardCharsets.UTF_8))) {
124+
return reader.lines().collect(Collectors.joining());
125+
} catch (Exception e) {
126+
throw new RuntimeException(e);
127+
}
128+
}
129+
134130
Map<String, String> parseEndpoints(ObjectNode endpointTests) {
135131
var testCases = endpointTests.expectArrayMember("testCases");
136132
var endpoints = new HashMap<String, String>();

Diff for: model-bundler/bundle-api/build.gradle.kts

-8
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,3 @@ tasks.sourcesJar {
4747
tasks.processResources {
4848
dependsOn("compileJava")
4949
}
50-
51-
sourceSets {
52-
main {
53-
java {
54-
srcDir("model")
55-
}
56-
}
57-
}

Diff for: model-bundler/bundle-api/model/bundle.smithy

-21
This file was deleted.

Diff for: model-bundler/bundle-api/src/main/java/software/amazon/smithy/modelbundle/api/BundleClientPluginProvider.java

+1-12
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,7 @@
88
import software.amazon.smithy.java.client.core.ClientPlugin;
99

1010
/**
11-
* A ConfigProvider is used to parse a bundle of service information (model, auth configuration, endpoints, etc.) and
12-
* configure outgoing client calls as necessary.
13-
*
14-
* <p>Implementations of this interface can define a wrapper type that adds additional parameters to vended MCP tools.
15-
* For example, an AWS auth provider can make a wrapper that adds the region and AWS credential profile name as
16-
* arguments to tools generated for AWS APIs. A wrapper type does not need to be defined if no per-request parameters
17-
* need to be injected.
18-
*
19-
* <p>The ConfigProvider is responsible for configuring outbound client calls with endpoint, identity, and auth resolver
20-
* mechanisms. The default implementation of {@link #adaptConfig(T)} orchestrates the calls to all other ConfigProvider
21-
* APIs and should not be overridden. If an override is needed, the {@code super} method should be called and the
22-
* returned RequestOverrideConfig.Builder should be modified.
11+
* A factory for creating {@link ClientPlugin} instances from a service bundle.
2312
*/
2413
public interface BundleClientPluginProvider {
2514
/**

Diff for: model-bundler/bundle-api/src/main/java/software/amazon/smithy/modelbundle/api/BundleClientPluginProviderFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010
public interface BundleClientPluginProviderFactory {
1111
String identifier();
1212

13-
BundleClientPluginProvider createAuthFactory(Document input);
13+
BundleClientPluginProvider createPluginProvider(Document input);
1414
}

Diff for: model-bundler/bundle-api/src/main/java/software/amazon/smithy/modelbundle/api/PluginProviders.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public BundleClientPluginProvider getProvider(String identifier, Document input)
2222
throw new NullPointerException("no auth provider named " + identifier);
2323
}
2424

25-
return provider.createAuthFactory(input);
25+
return provider.createPluginProvider(input);
2626
}
2727

2828
public static Builder builder() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
$version: "2"
2+
3+
namespace software.amazon.smithy.modelbundle.api
4+
5+
structure Bundle {
6+
/// unique identifier for the configuration type. used to resolve the appropriate Bundler.
7+
@required
8+
configType: String
9+
10+
/// fully-qualified ShapeId of the service
11+
@required
12+
serviceName: String
13+
14+
/// Bundle-specific configuration. If this bundle does not require configuration, this
15+
/// field may be omitted.
16+
config: Document
17+
18+
/// model that describes the service. The service given in `serviceName` must be present.
19+
@required
20+
model: Model
21+
22+
/// model describing the generic arguments that must be present in every request. If this
23+
/// bundle does not require generic arguments, this field may be omitted.
24+
requestArguments: GenericArguments
25+
}
26+
27+
union Model {
28+
smithyModel: String
29+
}
30+
31+
structure GenericArguments {
32+
@required
33+
identifier: String
34+
35+
@required
36+
model: Model
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bundle.smithy

Diff for: server/server-proxy/src/main/java/software/amazon/smithy/java/server/ProxyService.java

+40-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import software.amazon.smithy.model.shapes.ServiceShape;
3434
import software.amazon.smithy.model.shapes.ShapeId;
3535
import software.amazon.smithy.model.shapes.ShapeType;
36+
import software.amazon.smithy.model.shapes.StructureShape;
3637
import software.amazon.smithy.model.shapes.ToShapeId;
3738
import software.amazon.smithy.modelbundle.api.PluginProviders;
3839
import software.amazon.smithy.modelbundle.api.model.Bundle;
@@ -50,8 +51,46 @@ public final class ProxyService implements Service {
5051
private final List<Operation<? extends SerializableStruct, ? extends SerializableStruct>> allOperations;
5152
private final Schema schema;
5253

54+
private static software.amazon.smithy.model.Model adapt(Builder builder) {
55+
if (builder.bundle == null || builder.bundle.getRequestArguments() == null) {
56+
return builder.model;
57+
}
58+
59+
var args = builder.bundle.getRequestArguments();
60+
var model = new ModelAssembler()
61+
.addModel(builder.model)
62+
.addModel(args.getModel().getValue())
63+
.assemble()
64+
.unwrap();
65+
var template = model.expectShape(ShapeId.from(args.getIdentifier()))
66+
.asStructureShape()
67+
.get();
68+
var b = model.toBuilder();
69+
70+
// mix in the generic arg members
71+
for (var op : model.getOperationShapes()) {
72+
var input = model.expectShape(op.getInput().get(), StructureShape.class).toBuilder();
73+
for (var member : template.members()) {
74+
input.addMember(member.toBuilder()
75+
.id(ShapeId.from(input.getId().toString() + "$" + member.getMemberName()))
76+
.build());
77+
}
78+
b.addShape(input.build());
79+
}
80+
81+
for (var service : model.getServiceShapes()) {
82+
b.addShape(service.toBuilder()
83+
// trim the endpoint rules because they're huge and we don't need them
84+
.removeTrait(ShapeId.from("smithy.rules#endpointRuleSet"))
85+
.removeTrait(ShapeId.from("smithy.rules#endpointTests"))
86+
.build());
87+
}
88+
89+
return b.build();
90+
}
91+
5392
private ProxyService(Builder builder) {
54-
this.model = builder.model;
93+
this.model = adapt(builder);
5594
DynamicClient.Builder clientBuilder = DynamicClient.builder()
5695
.service(builder.service)
5796
.model(model);

0 commit comments

Comments
 (0)