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 <anoordo...@users.noreply.github.com> Authored: Sun Jun 26 19:15:53 2016 +0200 Committer: Arno Noordover <anoordo...@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