diff --git a/src/main/java/com/force/api/ApiResponse.java b/src/main/java/com/force/api/ApiResponse.java new file mode 100644 index 0000000..c6543a8 --- /dev/null +++ b/src/main/java/com/force/api/ApiResponse.java @@ -0,0 +1,33 @@ +package com.force.api; + +public class ApiResponse { + + private String id; + private ApiError[] errors; + private boolean success; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ApiError[] getErrors() { + return errors; + } + + public void setErrors(ApiError[] errors) { + this.errors = errors; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + +} diff --git a/src/main/java/com/force/api/CreateResponse.java b/src/main/java/com/force/api/CreateResponse.java index bc8a0f9..fa8c369 100644 --- a/src/main/java/com/force/api/CreateResponse.java +++ b/src/main/java/com/force/api/CreateResponse.java @@ -1,27 +1,5 @@ package com.force.api; -public class CreateResponse { - String id; - ApiError[] errors; - boolean success; - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public ApiError[] getErrors() { - return errors; - } - public void setErrors(ApiError[] errors) { - this.errors = errors; - } - public boolean isSuccess() { - return success; - } - public void setSuccess(boolean success) { - this.success = success; - } +public class CreateResponse extends ApiResponse { - } diff --git a/src/main/java/com/force/api/ForceApi.java b/src/main/java/com/force/api/ForceApi.java index d91932b..be2c59b 100644 --- a/src/main/java/com/force/api/ForceApi.java +++ b/src/main/java/com/force/api/ForceApi.java @@ -279,6 +279,44 @@ public CreateOrUpdateResult createOrUpdateSObject(String type, String externalId } } + public UpsertResult upsertSObject(String type, String externalIdField, String externalIdValue, Object sObject) { + try { + String method = externalIdValue != null ? "?_HttpMethod=PATCH" : ""; + String idValue = externalIdValue != null ? "/" + URLEncoder.encode(externalIdValue, "UTF-8") : ""; + HttpResponse res = + apiRequest(new HttpRequest() + .url(uriBase() + "/sobjects/" + type + "/" + externalIdField + idValue + method) + .method("POST") + .header("Accept", "application/json") + .header("Content-Type", "application/json") + .content(jsonMapper.writeValueAsBytes(sObject)) + ); + if (res.getResponseCode() == 201) { + UpsertResult upsertResult = jsonMapper.readValue(res.getStream(), UpsertResult.class); + upsertResult.setStatus(UpsertStatus.INSERTED); + return upsertResult; + } else if (res.getResponseCode() == 204) { + UpsertResult upsertResult = new UpsertResult(); + if ("Id".equals(externalIdField)) { + upsertResult.setId(externalIdValue); + } + upsertResult.setStatus(UpsertStatus.UPDATED); + return upsertResult; + } else { + logger.debug("Code: {}", res.getResponseCode()); + logger.debug("Message: {}", res.getString()); + throw new RuntimeException(); + } + + } catch (JsonGenerationException e) { + throw new ResourceException(e); + } catch (JsonMappingException e) { + throw new ResourceException(e); + } catch (IOException e) { + throw new ResourceException(e); + } + } + public QueryResult query(String query, Class clazz) { try { return queryAny(uriBase() + "/query/?q=" + URLEncoder.encode(query, "UTF-8"), clazz); @@ -416,11 +454,11 @@ public DescribeSObject describeSObject(String sobject) { throw new ResourceException(e); } } - + private final String uriBase() { return(session.getApiEndpoint()+"/services/data/"+config.getApiVersionString()); } - + private final HttpResponse apiRequest(HttpRequest req) { req.setAuthorization("Bearer "+session.getAccessToken()); req.setRequestTimeout(this.config.getRequestTimeout()); @@ -454,7 +492,7 @@ private final HttpResponse apiRequest(HttpRequest req) { return res; } } - + /** * Normalizes the JSON response in case it contains responses from * relationship queries. For e.g. @@ -462,9 +500,9 @@ private final HttpResponse apiRequest(HttpRequest req) { * * Query: * select Id,Name,(select Id,Email,FirstName from Contacts) from Account - * + * * Json Response Returned: - * + * * { * "totalSize" : 1, * "done" : true, @@ -491,9 +529,9 @@ private final HttpResponse apiRequest(HttpRequest req) { * } ] * } * - * + * * Will get normalized to: - * + * * * { * "totalSize" : 1, @@ -515,12 +553,12 @@ private final HttpResponse apiRequest(HttpRequest req) { * "FirstName" : "John" * } ] * } ] - * } + * } *