diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index b97955a02d..df32dc2958 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -43,13 +43,23 @@ public Schema createProperty() { }, BYTE(Byte.class, "byte") { @Override - public ByteArraySchema createProperty() { + public Schema createProperty() { + if ( + (System.getProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY) != null && System.getProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY).equals(Schema.BynaryStringConversion.BINARY_STRING_CONVERSION_STRING_SCHEMA.toString())) || + (System.getenv(Schema.BINARY_STRING_CONVERSION_PROPERTY) != null && System.getenv(Schema.BINARY_STRING_CONVERSION_PROPERTY).equals(Schema.BynaryStringConversion.BINARY_STRING_CONVERSION_STRING_SCHEMA.toString()))) { + return new StringSchema().format("byte"); + } return new ByteArraySchema(); } }, BINARY(Byte.class, "binary") { @Override - public BinarySchema createProperty() { + public Schema createProperty() { + if ( + (System.getProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY) != null && System.getProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY).equals(Schema.BynaryStringConversion.BINARY_STRING_CONVERSION_STRING_SCHEMA.toString())) || + (System.getenv(Schema.BINARY_STRING_CONVERSION_PROPERTY) != null && System.getenv(Schema.BINARY_STRING_CONVERSION_PROPERTY).equals(Schema.BynaryStringConversion.BINARY_STRING_CONVERSION_STRING_SCHEMA.toString()))) { + return new StringSchema().format("binary"); + } return new BinarySchema(); } }, diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BinaryParameterResourceTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BinaryParameterResourceTest.java index 975039bccb..03c16c58bb 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BinaryParameterResourceTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/BinaryParameterResourceTest.java @@ -2,14 +2,44 @@ import java.io.IOException; +import io.swagger.v3.oas.models.media.Schema; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import io.swagger.v3.jaxrs2.annotations.AbstractAnnotationTest; import io.swagger.v3.jaxrs2.resources.BinaryParameterResource; public class BinaryParameterResourceTest extends AbstractAnnotationTest { - @Test(description = "check binary model serialization") // tests issue #2466 - public void shouldSerializeBinaryParameter() throws IOException { - compareAsYaml(BinaryParameterResource.class, getOpenAPIAsString("BinaryParameterResource.yaml")); + + @Test(description = "check binary model serialization with base64", singleThreaded = true) // tests issue #2466 + public void shouldSerializeBinaryParameterBase64() throws IOException { + try { + System.setProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY, Schema.BynaryStringConversion.BINARY_STRING_CONVERSION_BASE64.toString()); + compareAsYaml(BinaryParameterResource.class, getOpenAPIAsString("BinaryParameterResource.yaml")); + } finally { + System.clearProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY); + } + } + + @BeforeTest + public void before() { + System.clearProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY); + } + + @AfterTest + public void after() { + System.clearProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY); + } + + + @Test(description = "check binary model serialization with StringSchema", singleThreaded = true) // tests issue #2466 + public void shouldSerializeBinaryParameterStringSchema() throws IOException { + try { + System.setProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY, Schema.BynaryStringConversion.BINARY_STRING_CONVERSION_STRING_SCHEMA.toString()); + compareAsYaml(BinaryParameterResource.class, getOpenAPIAsString("BinaryParameterResource.yaml")); + } finally { + System.clearProperty(Schema.BINARY_STRING_CONVERSION_PROPERTY); + } } } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Item.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Item.java index 02f8139734..eb3af47c96 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Item.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Item.java @@ -9,7 +9,9 @@ public class Item { private byte[] bytes; @Schema(format = "binary", example = "YmluYXJ5") private byte[] binary; - + + private byte[] byteNoAnnotation; + public Item() { } @@ -44,4 +46,12 @@ public void setBytes(byte[] bytes) { public byte[] getBytes() { return bytes; } + + public void setByteNoAnnotation(byte[] byteNoAnnotation) { + this.byteNoAnnotation = byteNoAnnotation; + } + + public byte[] getByteNoAnnotation() { + return byteNoAnnotation; + } } diff --git a/modules/swagger-jaxrs2/src/test/resources/BinaryParameterResource.yaml b/modules/swagger-jaxrs2/src/test/resources/BinaryParameterResource.yaml index aba9dd0f06..ad05aac34b 100644 --- a/modules/swagger-jaxrs2/src/test/resources/BinaryParameterResource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/BinaryParameterResource.yaml @@ -37,4 +37,6 @@ components: type: string format: binary example: YmluYXJ5 - \ No newline at end of file + byteNoAnnotation: + type: string + format: byte diff --git a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/BinarySchema.java b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/BinarySchema.java index 15444ef1de..2ad6c24d2d 100644 --- a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/BinarySchema.java +++ b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/BinarySchema.java @@ -37,12 +37,16 @@ protected byte[] cast(Object value) { try { if (value instanceof byte[]) { return (byte[]) value; + } else if (value instanceof String) { + if ( + (System.getProperty(BINARY_STRING_CONVERSION_PROPERTY) != null && System.getProperty(BINARY_STRING_CONVERSION_PROPERTY).equals(BynaryStringConversion.BINARY_STRING_CONVERSION_BASE64.toString())) || + (System.getenv(BINARY_STRING_CONVERSION_PROPERTY) != null && System.getenv(BINARY_STRING_CONVERSION_PROPERTY).equals(BynaryStringConversion.BINARY_STRING_CONVERSION_BASE64.toString()))) { + return Base64.getDecoder().decode((String) value); + } + return value.toString().getBytes(); } else { return value.toString().getBytes(); } - if (value instanceof String) { - return Base64.getDecoder().decode((String) value); - } } catch (Exception e) { } } diff --git a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/ByteArraySchema.java b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/ByteArraySchema.java index 1b3170d61e..abfc58501e 100644 --- a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/ByteArraySchema.java +++ b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/ByteArraySchema.java @@ -37,12 +37,16 @@ protected byte[] cast(Object value) { try { if (value instanceof byte[]) { return (byte[]) value; + } else if (value instanceof String) { + if ( + (System.getProperty(BINARY_STRING_CONVERSION_PROPERTY) != null && System.getProperty(BINARY_STRING_CONVERSION_PROPERTY).equals(BynaryStringConversion.BINARY_STRING_CONVERSION_BASE64.toString())) || + (System.getenv(BINARY_STRING_CONVERSION_PROPERTY) != null && System.getenv(BINARY_STRING_CONVERSION_PROPERTY).equals(BynaryStringConversion.BINARY_STRING_CONVERSION_BASE64.toString()))) { + return Base64.getDecoder().decode((String) value); + } + return value.toString().getBytes(); } else { return value.toString().getBytes(); } - if (value instanceof String) { - return Base64.getDecoder().decode((String) value); - } } catch (Exception e) { } } diff --git a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/Schema.java b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/Schema.java index c367870b67..8872a74c2c 100644 --- a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/Schema.java +++ b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/Schema.java @@ -27,6 +27,22 @@ public class Schema { public static final String BIND_TYPE_AND_TYPES = "bind-type"; + public static final String BINARY_STRING_CONVERSION_PROPERTY = "binary-string-conversion"; + public enum BynaryStringConversion { + BINARY_STRING_CONVERSION_BASE64("base64"), + BINARY_STRING_CONVERSION_DEFAULT_CHARSET("default"), + BINARY_STRING_CONVERSION_STRING_SCHEMA("string-schema"); + private String value; + + BynaryStringConversion(String value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + } protected T _default;