You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/09/05 15:00:24 UTC

[2/2] camel git commit: CAMEL-11730: camel-connector-maven-plugin : it should be possible to configure connector only properties

CAMEL-11730: camel-connector-maven-plugin : it should be possible to configure connector only properties


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

Branch: refs/heads/master
Commit: bc09a41da297d0012af31f08ddedbf1f4452d279
Parents: 3a3c05b
Author: lburgazzoli <lb...@gmail.com>
Authored: Fri Sep 1 18:55:42 2017 +0200
Committer: lburgazzoli <lb...@gmail.com>
Committed: Tue Sep 5 17:00:08 2017 +0200

----------------------------------------------------------------------
 .../camel/maven/connector/ConnectorMojo.java    | 39 ++++++++
 .../SpringBootAutoConfigurationMojo.java        | 34 +++++--
 .../maven/connector/model/ComponentModel.java   |  9 ++
 .../connector/model/ConnectorOptionModel.java   | 20 ++++
 .../component/connector/ConnectorModel.java     | 30 ++++++
 .../connector/DefaultConnectorComponent.java    | 24 ++---
 .../main/resources/camel-connector-schema.json  |  2 +
 .../main/resources/camel-connector-schema.json  |  2 +
 .../PetStoreConnectorAutoConfiguration.java     | 98 ++++++++++++++-----
 .../PetStoreConnectorConfigurationCommon.java   | 14 ++-
 .../main/resources/camel-connector-schema.json  |  2 +
 .../src/main/resources/camel-connector.json     |  2 +-
 ...UpsertContactConnectorAutoConfiguration.java | 99 +++++++++++++++-----
 ...sertContactConnectorConfigurationCommon.java |  3 +-
 .../main/resources/camel-connector-schema.json  |  4 +-
 .../src/main/resources/camel-connector.json     |  2 +-
 ...witterMentionConnectorAutoConfiguration.java | 18 ++--
 ...tterMentionConnectorConfigurationCommon.java |  3 +-
 .../main/resources/camel-connector-schema.json  |  2 +
 .../src/main/resources/camel-connector.json     |  2 +-
 ...TwitterSearchConnectorAutoConfiguration.java | 18 ++--
 ...itterSearchConnectorConfigurationCommon.java | 17 +++-
 .../main/resources/camel-connector-schema.json  |  3 +
 .../src/main/resources/camel-connector.json     | 16 +++-
 .../java/org/foo/TwitterSearchCustomizer.java   |  7 ++
 .../src/main/resources/application.properties   |  3 +-
 .../main/resources/camel-connector-schema.json  |  2 +
 27 files changed, 371 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/ConnectorMojo.java
----------------------------------------------------------------------
diff --git a/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/ConnectorMojo.java b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/ConnectorMojo.java
index 2f6d95e..b0471c0 100644
--- a/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/ConnectorMojo.java
+++ b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/ConnectorMojo.java
@@ -29,6 +29,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -124,12 +125,16 @@ public class ConnectorMojo extends AbstractJarMojo {
                     String endpointOptions = buildEndpointOptionsSchema(rows, dto);
                     getLog().debug(endpointOptions);
 
+                    String connectorOptions = buildConnectorOptionsSchema(dto);
+                    getLog().debug(connectorOptions);
+
                     // generate the json file
                     StringBuilder jsonSchema = new StringBuilder();
                     jsonSchema.append("{\n");
                     jsonSchema.append(header);
                     jsonSchema.append(componentOptions);
                     jsonSchema.append(endpointOptions);
+                    jsonSchema.append(connectorOptions);
                     jsonSchema.append("}\n");
 
                     String newJson = jsonSchema.toString();
@@ -233,6 +238,7 @@ public class ConnectorMojo extends AbstractJarMojo {
         sb.append("  \"componentProperties\": {\n");
 
         boolean first = true;
+
         for (int i = 0; i < rows.size(); i++) {
             Map<String, String> row = rows.get(i);
             String key = row.get("name");
@@ -346,6 +352,39 @@ public class ConnectorMojo extends AbstractJarMojo {
             sb.append("\n");
         }
 
+        sb.append("  },\n");
+        return sb.toString();
+    }
+
+    private String buildConnectorOptionsSchema(Map dto) throws JsonProcessingException {
+        // find the endpoint options
+        Map<String, Map> properties = (Map) dto.get("connectorProperties");
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("  \"connectorProperties\": {\n");
+
+        AtomicBoolean first = new AtomicBoolean(true);
+
+        if (properties != null) {
+            for (Map.Entry<String, Map> entry: properties.entrySet()) {
+                Map row = entry.getValue();
+                row.put("name", entry.getKey());
+
+                String line = buildJSonLineFromRow(row);
+
+                if (!first.get()) {
+                    sb.append(",\n");
+                }
+                sb.append("    ").append(line);
+
+                first.set(false);
+            }
+        }
+
+        if (!first.get()) {
+            sb.append("\n");
+        }
+
         sb.append("  }\n");
         return sb.toString();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/SpringBootAutoConfigurationMojo.java
----------------------------------------------------------------------
diff --git a/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/SpringBootAutoConfigurationMojo.java b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/SpringBootAutoConfigurationMojo.java
index 179d788..00404d3 100644
--- a/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/SpringBootAutoConfigurationMojo.java
+++ b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/SpringBootAutoConfigurationMojo.java
@@ -31,6 +31,7 @@ import javax.annotation.PostConstruct;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.camel.maven.connector.model.ComponentModel;
 import org.apache.camel.maven.connector.model.ComponentOptionModel;
+import org.apache.camel.maven.connector.model.ConnectorOptionModel;
 import org.apache.camel.maven.connector.model.EndpointOptionModel;
 import org.apache.camel.maven.connector.model.OptionModel;
 import org.apache.camel.maven.connector.util.JSonSchemaHelper;
@@ -113,7 +114,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
         }
 
         // find the component dependency and get its .json file
-        file = new File(classesDirectory, "camel-component-schema.json");
+        file = new File(classesDirectory, "camel-connector-schema.json");
         if (file.exists() && javaType != null && connectorScheme != null) {
             String json = loadText(new FileInputStream(file));
             ComponentModel model = generateComponentModel(json);
@@ -229,6 +230,10 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
             }
         }
 
+        for (OptionModel option : model.getConnectorOptions()) {
+            addProperty(commonClass, model, option);
+        }
+
         sortImports(commonClass);
         writeSourceIfChanged(commonClass, packageName.replaceAll("\\.", "\\/") + "/" + commonName + ".java");
 
@@ -293,7 +298,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
 
             javaClass.addImport(HashMap.class);
             javaClass.addImport(Map.class);
-            javaClass.addImport("org.apache.camel.util.IntrospectionSupport");
+            javaClass.addImport("org.apache.camel.spring.boot.util.CamelPropertiesHelper");
         }
 
         javaClass.addImport(javaType);
