You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2018/05/17 02:11:51 UTC

[cxf] branch master updated: Fixed overrides of the OpenAPI properties from OpenApiCustomizer. Added more test cases, fixed a couple of issues with OpenApiParseUtils

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new ea00423  Fixed overrides of the OpenAPI properties from OpenApiCustomizer. Added more test cases, fixed a couple of issues with OpenApiParseUtils
ea00423 is described below

commit ea0042333d2047cccb647c7d44ca7ebaf4d9bcd7
Author: reta <dr...@gmail.com>
AuthorDate: Wed May 16 22:07:15 2018 -0400

    Fixed overrides of the OpenAPI properties from OpenApiCustomizer. Added more test cases, fixed a couple of issues with OpenApiParseUtils
---
 .../jaxrs/openapi/OpenApiCustomizedResource.java   |  45 ++++++-
 .../cxf/jaxrs/openapi/parse/OpenApiParseUtils.java |  13 +-
 .../AbstractOpenApiServiceDescriptionTest.java     |  41 ++++++-
 .../description/openapi/BookStoreOpenApi.java      |   2 +-
 .../openapi/OpenApiCustomizerSubclassTest.java     | 131 +++++++++++++++++++++
 5 files changed, 217 insertions(+), 15 deletions(-)

diff --git a/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiCustomizedResource.java b/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiCustomizedResource.java
index 97931ae..a626c24 100644
--- a/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiCustomizedResource.java
+++ b/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/OpenApiCustomizedResource.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cxf.jaxrs.openapi;
 
+import java.util.Objects;
+
 import javax.servlet.ServletConfig;
 import javax.ws.rs.GET;
 import javax.ws.rs.PathParam;
@@ -35,6 +37,7 @@ import io.swagger.v3.oas.integration.GenericOpenApiContext;
 import io.swagger.v3.oas.integration.OpenApiContextLocator;
 import io.swagger.v3.oas.integration.api.OpenAPIConfiguration;
 import io.swagger.v3.oas.integration.api.OpenApiContext;
+import io.swagger.v3.oas.models.OpenAPI;
 
 public class OpenApiCustomizedResource extends OpenApiResource {
 
@@ -58,14 +61,50 @@ public class OpenApiCustomizedResource extends OpenApiResource {
             // changes won't be taken into account (due to the deep copying rather than reference 
             // passing). In order to reflect any changes which customization may do, we have to 
             // update reader's configuration directly.
-            final String ctxId = ServletConfigContextUtils.getContextIdFromServletConfig(config);
-            final OpenApiContext ctx = OpenApiContextLocator.getInstance().getOpenApiContext(ctxId);
+            OpenApiContext ctx = getOpenApiContext(config);
+            if (ctx == null) {
+                // If there is no context associated with the servlet config, let us
+                // try to fallback to default one. 
+                ctx = getOpenApiContext(null);
+            }
+            
             if (ctx instanceof GenericOpenApiContext<?>) {
                 ((GenericOpenApiContext<?>) ctx).getOpenApiReader().setConfiguration(configuration);
-                customizer.customize(ctx.read());
+                
+                final OpenAPI oas = ctx.read();
+                customizer.customize(oas);
+                
+                if (!Objects.equals(configuration.getOpenAPI().getInfo(), oas.getInfo())) {
+                    configuration.getOpenAPI().setInfo(oas.getInfo());
+                }
+                
+                if (!Objects.equals(configuration.getOpenAPI().getComponents(), oas.getComponents())) {
+                    configuration.getOpenAPI().setComponents(oas.getComponents());
+                }
+                
+                if (!Objects.equals(configuration.getOpenAPI().getExternalDocs(), oas.getExternalDocs())) {
+                    configuration.getOpenAPI().setExternalDocs(oas.getExternalDocs());
+                }
+                
+                if (!Objects.equals(configuration.getOpenAPI().getPaths(), oas.getPaths())) {
+                    configuration.getOpenAPI().setPaths(oas.getPaths());
+                }
+                
+                if (!Objects.equals(configuration.getOpenAPI().getTags(), oas.getTags())) {
+                    configuration.getOpenAPI().setTags(oas.getTags());
+                }
+                
+                if (!Objects.equals(configuration.getOpenAPI().getExtensions(), oas.getExtensions())) {
+                    configuration.getOpenAPI().setExtensions(oas.getExtensions());
+                }
             }
         }
 
         return super.getOpenApi(headers, uriInfo, type);
     }
