Skip to content

Commit ce8b224

Browse files
author
john
committed
PB-8505. Upload multiple documents to an existing package in one call via the SDKs
1 parent d2abd5d commit ce8b224

7 files changed

Lines changed: 150 additions & 63 deletions

File tree

sdk/src/main/java/com/silanis/esl/sdk/EslClient.java

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,15 @@
11
package com.silanis.esl.sdk;
22

3-
import com.silanis.esl.api.model.*;
43
import com.silanis.esl.api.model.Package;
4+
import com.silanis.esl.api.model.SignedDocuments;
5+
import com.silanis.esl.api.model.Verification;
56
import com.silanis.esl.sdk.internal.Asserts;
67
import com.silanis.esl.sdk.internal.RestClient;
78
import com.silanis.esl.sdk.internal.SignerRestClient;
89
import com.silanis.esl.sdk.internal.converter.DocumentConverter;
910
import com.silanis.esl.sdk.internal.converter.DocumentPackageConverter;
1011
import com.silanis.esl.sdk.internal.converter.SignerVerificationConverter;
11-
import com.silanis.esl.sdk.service.AccountService;
12-
import com.silanis.esl.sdk.service.ApprovalService;
13-
import com.silanis.esl.sdk.service.AttachmentRequirementService;
14-
import com.silanis.esl.sdk.service.AuditService;
15-
import com.silanis.esl.sdk.service.AuthenticationService;
16-
import com.silanis.esl.sdk.service.AuthenticationTokensService;
17-
import com.silanis.esl.sdk.service.CustomFieldService;
18-
import com.silanis.esl.sdk.service.EventNotificationService;
19-
import com.silanis.esl.sdk.service.FieldSummaryService;
20-
import com.silanis.esl.sdk.service.GroupService;
21-
import com.silanis.esl.sdk.service.LayoutService;
22-
import com.silanis.esl.sdk.service.PackageService;
23-
import com.silanis.esl.sdk.service.QRCodeService;
24-
import com.silanis.esl.sdk.service.ReminderService;
25-
import com.silanis.esl.sdk.service.ReportService;
26-
import com.silanis.esl.sdk.service.SessionService;
27-
import com.silanis.esl.sdk.service.SignatureImageService;
28-
import com.silanis.esl.sdk.service.SignerVerificationService;
29-
import com.silanis.esl.sdk.service.SigningService;
30-
import com.silanis.esl.sdk.service.SystemService;
31-
import com.silanis.esl.sdk.service.TemplateService;
12+
import com.silanis.esl.sdk.service.*;
3213
import com.silanis.esl.sdk.service.apiclient.AccountApiClient;
3314
import com.silanis.esl.sdk.service.apiclient.ApprovalApiClient;
3415
import com.silanis.esl.sdk.service.apiclient.AttachmentRequirementApiClient;
@@ -38,10 +19,13 @@
3819
import com.silanis.esl.sdk.service.apiclient.EventNotificationApiClient;
3920

4021
import java.util.Collection;
22+
import java.util.Collections;
4123
import java.util.LinkedHashMap;
4224
import java.util.List;
4325
import java.util.Map;
4426

27+
import static java.util.Arrays.asList;
28+
4529
/**
4630
* <p>The EslClient class creates a eSignLive client with the given api token and base url.</p>
4731
* <p>The base url can be the staging or production url.</p>
@@ -265,9 +249,7 @@ public PackageId createPackage(DocumentPackage documentPackage) {
265249
Package packageToCreate = new DocumentPackageConverter(documentPackage).toAPIPackage();
266250
PackageId id = packageService.createPackage(packageToCreate);
267251

268-
for (Document document : documentPackage.getDocuments()) {
269-
uploadDocument(document, id);
270-
}
252+
uploadDocuments(id, documentPackage.getDocuments());
271253

272254
return id;
273255
}
@@ -642,6 +624,18 @@ public Document uploadDocument(String fileName, byte[] fileContent, Document doc
642624
return packageService.uploadDocument(packageId, fileName, fileContent, document);
643625
}
644626

627+
public List<Document> uploadDocuments(PackageId packageId, Document... documents) {
628+
return uploadDocuments(packageId, asList(documents));
629+
}
630+
631+
public List<Document> uploadDocuments(PackageId packageId, List<Document> documents) {
632+
if(documents.isEmpty()) {
633+
return Collections.emptyList();
634+
} else {
635+
return packageService.uploadDocuments(packageId.getId(), documents);
636+
}
637+
}
638+
645639
/**
646640
* @deprecated Please use uploadDocument(Document document, PackageId packageId) instead of this method.
647641
*/