@@ -402,9 +407,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
         sb.append("\n");
         if (hasOptions) {
             sb.append("Map<String, Object> parameters = new HashMap<>();\n");
-            sb.append("IntrospectionSupport.getProperties(configuration, parameters, null, false);\n");
-            sb.append("IntrospectionSupport.setProperties(camelContext, camelContext.getTypeConverter(), connector, parameters);\n");
-            sb.append("connector.setComponentOptions(parameters);\n");
+            sb.append("CamelPropertiesHelper.setCamelProperties(camelContext, connector, parameters, false);\n");
+            sb.append("connector.setOptions(parameters);\n");
         }
         sb.append("if (ObjectHelper.isNotEmpty(customizers)) {\n");
         sb.append("    for (ConnectorCustomizer<").append(shortJavaType).append("> customizer : customizers) {\n");
@@ -442,9 +446,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
         sb.append("connector.setCamelContext(camelContext);\n");
         sb.append("\n");
         sb.append("try {\n");
-        sb.append("IntrospectionSupport.getProperties(entry.getValue(), parameters, null, false);\n");
-        sb.append("IntrospectionSupport.setProperties(camelContext, camelContext.getTypeConverter(), connector, parameters);\n");
-        sb.append("connector.setComponentOptions(parameters);\n");
+        sb.append("CamelPropertiesHelper.setCamelProperties(camelContext, connector, parameters, false);\n");
+        sb.append("connector.setOptions(parameters);\n");
         sb.append("if (ObjectHelper.isNotEmpty(customizers)) {\n");
         sb.append("    for (ConnectorCustomizer<").append(shortJavaType).append("> customizer : customizers) {\n");
         sb.append("\n");
@@ -580,6 +583,21 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo {
             component.addEndpointOption(option);
         }
 
+        rows = JSonSchemaHelper.parseJsonSchema("connectorProperties", json, true);
+        for (Map<String, String> row : rows) {
+            ConnectorOptionModel option = new ConnectorOptionModel();
+            option.setName(getSafeValue("name", row));
+            option.setDisplayName(getSafeValue("displayName", row));
+            option.setKind(getSafeValue("kind", row));
+            option.setType(getSafeValue("type", row));
+            option.setJavaType(getSafeValue("javaType", row));
+            option.setDeprecated(getSafeValue("deprecated", row));
+            option.setDescription(getSafeValue("description", row));
+            option.setDefaultValue(getSafeValue("defaultValue", row));
+            option.setEnums(getSafeValue("enum", row));
+            component.addConnectorOption(option);
+        }
+
         return component;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ComponentModel.java
