serving swagger api doc in production mode (default) from static files:
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Mon, 22 Feb 2016 16:34:19 +0000 (17:34 +0100)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Mon, 22 Feb 2016 16:35:28 +0000 (17:35 +0100)
  - default spring profile with StaticSwaggerApiDoc controller
  - swagger spring profiles with generically generated documentaiton only for integration test environments
  - creating the resulting war file after running the integration tests
  - during integration tests the SwaggerGroupsIT class fetches the dynamically provided documentation

14 files changed:
cdmlib-remote-webapp/ide/eclipse/Jetty Launcher/cdmlib-remote-webapp - profile.launch
cdmlib-remote-webapp/ide/eclipse/Jetty Launcher/cdmlib-remote-webapp - run.launch
cdmlib-remote-webapp/pom.xml
cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/CdmSpringMVCConfig.java
cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/CdmSpringMVCConfigDefault.java [new file with mode: 0644]
cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/SwaggerGroupsConfig.java [new file with mode: 0644]
cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/staticSwagger/StaticSwaggerApiDoc.java [new file with mode: 0644]
cdmlib-remote-webapp/src/main/resources/api-docs-static/README [new file with mode: 0644]
cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/ClassificationIT.java
cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/SwaggerGroupsIT.java [new file with mode: 0644]
cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/WebServiceTestBase.java [new file with mode: 0644]
cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/config/CdmSpringMVCConfigWithSwagger.java [new file with mode: 0644]
cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/config/CdmSwaggerConfig.java [moved from cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/CdmSwaggerConfig.java with 92% similarity]
cdmlib-remote-webapp/src/test/resources/log4j.properties

index 02abbbb001f9ca646d572a0c6b826206c37645f5..bd69c8c5a98daeeb28d8e96b1c295f2b6241af1a 100644 (file)
 <booleanAttribute key="net.sourceforge.eclipsejetty.launcher.scope.provided.exclude" value="true"/>
 <booleanAttribute key="net.sourceforge.eclipsejetty.launcher.scope.runtime.exclude" value="false"/>
 <booleanAttribute key="net.sourceforge.eclipsejetty.launcher.scope.system.exclude" value="true"/>
-<booleanAttribute key="net.sourceforge.eclipsejetty.launcher.scope.test.exclude" value="true"/>
+<booleanAttribute key="net.sourceforge.eclipsejetty.launcher.scope.test.exclude" value="false"/>
 <intAttribute key="net.sourceforge.eclipsejetty.launcher.threadPool.limit.count" value="16"/>
 <booleanAttribute key="net.sourceforge.eclipsejetty.launcher.threadPool.limit.enabled" value="false"/>
 <stringAttribute key="net.sourceforge.eclipsejetty.launcher.webappdir" value="src/main/webapp"/>
+<mapAttribute key="org.eclipse.debug.core.environmentVariables">
+<mapEntry key="LD_LIBRARY_PATH" value="/opt/libyjpagent"/>
+</mapAttribute>
 <stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
 <stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;sourceLookupDirector&gt;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-commons/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-ext/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-io/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-model/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-persistence/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-remote/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-remote-webapp/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;folder nest=&amp;quot;true&amp;quot; path=&amp;quot;/cdmlib-services/src&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.folder&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;default/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.default&quot;/&gt;&#10;&lt;/sourceContainers&gt;&#10;&lt;/sourceLookupDirector&gt;&#10;"/>
 <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
@@ -52,7 +55,8 @@
 </listAttribute>
 <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
 <stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="net.sourceforge.eclipsejetty.launcher.JettyLaunchClassPathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_60"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="net.sourceforge.eclipsejetty.starter.embedded.JettyEmbeddedLauncherMain"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="cdmlib-remote-webapp"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx500M&#10;-XX:PermSize=150m&#10;-Dlog4j.configDebug=true&#10;-Dorg.mortbay.jetty.webapp.parentLoaderPriority=true&#10;-agentlib:yjpagent"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx500M&#10;&#10;-Dlog4j.configDebug=true&#10;-Dlog4j.configuration=file:///${system_property:user.home}/.cdmLibrary/log4j.properties&#10;&#10;-agentlib:yjpagent&#10;&#10;-Dcdm.forceSchemaUpdate=true&#10;-Dspring.profiles.active=remoting"/>
 </launchConfiguration>
