You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by an...@apache.org on 2016/06/27 18:05:03 UTC

camel git commit: CAMEL-10090: Salesforce should support jodatime

Repository: camel
Updated Branches:
  refs/heads/master bff52b4ae -> 0c1264921


CAMEL-10090: Salesforce should support jodatime


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

Branch: refs/heads/master
Commit: 0c126492181bd4cfe936d01be4d8bd6f55062e3a
Parents: bff52b4
Author: Arno Noordover <an...@users.noreply.github.com>
Authored: Sun Jun 26 19:15:53 2016 +0200
Committer: Arno Noordover <an...@users.noreply.github.com>
Committed: Mon Jun 27 19:49:52 2016 +0200

----------------------------------------------------------------------
 .../camel-salesforce-component/pom.xml          |   5 +
 .../salesforce/api/JodaTimeConverter.java       |  19 ++-
 .../internal/joda/DateTimeDeserializer.java     |  64 ++++++++
 .../internal/joda/DateTimeModule.java           |  31 ++++
 .../internal/joda/DateTimeSerializer.java       |  60 ++++++++
 .../internal/processor/JsonRestProcessor.java   |  11 ++
 .../salesforce/RestApiIntegrationTest.java      | 153 ++++++++++++-------
 .../salesforce/dto/generated/Tasks__c.java      |  44 ++++++
 .../processor/JsonRestProcessorTest.java        |  74 +++++++++
 9 files changed, 402 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/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 eac801c..af5507b 100644
