You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/08/09 17:05:28 UTC

[camel] 01/02: CAMEL-15387: camel-salesforce: Can't set Salesforce packages via application properties

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

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

commit 3210d35c4249ea7f4c4f162dd3b3fa77475377d4
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Aug 9 17:33:49 2020 +0200

    CAMEL-15387: camel-salesforce: Can't set Salesforce packages via application properties
---
 .../salesforce/SalesforceComponentConfigurer.java  |  4 +--
 .../camel/component/salesforce/salesforce.json     |  2 +-
 .../src/main/docs/salesforce-component.adoc        |  2 +-
 .../component/salesforce/SalesforceComponent.java  | 32 +++++++++++++++-------
 .../dsl/SalesforceComponentBuilderFactory.java     |  9 +++---
 5 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/components/camel-salesforce/camel-salesforce-component/src/generated/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurer.java b/components/camel-salesforce/camel-salesforce-component/src/generated/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurer.java
index 15188e4..d239777 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/generated/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurer.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/generated/java/org/apache/camel/component/salesforce/SalesforceComponentConfigurer.java
@@ -126,7 +126,7 @@ public class SalesforceComponentConfigurer extends PropertyConfigurerSupport imp
         case "notifyForOperations": getOrCreateConfiguration(target).setNotifyForOperations(property(camelContext, org.apache.camel.component.salesforce.internal.dto.NotifyForOperationsEnum.class, value)); return true;
         case "objectmapper":
         case "objectMapper": getOrCreateConfiguration(target).setObjectMapper(property(camelContext, com.fasterxml.jackson.databind.ObjectMapper.class, value)); return true;
-        case "packages": target.setPackages(property(camelContext, java.lang.String[].class, value)); return true;
+        case "packages": target.setPackages(property(camelContext, java.lang.String.class, value)); return true;
         case "password": target.setPassword(property(camelContext, java.lang.String.class, value)); return true;
         case "rawpayload":
         case "rawPayload": getOrCreateConfiguration(target).setRawPayload(property(camelContext, boolean.class, value)); return true;
@@ -223,7 +223,7 @@ public class SalesforceComponentConfigurer extends PropertyConfigurerSupport imp
         answer.put("notifyForOperationUpdate", java.lang.Boolean.class);
         answer.put("notifyForOperations", org.apache.camel.component.salesforce.internal.dto.NotifyForOperationsEnum.class);
         answer.put("objectMapper", com.fasterxml.jackson.databind.ObjectMapper.class);
-        answer.put("packages", java.lang.String[].class);
+        answer.put("packages", java.lang.String.class);
         answer.put("password", java.lang.String.class);
         answer.put("rawPayload", boolean.class);
         answer.put("refreshToken", java.lang.String.class);
