You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dh...@apache.org on 2017/08/03 08:35:49 UTC

[1/8] camel git commit: CAMEL-10743: Added guard for Apex REST APIs and other minor fixes for JSON Schema support

Repository: camel
Updated Branches:
  refs/heads/camel-2.19.x 38cca4242 -> 862be0eea


CAMEL-10743: Added guard for Apex REST APIs and other minor fixes for JSON Schema support

Conflicts:
	components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java


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

Branch: refs/heads/camel-2.19.x
Commit: 6f9ed73b65dc1ca7dea79780ed754453a73e1560
Parents: 38cca42
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Wed Aug 2 23:16:52 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:12:39 2017 -0700

----------------------------------------------------------------------
 .../salesforce/api/dto/AbstractSObjectBase.java      |  2 +-
 .../salesforce/api/utils/DateTimeDeserializer.java   |  4 ++++
 .../salesforce/api/utils/DateTimeSerializer.java     | 12 ++++++++++++
 .../salesforce/internal/SalesforceSession.java       |  7 ++++++-
 .../internal/client/DefaultRestClient.java           | 15 ++++++++++++---
 5 files changed, 35 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6f9ed73b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/dto/AbstractSObjectBase.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/dto/AbstractSObjectBase.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/dto/AbstractSObjectBase.java
