From 7dac72d898320a84d373dc4410e84492ad743cfc Mon Sep 17 00:00:00 2001 From: Michael Dowling Date: Mon, 26 Aug 2019 20:59:32 -0700 Subject: [PATCH] Add typed ObjectNode member expectation functions --- .../amazon/smithy/aws/traits/ArnTrait.java | 2 +- .../traits/CognitoUserPoolsSettingsTrait.java | 4 +- .../apigateway/AuthorizerDefinition.java | 2 +- .../apigateway/IntegrationResponse.java | 2 +- .../traits/apigateway/IntegrationTrait.java | 10 +-- .../traits/iam/ConditionKeyDefinition.java | 2 +- .../smithy/build/model/ConfigLoader.java | 4 +- .../linters/EmitEachSelectorValidator.java | 2 +- .../linters/EmitNoneSelectorValidator.java | 2 +- .../linters/ReservedWordsValidator.java | 4 +- .../smithy/model/loader/LoaderUtils.java | 2 +- .../smithy/model/loader/NodeModelLoader.java | 2 +- .../smithy/model/loader/ValidationLoader.java | 3 +- .../amazon/smithy/model/node/ObjectNode.java | 72 +++++++++++++++++++ .../smithy/model/traits/EndpointTrait.java | 2 +- .../smithy/model/traits/ExamplesTrait.java | 2 +- .../amazon/smithy/model/traits/HttpTrait.java | 4 +- .../smithy/model/traits/ProtocolsTrait.java | 2 +- .../smithy/model/traits/ReferencesTrait.java | 3 +- .../model/traits/XmlNamespaceTrait.java | 2 +- .../smithy/model/node/ObjectNodeTest.java | 57 +++++++++++++++ .../openapi/fromsmithy/Smithy2OpenApi.java | 4 +- 22 files changed, 156 insertions(+), 33 deletions(-) diff --git a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/ArnTrait.java b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/ArnTrait.java index ce2d4201726..8a6669488cc 100644 --- a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/ArnTrait.java +++ b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/ArnTrait.java @@ -75,7 +75,7 @@ public Trait createTrait(ShapeId target, Node value) { Builder builder = builder(); ObjectNode objectNode = value.expectObjectNode(); objectNode.warnIfAdditionalProperties(PROPERTIES); - builder.template(objectNode.expectMember(TEMPLATE).expectStringNode().getValue()); + builder.template(objectNode.expectStringMember(TEMPLATE).getValue()); builder.absolute(objectNode.getBooleanMemberOrDefault(ABSOLUTE)); builder.noRegion(objectNode.getBooleanMemberOrDefault(NO_REGION)); builder.noAccount(objectNode.getBooleanMemberOrDefault(NO_ACCOUNT)); diff --git a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/CognitoUserPoolsSettingsTrait.java b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/CognitoUserPoolsSettingsTrait.java index a7c69305f6e..12c197c0e23 100644 --- a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/CognitoUserPoolsSettingsTrait.java +++ b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/CognitoUserPoolsSettingsTrait.java @@ -54,9 +54,7 @@ public Provider() { public Trait createTrait(ShapeId target, Node value) { ObjectNode objectNode = value.expectObjectNode().warnIfAdditionalProperties(ListUtils.of(PROVIDER_ARNS)); return builder() - .providerArns(objectNode.expectMember(PROVIDER_ARNS) - .expectArrayNode() - .getElementsAs(StringNode::getValue)) + .providerArns(objectNode.expectArrayMember(PROVIDER_ARNS).getElementsAs(StringNode::getValue)) .build(); } } diff --git a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/AuthorizerDefinition.java b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/AuthorizerDefinition.java index e7f04c523a1..ff8bfd53934 100644 --- a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/AuthorizerDefinition.java +++ b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/AuthorizerDefinition.java @@ -202,7 +202,7 @@ public int hashCode() { static AuthorizerDefinition fromNode(ObjectNode node) { node.warnIfAdditionalProperties(PROPERTIES); Builder builder = builder(); - builder.scheme(node.expectMember(SCHEME_KEY).expectStringNode().getValue()); + builder.scheme(node.expectStringMember(SCHEME_KEY).getValue()); node.getStringMember(TYPE_KEY) .map(StringNode::getValue) .ifPresent(builder::type); diff --git a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationResponse.java b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationResponse.java index 6855d50cc9f..edf453717b7 100644 --- a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationResponse.java +++ b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationResponse.java @@ -66,7 +66,7 @@ static IntegrationResponse fromNode(Node value) { Objects.requireNonNull(value); ObjectNode obj = value.expectObjectNode(); Builder builder = builder().sourceLocation(value); - builder.statusCode(obj.expectMember(STATUS_CODE_KEY).expectStringNode().getValue()); + builder.statusCode(obj.expectStringMember(STATUS_CODE_KEY).getValue()); obj.getStringMember(CONTENT_HANDLING_KEY).map(StringNode::getValue).ifPresent(builder::contentHandling); obj.getObjectMember(RESPONSE_TEMPLATES_KEY) .map(ObjectNode::getMembers) diff --git a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationTrait.java b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationTrait.java index 0735c12acd0..c1e04a54c2a 100644 --- a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationTrait.java +++ b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/apigateway/IntegrationTrait.java @@ -108,9 +108,9 @@ public Trait createTrait(ShapeId target, Node value) { builder.sourceLocation(value); ObjectNode node = value.expectObjectNode(); node.warnIfAdditionalProperties(KEYS); - builder.type(node.expectMember(TYPE_KEY).expectStringNode().getValue()); - builder.uri(node.expectMember(URI_KEY).expectStringNode().getValue()); - builder.httpMethod(node.expectMember(HTTP_METHOD_KEY).expectStringNode().getValue()); + builder.type(node.expectStringMember(TYPE_KEY).getValue()); + builder.uri(node.expectStringMember(URI_KEY).getValue()); + builder.httpMethod(node.expectStringMember(HTTP_METHOD_KEY).getValue()); node.getArrayMember(CACHE_KEY_PARAMETERS_KEY) .ifPresent(arrayNode -> arrayNode.getElements().stream() .map(Node::expectStringNode) @@ -356,10 +356,10 @@ public Optional getResponse(String statusCode) { public ObjectNode toExpandedNode(ToShapeId service, ToShapeId operation) { ObjectNode result = toNode().expectObjectNode(); result = result.withMember(URI_KEY, formatComponent( - service, operation, result.expectMember(URI_KEY).expectStringNode().getValue())); + service, operation, result.expectStringMember(URI_KEY).getValue())); if (result.containsMember(CREDENTIALS_KEY)) { result = result.withMember(CREDENTIALS_KEY, formatComponent( - service, operation, result.expectMember(CREDENTIALS_KEY).expectStringNode().getValue())); + service, operation, result.expectStringMember(CREDENTIALS_KEY).getValue())); } return result; } diff --git a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/iam/ConditionKeyDefinition.java b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/iam/ConditionKeyDefinition.java index e45cc5ad9b8..500a593881e 100644 --- a/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/iam/ConditionKeyDefinition.java +++ b/aws/smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/iam/ConditionKeyDefinition.java @@ -50,7 +50,7 @@ public static ConditionKeyDefinition fromNode(Node value) { ObjectNode objectNode = value.expectObjectNode(); objectNode.warnIfAdditionalProperties(SUPPORTED_PROPERTIES); Builder builder = builder() - .type(objectNode.expectMember(TYPE).expectStringNode().getValue()); + .type(objectNode.expectStringMember(TYPE).getValue()); objectNode.getStringMember(DOCUMENTATION).map(StringNode::getValue) .ifPresent(builder::documentation); objectNode.getStringMember(EXTERNAL_DOCUMENTATION).map(StringNode::getValue) diff --git a/smithy-build/src/main/java/software/amazon/smithy/build/model/ConfigLoader.java b/smithy-build/src/main/java/software/amazon/smithy/build/model/ConfigLoader.java index b25749b4475..0e679c6ff5b 100644 --- a/smithy-build/src/main/java/software/amazon/smithy/build/model/ConfigLoader.java +++ b/smithy-build/src/main/java/software/amazon/smithy/build/model/ConfigLoader.java @@ -77,7 +77,7 @@ private static SmithyBuildConfig load(ObjectNode node) { SmithyBuildConfig.Builder builder = SmithyBuildConfig.builder(); node.warnIfAdditionalProperties(ROOT_KEYS); - node.expectMember(VERSION_KEY).expectStringNode().expectOneOf(VERSION); + node.expectStringMember(VERSION_KEY).expectOneOf(VERSION); builder.imports(node.getArrayMember(IMPORTS_KEY) .map(imports -> Node.loadArrayOfString(IMPORTS_KEY, imports)) .orElse(Collections.emptyList())); @@ -118,7 +118,7 @@ private static List loadTransforms(ArrayNode node) { .map(element -> { ObjectNode objectNode = element.expectObjectNode(); objectNode.warnIfAdditionalProperties(TRANSFORM_KEYS); - String name = objectNode.expectMember(NAME_KEY).expectStringNode().getValue(); + String name = objectNode.expectStringMember(NAME_KEY).getValue(); List args = objectNode.getArrayMember(ARGS_KEY) .map(argsNode -> argsNode.getElementsAs(StringNode::getValue)) .orElseGet(Collections::emptyList); diff --git a/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitEachSelectorValidator.java b/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitEachSelectorValidator.java index 2e631469fca..59ad8271f44 100644 --- a/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitEachSelectorValidator.java +++ b/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitEachSelectorValidator.java @@ -39,7 +39,7 @@ private EmitEachSelectorValidator(Selector selector) { public static final class Provider extends ValidatorService.Provider { public Provider() { super(EmitEachSelectorValidator.class, configuration -> { - Selector selector = parse(configuration.expectMember("selector").expectStringNode()); + Selector selector = parse(configuration.expectStringMember("selector")); return new EmitEachSelectorValidator(selector); }); } diff --git a/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitNoneSelectorValidator.java b/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitNoneSelectorValidator.java index af6a0e98732..5e90aacc544 100644 --- a/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitNoneSelectorValidator.java +++ b/smithy-linters/src/main/java/software/amazon/smithy/linters/EmitNoneSelectorValidator.java @@ -44,7 +44,7 @@ private EmitNoneSelectorValidator(Selector selector) { public static final class Provider extends ValidatorService.Provider { public Provider() { super(EmitNoneSelectorValidator.class, configuration -> { - Selector selector = parse(configuration.expectMember("selector").expectStringNode()); + Selector selector = parse(configuration.expectStringMember("selector")); return new EmitNoneSelectorValidator(selector); }); } diff --git a/smithy-linters/src/main/java/software/amazon/smithy/linters/ReservedWordsValidator.java b/smithy-linters/src/main/java/software/amazon/smithy/linters/ReservedWordsValidator.java index de9bd3b6ecd..460b0f9f6cb 100644 --- a/smithy-linters/src/main/java/software/amazon/smithy/linters/ReservedWordsValidator.java +++ b/smithy-linters/src/main/java/software/amazon/smithy/linters/ReservedWordsValidator.java @@ -72,8 +72,8 @@ private ReservedWordsValidator(List reservations) { public static final class Provider extends ValidatorService.Provider { public Provider() { super(ReservedWordsValidator.class, node -> new ReservedWordsValidator( - node.expectMember("reserved") - .expectArrayNode().getElements().stream() + node.expectArrayMember("reserved") + .getElements().stream() .map(Node::expectObjectNode) .map(ReservedWordsValidator::createConfiguration) .collect(Collectors.toList()))); diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderUtils.java b/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderUtils.java index 43299086dad..eb6a72d7e6a 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderUtils.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderUtils.java @@ -55,7 +55,7 @@ final class LoaderUtils { private LoaderUtils() {} static void loadServiceObject(ServiceShape.Builder builder, ShapeId shapeId, ObjectNode shapeNode) { - builder.version(shapeNode.expectMember(VERSION_KEY).expectStringNode().getValue()); + builder.version(shapeNode.expectStringMember(VERSION_KEY).getValue()); LoaderUtils.optionalIdList(shapeNode, shapeId.getNamespace(), OPERATIONS_KEY).forEach(builder::addOperation); LoaderUtils.optionalIdList(shapeNode, shapeId.getNamespace(), RESOURCES_KEY).forEach(builder::addResource); } diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/loader/NodeModelLoader.java b/smithy-model/src/main/java/software/amazon/smithy/model/loader/NodeModelLoader.java index e5120fe3ff6..685c8a7f917 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/loader/NodeModelLoader.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/loader/NodeModelLoader.java @@ -194,7 +194,7 @@ private void loadShape(ShapeId id, String type, ObjectNode value, LoaderVisitor void load(LoaderVisitor visitor, Node node) { ObjectNode model = node.expectObjectNode("Smithy documents must be an object. Found {type}."); - StringNode version = model.expectMember(SMITHY).expectStringNode(); + StringNode version = model.expectStringMember(SMITHY); visitor.onVersion(version.getSourceLocation(), version.expectStringNode().getValue()); model.getMember(METADATA).ifPresent(value -> { diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/loader/ValidationLoader.java b/smithy-model/src/main/java/software/amazon/smithy/model/loader/ValidationLoader.java index 25a38ebf7ca..f70df30b0a9 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/loader/ValidationLoader.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/loader/ValidationLoader.java @@ -111,8 +111,7 @@ private static ValidatedResult> load( private static ValidatorDefinition loadSingleValidator(ObjectNode node) { node.warnIfAdditionalProperties(VALIDATOR_PROPERTIES); - String name = node.expectMember("name", "Validator is missing a required `name` property.") - .expectStringNode().getValue(); + String name = node.expectStringMember("name").getValue(); ValidatorDefinition def = new ValidatorDefinition( name, node.getStringMember("id").map(StringNode::getValue).orElse(name)); def.message = node.getStringMember("message").map(StringNode::getValue).orElse(null); diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/node/ObjectNode.java b/smithy-model/src/main/java/software/amazon/smithy/model/node/ObjectNode.java index 8533377ae04..598bbe5a7e2 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/node/ObjectNode.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/node/ObjectNode.java @@ -374,6 +374,78 @@ public Node expectMember(String name, String errorMessage) { return getMember(name).orElseThrow(() -> new ExpectationNotMetException(errorMessage, this)); } + /** + * Gets a member and requires it to be an array. + * + * @param name Name of the member to get. + * @return Returns the node with the given member name. + * @throws ExpectationNotMetException when not present or not an array. + */ + public ArrayNode expectArrayMember(String name) { + return expectMember(name) + .expectArrayNode(format("Expected `%s` member to be an array, but found {type}.", name)); + } + + /** + * Gets a member and requires it to be a boolean. + * + * @param name Name of the member to get. + * @return Returns the node with the given member name. + * @throws ExpectationNotMetException when not present or not a boolean. + */ + public BooleanNode expectBooleanMember(String name) { + return expectMember(name) + .expectBooleanNode(format("Expected `%s` member to be a boolean, but found {type}.", name)); + } + + /** + * Gets a member and requires it to be a null. + * + * @param name Name of the member to get. + * @return Returns the node with the given member name. + * @throws ExpectationNotMetException when not present or not a null. + */ + public NullNode expectNullMember(String name) { + return expectMember(name) + .expectNullNode(format("Expected `%s` member to be null, but found {type}.", name)); + } + + /** + * Gets a member and requires it to be a number. + * + * @param name Name of the member to get. + * @return Returns the node with the given member name. + * @throws ExpectationNotMetException when not present or not a number. + */ + public NumberNode expectNumberMember(String name) { + return expectMember(name) + .expectNumberNode(format("Expected `%s` member to be a number, but found {type}.", name)); + } + + /** + * Gets a member and requires it to be an object. + * + * @param name Name of the member to get. + * @return Returns the node with the given member name. + * @throws ExpectationNotMetException when not present or not an object. + */ + public ObjectNode expectObjectMember(String name) { + return expectMember(name) + .expectObjectNode(format("Expected `%s` member to be an object, but found {type}.", name)); + } + + /** + * Gets a member and requires it to be a string. + * + * @param name Name of the member to get. + * @return Returns the node with the given member name. + * @throws ExpectationNotMetException when not present or not a string. + */ + public StringNode expectStringMember(String name) { + return expectMember(name) + .expectStringNode(format("Expected `%s` member to be a string, but found {type}.", name)); + } + /** * Ensures that there are no additional properties other than the * provided member names. diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/traits/EndpointTrait.java b/smithy-model/src/main/java/software/amazon/smithy/model/traits/EndpointTrait.java index 310fb200b10..702a5daec60 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/traits/EndpointTrait.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/traits/EndpointTrait.java @@ -83,7 +83,7 @@ public Provider() { public Trait createTrait(ShapeId target, Node value) { EndpointTrait.Builder builder = builder().sourceLocation(value); ObjectNode objectNode = value.expectObjectNode(); - builder.hostPrefix(objectNode.expectMember("hostPrefix").expectStringNode().getValue()); + builder.hostPrefix(objectNode.expectStringMember("hostPrefix").getValue()); return builder.build(); } } diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/traits/ExamplesTrait.java b/smithy-model/src/main/java/software/amazon/smithy/model/traits/ExamplesTrait.java index d8e56808aab..cb09cbe2f97 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/traits/ExamplesTrait.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/traits/ExamplesTrait.java @@ -214,7 +214,7 @@ public ExamplesTrait createTrait(ShapeId target, Node value) { private static Example exampleFromNode(ObjectNode node) { return Example.builder() - .title(node.expectMember("title").expectStringNode().getValue()) + .title(node.expectStringMember("title").getValue()) .documentation(node.getStringMember("documentation").map(StringNode::getValue).orElse(null)) .input(node.getMember("input").map(Node::expectObjectNode).orElseGet(Node::objectNode)) .output(node.getMember("output").map(Node::expectObjectNode).orElseGet(Node::objectNode)) diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/traits/HttpTrait.java b/smithy-model/src/main/java/software/amazon/smithy/model/traits/HttpTrait.java index 6f534a61934..6ac4a68acce 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/traits/HttpTrait.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/traits/HttpTrait.java @@ -50,8 +50,8 @@ public Provider() { public Trait createTrait(ShapeId target, Node value) { HttpTrait.Builder builder = builder().sourceLocation(value); ObjectNode members = value.expectObjectNode(); - builder.uri(UriPattern.parse(members.expectMember("uri").expectStringNode().getValue())); - builder.method(members.expectMember("method").expectStringNode().getValue()); + builder.uri(UriPattern.parse(members.expectStringMember("uri").getValue())); + builder.method(members.expectStringMember("method").getValue()); builder.code(members.getNumberMember("code") .map(NumberNode::getValue) .map(Number::intValue) diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/traits/ProtocolsTrait.java b/smithy-model/src/main/java/software/amazon/smithy/model/traits/ProtocolsTrait.java index 16323564e41..37c41f2d506 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/traits/ProtocolsTrait.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/traits/ProtocolsTrait.java @@ -58,7 +58,7 @@ public Trait createTrait(ShapeId target, Node value) { for (ObjectNode protocol : value.expectArrayNode().getElementsAs(ObjectNode.class)) { protocol.warnIfAdditionalProperties(PROPERTIES); Protocol.Builder protocolBuilder = Protocol.builder(); - protocolBuilder.name(protocol.expectMember("name").expectStringNode().getValue()); + protocolBuilder.name(protocol.expectStringMember("name").getValue()); protocol.getMember("tags").map(Node::expectArrayNode).ifPresent(tagsNode -> { tagsNode.getElements().stream() .map(Node::expectStringNode) diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/traits/ReferencesTrait.java b/smithy-model/src/main/java/software/amazon/smithy/model/traits/ReferencesTrait.java index 12756e5b1aa..109ee6e746f 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/traits/ReferencesTrait.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/traits/ReferencesTrait.java @@ -271,8 +271,7 @@ public ReferencesTrait createTrait(ShapeId target, Node value) { private static Reference referenceFromNode(String namespace, ObjectNode referenceProperties) { return Reference.builder() .resource(referenceProperties - .expectMember("resource") - .expectStringNode() + .expectStringMember("resource") .expectShapeId(namespace)) .ids(referenceProperties.getObjectMember("ids") .map(obj -> obj.getMembers().entrySet().stream() diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/traits/XmlNamespaceTrait.java b/smithy-model/src/main/java/software/amazon/smithy/model/traits/XmlNamespaceTrait.java index 857a0869509..5b9b0e20eae 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/traits/XmlNamespaceTrait.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/traits/XmlNamespaceTrait.java @@ -92,7 +92,7 @@ public XmlNamespaceTrait createTrait(ShapeId target, Node value) { Builder builder = builder().sourceLocation(value); ObjectNode node = value.expectObjectNode(); node.warnIfAdditionalProperties(XML_NAMESPACE_PROPERTIES); - builder.uri(node.expectMember("uri").expectStringNode().getValue()); + builder.uri(node.expectStringMember("uri").getValue()); return builder.build(); } } diff --git a/smithy-model/src/test/java/software/amazon/smithy/model/node/ObjectNodeTest.java b/smithy-model/src/test/java/software/amazon/smithy/model/node/ObjectNodeTest.java index 3ff404fe831..724fb1d6223 100644 --- a/smithy-model/src/test/java/software/amazon/smithy/model/node/ObjectNodeTest.java +++ b/smithy-model/src/test/java/software/amazon/smithy/model/node/ObjectNodeTest.java @@ -38,6 +38,15 @@ public class ObjectNodeTest { + private static final ObjectNode EXPECTATION_NODE = Node.objectNodeBuilder() + .withMember("array", Node.arrayNode()) + .withMember("boolean", Node.from(true)) + .withMember("number", Node.from(10)) + .withMember("null", Node.nullNode()) + .withMember("string", Node.from("hi")) + .withMember("object", Node.objectNode()) + .build(); + @Test public void emptyNodeIsEmpty() { ObjectNode node = Node.objectNode(); @@ -302,4 +311,52 @@ public void collectsIntoObjectNode() { assertThat(result.getMember("b"), equalTo(Optional.of(Node.from("b")))); assertThat(result.getMember("c"), equalTo(Optional.of(Node.from("c")))); } + + @Test + public void expectsArrayMember() { + EXPECTATION_NODE.expectArrayMember("array"); + Assertions.assertThrows(ExpectationNotMetException.class, () -> { + EXPECTATION_NODE.expectArrayMember("object"); + }); + } + + @Test + public void expectsBooleanMember() { + EXPECTATION_NODE.expectBooleanMember("boolean"); + Assertions.assertThrows(ExpectationNotMetException.class, () -> { + EXPECTATION_NODE.expectBooleanMember("object"); + }); + } + + @Test + public void expectsNumberMember() { + EXPECTATION_NODE.expectNumberMember("number"); + Assertions.assertThrows(ExpectationNotMetException.class, () -> { + EXPECTATION_NODE.expectNumberMember("object"); + }); + } + + @Test + public void expectsNullMember() { + EXPECTATION_NODE.expectNullMember("null"); + Assertions.assertThrows(ExpectationNotMetException.class, () -> { + EXPECTATION_NODE.expectNullMember("object"); + }); + } + + @Test + public void expectsObjectMember() { + EXPECTATION_NODE.expectObjectMember("object"); + Assertions.assertThrows(ExpectationNotMetException.class, () -> { + EXPECTATION_NODE.expectObjectMember("string"); + }); + } + + @Test + public void expectsStringMember() { + EXPECTATION_NODE.expectStringMember("string"); + Assertions.assertThrows(ExpectationNotMetException.class, () -> { + EXPECTATION_NODE.expectStringMember("object"); + }); + } } diff --git a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/Smithy2OpenApi.java b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/Smithy2OpenApi.java index 3057acd5ca1..d83976c13b3 100644 --- a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/Smithy2OpenApi.java +++ b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/Smithy2OpenApi.java @@ -44,9 +44,7 @@ public void execute(PluginContext context) { context.getPluginClassLoader().ifPresent(converter::classLoader); ShapeId shapeId = ShapeId.from(context.getSettings() - .expectMember(OpenApiConstants.SERVICE, - getName() + " required a `service` shape ID is provided in the settings.") - .expectStringNode("`" + OpenApiConstants.SERVICE + "` must be a string value") + .expectStringMember(OpenApiConstants.SERVICE) .getValue()); ObjectNode openApiNode = converter.convertToNode(context.getModel(), shapeId);