GERONIMO-6670 ensure we don't match a mediatype which can't serialize OpenAPI
authorRomain Manni-Bucau <rmannibucau@apache.org>
Fri, 4 Jan 2019 20:48:47 +0000 (21:48 +0100)
committerRomain Manni-Bucau <rmannibucau@apache.org>
Fri, 4 Jan 2019 20:48:47 +0000 (21:48 +0100)
geronimo-openapi-impl/src/main/java/org/apache/geronimo/microprofile/openapi/jaxrs/OpenAPIFilter.java
geronimo-openapi-impl/src/test/java/org/apache/geronimo/microprofile/openapi/test/YamlAnswerTest.java

index 494ac65..da41fed 100644 (file)
@@ -20,10 +20,12 @@ import static javax.ws.rs.Priorities.USER;
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE;
 import static javax.ws.rs.core.MediaType.WILDCARD_TYPE;
 
+import java.lang.annotation.Annotation;
 import java.util.List;
 
 import javax.annotation.Priority;
 import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.Dependent;
 import javax.inject.Inject;
 import javax.ws.rs.HttpMethod;
 import javax.ws.rs.container.ContainerRequestContext;
@@ -34,6 +36,7 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.Provider;
+import javax.ws.rs.ext.Providers;
 
 import org.apache.geronimo.microprofile.openapi.cdi.GeronimoOpenAPIExtension;
 import org.eclipse.microprofile.openapi.models.OpenAPI;
@@ -41,14 +44,19 @@ import org.eclipse.microprofile.openapi.models.OpenAPI;
 // theorically a jaxrs endpoint to benefit from jaxrs tooling and filters - but forbidden by TCK :(
 // @Path("openapi") + @GET
 @Provider
+@Dependent
 @PreMatching
 @Priority(USER)
-@ApplicationScoped
 public class OpenAPIFilter implements ContainerRequestFilter {
 
+    private static final Annotation[] NO_ANNOTATION = new Annotation[0];
+
     @Inject
     private GeronimoOpenAPIExtension extension;
 
+    @Context
+    private Providers providers;
+
     private OpenAPI openApi;
     private MediaType defaultMediaType;
 
@@ -77,7 +85,11 @@ public class OpenAPIFilter implements ContainerRequestFilter {
         if (mediaTypes.isEmpty()) {
             return defaultMediaType;
         }
-        return mediaTypes.stream().filter(it -> !WILDCARD_TYPE.equals(it)).findFirst().orElse(defaultMediaType);
+        return mediaTypes.stream()
+                .filter(it -> !WILDCARD_TYPE.equals(it))
+                .findFirst()
+                .filter(it -> providers.getMessageBodyReader(OpenAPI.class, OpenAPI.class, NO_ANNOTATION, it) != null)
+                .orElse(defaultMediaType);
     }
 
     @Context
index d9215a6..90f95cc 100644 (file)
@@ -17,6 +17,7 @@
 package org.apache.geronimo.microprofile.openapi.test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.net.URL;
 
@@ -43,6 +44,21 @@ public class YamlAnswerTest extends Arquillian {
     private URL base;
 
     @Test
+    public void getWildcard() {
+        assertEquals("---\nopenapi: \"3.0.1\"\n", api("*/*"));
+    }
+
+    @Test
+    public void getMissing() { // some MP server will match json even if default is set to yaml cause */*+json usage
+        assertTrue(api("foo/bar").contains("\"3.0.1\""));
+    }
+
+    @Test
+    public void getTextHtml() {
+        assertTrue(api("text/html").contains("\"3.0.1\""));
+    }
+
+    @Test
     public void getYaml() {
         assertEquals("---\nopenapi: \"3.0.1\"\n", api("text/vnd.yaml"));
     }