+
+    private OpenApiContext getOpenApiContext(ServletConfig config) {
+        final String ctxId = ServletConfigContextUtils.getContextIdFromServletConfig(config);
+        return OpenApiContextLocator.getInstance().getOpenApiContext(ctxId);
+    }
 }
diff --git a/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/parse/OpenApiParseUtils.java b/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/parse/OpenApiParseUtils.java
index 985bd53..63d5e60 100644
--- a/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/parse/OpenApiParseUtils.java
+++ b/rt/rs/description-openapi-v3/src/main/java/org/apache/cxf/jaxrs/openapi/parse/OpenApiParseUtils.java
@@ -203,6 +203,7 @@ public final class OpenApiParseUtils {
                     opTags = Collections.singletonList("");
                 }
                 for (String opTag : opTags) {
+                    userOpsMap.putIfAbsent(opTag, new LinkedList<UserOperation>());
                     userOpsMap.get(opTag).add(userOp);
                 }
 
@@ -212,11 +213,13 @@ public final class OpenApiParseUtils {
         List<UserResource> resources = new LinkedList<UserResource>();
 
         for (Map.Entry<String, List<UserOperation>> entry : userOpsMap.entrySet()) {
-            UserResource ur = new UserResource();
-            ur.setPath("/");
-            ur.setOperations(entry.getValue());
-            ur.setName(entry.getKey());
-            resources.add(ur);
+            if (!entry.getValue().isEmpty()) {
+                UserResource ur = new UserResource();
+                ur.setPath("/");
+                ur.setOperations(entry.getValue());
+                ur.setName(entry.getKey());
+                resources.add(ur);
+            }
         }
 
         app.setResources(resources);
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/AbstractOpenApiServiceDescriptionTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/AbstractOpenApiServiceDescriptionTest.java
index d81ff8a..43ef918 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/AbstractOpenApiServiceDescriptionTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/AbstractOpenApiServiceDescriptionTest.java
@@ -178,16 +178,45 @@ public abstract class AbstractOpenApiServiceDescriptionTest extends AbstractBusC
             assertEquals(1, delOpParams.size());
             assertEquals(ParameterType.PATH, delOpParams.get(0).getType());
 
-            assertThat(swaggerJson, CoreMatchers.containsString(CONTACT));
-            assertThat(swaggerJson, CoreMatchers.containsString(TITLE));
-            assertThat(swaggerJson, CoreMatchers.containsString(DESCRIPTION));
-            assertThat(swaggerJson, CoreMatchers.containsString(LICENSE));
-            assertThat(swaggerJson, CoreMatchers.containsString(LICENSE_URL));
-            assertThat(swaggerJson, CoreMatchers.containsString(SECURITY_DEFINITION_NAME));
+            assertThat(swaggerJson, CoreMatchers.containsString(getContract()));
+            assertThat(swaggerJson, CoreMatchers.containsString(getTitle()));
+            assertThat(swaggerJson, CoreMatchers.containsString(getDescription()));
+            assertThat(swaggerJson, CoreMatchers.containsString(getLicense()));
+            assertThat(swaggerJson, CoreMatchers.containsString(getLicenseUrl()));
+            assertThat(swaggerJson, CoreMatchers.containsString(getSecurityDefinitionName()));
+            assertThat(swaggerJson, CoreMatchers.containsString(getTags()));
         } finally {
             client.close();
         }
     }
