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 2016/01/04 13:44:13 UTC

[1/7] camel git commit: CAMEL-9472: Add multi value to component docs

Repository: camel
Updated Branches:
  refs/heads/camel-2.16.x b234404c4 -> 609c21366
  refs/heads/master 348e1bcc2 -> c74fdf5cc


CAMEL-9472: Add multi value to component docs


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

Branch: refs/heads/master
Commit: 409a5380fde8d16202cd7ec7668cd9452fbde9fb
Parents: 348e1bc
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Jan 4 12:18:50 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 4 12:22:14 2016 +0100

----------------------------------------------------------------------
 .../camel/impl/ScheduledPollEndpoint.java       |  2 +-
 .../camel/catalog/DefaultCamelCatalog.java      | 30 ++++++++---
 .../apache/camel/catalog/JSonSchemaHelper.java  | 52 ++++++++++++++++++++
 .../apache/camel/catalog/CamelCatalogTest.java  |  4 ++
 .../camel/tools/apt/EipAnnotationProcessor.java |  2 +-
 .../tools/apt/EndpointAnnotationProcessor.java  | 25 +++++++---
 .../tools/apt/helper/JsonSchemaHelper.java      | 12 ++++-
 .../camel/tools/apt/model/EndpointOption.java   | 15 +++++-
 .../tools/apt/EndpointOptionComparatorTest.java |  8 +--
 .../java/org/apache/camel/spi/UriParam.java     | 12 +++++
 10 files changed, 139 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
index 13335c9..6d1b938 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
@@ -76,7 +76,7 @@ public abstract class ScheduledPollEndpoint extends DefaultEndpoint {
             defaultValue = "none", label = "consumer,scheduler", description = "To use a cron scheduler from either camel-spring or camel-quartz2 component")
     private ScheduledPollConsumerScheduler scheduler;
     private String schedulerName = "none"; // used when configuring scheduler using a string value
-    @UriParam(optionalPrefix = "consumer.", label = "consumer,scheduler",
+    @UriParam(prefix = "scheduler.", multiValue = true, label = "consumer,scheduler",
             description = "To configure additional properties when using a custom scheduler or any of the Quartz2, Spring based scheduler.")
     private Map<String, Object> schedulerProperties;
     @UriParam(optionalPrefix = "consumer.", label = "consumer,scheduler",

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index a4e638a..79a50bf 100644
--- a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -47,9 +47,12 @@ import static org.apache.camel.catalog.JSonSchemaHelper.getNames;
 import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyDefaultValue;
 import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyEnum;
 import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyKind;
+import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyNameFromNameWithPrefix;
+import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyPrefix;
 import static org.apache.camel.catalog.JSonSchemaHelper.getRow;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyBoolean;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyInteger;
+import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyMultiValue;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyNumber;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyObject;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyRequired;
@@ -752,13 +755,25 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
         // validate all the options
         for (Map.Entry<String, String> property : properties.entrySet()) {
+            String value = property.getValue();
+
+            String originalName = property.getKey();
             String name = property.getKey();
             // the name may be using an optional prefix, so lets strip that because the options
             // in the schema are listed without the prefix
             name = stripOptionalPrefixFromName(rows, name);
-            String value = property.getValue();
+            // the name may be using a prefix, so lets see if we can find the real property name
+            String propertyName = getPropertyNameFromNameWithPrefix(rows, name);
+            if (propertyName != null) {
+                name = propertyName;
+            }
+
+            String prefix = getPropertyPrefix(rows, name);
+            String kind = getPropertyKind(rows, name);
             boolean placeholder = value.startsWith("{{") || value.startsWith("${") || value.startsWith("$simple{");
             boolean lookup = value.startsWith("#") && value.length() > 1;
+            // we cannot evaluate multi values as strict as the others, as we don't know their expected types
+            boolean mulitValue = prefix != null && originalName.startsWith(prefix) && isPropertyMultiValue(rows, name);
 
             Map<String, String> row = getRow(rows, name);
             if (row == null) {
@@ -786,7 +801,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 // is enum but the value is not within the enum range
                 // but we can only check if the value is not a placeholder
                 String enums = getPropertyEnum(rows, name);
-                if (!placeholder && !lookup && enums != null) {
+                if (!mulitValue && !placeholder && !lookup && enums != null) {
                     String[] choices = enums.split(",");
                     boolean found = false;
                     for (String s : choices) {
@@ -801,9 +816,8 @@ public class DefaultCamelCatalog implements CamelCatalog {
                     }
                 }
 
-                // is reference lookup of bean (not applicable for @UriPath)
-                String kind = getPropertyKind(rows, name);
-                if (!"path".equals(kind) && isPropertyObject(rows, name)) {
+                // is reference lookup of bean (not applicable for @UriPath, or multi-valued)
+                if (!mulitValue && !"path".equals(kind) && isPropertyObject(rows, name)) {
                     // must start with # and be at least 2 characters
                     if (!value.startsWith("#") || value.length() <= 1) {
                         result.addInvalidReference(name, value);
@@ -811,7 +825,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 }
 
                 // is boolean
-                if (!placeholder && !lookup && isPropertyBoolean(rows, name)) {
+                if (!mulitValue && !placeholder && !lookup && isPropertyBoolean(rows, name)) {
                     // value must be a boolean
                     boolean bool = "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value);
                     if (!bool) {
@@ -820,7 +834,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 }
 
                 // is integer
-                if (!placeholder && !lookup && isPropertyInteger(rows, name)) {
+                if (!mulitValue && !placeholder && !lookup && isPropertyInteger(rows, name)) {
                     // value must be an integer
                     boolean valid = validateInteger(value);
                     if (!valid) {
@@ -829,7 +843,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 }
 
                 // is number
-                if (!placeholder && !lookup && isPropertyNumber(rows, name)) {
+                if (!mulitValue && !placeholder && !lookup && isPropertyNumber(rows, name)) {
                     // value must be an number
                     boolean valid = false;
                     try {

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
index 2293a7a..4e4624a 100644
--- a/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
+++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
@@ -273,6 +273,58 @@ public final class JSonSchemaHelper {
         return null;
     }
 
+    public static String getPropertyPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String prefix = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equals(row.get("name"));
+            }
+            if (row.containsKey("prefix")) {
+                prefix = row.get("prefix");
+            }
+            if (found) {
+                return prefix;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isPropertyMultiValue(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean multiValue = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equals(row.get("name"));
+            }
+            if (row.containsKey("multiValue")) {
+                multiValue = "true".equals(row.get("multiValue"));
+            }
+            if (found) {
+                return multiValue;
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyNameFromNameWithPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String propertyName = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                propertyName = row.get("name");
+            }
+            if (row.containsKey("prefix")) {
+                String preifx = row.get("prefix");
+                found = name.startsWith(preifx);
+            }
+            if (found) {
+                return propertyName;
+            }
+        }
+        return null;
+    }
+
     public static Map<String, String> getRow(List<Map<String, String>> rows, String key) {
         for (Map<String, String> row : rows) {
             if (key.equals(row.get("name"))) {

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index 0b8923f..28c8cef 100644
--- a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -480,6 +480,10 @@ public class CamelCatalogTest {
         // mixed optional without consumer. prefix
         result = catalog.validateEndpointProperties("file:inbox?delay=5000&consumer.greedy=true");
         assertTrue(result.isSuccess());
+
+        // prefix
+        result = catalog.validateEndpointProperties("file:inbox?delay=5000&scheduler.foo=123&scheduler.bar=456");
+        assertTrue(result.isSuccess());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
index 294804c..eadb6fe 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
@@ -207,7 +207,7 @@ public class EipAnnotationProcessor extends AbstractAnnotationProcessor {
             String doc = entry.getDocumentation();
             doc = sanitizeDescription(doc, false);
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getKind(), entry.isRequired(), entry.getType(), entry.getDefaultValue(), doc,
-                    entry.isDeprecated(), null, null, entry.isEnumType(), entry.getEnums(), entry.isOneOf(), entry.getOneOfTypes(), null));
+                    entry.isDeprecated(), null, null, entry.isEnumType(), entry.getEnums(), entry.isOneOf(), entry.getOneOfTypes(), null, null, false));
         }
         buffer.append("\n  }");
 

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
index 3dc29af..93c6022 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
@@ -249,11 +249,14 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                 defaultValue = "false";
             }
 
-            // component options do not have optional prefix
+            // component options do not have prefix
             String optionalPrefix = "";
+            String prefix = "";
+            boolean multiValue = false;
 
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), "property", required, entry.getType(), defaultValue, doc,
-                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null, optionalPrefix));
+                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null,
+                    optionalPrefix, prefix, multiValue));
         }
         buffer.append("\n  },");
 
@@ -297,11 +300,14 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                 defaultValue = "false";
             }
 
-            // @UriPath options do not have optional prefix
+            // @UriPath options do not have prefix
             String optionalPrefix = "";
+            String prefix = "";
+            boolean multiValue = false;
 
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), "path", required, entry.getType(), defaultValue, doc,
-                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null, optionalPrefix));
+                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null,
+                    optionalPrefix, prefix, multiValue));
         }
 
         // sort the endpoint options in the standard order we prefer
