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