Add swagger-ui
authorBruno Sakoto <bruno.sakoto@bell.ca>
Wed, 7 Oct 2020 02:09:58 +0000 (22:09 -0400)
committerBruno Sakoto <bruno.sakoto@bell.ca>
Mon, 19 Oct 2020 20:29:53 +0000 (16:29 -0400)
It is available at http://{{host}}:{{port}}/swagger-ui/index.html

Link: https://jira.onap.org/browse/CCSDK-2895
Issue-ID: CCSDK-2895
Signed-off-by: Bruno Sakoto <bruno.sakoto@bell.ca>
Change-Id: I5e8e39c90354506206bc43dfafbc11d0e62eee28

cps/README.md
cps/cps-rest/pom.xml
cps/cps-rest/src/main/java/org/onap/cps/rest/config/JerseyConfig.java
cps/cps-rest/src/main/resources/application.yml
cps/cps-service/src/main/java/org/onap/cps/api/impl/CpServiceImpl.java
cps/pom.xml

index b6131a1..791015e 100644 (file)
@@ -1,7 +1,34 @@
 # Configuration & Persistency Service
 
-This folder contains all files for 
+This folder contains all files for
 [Configuration & Persistency Service](https://wiki.onap.org/pages/viewpage.action?pageId=81406119).
 
-The code here is related to CPS POC, then it must be kept self contained in this cps folder to prevent any impact on 
-current ccsdk components and to be ready to be moved in its own repo once CPS becomes a standalone project.
\ No newline at end of file
+The code here is related to CPS POC, then it must be kept self contained in this cps folder to prevent any impact on
+current ccsdk components and to be ready to be moved in its own repo once CPS becomes a standalone project.
+
+
+## Running Locally
+
+* Run a postgres container instance and create `cpsdb' database:
+
+```
+CREATE USER cps WITH PASSWORD 'cps';
+CREATE DATABASE cpsdb OWNER cps;
+```
+
+* Build (from cps root folder)
+
+```bash
+mvn clean package
+```
+
+* Run (from cps root folder)
+
+```bash
+java -DDB_HOST=localhost -DDB_USERNAME=cps -DDB_PASSWORD=cps -jar cps-rest/target/cps-rest-0.0.1-SNAPSHOT.jar
+```
+
+* Browse
+  * [Swagger UI](http://localhost:8080/swagger-ui/index.html)
+  * OpenAPI Specification in [JSON](http://localhost:8080/api/cps/openapi.json)
+   or [YAML](http://localhost:8080/api/cps/openapi.yaml) format
index 2b4cbb8..274e57f 100644 (file)
             <artifactId>jersey-media-multipart</artifactId>\r
         </dependency>\r
 \r
+        <dependency>\r
+            <groupId>org.springframework</groupId>\r
+            <artifactId>spring-webmvc</artifactId>\r
+        </dependency>\r
+\r
         <dependency>\r
             <groupId>org.springframework.boot</groupId>\r
             <artifactId>spring-boot-starter-jersey</artifactId>\r
                     </execution>\r
                 </executions>\r
             </plugin>\r
+            <plugin>\r
+                <!-- Download Swagger UI webjar. -->\r
+                <groupId>org.apache.maven.plugins</groupId>\r
+                <artifactId>maven-dependency-plugin</artifactId>\r
+                <version>${maven-dependency-plugin.version}</version>\r
+                <executions>\r
+                    <execution>\r
+                        <phase>prepare-package</phase>\r
+                        <goals>\r
+                            <goal>unpack</goal>\r
+                        </goals>\r
+                        <configuration>\r
+                            <artifactItems>\r
+                                <artifactItem>\r
+                                    <groupId>org.webjars</groupId>\r
+                                    <artifactId>swagger-ui</artifactId>\r
+                                    <version>${swagger-ui.version}</version>\r
+                                </artifactItem>\r
+                            </artifactItems>\r
+                            <outputDirectory>${project.build.directory}/swagger-ui-${swagger-ui.version}</outputDirectory>\r
+                        </configuration>\r
+                    </execution>\r
+                </executions>\r
+            </plugin>\r
+            <plugin>\r
+                <!-- Copy Swagger UI resources to static resources directory. -->\r
+                <groupId>org.apache.maven.plugins</groupId>\r
+                <artifactId>maven-resources-plugin</artifactId>\r
+                <version>${maven-resources-plugin.version}</version>\r
+                <executions>\r
+                    <execution>\r
+                        <id>copy-resources</id>\r
+                        <phase>prepare-package</phase>\r
+                        <goals>\r
+                            <goal>copy-resources</goal>\r
+                        </goals>\r
+                        <configuration>\r
+                            <outputDirectory>${project.build.outputDirectory}/static/swagger-ui</outputDirectory>\r
+                            <resources>\r
+                                <resource>\r
+                                    <directory>${project.build.directory}/swagger-ui-${swagger-ui.version}/META-INF/resources/webjars/swagger-ui/${swagger-ui.version}/</directory>\r
+                                    <excludes>\r
+                                        <exclude>**/*.gz</exclude>\r
+                                    </excludes>\r
+                                </resource>\r
+                            </resources>\r
+                        </configuration>\r
+                    </execution>\r
+                </executions>\r
+            </plugin>\r
+            <plugin>\r
+                <!-- Replace the OpenAPI specification example URL with the local one. -->\r
+                <groupId>com.google.code.maven-replacer-plugin</groupId>\r
+                <artifactId>replacer</artifactId>\r
+                <version>${maven-replacer-plugin.version}</version>\r
+                <executions>\r
+                    <execution>\r
+                        <phase>prepare-package</phase>\r
+                        <goals>\r
+                            <goal>replace</goal>\r
+                        </goals>\r
+                    </execution>\r
+                </executions>\r
+                <configuration>\r
+                    <file>${project.build.outputDirectory}/static/swagger-ui/index.html</file>\r
+                    <replacements>\r
+                        <replacement>\r
+                            <token>https://petstore.swagger.io/v2/swagger.json</token>\r
+                            <value>/api/cps/openapi.json</value>\r
+                        </replacement>\r
+                    </replacements>\r
+                </configuration>\r
+            </plugin>\r
         </plugins>\r
     </build>\r
 </project>\r
index 290ad5d..ac781d3 100644 (file)
@@ -28,6 +28,9 @@ import javax.annotation.PostConstruct;
 import javax.ws.rs.ApplicationPath;\r
 import org.glassfish.jersey.media.multipart.MultiPartFeature;\r
 import org.glassfish.jersey.server.ResourceConfig;\r
+import org.glassfish.jersey.servlet.ServletProperties;\r
+import org.onap.cps.rest.controller.ModelController;\r
+import org.onap.cps.rest.controller.RestController;\r
 import org.springframework.context.annotation.Configuration;\r
 \r
 @Configuration\r
@@ -43,8 +46,12 @@ public class JerseyConfig extends ResourceConfig {
         register(OpenApiResource.class);\r
         register(AcceptHeaderOpenApiResource.class);\r
 \r
-        packages("org.onap.cps.rest.controller");\r
+        // Register controllers\r
+        register(ModelController.class);\r
+        register(RestController.class);\r
+\r
         configureSwagger();\r
+        configureSwaggerUI();\r
     }\r
 \r
     private void configureSwagger() {\r
@@ -54,4 +61,12 @@ public class JerseyConfig extends ResourceConfig {
             throw new RuntimeException(e.getMessage(), e);\r
         }\r
     }\r
+\r
+    private void configureSwaggerUI() {\r
+        // Enable Jersey filter forwarding to next filter for 404 responses.\r
+        // This configuration lets Jersey servlet container forwarding static swagger ui requests to spring mvc filter\r
+        // to be handle by spring mvc dispatcher servlet.\r
+        property(ServletProperties.FILTER_FORWARD_ON_404, true);\r
+    }\r
+\r
 }\r
index 5cfa974..c9154ba 100644 (file)
@@ -19,6 +19,8 @@ spring:
         password: ${DB_PASSWORD}\r
         driverClassName: org.postgresql.Driver\r
         initialization-mode: always\r
+    jersey:\r
+        type: filter\r
 \r
 logging:\r
     level:\r
index 4113fbc..f9d066e 100644 (file)
@@ -77,8 +77,7 @@ public class CpServiceImpl implements CpService {
     @Override
     public final void storeSchemaContext(final SchemaContext schemaContext) {
         for (final Module module : schemaContext.getModules()) {
-            modelPersistencyService.storeModule(module.getName(), module.toString(),
-                module.getRevision().toString());
+            modelPersistencyService.storeModule(module.getName(), module.toString(), module.getRevision().toString());
         }
     }
 }
index d81ee9e..c70af6b 100644 (file)
     <swagger.version>2.1.4</swagger.version>\r
     <groovy.version>3.0.6</groovy.version>\r
     <spock-core.version>2.0-M2-groovy-3.0</spock-core.version>\r
+    <maven-dependency-plugin.version>3.1.2</maven-dependency-plugin.version>\r
+    <maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>\r
+    <maven-replacer-plugin.version>1.5.3</maven-replacer-plugin.version>\r
+    <swagger-ui.version>3.35.0</swagger-ui.version>\r
   </properties>\r
 \r
   <dependencyManagement>\r