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