diff --git a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/mappers/UnsupportedTraits.java b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/mappers/UnsupportedTraits.java index 9d1b49e30cb..87e35719e9b 100644 --- a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/mappers/UnsupportedTraits.java +++ b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/mappers/UnsupportedTraits.java @@ -4,17 +4,23 @@ */ package software.amazon.smithy.openapi.fromsmithy.mappers; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; +import software.amazon.smithy.aws.traits.HttpChecksumTrait; +import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.traits.EndpointTrait; +import software.amazon.smithy.model.traits.HostLabelTrait; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.openapi.OpenApiException; import software.amazon.smithy.openapi.fromsmithy.Context; import software.amazon.smithy.openapi.fromsmithy.OpenApiMapper; import software.amazon.smithy.openapi.model.OpenApi; -import software.amazon.smithy.utils.Pair; import software.amazon.smithy.utils.SetUtils; import software.amazon.smithy.utils.SmithyInternalApi; @@ -25,7 +31,10 @@ @SmithyInternalApi public final class UnsupportedTraits implements OpenApiMapper { private static final Logger LOGGER = Logger.getLogger(UnsupportedTraits.class.getName()); - private static final Set TRAITS = SetUtils.of("endpoint", "hostLabel", "aws.protocols#httpChecksum"); + private static final Set TRAITS = SetUtils.of( + EndpointTrait.ID, + HostLabelTrait.ID, + HttpChecksumTrait.ID); @Override public byte getOrder() { @@ -34,14 +43,18 @@ public byte getOrder() { @Override public void before(Context context, OpenApi.Builder builder) { - List>> violations = context.getModel() - .shapes() - .map(shape -> Pair.of(shape.getId(), - TRAITS.stream() - .filter(trait -> shape.findTrait(trait).isPresent()) - .collect(Collectors.toList()))) - .filter(pair -> pair.getRight().size() > 0) - .collect(Collectors.toList()); + Map> violations = new LinkedHashMap<>(); + for (Shape shape : context.getModel().toSet()) { + List unsupportedTraits = new ArrayList<>(TRAITS.size()); + for (ShapeId trait : TRAITS) { + if (shape.hasTrait(trait)) { + unsupportedTraits.add(trait); + } + } + if (!unsupportedTraits.isEmpty()) { + violations.put(shape.getId(), unsupportedTraits); + } + } if (violations.isEmpty()) { return; @@ -49,10 +62,15 @@ public void before(Context context, OpenApi.Builder builder) { StringBuilder message = new StringBuilder( "Encountered unsupported Smithy traits when converting to OpenAPI:"); - violations.forEach(pair -> message.append(String.format( - " (`%s`: [%s])", - pair.getLeft(), - String.join(",", pair.getRight())))); + for (Map.Entry> entry : violations.entrySet()) { + message.append(String.format( + " (`%s`: [`%s`])", + entry.getKey(), + entry.getValue() + .stream() + .map(ShapeId::toString) + .collect(Collectors.joining("`, `")))); + } message.append(". While these traits may still be meaningful to clients and servers using the Smithy " + "model directly, they have no direct corollary in OpenAPI and can not be included in " + "the generated model.");