From a77d419ee2119129dc6a987efdd14bbaf58d380f Mon Sep 17 00:00:00 2001 From: Paul Wheeler Date: Mon, 19 Jun 2017 15:57:53 -1000 Subject: [PATCH 1/2] Parse CSV batch result responses. --- .../java/com/sforce/async/BulkConnection.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/main/java/com/sforce/async/BulkConnection.java b/src/main/java/com/sforce/async/BulkConnection.java index fb33fb4e..f31ab5e1 100644 --- a/src/main/java/com/sforce/async/BulkConnection.java +++ b/src/main/java/com/sforce/async/BulkConnection.java @@ -35,6 +35,7 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -586,6 +587,11 @@ public BatchResult getBatchResult(String jobId, String batchId, ContentType cont Result[] results = deserializeJsonToObject(stream, Result[].class); batchResult.setResult(results); return batchResult; + } else if (contentType == ContentType.CSV || contentType == ContentType.ZIP_CSV) { + BatchResult batchResult = new BatchResult(); + Result[] results = deserializeCsvResults(stream); + batchResult.setResult(results); + return batchResult; } else { XmlInputStream xin = new XmlInputStream(); xin.setInput(stream, "UTF-8"); @@ -808,6 +814,53 @@ static T deserializeJsonToObject (InputStream in, Class tmpClass) throws return mapper.readValue(in, tmpClass); } + static Result[] deserializeCsvResults (InputStream in) throws IOException, ConnectionException { + CSVReader reader = new CSVReader(in, "UTF-8"); + int idIx, successIx, createdIx, errorIx; + idIx = successIx = createdIx = errorIx = -1; + ArrayList record = reader.nextRecord(); + for (int i = 0; i < record.size(); i++) { + switch (record.get(i)) { + case "Id": + idIx = i; + break; + case "Success": + successIx = i; + break; + case "Created": + createdIx = i; + break; + case "Error": + errorIx = i; + break; + } + } + ArrayList results = new ArrayList(); + record = reader.nextRecord(); + while (record != null) { + Result result = new Result(); + result.setId(record.get(idIx)); + result.setSuccess(Boolean.parseBoolean(record.get(successIx))); + result.setCreated(Boolean.parseBoolean(record.get(createdIx))); + String error = record.get(errorIx); + if (!error.isEmpty()) { + String[] parts = error.split(":", 2); + Error error_obj = new Error(); + if (parts.length == 2 && !parts[0].isEmpty()) { + error_obj.setStatusCode(StatusCode.valueOf(parts[0])); + error_obj.setMessage(parts[1]); + } else { + error_obj.setMessage(error); + } + result.setErrors(new Error[] { error_obj }); + } + results.add(result); + record = reader.nextRecord(); + } + + return results.toArray(new Result[0]); + } + public JobInfo abortJob(String jobId) throws AsyncApiException { JobInfo job = new JobInfo(); job.setId(jobId); From bd134b16d0137f6fcd04d7fe1ae95baf924aa09d Mon Sep 17 00:00:00 2001 From: Paul Wheeler Date: Mon, 19 Jun 2017 16:29:47 -1000 Subject: [PATCH 2/2] Handle null values returned from CSVReader when parsing CSV batch results. --- src/main/java/com/sforce/async/BulkConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sforce/async/BulkConnection.java b/src/main/java/com/sforce/async/BulkConnection.java index f31ab5e1..54333a9f 100644 --- a/src/main/java/com/sforce/async/BulkConnection.java +++ b/src/main/java/com/sforce/async/BulkConnection.java @@ -843,7 +843,7 @@ record = reader.nextRecord(); result.setSuccess(Boolean.parseBoolean(record.get(successIx))); result.setCreated(Boolean.parseBoolean(record.get(createdIx))); String error = record.get(errorIx); - if (!error.isEmpty()) { + if (error != null && !error.isEmpty()) { String[] parts = error.split(":", 2); Error error_obj = new Error(); if (parts.length == 2 && !parts[0].isEmpty()) {