+    
+    protected String getTags() {
+        return "";
+    }
+    
+    protected String getSecurityDefinitionName() {
+        return SECURITY_DEFINITION_NAME;
+    }
+
+    protected String getLicenseUrl() {
+        return LICENSE_URL;
+    }
+
+    protected String getLicense() {
+        return LICENSE;
+    }
+
+    protected String getDescription() {
+        return DESCRIPTION;
+    }
+
+    protected String getTitle() {
+        return TITLE;
+    }
+
+    protected String getContract() {
+        return CONTACT;
+    }
 
     @Test
     public void testNonUiResource() {
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/BookStoreOpenApi.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/BookStoreOpenApi.java
index 44d59ca..3ae4356 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/BookStoreOpenApi.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/BookStoreOpenApi.java
@@ -84,7 +84,7 @@ public class BookStoreOpenApi {
     @Path("/{id}")
     @DELETE
     @Operation(
-        description = "Get book by Id",
+        description = "Delete book by Id",
         responses = @ApiResponse(responseCode = "200")
     )
     public Response delete(@Parameter(required = true) @PathParam("id") String id) {
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/OpenApiCustomizerSubclassTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/OpenApiCustomizerSubclassTest.java
new file mode 100644
index 0000000..633dfc5
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/description/openapi/OpenApiCustomizerSubclassTest.java
@@ -0,0 +1,131 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.systest.jaxrs.description.openapi;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.jaxrs.model.doc.JavaDocProvider;
+import org.apache.cxf.jaxrs.openapi.OpenApiCustomizer;
+import org.apache.cxf.jaxrs.openapi.OpenApiFeature;
+
+import io.swagger.v3.oas.models.security.SecurityScheme;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class OpenApiCustomizerSubclassTest extends AbstractOpenApiServiceDescriptionTest {
+    private static final String PORT = allocatePort(OpenApiCustomizerSubclassTest.class);
+
+    public static class OpenApiRegular extends Server {
+        public OpenApiRegular() {
+            super(PORT, false);
+        }
+
+        public static void main(String[] args) {
+            start(new OpenApiRegular());
+        }
+        
+        @Override
+        protected void run() {
+            final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+            sf.setResourceClasses(BookStoreOpenApi.class);
+            sf.setResourceClasses(BookStoreStylesheetsOpenApi.class);
+            sf.setResourceProvider(BookStoreOpenApi.class,
+                new SingletonResourceProvider(new BookStoreOpenApi()));
+            sf.setProvider(new JacksonJsonProvider());
+            final OpenApiFeature feature = createOpenApiFeature();
+            sf.setFeatures(Arrays.asList(feature));
+            sf.setAddress("http://localhost:" + port + "/");
+            sf.create();
+        }
+
+        
+        @Override
+        protected OpenApiFeature createOpenApiFeature() {
+            final OpenApiCustomizer customizer = new OpenApiCustomizer() {
+                public void customize(io.swagger.v3.oas.models.OpenAPI oas) {
+                    super.customize(oas);
+                    oas.getInfo().setDescription("Custom Description");
+                    oas.getInfo().getLicense().setName("Custom License");
+                    oas.getComponents().getSecuritySchemes().put("openid", new SecurityScheme());
+                }
+            };
+            
+            customizer.setJavadocProvider(new JavaDocProvider());
+            customizer.setDynamicBasePath(true);
+            customizer.setReplaceTags(true);
+            
+            final OpenApiFeature feature = super.createOpenApiFeature();
+            feature.setCustomizer(customizer);
+            feature.setScan(false);
+            feature.setResourcePackages(Collections.singleton(getClass().getPackage().getName()));
+
+            return feature;
+        }
+    }
+    
+    @Override
+    protected String getDescription() {
+        return "Custom Description";
+    }
+
+    @Override
+    protected String getLicense() {
+        return "Custom License";
+    }
+    
+    @Override
+    protected String getSecurityDefinitionName() {
+        return "openid";
+    }
+
+    @Override
+    protected String getTags() {
+        return "_bookstore";
+    }
+
+    @BeforeClass
+    public static void startServers() throws Exception {
+        startServers(OpenApiRegular.class);
+    }
+
+    @Override
+    protected String getPort() {
+        return PORT;
+    }
+
+    @Override
+    protected String getBaseUrl() {
+        return "http://localhost:" + getPort() + getApplicationPath();
+    }
+
+    protected String getApplicationPath() {
+        return "";
+    }
+
+    @Test
+    public void testApiListingIsProperlyReturnedJSON() throws Exception {
+        doTestApiListingIsProperlyReturnedJSON(false, "http://localhost:" + getPort());
+    }
+}

-- 
To stop receiving notification emails like this one, please contact
reta@apache.org.