[GERONIMO-6775] ensure json examples are properly parsed in openapi
diff --git a/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessor.java b/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessor.java index 5e78295..09552a3 100644 --- a/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessor.java +++ b/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessor.java
@@ -18,11 +18,13 @@ import static java.beans.Introspector.decapitalize; import static java.util.Arrays.asList; +import static java.util.Collections.emptyMap; import static java.util.Optional.of; import static java.util.Optional.ofNullable; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; +import java.io.StringReader; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -42,9 +44,12 @@ import java.util.function.Supplier; import java.util.stream.Stream; +import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonNumber; import javax.json.JsonObject; +import javax.json.JsonReader; +import javax.json.JsonReaderFactory; import javax.json.JsonString; import javax.json.JsonValue; import javax.json.bind.annotation.JsonbProperty; @@ -61,6 +66,7 @@ private final Map<Type, org.eclipse.microprofile.openapi.models.media.Schema> cache = new HashMap<>(); private final Map<Class<?>, String> providedRefs = new HashMap<>(); private final Class<?> persistenceCapable; + private final JsonReaderFactory jsonReaderFactory; public SchemaProcessor() { Class<?> pc = null; @@ -70,6 +76,7 @@ } catch (final NoClassDefFoundError | ClassNotFoundException e) { // no-op } + jsonReaderFactory = Json.createReaderFactory(emptyMap()); persistenceCapable = pc; } @@ -381,6 +388,15 @@ impl.example(Integer.parseInt(example)); } else if (type == boolean.class || type == Boolean.class) { impl.example(Boolean.parseBoolean(example)); + } else if (type == String.class) { + impl.example(example); + } else if ((example.startsWith("{") && example.endsWith("}")) || + (example.startsWith("[") && example.endsWith("}"))) { + try (final JsonReader reader = jsonReaderFactory.createReader(new StringReader(example))) { + impl.example(reader.readValue()); + } catch (final Exception e) { + impl.example(example); + } } else { impl.example(example); }
diff --git a/geronimo-openapi-impl/src/test/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessorTest.java b/geronimo-openapi-impl/src/test/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessorTest.java index 92c184a..2a0e1ec 100644 --- a/geronimo-openapi-impl/src/test/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessorTest.java +++ b/geronimo-openapi-impl/src/test/java/org/apache/geronimo/microprofile/openapi/impl/processor/SchemaProcessorTest.java
@@ -45,7 +45,7 @@ assertEquals(Schema.SchemaType.OBJECT, schema.getType()); assertEquals("" + "d=1.5 (java.lang.Double)\n" + - "data={\"name\":\"ok\"} (java.lang.String)\n" + + "data={\"name\":\"ok\"} (org.apache.johnzon.core.JsonObjectImpl)\n" + "i=1 (java.lang.Integer)\n" + "l=2 (java.lang.Integer)\n" + "str=ok (java.lang.String)\n" +