index 190814af047b055770b9384d1f7495f05dd158e8..54d5f8225c111740e5c2e620e3afa335719da5f5 100644 (file)
@@ -55,5 +55,5 @@
 <stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="net.sourceforge.eclipsejetty.launcher.JettyLaunchClassPathProvider"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="net.sourceforge.eclipsejetty.starter.embedded.JettyEmbeddedLauncherMain"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="cdmlib-remote-webapp"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx4056M&#10;-XX:PermSize=150m&#10;-Dlog4j.configDebug=true&#10;-Dlog4j.configuration=file:///${system_property:user.home}/.cdmLibrary/log4j.properties&#10;-Dorg.mortbay.jetty.webapp.parentLoaderPriority=true&#10;-Dcdm.forceSchemaUpdate=true&#10;-Dspring.profiles.active=remoting"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx500M&#10;&#10;-Dlog4j.configDebug=true&#10;-Dlog4j.configuration=file:///${system_property:user.home}/.cdmLibrary/log4j.properties&#10;&#10;-Dcdm.forceSchemaUpdate=true&#10;-Dspring.profiles.active=remoting"/>
 </launchConfiguration>
index 55ebb2e8cfbaef97301db90a55c11724a8aa8633..dff2641928c24395d4c0a9a61878077fc6dd28fd 100644 (file)
     <dependency>
       <groupId>io.springfox</groupId>
       <artifactId>springfox-swagger2</artifactId>
+      <scope>test</scope>
     </dependency>
-    <!-- dependencies for swagger-springmvc, added explicitly -->
+    <!-- dependencies for springfox-swagger2, added explicitly -->
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
 
   <build>
     <resources>
-      <!-- ${basedir}/src/test/resources -->
       <resource>
         <!-- replace the place holders like ${...} in datasources.xml -->
-        <targetPath>${project.build.directory}/test-classes</targetPath>
         <filtering>true</filtering>
-        <directory>${basedir}/src/test/resources</directory>
+        <directory>src/test/resources</directory>
+        <targetPath>../test-classes</targetPath>
         <includes>
           <include>datasources.xml</include>
         </includes>
       </resource>
       <resource>
         <!-- all other test resources without filtering -->
-        <targetPath>test-classes</targetPath>
-        <directory>${basedir}/src/test/resources</directory>
+        <directory>src/test/resources</directory>
+        <targetPath>../test-classes</targetPath>
         <excludes>
           <exclude>datasources.xml</exclude>
         </excludes>
       </resource>
       <resource>
         <!-- all main resources without filtering -->
-        <targetPath>classes</targetPath>
-        <directory>${basedir}/src/test/resources</directory>
+        <directory>src/main/resources</directory>
       </resource>
     </resources>
     <plugins>
           </execution>
         </executions>
       </plugin>
-      
       <plugin>
         <groupId>org.eclipse.jetty</groupId>
         <artifactId>jetty-maven-plugin</artifactId>
               <name>cdm.beanDefinitionFile</name>
               <value>${project.build.directory}/test-classes/datasources.xml</value>
             </systemProperty>
+            <systemProperty>
+                <!--
+                    start with swagger profile so that the swagger doc 
+                    can be generated 
+                 -->
+                <name>spring.profiles.active</name>
+                <value>swagger</value>
+            </systemProperty>
           </systemProperties>
         </configuration>
         <executions>
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>2.6</version>
+        <executions>
+            <execution>
+                <!-- 
+                    The war must be created after running the integration-tests,
+                    since the SwaggerGroupsIT test populates the classes/api-docs-static/
+                    folder with static swagger doc files. The are otherwise not packed
+                     into the wae file.
+                  -->
+                <phase>verify</phase>
+                <goals>
+                  <goal>war</goal>
+                </goals>
+            </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 </project>
index 13250e86ecdafe31dc809c166612095c89c23c81..9ba618f5280cd18cb6af2cc94cae0aa9cc3ad8a7 100644 (file)
@@ -19,8 +19,6 @@ import javax.servlet.ServletContext;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.DependsOn;
 import org.springframework.context.annotation.Import;
 import org.springframework.http.MediaType;