diff --git a/components/camel-salesforce/camel-salesforce-component/src/generated/resources/org/apache/camel/component/salesforce/salesforce.json b/components/camel-salesforce/camel-salesforce-component/src/generated/resources/org/apache/camel/component/salesforce/salesforce.json
index 08900d3..c311db0 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/generated/resources/org/apache/camel/component/salesforce/salesforce.json
+++ b/components/camel-salesforce/camel-salesforce-component/src/generated/resources/org/apache/camel/component/salesforce/salesforce.json
@@ -49,7 +49,7 @@
     "notifyForOperationUndelete": { "kind": "property", "displayName": "Notify For Operation Undelete", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.salesforce.SalesforceEndpointConfig", "configurationField": "config", "description": "Notify for un-delete operation, defaults to false (API version = 29.0)" },
     "notifyForOperationUpdate": { "kind": "property", "displayName": "Notify For Operation Update", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.salesforce.SalesforceEndpointConfig", "configurationField": "config", "description": "Notify for update operation, defaults to false (API version = 29.0)" },
     "objectMapper": { "kind": "property", "displayName": "Object Mapper", "group": "common", "label": "", "required": false, "type": "object", "javaType": "com.fasterxml.jackson.databind.ObjectMapper", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.salesforce.SalesforceEndpointConfig", "configurationField": "config", "description": "Custom Jackson ObjectMapper to use when serializing\/deserializing Salesforce objects." },
-    "packages": { "kind": "property", "displayName": "Packages", "group": "common", "label": "common", "required": false, "type": "array", "javaType": "java.lang.String[]", "deprecated": false, "secret": false, "description": "In what packages are the generated DTO classes. Typically the classes would be generated using camel-salesforce-maven-plugin. Set it if using the generated DTOs to gain the benefit of using short SObject names in parameters\/header values." },
+    "packages": { "kind": "property", "displayName": "Packages", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "In what packages are the generated DTO classes. Typically the classes would be generated using camel-salesforce-maven-plugin. Set it if using the generated DTOs to gain the benefit of using short SObject names in parameters\/header values. Multiple packages can be s [...]
     "rawPayload": { "kind": "property", "displayName": "Raw Payload", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.salesforce.SalesforceEndpointConfig", "configurationField": "config", "description": "Use raw payload String for request and response (either JSON or XML depending on format), instead of DTOs, false by default" },
     "reportId": { "kind": "property", "displayName": "Report Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.salesforce.SalesforceEndpointConfig", "configurationField": "config", "description": "Salesforce1 Analytics report Id" },
     "reportMetadata": { "kind": "property", "displayName": "Report Metadata", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.salesforce.api.dto.analytics.reports.ReportMetadata", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.salesforce.SalesforceEndpointConfig", "configurationField": "config", "description": "Salesforce1 Analytics report metadata for filtering" },
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
index f3168a2..c83d9a9 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
@@ -689,7 +689,7 @@ The Salesforce component supports 72 options, which are listed below.
 | *notifyForOperationUndelete* (common) | Notify for un-delete operation, defaults to false (API version = 29.0) |  | Boolean
 | *notifyForOperationUpdate* (common) | Notify for update operation, defaults to false (API version = 29.0) |  | Boolean
 | *objectMapper* (common) | Custom Jackson ObjectMapper to use when serializing/deserializing Salesforce objects. |  | ObjectMapper
-| *packages* (common) | In what packages are the generated DTO classes. Typically the classes would be generated using camel-salesforce-maven-plugin. Set it if using the generated DTOs to gain the benefit of using short SObject names in parameters/header values. |  | String[]
+| *packages* (common) | In what packages are the generated DTO classes. Typically the classes would be generated using camel-salesforce-maven-plugin. Set it if using the generated DTOs to gain the benefit of using short SObject names in parameters/header values. Multiple packages can be separated by comma. |  | String
 | *rawPayload* (common) | Use raw payload String for request and response (either JSON or XML depending on format), instead of DTOs, false by default | false | boolean
 | *reportId* (common) | Salesforce1 Analytics report Id |  | String
 | *reportMetadata* (common) | Salesforce1 Analytics report metadata for filtering |  | ReportMetadata
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
index 04d8192..894021c 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.StringJoiner;
 import java.util.function.Supplier;
 import java.util.regex.Pattern;
 
@@ -207,8 +208,8 @@ public class SalesforceComponent extends DefaultComponent implements SSLContextP
 
     @Metadata(description = "In what packages are the generated DTO classes. Typically the classes would be generated"
                             + " using camel-salesforce-maven-plugin. Set it if using the generated DTOs to gain the benefit of using short "
-                            + " SObject names in parameters/header values.", label = "common")
-    private String[] packages;
+                            + " SObject names in parameters/header values. Multiple packages can be separated by comma.", javaType = "java.lang.String", label = "common")
+    private String packages;
 
     // component state
     private SalesforceHttpClient httpClient;
@@ -290,7 +291,7 @@ public class SalesforceComponent extends DefaultComponent implements SSLContextP
 
     private Map<String, Class<?>> parsePackages() {
         Map<String, Class<?>> result = new HashMap<>();
-        Set<Class<?>> classes = getCamelContext().adapt(ExtendedCamelContext.class).getPackageScanClassResolver().findImplementations(AbstractSObjectBase.class, packages);
+        Set<Class<?>> classes = getCamelContext().adapt(ExtendedCamelContext.class).getPackageScanClassResolver().findImplementations(AbstractSObjectBase.class, getPackagesAsArray());
         for (Class<?> aClass : classes) {
             result.put(aClass.getSimpleName(), aClass);
         }
@@ -357,10 +358,10 @@ public class SalesforceComponent extends DefaultComponent implements SSLContextP
             ServiceHelper.startService(session);
         }
 
-        if (packages != null && packages.length > 0) {
+        if (packages != null) {
             // parse the packages to create SObject name to class map
             classMap = parsePackages();
-            LOG.info("Found {} generated classes in packages: {}", classMap.size(), Arrays.asList(packages));
+            LOG.info("Found {} generated classes in packages: {}", classMap.size(), packages);
         } else {
             // use an empty map to avoid NPEs later
             LOG.warn("Missing property packages, getSObject* operations will NOT work without property rawPayload=true");
@@ -653,18 +654,29 @@ public class SalesforceComponent extends DefaultComponent implements SSLContextP
         this.httpProxyUseDigestAuth = httpProxyUseDigestAuth;
     }
 
-    public String[] getPackages() {
+    public String getPackages() {
         return packages;
     }
 
-    public void setPackages(String[] packages) {
+    public void setPackages(String packages) {
         this.packages = packages;
     }
 
-    public void setPackages(String packages) {
-        // split using comma
+    /**
+     * @deprecated use {@link #setPackages(String)}
+     */
+    @Deprecated
+    public void setPackages(String[] packages) {
         if (packages != null) {
-            setPackages(packages.split(","));
+            this.packages = String.join(",", packages);
+        }
+    }
+
+    public String[] getPackagesAsArray() {
+        if (packages != null) {
+            return packages.split(",");
+        } else {
+            return null;
         }
     }
 
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SalesforceComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SalesforceComponentBuilderFactory.java
index 9641d95..00b35c3 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SalesforceComponentBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SalesforceComponentBuilderFactory.java
@@ -399,13 +399,14 @@ public interface SalesforceComponentBuilderFactory {
          * In what packages are the generated DTO classes. Typically the classes
          * would be generated using camel-salesforce-maven-plugin. Set it if
          * using the generated DTOs to gain the benefit of using short SObject
-         * names in parameters/header values.
+         * names in parameters/header values. Multiple packages can be separated
+         * by comma.
          * 
-         * The option is a: <code>java.lang.String[]</code> type.
+         * The option is a: <code>java.lang.String</code> type.
          * 
          * Group: common
          */
-        default SalesforceComponentBuilder packages(java.lang.String[] packages) {
+        default SalesforceComponentBuilder packages(java.lang.String packages) {
             doSetProperty("packages", packages);
             return this;
         }
@@ -1056,7 +1057,7 @@ public interface SalesforceComponentBuilderFactory {
             case "notifyForOperationUndelete": getOrCreateConfiguration((SalesforceComponent) component).setNotifyForOperationUndelete((java.lang.Boolean) value); return true;
             case "notifyForOperationUpdate": getOrCreateConfiguration((SalesforceComponent) component).setNotifyForOperationUpdate((java.lang.Boolean) value); return true;
             case "objectMapper": getOrCreateConfiguration((SalesforceComponent) component).setObjectMapper((com.fasterxml.jackson.databind.ObjectMapper) value); return true;
-            case "packages": ((SalesforceComponent) component).setPackages((java.lang.String[]) value); return true;
+            case "packages": ((SalesforceComponent) component).setPackages((java.lang.String) value); return true;
             case "rawPayload": getOrCreateConfiguration((SalesforceComponent) component).setRawPayload((boolean) value); return true;
             case "reportId": getOrCreateConfiguration((SalesforceComponent) component).setReportId((java.lang.String) value); return true;
             case "reportMetadata": getOrCreateConfiguration((SalesforceComponent) component).setReportMetadata((org.apache.camel.component.salesforce.api.dto.analytics.reports.ReportMetadata) value); return true;