diff --git a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java
index db2d5cee379..4095fe4b20c 100644
--- a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java
+++ b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java
@@ -136,6 +136,7 @@ public String toString() {
private boolean disableIntEnums = false;
private boolean addReferenceDescriptions = false;
private boolean useInlineMaps = false;
+ private boolean disableDefaultDeprecatedMessage = false;
public JsonSchemaConfig() {
nodeMapper.setWhenMissingSetter(NodeMapper.WhenMissing.IGNORE);
@@ -467,6 +468,24 @@ public void setDisableIntEnums(boolean disableIntEnums) {
this.disableIntEnums = disableIntEnums;
}
+ public boolean getDisableDefaultDeprecatedMessage() {
+ return disableDefaultDeprecatedMessage;
+ }
+
+ /**
+ * Set to true to disable adding default deprecated messages to schema descriptions
+ * when the @deprecated trait is present but has no message or since.
+ *
+ *
By default, when a shape has the @deprecated trait, a default message like
+ * "This operation is deprecated." is added to the schema description. Setting this
+ * to true will prevent the default description from being added.
+ *
+ * @param disableDefaultDeprecatedMessage True to disable default description for @deprecated trait.
+ */
+ public void setDisableDefaultDeprecatedMessage(boolean disableDefaultDeprecatedMessage) {
+ this.disableDefaultDeprecatedMessage = disableDefaultDeprecatedMessage;
+ }
+
/**
* JSON schema version to use when converting Smithy shapes into Json Schema.
*
diff --git a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java
index 5b590cf9be2..070a5b4f293 100644
--- a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java
+++ b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java
@@ -381,11 +381,21 @@ private Optional descriptionMessage(Shape shape) {
shape
.getTrait(DocumentationTrait.class)
.ifPresent(trait -> builder.append(trait.getValue()));
+
+ JsonSchemaConfig config = converter.getConfig();
+ boolean disableDefaultDeprecatedMessage = config.getDisableDefaultDeprecatedMessage();
+
shape
.getTrait(DeprecatedTrait.class)
- .ifPresent(trait -> builder
- .append("\n")
- .append(trait.getDeprecatedDescription(shape.getType())));
+ .ifPresent(trait -> {
+ if (!disableDefaultDeprecatedMessage || trait.getMessage().isPresent()
+ || trait.getSince().isPresent()) {
+ builder
+ .append("\n")
+ .append(trait.getDeprecatedDescription(shape.getType()));
+ }
+ });
+
String description = builder.toString().trim();
return description.isEmpty() ? Optional.empty() : Optional.of(description);
}
diff --git a/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java b/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java
index d618ff8775e..41fa01e14fc 100644
--- a/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java
+++ b/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java
@@ -139,6 +139,95 @@ public void appendsDeprecatedInfoInDescription() {
assertThat(document.getRootSchema().getDescription().get(), equalTo(expected));
}
+ @Test
+ public void disableDefaultDeprecatedMessage() {
+ IntegerShape shape = IntegerShape.builder()
+ .id("a.b#C")
+ .addTrait(DeprecatedTrait.builder().build())
+ .addTrait(new DocumentationTrait("This is an integer."))
+ .build();
+ Model model = Model.builder().addShape(shape).build();
+ JsonSchemaConfig config = new JsonSchemaConfig();
+ config.setDisableDefaultDeprecatedMessage(true);
+ SchemaDocument document = JsonSchemaConverter.builder()
+ .addMapper(new OpenApiJsonSchemaMapper())
+ .model(model)
+ .config(config)
+ .build()
+ .convertShape(shape);
+
+ String expected = "This is an integer.";
+ assertThat(document.getRootSchema().getDescription().get(), equalTo(expected));
+
+ // Asserts that deprecated node is still there
+ assertThat(document.getRootSchema().getExtension("deprecated").get(), equalTo(Node.from(true)));
+ }
+
+ @Test
+ public void disableDefaultDeprecatedMessageStillAllowsCustomMessage() {
+ String message = "Use a.b#D instead.";
+ IntegerShape shape = IntegerShape.builder()
+ .id("a.b#C")
+ .addTrait(DeprecatedTrait.builder().message(message).build())
+ .addTrait(new DocumentationTrait("This is an integer."))
+ .build();
+ Model model = Model.builder().addShape(shape).build();
+ JsonSchemaConfig config = new JsonSchemaConfig();
+ config.setDisableDefaultDeprecatedMessage(true);
+ SchemaDocument document = JsonSchemaConverter.builder()
+ .addMapper(new OpenApiJsonSchemaMapper())
+ .model(model)
+ .config(config)
+ .build()
+ .convertShape(shape);
+
+ String expected = "This is an integer.\nThis shape is deprecated: Use a.b#D instead.";
+ assertThat(document.getRootSchema().getDescription().get(), equalTo(expected));
+ }
+
+ @Test
+ public void disableDefaultDeprecatedMessageStillAllowsSince() {
+ String since = "2020-01-01";
+ IntegerShape shape = IntegerShape.builder()
+ .id("a.b#C")
+ .addTrait(DeprecatedTrait.builder().since(since).build())
+ .addTrait(new DocumentationTrait("This is an integer."))
+ .build();
+ Model model = Model.builder().addShape(shape).build();
+ JsonSchemaConfig config = new JsonSchemaConfig();
+ config.setDisableDefaultDeprecatedMessage(true);
+ SchemaDocument document = JsonSchemaConverter.builder()
+ .addMapper(new OpenApiJsonSchemaMapper())
+ .model(model)
+ .config(config)
+ .build()
+ .convertShape(shape);
+
+ String expected = "This is an integer.\nThis shape is deprecated since 2020-01-01.";
+ assertThat(document.getRootSchema().getDescription().get(), equalTo(expected));
+ }
+
+ @Test
+ public void disableDefaultDeprecatedMessageOnlyAffectsIfTrue() {
+ IntegerShape shape = IntegerShape.builder()
+ .id("a.b#C")
+ .addTrait(DeprecatedTrait.builder().build())
+ .addTrait(new DocumentationTrait("This is an integer."))
+ .build();
+ Model model = Model.builder().addShape(shape).build();
+ JsonSchemaConfig config = new JsonSchemaConfig();
+ config.setDisableDefaultDeprecatedMessage(false);
+ SchemaDocument document = JsonSchemaConverter.builder()
+ .addMapper(new OpenApiJsonSchemaMapper())
+ .model(model)
+ .config(config)
+ .build()
+ .convertShape(shape);
+
+ String expected = "This is an integer.\nThis shape is deprecated.";
+ assertThat(document.getRootSchema().getDescription().get(), equalTo(expected));
+ }
+
@Test
public void supportsInt32() {
IntegerShape shape = IntegerShape.builder().id("a.b#C").build();