@@ -341,9 +347,12 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                 defaultValue = "false";
             }
             String optionalPrefix = entry.getOptionalPrefix();
+            String prefix = entry.getPrefix();
+            boolean multiValue = entry.isMultiValue();
 
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), "parameter", required, entry.getType(), defaultValue,
-                    doc, entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null, optionalPrefix));
+                    doc, entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null,
+                    optionalPrefix, prefix, multiValue));
         }
         buffer.append("\n  }");
 
@@ -672,7 +681,9 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                     }
                     name = prefix + name;
 
-                    String optionalPrefix = param.optionalPrefix();
+                    String paramOptionalPrefix = param.optionalPrefix();
+                    String paramPrefix = param.prefix();
+                    boolean multiValue = param.multiValue();
                     String defaultValue = param.defaultValue();
                     if (defaultValue == null && metadata != null) {
                         defaultValue = metadata.defaultValue();
@@ -737,7 +748,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
 
                         String group = EndpointHelper.labelAsGroupName(label, componentModel.isConsumerOnly(), componentModel.isProducerOnly());
                         EndpointOption option = new EndpointOption(name, fieldTypeName, required, defaultValue, defaultValueNote,
-                                docComment.trim(), optionalPrefix, deprecated, group, label, isEnum, enums);
+                                docComment.trim(), paramOptionalPrefix, paramPrefix, multiValue, deprecated, group, label, isEnum, enums);
                         endpointOptions.add(option);
                     }
                 }

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
index 51cf907..21ba792 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
@@ -42,7 +42,7 @@ public final class JsonSchemaHelper {
 
     public static String toJson(String name, String kind, Boolean required, String type, String defaultValue, String description,
                                 Boolean deprecated, String group, String label, boolean enumType, Set<String> enums,
-                                boolean oneOfType, Set<String> oneOffTypes, String optionalPrefix) {
+                                boolean oneOfType, Set<String> oneOffTypes, String optionalPrefix, String prefix, boolean multiValue) {
         String typeName = JsonSchemaHelper.getType(type, enumType);
 
         StringBuilder sb = new StringBuilder();
@@ -102,6 +102,16 @@ public final class JsonSchemaHelper {
             sb.append(Strings.doubleQuote(text));
         }
 
+        if (!Strings.isNullOrEmpty(prefix)) {
+            sb.append(", \"prefix\": ");
+            String text = safeDefaultValue(prefix);
+            sb.append(Strings.doubleQuote(text));
+        }
+        if (multiValue) {
+            sb.append(", \"multiValue\": ");
+            sb.append(Strings.doubleQuote("true"));
+        }
+
         if (deprecated != null) {
             sb.append(", \"deprecated\": ");
             sb.append(Strings.doubleQuote(deprecated.toString()));

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
index 3a367cf..7a45547 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
@@ -31,6 +31,8 @@ public final class EndpointOption {
     private String defaultValueNote;
     private String documentation;
     private String optionalPrefix;
+    private String prefix;
+    private boolean multiValue;
     private boolean deprecated;
     private String group;
     private String label;
@@ -38,7 +40,8 @@ public final class EndpointOption {
     private Set<String> enums;
 
     public EndpointOption(String name, String type, String required, String defaultValue, String defaultValueNote,
-                          String documentation, String optionalPrefix, boolean deprecated,  String group, String label,
+                          String documentation, String optionalPrefix, String prefix, boolean multiValue,
+                          boolean deprecated,  String group, String label,
                           boolean enumType, Set<String> enums) {
         this.name = name;
         this.type = type;
@@ -47,6 +50,8 @@ public final class EndpointOption {
         this.defaultValueNote = defaultValueNote;
         this.documentation = documentation;
         this.optionalPrefix = optionalPrefix;
+        this.prefix = prefix;
+        this.multiValue = multiValue;
         this.deprecated = deprecated;
         this.group = group;
         this.label = label;
@@ -78,6 +83,14 @@ public final class EndpointOption {
         return optionalPrefix;
     }
 
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public boolean isMultiValue() {
+        return multiValue;
+    }
+
     public boolean isDeprecated() {
         return deprecated;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java b/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
index 3d4a4fe..660dc56 100644
--- a/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
+++ b/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
@@ -39,10 +39,10 @@ public class EndpointOptionComparatorTest {
         String group3 = EndpointHelper.labelAsGroupName(label3, false, false);
         String group4 = EndpointHelper.labelAsGroupName(label4, false, false);
 
-        EndpointOption op1 = new EndpointOption("first", "string", "true", "", "", "blah", null, false, group1, label1, false, null);
-        EndpointOption op2 = new EndpointOption("synchronous", "string", "true", "", "", "blah", null, false, group2, label2, false, null);
-        EndpointOption op3 = new EndpointOption("second", "string", "true", "", "", "blah", null, false, group3, label3, false, null);
-        EndpointOption op4 = new EndpointOption("country", "string", "true", "", "", "blah", null, false, group4, label4, false, null);
+        EndpointOption op1 = new EndpointOption("first", "string", "true", "", "", "blah", null, null, false, false, group1, label1, false, null);
+        EndpointOption op2 = new EndpointOption("synchronous", "string", "true", "", "", "blah", null, null, false, false, group2, label2, false, null);
+        EndpointOption op3 = new EndpointOption("second", "string", "true", "", "", "blah", null, null, false, false, group3, label3, false, null);
+        EndpointOption op4 = new EndpointOption("country", "string", "true", "", "", "blah", null, null, false, false, group4, label4, false, null);
 
         List<EndpointOption> list = new ArrayList<EndpointOption>();
         list.add(op1);

http://git-wip-us.apache.org/repos/asf/camel/blob/409a5380/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
----------------------------------------------------------------------
diff --git a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
index ef45b2f..51760c3 100644
--- a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
+++ b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
@@ -85,6 +85,18 @@ public @interface UriParam {
     String javaType() default "";
 
     /**
+     * If the parameter can be configured multiple times, such as configuring options to a <tt>Map</tt> type.
+     */
+    boolean multiValue() default false;
+
+    /**
+     * If the parameter must be configured with a prefix.
+     * <p/>
+     * For example to configure scheduler options, the parameters is prefixed with <tt>scheduler.foo=bar</tt>
+     */
+    String prefix() default "";
+
+    /**
      * If the parameter can be configured with an optional prefix.
      * <p/>
      * For example to configure consumer options, the parameters can be prefixed with <tt>consumer.</tt>, eg <tt>consumer.delay=5000</tt>


[3/7] camel git commit: CAMEL-9472: Add multi value to component docs

Posted by da...@apache.org.
CAMEL-9472: Add multi value to component docs


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

Branch: refs/heads/master
Commit: d8655739b61051d604077d6307a3068408d59ef0
Parents: fb7fecc
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Jan 4 13:22:00 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 4 13:25:00 2016 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java  | 1 +
 .../main/java/org/apache/camel/component/jpa/JpaEndpoint.java    | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/d8655739/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java b/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
index c6afd0a..6144e8a 100755
--- a/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
+++ b/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
@@ -46,6 +46,7 @@ public class JdbcEndpoint extends DefaultEndpoint {
     private boolean transacted;
     @UriParam(defaultValue = "true")
     private boolean resetAutoCommit = true;
+    @UriParam(prefix = "statement.", multiValue = true)
     private Map<String, Object> parameters;
     @UriParam(defaultValue = "true")
     private boolean useJDBC4ColumnNameAndLabelSemantics = true;

http://git-wip-us.apache.org/repos/asf/camel/blob/d8655739/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
index 5df8112..1ce4838 100644
--- a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
+++ b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
@@ -52,7 +52,6 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     private EntityManagerFactory entityManagerFactory;
     private PlatformTransactionManager transactionManager;
     private Expression producerExpression;
-    private Map<String, Object> entityManagerProperties;
 
     @UriPath(description = "Entity class name") @Metadata(required = "true")
     private Class<?> entityType;
@@ -80,6 +79,9 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     @UriParam(label = "producer")
     private boolean remove;
 
+    @UriParam(label = "advanced", prefix = "emf.", multiValue = true)
+    private Map<String, Object> entityManagerProperties;
+
     public JpaEndpoint() {
     }
 


[7/7] camel git commit: CAMEL-9474: camel-jpa - Add consumer options to component docs

Posted by da...@apache.org.
CAMEL-9474: camel-jpa - Add consumer options to component docs


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

Branch: refs/heads/camel-2.16.x
Commit: 609c21366498b7c5e10fee2fb06a21b442f400c4
Parents: 6081591
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Jan 4 13:42:23 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 4 13:44:01 2016 +0100

----------------------------------------------------------------------
 .../apache/camel/component/jpa/JpaEndpoint.java | 149 +++++++++++++++++++
 1 file changed, 149 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/609c2136/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
index 64dd9836..b1839f1 100644
--- a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
+++ b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.jpa;
 import java.util.Map;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.LockModeType;
 
 import org.apache.camel.Consumer;
 import org.apache.camel.Exchange;
@@ -67,6 +68,27 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     @UriParam(label = "consumer")
     private int maxMessagesPerPoll;
 
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private String query;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private String namedQuery;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private String nativeQuery;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.", defaultValue = "PESSIMISTIC_WRITE")
+    private LockModeType lockModeType = LockModeType.PESSIMISTIC_WRITE;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.", multiValue = true)
+    private Map<String, Object> parameters;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private Class<?> resultClass;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private boolean transacted;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private boolean skipLockedEntity;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private DeleteHandler<Object> deleteHandler;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private DeleteHandler<Object> preDeleteHandler;
+
     @UriParam(label = "producer", defaultValue = "true")
     private boolean flushOnSend = true;
     @UriParam(label = "producer")
@@ -79,6 +101,7 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     @UriParam(label = "advanced", prefix = "emf.", multiValue = true)
     private Map<String, Object> entityManagerProperties;
 
+
     public JpaEndpoint() {
     }
 
@@ -124,6 +147,16 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
         validate();
         JpaConsumer consumer = new JpaConsumer(this, processor);
         consumer.setMaxMessagesPerPoll(getMaxMessagesPerPoll());
+        consumer.setQuery(getQuery());
+        consumer.setNamedQuery(getNamedQuery());
+        consumer.setNativeQuery(getNativeQuery());
+        consumer.setLockModeType(getLockModeType());
+        consumer.setParameters(getParameters());
+        consumer.setResultClass(getResultClass());
+        consumer.setTransacted(isTransacted());
+        consumer.setSkipLockedEntity(isSkipLockedEntity());
+        consumer.setDeleteHandler(getDeleteHandler());
+        consumer.setPreDeleteHandler(getPreDeleteHandler());
         configureConsumer(consumer);
         return consumer;
     }
@@ -344,6 +377,122 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
         this.sharedEntityManager = sharedEntityManager;
     }
 
+    public String getQuery() {
+        return query;
+    }
+
+    /**
+     * To use a custom query when consuming data.
+     */
+    public void setQuery(String query) {
+        this.query = query;
+    }
+
+    public String getNamedQuery() {
+        return namedQuery;
+    }
+
+    /**
+     * To use a named query when consuming data.
+     */
+    public void setNamedQuery(String namedQuery) {
+        this.namedQuery = namedQuery;
+    }
+
+    public String getNativeQuery() {
+        return nativeQuery;
+    }
+
+    /**
+     * To use a custom native query when consuming data. You may want to use the option consumer.resultClass also when using native queries.
+     */
+    public void setNativeQuery(String nativeQuery) {
+        this.nativeQuery = nativeQuery;
+    }
+
+    public LockModeType getLockModeType() {
+        return lockModeType;
+    }
+
+    /**
+     * To configure the lock mode on the consumer.
+     */
+    public void setLockModeType(LockModeType lockModeType) {
+        this.lockModeType = lockModeType;
+    }
+
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
+
+    /**
+     * This key/value mapping is used for building the query parameters.
+     * It's is expected to be of the generic type java.util.Map<String, Object> where the keys are the named parameters
+     * of a given JPA query and the values are their corresponding effective values you want to select for.
+     */
+    public void setParameters(Map<String, Object> parameters) {
+        this.parameters = parameters;
+    }
+
+    public Class<?> getResultClass() {
+        return resultClass;
+    }
+
+    /**
+     * Defines the type of the returned payload (we will call entityManager.createNativeQuery(nativeQuery, resultClass)
+     * instead of entityManager.createNativeQuery(nativeQuery)). Without this option, we will return an object array.
+     * Only has an affect when using in conjunction with native query when consuming data.
+     */
+    public void setResultClass(Class<?> resultClass) {
+        this.resultClass = resultClass;
+    }
+
+    public boolean isTransacted() {
+        return transacted;
+    }
+
+    /**
+     * Whether to run the consumer in transacted mode, by which all messages will either commit or rollback,
+     * when the entire batch has been processed. The default behavior (false) is to commit all the previously
+     * successfully processed messages, and only rollback the last failed message.
+     */
+    public void setTransacted(boolean transacted) {
+        this.transacted = transacted;
+    }
+
+    public boolean isSkipLockedEntity() {
+        return skipLockedEntity;
+    }
+
+    /**
+     * To configure whether to use NOWAIT on lock and silently skip the entity.
+     */
+    public void setSkipLockedEntity(boolean skipLockedEntity) {
+        this.skipLockedEntity = skipLockedEntity;
+    }
+
+    public DeleteHandler<Object> getDeleteHandler() {
+        return deleteHandler;
+    }
+
+    /**
+     * To use a custom DeleteHandler to delete the row after the consumer is done processing the exchange
+     */
+    public void setDeleteHandler(DeleteHandler<Object> deleteHandler) {
+        this.deleteHandler = deleteHandler;
+    }
+
+    public DeleteHandler<Object> getPreDeleteHandler() {
+        return preDeleteHandler;
+    }
+
+    /**
+     * To use a custom Pre-DeleteHandler to delete the row after the consumer has read the entity.
+     */
+    public void setPreDeleteHandler(DeleteHandler<Object> preDeleteHandler) {
+        this.preDeleteHandler = preDeleteHandler;
+    }
+
     // Implementation methods
     // -------------------------------------------------------------------------
 


[4/7] camel git commit: CAMEL-9474: camel-jpa - Add consumer options to component docs

Posted by da...@apache.org.
CAMEL-9474: camel-jpa - Add consumer options to component docs


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

Branch: refs/heads/master
Commit: c74fdf5cc659040c414718285fa6c97ba7d9fbdc
Parents: d865573
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Jan 4 13:42:23 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 4 13:42:23 2016 +0100

----------------------------------------------------------------------
 .../apache/camel/component/jpa/JpaEndpoint.java | 149 +++++++++++++++++++
 1 file changed, 149 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c74fdf5c/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
index 1ce4838..6cd7097 100644
--- a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
+++ b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.jpa;
 import java.util.Map;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.LockModeType;
 
 import org.apache.camel.Consumer;
 import org.apache.camel.Exchange;
@@ -70,6 +71,27 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     @UriParam(label = "consumer")
     private int maxMessagesPerPoll;
 
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private String query;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private String namedQuery;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private String nativeQuery;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.", defaultValue = "PESSIMISTIC_WRITE")
+    private LockModeType lockModeType = LockModeType.PESSIMISTIC_WRITE;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.", multiValue = true)
+    private Map<String, Object> parameters;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private Class<?> resultClass;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private boolean transacted;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private boolean skipLockedEntity;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private DeleteHandler<Object> deleteHandler;
+    @UriParam(label = "consumer", optionalPrefix = "consumer.")
+    private DeleteHandler<Object> preDeleteHandler;
+
     @UriParam(label = "producer", defaultValue = "true")
     private boolean flushOnSend = true;
     @UriParam(label = "producer")
@@ -82,6 +104,7 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     @UriParam(label = "advanced", prefix = "emf.", multiValue = true)
     private Map<String, Object> entityManagerProperties;
 
+
     public JpaEndpoint() {
     }
 
@@ -127,6 +150,16 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
         validate();
         JpaConsumer consumer = new JpaConsumer(this, processor);
         consumer.setMaxMessagesPerPoll(getMaxMessagesPerPoll());
+        consumer.setQuery(getQuery());
+        consumer.setNamedQuery(getNamedQuery());
+        consumer.setNativeQuery(getNativeQuery());
+        consumer.setLockModeType(getLockModeType());
+        consumer.setParameters(getParameters());
+        consumer.setResultClass(getResultClass());
+        consumer.setTransacted(isTransacted());
+        consumer.setSkipLockedEntity(isSkipLockedEntity());
+        consumer.setDeleteHandler(getDeleteHandler());
+        consumer.setPreDeleteHandler(getPreDeleteHandler());
         configureConsumer(consumer);
         return consumer;
     }
@@ -347,6 +380,122 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
         this.sharedEntityManager = sharedEntityManager;
     }
 
+    public String getQuery() {
+        return query;
+    }
+
+    /**
+     * To use a custom query when consuming data.
+     */
+    public void setQuery(String query) {
+        this.query = query;
+    }
+
+    public String getNamedQuery() {
+        return namedQuery;
+    }
+
+    /**
+     * To use a named query when consuming data.
+     */
+    public void setNamedQuery(String namedQuery) {
+        this.namedQuery = namedQuery;
+    }
+
+    public String getNativeQuery() {
+        return nativeQuery;
+    }
+
+    /**
+     * To use a custom native query when consuming data. You may want to use the option consumer.resultClass also when using native queries.
+     */
+    public void setNativeQuery(String nativeQuery) {
+        this.nativeQuery = nativeQuery;
+    }
+
+    public LockModeType getLockModeType() {
+        return lockModeType;
+    }
+
+    /**
+     * To configure the lock mode on the consumer.
+     */
+    public void setLockModeType(LockModeType lockModeType) {
+        this.lockModeType = lockModeType;
+    }
+
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
+
+    /**
+     * This key/value mapping is used for building the query parameters.
+     * It's is expected to be of the generic type java.util.Map<String, Object> where the keys are the named parameters
+     * of a given JPA query and the values are their corresponding effective values you want to select for.
+     */
+    public void setParameters(Map<String, Object> parameters) {
+        this.parameters = parameters;
+    }
+
+    public Class<?> getResultClass() {
+        return resultClass;
+    }
+
+    /**
+     * Defines the type of the returned payload (we will call entityManager.createNativeQuery(nativeQuery, resultClass)
+     * instead of entityManager.createNativeQuery(nativeQuery)). Without this option, we will return an object array.
+     * Only has an affect when using in conjunction with native query when consuming data.
+     */
+    public void setResultClass(Class<?> resultClass) {
+        this.resultClass = resultClass;
+    }
+
+    public boolean isTransacted() {
+        return transacted;
+    }
+
+    /**
+     * Whether to run the consumer in transacted mode, by which all messages will either commit or rollback,
+     * when the entire batch has been processed. The default behavior (false) is to commit all the previously
+     * successfully processed messages, and only rollback the last failed message.
+     */
+    public void setTransacted(boolean transacted) {
+        this.transacted = transacted;
+    }
+
+    public boolean isSkipLockedEntity() {
+        return skipLockedEntity;
+    }
+
+    /**
+     * To configure whether to use NOWAIT on lock and silently skip the entity.
+     */
+    public void setSkipLockedEntity(boolean skipLockedEntity) {
+        this.skipLockedEntity = skipLockedEntity;
+    }
+
+    public DeleteHandler<Object> getDeleteHandler() {
+        return deleteHandler;
+    }
+
+    /**
+     * To use a custom DeleteHandler to delete the row after the consumer is done processing the exchange
+     */
+    public void setDeleteHandler(DeleteHandler<Object> deleteHandler) {
+        this.deleteHandler = deleteHandler;
+    }
+
+    public DeleteHandler<Object> getPreDeleteHandler() {
+        return preDeleteHandler;
+    }
+
+    /**
+     * To use a custom Pre-DeleteHandler to delete the row after the consumer has read the entity.
+     */
+    public void setPreDeleteHandler(DeleteHandler<Object> preDeleteHandler) {
+        this.preDeleteHandler = preDeleteHandler;
+    }
+
     // Implementation methods
     // -------------------------------------------------------------------------
 


[6/7] camel git commit: CAMEL-9472: Add multi value to component docs

Posted by da...@apache.org.
CAMEL-9472: Add multi value to component docs


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

Branch: refs/heads/camel-2.16.x
Commit: 6081591b8029245894ddb936de41f9a032d7a489
Parents: fc4bbc2
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Jan 4 13:22:00 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 4 13:43:27 2016 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java  | 1 +
 .../main/java/org/apache/camel/component/jpa/JpaEndpoint.java    | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6081591b/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java b/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
index aedd920..ec979c0 100755
--- a/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
+++ b/components/camel-jdbc/src/main/java/org/apache/camel/component/jdbc/JdbcEndpoint.java
@@ -46,6 +46,7 @@ public class JdbcEndpoint extends DefaultEndpoint {
     private boolean transacted;
     @UriParam(defaultValue = "true")
     private boolean resetAutoCommit = true;
+    @UriParam(prefix = "statement.", multiValue = true)
     private Map<String, Object> parameters;
     @UriParam(defaultValue = "true")
     private boolean useJDBC4ColumnNameAndLabelSemantics = true;

http://git-wip-us.apache.org/repos/asf/camel/blob/6081591b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
index 655845e..64dd9836 100644
--- a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
+++ b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
@@ -49,7 +49,6 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     private EntityManagerFactory entityManagerFactory;
     private PlatformTransactionManager transactionManager;
     private Expression producerExpression;
-    private Map<String, Object> entityManagerProperties;
 
     @UriPath(description = "Entity class name") @Metadata(required = "true")
     private Class<?> entityType;
@@ -77,6 +76,9 @@ public class JpaEndpoint extends ScheduledPollEndpoint {
     @UriParam(label = "producer")
     private boolean remove;
 
+    @UriParam(label = "advanced", prefix = "emf.", multiValue = true)
+    private Map<String, Object> entityManagerProperties;
+
     public JpaEndpoint() {
     }
 


[2/7] camel git commit: CAMEL-9473: camel-mail - The from/to/cc/bcc options should be like others and in component docs

Posted by da...@apache.org.
CAMEL-9473: camel-mail - The from/to/cc/bcc options should be like others and in component docs


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

Branch: refs/heads/master
Commit: fb7fecc230b130c0e97038610904f9ef7dad4bc8
Parents: 409a538
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Jan 4 13:16:26 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 4 13:16:26 2016 +0100

----------------------------------------------------------------------
 .../camel/component/mail/MailConfiguration.java | 34 ++++++++++++++++----
 .../camel/component/mail/MailEndpoint.java      |  4 +--
 .../mail/MailComponentRecipientSetTest.java     |  8 ++---
 ...rOverrulePreConfigurationRecipientsTest.java |  2 +-
 .../mail/MailMultipleRecipientsTest.java        |  2 +-
 .../mail/MailRecipientsPipeIssueTest.java       |  4 +--
 .../component/mail/MailRecipientsTest.java      | 10 +++---
 .../mail/MailToMultipleEndpointsTest.java       |  6 ++--
 8 files changed, 46 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java
index d4d69e4..6f37baa 100644
--- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java
+++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java
@@ -43,7 +43,7 @@ public class MailConfiguration implements Cloneable {
     private ClassLoader applicationClassLoader;
     private Session session;
     private Properties javaMailProperties;
-    private Properties additionalJavaMailProperties;
+    private Map<Message.RecipientType, String> recipients = new HashMap<Message.RecipientType, String>();
 
     // protocol is implied by component name so it should not be in UriPath
     private String protocol;
@@ -61,9 +61,15 @@ public class MailConfiguration implements Cloneable {
     private JavaMailSender javaMailSender;
     @UriParam(defaultValue = "true", label = "consumer,advanced")
     private boolean mapMailMessage = true;
-    @UriParam(defaultValue = MailConstants.MAIL_DEFAULT_FROM) @Metadata(label = "producer")
+    @UriParam(defaultValue = MailConstants.MAIL_DEFAULT_FROM, label = "producer")
     private String from = MailConstants.MAIL_DEFAULT_FROM;
-    @UriParam(defaultValue = MailConstants.MAIL_DEFAULT_FOLDER) @Metadata(label = "consumer,advanced")
+    @UriParam(label = "producer")
+    private String to;
+    @UriParam(label = "producer")
+    private String cc;
+    @UriParam(label = "producer")
+    private String bcc;
+    @UriParam(defaultValue = MailConstants.MAIL_DEFAULT_FOLDER, label = "consumer,advanced")
     private String folderName = MailConstants.MAIL_DEFAULT_FOLDER;
     @UriParam @Metadata(label = "consumer")
     private boolean delete;
@@ -73,7 +79,6 @@ public class MailConfiguration implements Cloneable {
     private boolean unseen = true;
     @UriParam(label = "advanced")
     private boolean ignoreUriScheme;
-    private Map<Message.RecipientType, String> recipients = new HashMap<Message.RecipientType, String>();
     @UriParam @Metadata(label = "producer")
     private String replyTo;
     @UriParam(defaultValue = "-1") @Metadata(label = "consumer,advanced")
@@ -104,6 +109,8 @@ public class MailConfiguration implements Cloneable {
     private boolean handleFailedMessage;
     @UriParam(label = "security")
     private SSLContextParameters sslContextParameters;
+    @UriParam(label = "advanced", prefix = "mail.", multiValue = true)
+    private Properties additionalJavaMailProperties;
 
     public MailConfiguration() {
     }
@@ -466,23 +473,38 @@ public class MailConfiguration implements Cloneable {
      * Sets the <tt>To</tt> email address. Separate multiple email addresses with comma.
      */
     public void setTo(String address) {
+        this.to = to;
         recipients.put(Message.RecipientType.TO, address);
     }
 
+    public String getTo() {
+        return to;
+    }
+
     /**
      * Sets the <tt>CC</tt> email address. Separate multiple email addresses with comma.
      */
-    public void setCC(String address) {
+    public void setCc(String address) {
+        this.cc = address;
         recipients.put(Message.RecipientType.CC, address);
     }
 
+    public String getCc() {
+        return cc;
+    }
+
     /**
      * Sets the <tt>BCC</tt> email address. Separate multiple email addresses with comma.
      */
-    public void setBCC(String address) {
+    public void setBcc(String address) {
+        this.bcc = address;
         recipients.put(Message.RecipientType.BCC, address);
     }
 
+    public String getBcc() {
+        return bcc;
+    }
+
     public Map<Message.RecipientType, String> getRecipients() {
         return recipients;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
index 08a56e0..f7c8e78 100644
--- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
+++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
@@ -46,9 +46,9 @@ public class MailEndpoint extends ScheduledPollEndpoint {
     private ContentTypeResolver contentTypeResolver;
     @UriParam(label = "consumer")
     private int maxMessagesPerPoll;
-    @UriParam(label = "consumer,filter")
+    @UriParam(label = "consumer,filter", prefix = "searchTerm.", multiValue = true)
     private SearchTerm searchTerm;
-    @UriParam(label = "consumer,sort")
+    @UriParam(label = "consumer,sort", javaType = "java.lang.String")
     private SortTerm[] sortTerm;
     @UriParam(label = "consumer,advanced")
     private MailBoxPostProcessAction postProcessAction;

http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailComponentRecipientSetTest.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailComponentRecipientSetTest.java b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailComponentRecipientSetTest.java
index a217ddd..2f131dd 100644
--- a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailComponentRecipientSetTest.java
+++ b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailComponentRecipientSetTest.java
@@ -66,17 +66,17 @@ public class MailComponentRecipientSetTest extends CamelTestSupport {
             @Override
             public void configure() throws Exception {
                 MailConfiguration config = new MailConfiguration();
-                config.setCC("spy@spy.com");
+                config.setCc("spy@spy.com");
                 config.setFrom("me@me.com");
 
                 MailComponent mail = context.getComponent("smtp", MailComponent.class);
                 mail.setConfiguration(config);
 
-                from("direct:a").to("smtp://localhost?username=james2&password=secret&To=a@a.com");
+                from("direct:a").to("smtp://localhost?username=james2&password=secret&to=a@a.com");
 
-                from("direct:b").to("smtp://localhost?username=james&password=secret&To=b@b.com&From=you@you.com");
+                from("direct:b").to("smtp://localhost?username=james&password=secret&to=b@b.com&from=you@you.com");
 
-                from("direct:c").to("smtp://localhost?username=admin&password=secret&To=c@c.com&CC=you@you.com,them@them.com");
+                from("direct:c").to("smtp://localhost?username=admin&password=secret&to=c@c.com&cc=you@you.com,them@them.com");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java
index 6b13aae..f9df11d 100644
--- a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java
+++ b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHeaderOverrulePreConfigurationRecipientsTest.java
@@ -54,7 +54,7 @@ public class MailHeaderOverrulePreConfigurationRecipientsTest extends CamelTestS
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                from("pop3://claus@localhost?To=someone@outhere.com&CC=none@world.com&consumer.delay=1000").to("mock:result");
+                from("pop3://claus@localhost?to=someone@outhere.com&cc=none@world.com&consumer.delay=1000").to("mock:result");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java
index 9bfe19a..56a8410 100644
--- a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java
+++ b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailMultipleRecipientsTest.java
@@ -61,7 +61,7 @@ public class MailMultipleRecipientsTest extends CamelTestSupport {
         // START SNIPPET: e2
         // here we have pre configured the to receivers to claus and willem. Notice we use comma to separate
         // the two recipients. Camel also support using colon as separator char
-        template.sendBody("smtp://localhost?To=claus@localhost,willem@localhost&CC=james@localhost", "Hello World");
+        template.sendBody("smtp://localhost?to=claus@localhost,willem@localhost&cc=james@localhost", "Hello World");
         // END SNIPPET: e2
 
         assertMockEndpointsSatisfied();

http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsPipeIssueTest.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsPipeIssueTest.java b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsPipeIssueTest.java
index d1fbcfe..a140a1e 100644
--- a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsPipeIssueTest.java
+++ b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsPipeIssueTest.java
@@ -50,9 +50,9 @@ public class MailRecipientsPipeIssueTest extends CamelTestSupport {
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                String recipients = "&To=camel|pipes@riders.org;easy@riders.org";
+                String recipients = "&to=camel|pipes@riders.org;easy@riders.org";
 
-                from("direct:a").to("smtp://you@mymailserver.com?password=secret&From=you@apache.org" + recipients);
+                from("direct:a").to("smtp://you@mymailserver.com?password=secret&from=you@apache.org" + recipients);
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsTest.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsTest.java b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsTest.java
index e42aa99..0c03c63 100644
--- a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsTest.java
+++ b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRecipientsTest.java
@@ -72,12 +72,12 @@ public class MailRecipientsTest extends CamelTestSupport {
             public void configure() throws Exception {
                 // START SNIPPET: e1
                 // all the recipients of this mail are:
-                // To: camel@riders.org , easy@riders.org
-                // CC: me@you.org
-                // BCC: someone@somewhere.org
-                String recipients = "&To=camel@riders.org,easy@riders.org&CC=me@you.org&BCC=someone@somewhere.org";
+                // to: camel@riders.org , easy@riders.org
+                // cc: me@you.org
+                // bcc: someone@somewhere.org
+                String recipients = "&to=camel@riders.org,easy@riders.org&cc=me@you.org&bcc=someone@somewhere.org";
 
-                from("direct:a").to("smtp://you@mymailserver.com?password=secret&From=you@apache.org" + recipients);
+                from("direct:a").to("smtp://you@mymailserver.com?password=secret&from=you@apache.org" + recipients);
                 // END SNIPPET: e1
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/fb7fecc2/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailToMultipleEndpointsTest.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailToMultipleEndpointsTest.java b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailToMultipleEndpointsTest.java
index 38aafe2..710225c 100644
--- a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailToMultipleEndpointsTest.java
+++ b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailToMultipleEndpointsTest.java
@@ -62,11 +62,11 @@ public class MailToMultipleEndpointsTest extends CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:a").to("smtp://localhost?username=james2&password=secret&To=a@a.com&From=me@me.com");
+                from("direct:a").to("smtp://localhost?username=james2&password=secret&to=a@a.com&from=me@me.com");
 
-                from("direct:b").to("smtp://localhost?username=james&password=secret&To=b@b.com&From=you@you.com");
+                from("direct:b").to("smtp://localhost?username=james&password=secret&to=b@b.com&from=you@you.com");
 
-                from("direct:c").to("smtp://localhost?username=admin&password=secret&To=c@c.com&From=me@me.com&CC=you@you.com,them@them.com");
+                from("direct:c").to("smtp://localhost?username=admin&password=secret&to=c@c.com&from=me@me.com&cc=you@you.com,them@them.com");
             }
         };
     }


[5/7] camel git commit: CAMEL-9472: Add multi value to component docs

Posted by da...@apache.org.
CAMEL-9472: Add multi value to component docs


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

Branch: refs/heads/camel-2.16.x
Commit: fc4bbc2e826441cc2aa6f2856620099ada9b24b8
Parents: b234404
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Jan 4 12:18:50 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Jan 4 13:43:18 2016 +0100

----------------------------------------------------------------------
 .../camel/impl/ScheduledPollEndpoint.java       |  2 +-
 .../camel/catalog/DefaultCamelCatalog.java      | 30 ++++++++---
 .../apache/camel/catalog/JSonSchemaHelper.java  | 52 ++++++++++++++++++++
 .../apache/camel/catalog/CamelCatalogTest.java  |  4 ++
 .../camel/tools/apt/EipAnnotationProcessor.java |  2 +-
 .../tools/apt/EndpointAnnotationProcessor.java  | 25 +++++++---
 .../tools/apt/helper/JsonSchemaHelper.java      | 12 ++++-
 .../camel/tools/apt/model/EndpointOption.java   | 15 +++++-
 .../tools/apt/EndpointOptionComparatorTest.java |  8 +--
 .../java/org/apache/camel/spi/UriParam.java     | 12 +++++
 10 files changed, 139 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
index 13335c9..6d1b938 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
@@ -76,7 +76,7 @@ public abstract class ScheduledPollEndpoint extends DefaultEndpoint {
             defaultValue = "none", label = "consumer,scheduler", description = "To use a cron scheduler from either camel-spring or camel-quartz2 component")
     private ScheduledPollConsumerScheduler scheduler;
     private String schedulerName = "none"; // used when configuring scheduler using a string value
-    @UriParam(optionalPrefix = "consumer.", label = "consumer,scheduler",
+    @UriParam(prefix = "scheduler.", multiValue = true, label = "consumer,scheduler",
             description = "To configure additional properties when using a custom scheduler or any of the Quartz2, Spring based scheduler.")
     private Map<String, Object> schedulerProperties;
     @UriParam(optionalPrefix = "consumer.", label = "consumer,scheduler",

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index a4e638a..79a50bf 100644
--- a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -47,9 +47,12 @@ import static org.apache.camel.catalog.JSonSchemaHelper.getNames;
 import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyDefaultValue;
 import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyEnum;
 import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyKind;
+import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyNameFromNameWithPrefix;
+import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyPrefix;
 import static org.apache.camel.catalog.JSonSchemaHelper.getRow;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyBoolean;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyInteger;
+import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyMultiValue;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyNumber;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyObject;
 import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyRequired;
@@ -752,13 +755,25 @@ public class DefaultCamelCatalog implements CamelCatalog {
 
         // validate all the options
         for (Map.Entry<String, String> property : properties.entrySet()) {
+            String value = property.getValue();
+
+            String originalName = property.getKey();
             String name = property.getKey();
             // the name may be using an optional prefix, so lets strip that because the options
             // in the schema are listed without the prefix
             name = stripOptionalPrefixFromName(rows, name);
-            String value = property.getValue();
+            // the name may be using a prefix, so lets see if we can find the real property name
+            String propertyName = getPropertyNameFromNameWithPrefix(rows, name);
+            if (propertyName != null) {
+                name = propertyName;
+            }
+
+            String prefix = getPropertyPrefix(rows, name);
+            String kind = getPropertyKind(rows, name);
             boolean placeholder = value.startsWith("{{") || value.startsWith("${") || value.startsWith("$simple{");
             boolean lookup = value.startsWith("#") && value.length() > 1;
+            // we cannot evaluate multi values as strict as the others, as we don't know their expected types
+            boolean mulitValue = prefix != null && originalName.startsWith(prefix) && isPropertyMultiValue(rows, name);
 
             Map<String, String> row = getRow(rows, name);
             if (row == null) {
@@ -786,7 +801,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 // is enum but the value is not within the enum range
                 // but we can only check if the value is not a placeholder
                 String enums = getPropertyEnum(rows, name);
-                if (!placeholder && !lookup && enums != null) {
+                if (!mulitValue && !placeholder && !lookup && enums != null) {
                     String[] choices = enums.split(",");
                     boolean found = false;
                     for (String s : choices) {
@@ -801,9 +816,8 @@ public class DefaultCamelCatalog implements CamelCatalog {
                     }
                 }
 
-                // is reference lookup of bean (not applicable for @UriPath)
-                String kind = getPropertyKind(rows, name);
-                if (!"path".equals(kind) && isPropertyObject(rows, name)) {
+                // is reference lookup of bean (not applicable for @UriPath, or multi-valued)
+                if (!mulitValue && !"path".equals(kind) && isPropertyObject(rows, name)) {
                     // must start with # and be at least 2 characters
                     if (!value.startsWith("#") || value.length() <= 1) {
                         result.addInvalidReference(name, value);
@@ -811,7 +825,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 }
 
                 // is boolean
-                if (!placeholder && !lookup && isPropertyBoolean(rows, name)) {
+                if (!mulitValue && !placeholder && !lookup && isPropertyBoolean(rows, name)) {
                     // value must be a boolean
                     boolean bool = "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value);
                     if (!bool) {
@@ -820,7 +834,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 }
 
                 // is integer
-                if (!placeholder && !lookup && isPropertyInteger(rows, name)) {
+                if (!mulitValue && !placeholder && !lookup && isPropertyInteger(rows, name)) {
                     // value must be an integer
                     boolean valid = validateInteger(value);
                     if (!valid) {
@@ -829,7 +843,7 @@ public class DefaultCamelCatalog implements CamelCatalog {
                 }
 
                 // is number
-                if (!placeholder && !lookup && isPropertyNumber(rows, name)) {
+                if (!mulitValue && !placeholder && !lookup && isPropertyNumber(rows, name)) {
                     // value must be an number
                     boolean valid = false;
                     try {

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
index 2293a7a..4e4624a 100644
--- a/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
+++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java
@@ -273,6 +273,58 @@ public final class JSonSchemaHelper {
         return null;
     }
 
+    public static String getPropertyPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String prefix = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equals(row.get("name"));
+            }
+            if (row.containsKey("prefix")) {
+                prefix = row.get("prefix");
+            }
+            if (found) {
+                return prefix;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isPropertyMultiValue(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean multiValue = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equals(row.get("name"));
+            }
+            if (row.containsKey("multiValue")) {
+                multiValue = "true".equals(row.get("multiValue"));
+            }
+            if (found) {
+                return multiValue;
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyNameFromNameWithPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String propertyName = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                propertyName = row.get("name");
+            }
+            if (row.containsKey("prefix")) {
+                String preifx = row.get("prefix");
+                found = name.startsWith(preifx);
+            }
+            if (found) {
+                return propertyName;
+            }
+        }
+        return null;
+    }
+
     public static Map<String, String> getRow(List<Map<String, String>> rows, String key) {
         for (Map<String, String> row : rows) {
             if (key.equals(row.get("name"))) {

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
----------------------------------------------------------------------
diff --git a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index 0b8923f..28c8cef 100644
--- a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -480,6 +480,10 @@ public class CamelCatalogTest {
         // mixed optional without consumer. prefix
         result = catalog.validateEndpointProperties("file:inbox?delay=5000&consumer.greedy=true");
         assertTrue(result.isSuccess());
+
+        // prefix
+        result = catalog.validateEndpointProperties("file:inbox?delay=5000&scheduler.foo=123&scheduler.bar=456");
+        assertTrue(result.isSuccess());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
index 294804c..eadb6fe 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EipAnnotationProcessor.java
@@ -207,7 +207,7 @@ public class EipAnnotationProcessor extends AbstractAnnotationProcessor {
             String doc = entry.getDocumentation();
             doc = sanitizeDescription(doc, false);
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getKind(), entry.isRequired(), entry.getType(), entry.getDefaultValue(), doc,
-                    entry.isDeprecated(), null, null, entry.isEnumType(), entry.getEnums(), entry.isOneOf(), entry.getOneOfTypes(), null));
+                    entry.isDeprecated(), null, null, entry.isEnumType(), entry.getEnums(), entry.isOneOf(), entry.getOneOfTypes(), null, null, false));
         }
         buffer.append("\n  }");
 

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
index 8658f90..00bd362 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
@@ -247,11 +247,14 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                 defaultValue = "false";
             }
 
-            // component options do not have optional prefix
+            // component options do not have prefix
             String optionalPrefix = "";
+            String prefix = "";
+            boolean multiValue = false;
 
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), "property", required, entry.getType(), defaultValue, doc,
-                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null, optionalPrefix));
+                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null,
+                    optionalPrefix, prefix, multiValue));
         }
         buffer.append("\n  },");
 
@@ -295,11 +298,14 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                 defaultValue = "false";
             }
 
-            // @UriPath options do not have optional prefix
+            // @UriPath options do not have prefix
             String optionalPrefix = "";
+            String prefix = "";
+            boolean multiValue = false;
 
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), "path", required, entry.getType(), defaultValue, doc,
-                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null, optionalPrefix));
+                    entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null,
+                    optionalPrefix, prefix, multiValue));
         }
 
         // sort the endpoint options in the standard order we prefer
@@ -339,9 +345,12 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                 defaultValue = "false";
             }
             String optionalPrefix = entry.getOptionalPrefix();
+            String prefix = entry.getPrefix();
+            boolean multiValue = entry.isMultiValue();
 
             buffer.append(JsonSchemaHelper.toJson(entry.getName(), "parameter", required, entry.getType(), defaultValue,
-                    doc, entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null, optionalPrefix));
+                    doc, entry.isDeprecated(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(), false, null,
+                    optionalPrefix, prefix, multiValue));
         }
         buffer.append("\n  }");
 
@@ -662,7 +671,9 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
                     }
                     name = prefix + name;
 
-                    String optionalPrefix = param.optionalPrefix();
+                    String paramOptionalPrefix = param.optionalPrefix();
+                    String paramPrefix = param.prefix();
+                    boolean multiValue = param.multiValue();
                     String defaultValue = param.defaultValue();
                     if (defaultValue == null && metadata != null) {
                         defaultValue = metadata.defaultValue();
@@ -727,7 +738,7 @@ public class EndpointAnnotationProcessor extends AbstractAnnotationProcessor {
 
                         String group = EndpointHelper.labelAsGroupName(label, componentModel.isConsumerOnly(), componentModel.isProducerOnly());
                         EndpointOption option = new EndpointOption(name, fieldTypeName, required, defaultValue, defaultValueNote,
-                                docComment.trim(), optionalPrefix, deprecated, group, label, isEnum, enums);
+                                docComment.trim(), paramOptionalPrefix, paramPrefix, multiValue, deprecated, group, label, isEnum, enums);
                         endpointOptions.add(option);
                     }
                 }

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
index 51cf907..21ba792 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
@@ -42,7 +42,7 @@ public final class JsonSchemaHelper {
 
     public static String toJson(String name, String kind, Boolean required, String type, String defaultValue, String description,
                                 Boolean deprecated, String group, String label, boolean enumType, Set<String> enums,
-                                boolean oneOfType, Set<String> oneOffTypes, String optionalPrefix) {
+                                boolean oneOfType, Set<String> oneOffTypes, String optionalPrefix, String prefix, boolean multiValue) {
         String typeName = JsonSchemaHelper.getType(type, enumType);
 
         StringBuilder sb = new StringBuilder();
@@ -102,6 +102,16 @@ public final class JsonSchemaHelper {
             sb.append(Strings.doubleQuote(text));
         }
 
+        if (!Strings.isNullOrEmpty(prefix)) {
+            sb.append(", \"prefix\": ");
+            String text = safeDefaultValue(prefix);
+            sb.append(Strings.doubleQuote(text));
+        }
+        if (multiValue) {
+            sb.append(", \"multiValue\": ");
+            sb.append(Strings.doubleQuote("true"));
+        }
+
         if (deprecated != null) {
             sb.append(", \"deprecated\": ");
             sb.append(Strings.doubleQuote(deprecated.toString()));

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
index 3a367cf..7a45547 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
@@ -31,6 +31,8 @@ public final class EndpointOption {
     private String defaultValueNote;
     private String documentation;
     private String optionalPrefix;
+    private String prefix;
+    private boolean multiValue;
     private boolean deprecated;
     private String group;
     private String label;
@@ -38,7 +40,8 @@ public final class EndpointOption {
     private Set<String> enums;
 
     public EndpointOption(String name, String type, String required, String defaultValue, String defaultValueNote,
-                          String documentation, String optionalPrefix, boolean deprecated,  String group, String label,
+                          String documentation, String optionalPrefix, String prefix, boolean multiValue,
+                          boolean deprecated,  String group, String label,
                           boolean enumType, Set<String> enums) {
         this.name = name;
         this.type = type;
@@ -47,6 +50,8 @@ public final class EndpointOption {
         this.defaultValueNote = defaultValueNote;
         this.documentation = documentation;
         this.optionalPrefix = optionalPrefix;
+        this.prefix = prefix;
+        this.multiValue = multiValue;
         this.deprecated = deprecated;
         this.group = group;
         this.label = label;
@@ -78,6 +83,14 @@ public final class EndpointOption {
         return optionalPrefix;
     }
 
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public boolean isMultiValue() {
+        return multiValue;
+    }
+
     public boolean isDeprecated() {
         return deprecated;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
----------------------------------------------------------------------
diff --git a/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java b/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
index 3d4a4fe..660dc56 100644
--- a/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
+++ b/tooling/apt/src/test/java/org/apache/camel/tools/apt/EndpointOptionComparatorTest.java
@@ -39,10 +39,10 @@ public class EndpointOptionComparatorTest {
         String group3 = EndpointHelper.labelAsGroupName(label3, false, false);
         String group4 = EndpointHelper.labelAsGroupName(label4, false, false);
 
-        EndpointOption op1 = new EndpointOption("first", "string", "true", "", "", "blah", null, false, group1, label1, false, null);
-        EndpointOption op2 = new EndpointOption("synchronous", "string", "true", "", "", "blah", null, false, group2, label2, false, null);
-        EndpointOption op3 = new EndpointOption("second", "string", "true", "", "", "blah", null, false, group3, label3, false, null);
-        EndpointOption op4 = new EndpointOption("country", "string", "true", "", "", "blah", null, false, group4, label4, false, null);
+        EndpointOption op1 = new EndpointOption("first", "string", "true", "", "", "blah", null, null, false, false, group1, label1, false, null);
+        EndpointOption op2 = new EndpointOption("synchronous", "string", "true", "", "", "blah", null, null, false, false, group2, label2, false, null);
+        EndpointOption op3 = new EndpointOption("second", "string", "true", "", "", "blah", null, null, false, false, group3, label3, false, null);
+        EndpointOption op4 = new EndpointOption("country", "string", "true", "", "", "blah", null, null, false, false, group4, label4, false, null);
 
         List<EndpointOption> list = new ArrayList<EndpointOption>();
         list.add(op1);

http://git-wip-us.apache.org/repos/asf/camel/blob/fc4bbc2e/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
----------------------------------------------------------------------
diff --git a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
index ef45b2f..51760c3 100644
--- a/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
+++ b/tooling/spi-annotations/src/main/java/org/apache/camel/spi/UriParam.java
@@ -85,6 +85,18 @@ public @interface UriParam {
     String javaType() default "";
 
     /**
+     * If the parameter can be configured multiple times, such as configuring options to a <tt>Map</tt> type.
+     */
+    boolean multiValue() default false;
+
+    /**
+     * If the parameter must be configured with a prefix.
+     * <p/>
+     * For example to configure scheduler options, the parameters is prefixed with <tt>scheduler.foo=bar</tt>
+     */
+    String prefix() default "";
+
+    /**
      * If the parameter can be configured with an optional prefix.
      * <p/>
      * For example to configure consumer options, the parameters can be prefixed with <tt>consumer.</tt>, eg <tt>consumer.delay=5000</tt>