----------------------------------------------------------------------
diff --git a/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ComponentModel.java b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ComponentModel.java
index 0d61b14..2ba33aa 100644
--- a/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ComponentModel.java
+++ b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ComponentModel.java
@@ -39,6 +39,7 @@ public class ComponentModel {
     private String version;
     private final List<ComponentOptionModel> componentOptions = new ArrayList<>();
     private final List<EndpointOptionModel> endpointOptions = new ArrayList<>();
+    private final List<ConnectorOptionModel> connectorOptions = new ArrayList<>();
 
     public String getKind() {
         return kind;
@@ -184,6 +185,14 @@ public class ComponentModel {
         endpointOptions.add(option);
     }
 
+    public List<ConnectorOptionModel> getConnectorOptions() {
+        return connectorOptions;
+    }
+
+    public void addConnectorOption(ConnectorOptionModel option) {
+        connectorOptions.add(option);
+    }
+
     public String getShortJavaType() {
         if (javaType.startsWith("java.util.Map")) {
             return "Map";

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ConnectorOptionModel.java
----------------------------------------------------------------------
diff --git a/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ConnectorOptionModel.java b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ConnectorOptionModel.java
new file mode 100644
index 0000000..99cf1d4
--- /dev/null
+++ b/connectors/camel-connector-maven-plugin/src/main/java/org/apache/camel/maven/connector/model/ConnectorOptionModel.java
@@ -0,0 +1,20 @@
+/**
+ * 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.maven.connector.model;
+
+public class ConnectorOptionModel extends OptionModel {
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/ConnectorModel.java
----------------------------------------------------------------------
diff --git a/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/ConnectorModel.java b/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/ConnectorModel.java
index 8d409f7..112d4985 100644
--- a/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/ConnectorModel.java
+++ b/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/ConnectorModel.java
@@ -63,6 +63,7 @@ final class ConnectorModel {
     private Map<String, String> defaultEndpointOptions;
     private List<String> endpointOptions;
     private List<String> componentOptions;
+    private List<String> connectorOptions;
 
     ConnectorModel(String componentName, String className) {
         this.componentName = componentName;
@@ -150,6 +151,14 @@ final class ConnectorModel {
         return endpointOptions;
     }
 
+    public List<String> getConnectorOptions() {
+        if (connectorOptions == null) {
+            connectorOptions = Collections.unmodifiableList(extractConnectorOptions(lines.get()));
+        }
+
+        return connectorOptions;
+    }
+
     public DataType getInputDataType() {
         if (inputDataType == null) {
             String line = extractInputDataType(lines.get());
@@ -410,4 +419,25 @@ final class ConnectorModel {
 
         return answer;
     }
+
+    private List<String> extractConnectorOptions(List<String> lines) {
+        List<String> answer = new ArrayList<>();
+
+        // extract the default options
+        boolean found = false;
+        for (String line : lines) {
+            line = line.trim();
+            if (line.startsWith("\"connectorProperties\": {")) {
+                found = true;
+            } else if (line.startsWith("}")) {
+                found = false;
+            } else if (found) {
+                int pos = line.indexOf(':');
+                String key = line.substring(0, pos);
+                answer.add(StringHelper.removeLeadingAndEndingQuotes(key.trim()));
+            }
+        }
+
+        return answer;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/DefaultConnectorComponent.java
----------------------------------------------------------------------
diff --git a/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/DefaultConnectorComponent.java b/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/DefaultConnectorComponent.java
index 1d0c675..81e22ba 100644
--- a/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/DefaultConnectorComponent.java
+++ b/connectors/camel-connector/src/main/java/org/apache/camel/component/connector/DefaultConnectorComponent.java
@@ -89,7 +89,7 @@ public abstract class DefaultConnectorComponent extends DefaultComponent impleme
         registerExtension(this::getComponentVerifierExtension);
     }
 
-    protected <T> void addConnectorOption(Map<String, T> options, String name, T value) {
+    protected <T> void doAddOption(Map<String, T> options, String name, T value) {
         log.trace("Adding option: {}={}", name, value);
         T val = options.put(name, value);
         if (val != null) {
@@ -169,20 +169,19 @@ public abstract class DefaultConnectorComponent extends DefaultComponent impleme
     }
 
     @Override
-    public void setOptions(Map<String, Object> baseComponentOptions) {
+    public void setOptions(Map<String, Object> options) {
         this.options.clear();
-        this.options.putAll(baseComponentOptions);
+        this.options.putAll(options);
     }
 
     @Override
     public void addOption(String name, Object value) {
-        addConnectorOption(this.options, name, value);
+        doAddOption(this.options, name, value);
     }
 
     @Override
     public void addOptions(Map<String, Object> options) {
-        options.forEach((name, value)->  addConnectorOption(this.options, name, value));
-
+        options.forEach((name, value)->  doAddOption(this.options, name, value));
     }
 
     @Override
@@ -361,10 +360,11 @@ public abstract class DefaultConnectorComponent extends DefaultComponent impleme
                     // Get the list of options from the connector catalog that
                     // are configured to target the endpoint
                     List<String> endpointOptions = model.getEndpointOptions();
+                    List<String> connectorOptions = model.getConnectorOptions();
 
                     for (Map.Entry<String, Object> entry : options.entrySet()) {
-                        // Only set options that are not targeting the endpoint
-                        if (!endpointOptions.contains(entry.getKey())) {
+                        // Only set options that are targeting the component
+                        if (!endpointOptions.contains(entry.getKey()) && !connectorOptions.contains(entry.getKey())) {
                             log.debug("Using component option: {}={}", entry.getKey(), entry.getValue());
                             IntrospectionSupport.setProperty(context, base, entry.getKey(), entry.getValue());
                         }
@@ -433,7 +433,7 @@ public abstract class DefaultConnectorComponent extends DefaultComponent impleme
         if (!defaultOptions.isEmpty()) {
             defaultOptions.forEach((key, value) -> {
                 if (isValidConnectionOption(key, value)) {
-                    addConnectorOption(options, key, value);
+                    doAddOption(options, key, value);
                 }
             });
         }
@@ -446,7 +446,7 @@ public abstract class DefaultConnectorComponent extends DefaultComponent impleme
             for (String endpointOption : endpointOptions) {
                 Object value = this.options.get(endpointOption);
                 if (value != null) {
-                    addConnectorOption(
+                    doAddOption(
                         options,
                         endpointOption,
                         getCamelContext().getTypeConverter().mandatoryConvertTo(String.class, value));
@@ -462,7 +462,7 @@ public abstract class DefaultConnectorComponent extends DefaultComponent impleme
                 value = entry.getValue().toString();
             }
             if (isValidConnectionOption(key, value)) {
-                addConnectorOption(options, key, value);
+                doAddOption(options, key, value);
             }
         }
 
@@ -473,7 +473,7 @@ public abstract class DefaultConnectorComponent extends DefaultComponent impleme
             if (extra != null && !extra.isEmpty()) {
                 extra.forEach((key, value) -> {
                     if (isValidConnectionOption(key, value)) {
-                        addConnectorOption(options, key, value);
+                        doAddOption(options, key, value);
                     }
                 });
             }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/bar-connector/src/main/resources/camel-connector-schema.json
----------------------------------------------------------------------
diff --git a/connectors/examples/bar-connector/src/main/resources/camel-connector-schema.json b/connectors/examples/bar-connector/src/main/resources/camel-connector-schema.json
index 46b9216..8682139 100644
--- a/connectors/examples/bar-connector/src/main/resources/camel-connector-schema.json
+++ b/connectors/examples/bar-connector/src/main/resources/camel-connector-schema.json
@@ -22,5 +22,7 @@
     "drink": { "kind": "path", "displayName": "Drink", "group": "producer", "required": true, "type": "object", "javaType": "org.beverage.Beverages", "enum": [ "Wine", "GinTonic", "Beer" ], "deprecated": false, "secret": false, "description": "What drink to order" },
     "amount": { "kind": "parameter", "displayName": "Amount", "group": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "defaultValue": 2, "description": "Number of drinks in the order" },
     "celebrity": { "kind": "parameter", "displayName": "Celebrity", "group": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Is this a famous person ordering" }
+  },
+  "connectorProperties": {
   }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/foo-connector/src/main/resources/camel-connector-schema.json
----------------------------------------------------------------------
diff --git a/connectors/examples/foo-connector/src/main/resources/camel-connector-schema.json b/connectors/examples/foo-connector/src/main/resources/camel-connector-schema.json
index 416faf6..7d15f98 100644
--- a/connectors/examples/foo-connector/src/main/resources/camel-connector-schema.json
+++ b/connectors/examples/foo-connector/src/main/resources/camel-connector-schema.json
@@ -22,5 +22,7 @@
     "timerName": { "kind": "path", "displayName": "Timer Name", "group": "consumer", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The name of the timer" },
     "period": { "kind": "parameter", "displayName": "Period", "group": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": 5000, "description": "If greater than 0 generate periodic events every period milliseconds. The default value is 1000. You can also specify time values using units such as 60s (60 seconds) 5m30s (5 minutes and 30 seconds) and 1h (1 hour)." },
     "repeatCount": { "kind": "parameter", "displayName": "Repeat Count", "group": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1 the timer will only fire once. If you set it to 5 it will only fire five times. A value of zero or negative means fire forever." }
+  },
+  "connectorProperties": {
   }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorAutoConfiguration.java b/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorAutoConfiguration.java
index 85e27b0..d0a5121 100644
--- a/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorAutoConfiguration.java
+++ b/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorAutoConfiguration.java
@@ -17,12 +17,19 @@
 package org.foo.connector.springboot;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import javax.annotation.Generated;
 import javax.annotation.PostConstruct;
 import org.apache.camel.CamelContext;
-import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.component.connector.ConnectorCustomizer;
+import org.apache.camel.spi.HasId;
+import org.apache.camel.spring.boot.util.CamelPropertiesHelper;
+import org.apache.camel.spring.boot.util.HierarchicalPropertiesEvaluator;
+import org.apache.camel.util.ObjectHelper;
 import org.foo.connector.PetStoreComponent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -30,6 +37,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
@@ -44,10 +52,16 @@ import org.springframework.context.annotation.Lazy;
 @EnableConfigurationProperties(PetStoreConnectorConfiguration.class)
 public class PetStoreConnectorAutoConfiguration {
 
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(PetStoreConnectorAutoConfiguration.class);
+    @Autowired
+    private ApplicationContext applicationContext;
     @Autowired
     private CamelContext camelContext;
     @Autowired
     private PetStoreConnectorConfiguration configuration;
+    @Autowired(required = false)
+    private List<ConnectorCustomizer<PetStoreComponent>> customizers;
 
     @Lazy
     @Bean(name = "petstore-component")
@@ -57,35 +71,71 @@ public class PetStoreConnectorAutoConfiguration {
         PetStoreComponent connector = new PetStoreComponent();
         connector.setCamelContext(camelContext);
         Map<String, Object> parameters = new HashMap<>();
-        IntrospectionSupport.getProperties(configuration, parameters, null,
-                false);
-        IntrospectionSupport.setProperties(camelContext,
-                camelContext.getTypeConverter(), connector, parameters);
-        connector.setComponentOptions(parameters);
+        CamelPropertiesHelper.setCamelProperties(camelContext, connector,
+                parameters, false);
+        connector.setOptions(parameters);
+        if (ObjectHelper.isNotEmpty(customizers)) {
+            for (ConnectorCustomizer<PetStoreComponent> customizer : customizers) {
+                boolean useCustomizer = (customizer instanceof HasId)
+                        ? HierarchicalPropertiesEvaluator.evaluate(
+                                applicationContext.getEnvironment(),
+                                "camel.connector.customizer",
+                                "camel.connector.petstore.customizer",
+                                ((HasId) customizer).getId())
+                        : HierarchicalPropertiesEvaluator.evaluate(
+                                applicationContext.getEnvironment(),
+                                "camel.connector.customizer",
+                                "camel.connector.petstore.customizer");
+                if (useCustomizer) {
+                    LOGGER.debug("Configure connector {}, with customizer {}",
+                            connector, customizer);
+                    customizer.customize(connector);
+                }
+            }
+        }
         return connector;
     }
 
     @PostConstruct
     public void postConstructPetStoreComponent() {
-        if (camelContext != null) {
-            Map<String, Object> parameters = new HashMap<>();
-            for (Map.Entry<String, PetStoreConnectorConfigurationCommon> entry : configuration
-                    .getConfigurations().entrySet()) {
-                parameters.clear();
-                PetStoreComponent connector = new PetStoreComponent();
-                connector.setCamelContext(camelContext);
-                try {
-                    IntrospectionSupport.getProperties(entry.getValue(),
-                            parameters, null, false);
-                    IntrospectionSupport.setProperties(camelContext,
-                            camelContext.getTypeConverter(), connector,
-                            parameters);
-                    connector.setComponentOptions(parameters);
-                    camelContext.addComponent(entry.getKey(), connector);
-                } catch (Exception e) {
-                    throw new BeanCreationException(entry.getKey(),
-                            e.getMessage(), e);
+        Map<String, Object> parameters = new HashMap<>();
+        for (Map.Entry<String, PetStoreConnectorConfigurationCommon> entry : configuration
+                .getConfigurations().entrySet()) {
+            parameters.clear();
+            PetStoreComponent connector = new PetStoreComponent();
+            connector.setCamelContext(camelContext);
+            try {
+                CamelPropertiesHelper.setCamelProperties(camelContext,
+                        connector, parameters, false);
+                connector.setOptions(parameters);
+                if (ObjectHelper.isNotEmpty(customizers)) {
+                    for (ConnectorCustomizer<PetStoreComponent> customizer : customizers) {
+                        boolean useCustomizer = (customizer instanceof HasId)
+                                ? HierarchicalPropertiesEvaluator.evaluate(
+                                        applicationContext.getEnvironment(),
+                                        "camel.connector.customizer",
+                                        "camel.connector.petstore."
+                                                + entry.getKey()
+                                                + ".customizer",
+                                        ((HasId) customizer).getId())
+                                : HierarchicalPropertiesEvaluator.evaluate(
+                                        applicationContext.getEnvironment(),
+                                        "camel.connector.customizer",
+                                        "camel.connector.petstore."
+                                                + entry.getKey()
+                                                + ".customizer");
+                        if (useCustomizer) {
+                            LOGGER.debug(
+                                    "Configure connector {}, with customizer {}",
+                                    connector, customizer);
+                            customizer.customize(connector);
+                        }
+                    }
                 }
+                camelContext.addComponent(entry.getKey(), connector);
+            } catch (Exception e) {
+                throw new BeanCreationException(entry.getKey(), e.getMessage(),
+                        e);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorConfigurationCommon.java
----------------------------------------------------------------------
diff --git a/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorConfigurationCommon.java b/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorConfigurationCommon.java
index 8af2c18..c0ef487 100644
--- a/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorConfigurationCommon.java
+++ b/connectors/examples/petstore-connector/src/main/java/org/foo/connector/springboot/PetStoreConnectorConfigurationCommon.java
@@ -20,7 +20,7 @@ import java.net.URI;
 import javax.annotation.Generated;
 
 /**
- * An awesome REST endpoint backed by Swagger specifications.
+ * Pets in the store
  * 
  * Generated by camel-package-maven-plugin - do not edit this file!
  */
@@ -42,6 +42,10 @@ public class PetStoreConnectorConfigurationCommon {
      * ID of the operation from the Swagger specification.
      */
     private String operationId;
+    /**
+     * Delay in milli seconds between scheduling (executing)
+     */
+    private long schedulerPeriod = 5000L;
 
     public URI getSpecificationUri() {
         return specificationUri;
@@ -58,4 +62,12 @@ public class PetStoreConnectorConfigurationCommon {
     public void setOperationId(String operationId) {
         this.operationId = operationId;
     }
+
+    public long getSchedulerPeriod() {
+        return schedulerPeriod;
+    }
+
+    public void setSchedulerPeriod(long schedulerPeriod) {
+        this.schedulerPeriod = schedulerPeriod;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/petstore-connector/src/main/resources/camel-connector-schema.json
----------------------------------------------------------------------
diff --git a/connectors/examples/petstore-connector/src/main/resources/camel-connector-schema.json b/connectors/examples/petstore-connector/src/main/resources/camel-connector-schema.json
index 04bcd73..f28e253 100644
--- a/connectors/examples/petstore-connector/src/main/resources/camel-connector-schema.json
+++ b/connectors/examples/petstore-connector/src/main/resources/camel-connector-schema.json
@@ -22,5 +22,7 @@
   "properties": {
     "operationId": { "kind": "path", "displayName": "Operation Id", "group": "producer", "label": "producer", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "ID of the operation from the Swagger specification." },
     "schedulerPeriod": { "kind": "parameter", "displayName": "Period", "group": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": 5000, "description": "Delay in milli seconds between scheduling (executing)" }
+  },
+  "connectorProperties": {
   }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/petstore-connector/src/main/resources/camel-connector.json
----------------------------------------------------------------------
diff --git a/connectors/examples/petstore-connector/src/main/resources/camel-connector.json b/connectors/examples/petstore-connector/src/main/resources/camel-connector.json
index f701a65..fb44e52 100644
--- a/connectors/examples/petstore-connector/src/main/resources/camel-connector.json
+++ b/connectors/examples/petstore-connector/src/main/resources/camel-connector.json
@@ -2,7 +2,7 @@
   "baseScheme" : "rest-swagger",
   "baseGroupId" : "org.apache.camel",
   "baseArtifactId" : "camel-rest-swagger",
-  "baseVersion" : "2.20.0-SNAPSHOT",
+  "baseVersion" : "2.20.0-20170904.034931-187",
   "baseJavaType" : "org.apache.camel.component.rest.swagger.RestSwaggerComponent",
   "name" : "PetStore",
   "scheme" : "petstore",

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorAutoConfiguration.java b/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorAutoConfiguration.java
index 89c4dee..dcc1411 100644
--- a/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorAutoConfiguration.java
+++ b/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorAutoConfiguration.java
@@ -17,12 +17,19 @@
 package org.foo.salesforce.contact.springboot;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import javax.annotation.Generated;
 import javax.annotation.PostConstruct;
 import org.apache.camel.CamelContext;
-import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.component.connector.ConnectorCustomizer;
+import org.apache.camel.spi.HasId;
+import org.apache.camel.spring.boot.util.CamelPropertiesHelper;
+import org.apache.camel.spring.boot.util.HierarchicalPropertiesEvaluator;
+import org.apache.camel.util.ObjectHelper;
 import org.foo.salesforce.contact.SalesforceUpsertContactComponent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -30,6 +37,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
@@ -44,10 +52,16 @@ import org.springframework.context.annotation.Lazy;
 @EnableConfigurationProperties(SalesforceUpsertContactConnectorConfiguration.class)
 public class SalesforceUpsertContactConnectorAutoConfiguration {
 
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(SalesforceUpsertContactConnectorAutoConfiguration.class);
+    @Autowired
+    private ApplicationContext applicationContext;
     @Autowired
     private CamelContext camelContext;
     @Autowired
     private SalesforceUpsertContactConnectorConfiguration configuration;
+    @Autowired(required = false)
+    private List<ConnectorCustomizer<SalesforceUpsertContactComponent>> customizers;
 
     @Lazy
     @Bean(name = "salesforce-upsert-contact-component")
@@ -58,35 +72,72 @@ public class SalesforceUpsertContactConnectorAutoConfiguration {
         SalesforceUpsertContactComponent connector = new SalesforceUpsertContactComponent();
         connector.setCamelContext(camelContext);
         Map<String, Object> parameters = new HashMap<>();
-        IntrospectionSupport.getProperties(configuration, parameters, null,
-                false);
-        IntrospectionSupport.setProperties(camelContext,
-                camelContext.getTypeConverter(), connector, parameters);
-        connector.setComponentOptions(parameters);
+        CamelPropertiesHelper.setCamelProperties(camelContext, connector,
+                parameters, false);
+        connector.setOptions(parameters);
+        if (ObjectHelper.isNotEmpty(customizers)) {
+            for (ConnectorCustomizer<SalesforceUpsertContactComponent> customizer : customizers) {
+                boolean useCustomizer = (customizer instanceof HasId)
+                        ? HierarchicalPropertiesEvaluator
+                                .evaluate(
+                                        applicationContext.getEnvironment(),
+                                        "camel.connector.customizer",
+                                        "camel.connector.salesforce-upsert-contact.customizer",
+                                        ((HasId) customizer).getId())
+                        : HierarchicalPropertiesEvaluator
+                                .evaluate(applicationContext.getEnvironment(),
+                                        "camel.connector.customizer",
+                                        "camel.connector.salesforce-upsert-contact.customizer");
+                if (useCustomizer) {
+                    LOGGER.debug("Configure connector {}, with customizer {}",
+                            connector, customizer);
+                    customizer.customize(connector);
+                }
+            }
+        }
         return connector;
     }
 
     @PostConstruct
     public void postConstructSalesforceUpsertContactComponent() {
-        if (camelContext != null) {
-            Map<String, Object> parameters = new HashMap<>();
-            for (Map.Entry<String, SalesforceUpsertContactConnectorConfigurationCommon> entry : configuration
-                    .getConfigurations().entrySet()) {
-                parameters.clear();
-                SalesforceUpsertContactComponent connector = new SalesforceUpsertContactComponent();
-                connector.setCamelContext(camelContext);
-                try {
-                    IntrospectionSupport.getProperties(entry.getValue(),
-                            parameters, null, false);
-                    IntrospectionSupport.setProperties(camelContext,
-                            camelContext.getTypeConverter(), connector,
-                            parameters);
-                    connector.setComponentOptions(parameters);
-                    camelContext.addComponent(entry.getKey(), connector);
-                } catch (Exception e) {
-                    throw new BeanCreationException(entry.getKey(),
-                            e.getMessage(), e);
+        Map<String, Object> parameters = new HashMap<>();
+        for (Map.Entry<String, SalesforceUpsertContactConnectorConfigurationCommon> entry : configuration
+                .getConfigurations().entrySet()) {
+            parameters.clear();
+            SalesforceUpsertContactComponent connector = new SalesforceUpsertContactComponent();
+            connector.setCamelContext(camelContext);
+            try {
+                CamelPropertiesHelper.setCamelProperties(camelContext,
+                        connector, parameters, false);
+                connector.setOptions(parameters);
+                if (ObjectHelper.isNotEmpty(customizers)) {
+                    for (ConnectorCustomizer<SalesforceUpsertContactComponent> customizer : customizers) {
+                        boolean useCustomizer = (customizer instanceof HasId)
+                                ? HierarchicalPropertiesEvaluator.evaluate(
+                                        applicationContext.getEnvironment(),
+                                        "camel.connector.customizer",
+                                        "camel.connector.salesforce-upsert-contact."
+                                                + entry.getKey()
+                                                + ".customizer",
+                                        ((HasId) customizer).getId())
+                                : HierarchicalPropertiesEvaluator.evaluate(
+                                        applicationContext.getEnvironment(),
+                                        "camel.connector.customizer",
+                                        "camel.connector.salesforce-upsert-contact."
+                                                + entry.getKey()
+                                                + ".customizer");
+                        if (useCustomizer) {
+                            LOGGER.debug(
+                                    "Configure connector {}, with customizer {}",
+                                    connector, customizer);
+                            customizer.customize(connector);
+                        }
+                    }
                 }
+                camelContext.addComponent(entry.getKey(), connector);
+            } catch (Exception e) {
+                throw new BeanCreationException(entry.getKey(), e.getMessage(),
+                        e);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorConfigurationCommon.java
----------------------------------------------------------------------
diff --git a/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorConfigurationCommon.java b/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorConfigurationCommon.java
index 02ecb84..865dda6 100644
--- a/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorConfigurationCommon.java
+++ b/connectors/examples/salesforce-upsert-contact-connector/src/main/java/org/foo/salesforce/contact/springboot/SalesforceUpsertContactConnectorConfigurationCommon.java
@@ -19,8 +19,7 @@ package org.foo.salesforce.contact.springboot;
 import javax.annotation.Generated;
 
 /**
- * The salesforce connector is used for integrating Camel with the massive
- * Salesforce API.
+ * Create or update Salesforce Contact SObject
  * 
  * Generated by camel-package-maven-plugin - do not edit this file!
  */

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector-schema.json
----------------------------------------------------------------------
diff --git a/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector-schema.json b/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector-schema.json
index 6e3813b..966d32f 100644
--- a/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector-schema.json
+++ b/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector-schema.json
@@ -18,12 +18,14 @@
   },
   "componentProperties": {
     "loginUrl": { "kind": "property", "displayName": "Login Url", "group": "security", "label": "common,security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "https://login.salesforce.com", "description": "URL of the Salesforce instance used for authentication by default set to https://login.salesforce.com" },
-    "clientId": { "kind": "property", "displayName": "Client Id", "group": "security", "label": "common,security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "description": "OAuth Consumer Key of the connected app configured in the Salesforce instance setup. Typically a connected app needs to be configured but one can be provided by installing a package." },
+    "clientId": { "kind": "property", "displayName": "Client Id", "group": "security", "label": "common,security", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "OAuth Consumer Key of the connected app configured in the Salesforce instance setup. Typically a connected app needs to be configured but one can be provided by installing a package." },
     "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "common,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "description": "OAuth Consumer Secret of the connected app configured in the Salesforce instance setup." },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "common,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "description": "Refresh token already obtained in the refresh token OAuth flow. One needs to setup a web application and configure a callback URL to receive the refresh token or configure using the builtin callback at https://login.salesforce.com/services/oauth2/success or https://test.salesforce.com/services/oauth2/success and then retrive the refresh_token from the URL at the end of the flow. Note that in development organizations Salesforce allows hosting the callback web application at localhost." }
   },
   "properties": {
     "sObjectIdName": { "kind": "parameter", "displayName": "SObject Id Name", "group": "common", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "SObject external ID field name" },
     "sObjectIdValue": { "kind": "parameter", "displayName": "SObject Id Value", "group": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "SObject external ID field value" }
+  },
+  "connectorProperties": {
   }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector.json
----------------------------------------------------------------------
diff --git a/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector.json b/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector.json
index bad488c..e548c02 100644
--- a/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector.json
+++ b/connectors/examples/salesforce-upsert-contact-connector/src/main/resources/camel-connector.json
@@ -2,7 +2,7 @@
   "baseScheme" : "salesforce",
   "baseGroupId" : "org.apache.camel",
   "baseArtifactId" : "camel-salesforce",
-  "baseVersion" : "2.20.0-SNAPSHOT",
+  "baseVersion" : "2.20.0-20170904.035306-186",
   "baseJavaType" : "org.apache.camel.component.salesforce.SalesforceComponent",
   "name" : "SalesforceUpsertContact",
   "scheme" : "salesforce-upsert-contact",

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorAutoConfiguration.java b/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorAutoConfiguration.java
index e7f3c02..1421242 100644
--- a/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorAutoConfiguration.java
+++ b/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorAutoConfiguration.java
@@ -24,8 +24,8 @@ import javax.annotation.PostConstruct;
 import org.apache.camel.CamelContext;
 import org.apache.camel.component.connector.ConnectorCustomizer;
 import org.apache.camel.spi.HasId;
+import org.apache.camel.spring.boot.util.CamelPropertiesHelper;
 import org.apache.camel.spring.boot.util.HierarchicalPropertiesEvaluator;
-import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.ObjectHelper;
 import org.foo.mention.TwitterMentionComponent;
 import org.slf4j.Logger;
@@ -72,11 +72,9 @@ public class TwitterMentionConnectorAutoConfiguration {
         TwitterMentionComponent connector = new TwitterMentionComponent();
         connector.setCamelContext(camelContext);
         Map<String, Object> parameters = new HashMap<>();
-        IntrospectionSupport.getProperties(configuration, parameters, null,
-                false);
-        IntrospectionSupport.setProperties(camelContext,
-                camelContext.getTypeConverter(), connector, parameters);
-        connector.setComponentOptions(parameters);
+        CamelPropertiesHelper.setCamelProperties(camelContext, connector,
+                parameters, false);
+        connector.setOptions(parameters);
         if (ObjectHelper.isNotEmpty(customizers)) {
             for (ConnectorCustomizer<TwitterMentionComponent> customizer : customizers) {
                 boolean useCustomizer = (customizer instanceof HasId)
@@ -108,11 +106,9 @@ public class TwitterMentionConnectorAutoConfiguration {
             TwitterMentionComponent connector = new TwitterMentionComponent();
             connector.setCamelContext(camelContext);
             try {
-                IntrospectionSupport.getProperties(entry.getValue(),
-                        parameters, null, false);
-                IntrospectionSupport.setProperties(camelContext,
-                        camelContext.getTypeConverter(), connector, parameters);
-                connector.setComponentOptions(parameters);
+                CamelPropertiesHelper.setCamelProperties(camelContext,
+                        connector, parameters, false);
+                connector.setOptions(parameters);
                 if (ObjectHelper.isNotEmpty(customizers)) {
                     for (ConnectorCustomizer<TwitterMentionComponent> customizer : customizers) {
                         boolean useCustomizer = (customizer instanceof HasId)

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorConfigurationCommon.java
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorConfigurationCommon.java b/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorConfigurationCommon.java
index 10c70b1..37d6efd 100644
--- a/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorConfigurationCommon.java
+++ b/connectors/examples/twitter-mention-connector/src/main/java/org/foo/mention/springboot/TwitterMentionConnectorConfigurationCommon.java
@@ -19,8 +19,7 @@ package org.foo.mention.springboot;
 import javax.annotation.Generated;
 
 /**
- * Use twitter-directmessage twitter-search twitter-streaming and
- * twitter-timeline instead of this connector.
+ * Connection from twitter when anyone mention you
  * 
  * Generated by camel-package-maven-plugin - do not edit this file!
  */

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector-schema.json
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector-schema.json b/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector-schema.json
index 666b3b6..4ab2632 100644
--- a/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector-schema.json
+++ b/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector-schema.json
@@ -23,5 +23,7 @@
     "consumerSecret": { "kind": "property", "displayName": "Consumer Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "description": "The consumer secret" }
   },
   "properties": {
+  },
+  "connectorProperties": {
   }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector.json
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector.json b/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector.json
index d97831a..5777153 100644
--- a/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector.json
+++ b/connectors/examples/twitter-mention-connector/src/main/resources/camel-connector.json
@@ -2,7 +2,7 @@
   "baseScheme" : "twitter",
   "baseGroupId" : "org.apache.camel",
   "baseArtifactId" : "camel-twitter",
-  "baseVersion" : "2.20.0-20170831.153623-177",
+  "baseVersion" : "2.20.0-20170904.041524-180",
   "baseJavaType" : "org.apache.camel.component.twitter.TwitterComponent",
   "name" : "TwitterMention",
   "scheme" : "twitter-mention",

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorAutoConfiguration.java b/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorAutoConfiguration.java
index fb76779..b2acf9b 100644
--- a/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorAutoConfiguration.java
+++ b/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorAutoConfiguration.java
@@ -24,8 +24,8 @@ import javax.annotation.PostConstruct;
 import org.apache.camel.CamelContext;
 import org.apache.camel.component.connector.ConnectorCustomizer;
 import org.apache.camel.spi.HasId;
+import org.apache.camel.spring.boot.util.CamelPropertiesHelper;
 import org.apache.camel.spring.boot.util.HierarchicalPropertiesEvaluator;
-import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.ObjectHelper;
 import org.foo.search.TwitterSearchComponent;
 import org.slf4j.Logger;
@@ -72,11 +72,9 @@ public class TwitterSearchConnectorAutoConfiguration {
         TwitterSearchComponent connector = new TwitterSearchComponent();
         connector.setCamelContext(camelContext);
         Map<String, Object> parameters = new HashMap<>();
-        IntrospectionSupport.getProperties(configuration, parameters, null,
-                false);
-        IntrospectionSupport.setProperties(camelContext,
-                camelContext.getTypeConverter(), connector, parameters);
-        connector.setComponentOptions(parameters);
+        CamelPropertiesHelper.setCamelProperties(camelContext, connector,
+                parameters, false);
+        connector.setOptions(parameters);
         if (ObjectHelper.isNotEmpty(customizers)) {
             for (ConnectorCustomizer<TwitterSearchComponent> customizer : customizers) {
                 boolean useCustomizer = (customizer instanceof HasId)
@@ -108,11 +106,9 @@ public class TwitterSearchConnectorAutoConfiguration {
             TwitterSearchComponent connector = new TwitterSearchComponent();
             connector.setCamelContext(camelContext);
             try {
-                IntrospectionSupport.getProperties(entry.getValue(),
-                        parameters, null, false);
-                IntrospectionSupport.setProperties(camelContext,
-                        camelContext.getTypeConverter(), connector, parameters);
-                connector.setComponentOptions(parameters);
+                CamelPropertiesHelper.setCamelProperties(camelContext,
+                        connector, parameters, false);
+                connector.setOptions(parameters);
                 if (ObjectHelper.isNotEmpty(customizers)) {
                     for (ConnectorCustomizer<TwitterSearchComponent> customizer : customizers) {
                         boolean useCustomizer = (customizer instanceof HasId)

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorConfigurationCommon.java
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorConfigurationCommon.java b/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorConfigurationCommon.java
index 2adcb3f..c320a39 100644
--- a/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorConfigurationCommon.java
+++ b/connectors/examples/twitter-search-connector/src/main/java/org/foo/search/springboot/TwitterSearchConnectorConfigurationCommon.java
@@ -19,8 +19,7 @@ package org.foo.search.springboot;
 import javax.annotation.Generated;
 
 /**
- * Use twitter-directmessage twitter-search twitter-streaming and
- * twitter-timeline instead of this connector.
+ * Search for twitter
  * 
  * Generated by camel-package-maven-plugin - do not edit this file!
  */
@@ -56,7 +55,11 @@ public class TwitterSearchConnectorConfigurationCommon {
     /**
      * Milliseconds before the next poll.
      */
-    private long delay = 30000L;
+    private long delay = 5000L;
+    /**
+     * A prefix
+     */
+    private String prefix;
 
     public String getAccessToken() {
         return accessToken;
@@ -113,4 +116,12 @@ public class TwitterSearchConnectorConfigurationCommon {
     public void setDelay(long delay) {
         this.delay = delay;
     }
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-search-connector/src/main/resources/camel-connector-schema.json
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-search-connector/src/main/resources/camel-connector-schema.json b/connectors/examples/twitter-search-connector/src/main/resources/camel-connector-schema.json
index 60ffe74..c60ebb5 100644
--- a/connectors/examples/twitter-search-connector/src/main/resources/camel-connector-schema.json
+++ b/connectors/examples/twitter-search-connector/src/main/resources/camel-connector-schema.json
@@ -26,5 +26,8 @@
     "filterOld": { "kind": "parameter", "displayName": "Filter Old", "group": "filter", "label": "consumer,filter", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": true, "description": "Filter out old tweets that has previously been polled. This state is stored in memory only and based on last tweet id." },
     "keywords": { "kind": "parameter", "displayName": "Keywords", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Can be used for search and streaming/filter. Multiple values can be separated with comma." },
     "delay": { "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "optionalPrefix": "consumer.", "deprecated": false, "secret": false, "defaultValue": 5000, "description": "Milliseconds before the next poll." }
+  },
+  "connectorProperties": {
+    "prefix": { "kind": "parameter", "displayName": "Keywourd prefix", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "A prefix" }
   }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-search-connector/src/main/resources/camel-connector.json
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-search-connector/src/main/resources/camel-connector.json b/connectors/examples/twitter-search-connector/src/main/resources/camel-connector.json
index 9fcaef8..618fee3 100644
--- a/connectors/examples/twitter-search-connector/src/main/resources/camel-connector.json
+++ b/connectors/examples/twitter-search-connector/src/main/resources/camel-connector.json
@@ -2,7 +2,7 @@
   "baseScheme" : "twitter",
   "baseGroupId" : "org.apache.camel",
   "baseArtifactId" : "camel-twitter",
-  "baseVersion" : "2.20.0-20170831.153623-177",
+  "baseVersion" : "2.20.0-20170904.041524-180",
   "baseJavaType" : "org.apache.camel.component.twitter.TwitterComponent",
   "name" : "TwitterSearch",
   "scheme" : "twitter-search",
@@ -21,5 +21,19 @@
     "kind" : "search",
     "type" : "POLLING",
     "delay" : 5000
+  },
+  "connectorProperties" : {
+    "prefix" : {
+      "kind" : "parameter",
+      "displayName" : "Keywourd prefix",
+      "group" : "filter",
+      "label" : "consumer,filter",
+      "required" : false,
+      "type" : "string",
+      "javaType" : "java.lang.String",
+      "deprecated" : false,
+      "secret" : false,
+      "description" : "A prefix"
+    }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-search-example/src/main/java/org/foo/TwitterSearchCustomizer.java
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-search-example/src/main/java/org/foo/TwitterSearchCustomizer.java b/connectors/examples/twitter-search-example/src/main/java/org/foo/TwitterSearchCustomizer.java
index 2190949..435c2e0 100644
--- a/connectors/examples/twitter-search-example/src/main/java/org/foo/TwitterSearchCustomizer.java
+++ b/connectors/examples/twitter-search-example/src/main/java/org/foo/TwitterSearchCustomizer.java
@@ -34,5 +34,12 @@ public class TwitterSearchCustomizer implements ConnectorCustomizer<TwitterSearc
         if (ObjectHelper.isNotEmpty(configuration.getKeywords())) {
             component.addOption("keywords", configuration.getKeywords());
         }
+
+        String keywords = (String)component.getOptions().get("keywords");
+        String prefix = (String)component.getOptions().get("prefix");
+
+        if (ObjectHelper.isNotEmpty(keywords) && ObjectHelper.isNotEmpty(prefix)) {
+            component.addOption("keywords", prefix + keywords);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/twitter-search-example/src/main/resources/application.properties
----------------------------------------------------------------------
diff --git a/connectors/examples/twitter-search-example/src/main/resources/application.properties b/connectors/examples/twitter-search-example/src/main/resources/application.properties
index 30319b1..86ae03c 100644
--- a/connectors/examples/twitter-search-example/src/main/resources/application.properties
+++ b/connectors/examples/twitter-search-example/src/main/resources/application.properties
@@ -26,5 +26,6 @@ camel.connector.twitter-search.configurations.tw-search.consumer-secret = VxNQiR
 camel.connector.twitter-search.configurations.tw-search.access-token = 26693234-W0YjxL9cMJrC0VZZ4xdgFMymxIQ10LeL1K8YlbBY
 camel.connector.twitter-search.configurations.tw-search.access-token-secret = BZD51BgzbOdFstWZYsqB5p5dbuuDV12vrOdatzhY4E
 camel.connector.twitter-search.configurations.tw-search.keywords = camel-test
+camel.connector.twitter-search.configurations.tw-search.prefix = camel
 
-camel.connector.twitter-search.customizer.keywords = cameltest
\ No newline at end of file
+camel.connector.twitter-search.customizer.keywords = test
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/bc09a41d/connectors/examples/wine-connector/src/main/resources/camel-connector-schema.json
----------------------------------------------------------------------
diff --git a/connectors/examples/wine-connector/src/main/resources/camel-connector-schema.json b/connectors/examples/wine-connector/src/main/resources/camel-connector-schema.json
index 957f612..ba7e908 100644
--- a/connectors/examples/wine-connector/src/main/resources/camel-connector-schema.json
+++ b/connectors/examples/wine-connector/src/main/resources/camel-connector-schema.json
@@ -21,5 +21,7 @@
   "properties": {
     "drink": { "kind": "path", "displayName": "Wine Bottle", "group": "producer", "required": true, "type": "object", "javaType": "org.beverage.Beverages", "enum": [ "Wine" ], "deprecated": false, "secret": false, "defaultValue": "Wine", "description": "You can only order wine" },
     "amount": { "kind": "parameter", "displayName": "Amount", "group": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "defaultValue": 1, "description": "Number of drinks in the order" }
+  },
+  "connectorProperties": {
   }
 }