index 183a7aa..404bfa2 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/dto/AbstractSObjectBase.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/dto/AbstractSObjectBase.java
@@ -21,7 +21,7 @@ import java.time.ZonedDateTime;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 //CHECKSTYLE:OFF
-public class AbstractSObjectBase extends AbstractDTOBase {
+public abstract class AbstractSObjectBase extends AbstractDTOBase {
 
     // WARNING: these fields have case sensitive names,
     // the field name MUST match the field name used by Salesforce

http://git-wip-us.apache.org/repos/asf/camel/blob/6f9ed73b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeDeserializer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeDeserializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeDeserializer.java
index e62496e..fefa68b 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeDeserializer.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeDeserializer.java
@@ -41,4 +41,8 @@ public class DateTimeDeserializer extends JsonDeserializer<ZonedDateTime> {
         throw JsonMappingException.from(deserializationContext, "Expected String value, got: " + currentToken);
     }
 
+    @Override
+    public Class<?> handledType() {
+        return ZonedDateTime.class;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/6f9ed73b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeSerializer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeSerializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeSerializer.java
index ccf936a..26c8a39 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeSerializer.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeSerializer.java
@@ -20,8 +20,11 @@ import java.io.IOException;
 import java.time.ZonedDateTime;
 
 import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
 
 
 public class DateTimeSerializer extends JsonSerializer<ZonedDateTime> {
@@ -35,4 +38,13 @@ public class DateTimeSerializer extends JsonSerializer<ZonedDateTime> {
         jsonGenerator.writeString(DateTimeUtils.formatDateTime(dateTime));
     }
 
+    @Override
+    public Class<ZonedDateTime> handledType() {
+        return ZonedDateTime.class;
+    }
+
+    @Override
+    public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType type) throws JsonMappingException {
+        visitor.expectStringFormat(type);
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/6f9ed73b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
index a38749b..a7a9303 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
@@ -247,7 +247,12 @@ public class SalesforceSession implements Service {
                 // don't log token or instance URL for security reasons
                 LOG.info("Login successful");
                 accessToken = token.getAccessToken();
-                instanceUrl = token.getInstanceUrl();
+                instanceUrl = Optional.ofNullable(config.getInstanceUrl()).orElse(token.getInstanceUrl());
+                // strip trailing '/'
+                int lastChar = instanceUrl.length() - 1;
+                if (instanceUrl.charAt(lastChar) == '/') {
+                    instanceUrl = instanceUrl.substring(0, lastChar);
+                }
 
                 // notify all session listeners
                 for (SalesforceSessionListener listener : listeners) {

http://git-wip-us.apache.org/repos/asf/camel/blob/6f9ed73b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
index e8e38e0..248e412 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
@@ -396,9 +396,18 @@ public class DefaultRestClient extends AbstractClientBase implements RestClient
             request = getRequest(httpMethod, apexCallUrl(apexUrl, queryParams));
             // set request SObject and content type
             if (requestDto != null) {
-                request.content(new InputStreamContentProvider(requestDto));
-                request.header(HttpHeader.CONTENT_TYPE,
-                        PayloadFormat.JSON.equals(format) ? APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
+                // guard against requests that do not support bodies
+                switch (request.getMethod()) {
+                case "PUT":
+                case "PATCH":
+                case "POST":
+                    request.content(new InputStreamContentProvider(requestDto));
+                    request.header(HttpHeader.CONTENT_TYPE,
+                            PayloadFormat.JSON.equals(format) ? APPLICATION_JSON_UTF8 : APPLICATION_XML_UTF8);
+                    break;
+                default:
+                    // ignore body for other methods
+                }
             }
 
             // requires authorization token


[3/8] camel git commit: CAMEL-10744: Updated camel salesforce maven plugin to generate json schema file with types for Salesforce objects

Posted by dh...@apache.org.
CAMEL-10744: Updated camel salesforce maven plugin to generate json schema file with types for Salesforce objects


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

Branch: refs/heads/camel-2.19.x
Commit: 8ef01f9e7470d9a9cfda893ac992663cee5a2bfc
Parents: e0fe1df
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Thu Aug 3 00:16:56 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:13:29 2017 -0700

----------------------------------------------------------------------
 .../apache/camel/maven/CamelSalesforceMojo.java | 72 +++++++++++++++++---
 .../CamelSalesforceMojoIntegrationTest.java     | 33 +++++++--
 2 files changed, 90 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8ef01f9e/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
index a169047..6a48ea7 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
@@ -24,6 +24,8 @@ import java.io.Writer;
 import java.lang.reflect.Field;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.security.GeneralSecurityException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -272,6 +274,24 @@ public class CamelSalesforceMojo extends AbstractMojo {
     @Parameter(property = "camelSalesforce.useStringsForPicklists", defaultValue = "false")
     protected Boolean useStringsForPicklists;
 
+    /**
+     * Generate JSON Schema for DTOs, instead of Java Objects.
+     */
+    @Parameter(property = "camelSalesforce.jsonSchema")
+    protected boolean jsonSchema;
+
+    /**
+     * Schema ID for JSON Schema for DTOs.
+     */
+    @Parameter(property = "camelSalesforce.jsonSchemaId", defaultValue = JsonUtils.DEFAULT_ID_PREFIX)
+    protected String jsonSchemaId;
+
+    /**
+     * Schema ID for JSON Schema for DTOs.
+     */
+    @Parameter(property = "camelSalesforce.jsonSchemaFilename", defaultValue = "salesforce-dto-schema.json")
+    protected String jsonSchemaFilename;
+
     VelocityEngine engine;
 
     private long responseTimeout;
@@ -402,22 +422,52 @@ public class CamelSalesforceMojo extends AbstractMojo {
                 }
             }
 
-            getLog().info("Generating Java Classes...");
-            // generate POJOs for every object description
-            final GeneratorUtility utility = new GeneratorUtility(useStringsForPicklists);
-            // should we provide a flag to control timestamp generation?
-            final String generatedDate = new Date().toString();
-            for (SObjectDescription description : descriptions) {
-                if (IGNORED_OBJECTS.contains(description.getName())) {
-                    continue;
+            if (!jsonSchema) {
+
+                getLog().info("Generating Java Classes...");
+                // generate POJOs for every object description
+                final GeneratorUtility utility = new GeneratorUtility(useStringsForPicklists);
+                // should we provide a flag to control timestamp generation?
+                final String generatedDate = new Date().toString();
+                for (SObjectDescription description : descriptions) {
+                    if (IGNORED_OBJECTS.contains(description.getName())) {
+                        continue;
+                    }
+                    try {
+                        processDescription(pkgDir, description, utility, generatedDate);
+                    } catch (IOException e) {
+                        throw new MojoExecutionException("Unable to generate source files for: " + description.getName(), e);
+                    }
+                }
+
+                getLog().info(String.format("Successfully generated %s Java Classes", descriptions.size() * 2));
+
+            } else {
+
+                getLog().info("Generating JSON Schema...");
+                // generate JSON schema for every object description
+                final ObjectMapper schemaObjectMapper = JsonUtils.createSchemaObjectMapper();
+                final Set<Object> allSchemas = new HashSet<>();
+                for (SObjectDescription description : descriptions) {
+                    if (IGNORED_OBJECTS.contains(description.getName())) {
+                        continue;
+                    }
+                    try {
+                        allSchemas.add(JsonUtils.getSObjectJsonSchema(schemaObjectMapper, description, jsonSchemaId, true));
+                    } catch (IOException e) {
+                        throw new MojoExecutionException("Unable to generate JSON Schema types for: " + description.getName(), e);
+                    }
                 }
+
+                final Path schemaFilePath = outputDirectory.toPath().resolve(jsonSchemaFilename);
                 try {
-                    processDescription(pkgDir, description, utility, generatedDate);
+                    Files.write(schemaFilePath, JsonUtils.getJsonSchemaString(schemaObjectMapper, allSchemas, jsonSchemaId).getBytes("UTF-8"));
                 } catch (IOException e) {
-                    throw new MojoExecutionException("Unable to generate source files for: " + description.getName(), e);
+                    throw new MojoExecutionException("Unable to generate JSON Schema source file: " + schemaFilePath, e);
                 }
+
+                getLog().info(String.format("Successfully generated %s JSON Types in file %s", descriptions.size() * 2, schemaFilePath));
             }
-            getLog().info(String.format("Successfully generated %s Java Classes", descriptions.size() * 2));
 
         } finally {
             // remember to stop the client

http://git-wip-us.apache.org/repos/asf/camel/blob/8ef01f9e/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
index 8856b7e..2f75608 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
@@ -25,10 +25,15 @@ import java.util.Properties;
 
 import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
 import org.apache.camel.component.salesforce.SalesforceLoginConfig;
+import org.apache.camel.component.salesforce.api.utils.JsonUtils;
 import org.apache.maven.plugin.logging.SystemStreamLog;
 import org.junit.Assert;
 import org.junit.Test;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
+
 public class CamelSalesforceMojoIntegrationTest {
 
     private static final String TEST_LOGIN_PROPERTIES = "../test-salesforce-login.properties";
@@ -47,6 +52,26 @@ public class CamelSalesforceMojoIntegrationTest {
         // TODO check that the generated code compiles
     }
 
+    @Test
+    public void testExecuteJsonSchema() throws Exception {
+        CamelSalesforceMojo mojo = createMojo();
+        mojo.jsonSchema = true;
+        mojo.jsonSchemaFilename = "test-schema.json";
+        mojo.jsonSchemaId = JsonUtils.DEFAULT_ID_PREFIX;
+
+        // generate code
+        mojo.execute();
+
+        // validate generated schema
+        File schemaFile = mojo.outputDirectory.toPath().resolve("test-schema.json").toFile();
+        Assert.assertTrue("Output file was not created",
+                schemaFile.exists());
+        ObjectMapper objectMapper = JsonUtils.createObjectMapper();
+        JsonSchema jsonSchema = objectMapper.readValue(schemaFile, JsonSchema.class);
+        Assert.assertTrue("Expected root JSON schema with oneOf element",
+                jsonSchema.isObjectSchema() && !((ObjectSchema)jsonSchema).getOneOf().isEmpty());
+    }
+
     protected CamelSalesforceMojo createMojo() throws IOException {
         CamelSalesforceMojo mojo = new CamelSalesforceMojo();
 
@@ -82,10 +107,10 @@ public class CamelSalesforceMojoIntegrationTest {
         try {
             stream = new FileInputStream(TEST_LOGIN_PROPERTIES);
             properties.load(stream);
-            mojo.clientId = properties.getProperty("clientId");
-            mojo.clientSecret = properties.getProperty("clientSecret");
-            mojo.userName = properties.getProperty("userName");
-            mojo.password = properties.getProperty("password");
+            mojo.clientId = properties.getProperty("salesforce.client.id");
+            mojo.clientSecret = properties.getProperty("salesforce.client.secret");
+            mojo.userName = properties.getProperty("salesforce.username");
+            mojo.password = properties.getProperty("salesforce.password");
         } catch (FileNotFoundException e) {
             throw new FileNotFoundException("Create a properties file named "
                     + TEST_LOGIN_PROPERTIES + " with clientId, clientSecret, userName, password"


[2/8] camel git commit: CAMEL-10744: Added utility APIs in Salesforce JsonUtils to generate JSON schema from SObjectDescription, added required modules to Karaf camel-salesforce feature

Posted by dh...@apache.org.
CAMEL-10744: Added utility APIs in Salesforce JsonUtils to generate JSON schema from SObjectDescription, added required modules to Karaf camel-salesforce feature


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

Branch: refs/heads/camel-2.19.x
Commit: e0fe1df75a383ebea78a40125d0d55654ce4f31e
Parents: 6f9ed73
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Thu Aug 3 00:12:19 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:13:01 2017 -0700

----------------------------------------------------------------------
 .../camel-salesforce-component/pom.xml          |  15 ++
 .../salesforce/api/utils/JsonUtils.java         | 225 +++++++++++++++++++
 .../salesforce/api/utils/JsonUtilsTest.java     |  56 +++++
 parent/pom.xml                                  |   6 +
 .../features/src/main/resources/features.xml    |   2 +
 5 files changed, 304 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e0fe1df7/components/camel-salesforce/camel-salesforce-component/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/pom.xml b/components/camel-salesforce/camel-salesforce-component/pom.xml
index b3b0214..f258da5 100644
--- a/components/camel-salesforce/camel-salesforce-component/pom.xml
+++ b/components/camel-salesforce/camel-salesforce-component/pom.xml
@@ -88,6 +88,15 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <!-- json schema -->
+    <dependency>
+      <groupId>com.fasterxml.jackson.jaxrs</groupId>
+      <artifactId>jackson-jaxrs-json-provider</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.module</groupId>
+      <artifactId>jackson-module-jsonSchema</artifactId>
+    </dependency>
     <dependency>
       <groupId>com.thoughtworks.xstream</groupId>
       <artifactId>xstream</artifactId>
@@ -169,6 +178,12 @@
       <version>2.2</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>com.squareup.okhttp3</groupId>
+      <artifactId>mockwebserver</artifactId>
+      <version>${squareup-okhttp3-version}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>

http://git-wip-us.apache.org/repos/asf/camel/blob/e0fe1df7/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
index 2c3a04f..959e00b 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/JsonUtils.java
@@ -16,13 +16,50 @@
  */
 package org.apache.camel.component.salesforce.api.utils;
 
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static java.util.stream.Collectors.joining;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
+import com.fasterxml.jackson.module.jsonSchema.types.ArraySchema;
+import com.fasterxml.jackson.module.jsonSchema.types.BooleanSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.IntegerSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.NullSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.NumberSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.SimpleTypeSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.StringSchema;
+
+import org.apache.camel.component.salesforce.api.dto.AbstractDTOBase;
+import org.apache.camel.component.salesforce.api.dto.AbstractQueryRecordsBase;
+import org.apache.camel.component.salesforce.api.dto.Address;
+import org.apache.camel.component.salesforce.api.dto.GeoLocation;
+import org.apache.camel.component.salesforce.api.dto.PickListValue;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+import org.apache.camel.impl.DefaultPackageScanClassResolver;
 
 /**
  * Factory class for creating {@linkplain com.fasterxml.jackson.databind.ObjectMapper}
  */
 public abstract class JsonUtils {
+
+    public static final String SCHEMA4 = "http://json-schema.org/draft-04/schema#";
+    public static final String DEFAULT_ID_PREFIX = "urn:jsonschema:org:apache:camel:component:salesforce:dto";
+
+    private static final String API_DTO_ID = "org:urn:jsonschema:org:apache:camel:component:salesforce:api:dto";
+
     public static ObjectMapper createObjectMapper() {
         // enable date time support including Java 1.8 ZonedDateTime
         ObjectMapper objectMapper = new ObjectMapper();
@@ -31,4 +68,192 @@ public abstract class JsonUtils {
         return objectMapper;
     }
 
+    public static String getBasicApiJsonSchema() throws JsonProcessingException {
+        ObjectMapper mapper = createSchemaObjectMapper();
+        JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);
+
+        DefaultPackageScanClassResolver packageScanClassResolver = new DefaultPackageScanClassResolver();
+
+        Set<Class<?>> schemaClasses = new HashSet<>();
+
+        // get non-abstract extensions of AbstractDTOBase
+        schemaClasses.addAll(packageScanClassResolver.findByFilter(
+            type -> !Modifier.isAbstract(type.getModifiers())
+                    && AbstractDTOBase.class.isAssignableFrom(type),
+                "org.apache.camel.component.salesforce.api.dto"));
+
+        // get non-abstract extensions of AbstractDTOBase
+        schemaClasses.addAll(packageScanClassResolver.findByFilter(
+            type -> !Modifier.isAbstract(type.getModifiers())
+                    && AbstractDTOBase.class.isAssignableFrom(type),
+                "org.apache.camel.component.salesforce.api.dto"));
+
+        Set<Object> allSchemas = new HashSet<>();
+        for (Class<?> aClass : schemaClasses) {
+            JsonSchema jsonSchema = schemaGen.generateSchema(aClass);
+            allSchemas.add(jsonSchema);
+        }
+
+        return getJsonSchemaString(mapper, allSchemas, API_DTO_ID);
+    }
+
+    public static String getJsonSchemaString(ObjectMapper mapper, Set<Object> allSchemas, String id) throws JsonProcessingException {
+        ObjectSchema rootSchema = new ObjectSchema();
+        rootSchema.set$schema(SCHEMA4);
+        rootSchema.setId(id);
+        rootSchema.setOneOf(allSchemas);
+
+        return mapper.writeValueAsString(rootSchema);
+    }
+
+    public static String getSObjectJsonSchema(SObjectDescription description) throws JsonProcessingException {
+        return getSObjectJsonSchema(description, true);
+    }
+
+    public static String getSObjectJsonSchema(SObjectDescription description, boolean addQuerySchema) throws JsonProcessingException {
+        ObjectMapper schemaObjectMapper = createSchemaObjectMapper();
+        return getJsonSchemaString(schemaObjectMapper, getSObjectJsonSchema(schemaObjectMapper, description, DEFAULT_ID_PREFIX, addQuerySchema), DEFAULT_ID_PREFIX);
+    }
+
+    public static Set<Object> getSObjectJsonSchema(ObjectMapper objectMapper, SObjectDescription description, String idPrefix, boolean addQuerySchema) throws JsonProcessingException {
+        Set<Object> allSchemas = new HashSet<>();
+
+        // generate SObject schema from description
+        ObjectSchema sobjectSchema = new ObjectSchema();
+        sobjectSchema.setId(idPrefix + ":" + description.getName());
+        sobjectSchema.setTitle(description.getLabel());
+
+        SimpleTypeSchema addressSchema = null;
+        SimpleTypeSchema geoLocationSchema = null;
+
+        for (SObjectField field : description.getFields()) {
+
+            SimpleTypeSchema fieldSchema = new NullSchema();
+            String soapType = field.getSoapType();
+
+            switch (soapType.substring(soapType.indexOf(':') + 1)) {
+            case "ID": // mapping for tns:ID SOAP type
+            case "string":
+            case "base64Binary":
+                // Salesforce maps any types like string, picklist, reference, etc. to string
+            case "anyType":
+                fieldSchema = new StringSchema();
+                break;
+
+            case "integer":
+            case "int":
+            case "long":
+            case "short":
+            case "byte":
+            case "unsignedInt":
+            case "unsignedShort":
+            case "unsignedByte":
+                fieldSchema = new IntegerSchema();
+                break;
+
+            case "decimal":
+            case "float":
+            case "double":
+                fieldSchema = new NumberSchema();
+                break;
+
+            case "boolean":
+                fieldSchema = new BooleanSchema();
+                break;
+
+            case "dateTime":
+            case "time":
+            case "date":
+            case "g":
+                fieldSchema = new StringSchema();
+                ((StringSchema) fieldSchema).setFormat(JsonValueFormat.DATE_TIME);
+                break;
+
+            case "address":
+                if (addressSchema == null) {
+                    addressSchema = getSchemaFromClass(objectMapper, Address.class);
+                }
+                fieldSchema = addressSchema;
+                break;
+
+            case "location":
+                if (geoLocationSchema == null) {
+                    geoLocationSchema = getSchemaFromClass(objectMapper, GeoLocation.class);
+                }
+                fieldSchema = geoLocationSchema;
+                break;
+
+            default:
+                throw new IllegalArgumentException("Unsupported type " + soapType);
+            }
+
+            List<PickListValue> picklistValues = field.getPicklistValues();
+            switch (field.getType()) {
+            case "picklist":
+                fieldSchema.asStringSchema().setEnums(
+                        picklistValues == null ? Collections.EMPTY_SET : picklistValues.stream()
+                                .map(PickListValue::getValue)
+                                .distinct()
+                                .collect(Collectors.toSet()));
+                break;
+
+            case "multipicklist":
+                // TODO regex needs more work to not allow values not separated by ','
+                fieldSchema.asStringSchema().setPattern(picklistValues == null ? "" : picklistValues.stream()
+                        .map(val -> "(,?(" + val.getValue() + "))")
+                        .distinct()
+                        .collect(joining("|", "(", ")")));
+                break;
+
+            default:
+                // nothing to fix
+            }
+
+            // additional field properties
+            fieldSchema.setTitle(field.getLabel());
+            fieldSchema.setDefault(field.getDefaultValue());
+            if (field.isUpdateable() != null) {
+                fieldSchema.setReadonly(!field.isUpdateable());
+            }
+
+            // add property to sobject schema
+            if (field.isNillable()) {
+                sobjectSchema.putOptionalProperty(field.getName(), fieldSchema);
+            } else {
+                sobjectSchema.putProperty(field.getName(), fieldSchema);
+            }
+        }
+
+        // add sobject schema to root schema
+        allSchemas.add(sobjectSchema);
+
+        if (addQuerySchema) {
+            // add a simple query schema for this sobject for lookups, etc.
+            ObjectSchema queryRecords = getSchemaFromClass(objectMapper, AbstractQueryRecordsBase.class);
+            queryRecords.setId(idPrefix + ":QueryRecords" + description.getName());
+
+            ObjectSchema refSchema = new ObjectSchema();
+            refSchema.set$ref(sobjectSchema.getId());
+
+            ArraySchema recordsProperty = new ArraySchema();
+            recordsProperty.setItems(new ArraySchema.SingleItems(refSchema));
+            queryRecords.putProperty("records", recordsProperty);
+
+            allSchemas.add(queryRecords);
+        }
+
+        return allSchemas;
+    }
+
+    public static ObjectMapper createSchemaObjectMapper() {
+        ObjectMapper objectMapper = createObjectMapper();
+        objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
+        objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
+        return objectMapper;
+    }
+
+    private static ObjectSchema getSchemaFromClass(ObjectMapper objectMapper, Class<?> type) throws JsonMappingException {
+        return new JsonSchemaGenerator(objectMapper).generateSchema(type).asObjectSchema();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/e0fe1df7/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java
new file mode 100644
index 0000000..cd59a9e
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java
@@ -0,0 +1,56 @@
+package org.apache.camel.component.salesforce.api.utils;
+
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.dto.generated.Account;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit test for {@link JsonUtils}
+ */
+public class JsonUtilsTest {
+
+    public static final Logger LOG = LoggerFactory.getLogger(JsonUtilsTest.class);
+
+    @Test
+    public void getBasicApiJsonSchema() throws Exception {
+
+        // create basic api dto schema
+        LOG.info("Basic Api Schema...");
+        String basicApiJsonSchema = JsonUtils.getBasicApiJsonSchema();
+        LOG.info(basicApiJsonSchema);
+
+        // parse schema to validate
+        ObjectMapper objectMapper = JsonUtils.createObjectMapper();
+        JsonSchema jsonSchema = objectMapper.readValue(basicApiJsonSchema, JsonSchema.class);
+        assertTrue(jsonSchema.isObjectSchema());
+        assertFalse(((ObjectSchema)jsonSchema).getOneOf().isEmpty());
+    }
+
+    @Test
+    public void getSObjectJsonSchema() throws Exception {
+
+        // create sobject dto schema
+        SObjectDescription description = new Account().description();
+
+        LOG.info("SObject Schema...");
+        String sObjectJsonSchema = JsonUtils.getSObjectJsonSchema(description);
+        LOG.info(sObjectJsonSchema);
+
+        // parse schema to validate
+        ObjectMapper objectMapper = JsonUtils.createObjectMapper();
+        JsonSchema jsonSchema = objectMapper.readValue(sObjectJsonSchema, JsonSchema.class);
+        assertTrue(jsonSchema.isObjectSchema());
+        assertEquals(2, ((ObjectSchema)jsonSchema).getOneOf().size());
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/e0fe1df7/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 6714d0d..cfbc5e4 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -622,6 +622,7 @@
     <spymemcached-bundle-version>2.5_2</spymemcached-bundle-version> <!-- FIXME cmueller: not in sync! -->
     <spymemcached-version>2.12.0</spymemcached-version>
     <squareup-okhttp-version>2.7.5</squareup-okhttp-version>
+    <squareup-okhttp3-version>3.8.1</squareup-okhttp3-version>
     <squareup-okhttp-bundle-version>2.7.5_1</squareup-okhttp-bundle-version>
     <squareup-okio-version>1.11.0</squareup-okio-version>
     <squareup-okio-bundle-version>1.11.0_1</squareup-okio-bundle-version>
@@ -3457,6 +3458,11 @@
         <artifactId>jackson-module-jaxb-annotations</artifactId>
         <version>${jackson2-version}</version>
       </dependency>
+      <dependency>
+        <groupId>com.fasterxml.jackson.module</groupId>
+        <artifactId>jackson-module-jsonSchema</artifactId>
+        <version>${jackson2-version}</version>
+      </dependency>
 
       <dependency>
         <groupId>io.netty</groupId>

http://git-wip-us.apache.org/repos/asf/camel/blob/e0fe1df7/platforms/karaf/features/src/main/resources/features.xml
----------------------------------------------------------------------
diff --git a/platforms/karaf/features/src/main/resources/features.xml b/platforms/karaf/features/src/main/resources/features.xml
index a6e2213..1f23fda 100644
--- a/platforms/karaf/features/src/main/resources/features.xml
+++ b/platforms/karaf/features/src/main/resources/features.xml
@@ -1574,6 +1574,8 @@
     <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-core/${jackson2-version}</bundle>
     <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson2-version}</bundle>
     <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-databind/${jackson2-version}</bundle>
+    <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-jaxrs-json-provider/${jackson2-version}</bundle>
+    <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-module-jsonSchema/${jackson2-version}</bundle>
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xstream/${xstream-bundle-version}</bundle>
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xpp3/${xpp3-bundle-version}</bundle>
     <bundle dependency='true'>mvn:javax.servlet/javax.servlet-api/${javax.servlet-api-version}</bundle>


[7/8] camel git commit: CAMEL-10743: Added support for rawPayload parameter in Salesforce Streaming API

Posted by dh...@apache.org.
CAMEL-10743: Added support for rawPayload parameter in Salesforce Streaming API


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

Branch: refs/heads/camel-2.19.x
Commit: bb2adef735af8b0e301651a391eff8fde246f3ba
Parents: da79c3b
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Thu Aug 3 00:38:52 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:14:26 2017 -0700

----------------------------------------------------------------------
 .../component/salesforce/SalesforceConsumer.java   |  5 ++++-
 .../salesforce/StreamingApiIntegrationTest.java    | 17 +++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/bb2adef7/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
index df29dd8..0484aee 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceConsumer.java
@@ -174,7 +174,10 @@ public class SalesforceConsumer extends DefaultConsumer {
             final String sObjectString = objectMapper.writeValueAsString(sObject);
             log.debug("Received SObject: {}", sObjectString);
 
-            if (sObjectClass == null) {
+            if (endpoint.getConfiguration().getRawPayload()) {
+                // return sobject string as exchange body
+                in.setBody(sObjectString);
+            } else if (sObjectClass == null) {
                 // return sobject map as exchange body
                 in.setBody(sObject);
             } else {

http://git-wip-us.apache.org/repos/asf/camel/blob/bb2adef7/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/StreamingApiIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/StreamingApiIntegrationTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/StreamingApiIntegrationTest.java
index e0ed9ff..33139df 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/StreamingApiIntegrationTest.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/StreamingApiIntegrationTest.java
@@ -36,6 +36,12 @@ public class StreamingApiIntegrationTest extends AbstractSalesforceTestBase {
         mock.expectedHeaderReceived("CamelSalesforceTopicName", "CamelTestTopic");
         mock.expectedHeaderReceived("CamelSalesforceChannel", "/topic/CamelTestTopic");
 
+        MockEndpoint rawPayloadMock = getMockEndpoint("mock:RawPayloadCamelTestTopic");
+        rawPayloadMock.expectedMessageCount(1);
+        // assert expected static headers
+        rawPayloadMock.expectedHeaderReceived("CamelSalesforceTopicName", "CamelTestTopic");
+        rawPayloadMock.expectedHeaderReceived("CamelSalesforceChannel", "/topic/CamelTestTopic");
+
         Merchandise__c merchandise = new Merchandise__c();
         merchandise.setName("TestNotification");
         merchandise.setDescription__c("Merchandise for testing Streaming API updated on " + ZonedDateTime.now().toString());
@@ -50,6 +56,7 @@ public class StreamingApiIntegrationTest extends AbstractSalesforceTestBase {
             mock.assertIsSatisfied();
             final Message in = mock.getExchanges().get(0).getIn();
             merchandise = in.getMandatoryBody(Merchandise__c.class);
+
             assertNotNull("Missing event body", merchandise);
             log.info("Merchandise notification: {}", merchandise.toString());
             assertNotNull("Missing field Id", merchandise.getId());
@@ -60,6 +67,11 @@ public class StreamingApiIntegrationTest extends AbstractSalesforceTestBase {
             assertNotNull("Missing header CamelSalesforceEventType", in.getHeader("CamelSalesforceEventType"));
             assertNotNull("Missing header CamelSalesforceCreatedDate", in.getHeader("CamelSalesforceCreatedDate"));
 
+            // validate raw payload message
+            rawPayloadMock.assertIsSatisfied();
+            final Message inRaw = rawPayloadMock.getExchanges().get(0).getIn();
+            assertTrue("Expected String message body for Raw Payload", inRaw.getBody() instanceof String);
+
         } finally {
             // remove the test record
             assertNull(template().requestBody("direct:deleteSObjectWithId", merchandise));
@@ -89,6 +101,11 @@ public class StreamingApiIntegrationTest extends AbstractSalesforceTestBase {
                     + "updateTopic=true&sObjectQuery=SELECT Id, Name FROM Merchandise__c").
                     to("mock:CamelTestTopic");
 
+                from("salesforce:CamelTestTopic?rawPayload=true&notifyForFields=ALL&"
+                    + "notifyForOperationCreate=true&notifyForOperationDelete=true&notifyForOperationUpdate=true&"
+                    + "updateTopic=true&sObjectQuery=SELECT Id, Name FROM Merchandise__c").
+                    to("mock:RawPayloadCamelTestTopic");
+
                 // route for creating test record
                 from("direct:upsertSObject").
                     to("salesforce:upsertSObject?SObjectIdName=Name");


[4/8] camel git commit: CAMEL-10743: Add rawPayload parameter to support XML or JSON String input and output with Salesforce endpoints, avoiding generating DTOs

Posted by dh...@apache.org.
CAMEL-10743: Add rawPayload parameter to support XML or JSON String input and output with Salesforce endpoints, avoiding generating DTOs


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

Branch: refs/heads/camel-2.19.x
Commit: b356aa706a131ec17c24f4a076907f10f3010d5f
Parents: 8ef01f9
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Thu Aug 3 00:34:32 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:13:45 2017 -0700

----------------------------------------------------------------------
 .../src/main/docs/salesforce-component.adoc         |  3 ++-
 .../component/salesforce/SalesforceComponent.java   |  2 +-
 .../salesforce/SalesforceEndpointConfig.java        | 16 ++++++++++++++++
 .../processor/AbstractSalesforceProcessor.java      |  2 ++
 4 files changed, 21 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/b356aa70/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
----------------------------------------------------------------------
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 c950e34..ff4bf4f 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
@@ -532,7 +532,7 @@ with the following path and query parameters:
 | **topicName** | The name of the topic to use |  | String
 |=======================================================================
 
-#### Query Parameters (42 parameters):
+#### Query Parameters (43 parameters):
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |=======================================================================
@@ -561,6 +561,7 @@ with the following path and query parameters:
 | **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
+| **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
 | **resultId** (common) | Bulk API Result ID |  | String

http://git-wip-us.apache.org/repos/asf/camel/blob/b356aa70/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
----------------------------------------------------------------------
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 3147f53..c793aa2 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
@@ -373,7 +373,7 @@ public class SalesforceComponent extends DefaultComponent implements VerifiableC
             LOG.info("Found {} generated classes in packages: {}", classMap.size(), Arrays.asList(packages));
         } else {
             // use an empty map to avoid NPEs later
-            LOG.warn("Missing property packages, getSObject* operations will NOT work");
+            LOG.warn("Missing property packages, getSObject* operations will NOT work without property rawPayload=true");
             classMap = new HashMap<String, Class<?>>(0);
         }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/b356aa70/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
index 5363c0c..a23e83d 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
@@ -49,6 +49,8 @@ public class SalesforceEndpointConfig implements Cloneable {
 
     // parameters for Rest API
     public static final String FORMAT = "format";
+    public static final String RAW_PAYLOAD = "rawPayload";
+
     public static final String SOBJECT_NAME = "sObjectName";
     public static final String SOBJECT_ID = "sObjectId";
     public static final String SOBJECT_FIELDS = "sObjectFields";
@@ -100,6 +102,8 @@ public class SalesforceEndpointConfig implements Cloneable {
     // Rest API properties
     @UriParam
     private PayloadFormat format = PayloadFormat.JSON;
+    @UriParam
+    private boolean rawPayload;
     @UriParam(displayName = "SObject Name")
     private String sObjectName;
     @UriParam(displayName = "SObject Id")
@@ -213,6 +217,18 @@ public class SalesforceEndpointConfig implements Cloneable {
         this.format = format;
     }
 
+    public boolean getRawPayload() {
+        return rawPayload;
+    }
+
+    /**
+     * Use raw payload {@link String} for request and response (either JSON or XML depending on {@code format}),
+     * instead of DTOs, false by default
+     */
+    public void setRawPayload(boolean rawPayload) {
+        this.rawPayload = rawPayload;
+    }
+
     public String getApiVersion() {
         return apiVersion;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/b356aa70/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractSalesforceProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractSalesforceProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractSalesforceProcessor.java
index 3d25e90..2b5119e 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractSalesforceProcessor.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractSalesforceProcessor.java
@@ -46,6 +46,7 @@ public abstract class AbstractSalesforceProcessor implements SalesforceProcessor
     protected final OperationName operationName;
     protected final SalesforceSession session;
     protected final SalesforceHttpClient httpClient;
+    protected final boolean rawPayload;
 
     public AbstractSalesforceProcessor(SalesforceEndpoint endpoint) {
         this.endpoint = endpoint;
@@ -55,6 +56,7 @@ public abstract class AbstractSalesforceProcessor implements SalesforceProcessor
         final SalesforceComponent component = endpoint.getComponent();
         this.session = component.getSession();
         this.httpClient = endpoint.getConfiguration().getHttpClient();
+        this.rawPayload = endpoint.getConfiguration().getRawPayload();
     }
 
     @Override


[6/8] camel git commit: CAMEL-10743: Added support for rawPayload parameter in Salesforce REST APIs

Posted by dh...@apache.org.
CAMEL-10743: Added support for rawPayload parameter in Salesforce REST APIs


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

Branch: refs/heads/camel-2.19.x
Commit: da79c3b5cf1b8b26f06d5c490d8c69d90c45081c
Parents: 6787c74
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Thu Aug 3 00:38:21 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:14:12 2017 -0700

----------------------------------------------------------------------
 .../processor/AbstractRestProcessor.java        |   6 +
 .../internal/processor/JsonRestProcessor.java   |   6 +-
 .../internal/processor/XmlRestProcessor.java    |   3 +-
 .../component/salesforce/RawPayloadTest.java    | 240 +++++++++++++++++++
 .../salesforce/RestApiIntegrationTest.java      |   1 +
 5 files changed, 252 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/da79c3b5/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
index 758cc57..74be887 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AbstractRestProcessor.java
@@ -810,6 +810,12 @@ public abstract class AbstractRestProcessor extends AbstractSalesforceProcessor
     protected abstract InputStream getRequestStream(Object object) throws SalesforceException;
 
     private void setResponseClass(Exchange exchange, String sObjectName) throws SalesforceException {
+
+        // nothing to do if using rawPayload
+        if (rawPayload) {
+            return;
+        }
+
         Class<?> sObjectClass;
 
         if (sObjectName != null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/da79c3b5/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java
index d52601f..a8086f7 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java
@@ -184,13 +184,13 @@ public class JsonRestProcessor extends AbstractRestProcessor {
                 }
             } else if (responseEntity != null) {
                 // do we need to un-marshal a response
-                Object response = null;
+                final Object response;
                 Class<?> responseClass = exchange.getProperty(RESPONSE_CLASS, Class.class);
-                if (responseClass != null) {
+                if (!rawPayload && responseClass != null) {
                     response = objectMapper.readValue(responseEntity, responseClass);
                 } else {
                     TypeReference<?> responseType = exchange.getProperty(RESPONSE_TYPE, TypeReference.class);
-                    if (responseType != null) {
+                    if (!rawPayload && responseType != null) {
                         response = objectMapper.readValue(responseEntity, responseType);
                     } else {
                         // return the response as a stream, for getBlobField

http://git-wip-us.apache.org/repos/asf/camel/blob/da79c3b5/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/XmlRestProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/XmlRestProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/XmlRestProcessor.java
index 6650ff0..3bcba03 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/XmlRestProcessor.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/XmlRestProcessor.java
@@ -33,6 +33,7 @@ import com.thoughtworks.xstream.io.xml.CompactWriter;
 import com.thoughtworks.xstream.io.xml.XppDriver;
 import com.thoughtworks.xstream.mapper.CachingMapper;
 import com.thoughtworks.xstream.mapper.CannotResolveClassException;
+
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
@@ -236,7 +237,7 @@ public class XmlRestProcessor extends AbstractRestProcessor {
                 // do we need to un-marshal a response
                 final Class<?> responseClass = exchange.getProperty(RESPONSE_CLASS, Class.class);
                 Object response;
-                if (responseClass != null) {
+                if (!rawPayload && responseClass != null) {
                     // its ok to call this multiple times, as xstream ignores duplicate calls
                     localXStream.processAnnotations(responseClass);
                     final String responseAlias = exchange.getProperty(RESPONSE_ALIAS, String.class);

http://git-wip-us.apache.org/repos/asf/camel/blob/da79c3b5/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
new file mode 100644
index 0000000..7d6941c
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
@@ -0,0 +1,240 @@
+/**
+ * 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.component.salesforce;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.eclipse.jetty.http.HttpHeader;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+import okhttp3.HttpUrl;
+import okhttp3.mockwebserver.Dispatcher;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+
+@Category(Standalone.class)
+@RunWith(Parameterized.class)
+public class RawPayloadTest extends AbstractSalesforceTestBase {
+
+    private static final String OAUTH2_TOKEN_PATH = "/services/oauth2/token";
+    private static final String XML_RESPONSE = "<response/>";
+    private static final String JSON_RESPONSE = "{ \"response\" : \"mock\" }";
+
+    private static HttpUrl loginUrl;
+    private static MockWebServer server;
+
+    @Parameter
+    public static String format;
+
+    @Parameter(1)
+    public static String endpointUri;
+
+    private static String lastFormat;
+    private static String expectedResponse;
+    private static String requestBody;
+    private static Map<String, Object> headers;
+
+    @Override
+    protected void createComponent() throws Exception {
+
+        // create the component
+        SalesforceComponent component = new SalesforceComponent();
+        final SalesforceEndpointConfig config = new SalesforceEndpointConfig();
+        config.setApiVersion(System.getProperty("apiVersion", salesforceApiVersionToUse()));
+        component.setConfig(config);
+
+        SalesforceLoginConfig dummyLoginConfig = new SalesforceLoginConfig();
+        dummyLoginConfig.setClientId("ignored");
+        dummyLoginConfig.setClientSecret("ignored");
+        dummyLoginConfig.setRefreshToken("ignored");
+        dummyLoginConfig.setLoginUrl(loginUrl.toString());
+        component.setLoginConfig(dummyLoginConfig);
+
+        // add it to context
+        context().addComponent("salesforce", component);
+    }
+
+    @AfterClass
+    public static void shutDownServer() throws IOException {
+        // shutdown mock server
+        if (server != null) {
+            server.shutdown();
+        }
+    }
+
+    @BeforeClass
+    public static void startServer() throws IOException {
+
+        // create mock server
+        server = new MockWebServer();
+
+        server.setDispatcher(new Dispatcher() {
+            @Override
+            public MockResponse dispatch(RecordedRequest recordedRequest) throws InterruptedException {
+                if (recordedRequest.getPath().equals(OAUTH2_TOKEN_PATH)) {
+                    return new MockResponse()
+                            .setResponseCode(200)
+                            .setBody("{ \"access_token\": \"mock_token\", \"instance_url\": \"" + loginUrl + "\"}");
+                } else {
+                    return new MockResponse()
+                            .setResponseCode(200)
+                            .setHeader(HttpHeader.CONTENT_TYPE.toString(), recordedRequest.getHeader(HttpHeader.CONTENT_TYPE.toString()))
+                            .setBody("XML".equals(format) ? XML_RESPONSE : JSON_RESPONSE);
+                }
+            }
+        });
+
+        // start the server
+        server.start();
+        loginUrl = server.url("");
+    }
+
+    @Before
+    public void setupRequestResponse() {
+        if (!format.equals(lastFormat)) {
+            // expected response and test request
+            final boolean isXml = "XML".equals(format);
+            expectedResponse = isXml ? XML_RESPONSE : JSON_RESPONSE;
+            if (isXml) {
+                requestBody = "<request/>";
+            } else {
+                requestBody = "{ \"request\" : \"mock\" }";
+            }
+            headers = new HashMap<>();
+            headers.put("sObjectId", "mockId");
+            headers.put("sObjectIdValue", "mockIdValue");
+            headers.put("id", "mockId");
+            headers.put(SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX + "id", "mockId");
+
+            lastFormat = format;
+        }
+    }
+
+    @Test
+    public void testRestApi() throws Exception {
+        final String responseBody = template().requestBodyAndHeaders(endpointUri, requestBody, headers, String.class);
+        assertNotNull("Null response for endpoint " + endpointUri, responseBody);
+        assertEquals("Unexpected response for endpoint " + endpointUri, expectedResponse, responseBody);
+    }
+
+    @Override
+    protected RouteBuilder doCreateRouteBuilder() throws Exception {
+
+        // create test route
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+
+                // testGetVersion
+                from("direct:getVersions").to("salesforce:getVersions?rawPayload=true&format=" + format);
+
+                // testGetResources
+                from("direct:getResources").to("salesforce:getResources?rawPayload=true&format=" + format);
+
+                // testGetGlobalObjects
+                from("direct:getGlobalObjects").to("salesforce:getGlobalObjects?rawPayload=true&format=" + format);
+
+                // testGetBasicInfo
+                from("direct:getBasicInfo").to("salesforce:getBasicInfo?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testGetDescription
+                from("direct:getDescription")
+                    .to("salesforce:getDescription?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testGetSObject
+                from("direct:getSObject")
+                    .to("salesforce:getSObject?sObjectName=Merchandise__c&sObjectFields=Description__c,Price__c&rawPayload=true&format="
+                        + format);
+
+                // testCreateSObject
+                from("direct:createSObject").to("salesforce:createSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testUpdateSObject
+                from("direct:updateSObject").to("salesforce:updateSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testDeleteSObject
+                from("direct:deleteSObject").to("salesforce:deleteSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testGetSObjectWithId
+                from("direct:getSObjectWithId")
+                    .to("salesforce:getSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format=" + format);
+
+                // testUpsertSObject
+                from("direct:upsertSObject")
+                    .to("salesforce:upsertSObject?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format=" + format);
+
+                // testDeleteSObjectWithId
+                from("direct:deleteSObjectWithId")
+                    .to("salesforce:deleteSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format=" + format);
+
+                // testGetBlobField
+                from("direct:getBlobField")
+                    .to("salesforce:getBlobField?sObjectName=Document&sObjectBlobFieldName=Body&rawPayload=true&format=" + format);
+
+                // testQuery
+                from("direct:query").to("salesforce:query?sObjectQuery=SELECT name from Line_Item__c&rawPayload=true&format=" + format);
+
+                // testQueryAll
+                from("direct:queryAll")
+                    .to("salesforce:queryAll?sObjectQuery=SELECT name from Line_Item__c&rawPayload=true&format=" + format);
+
+                // testSearch
+                from("direct:search").to("salesforce:search?sObjectSearch=FIND {Wee}&rawPayload=true&format=" + format);
+
+                // testApexCall
+                from("direct:apexCallGet")
+                    .to("salesforce:apexCall?apexMethod=GET&apexUrl=Merchandise/{id}&sObjectName=Merchandise__c&rawPayload=true&format="
+                        + format);
+
+                from("direct:apexCallGetWithId").to("salesforce:apexCall/Merchandise/?apexMethod=GET&id=dummyId&rawPayload=true&format="
+                    + format);
+
+                from("direct:apexCallPatch").to("salesforce:apexCall/Merchandise/?rawPayload=true&format=" + format
+                    + "&apexMethod=PATCH");
+            }
+        };
+    }
+
+    @Parameters(name = "format = {0}, endpoint = {1}")
+    public static List<String[]> parameters() {
+        final String[] endpoints = {"direct:getVersions", "direct:getResources", "direct:getGlobalObjects",
+                "direct:getBasicInfo", "direct:getDescription", "direct:getSObject", "direct:createSObject", 
+                "direct:updateSObject", "direct:deleteSObject", "direct:getSObjectWithId", "direct:upsertSObject", 
+                "direct:deleteSObjectWithId", "direct:getBlobField", "direct:query", "direct:queryAll", 
+                "direct:search", "direct:apexCallGet", "direct:apexCallGetWithId", "direct:apexCallPatch"};
+
+        final String[] formats = {"XML", "JSON"};
+
+        return Stream.of(formats).flatMap(f -> Stream.of(endpoints).map(e -> new String[]{f, e}))
+                .collect(Collectors.toList());
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/da79c3b5/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
index ccd09d9..13485ce 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
@@ -134,6 +134,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         merchandise.setName("Test Merchandise");
         merchandise.setPrice__c(10.0);
         merchandise.setTotal_Inventory__c(100.0);
+        merchandise.setDescription__c("Test Merchandise!");
         final CreateSObjectResult result = template().requestBody("salesforce:createSObject", merchandise,
             CreateSObjectResult.class);
 


[5/8] camel git commit: CAMEL-10743: Added rawPayload parameter in Salesforce Spring Boot starter

Posted by dh...@apache.org.
CAMEL-10743: Added rawPayload parameter in Salesforce Spring Boot starter


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

Branch: refs/heads/camel-2.19.x
Commit: 6787c7489a0eb676ff1260cb00cc73f3be8ddd37
Parents: b356aa7
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Thu Aug 3 00:35:41 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:14:01 2017 -0700

----------------------------------------------------------------------
 .../springboot/SalesforceComponentConfiguration.java  | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6787c748/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
index 3cde2be..40dcbe7 100644
--- a/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
+++ b/platforms/spring-boot/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
@@ -427,6 +427,12 @@ public class SalesforceComponentConfiguration {
          */
         private PayloadFormat format;
         /**
+         * Use raw payload {@link String} for request and response (either JSON
+         * or XML depending on {@code format} ), instead of DTOs, false by
+         * default
+         */
+        private Boolean rawPayload = false;
+        /**
          * Salesforce API version, defaults to
          * SalesforceEndpointConfig.DEFAULT_VERSION
          */
@@ -654,6 +660,14 @@ public class SalesforceComponentConfiguration {
             this.format = format;
         }
 
+        public Boolean getRawPayload() {
+            return rawPayload;
+        }
+
+        public void setRawPayload(Boolean rawPayload) {
+            this.rawPayload = rawPayload;
+        }
+
         public String getApiVersion() {
             return apiVersion;
         }


[8/8] camel git commit: CAMEL-10743: Fixed CS errors

Posted by dh...@apache.org.
CAMEL-10743: Fixed CS errors


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

Branch: refs/heads/camel-2.19.x
Commit: 862be0eea31732ea3bfcefec465a07d429d3f27b
Parents: bb2adef
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Thu Aug 3 01:34:34 2017 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Thu Aug 3 01:34:34 2017 -0700

----------------------------------------------------------------------
 .../salesforce/internal/SalesforceSession.java  |  2 +-
 .../component/salesforce/RawPayloadTest.java    | 32 ++++++++++----------
 .../salesforce/api/utils/JsonUtilsTest.java     | 26 +++++++++++++---
 .../CamelSalesforceMojoIntegrationTest.java     |  8 ++---
 4 files changed, 42 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/862be0ee/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
index a7a9303..9ed4404 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/SalesforceSession.java
@@ -247,7 +247,7 @@ public class SalesforceSession implements Service {
                 // don't log token or instance URL for security reasons
                 LOG.info("Login successful");
                 accessToken = token.getAccessToken();
-                instanceUrl = Optional.ofNullable(config.getInstanceUrl()).orElse(token.getInstanceUrl());
+                instanceUrl = token.getInstanceUrl();
                 // strip trailing '/'
                 int lastChar = instanceUrl.length() - 1;
                 if (instanceUrl.charAt(lastChar) == '/') {

http://git-wip-us.apache.org/repos/asf/camel/blob/862be0ee/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
index 7d6941c..c7c74af 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
@@ -23,6 +23,12 @@ import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import okhttp3.HttpUrl;
+import okhttp3.mockwebserver.Dispatcher;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+
 import org.apache.camel.builder.RouteBuilder;
 import org.eclipse.jetty.http.HttpHeader;
 import org.junit.AfterClass;
@@ -35,16 +41,16 @@ import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
 
-import okhttp3.HttpUrl;
-import okhttp3.mockwebserver.Dispatcher;
-import okhttp3.mockwebserver.MockResponse;
-import okhttp3.mockwebserver.MockWebServer;
-import okhttp3.mockwebserver.RecordedRequest;
-
 @Category(Standalone.class)
 @RunWith(Parameterized.class)
 public class RawPayloadTest extends AbstractSalesforceTestBase {
 
+    @Parameter
+    public static String format;
+
+    @Parameter(1)
+    public static String endpointUri;
+
     private static final String OAUTH2_TOKEN_PATH = "/services/oauth2/token";
     private static final String XML_RESPONSE = "<response/>";
     private static final String JSON_RESPONSE = "{ \"response\" : \"mock\" }";
@@ -52,12 +58,6 @@ public class RawPayloadTest extends AbstractSalesforceTestBase {
     private static HttpUrl loginUrl;
     private static MockWebServer server;
 
-    @Parameter
-    public static String format;
-
-    @Parameter(1)
-    public static String endpointUri;
-
     private static String lastFormat;
     private static String expectedResponse;
     private static String requestBody;
@@ -227,10 +227,10 @@ public class RawPayloadTest extends AbstractSalesforceTestBase {
     @Parameters(name = "format = {0}, endpoint = {1}")
     public static List<String[]> parameters() {
         final String[] endpoints = {"direct:getVersions", "direct:getResources", "direct:getGlobalObjects",
-                "direct:getBasicInfo", "direct:getDescription", "direct:getSObject", "direct:createSObject", 
-                "direct:updateSObject", "direct:deleteSObject", "direct:getSObjectWithId", "direct:upsertSObject", 
-                "direct:deleteSObjectWithId", "direct:getBlobField", "direct:query", "direct:queryAll", 
-                "direct:search", "direct:apexCallGet", "direct:apexCallGetWithId", "direct:apexCallPatch"};
+            "direct:getBasicInfo", "direct:getDescription", "direct:getSObject", "direct:createSObject", 
+            "direct:updateSObject", "direct:deleteSObject", "direct:getSObjectWithId", "direct:upsertSObject", 
+            "direct:deleteSObjectWithId", "direct:getBlobField", "direct:query", "direct:queryAll", 
+            "direct:search", "direct:apexCallGet", "direct:apexCallGetWithId", "direct:apexCallPatch"};
 
         final String[] formats = {"XML", "JSON"};
 

http://git-wip-us.apache.org/repos/asf/camel/blob/862be0ee/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java
index cd59a9e..ccbe730 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/JsonUtilsTest.java
@@ -1,15 +1,31 @@
+/**
+ * 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.component.salesforce.api.utils;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
+
 import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
 import org.apache.camel.component.salesforce.dto.generated.Account;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
-import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -53,4 +69,4 @@ public class JsonUtilsTest {
         assertEquals(2, ((ObjectSchema)jsonSchema).getOneOf().size());
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/862be0ee/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
index 2f75608..4d47e2f 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/CamelSalesforceMojoIntegrationTest.java
@@ -23,6 +23,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
+import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
+
 import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
 import org.apache.camel.component.salesforce.SalesforceLoginConfig;
 import org.apache.camel.component.salesforce.api.utils.JsonUtils;
@@ -30,10 +34,6 @@ import org.apache.maven.plugin.logging.SystemStreamLog;
 import org.junit.Assert;
 import org.junit.Test;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
-import com.fasterxml.jackson.module.jsonSchema.types.ObjectSchema;
-
 public class CamelSalesforceMojoIntegrationTest {
 
     private static final String TEST_LOGIN_PROPERTIES = "../test-salesforce-login.properties";