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 <[email protected]>
Authored: Fri Sep 1 18:55:42 2017 +0200
Committer: lburgazzoli <[email protected]>
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": {
   }
 }

Reply via email to