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

[1/3] camel git commit: CAMEL-11113 camel-catalog build uri improved with an esaier way when we have all the parameters

Repository: camel
Updated Branches:
  refs/heads/master 994bea0cf -> 6a97606f0


CAMEL-11113 camel-catalog build uri improved with an esaier way when we have all the parameters


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6a97606f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6a97606f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6a97606f

Branch: refs/heads/master
Commit: 6a97606f035c38e46c97cad1943b4d3a4abdda20
Parents: 6743f74
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Apr 6 12:58:00 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Apr 6 12:59:05 2017 +0200

----------------------------------------------------------------------
 .../camel/catalog/AbstractCamelCatalog.java     | 189 ++++++++++-------
 .../camel/catalog/AbstractCamelCatalog.java     | 209 +++++++++++++------
 .../camel/catalog/JSonSchemaResolver.java       |   2 +-
 .../apache/camel/catalog/CamelCatalogTest.java  |  12 ++
 4 files changed, 272 insertions(+), 140 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6a97606f/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java b/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
index 7135400..6511eff 100644
--- a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
+++ b/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
@@ -913,97 +913,117 @@ public abstract class AbstractCamelCatalog {
             }
         }
 
-        
+        // do we have all the options the original syntax needs (easy way)
+        String[] keys = syntaxKeys(originalSyntax);
+        boolean hasAllKeys = properties.keySet().containsAll(Arrays.asList(keys));
 
-        // the tokens between the options in the path
-        String[] oldTokens = syntax.split("\\w+");
-        String[] tokens = syntaxTokens(syntax);
-
-        // parse the syntax into each options
-        Matcher matcher = SYNTAX_PATTERN.matcher(originalSyntax);
-        List<String> options = new ArrayList<String>();
-        while (matcher.find()) {
-            String s = matcher.group(1);
-            options.add(s);
-        }
-
-        // need to preserve {{ and }} from the syntax
-        // (we need to use words only as its provisional placeholders)
-        syntax = syntax.replaceAll("\\{\\{", "BEGINCAMELPLACEHOLDER");
-        syntax = syntax.replaceAll("\\}\\}", "ENDCAMELPLACEHOLDER");
-
-        // parse the syntax into each options
-        Matcher matcher2 = SYNTAX_PATTERN.matcher(syntax);
-        List<String> options2 = new ArrayList<String>();
-        while (matcher2.find()) {
-            String s = matcher2.group(1);
-            s = s.replaceAll("BEGINCAMELPLACEHOLDER", "\\{\\{");
-            s = s.replaceAll("ENDCAMELPLACEHOLDER", "\\}\\}");
-            options2.add(s);
-        }
-
-        // build the endpoint
+        // build endpoint uri
         StringBuilder sb = new StringBuilder();
         sb.append(scheme);
         sb.append(":");
 