sdk/src/main/java/com/silanis/esl/sdk/examples/DocumentUploadExample.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import com.silanis.esl.sdk.SessionToken;
1313
import com.silanis.esl.sdk.builder.FieldBuilder;
1414

15+
import java.util.List;
16+
1517
import static com.silanis.esl.sdk.builder.DocumentBuilder.newDocumentWithName;
1618
import static com.silanis.esl.sdk.builder.PackageBuilder.newPackageNamed;
1719
import static com.silanis.esl.sdk.builder.SignatureBuilder.signatureFor;
@@ -23,16 +25,19 @@
2325
*/
2426
public class DocumentUploadExample extends SDKSample{
2527

26-
public static final String UPLOADED_DOCUMENT_NAME = "First Document";
27-
public Document document;
28-
public Document uploadedDocument;
28+
public static final String DOCUMENT1_NAME = "First Document";
29+
public static final String DOCUMENT2_NAME = "Second Document";
30+
public Document document1, document2;
31+
public List<Document> uploadedDocuments;
2932

3033
public static void main( String... args ) {
3134
new DocumentUploadExample().run();
3235
}
3336

3437
public void execute() {
3538

39+
documentInputStream2 = this.getClass().getClassLoader().getResourceAsStream("taggedDocument.pdf");
40+
3641
// 1. Create a package
3742
DocumentPackage superDuperPackage = newPackageNamed(getPackageName())
3843
.describedAs("This is a package created using the eSignLive SDK")
@@ -50,8 +55,8 @@ public void execute() {
5055

5156
superDuperPackage.setId(packageId);
5257

53-
// 2. Construct a document
54-
document = newDocumentWithName(UPLOADED_DOCUMENT_NAME)
58+
// 2. Construct documents
59+
document1 = newDocumentWithName(DOCUMENT1_NAME)
5560
.fromStream(documentInputStream1, DocumentType.PDF)
5661
.withSignature(signatureFor(email1)
5762
.onPage(0)
@@ -62,8 +67,19 @@ public void execute() {
6267
.atPosition(100, 100))
6368
.build();
6469

65-
// 3. Attach the document to the created package by uploading the document.
66-
uploadedDocument = eslClient.uploadDocument(document.getFileName(), document.getContent(), document, packageId);
70+
document2 = newDocumentWithName(DOCUMENT2_NAME)
71+
.fromStream(documentInputStream2, DocumentType.PDF)
72+
.withSignature(signatureFor(email1)
73+
.onPage(0)
74+
.withField(FieldBuilder.checkBox()
75+
.onPage(0)
76+
.atPosition(400, 200)
77+
.withValue(FieldBuilder.CHECKBOX_CHECKED))
78+
.atPosition(100, 100))
79+
.build();
80+
81+
// 3. Upload the documents to the created package by uploading the document.
82+
uploadedDocuments = eslClient.uploadDocuments(packageId, document1, document2);
6783

6884
eslClient.sendPackage(superDuperPackage.getId());
6985

sdk/src/main/java/com/silanis/esl/sdk/examples/ListTemplatesExample.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.util.ArrayList;
1212
import java.util.List;
1313

14-
import static com.silanis.esl.sdk.PageRequest.DEFAULT_PAGE_SIZE;
1514
import static com.silanis.esl.sdk.builder.DocumentBuilder.newDocumentWithName;
1615
import static com.silanis.esl.sdk.builder.PackageBuilder.newPackageNamed;
1716
import static com.silanis.esl.sdk.builder.SignerBuilder.newSignerWithEmail;
@@ -71,12 +70,8 @@ public void execute() {
7170

7271
templateId = eslClient.getTemplateService().createTemplate(superDuperTemplate);
7372

74-
int index = 0;
75-
do {
76-
templatesPage = eslClient.getPackageService().getTemplates(new PageRequest(index));
77-
index =+ DEFAULT_PAGE_SIZE;
78-
templates.addAll(templatesPage.getResults());
79-
} while (templatesPage.getResults().size() > 0);
73+
templatesPage = eslClient.getPackageService().getTemplates(new PageRequest(0));
74+
templates.addAll(templatesPage.getResults());
8075
}
8176

8277
public List<DocumentPackage> getTemplates() {

sdk/src/main/java/com/silanis/esl/sdk/internal/RestClient.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@
1313
import org.apache.http.auth.UsernamePasswordCredentials;
1414
import org.apache.http.client.CredentialsProvider;
1515
import org.apache.http.client.config.RequestConfig;
16-
import org.apache.http.client.methods.*;
16+
import org.apache.http.client.methods.CloseableHttpResponse;
17+
import org.apache.http.client.methods.HttpDelete;
18+
import org.apache.http.client.methods.HttpGet;
19+
import org.apache.http.client.methods.HttpPost;
20+
import org.apache.http.client.methods.HttpPut;
21+
import org.apache.http.client.methods.HttpUriRequest;
1722
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
1823
import org.apache.http.entity.ContentType;
1924
import org.apache.http.entity.StringEntity;
@@ -40,8 +45,10 @@
4045
import java.security.SecureRandom;
4146
import java.security.cert.X509Certificate;
4247
import java.util.Collection;
48+
import java.util.List;
4349

4450
import static com.silanis.esl.sdk.internal.HttpUtil.percentDecode;
51+
import static com.silanis.esl.sdk.internal.MimeTypeUtils.getContentTypeByFileName;
4552

4653
public class RestClient {
4754

@@ -161,7 +168,7 @@ private ByteArrayBody buildPartForFile(Document document) {
161168
}
162169

163170
private ByteArrayBody buildPartForFile(byte[] content, String fileName, String name) {
164-
String contentType = MimeTypeUtils.getContentTypeByFileName(fileName);
171+
String contentType = getContentTypeByFileName(fileName);
165172
return new ByteArrayBody(content, ContentType.create(contentType), name);
166173
}
167174

sdk/src/main/java/com/silanis/esl/sdk/service/PackageService.java

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,57 @@
33
import com.fasterxml.jackson.core.type.TypeReference;
44
import com.fasterxml.jackson.databind.JsonNode;
55
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import com.silanis.esl.api.model.*;
6+
import com.google.common.base.Function;
7+
import com.google.common.collect.Iterables;
8+
import com.google.common.collect.Lists;
9+
import com.silanis.esl.api.model.Approval;
710
import com.silanis.esl.api.model.Document;
811
import com.silanis.esl.api.model.Field;
912
import com.silanis.esl.api.model.Package;
13+
import com.silanis.esl.api.model.Result;
14+
import com.silanis.esl.api.model.Role;
1015
import com.silanis.esl.api.model.Signer;
16+
import com.silanis.esl.api.model.SigningUrl;
1117
import com.silanis.esl.api.util.JacksonUtil;
12-
import com.silanis.esl.sdk.*;
18+
import com.silanis.esl.sdk.DocumentId;
19+
import com.silanis.esl.sdk.DocumentPackage;
20+
import com.silanis.esl.sdk.EslException;
21+
import com.silanis.esl.sdk.FastTrackRole;
22+
import com.silanis.esl.sdk.FastTrackSigner;
23+
import com.silanis.esl.sdk.GroupId;
24+
import com.silanis.esl.sdk.PackageId;
25+
import com.silanis.esl.sdk.PackageStatus;
26+
import com.silanis.esl.sdk.PageRequest;
27+
import com.silanis.esl.sdk.RoleList;
28+
import com.silanis.esl.sdk.SignerId;
29+
import com.silanis.esl.sdk.SigningStatus;
1330
import com.silanis.esl.sdk.builder.FastTrackRoleBuilder;
14-
import com.silanis.esl.sdk.internal.*;
15-
import com.silanis.esl.sdk.internal.converter.*;
31+
import com.silanis.esl.sdk.internal.DateHelper;
32+
import com.silanis.esl.sdk.internal.EslServerException;
33+
import com.silanis.esl.sdk.internal.RedirectResolver;
34+
import com.silanis.esl.sdk.internal.RequestException;
35+
import com.silanis.esl.sdk.internal.RestClient;
36+
import com.silanis.esl.sdk.internal.Serialization;
37+
import com.silanis.esl.sdk.internal.UrlTemplate;
38+
import com.silanis.esl.sdk.internal.converter.DocumentConverter;
39+
import com.silanis.esl.sdk.internal.converter.DocumentPackageConverter;
40+
import com.silanis.esl.sdk.internal.converter.DocumentVisibilityConverter;
41+
import com.silanis.esl.sdk.internal.converter.NotaryJournalEntryConverter;
42+
import com.silanis.esl.sdk.internal.converter.PackageStatusConverter;
43+
import com.silanis.esl.sdk.internal.converter.SignerConverter;
44+
import com.silanis.esl.sdk.internal.converter.SupportConfigurationConverter;
1645
import com.silanis.esl.sdk.io.DownloadedFile;
1746
import org.apache.commons.lang3.StringUtils;
1847

19-
import java.util.*;
48+
import java.util.ArrayList;
49+
import java.util.Collection;
50+
import java.util.Collections;
51+
import java.util.Date;
52+
import java.util.HashMap;
53+
import java.util.List;
54+
import java.util.Map;
55+
import java.util.Properties;
56+
import java.util.UUID;
2057

2158
/**
2259
* The PackageService class provides methods to help create packages and download documents after the
@@ -303,10 +340,10 @@ public com.silanis.esl.sdk.Document uploadDocument(PackageId packageId, String f
303340
return uploadApiDocument(packageId.getId(), fileName, fileBytes, apiDocument);
304341
}
305342

306-
public com.silanis.esl.sdk.Document uploadApiDocument( String packageId, String fileName, byte[] fileBytes, Document document ) {
343+
public com.silanis.esl.sdk.Document uploadApiDocument(String packageId, String fileName, byte[] fileBytes, Document document) {
307344
String path = template.urlFor(UrlTemplate.DOCUMENT_PATH)
308-
.replace("{packageId}", packageId)
309-
.build();
345+
.replace("{packageId}", packageId)
346+
.build();
310347

311348
String documentJson = Serialization.toJson(document);
312349

@@ -321,6 +358,40 @@ public com.silanis.esl.sdk.Document uploadApiDocument( String packageId, String
321358
}
322359
}
323360

361+
public List<com.silanis.esl.sdk.Document> uploadDocuments(final String packageId, List<com.silanis.esl.sdk.Document> documents) {
362+
String path = template.urlFor(UrlTemplate.DOCUMENT_PATH)
363+
.replace("{packageId}", packageId)
364+
.build();
365+
366+
final Package apiPackage = getApiPackage(packageId);
367+
368+
List<Document> apiDocuments = Lists.newArrayList(Iterables.transform(documents, new Function<com.silanis.esl.sdk.Document, Document>() {
369+
@Override
370+
public Document apply(final com.silanis.esl.sdk.Document input) {
371+
return new DocumentConverter(input).toAPIDocument(apiPackage);
372+
}
373+
}));
374+
375+
String documentsJson = Serialization.toJson(apiDocuments);
376+
377+
try {
378+
String response = client.postMultipartPackage(path, documents, documentsJson);
379+
List<Document> uploadedDocuments = Serialization.fromJsonToList(response, Document.class);
380+
381+
return Lists.newArrayList(Iterables.transform(uploadedDocuments, new Function<Document, com.silanis.esl.sdk.Document>() {
382+
@Override
383+
public com.silanis.esl.sdk.Document apply(final Document input) {
384+
return new DocumentConverter(input, getApiPackage(packageId)).toSDKDocument();
385+
}
386+
}));
387+
388+
} catch (RequestException e) {
389+
throw new EslServerException("Could not upload multiple documents to package.", e);
390+
} catch (Exception e) {
391+
throw new EslException("Could not upload multiple documents to package.", e);
392+
}
393+
}
394+
324395
/**
325396
* Deletes the document from the package.
326397
*

tester/src/test/java/com/silanis/esl/sdk/examples/DocumentUploadExampleTest.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import com.silanis.esl.sdk.DocumentPackage;
55
import org.junit.Test;
66

7-
import static com.silanis.esl.sdk.examples.DocumentUploadExample.UPLOADED_DOCUMENT_NAME;
7+
import static com.silanis.esl.sdk.examples.DocumentUploadExample.DOCUMENT1_NAME;
8+
import static com.silanis.esl.sdk.examples.DocumentUploadExample.DOCUMENT2_NAME;
89
import static org.hamcrest.MatcherAssert.assertThat;
9-
import static org.hamcrest.Matchers.not;
10-
import static org.hamcrest.core.Is.is;
10+
import static org.hamcrest.Matchers.greaterThan;
11+
import static org.hamcrest.Matchers.hasSize;
12+
import static org.hamcrest.Matchers.lessThan;
1113

1214
/**
1315
* User: jessica
@@ -23,13 +25,19 @@ public void verifyResult() {
2325
DocumentUploadExample example = new DocumentUploadExample();
2426
example.run();
2527

26-
DocumentPackage documentPackage = example.getEslClient().getPackage(example.getPackageId());
28+
DocumentPackage documentPackage = example.getRetrievedPackage();
2729

28-
// Verify if the document was uploaded correctly.
29-
assertThat("Document was not uploaded correctly. ", example.document.getName(), is(example.uploadedDocument.getName()) );
30+
// Verify if the documents was uploaded correctly.
31+
assertThat("Document was not uploaded correctly. ", documentPackage.getDocuments(), hasSize(3) );
3032

31-
Document document = documentPackage.getDocument(UPLOADED_DOCUMENT_NAME);
32-
byte[] documentBinary = example.eslClient.downloadDocument( example.getPackageId(), document.getId().toString() );
33-
assertThat("Document was not uploaded correctly. ", documentBinary.length, not(0) );
33+
Document document1 = documentPackage.getDocument(DOCUMENT1_NAME);
34+
byte[] document1Binary = example.eslClient.downloadDocument( example.getPackageId(), document1.getId().getId() );
35+
assertThat("Document was not uploaded correctly. ", document1Binary.length, greaterThan(32000) );
36+
assertThat("Document was not uploaded correctly. ", document1Binary.length, lessThan(33000) );
37+
38+
Document document2 = documentPackage.getDocument(DOCUMENT2_NAME);
39+
byte[] document2Binary = example.eslClient.downloadDocument( example.getPackageId(), document2.getId().getId() );
40+
assertThat("Document was not uploaded correctly. ", document2Binary.length, greaterThan(51000) );
41+
assertThat("Document was not uploaded correctly. ", document2Binary.length, lessThan(52000) );
3442
}
3543
}

tester/src/test/java/com/silanis/esl/sdk/examples/ListTemplatesExampleTest.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,19 @@
33
import com.silanis.esl.sdk.DocumentPackage;
44
import com.silanis.esl.sdk.ExtractionType;
55
import org.apache.commons.lang3.StringUtils;
6-
import org.junit.Ignore;
76
import org.junit.Test;
87

98
import java.util.List;
109

1110
import static com.silanis.esl.sdk.examples.ListTemplatesExample.*;
1211
import static org.hamcrest.MatcherAssert.assertThat;
13-
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
14-
import static org.hamcrest.Matchers.hasItem;
15-
import static org.hamcrest.Matchers.hasSize;
12+
import static org.hamcrest.Matchers.*;
1613

1714
/**
1815
* Created by lena on 2014-05-06.
1916
*/
2017
public class ListTemplatesExampleTest {
2118

22-
@Ignore("This test works fine, but it takes too long if there are many templates. If necessary, run it manually")
2319
@Test
2420
public void verifyResult() {
2521
ListTemplatesExample example = new ListTemplatesExample();

0 commit comments

Comments
 (0)