You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2018/10/06 11:00:59 UTC

[camel] branch master updated (183c4c6 -> a4f81d4)

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

zregvart pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git.


    from 183c4c6  Upgrade Spring Integration to version 5.0.8.RELEASE
     new 9d14001  Add JUnit Jupiter version
     new a4a79f9  Additional URISupport methods
     new a4f81d4  CAMEL-12855: cleanup and tests

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/camel/util/URISupport.java     |  60 ++++++++-
 .../java/org/apache/camel/util/URISupportTest.java |  45 +++++++
 components/camel-swagger-java/pom.xml              |  30 ++++-
 .../apache/camel/swagger/RestSwaggerSupport.java   |  29 ++---
 .../camel/swagger/RestSwaggerSupportTest.java      | 140 +++++++++++++++++++++
 parent/pom.xml                                     |   1 +
 6 files changed, 284 insertions(+), 21 deletions(-)
 create mode 100644 components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerSupportTest.java


[camel] 02/03: Additional URISupport methods

Posted by zr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a4a79f912406c626793fe415dd710f58177eb977
Author: Zoran Regvart <zr...@apache.org>
AuthorDate: Sat Oct 6 12:58:56 2018 +0200

    Additional URISupport methods
    
    This adds `stripSuffix` and `joinPaths` methods to URISupport, seemingly
    also a common pattern of utility methods that we can take advantage of
    doing only once.
    
    Also refactors `stripPrefix` for additional `null` safety in case
    `prefix` is `null`.
---
 .../java/org/apache/camel/util/URISupport.java     | 60 +++++++++++++++++++++-
 .../java/org/apache/camel/util/URISupportTest.java | 45 ++++++++++++++++
 2 files changed, 104 insertions(+), 1 deletion(-)