--- a/components/camel-salesforce/camel-salesforce-component/pom.xml
+++ b/components/camel-salesforce/camel-salesforce-component/pom.xml
@@ -44,6 +44,11 @@
 
   <dependencies>
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-core</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/JodaTimeConverter.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/JodaTimeConverter.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/JodaTimeConverter.java
index c2609b8..5cd19b1 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/JodaTimeConverter.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/JodaTimeConverter.java
@@ -28,14 +28,29 @@ import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.format.DateTimeFormatter;
-import org.joda.time.format.ISODateTimeFormat;
+import org.joda.time.format.DateTimeFormatterBuilder;
 
 /**
  * XStream converter for handling JodaTime fields.
  */
 public class JodaTimeConverter implements Converter {
 
-    private final DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
+    private final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
+            .appendYear(4, 4)
+            .appendLiteral('-')
+            .appendMonthOfYear(2)
+            .appendLiteral('-')
+            .appendDayOfMonth(2)
+            .appendLiteral('T')
+            .appendHourOfDay(2)
+            .appendLiteral(':')
+            .appendMinuteOfHour(2)
+            .appendLiteral(':')
+            .appendSecondOfMinute(2)
+            .appendLiteral('.')
+            .appendMillisOfSecond(3)
+            .appendTimeZoneOffset("Z", true, 2, 2)
+            .toFormatter();
 
     @Override
     public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext context) {

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeDeserializer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeDeserializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeDeserializer.java
new file mode 100644
index 0000000..280f238
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeDeserializer.java
@@ -0,0 +1,64 @@
+/**
+ * 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.internal.joda;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.DateTimeFormatterBuilder;
+
+public class DateTimeDeserializer extends JsonDeserializer<DateTime> {
+
+    private final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
+            .appendYear(4, 4)
+            .appendLiteral('-')
+            .appendMonthOfYear(2)
+            .appendLiteral('-')
+            .appendDayOfMonth(2)
+            .appendLiteral('T')
+            .appendHourOfDay(2)
+            .appendLiteral(':')
+            .appendMinuteOfHour(2)
+            .appendLiteral(':')
+            .appendSecondOfMinute(2)
+            .appendLiteral('.')
+            .appendMillisOfSecond(3)
+            .appendTimeZoneOffset("Z", true, 2, 2)
+            .toFormatter();
+
+    public DateTimeDeserializer() {
+        super();
+    }
+
+    @Override
+    public DateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+        JsonToken currentToken = jsonParser.getCurrentToken();
+        if (currentToken == JsonToken.VALUE_STRING) {
+            String dateTimeAsString = jsonParser.getText().trim();
+            return formatter.parseDateTime(dateTimeAsString);
+        }
+        throw deserializationContext.mappingException(getClass());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeModule.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeModule.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeModule.java
new file mode 100644
index 0000000..f3385b4
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeModule.java
@@ -0,0 +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.internal.joda;
+
+
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+import org.joda.time.DateTime;
+
+public class DateTimeModule extends SimpleModule {
+
+    public DateTimeModule() {
+        super();
+        addSerializer(DateTime.class, new DateTimeSerializer());
+        addDeserializer(DateTime.class, new DateTimeDeserializer());
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeSerializer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeSerializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeSerializer.java
new file mode 100644
index 0000000..1c40eb9
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/joda/DateTimeSerializer.java
@@ -0,0 +1,60 @@
+/**
+ * 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.internal.joda;
+
+
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.DateTimeFormatterBuilder;
+
+public class DateTimeSerializer extends JsonSerializer<DateTime> {
+
+    private final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
+            .appendYear(4, 4)
+            .appendLiteral('-')
+            .appendMonthOfYear(2)
+            .appendLiteral('-')
+            .appendDayOfMonth(2)
+            .appendLiteral('T')
+            .appendHourOfDay(2)
+            .appendLiteral(':')
+            .appendMinuteOfHour(2)
+            .appendLiteral(':')
+            .appendSecondOfMinute(2)
+            .appendLiteral('.')
+            .appendMillisOfSecond(3)
+            .appendTimeZoneOffset("Z", true, 2, 2)
+            .toFormatter();
+
+    public DateTimeSerializer() {
+        super();
+    }
+
+    @Override
+    public void serialize(DateTime dateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
+        jsonGenerator.writeString(formatter.print(dateTime));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/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 b125f8c..1dad12c 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
@@ -20,6 +20,11 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.text.DateFormat;
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -39,7 +44,12 @@ import org.apache.camel.component.salesforce.api.dto.SObjectBasicInfo;
 import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
 import org.apache.camel.component.salesforce.api.dto.SearchResult;
 import org.apache.camel.component.salesforce.api.dto.Version;
+import org.apache.camel.component.salesforce.internal.joda.DateTimeModule;
 import org.eclipse.jetty.util.StringUtil;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.DateTimeFormatterBuilder;
 
 public class JsonRestProcessor extends AbstractRestProcessor {
 
@@ -57,6 +67,7 @@ public class JsonRestProcessor extends AbstractRestProcessor {
             this.objectMapper = new ObjectMapper();
             // enable date time support including Joda DateTime
             this.objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+            this.objectMapper.registerModule(new DateTimeModule());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/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 9eb0eb4..390f161 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
@@ -45,6 +45,7 @@ import org.apache.camel.component.salesforce.dto.generated.Document;
 import org.apache.camel.component.salesforce.dto.generated.Line_Item__c;
 import org.apache.camel.component.salesforce.dto.generated.Merchandise__c;
 import org.apache.camel.component.salesforce.dto.generated.QueryRecordsLine_Item__c;
+import org.apache.camel.component.salesforce.dto.generated.Tasks__c;
 import org.apache.camel.util.jsse.SSLContextParameters;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.ContentResponse;
@@ -52,6 +53,8 @@ import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.joda.time.DateTime;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,8 +81,8 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
         String uri = sf.getLoginConfig().getLoginUrl() + "/services/oauth2/revoke?token=" + accessToken;
         Request logoutGet = httpClient.newRequest(uri)
-            .method(HttpMethod.GET)
-            .timeout(1, TimeUnit.MINUTES);
+                .method(HttpMethod.GET)
+                .timeout(1, TimeUnit.MINUTES);
 
         ContentResponse response = logoutGet.send();
         assertEquals(HttpStatus.OK_200, response.getStatus());
@@ -100,8 +103,8 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
         String uri = sf.getLoginConfig().getLoginUrl() + "/services/oauth2/revoke?token=" + accessToken;
         Request logoutGet = httpClient.newRequest(uri)
-            .method(HttpMethod.GET)
-            .timeout(1, TimeUnit.MINUTES);
+                .method(HttpMethod.GET)
+                .timeout(1, TimeUnit.MINUTES);
 
         ContentResponse response = logoutGet.send();
         assertEquals(HttpStatus.OK_200, response.getStatus());
@@ -230,6 +233,37 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
     }
 
     @Test
+    @Ignore("Depends on a Task object with a datetime field")
+    public void testCreateUpdateDeleteTasks() throws Exception {
+        doTestCreateUpdateDeleteTasks("");
+        doTestCreateUpdateDeleteTasks("Xml");
+    }
+
+    private void doTestCreateUpdateDeleteTasks(String suffix) throws Exception {
+        Tasks__c taken = new Tasks__c();
+        taken.setName("Task1");
+        taken.setStart__c(new DateTime(1700, 1, 2, 3, 4, 5, 6));
+        CreateSObjectResult result = template().requestBody("direct:createSObject" + suffix,
+                taken, CreateSObjectResult.class);
+        assertNotNull(result);
+        assertTrue("Create success", result.getSuccess());
+        LOG.debug("Create: " + result);
+
+        // test JSON update
+        // make the plane cheaper
+        taken.setId(result.getId());
+        taken.setStart__c(new DateTime(1991, 1, 2, 3, 4, 5, 6));
+
+        assertNull(template().requestBodyAndHeader("direct:updateSObject" + suffix,
+                taken, SalesforceEndpointConfig.SOBJECT_ID, result.getId()));
+        LOG.debug("Update successful");
+
+        // delete the newly created SObject
+        assertNull(template().requestBody("direct:deleteSObjectTaken" + suffix, result.getId()));
+        LOG.debug("Delete successful");
+    }
+
+    @Test
     public void testCreateUpdateDelete() throws Exception {
         doTestCreateUpdateDelete("");
         doTestCreateUpdateDelete("Xml");
@@ -242,7 +276,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         merchandise.setPrice__c(2000.0);
         merchandise.setTotal_Inventory__c(50.0);
         CreateSObjectResult result = template().requestBody("direct:createSObject" + suffix,
-            merchandise, CreateSObjectResult.class);
+                merchandise, CreateSObjectResult.class);
         assertNotNull(result);
         assertTrue("Create success", result.getSuccess());
         LOG.debug("Create: " + result);
@@ -256,7 +290,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         merchandise.setId(result.getId());
 
         assertNull(template().requestBodyAndHeader("direct:updateSObject" + suffix,
-            merchandise, SalesforceEndpointConfig.SOBJECT_ID, result.getId()));
+                merchandise, SalesforceEndpointConfig.SOBJECT_ID, result.getId()));
         LOG.debug("Update successful");
 
         // delete the newly created SObject
@@ -273,7 +307,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
     private void doTestCreateUpdateDeleteWithId(String suffix) throws Exception {
         // get line item with Name 1
         Line_Item__c lineItem = template().requestBody("direct:getSObjectWithId" + suffix, TEST_LINE_ITEM_ID,
-            Line_Item__c.class);
+                Line_Item__c.class);
         assertNotNull(lineItem);
         LOG.debug("GetWithId: {}", lineItem);
 
@@ -285,8 +319,8 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         lineItem.setName(NEW_LINE_ITEM_ID);
 
         CreateSObjectResult result = template().requestBodyAndHeader("direct:upsertSObject" + suffix,
-            lineItem, SalesforceEndpointConfig.SOBJECT_EXT_ID_VALUE, NEW_LINE_ITEM_ID,
-            CreateSObjectResult.class);
+                lineItem, SalesforceEndpointConfig.SOBJECT_EXT_ID_VALUE, NEW_LINE_ITEM_ID,
+                CreateSObjectResult.class);
         assertNotNull(result);
         assertTrue(result.getSuccess());
         LOG.debug("CreateWithId: {}", result);
@@ -299,8 +333,8 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
         // update line item with Name NEW_LINE_ITEM_ID
         result = template().requestBodyAndHeader("direct:upsertSObject" + suffix,
-            lineItem, SalesforceEndpointConfig.SOBJECT_EXT_ID_VALUE, NEW_LINE_ITEM_ID,
-            CreateSObjectResult.class);
+                lineItem, SalesforceEndpointConfig.SOBJECT_EXT_ID_VALUE, NEW_LINE_ITEM_ID,
+                CreateSObjectResult.class);
         assertNull(result);
         LOG.debug("UpdateWithId: {}", result);
 
@@ -326,7 +360,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         headers.put(SalesforceEndpointConfig.SOBJECT_NAME, "Document");
         headers.put(SalesforceEndpointConfig.SOBJECT_EXT_ID_NAME, "Name");
         Document document = template().requestBodyAndHeaders("direct:getSObjectWithId" + suffix, TEST_DOCUMENT_ID,
-            headers, Document.class);
+                headers, Document.class);
         assertNotNull(document);
         LOG.debug("GetWithId: {}", document);
 
@@ -350,7 +384,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
     private void doTestQuery(String suffix) throws Exception {
         QueryRecordsLine_Item__c queryRecords = template().requestBody("direct:query" + suffix, null,
-            QueryRecordsLine_Item__c.class);
+                QueryRecordsLine_Item__c.class);
         assertNotNull(queryRecords);
         LOG.debug("ExecuteQuery: {}", queryRecords);
     }
@@ -400,7 +434,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
                 SalesforceException cause = (SalesforceException) e.getCause();
                 if (cause.getStatusCode() == HttpStatus.NOT_FOUND_404) {
                     LOG.error("Make sure test REST resource MerchandiseRestResource.apxc has been loaded: "
-                        + e.getMessage());
+                            + e.getMessage());
                 }
             }
             throw e;
@@ -416,13 +450,13 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
         // request merchandise with id in URI template
         Merchandise__c merchandise = template().requestBodyAndHeader("direct:apexCallGet" + suffix, null,
-            "id", testId, Merchandise__c.class);
+                "id", testId, Merchandise__c.class);
         assertNotNull(merchandise);
         LOG.debug("ApexCallGet: {}", merchandise);
 
         // request merchandise with id as query param
         merchandise = template().requestBodyAndHeader("direct:apexCallGetWithId" + suffix, null,
-            SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX + "id", testId, Merchandise__c.class);
+                SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX + "id", testId, Merchandise__c.class);
         assertNotNull(merchandise);
         LOG.debug("ApexCallGetWithId: {}", merchandise);
 
@@ -434,7 +468,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         merchandise.setTotal_Inventory__c(null);
 
         merchandise = template().requestBody("direct:apexCallPatch" + suffix,
-            new MerchandiseRequest(merchandise), Merchandise__c.class);
+                new MerchandiseRequest(merchandise), Merchandise__c.class);
         assertNotNull(merchandise);
         LOG.debug("ApexCallPatch: {}", merchandise);
     }
@@ -494,7 +528,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         // get test merchandise
         // note that the header value overrides sObjectFields in endpoint
         Merchandise__c merchandise = template().requestBodyAndHeader("direct:getSObject" + suffix, testId,
-            "sObjectFields", "Name,Description__c,Price__c,Total_Inventory__c", Merchandise__c.class);
+                "sObjectFields", "Name,Description__c,Price__c,Total_Inventory__c", Merchandise__c.class);
         assertNotNull(merchandise);
         assertNotNull(merchandise.getName());
         assertNotNull(merchandise.getPrice__c());
@@ -504,7 +538,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         try {
             merchandise.clearBaseFields();
             result = template().requestBody("direct:createSObject" + suffix,
-                merchandise, CreateSObjectResult.class);
+                    merchandise, CreateSObjectResult.class);
             assertNotNull(result);
             assertNotNull(result.getId());
             LOG.debug("Clone SObject: {}", result);
@@ -548,7 +582,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         // get test merchandise
         // note that the header value overrides sObjectFields in endpoint
         Merchandise__c merchandise = template().requestBodyAndHeader("direct:getSObject" + suffix, testId,
-            "sObjectFields", "Description__c,Price__c", Merchandise__c.class);
+                "sObjectFields", "Description__c,Price__c", Merchandise__c.class);
         assertNotNull(merchandise);
         assertNotNull(merchandise.getPrice__c());
         assertNull(merchandise.getTotal_Inventory__c());
@@ -558,7 +592,7 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
         CreateSObjectResult result = null;
         try {
             result = template().requestBody("direct:createSObject" + suffix,
-                merchandise, CreateSObjectResult.class);
+                    merchandise, CreateSObjectResult.class);
             fail("Expected SalesforceException with statusCode 400");
         } catch (CamelExecutionException e) {
             assertTrue(e.getCause() instanceof SalesforceException);
@@ -605,102 +639,107 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
                 // testGetVersion
                 from("direct:getVersions")
-                    .to("salesforce:getVersions");
+                        .to("salesforce:getVersions");
 
                 // allow overriding format per endpoint
                 from("direct:getVersionsXml")
-                    .to("salesforce:getVersions?format=XML");
+                        .to("salesforce:getVersions?format=XML");
 
                 // testGetResources
                 from("direct:getResources")
-                    .to("salesforce:getResources");
+                        .to("salesforce:getResources");
 
                 from("direct:getResourcesXml")
-                    .to("salesforce:getResources?format=XML");
+                        .to("salesforce:getResources?format=XML");
 
                 // testGetGlobalObjects
                 from("direct:getGlobalObjects")
-                    .to("salesforce:getGlobalObjects");
+                        .to("salesforce:getGlobalObjects");
 
                 from("direct:getGlobalObjectsXml")
-                    .to("salesforce:getGlobalObjects?format=XML");
+                        .to("salesforce:getGlobalObjects?format=XML");
 
                 // testGetBasicInfo
                 from("direct:getBasicInfo")
-                    .to("salesforce:getBasicInfo?sObjectName=Merchandise__c");
+                        .to("salesforce:getBasicInfo?sObjectName=Merchandise__c");
 
                 from("direct:getBasicInfoXml")
-                    .to("salesforce:getBasicInfo?format=XML&sObjectName=Merchandise__c");
+                        .to("salesforce:getBasicInfo?format=XML&sObjectName=Merchandise__c");
 
                 // testGetDescription
                 from("direct:getDescription")
-                    .to("salesforce:getDescription?sObjectName=Merchandise__c");
+                        .to("salesforce:getDescription?sObjectName=Merchandise__c");
 
                 from("direct:getDescriptionXml")
-                    .to("salesforce:getDescription?format=XML&sObjectName=Merchandise__c");
+                        .to("salesforce:getDescription?format=XML&sObjectName=Merchandise__c");
 
                 // testGetSObject
                 from("direct:getSObject")
-                    .to("salesforce:getSObject?sObjectName=Merchandise__c&sObjectFields=Description__c,Price__c");
+                        .to("salesforce:getSObject?sObjectName=Merchandise__c&sObjectFields=Description__c,Price__c");
 
                 from("direct:getSObjectXml")
-                    .to("salesforce:getSObject?format=XML&sObjectName=Merchandise__c&sObjectFields=Description__c,Total_Inventory__c");
+                        .to("salesforce:getSObject?format=XML&sObjectName=Merchandise__c&sObjectFields=Description__c,Total_Inventory__c");
 
                 // testCreateSObject
                 from("direct:createSObject")
-                    .to("salesforce:createSObject?sObjectName=Merchandise__c");
+                        .to("salesforce:createSObject?sObjectName=Merchandise__c");
 
                 from("direct:createSObjectXml")
-                    .to("salesforce:createSObject?format=XML&sObjectName=Merchandise__c");
+                        .to("salesforce:createSObject?format=XML&sObjectName=Merchandise__c");
 
                 // testUpdateSObject
                 from("direct:updateSObject")
-                    .to("salesforce:updateSObject?sObjectName=Merchandise__c");
+                        .to("salesforce:updateSObject?sObjectName=Merchandise__c");
 
                 from("direct:updateSObjectXml")
-                    .to("salesforce:updateSObject?format=XML&sObjectName=Merchandise__c");
+                        .to("salesforce:updateSObject?format=XML&sObjectName=Merchandise__c");
 
                 // testDeleteSObject
                 from("direct:deleteSObject")
-                    .to("salesforce:deleteSObject?sObjectName=Merchandise__c");
+                        .to("salesforce:deleteSObject?sObjectName=Merchandise__c");
 
                 from("direct:deleteSObjectXml")
-                    .to("salesforce:deleteSObject?format=XML&sObjectName=Merchandise__c");
+                        .to("salesforce:deleteSObject?format=XML&sObjectName=Merchandise__c");
+
+                from("direct:deleteSObjectTaken")
+                        .to("salesforce:deleteSObject?sObjectName=Tasks__c");
+                from("direct:deleteSObjectTakenXml")
+                        .to("salesforce:deleteSObject?format=XML&sObjectName=Tasks__c");
 
                 // testGetSObjectWithId
                 from("direct:getSObjectWithId")
-                    .to("salesforce:getSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name");
+                        .to("salesforce:getSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 from("direct:getSObjectWithIdXml")
-                    .to("salesforce:getSObjectWithId?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
+                        .to("salesforce:getSObjectWithId?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 // testUpsertSObject
                 from("direct:upsertSObject")
-                    .to("salesforce:upsertSObject?sObjectName=Line_Item__c&sObjectIdName=Name");
+                        .to("salesforce:upsertSObject?sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 from("direct:upsertSObjectXml")
-                    .to("salesforce:upsertSObject?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
+                        .to("salesforce:upsertSObject?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 // testDeleteSObjectWithId
                 from("direct:deleteSObjectWithId")
-                    .to("salesforce:deleteSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name");
+                        .to("salesforce:deleteSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 from("direct:deleteSObjectWithIdXml")
-                    .to("salesforce:deleteSObjectWithId?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
+                        .to("salesforce:deleteSObjectWithId?format=XML&sObjectName=Line_Item__c&sObjectIdName=Name");
 
                 // testGetBlobField
                 from("direct:getBlobField")
-                    .to("salesforce:getBlobField?sObjectName=Document&sObjectBlobFieldName=Body");
+                        .to("salesforce:getBlobField?sObjectName=Document&sObjectBlobFieldName=Body");
 
                 from("direct:getBlobFieldXml")
-                    .to("salesforce:getBlobField?format=XML&sObjectName=Document&sObjectBlobFieldName=Body");
+                        .to("salesforce:getBlobField?format=XML&sObjectName=Document&sObjectBlobFieldName=Body");
 
                 // testQuery
                 from("direct:query")
-                    .to("salesforce:query?sObjectQuery=SELECT name from Line_Item__c&sObjectClass=" + QueryRecordsLine_Item__c.class.getName());
+                        .to("salesforce:query?sObjectQuery=SELECT name from Line_Item__c&sObjectClass=" + QueryRecordsLine_Item__c.class.getName());
 
                 from("direct:queryXml")
-                    .to("salesforce:query?format=XML&sObjectQuery=SELECT name from Line_Item__c&sObjectClass=" + QueryRecordsLine_Item__c.class.getName());
+                        .to("salesforce:query?format=XML&sObjectQuery=SELECT name from Line_Item__c&sObjectClass=" + QueryRecordsLine_Item__c.class.getName());
 
                 // testQueryAll
                 from("direct:queryAll")
@@ -711,29 +750,29 @@ public class RestApiIntegrationTest extends AbstractSalesforceTestBase {
 
                 // testSearch
                 from("direct:search")
-                    .to("salesforce:search?sObjectSearch=FIND {Wee}");
+                        .to("salesforce:search?sObjectSearch=FIND {Wee}");
 
                 from("direct:searchXml")
-                    .to("salesforce:search?format=XML&sObjectSearch=FIND {Wee}");
+                        .to("salesforce:search?format=XML&sObjectSearch=FIND {Wee}");
 
                 // testApexCall
                 from("direct:apexCallGet")
-                    .to("salesforce:apexCall?apexMethod=GET&apexUrl=Merchandise/{id}&sObjectName=Merchandise__c");
+                        .to("salesforce:apexCall?apexMethod=GET&apexUrl=Merchandise/{id}&sObjectName=Merchandise__c");
 
                 from("direct:apexCallGetXml")
-                    .to("salesforce:apexCall/Merchandise/{id}?format=XML&apexMethod=GET&sObjectClass=" + MerchandiseXmlResponse.class.getName());
+                        .to("salesforce:apexCall/Merchandise/{id}?format=XML&apexMethod=GET&sObjectClass=" + MerchandiseXmlResponse.class.getName());
 
                 from("direct:apexCallGetWithId")
-                    .to("salesforce:apexCall/Merchandise/?apexMethod=GET&id=dummyId&sObjectClass=" + Merchandise__c.class.getName());
+                        .to("salesforce:apexCall/Merchandise/?apexMethod=GET&id=dummyId&sObjectClass=" + Merchandise__c.class.getName());
 
                 from("direct:apexCallGetWithIdXml")
-                    .to("salesforce:apexCall?format=XML&apexMethod=GET&apexUrl=Merchandise/&id=dummyId&sObjectClass=" + MerchandiseXmlResponse.class.getName());
+                        .to("salesforce:apexCall?format=XML&apexMethod=GET&apexUrl=Merchandise/&id=dummyId&sObjectClass=" + MerchandiseXmlResponse.class.getName());
 
                 from("direct:apexCallPatch")
-                    .to("salesforce:apexCall?apexMethod=PATCH&apexUrl=Merchandise/&sObjectName=Merchandise__c");
+                        .to("salesforce:apexCall?apexMethod=PATCH&apexUrl=Merchandise/&sObjectName=Merchandise__c");
 
                 from("direct:apexCallPatchXml")
-                    .to("salesforce:apexCall/Merchandise/?format=XML&apexMethod=PATCH&sObjectClass=" + MerchandiseXmlResponse.class.getName());
+                        .to("salesforce:apexCall/Merchandise/?format=XML&apexMethod=PATCH&sObjectClass=" + MerchandiseXmlResponse.class.getName());
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Tasks__c.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Tasks__c.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Tasks__c.java
new file mode 100644
index 0000000..fef222d
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Tasks__c.java
@@ -0,0 +1,44 @@
+/**
+ * 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.dto.generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
+import org.joda.time.DateTime;
+
+/**
+ * Salesforce DTO for SObject Tasks__c
+ */
+@XStreamAlias("Tasks__c")
+public class Tasks__c extends AbstractSObjectBase {
+
+    // Start__c
+    private DateTime Start__c;
+
+    @JsonProperty("Start__c")
+    public DateTime getStart__c() {
+        return this.Start__c;
+    }
+
+    @JsonProperty("Start__c")
+    public void setStart__c(DateTime Start__c) {
+        this.Start__c = Start__c;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0c126492/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessorTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessorTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessorTest.java
new file mode 100644
index 0000000..caaa794
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessorTest.java
@@ -0,0 +1,74 @@
+/**
+ * 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.internal.processor;
+
+import java.io.ByteArrayInputStream;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.component.salesforce.SalesforceComponent;
+import org.apache.camel.component.salesforce.SalesforceEndpoint;
+import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
+import org.apache.camel.component.salesforce.api.dto.AbstractDTOBase;
+import org.apache.camel.component.salesforce.dto.generated.Document;
+import org.apache.camel.component.salesforce.dto.generated.Merchandise__c;
+import org.apache.camel.component.salesforce.internal.OperationName;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.apache.commons.io.IOUtils;
+import org.hamcrest.core.Is;
+import org.joda.time.DateTime;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class JsonRestProcessorTest {
+
+    @Test
+    public void getRequestStream() throws Exception {
+        SalesforceComponent comp = new SalesforceComponent();
+        SalesforceEndpointConfig conf = new SalesforceEndpointConfig();
+        OperationName op = OperationName.CREATE_BATCH;
+        SalesforceEndpoint endpoint = new SalesforceEndpoint("", comp, conf, op, "");
+        JsonRestProcessor jsonRestProcessor = new JsonRestProcessor(endpoint);
+        DefaultCamelContext context = new DefaultCamelContext();
+        Exchange exchange = new DefaultExchange(context, ExchangePattern.InOut);
+        TestObject doc = new TestObject();
+        doc.setCreationDate(new DateTime(1717, 1, 2, 3, 4, 5, 6));
+
+        exchange.getIn().setBody(doc);
+        ByteArrayInputStream is = (ByteArrayInputStream) jsonRestProcessor.getRequestStream(exchange);
+        String result = IOUtils.toString(is);
+        assertThat(result, result.length(), Is.is(48));
+    }
+
+    private static class TestObject extends AbstractDTOBase {
+
+        private DateTime creationDate;
+
+        public DateTime getCreationDate() {
+            return creationDate;
+        }
+
+        public void setCreationDate(DateTime creationDate) {
+            this.creationDate = creationDate;
+        }
+    }
+
+}
\ No newline at end of file