GERONIMO-6739 better handling of JSON-P types
diff --git a/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/cdi/GeronimoOpenAPIExtension.java b/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/cdi/GeronimoOpenAPIExtension.java
index 660dda5..ba05f10 100644
--- a/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/cdi/GeronimoOpenAPIExtension.java
+++ b/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/cdi/GeronimoOpenAPIExtension.java
@@ -173,7 +173,7 @@
final Instance<ServletContext> servletContextInstance = current.select(ServletContext.class);
final boolean appendContextPath = Boolean.valueOf(config.read("application.append-context-path", "true"));
String contextPath = "";
- if (appendContextPath && servletContextInstance.isResolvable()) {
+ if (appendContextPath && !servletContextInstance.isAmbiguous() && !servletContextInstance.isUnsatisfied()) {
contextPath = servletContextInstance.get().getContextPath();
}
@@ -196,7 +196,7 @@
final Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(value.trim());
try {
final Instance<?> instance = current.select(clazz);
- if (instance.isResolvable()) {
+ if (!instance.isAmbiguous() && !instance.isUnsatisfied()) { // isResolvable is not always there
return instance.get();
}
} catch (final RuntimeException e) {
diff --git a/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/AnnotationProcessor.java b/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/AnnotationProcessor.java
index 7bef43e..ab0fd73 100644
--- a/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/AnnotationProcessor.java
+++ b/geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/impl/processor/AnnotationProcessor.java
@@ -287,7 +287,14 @@
});
ofNullable(m.getAnnotation(SecurityScheme.class))
- .ifPresent(s -> api.getComponents().addSecurityScheme(s.ref(), mapSecurityScheme(s)));
+ .ifPresent(s -> {
+ org.eclipse.microprofile.openapi.models.Components components = api.getComponents();
+ if (components == null) {
+ components = new ComponentsImpl();
+ api.setComponents(components);
+ }
+ components.addSecurityScheme(s.ref(), mapSecurityScheme(s));
+ });
ofNullable(m.getAnnotationsByType(Extension.class))
.map(this::mapExtensions)
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 1ac7237..19f88c8 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
@@ -42,6 +42,11 @@
import java.util.function.Supplier;
import java.util.stream.Stream;
+import javax.json.JsonArray;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonString;
+import javax.json.JsonValue;
import javax.json.bind.annotation.JsonbProperty;
import javax.ws.rs.core.Response;
@@ -101,18 +106,26 @@
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.BOOLEAN);
} else if (Boolean.class == model) {
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.BOOLEAN).nullable(true);
- } else if (String.class == model) {
+ } else if (String.class == model || JsonString.class == model) {
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.STRING);
} else if (double.class == model || float.class == model) {
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.NUMBER);
- } else if (Double.class == model || Float.class == model) {
+ } else if (Double.class == model || Float.class == model || JsonNumber.class == model) {
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.NUMBER).nullable(true);
} else if (int.class == model || short.class == model || byte.class == model || long.class == model) {
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.INTEGER);
} else if (Integer.class == model || Short.class == model || Byte.class == model || Long.class == model) {
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.INTEGER).nullable(true);
- } else if (Response.class == model) {
- schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.OBJECT).nullable(true);
+ } else if (Response.class == model || JsonObject.class == model || JsonValue.class == model) {
+ schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.OBJECT)
+ .nullable(true)
+ .properties(new HashMap<>());
+ } else if (JsonArray.class == model) {
+ schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.ARRAY)
+ .nullable(true)
+ .items(new SchemaImpl()
+ .type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.OBJECT)
+ .properties(new HashMap<>()));
} else if (isStringable(model)) {
schema.type(org.eclipse.microprofile.openapi.models.media.Schema.SchemaType.STRING).nullable(true);
} else {
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 eb67714..1de7488 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
@@ -25,6 +25,9 @@
import java.util.function.Supplier;
import java.util.stream.Stream;
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.JsonValue;
import javax.json.bind.annotation.JsonbProperty;
import org.apache.geronimo.microprofile.openapi.impl.model.ComponentsImpl;
@@ -35,6 +38,17 @@
public class SchemaProcessorTest {
@Test
+ public void mapJsonp() {
+ Stream.of(JsonValue.class, JsonObject.class).forEach(it -> {
+ final Schema schema = new SchemaProcessor().mapSchemaFromClass(newComponentsProvider(), JsonValue.class);
+ assertEquals(schema.getProperties().size(), 0);
+ assertEquals(Schema.SchemaType.OBJECT, schema.getType());
+ });
+ final Schema schema = new SchemaProcessor().mapSchemaFromClass(newComponentsProvider(), JsonArray.class);
+ assertEquals(Schema.SchemaType.ARRAY, schema.getType());
+ }
+
+ @Test
public void mapImplicit() {
final Schema schema = new SchemaProcessor().mapSchemaFromClass(newComponentsProvider(), Data.class);
assertEquals(1, schema.getProperties().size());