@@ -52,18 +50,9 @@ import eu.etaxonomy.cdm.remote.view.PatternViewResolver;
  *
  */
 // @EnableWebMvc // do not add this since we are overriding WebMvcConfigurationSupport directly
-@Configuration
 @Import(value={PreloadedBeans.class}) // can not be replaced by @DependsOn("...") ?
 //@DependsOn("objectMapperConfigurer")
-@ComponentScan(basePackages = {
-        "springfox.documentation.spring.web", // --> CdmSwaggerConfig
-        "eu.etaxonomy.cdm.remote.l10n",
-        "eu.etaxonomy.cdm.remote.controller",
-        "eu.etaxonomy.cdm.remote.service",
-        "eu.etaxonomy.cdm.remote.config"
-        }
-)
-public class CdmSpringMVCConfig extends WebMvcConfigurationSupport  {
+public abstract class CdmSpringMVCConfig extends WebMvcConfigurationSupport  {
 
     /**
      * turn caching off FOR DEBUGING ONLY !!!!
diff --git a/cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/CdmSpringMVCConfigDefault.java b/cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/CdmSpringMVCConfigDefault.java
new file mode 100644 (file)
index 0000000..c78dad7
--- /dev/null
@@ -0,0 +1,44 @@
+// $Id$
+/**
+* Copyright (C) 2016 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.remote.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Profile;
+
+/**
+ * @author a.kohlbecker
+ * @date Feb 22, 2016
+ *
+ */
+//@EnableWebMvc // do not add this since we are overriding WebMvcConfigurationSupport directly
+@Profile("default") // see RESERVED_DEFAULT_PROFILE_NAME
+@Configuration
+@Import(value={PreloadedBeans.class}) // can not be replaced by @DependsOn("...") ?
+//@DependsOn("objectMapperConfigurer")
+@ComponentScan(basePackages = {
+     "eu.etaxonomy.cdm.remote.l10n",
+     "eu.etaxonomy.cdm.remote.controller",
+     "eu.etaxonomy.cdm.remote.staticSwagger",
+     "eu.etaxonomy.cdm.remote.service",
+     "eu.etaxonomy.cdm.remote.config"
+     }
+)
+public class CdmSpringMVCConfigDefault extends CdmSpringMVCConfig {
+
+    public CdmSpringMVCConfigDefault() {
+        super();
+        logger.info("====================================");
+        logger.info(" CdmSpringMVCConfiguration: Default");
+        logger.info("====================================");
+    }
+
+}
diff --git a/cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/SwaggerGroupsConfig.java b/cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/SwaggerGroupsConfig.java
new file mode 100644 (file)
index 0000000..6a32e03
--- /dev/null
@@ -0,0 +1,44 @@
+// $Id$
+/**
+* Copyright (C) 2016 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.remote.config;
+
+
+/**
+ * @author a.kohlbecker
+ * @date Feb 22, 2016
+ *
+ */
+public enum SwaggerGroupsConfig {
+
+    LSID_AUTHORITY_SERVICES("LSID authority services"),
+    DATA_EXPORT("Data export"),
+    GENERIC_REST_API("Generic REST API"),
+    WEB_PORTAL_SERVICES("Web Portal Services"),
+    CATALOGUE_SERVICES("Catalogue Services");
+
+    private String groupName;
+
+    SwaggerGroupsConfig(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String groupName() {
+        return groupName;
+    }
+
+    public static SwaggerGroupsConfig byGroupName(String groupName) {
+        for(SwaggerGroupsConfig group : SwaggerGroupsConfig.values()) {
+            if(group.groupName.equals(groupName)) {
+                return group;
+            }
+        }
+        return null;
+    }
+}
diff --git a/cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/staticSwagger/StaticSwaggerApiDoc.java b/cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/staticSwagger/StaticSwaggerApiDoc.java
new file mode 100644 (file)
index 0000000..0e2bc4d
--- /dev/null
@@ -0,0 +1,67 @@
+// $Id$
+/**
+* Copyright (C) 2016 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.remote.staticSwagger;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.etaxonomy.cdm.remote.SwaggerGroupsIT;
+import eu.etaxonomy.cdm.remote.config.SwaggerGroupsConfig;
+import eu.etaxonomy.cdm.remote.controller.HttpStatusMessage;
+
+/**
+ * This controller replaces the dynamic swagger api doc endpoint which is
+ * otherwise provided by springfox-swagger2. In contrast to the original controller
+ * this implementation serves static json files which contain the api documentation.
+ * <p>
+ * The static api doc files are created by the integration test class {@link SwaggerGroupsIT}.
+ * <p>
+ * For more details see {@link http://dev.e-taxonomy.eu/trac/wiki/cdmlib-remote-webappConfigurationAndBootstrapping}
+ *
+ * @see {@link SwaggerGroupsIT}
+ * @author a.kohlbecker
+ * @date Feb 22, 2016
+ *
+ */
+
+@Controller
+@RequestMapping(value = {"/v2/api-docs"})
+public class StaticSwaggerApiDoc {
+
+    @RequestMapping(method = RequestMethod.GET)
+    public void group(
+            @RequestParam(value = "group", required = true) String group,
+             HttpServletRequest request,
+            HttpServletResponse response) throws IOException {
+
+        SwaggerGroupsConfig groupConfig = SwaggerGroupsConfig.byGroupName(group);
+        if(groupConfig == null) {
+            HttpStatusMessage.create("Unknown swagger group name.", 400).send(response);
+        }
+        InputStream staticDocStream = getClass().getClassLoader().getResourceAsStream("api-docs-static/" + groupConfig.name());
+        if(staticDocStream == null) {
+            HttpStatusMessage.create("Static swagger api doc file for group '" + group + "' not found.", 500).send(response);
+        } else {
+            response.addHeader("Content-Type", "application/json;charset=utf-8");
+            IOUtils.copy(staticDocStream,  response.getOutputStream());
+            staticDocStream.close();
+        }
+    }
+
+}
diff --git a/cdmlib-remote-webapp/src/main/resources/api-docs-static/README b/cdmlib-remote-webapp/src/main/resources/api-docs-static/README
new file mode 100644 (file)
index 0000000..8a2d9b7
--- /dev/null
@@ -0,0 +1,3 @@
+This folder will contains static swagger api documentation files.
+
+It is initially empty and will filled automatically when the SwaggerGroupsIT integration test is run. 
\ No newline at end of file
index 90a3effe756038a8ab69cf61aa8e11d38b099030..8be3f331c8f4c44cb5f25c7e46699bde6625b854 100644 (file)
 package eu.etaxonomy.cdm.remote;
 
 import org.apache.log4j.Logger;
-import org.junit.Assert;
-import org.junit.Before;
 import org.junit.Test;
-import org.springframework.web.client.RestTemplate;
 
 /**
  * @author a.kohlbecker
@@ -21,31 +18,13 @@ import org.springframework.web.client.RestTemplate;
  *
  */
 
-public class ClassificationIT extends Assert {
+public class ClassificationIT extends WebServiceTestBase  {
 
     public static final Logger logger = Logger.getLogger(ClassificationIT.class);
 
-    int port = 9180;
-    String baseUri = "";
-    RestTemplate template = new RestTemplate();
-
-    @Before
-    public void setUp() {
-        if(System.getProperty("sun.java.command") != null && System.getProperty("sun.java.command").startsWith("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner")){
-            port = 8080;
-            logger.info(" setUp() : \n" +
-                        "==================================================================\n" +
-                        " Eclipse ide detected, expecting cdm remote instance at port 8080 \n" +
-                        "==================================================================");
-        };
-        baseUri = String.format("http://localhost:%1$d/", port);
-        logger.info("cdm remote instance url: " + baseUri);
-    }
-
-
     @Test
     public void checkInstanceIsOnline(){
-        String response = template.getForObject(baseUri + "classification.json", String.class);
+        String response = httpGetJson("classification.json", null);
         assertTrue(response.contains("My Classification"));
     }
 
diff --git a/cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/SwaggerGroupsIT.java b/cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/SwaggerGroupsIT.java
new file mode 100644 (file)
index 0000000..d4c4691
--- /dev/null
@@ -0,0 +1,58 @@
+// $Id$
+/**
+* Copyright (C) 2014 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.remote;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.log4j.Logger;
+import org.junit.Test;
+
+import eu.etaxonomy.cdm.remote.config.SwaggerGroupsConfig;
+
+/**
+ * @author a.kohlbecker
+ * @date Mar 3, 2014
+ *
+ */
+
+public class SwaggerGroupsIT extends WebServiceTestBase {
+
+    public static final Logger logger = Logger.getLogger(SwaggerGroupsIT.class);
+
+    String swagger2Endpoint= "/v2/api-docs";
+
+    @Test
+    public void fetchSwaggerGroups(){
+
+        String staticApiDocFolder = "./target/classes/api-docs-static/";
+
+        staticApiDocFolder.replace("/", File.separator);
+
+
+        for(SwaggerGroupsConfig group : SwaggerGroupsConfig.values()) {
+            logger.info(group.groupName());
+            String response =  httpGetJson(swagger2Endpoint, "group=" + group.groupName());
+            try {
+                FileUtils.write(new File(staticApiDocFolder + group.name()), response);
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+
+        File pwd = new File("pom.xml");
+
+
+        System.err.println(pwd.getAbsolutePath());
+    }
+
+}
diff --git a/cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/WebServiceTestBase.java b/cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/WebServiceTestBase.java
new file mode 100644 (file)
index 0000000..f57f826
--- /dev/null
@@ -0,0 +1,62 @@
+// $Id$
+/**
+* Copyright (C) 2016 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.remote;
+
+import org.apache.log4j.Logger;
+import org.junit.Assert;
+import org.junit.Before;
+import org.springframework.web.client.RestTemplate;
+
+
+/**
+ * @author a.kohlbecker
+ * @date Feb 22, 2016
+ *
+ */
+public class WebServiceTestBase extends Assert {
+
+    public static final Logger logger = Logger.getLogger(WebServiceTestBase.class);
+
+
+    private int port = 9180;
+    private String baseUri = "";
+
+    RestTemplate template = new RestTemplate();
+
+    @Before
+    public void setUp() {
+        if(System.getProperty("sun.java.command") != null && System.getProperty("sun.java.command").startsWith("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner")){
+            port = 8080;
+            logger.info(" setUp() : \n" +
+                        "==================================================================\n" +
+                        " Eclipse ide detected, expecting cdm remote instance at port 8080 \n" +
+                        "==================================================================");
+        };
+        baseUri = String.format("http://localhost:%1$d", port);
+        logger.info("cdm remote instance url: " + baseUri);
+    }
+
+    public String getBaseUri() {
+        return baseUri;
+    }
+
+    public String httpGetJson(String endPoint, String query) {
+        StringBuilder uri = new StringBuilder(baseUri);
+        if(endPoint != null) {
+            uri.append(endPoint);
+        }
+        if(query != null) {
+            uri.append("?").append(query);
+        }
+        logger.debug("httpGetJson: " + uri.toString());
+        return template.getForObject(uri.toString(), String.class);
+    }
+
+}
diff --git a/cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/config/CdmSpringMVCConfigWithSwagger.java b/cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/config/CdmSpringMVCConfigWithSwagger.java
new file mode 100644 (file)
index 0000000..c349b57
--- /dev/null
@@ -0,0 +1,46 @@
+// $Id$
+/**
+ * Copyright (C) 2016 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+package eu.etaxonomy.cdm.remote.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Profile;
+
+/**
+ * Activate this profile by setting the
+ * <code>spring.profiles.active=swagger</code> either as system property as the
+ * web application argument
+ *
+ * @author a.kohlbecker
+ * @date Feb 22, 2016
+ *
+ */
+@Profile("swagger")
+// @EnableWebMvc // do not add this since we are overriding
+// WebMvcConfigurationSupport directly
+@Configuration
+@Import(value = { PreloadedBeans.class })
+// can not be replaced by @DependsOn("...") ?
+// @DependsOn("objectMapperConfigurer")
+@ComponentScan(basePackages = {
+        "springfox.documentation.spring.web", // --> CdmSwaggerConfig
+        "eu.etaxonomy.cdm.remote.l10n", "eu.etaxonomy.cdm.remote.controller", "eu.etaxonomy.cdm.remote.service",
+        "eu.etaxonomy.cdm.remote.config" })
+public class CdmSpringMVCConfigWithSwagger extends CdmSpringMVCConfig {
+
+    public CdmSpringMVCConfigWithSwagger() {
+        super();
+        logger.info("====================================");
+        logger.info(" CdmSpringMVCConfiguration: Swagger");
+        logger.info("====================================");
+    }
+
+}
similarity index 92%
rename from cdmlib-remote-webapp/src/main/java/eu/etaxonomy/cdm/remote/config/CdmSwaggerConfig.java
rename to cdmlib-remote-webapp/src/test/java/eu/etaxonomy/cdm/remote/config/CdmSwaggerConfig.java
index 540f2124af5e1a12f404f886e21e1f223085af0b..c1d6ef1deb1366ce2c6b6f4cef71a2026f0fc7e4 100644 (file)
@@ -21,6 +21,7 @@ import javax.persistence.Entity;
 import org.apache.log4j.Logger;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
 import org.springframework.core.type.filter.AnnotationTypeFilter;
 
 import springfox.documentation.service.ApiInfo;
@@ -39,20 +40,11 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
  *
  *
  */
+@Profile("swagger")
 @EnableSwagger2
 @Configuration
 public class CdmSwaggerConfig {
 
-    private static final String LSID_AUTHORITY_SERVICES = "LSID authority services";
-
-    private static final String DATA_EXPORT = "Data export";
-
-    private static final String GENERIC_REST_API = "Generic REST API";
-
-    private static final String WEB_PORTAL_SERVICES = "Web Portal Services";
-
-    private static final String CATALOGUE_SERVICES = "Catalogue Services";
-
     public static final Logger logger = Logger.getLogger(CdmSwaggerConfig.class);
 
     Collection<Class<? extends Object>> allCdmTypes = null;
@@ -73,7 +65,7 @@ public class CdmSwaggerConfig {
        logger.debug("swaggerSpringMvcPlugin");
        configureModelConverters();
        return new Docket(DocumentationType.SWAGGER_2)
-           .groupName(GENERIC_REST_API)
+           .groupName(SwaggerGroupsConfig.GENERIC_REST_API.groupName())
                .select()
                .paths(not(
                         or(
@@ -91,7 +83,7 @@ public class CdmSwaggerConfig {
                        )
                 )
                .build()
-          .apiInfo(apiInfo(GENERIC_REST_API, ""
+          .apiInfo(apiInfo(SwaggerGroupsConfig.GENERIC_REST_API.groupName(), ""
                   + "<p>The CDM REST API is a RESTful interface to resources stored in the CDM."
                   + " The RESTful architecture allows accessing the various resources like Taxa, "
                   + "Names, References, Media, etc by stable URIs. Due to security constraints "
@@ -114,11 +106,11 @@ public class CdmSwaggerConfig {
        logger.debug("swaggerSpringMvcPlugin");
        configureModelConverters();
        return new Docket(DocumentationType.SWAGGER_2)
-           .groupName(WEB_PORTAL_SERVICES)
+           .groupName(SwaggerGroupsConfig.WEB_PORTAL_SERVICES.groupName())
                .select()
                .paths(regex("/portal/.*"))
                .build()
-          .apiInfo(apiInfo(WEB_PORTAL_SERVICES, "<p>The Portal Service is a specialization to the "
+          .apiInfo(apiInfo(SwaggerGroupsConfig.WEB_PORTAL_SERVICES.groupName(), "<p>The Portal Service is a specialization to the "
                   + "<a href=\"?group=Generic+REST+API\">Generic  REST API</a> as needed by CDM Dataportal "
                   + " that adds some fields like localized representations to the pure CDM entities. Another important difference "
                   + " is the initialization depth of the CDM entities. The Portal Service enpoints provide far bigger parts of the "
@@ -130,12 +122,12 @@ public class CdmSwaggerConfig {
    public Docket swaggerPluginNameCatalogue(){
        configureModelConverters();
        return new Docket(DocumentationType.SWAGGER_2)
-           .groupName(CATALOGUE_SERVICES)
+           .groupName(SwaggerGroupsConfig.CATALOGUE_SERVICES.groupName())
                .select()
                .paths(or(regex("/name_catalogue.*"),regex("/occurrence_catalogue.*")))
                .build()
            .apiInfo(apiInfo(
-                   CATALOGUE_SERVICES,
+                   SwaggerGroupsConfig.CATALOGUE_SERVICES.groupName(),
                    "<p>These web services are optimized for using names taxonomic information and occurence data in workflow environments "
                    + " but are suitabale for all applicatoins in which fast response times are crucial."
                    + " Additional detailed documentation of these services can also be found at:</p>"
@@ -175,11 +167,11 @@ public class CdmSwaggerConfig {
        logger.debug("swaggerSpringMvcPlugin");
        configureModelConverters();
        return new Docket(DocumentationType.SWAGGER_2)
-           .groupName(LSID_AUTHORITY_SERVICES)
+           .groupName(SwaggerGroupsConfig.LSID_AUTHORITY_SERVICES.groupName())
                .select()
                .paths(regex("/authority/.*"))
                .build()
-          .apiInfo(apiInfo(LSID_AUTHORITY_SERVICES, ""))
+          .apiInfo(apiInfo(SwaggerGroupsConfig.LSID_AUTHORITY_SERVICES.groupName(), ""))
           .ignoredParameterTypes(allCdmTpyes());
    }
 
@@ -188,11 +180,11 @@ public class CdmSwaggerConfig {
        logger.debug("swaggerSpringMvcPlugin");
        configureModelConverters();
        return new Docket(DocumentationType.SWAGGER_2)
-           .groupName(DATA_EXPORT)
+           .groupName(SwaggerGroupsConfig.DATA_EXPORT.groupName())
                .select()
                .paths(or(regex("/csv/.*"), regex("/checklist.*")))
                .build()
-          .apiInfo(apiInfo(DATA_EXPORT, ""))
+          .apiInfo(apiInfo(SwaggerGroupsConfig.DATA_EXPORT.groupName(), ""))
           .ignoredParameterTypes(allCdmTpyes());
    }
 
index f32f8ece13773a7e45ee43b94a87736ca1936b66..c15084f5cd012af63ae24586d0e455935f71fb97 100644 (file)
@@ -63,4 +63,9 @@ log4j.logger.org.hibernate.tool.hbm2ddl=WARN
 # This overcomes the proxy narrow log of hibernate\r
 log4j.logger.org.hibernate.engine.internal.StatefulPersistenceContext=ERROR\r
 \r
+# supress HHH90000003\r
+log4j.logger.org.hibernate.orm.deprecation=ERROR\r
+\r
 log4j.logger.com.mchange.v2.c3p0=WARN\r
+\r
+\r