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());