-        int range = 0;
-        boolean first = true;
-        boolean hasQuestionmark = false;
-        for (int i = 0; i < options.size(); i++) {
-            String key = options.get(i);
-            String key2 = options2.get(i);
-            String token = null;
-            if (tokens.length > i) {
-                token = tokens[i];
+        if (hasAllKeys) {
+            // we have all the keys for the syntax so we can build the uri the easy way
+            sb.append(syntax);
+
+            if (!copy.isEmpty()) {
+                boolean hasQuestionmark = sb.toString().contains("?");
+                // the last option may already contain a ? char, if so we should use & instead of ?
+                sb.append(hasQuestionmark ? ampersand : '?');
+                String query = createQueryString(copy, ampersand, encode);
+                sb.append(query);
+            }
+        } else {
+            // TODO: revisit this and see if we can do this in another way
+            // oh darn some options is missing, so we need a complex way of building the uri
+
+            // the tokens between the options in the path
+            String[] tokens = syntax.split("\\w+");
+
+            // parse the syntax into each options
+            Matcher matcher = SYNTAX_PATTERN.matcher(originalSyntax);
+            List<String> options = new ArrayList<String>();
+            while (matcher.find()) {
+                String s = matcher.group(1);
+                options.add(s);
+            }
+
+            // need to preserve {{ and }} from the syntax
+            // (we need to use words only as its provisional placeholders)
+            syntax = syntax.replaceAll("\\{\\{", "BEGINCAMELPLACEHOLDER");
+            syntax = syntax.replaceAll("\\}\\}", "ENDCAMELPLACEHOLDER");
+
+            // parse the syntax into each options
+            Matcher matcher2 = SYNTAX_PATTERN.matcher(syntax);
+            List<String> options2 = new ArrayList<String>();
+            while (matcher2.find()) {
+                String s = matcher2.group(1);
+                s = s.replaceAll("BEGINCAMELPLACEHOLDER", "\\{\\{");
+                s = s.replaceAll("ENDCAMELPLACEHOLDER", "\\}\\}");
+                options2.add(s);
             }
 
-            boolean contains = properties.containsKey(key);
-            if (!contains) {
-                // if the key are similar we have no explicit value and can try to find a default value if the option is required
-                if (isPropertyRequired(rows, key)) {
-                    String value = getPropertyDefaultValue(rows, key);
-                    if (value != null) {
-                        properties.put(key, value);
-                        key2 = value;
+            // build the endpoint
+            int range = 0;
+            boolean first = true;
+            boolean hasQuestionmark = false;
+            for (int i = 0; i < options.size(); i++) {
+                String key = options.get(i);
+                String key2 = options2.get(i);
+                String token = null;
+                if (tokens.length > i) {
+                    token = tokens[i];
+                }
+
+                boolean contains = properties.containsKey(key);
+                if (!contains) {
+                    // if the key are similar we have no explicit value and can try to find a default value if the option is required
+                    if (isPropertyRequired(rows, key)) {
+                        String value = getPropertyDefaultValue(rows, key);
+                        if (value != null) {
+                            properties.put(key, value);
+                            key2 = value;
+                        }
                     }
                 }
-            }
 
-            // was the option provided?
-            if (properties.containsKey(key)) {
-                if (!first && token != null) {
-                    sb.append(token);
+                // was the option provided?
+                if (properties.containsKey(key)) {
+                    if (!first && token != null) {
+                        sb.append(token);
+                    }
+                    hasQuestionmark |= key.contains("?") || (token != null && token.contains("?"));
+                    sb.append(key2);
+                    first = false;
                 }
-                hasQuestionmark |= key.contains("?") || (token != null && token.contains("?"));
-                sb.append(key2);
-                first = false;
+                range++;
             }
-            range++;
-        }
-        // append any extra options that was in surplus for the last
-        while (range < options2.size()) {
-            String token = null;
-            if (tokens.length > range) {
-                token = tokens[range];
+            // append any extra options that was in surplus for the last
+            while (range < options2.size()) {
+                String token = null;
+                if (tokens.length > range) {
+                    token = tokens[range];
+                }
+                String key2 = options2.get(range);
+                sb.append(token);
+                sb.append(key2);
+                hasQuestionmark |= key2.contains("?") || (token != null && token.contains("?"));
+                range++;
             }
-            String key2 = options2.get(range);
-            sb.append(token);
-            sb.append(key2);
-            hasQuestionmark |= key2.contains("?") || (token != null && token.contains("?"));
-            range++;
-        }
 
-        if (!copy.isEmpty()) {
-            // the last option may already contain a ? char, if so we should use & instead of ?
-            sb.append(hasQuestionmark ? ampersand : '?');
-            String query = createQueryString(copy, ampersand, encode);
-            sb.append(query);
+
+            if (!copy.isEmpty()) {
+                // the last option may already contain a ? char, if so we should use & instead of ?
+                sb.append(hasQuestionmark ? ampersand : '?');
+                String query = createQueryString(copy, ampersand, encode);
+                sb.append(query);
+            }
         }
 
         return sb.toString();
     }
 
+    @Deprecated
     private static String[] syntaxTokens(String syntax) {
         // build tokens between the words
         List<String> tokens = new ArrayList<>();
@@ -1031,6 +1051,31 @@ public abstract class AbstractCamelCatalog {
         return tokens.toArray(new String[tokens.size()]);
     }
 
+    private static String[] syntaxKeys(String syntax) {
+        // build tokens between the separators
+        List<String> tokens = new ArrayList<>();
+
+        String current = "";
+        for (int i = 0; i < syntax.length(); i++) {
+            char ch = syntax.charAt(i);
+            if (Character.isLetterOrDigit(ch)) {
+                current += ch;
+            } else {
+                // reset for new current tokens
+                if (current.length() > 0) {
+                    tokens.add(current);
+                    current = "";
+                }
+            }
+        }
+        // anything left over?
+        if (current.length() > 0) {
+            tokens.add(current);
+        }
+
+        return tokens.toArray(new String[tokens.size()]);
+    }
+
     public SimpleValidationResult validateSimpleExpression(String simple) {
         return doValidateSimple(null, simple, false);
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/6a97606f/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java b/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
index 7fd25c8..6511eff 100644
--- a/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
+++ b/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
@@ -913,92 +913,167 @@ public abstract class AbstractCamelCatalog {
             }
         }
 
-        // the tokens between the options in the path
-        String[] tokens = syntax.split("\\w+");
+        // do we have all the options the original syntax needs (easy way)
+        String[] keys = syntaxKeys(originalSyntax);
+        boolean hasAllKeys = properties.keySet().containsAll(Arrays.asList(keys));
 
-        // parse the syntax into each options
-        Matcher matcher = SYNTAX_PATTERN.matcher(originalSyntax);
-        List<String> options = new ArrayList<String>();
-        while (matcher.find()) {
-            String s = matcher.group(1);
-            options.add(s);
-        }
-
-        // need to preserve {{ and }} from the syntax
-        // (we need to use words only as its provisional placeholders)
-        syntax = syntax.replaceAll("\\{\\{", "BEGINCAMELPLACEHOLDER");
-        syntax = syntax.replaceAll("\\}\\}", "ENDCAMELPLACEHOLDER");
-
-        // parse the syntax into each options
-        Matcher matcher2 = SYNTAX_PATTERN.matcher(syntax);
-        List<String> options2 = new ArrayList<String>();
-        while (matcher2.find()) {
-            String s = matcher2.group(1);
-            s = s.replaceAll("BEGINCAMELPLACEHOLDER", "\\{\\{");
-            s = s.replaceAll("ENDCAMELPLACEHOLDER", "\\}\\}");
-            options2.add(s);
-        }
-
-        // build the endpoint
+        // build endpoint uri
         StringBuilder sb = new StringBuilder();
         sb.append(scheme);
         sb.append(":");
 
-        int range = 0;
-        boolean first = true;
-        boolean hasQuestionmark = false;
-        for (int i = 0; i < options.size(); i++) {
-            String key = options.get(i);
-            String key2 = options2.get(i);
-            String token = null;
-            if (tokens.length > i) {
-                token = tokens[i];
+        if (hasAllKeys) {
+            // we have all the keys for the syntax so we can build the uri the easy way
+            sb.append(syntax);
+
+            if (!copy.isEmpty()) {
+                boolean hasQuestionmark = sb.toString().contains("?");
+                // the last option may already contain a ? char, if so we should use & instead of ?
+                sb.append(hasQuestionmark ? ampersand : '?');
+                String query = createQueryString(copy, ampersand, encode);
+                sb.append(query);
+            }
+        } else {
+            // TODO: revisit this and see if we can do this in another way
+            // oh darn some options is missing, so we need a complex way of building the uri
+
+            // the tokens between the options in the path
+            String[] tokens = syntax.split("\\w+");
+
+            // parse the syntax into each options
+            Matcher matcher = SYNTAX_PATTERN.matcher(originalSyntax);
+            List<String> options = new ArrayList<String>();
+            while (matcher.find()) {
+                String s = matcher.group(1);
+                options.add(s);
             }
 
-            boolean contains = properties.containsKey(key);
-            if (!contains) {
-                // if the key are similar we have no explicit value and can try to find a default value if the option is required
-                if (isPropertyRequired(rows, key)) {
-                    String value = getPropertyDefaultValue(rows, key);
-                    if (value != null) {
-                        properties.put(key, value);
-                        key2 = value;
+            // need to preserve {{ and }} from the syntax
+            // (we need to use words only as its provisional placeholders)
+            syntax = syntax.replaceAll("\\{\\{", "BEGINCAMELPLACEHOLDER");
+            syntax = syntax.replaceAll("\\}\\}", "ENDCAMELPLACEHOLDER");
+
+            // parse the syntax into each options
+            Matcher matcher2 = SYNTAX_PATTERN.matcher(syntax);
+            List<String> options2 = new ArrayList<String>();
+            while (matcher2.find()) {
+                String s = matcher2.group(1);
+                s = s.replaceAll("BEGINCAMELPLACEHOLDER", "\\{\\{");
+                s = s.replaceAll("ENDCAMELPLACEHOLDER", "\\}\\}");
+                options2.add(s);
+            }
+
+            // build the endpoint
+            int range = 0;
+            boolean first = true;
+            boolean hasQuestionmark = false;
+            for (int i = 0; i < options.size(); i++) {
+                String key = options.get(i);
+                String key2 = options2.get(i);
+                String token = null;
+                if (tokens.length > i) {
+                    token = tokens[i];
+                }
+
+                boolean contains = properties.containsKey(key);
+                if (!contains) {
+                    // if the key are similar we have no explicit value and can try to find a default value if the option is required
+                    if (isPropertyRequired(rows, key)) {
+                        String value = getPropertyDefaultValue(rows, key);
+                        if (value != null) {
+                            properties.put(key, value);
+                            key2 = value;
+                        }
                     }
                 }
-            }
 
-            // was the option provided?
-            if (properties.containsKey(key)) {
-                if (!first && token != null) {
-                    sb.append(token);
+                // was the option provided?
+                if (properties.containsKey(key)) {
+                    if (!first && token != null) {
+                        sb.append(token);
+                    }
+                    hasQuestionmark |= key.contains("?") || (token != null && token.contains("?"));
+                    sb.append(key2);
+                    first = false;
+                }
+                range++;
+            }
+            // append any extra options that was in surplus for the last
+            while (range < options2.size()) {
+                String token = null;
+                if (tokens.length > range) {
+                    token = tokens[range];
                 }
-                hasQuestionmark |= key.contains("?") || (token != null && token.contains("?"));
+                String key2 = options2.get(range);
+                sb.append(token);
                 sb.append(key2);
-                first = false;
+                hasQuestionmark |= key2.contains("?") || (token != null && token.contains("?"));
+                range++;
+            }
+
+
+            if (!copy.isEmpty()) {
+                // the last option may already contain a ? char, if so we should use & instead of ?
+                sb.append(hasQuestionmark ? ampersand : '?');
+                String query = createQueryString(copy, ampersand, encode);
+                sb.append(query);
             }
-            range++;
         }
-        // append any extra options that was in surplus for the last
-        while (range < options2.size()) {
-            String token = null;
-            if (tokens.length > range) {
-                token = tokens[range];
+
+        return sb.toString();
+    }
+
+    @Deprecated
+    private static String[] syntaxTokens(String syntax) {
+        // build tokens between the words
+        List<String> tokens = new ArrayList<>();
+        // preserve backwards behavior which had an empty token first
+        tokens.add("");
+
+        String current = "";
+        for (int i = 0; i < syntax.length(); i++) {
+            char ch = syntax.charAt(i);
+            if (Character.isLetterOrDigit(ch)) {
+                // reset for new current tokens
+                if (current.length() > 0) {
+                    tokens.add(current);
+                    current = "";
+                }
+            } else {
+                current += ch;
             }
-            String key2 = options2.get(range);
-            sb.append(token);
-            sb.append(key2);
-            hasQuestionmark |= key2.contains("?") || (token != null && token.contains("?"));
-            range++;
         }
+        // anything left over?
+        if (current.length() > 0) {
+            tokens.add(current);
+        }
+
+        return tokens.toArray(new String[tokens.size()]);
+    }
 
-        if (!copy.isEmpty()) {
-            // the last option may already contain a ? char, if so we should use & instead of ?
-            sb.append(hasQuestionmark ? ampersand : '?');
-            String query = createQueryString(copy, ampersand, encode);
-            sb.append(query);
+    private static String[] syntaxKeys(String syntax) {
+        // build tokens between the separators
+        List<String> tokens = new ArrayList<>();
+
+        String current = "";
+        for (int i = 0; i < syntax.length(); i++) {
+            char ch = syntax.charAt(i);
+            if (Character.isLetterOrDigit(ch)) {
+                current += ch;
+            } else {
+                // reset for new current tokens
+                if (current.length() > 0) {
+                    tokens.add(current);
+                    current = "";
+                }
+            }
+        }
+        // anything left over?
+        if (current.length() > 0) {
+            tokens.add(current);
         }
 
-        return sb.toString();
+        return tokens.toArray(new String[tokens.size()]);
     }
 
     public SimpleValidationResult validateSimpleExpression(String simple) {

http://git-wip-us.apache.org/repos/asf/camel/blob/6a97606f/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java b/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
index e992f95..9bf09cc 100644
--- a/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
+++ b/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
@@ -17,7 +17,7 @@
 package org.apache.camel.catalog;
 
 /**
- * Pluggable resolver to load JSon schmea files for components, data formats, languages etc.
+ * Pluggable resolver to load JSon schema files for components, data formats, languages etc.
  */
 public interface JSonSchemaResolver {
 

http://git-wip-us.apache.org/repos/asf/camel/blob/6a97606f/platforms/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/platforms/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index 3494c62..3b9952c 100644
--- a/platforms/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ b/platforms/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.catalog;
 
 import java.io.FileInputStream;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -299,6 +300,17 @@ public class CamelCatalogTest {
     }
 
     @Test
+    public void testAsEndpointUriRestUriTemplate() throws Exception {
+        Map<String, String> map = new LinkedHashMap<>();
+        map.put("method", "get");
+        map.put("path", "api");
+        map.put("uriTemplate", "user/{id}");
+        String uri = catalog.asEndpointUri("rest", map, true);
+
+        assertEquals("rest:get:api:user/{id}", uri);
+    }
+
+    @Test
     public void testAsEndpointUriJson() throws Exception {
         String json = loadText(CamelCatalogTest.class.getClassLoader().getResourceAsStream("sample.json"));
         String uri = catalog.asEndpointUri("ftp", json, true);


[3/3] camel git commit: CAMEL-11113 added unit tests

Posted by da...@apache.org.
CAMEL-11113 added unit tests


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d7f23195
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d7f23195
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d7f23195

Branch: refs/heads/master
Commit: d7f23195a4fe55d45b7125dbf1ecaa04043c5f08
Parents: 994bea0
Author: Zoran Regvart <zr...@apache.org>
Authored: Wed Apr 5 16:01:33 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Apr 6 12:59:05 2017 +0200

----------------------------------------------------------------------
 .../camel/catalog/AbstractCamelCatalog.java     |   2 +-
 .../camel/catalog/AbstractCamelCatalogTest.java | 104 +++++++++++++++++++
 .../camel/catalog/AbstractCamelCatalog.java     |   2 +-
 3 files changed, 106 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/d7f23195/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java b/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
index 6c1e3d4..7fd25c8 100644
--- a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
+++ b/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
@@ -872,7 +872,7 @@ public abstract class AbstractCamelCatalog {
         return doAsEndpointUri(scheme, properties, "&amp;", encode);
     }
 
-    private String doAsEndpointUri(String scheme, Map<String, String> properties, String ampersand, boolean encode) throws URISyntaxException {
+    String doAsEndpointUri(String scheme, Map<String, String> properties, String ampersand, boolean encode) throws URISyntaxException {
         String json = jsonSchemaResolver.getComponentJSonSchema(scheme);
         if (json == null) {
             throw new IllegalArgumentException("Cannot find endpoint with scheme " + scheme);

http://git-wip-us.apache.org/repos/asf/camel/blob/d7f23195/camel-core/src/test/java/org/apache/camel/catalog/AbstractCamelCatalogTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/catalog/AbstractCamelCatalogTest.java b/camel-core/src/test/java/org/apache/camel/catalog/AbstractCamelCatalogTest.java
new file mode 100644
index 0000000..ed7e997
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/catalog/AbstractCamelCatalogTest.java
@@ -0,0 +1,104 @@
+/**
+ * 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.catalog;
+
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.mock;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+
+public class AbstractCamelCatalogTest {
+
+    AbstractCamelCatalog catalog = new AbstractCamelCatalog() {
+    };
+
+    JSonSchemaResolver resolver;
+
+    @Before
+    public void setupMockCatalog() {
+        resolver = mock(JSonSchemaResolver.class);
+
+        catalog.setJSonSchemaResolver(resolver);
+    }
+
+    @Test
+    public void shouldConstructEndpointUris() throws URISyntaxException {
+        expect(resolver.getComponentJSonSchema("comp")).andReturn("{\n"//
+            + "  \"component\": {\n"//
+            + "    \"syntax\": \"comp:param1:param2\"\n"//
+            + "  }\n"//
+            + "}");
+
+        replay(resolver);
+
+        final Map<String, String> properties = new HashMap<>();
+        properties.put("param1", "value1");
+        properties.put("param2", "value2");
+        properties.put("param3", "value3");
+
+        final String endpointUri = catalog.doAsEndpointUri("comp", properties, "&", false);
+
+        assertEquals("comp:value1:value2?param3=value3", endpointUri);
+    }
+
+    @Test
+    public void shouldConstructEndpointUrisWithPropertyPlaceholders() throws URISyntaxException {
+        expect(resolver.getComponentJSonSchema("comp")).andReturn("{\n"//
+            + "  \"component\": {\n"//
+            + "    \"syntax\": \"comp:param1:param2\"\n"//
+            + "  }\n"//
+            + "}");
+
+        replay(resolver);
+
+        final Map<String, String> properties = new HashMap<>();
+        properties.put("param1", "{{prop1}}");
+        properties.put("param2", "{{prop2}}");
+        properties.put("param3", "{{prop3}}");
+
+        final String endpointUri = catalog.doAsEndpointUri("comp", properties, "&", false);
+
+        assertEquals("comp:{{prop1}}:{{prop2}}?param3={{prop3}}", endpointUri);
+    }
+
+    @Test
+    public void shouldConstructEndpointUrisWhenValuesContainTokens() throws URISyntaxException {
+        expect(resolver.getComponentJSonSchema("comp")).andReturn("{\n"//
+            + "  \"component\": {\n"//
+            + "    \"syntax\": \"comp:param1:param2\"\n"//
+            + "  }\n"//
+            + "}");
+
+        replay(resolver);
+
+        final Map<String, String> properties = new HashMap<>();
+        properties.put("param1", "{value1}");
+        properties.put("param2", "/value2/");
+        properties.put("param3", "/value3/{param}");
+
+        final String endpointUri = catalog.doAsEndpointUri("comp", properties, "&", false);
+
+        assertEquals("comp:{value1}:/value2/?param3=/value3/{param}", endpointUri);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/d7f23195/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
----------------------------------------------------------------------
diff --git a/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java b/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
index 6c1e3d4..7fd25c8 100644
--- a/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
+++ b/platforms/camel-catalog/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
@@ -872,7 +872,7 @@ public abstract class AbstractCamelCatalog {
         return doAsEndpointUri(scheme, properties, "&amp;", encode);
     }
 
-    private String doAsEndpointUri(String scheme, Map<String, String> properties, String ampersand, boolean encode) throws URISyntaxException {
+    String doAsEndpointUri(String scheme, Map<String, String> properties, String ampersand, boolean encode) throws URISyntaxException {
         String json = jsonSchemaResolver.getComponentJSonSchema(scheme);
         if (json == null) {
             throw new IllegalArgumentException("Cannot find endpoint with scheme " + scheme);


[2/3] camel git commit: CAMEL-11113 work in progress

Posted by da...@apache.org.
CAMEL-11113 work in progress


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6743f743
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6743f743
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6743f743

Branch: refs/heads/master
Commit: 6743f7437a299e5b549d6e703b91a6559a6f064a
Parents: d7f2319
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Apr 6 10:59:47 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Apr 6 12:59:05 2017 +0200

----------------------------------------------------------------------
 .../camel/catalog/AbstractCamelCatalog.java     | 32 +++++++++++++++++++-
 .../camel/catalog/JSonSchemaResolver.java       |  2 +-
 2 files changed, 32 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6743f743/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java b/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
index 7fd25c8..7135400 100644
--- a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
+++ b/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
@@ -913,8 +913,11 @@ public abstract class AbstractCamelCatalog {
             }
         }
 
+        
+
         // the tokens between the options in the path
-        String[] tokens = syntax.split("\\w+");
+        String[] oldTokens = syntax.split("\\w+");
+        String[] tokens = syntaxTokens(syntax);
 
         // parse the syntax into each options
         Matcher matcher = SYNTAX_PATTERN.matcher(originalSyntax);
@@ -1001,6 +1004,33 @@ public abstract class AbstractCamelCatalog {
         return sb.toString();
     }
 
+    private static String[] syntaxTokens(String syntax) {
+        // build tokens between the words
+        List<String> tokens = new ArrayList<>();
+        // preserve backwards behavior which had an empty token first
+        tokens.add("");
+
+        String current = "";
+        for (int i = 0; i < syntax.length(); i++) {
+            char ch = syntax.charAt(i);
+            if (Character.isLetterOrDigit(ch)) {
+                // reset for new current tokens
+                if (current.length() > 0) {
+                    tokens.add(current);
+                    current = "";
+                }
+            } else {
+                current += ch;
+            }
+        }
+        // anything left over?
+        if (current.length() > 0) {
+            tokens.add(current);
+        }
+
+        return tokens.toArray(new String[tokens.size()]);
+    }
+
     public SimpleValidationResult validateSimpleExpression(String simple) {
         return doValidateSimple(null, simple, false);
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/6743f743/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java b/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
index e992f95..9bf09cc 100644
--- a/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
+++ b/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java
@@ -17,7 +17,7 @@
 package org.apache.camel.catalog;
 
 /**
- * Pluggable resolver to load JSon schmea files for components, data formats, languages etc.
+ * Pluggable resolver to load JSon schema files for components, data formats, languages etc.
  */
 public interface JSonSchemaResolver {