diff --git a/camel-core/src/main/java/org/apache/camel/util/URISupport.java b/camel-core/src/main/java/org/apache/camel/util/URISupport.java
index 3d4bd42..96f2cfa 100644
--- a/camel-core/src/main/java/org/apache/camel/util/URISupport.java
+++ b/camel-core/src/main/java/org/apache/camel/util/URISupport.java
@@ -408,9 +408,35 @@ public final class URISupport {
      * @return the value without the prefix
      */
     public static String stripPrefix(String value, String prefix) {
-        if (value != null && value.startsWith(prefix)) {
+        if (value == null || prefix == null) {
+            return value;
+        }
+
+        if (value.startsWith(prefix)) {
             return value.substring(prefix.length());
         }
+
+        return value;
+    }
+
+    /**
+     * Strips the suffix from the value.
+     * <p/>
+     * Returns the value as-is if not ending with the prefix.
+     *
+     * @param value the value
+     * @param suffix the suffix to remove from value
+     * @return the value without the suffix
+     */
+    public static String stripSuffix(final String value, final String suffix) {
+        if (value == null || suffix == null) {
+            return value;
+        }
+
+        if (value.endsWith(suffix)) {
+            return value.substring(0, value.length() - suffix.length());
+        }
+
         return value;
     }
 
@@ -632,4 +658,36 @@ public final class URISupport {
 
         return pathAndQuery;
     }
+
+    public static String joinPaths(final String... paths) {
+        if (paths == null || paths.length == 0) {
+            return "";
+        }
+
+        final StringBuilder joined = new StringBuilder();
+
+        boolean addedLast = false;
+        for (int i = paths.length -1 ; i >= 0 ; i--) {
+            String path = paths[i];
+            if (ObjectHelper.isNotEmpty(path)) {
+                if (addedLast) {
+                    path = stripSuffix(path, "/");
+                }
+
+                addedLast = true;
+
+                if (path.charAt(0) == '/') {
+                    joined.insert(0, path);
+                } else {
+                    if (i > 0) {
+                        joined.insert(0, '/').insert(1, path);
+                    } else {
+                        joined.insert(0, path);
+                    }
+                }
+            }
+        }
+
+        return joined.toString();
+    }
 }
diff --git a/camel-core/src/test/java/org/apache/camel/util/URISupportTest.java b/camel-core/src/test/java/org/apache/camel/util/URISupportTest.java
index f9a642a..11bf67f 100644
--- a/camel-core/src/test/java/org/apache/camel/util/URISupportTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/URISupportTest.java
@@ -23,6 +23,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.camel.ContextTestSupport;
+import org.assertj.core.api.Assertions;
 import org.junit.Test;
 
 /**
@@ -376,4 +377,48 @@ public class URISupportTest extends ContextTestSupport {
         assertEquals("/path/", URISupport.pathAndQueryOf(URI.create("http://localhost:80/path/")));
         assertEquals("/path?query=value", URISupport.pathAndQueryOf(URI.create("http://localhost:80/path?query=value")));
     }
+
+    @Test
+    public void shouldStripPrefixes() {
+        Assertions.assertThat(URISupport.stripPrefix(null, null)).isNull();
+        Assertions.assertThat(URISupport.stripPrefix("", null)).isEmpty();
+        Assertions.assertThat(URISupport.stripPrefix(null, "")).isNull();
+        Assertions.assertThat(URISupport.stripPrefix("", "")).isEmpty();
+        Assertions.assertThat(URISupport.stripPrefix("a", "b")).isEqualTo("a");
+        Assertions.assertThat(URISupport.stripPrefix("a", "a")).isEmpty();
+        Assertions.assertThat(URISupport.stripPrefix("ab", "b")).isEqualTo("ab");
+        Assertions.assertThat(URISupport.stripPrefix("a", "ab")).isEqualTo("a");
+    }
+
+    @Test
+    public void shouldStripSuffixes() {
+        Assertions.assertThat(URISupport.stripSuffix(null, null)).isNull();
+        Assertions.assertThat(URISupport.stripSuffix("", null)).isEmpty();
+        Assertions.assertThat(URISupport.stripSuffix(null, "")).isNull();
+        Assertions.assertThat(URISupport.stripSuffix("", "")).isEmpty();
+        Assertions.assertThat(URISupport.stripSuffix("a", "b")).isEqualTo("a");
+        Assertions.assertThat(URISupport.stripSuffix("a", "a")).isEmpty();
+        Assertions.assertThat(URISupport.stripSuffix("ab", "b")).isEqualTo("a");
+        Assertions.assertThat(URISupport.stripSuffix("a", "ab")).isEqualTo("a");
+    }
+
+    @Test
+    public void shouldJoinPaths() {
+        Assertions.assertThat(URISupport.joinPaths(null, null)).isEmpty();
+        Assertions.assertThat(URISupport.joinPaths("", null)).isEmpty();
+        Assertions.assertThat(URISupport.joinPaths(null, "")).isEmpty();
+        Assertions.assertThat(URISupport.joinPaths("", "")).isEmpty();
+        Assertions.assertThat(URISupport.joinPaths("a", "")).isEqualTo("a");
+        Assertions.assertThat(URISupport.joinPaths("a", "b")).isEqualTo("a/b");
+        Assertions.assertThat(URISupport.joinPaths("/a", "b")).isEqualTo("/a/b");
+        Assertions.assertThat(URISupport.joinPaths("/a", "b/")).isEqualTo("/a/b/");
+        Assertions.assertThat(URISupport.joinPaths("/a/", "b/")).isEqualTo("/a/b/");
+        Assertions.assertThat(URISupport.joinPaths("/a/", "/b/")).isEqualTo("/a/b/");
+        Assertions.assertThat(URISupport.joinPaths("a", "b", "c")).isEqualTo("a/b/c");
+        Assertions.assertThat(URISupport.joinPaths("a", null, "c")).isEqualTo("a/c");
+        Assertions.assertThat(URISupport.joinPaths("/a/", "/b", "c/", "/d/")).isEqualTo("/a/b/c/d/");
+        Assertions.assertThat(URISupport.joinPaths("/a/", "/b", "c/", null)).isEqualTo("/a/b/c/");
+        Assertions.assertThat(URISupport.joinPaths("/a/", null, null, null)).isEqualTo("/a/");
+        Assertions.assertThat(URISupport.joinPaths("a/", "/b", null, null)).isEqualTo("a/b");
+    }
 }
\ No newline at end of file


[camel] 01/03: Add JUnit Jupiter version

Posted by zr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 9d14001aa624456c9d80f75e5de7c1caa01b3c81
Author: Zoran Regvart <zr...@apache.org>
AuthorDate: Sat Oct 6 12:56:45 2018 +0200

    Add JUnit Jupiter version
---
 parent/pom.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/parent/pom.xml b/parent/pom.xml
index c133bd8..3fc7a54 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -434,6 +434,7 @@
     <junit-bundle-version>4.11_1</junit-bundle-version>
     <junit-toolbox-version>2.3</junit-toolbox-version>
     <junit-version>4.12</junit-version>
+    <junit-jupiter-version>5.3.1</junit-jupiter-version>
     <jxmpp-version>0.6.3</jxmpp-version>
     <jython-version>2.5.3</jython-version>
     <jzlib-version>1.1.3</jzlib-version>


[camel] 03/03: CAMEL-12855: cleanup and tests

Posted by zr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a4f81d4f43d25030ed70d4bdb1979542ee31ba4c
Author: Zoran Regvart <zr...@apache.org>
AuthorDate: Sat Oct 6 13:00:18 2018 +0200

    CAMEL-12855: cleanup and tests
---
 components/camel-swagger-java/pom.xml              |  30 ++++-
 .../apache/camel/swagger/RestSwaggerSupport.java   |  29 ++---
 .../camel/swagger/RestSwaggerSupportTest.java      | 140 +++++++++++++++++++++
 3 files changed, 179 insertions(+), 20 deletions(-)

diff --git a/components/camel-swagger-java/pom.xml b/components/camel-swagger-java/pom.xml
index 434a3c8..344fa32 100644
--- a/components/camel-swagger-java/pom.xml
+++ b/components/camel-swagger-java/pom.xml
@@ -135,10 +135,29 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <version>${junit-jupiter-version}</version>
       <scope>test</scope>
-    </dependency>  
+    </dependency>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-params</artifactId>
+      <version>${junit-jupiter-version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-engine</artifactId>
+      <version>${junit-jupiter-version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.junit.vintage</groupId>
+      <artifactId>junit-vintage-engine</artifactId>
+      <version>${junit-jupiter-version}</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
@@ -160,6 +179,11 @@
       <version>${assertj-version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
index 7a90ab3..33cd20a 100644
--- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
+++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
@@ -59,11 +59,11 @@ import static org.apache.camel.swagger.SwaggerHelper.clearVendorExtensions;
  * such as servlet/jetty/netty4-http to offer Swagger API listings with minimal effort.
  */
 public class RestSwaggerSupport {
-	
-    private static final String HEADER_X_FORWARDED_PREFIX = "X-Forwarded-Prefix";
-    private static final String HEADER_X_FORWARDED_HOST = "X-Forwarded-Host";
-    private static final String HEADER_X_FORWARDED_PROTO = "X-Forwarded-Proto";
-    private static final String HEADER_HOST = "Host";
+
+    static final String HEADER_X_FORWARDED_PREFIX = "X-Forwarded-Prefix";
+    static final String HEADER_X_FORWARDED_HOST = "X-Forwarded-Host";
+    static final String HEADER_X_FORWARDED_PROTO = "X-Forwarded-Proto";
+    static final String HEADER_HOST = "Host";
 
     private static final Logger LOG = LoggerFactory.getLogger(RestSwaggerSupport.class);
     private RestSwaggerReader reader = new RestSwaggerReader();
@@ -355,37 +355,32 @@ public class RestSwaggerSupport {
         response.setHeader("Access-Control-Max-Age", maxAge);
     }
 
-    private void setupXForwardedHeaders(Swagger swagger, Map<String, Object> headers) {
+    static void setupXForwardedHeaders(Swagger swagger, Map<String, Object> headers) {
 
         String host = (String) headers.get(HEADER_HOST);
-        if(ObjectHelper.isNotEmpty(host)) {
+        if (ObjectHelper.isNotEmpty(host)) {
             swagger.setHost(host);
         }
 
         String forwardedPrefix = (String) headers.get(HEADER_X_FORWARDED_PREFIX);
         if (ObjectHelper.isNotEmpty(forwardedPrefix)) {
-            String prefixedBasePath = "/" + URISupport.stripPrefix(forwardedPrefix, "/") +
-                    (!forwardedPrefix.endsWith("/") ? "/" : "") + URISupport.stripPrefix(swagger.getBasePath(), "/");
-            swagger.setBasePath(prefixedBasePath);
+            swagger.setBasePath(URISupport.joinPaths(forwardedPrefix, swagger.getBasePath()));
         }
 
         String forwardedHost = (String) headers.get(HEADER_X_FORWARDED_HOST);
-        if(ObjectHelper.isNotEmpty(forwardedHost)) {
+        if (ObjectHelper.isNotEmpty(forwardedHost)) {
             swagger.setHost(forwardedHost);
         }
 
         String proto = (String) headers.get(HEADER_X_FORWARDED_PROTO);
         if(ObjectHelper.isNotEmpty(proto)) {
             String[] schemes = proto.split(",");
-            List<Scheme> schs = new ArrayList<>();
             for(String scheme : schemes) {
                 String trimmedScheme = scheme.trim();
-                schs.add(Scheme.forValue(trimmedScheme));
+                if (ObjectHelper.isNotEmpty(trimmedScheme)) {
+                    swagger.addScheme(Scheme.forValue(trimmedScheme));
+                }
             }
-            swagger.setSchemes(schs);
-        }
-        else {
-            swagger.setSchemes(null);
         }
     }
 
diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerSupportTest.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerSupportTest.java
new file mode 100644
index 0000000..3498a8e
--- /dev/null
+++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerSupportTest.java
@@ -0,0 +1,140 @@
+/**
+ * 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.camel.swagger;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import io.swagger.models.Scheme;
+import io.swagger.models.Swagger;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static org.junit.jupiter.params.provider.Arguments.arguments;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+public class RestSwaggerSupportTest {
+
+    @Test
+    public void shouldAdaptFromXForwardHeaders() {
+        final Swagger swagger = spy(new Swagger().basePath("/base"));
+
+        final Map<String, Object> headers = new HashMap<>();
+        headers.put(RestSwaggerSupport.HEADER_X_FORWARDED_PREFIX, "/prefix");
+        headers.put(RestSwaggerSupport.HEADER_X_FORWARDED_HOST, "host");
+        headers.put(RestSwaggerSupport.HEADER_X_FORWARDED_PROTO, "http, HTTPS ");
+        RestSwaggerSupport.setupXForwardedHeaders(swagger, headers);
+
+        verify(swagger).getBasePath();
+        verify(swagger).setBasePath("/prefix/base");
+        verify(swagger).setHost("host");
+        verify(swagger).addScheme(Scheme.HTTP);
+        verify(swagger).addScheme(Scheme.HTTPS);
+        verifyNoMoreInteractions(swagger);
+    }
+
+    @ParameterizedTest
+    @MethodSource("basePathAndPrefixVariations")
+    public void shouldAdaptWithVaryingBasePathsAndPrefixes(final String prefix, final String basePath,
+        final String expected) {
+        final Swagger swagger = spy(new Swagger().basePath(basePath));
+
+        final Map<String, Object> headers = new HashMap<>();
+        headers.put(RestSwaggerSupport.HEADER_X_FORWARDED_PREFIX, prefix);
+        RestSwaggerSupport.setupXForwardedHeaders(swagger, headers);
+
+        verify(swagger).getBasePath();
+        verify(swagger).setBasePath(expected);
+        verifyNoMoreInteractions(swagger);
+    }
+
+    @ParameterizedTest
+    @MethodSource("schemeVariations")
+    public void shouldAdaptWithVaryingSchemes(final String xForwardedScheme, final Scheme[] expected) {
+        final Swagger swagger = spy(new Swagger());
+
+        RestSwaggerSupport.setupXForwardedHeaders(swagger,
+            Collections.singletonMap(RestSwaggerSupport.HEADER_X_FORWARDED_PROTO, xForwardedScheme));
+
+        for (final Scheme scheme : expected) {
+            verify(swagger).addScheme(scheme);
+        }
+
+        verifyNoMoreInteractions(swagger);
+    }
+
+    @Test
+    public void shouldNotAdaptFromXForwardHeadersWhenNoHeadersSpecified() {
+        final Swagger swagger = spy(new Swagger());
+
+        RestSwaggerSupport.setupXForwardedHeaders(swagger, Collections.emptyMap());
+
+        verifyZeroInteractions(swagger);
+    }
+
+    static Stream<Arguments> basePathAndPrefixVariations() {
+        return Stream.of(//
+            arguments("/prefix", "/base", "/prefix/base"), //
+            arguments("/prefix", "/base/", "/prefix/base/"), //
+            arguments("/prefix", "base", "/prefix/base"), //
+            arguments("/prefix", "base/", "/prefix/base/"), //
+            arguments("/prefix", "", "/prefix"), //
+            arguments("/prefix", null, "/prefix"), //
+            arguments("/prefix/", "/base", "/prefix/base"), //
+            arguments("/prefix/", "/base/", "/prefix/base/"), //
+            arguments("/prefix/", "base", "/prefix/base"), //
+            arguments("/prefix/", "base/", "/prefix/base/"), //
+            arguments("/prefix/", "", "/prefix/"), //
+            arguments("/prefix/", null, "/prefix/"), //
+            arguments("prefix", "/base", "prefix/base"), //
+            arguments("prefix", "/base/", "prefix/base/"), //
+            arguments("prefix", "base", "prefix/base"), //
+            arguments("prefix", "base/", "prefix/base/"), //
+            arguments("prefix", "", "prefix"), //
+            arguments("prefix", null, "prefix"), //
+            arguments("prefix/", "/base", "prefix/base"), //
+            arguments("prefix/", "/base/", "prefix/base/"), //
+            arguments("prefix/", "base", "prefix/base"), //
+            arguments("prefix/", "base/", "prefix/base/"), //
+            arguments("prefix/", "", "prefix/"), //
+            arguments("prefix/", null, "prefix/") //
+        );
+    }
+
+    static Stream<Arguments> schemeVariations() {
+        final Scheme[] none = new Scheme[0];
+
+        return Stream.of(//
+            arguments(null, none), //
+            arguments("", none), //
+            arguments(",", none), //
+            arguments(" , ", none), //
+            arguments("HTTPS,http", new Scheme[] {Scheme.HTTPS, Scheme.HTTP}), //
+            arguments(" HTTPS,  http ", new Scheme[] {Scheme.HTTPS, Scheme.HTTP}), //
+            arguments(",http,", new Scheme[] {Scheme.HTTP}), //
+            arguments("hTtpS", new Scheme[] {Scheme.HTTPS})//
+        );
+    }
+}