This is an automated email from the ASF dual-hosted git repository.

jeremyross pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 64a3adf  CAMEL-13180: camel-salesforce: Custom errors (#6549)
64a3adf is described below

commit 64a3adfdb9cab8814ca298b137f3d8e151440dff
Author: Jeremy Ross <[email protected]>
AuthorDate: Fri Dec 17 08:49:12 2021 -0600

    CAMEL-13180: camel-salesforce: Custom errors (#6549)
    
    In case of non-2xx responses to Apex REST requests, preserve the
    response content since it won't necessarily be in the standard
    salesforce exception format.
---
 .../salesforce/api/SalesforceException.java        | 23 ++++++++++++++++++----
 .../internal/client/DefaultRestClient.java         | 15 ++++++++++++--
 .../salesforce/RestApiIntegrationTest.java         | 11 +++++++++++
 .../salesforce/classes/MerchandiseRestResource.cls | 10 ++++++++--
 4 files changed, 51 insertions(+), 8 deletions(-)

diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/SalesforceException.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/SalesforceException.java
index d6c52d0..529c094 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/SalesforceException.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/SalesforceException.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.salesforce.api;
 
+import java.io.InputStream;
 import java.util.Collections;
 import java.util.List;
 
@@ -28,6 +29,7 @@ public class SalesforceException extends CamelException {
 
     private final List<RestError> errors;
     private final int statusCode;
+    private final InputStream responseContent;
 
     public SalesforceException(Throwable cause) {
         this(null, 0, null, cause);
@@ -38,7 +40,7 @@ public class SalesforceException extends CamelException {
     }
 
     public SalesforceException(String message, int statusCode) {
-        this(null, statusCode, message, null);
+        this(null, statusCode, message, (InputStream) null);
     }
 
     public SalesforceException(String message, int statusCode, Throwable 
cause) {
@@ -46,7 +48,7 @@ public class SalesforceException extends CamelException {
     }
 
     public SalesforceException(List<RestError> errors, int statusCode) {
-        this(errors, statusCode, null, null);
+        this(errors, statusCode, null, (InputStream) null);
     }
 
     public SalesforceException(List<RestError> errors, int statusCode, 
Throwable cause) {
@@ -54,13 +56,23 @@ public class SalesforceException extends CamelException {
     }
 
     public SalesforceException(List<RestError> errors, int statusCode, String 
message) {
-        this(errors, statusCode, message, null);
+        this(errors, statusCode, message, null, null);
+    }
+
+    public SalesforceException(List<RestError> errors, int statusCode, String 
message, InputStream responseContent) {
+        this(errors, statusCode, message, responseContent, null);
     }
 
     public SalesforceException(List<RestError> errors, int statusCode, String 
message, Throwable cause) {
+        this(errors, statusCode, message, null, cause);
+    }
+
+    public SalesforceException(List<RestError> errors, int statusCode, String 
message, InputStream responseContent,
+                               Throwable cause) {
         super(message == null ? toErrorMessage(errors, statusCode) : message, 
cause);
         this.errors = errors;
         this.statusCode = statusCode;
+        this.responseContent = responseContent;
     }
 
     public List<RestError> getErrors() {
@@ -71,6 +83,10 @@ public class SalesforceException extends CamelException {
         return statusCode;
     }
 
+    public InputStream getResponseContent() {
+        return responseContent;
+    }
+
     private static String toErrorMessage(List<RestError> errors, int 
statusCode) {
         StringBuilder builder = new StringBuilder("{");
         if (errors != null) {
@@ -86,5 +102,4 @@ public class SalesforceException extends CamelException {
 
         return builder.toString();
     }
-
 }
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
index 8abaadf..89fab53 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultRestClient.java
@@ -89,14 +89,25 @@ public class DefaultRestClient extends AbstractClientBase 
implements RestClient
                     choices = objectMapper.readValue(responseContent, 
TypeReferences.STRING_LIST_TYPE);
                     return new SalesforceMultipleChoicesException(reason, 
statusCode, choices);
                 } else {
-                    final List<RestError> restErrors = 
readErrorsFrom(responseContent, objectMapper);
+                    List<RestError> restErrors = null;
+                    try {
+                        restErrors = readErrorsFrom(responseContent, 
objectMapper);
+                    } catch (IOException ignored) {
+                        // ok. could be a custom response
+                    }
+                    try {
+                        responseContent.reset();
+                    } catch (Throwable t) {
+                        log.warn("Unable to reset HTTP response content input 
stream.");
+                    }
                     if (statusCode == HttpStatus.NOT_FOUND_404) {
                         return new NoSuchSObjectException(restErrors);
                     }
 
                     return new SalesforceException(
                             restErrors, statusCode,
-                            "Unexpected error: " + reason + ". See exception 
`errors` property for detail.");
+                            "Unexpected error: " + reason + ". See exception 
`errors` property for detail.",
+                            responseContent);
                 }
             }
         } catch (IOException e) {
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 de74c01..f45abae 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
@@ -17,6 +17,7 @@
 package org.apache.camel.component.salesforce;
 
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.HashMap;
@@ -53,6 +54,7 @@ import 
org.apache.camel.component.salesforce.dto.generated.Task;
 import org.apache.camel.component.salesforce.dto.generated.User;
 import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.support.jsse.SSLContextParameters;
+import org.apache.commons.io.IOUtils;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.ContentResponse;
 import org.eclipse.jetty.client.api.Request;
@@ -203,6 +205,12 @@ public class RestApiIntegrationTest extends 
AbstractSalesforceTestBase {
 
         merchandise = template().requestBody("direct:apexCallPatch", new 
MerchandiseRequest(merchandise), Merchandise__c.class);
         assertNotNull(merchandise);
+
+        Exchange exchange = new DefaultExchange(context);
+        template.send("direct:apexCallPostCustomError", exchange);
+        SalesforceException exception = 
exchange.getException(SalesforceException.class);
+        assertNotNull(exception);
+        assertEquals("test response", 
IOUtils.toString(exception.getResponseContent(), StandardCharsets.UTF_8));
     }
 
     @Test
@@ -805,6 +813,9 @@ public class RestApiIntegrationTest extends 
AbstractSalesforceTestBase {
                 
from("direct:apexCallPatch").to("salesforce:apexCall/Merchandise/"
                                                 + 
"?apexMethod=PATCH&sObjectClass=" + MerchandiseResponse.class.getName());
 
+                
from("direct:apexCallPostCustomError").to("salesforce:apexCall/Merchandise/"
+                                                          + 
"?apexMethod=POST&sObjectClass=java.lang.String");
+
                 
from("direct:createSObjectContinueOnException").onException(Exception.class).continued(true).end()
                         .to("salesforce:createSObject");
             }
diff --git 
a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls
 
b/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls
index ec2f416..a782b14 100644
--- 
a/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls
+++ 
b/components/camel-salesforce/it/resources/salesforce/classes/MerchandiseRestResource.cls
@@ -33,7 +33,7 @@ global with sharing class MerchandiseRestResource {
             throw new InvalidParamException('Missing merchandise id in URL and 
query params');
         }
     }
-  
+
     @HttpPatch
     global static Merchandise__c doPatch(Merchandise__c merchandise) {
         // lookup merchandise
@@ -55,6 +55,12 @@ global with sharing class MerchandiseRestResource {
         return current;
     }
 
+    @HttpPost
+    global static void doPost() {
+        RestContext.response.responseBody = Blob.valueOf('test response');
+        RestContext.response.statusCode = 500;
+    }
+
     // Invalid Merchandise Id exception
     public class InvalidParamException extends Exception {}
-}
+}
\ No newline at end of file

Reply via email to