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

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

CAMEL-10743: Added support for rawPayload parameter in Salesforce REST APIs


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

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

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


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

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

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

http://git-wip-us.apache.org/repos/asf/camel/blob/da79c3b5/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
new file mode 100644
index 0000000..7d6941c
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
@@ -0,0 +1,240 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.eclipse.jetty.http.HttpHeader;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+import okhttp3.HttpUrl;
+import okhttp3.mockwebserver.Dispatcher;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+
+@Category(Standalone.class)
+@RunWith(Parameterized.class)
+public class RawPayloadTest extends AbstractSalesforceTestBase {
+
+    private static final String OAUTH2_TOKEN_PATH = "/services/oauth2/token";
+    private static final String XML_RESPONSE = "<response/>";
+    private static final String JSON_RESPONSE = "{ \"response\" : \"mock\" }";
+
+    private static HttpUrl loginUrl;
+    private static MockWebServer server;
+
+    @Parameter
+    public static String format;
+
+    @Parameter(1)
+    public static String endpointUri;
+
+    private static String lastFormat;
+    private static String expectedResponse;
+    private static String requestBody;
+    private static Map<String, Object> headers;
+
+    @Override
+    protected void createComponent() throws Exception {
+
+        // create the component
+        SalesforceComponent component = new SalesforceComponent();
+        final SalesforceEndpointConfig config = new SalesforceEndpointConfig();
+        config.setApiVersion(System.getProperty("apiVersion", salesforceApiVersionToUse()));
+        component.setConfig(config);
+
+        SalesforceLoginConfig dummyLoginConfig = new SalesforceLoginConfig();
+        dummyLoginConfig.setClientId("ignored");
+        dummyLoginConfig.setClientSecret("ignored");
+        dummyLoginConfig.setRefreshToken("ignored");
+        dummyLoginConfig.setLoginUrl(loginUrl.toString());
+        component.setLoginConfig(dummyLoginConfig);
+
+        // add it to context
+        context().addComponent("salesforce", component);
+    }
+
+    @AfterClass
+    public static void shutDownServer() throws IOException {
+        // shutdown mock server
+        if (server != null) {
+            server.shutdown();
+        }
+    }
+
+    @BeforeClass
+    public static void startServer() throws IOException {
+
+        // create mock server
+        server = new MockWebServer();
+
+        server.setDispatcher(new Dispatcher() {
+            @Override
+            public MockResponse dispatch(RecordedRequest recordedRequest) throws InterruptedException {
+                if (recordedRequest.getPath().equals(OAUTH2_TOKEN_PATH)) {
+                    return new MockResponse()
+                            .setResponseCode(200)
+                            .setBody("{ \"access_token\": \"mock_token\", \"instance_url\": \"" + loginUrl + "\"}");
+                } else {
+                    return new MockResponse()
+                            .setResponseCode(200)
+                            .setHeader(HttpHeader.CONTENT_TYPE.toString(), recordedRequest.getHeader(HttpHeader.CONTENT_TYPE.toString()))
+                            .setBody("XML".equals(format) ? XML_RESPONSE : JSON_RESPONSE);
+                }
+            }
+        });
+
+        // start the server
+        server.start();
+        loginUrl = server.url("");
+    }
+
+    @Before
+    public void setupRequestResponse() {
+        if (!format.equals(lastFormat)) {
+            // expected response and test request
+            final boolean isXml = "XML".equals(format);
+            expectedResponse = isXml ? XML_RESPONSE : JSON_RESPONSE;
+            if (isXml) {
+                requestBody = "<request/>";
+            } else {
+                requestBody = "{ \"request\" : \"mock\" }";
+            }
+            headers = new HashMap<>();
+            headers.put("sObjectId", "mockId");
+            headers.put("sObjectIdValue", "mockIdValue");
+            headers.put("id", "mockId");
+            headers.put(SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX + "id", "mockId");
+
+            lastFormat = format;
+        }
+    }
+
+    @Test
+    public void testRestApi() throws Exception {
+        final String responseBody = template().requestBodyAndHeaders(endpointUri, requestBody, headers, String.class);
+        assertNotNull("Null response for endpoint " + endpointUri, responseBody);
+        assertEquals("Unexpected response for endpoint " + endpointUri, expectedResponse, responseBody);
+    }
+
+    @Override
+    protected RouteBuilder doCreateRouteBuilder() throws Exception {
+
+        // create test route
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+
+                // testGetVersion
+                from("direct:getVersions").to("salesforce:getVersions?rawPayload=true&format=" + format);
+
+                // testGetResources
+                from("direct:getResources").to("salesforce:getResources?rawPayload=true&format=" + format);
+
+                // testGetGlobalObjects
+                from("direct:getGlobalObjects").to("salesforce:getGlobalObjects?rawPayload=true&format=" + format);
+
+                // testGetBasicInfo
+                from("direct:getBasicInfo").to("salesforce:getBasicInfo?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testGetDescription
+                from("direct:getDescription")
+                    .to("salesforce:getDescription?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testGetSObject
+                from("direct:getSObject")
+                    .to("salesforce:getSObject?sObjectName=Merchandise__c&sObjectFields=Description__c,Price__c&rawPayload=true&format="
+                        + format);
+
+                // testCreateSObject
+                from("direct:createSObject").to("salesforce:createSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testUpdateSObject
+                from("direct:updateSObject").to("salesforce:updateSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testDeleteSObject
+                from("direct:deleteSObject").to("salesforce:deleteSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                // testGetSObjectWithId
+                from("direct:getSObjectWithId")
+                    .to("salesforce:getSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format=" + format);
+
+                // testUpsertSObject
+                from("direct:upsertSObject")
+                    .to("salesforce:upsertSObject?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format=" + format);
+
+                // testDeleteSObjectWithId
+                from("direct:deleteSObjectWithId")
+                    .to("salesforce:deleteSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format=" + format);
+
+                // testGetBlobField
+                from("direct:getBlobField")
+                    .to("salesforce:getBlobField?sObjectName=Document&sObjectBlobFieldName=Body&rawPayload=true&format=" + format);
+
+                // testQuery
+                from("direct:query").to("salesforce:query?sObjectQuery=SELECT name from Line_Item__c&rawPayload=true&format=" + format);
+
+                // testQueryAll
+                from("direct:queryAll")
+                    .to("salesforce:queryAll?sObjectQuery=SELECT name from Line_Item__c&rawPayload=true&format=" + format);
+
+                // testSearch
+                from("direct:search").to("salesforce:search?sObjectSearch=FIND {Wee}&rawPayload=true&format=" + format);
+
+                // testApexCall
+                from("direct:apexCallGet")
+                    .to("salesforce:apexCall?apexMethod=GET&apexUrl=Merchandise/{id}&sObjectName=Merchandise__c&rawPayload=true&format="
+                        + format);
+
+                from("direct:apexCallGetWithId").to("salesforce:apexCall/Merchandise/?apexMethod=GET&id=dummyId&rawPayload=true&format="
+                    + format);
+
+                from("direct:apexCallPatch").to("salesforce:apexCall/Merchandise/?rawPayload=true&format=" + format
+                    + "&apexMethod=PATCH");
+            }
+        };
+    }
+
+    @Parameters(name = "format = {0}, endpoint = {1}")
+    public static List<String[]> parameters() {
+        final String[] endpoints = {"direct:getVersions", "direct:getResources", "direct:getGlobalObjects",
+                "direct:getBasicInfo", "direct:getDescription", "direct:getSObject", "direct:createSObject", 
+                "direct:updateSObject", "direct:deleteSObject", "direct:getSObjectWithId", "direct:upsertSObject", 
+                "direct:deleteSObjectWithId", "direct:getBlobField", "direct:query", "direct:queryAll", 
+                "direct:search", "direct:apexCallGet", "direct:apexCallGetWithId", "direct:apexCallPatch"};
+
+        final String[] formats = {"XML", "JSON"};
+
+        return Stream.of(formats).flatMap(f -> Stream.of(endpoints).map(e -> new String[]{f, e}))
+                .collect(Collectors.toList());
+    }
+}

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