From 59c2dbcf365b78d3e80c52514615721264aa37b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Wed, 14 Oct 2020 15:56:21 +0200 Subject: [PATCH 01/36] Use api-specification that supports multiple docs --- pom.xml | 2 +- .../signature/client/asice/manifest/CreateDirectManifest.java | 2 +- .../signature/client/asice/manifest/CreatePortalManifest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e45e5048..ae82a972 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.7 + multiple-documents-SNAPSHOT 1.7.29 diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java index dc703d4c..b35d96b2 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java @@ -39,7 +39,7 @@ Object buildXmlManifest(DirectJob job, Sender sender) { .withSigners(signers) .withRequiredAuthentication(job.getRequiredAuthentication().map(AuthenticationLevel::getXmlEnumValue).orElse(null)) .withSender(new XMLSender().withOrganizationNumber(sender.getOrganizationNumber())) - .withDocument(new XMLDirectDocument() + .withDocuments(new XMLDirectDocument() .withTitle(document.getTitle()) .withDescription(document.getMessage()) .withHref(document.getFileName()) diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index 5bcb9cca..e8f51b65 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -58,7 +58,7 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .withSigners(xmlSigners) .withRequiredAuthentication(job.getRequiredAuthentication().map(AuthenticationLevel::getXmlEnumValue).orElse(null)) .withSender(new XMLSender().withOrganizationNumber(sender.getOrganizationNumber())) - .withDocument(new XMLPortalDocument() + .withDocuments(new XMLPortalDocument() .withTitle(document.getTitle()) .withNonsensitiveTitle(document.getNonsensitiveTitle()) .withDescription(document.getMessage()) From 282619cb73a22e67fea67c575dfc576377eeabf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Wed, 14 Oct 2020 16:14:56 +0200 Subject: [PATCH 02/36] Adds repository to get sonatype snapshots --- pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pom.xml b/pom.xml index ae82a972..dab76cd5 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,19 @@ signature-api-client-java LOCAL-SNAPSHOT + + + oss.sonatype.org-snapshot + http://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + no.digipost digipost-open-super-pom From d494f741c32c104b4247cbd6bf63fb1aa8ce1dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Thu, 15 Oct 2020 10:36:31 +0200 Subject: [PATCH 03/36] Adds possibility to add multiple docs to portal job --- .../signature/client/core/SignatureJob.java | 4 +++ .../signature/client/direct/DirectJob.java | 16 ++++------ .../signature/client/portal/PortalJob.java | 32 +++++++++++-------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/core/SignatureJob.java b/src/main/java/no/digipost/signature/client/core/SignatureJob.java index bd66e6cc..268b5b41 100644 --- a/src/main/java/no/digipost/signature/client/core/SignatureJob.java +++ b/src/main/java/no/digipost/signature/client/core/SignatureJob.java @@ -1,11 +1,15 @@ package no.digipost.signature.client.core; +import java.util.List; import java.util.Optional; public interface SignatureJob { + // TODO: Remove this? Document getDocument(); + List getDocuments(); + Optional getSender(); String getReference(); diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index 1b33a2ab..3c3ba194 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -1,17 +1,10 @@ package no.digipost.signature.client.direct; -import no.digipost.signature.client.core.AuthenticationLevel; -import no.digipost.signature.client.core.IdentifierInSignedDocuments; -import no.digipost.signature.client.core.Sender; -import no.digipost.signature.client.core.SignatureJob; +import no.digipost.signature.client.core.*; import no.digipost.signature.client.core.internal.JobCustomizations; import java.net.URI; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import static java.util.Collections.unmodifiableList; @@ -46,6 +39,11 @@ public DirectDocument getDocument() { return document; } + @Override + public List getDocuments() { + return unmodifiableList(Collections.singletonList(getDocument())); + } + @Override public Optional getSender() { return sender; diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 5fb4ef2f..1cfbebb7 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -7,11 +7,7 @@ import no.digipost.signature.client.core.internal.JobCustomizations; import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.concurrent.TimeUnit; import static java.util.Collections.unmodifiableList; @@ -20,7 +16,7 @@ public class PortalJob implements SignatureJob { private final List signers; - private final PortalDocument document; + private final List documents; private String reference; private Optional activationTime = Optional.empty(); private Long availableSeconds; @@ -28,9 +24,9 @@ public class PortalJob implements SignatureJob { private Optional requiredAuthentication = Optional.empty(); private Optional identifierInSignedDocuments = Optional.empty(); - private PortalJob(List signers, PortalDocument document) { + private PortalJob(List signers, List documents) { this.signers = unmodifiableList(new ArrayList<>(signers)); - this.document = document; + this.documents = unmodifiableList(new ArrayList<>(documents)); } @Override @@ -38,9 +34,15 @@ public String getReference() { return reference; } + // TODO: Remove this? Or throw exception if more than one document exists? @Override public PortalDocument getDocument() { - return document; + return documents.get(0); + } + + @Override + public List getDocuments() { + return documents; } @Override @@ -72,11 +74,15 @@ public Long getAvailableSeconds() { public static Builder builder(PortalDocument document, PortalSigner... signers) { - return builder(document, Arrays.asList(signers)); + return builder(Collections.singletonList(document), Arrays.asList(signers)); } public static Builder builder(PortalDocument document, List signers) { - return new Builder(signers, document); + return builder(Collections.singletonList(document), signers); + } + + public static Builder builder(List documents, List signers) { + return new Builder(signers, documents); } public static class Builder implements JobCustomizations { @@ -84,8 +90,8 @@ public static class Builder implements JobCustomizations { private final PortalJob target; private boolean built = false; - private Builder(List signers, PortalDocument document) { - target = new PortalJob(signers, document); + private Builder(List signers, List documents) { + target = new PortalJob(signers, documents); } @Override From cb56074ee3d29cda89ee0ae98bc4b4724e351d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Thu, 15 Oct 2020 13:25:19 +0200 Subject: [PATCH 04/36] Adds all portal documents to manifest --- .../no/digipost/signature/client/asice/CreateASiCE.java | 3 +-- .../client/asice/manifest/CreatePortalManifest.java | 7 +++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/asice/CreateASiCE.java b/src/main/java/no/digipost/signature/client/asice/CreateASiCE.java index 17d6daaa..c4c6683d 100644 --- a/src/main/java/no/digipost/signature/client/asice/CreateASiCE.java +++ b/src/main/java/no/digipost/signature/client/asice/CreateASiCE.java @@ -43,8 +43,7 @@ public DocumentBundle createASiCE(JOB job) { Manifest manifest = manifestCreator.createManifest(job, sender); - List files = new ArrayList<>(); - files.add(job.getDocument()); + List files = new ArrayList<>(job.getDocuments()); files.add(manifest); Signature signature = createSignature.createSignature(files, keyStoreConfig); diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index e8f51b65..e32e4228 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -25,6 +25,7 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static no.digipost.signature.client.core.exceptions.SignerNotSpecifiedException.SIGNER_NOT_SPECIFIED; @@ -50,7 +51,7 @@ Object buildXmlManifest(PortalJob job, Sender sender) { xmlSigners.add(xmlPortalSigner); } - PortalDocument document = job.getDocument(); + List documents = job.getDocuments(); ZonedDateTime activationTime = job.getActivationTime().map(activation -> activation.atZone(clock.getZone())).orElse(null); @@ -58,12 +59,14 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .withSigners(xmlSigners) .withRequiredAuthentication(job.getRequiredAuthentication().map(AuthenticationLevel::getXmlEnumValue).orElse(null)) .withSender(new XMLSender().withOrganizationNumber(sender.getOrganizationNumber())) - .withDocuments(new XMLPortalDocument() + .withDocuments(documents.stream().map(document -> + new XMLPortalDocument() .withTitle(document.getTitle()) .withNonsensitiveTitle(document.getNonsensitiveTitle()) .withDescription(document.getMessage()) .withHref(document.getFileName()) .withMime(document.getMimeType()) + ).collect(Collectors.toList()) ) .withAvailability(new XMLAvailability() .withActivationTime(activationTime) From 8fb482230c6b34ad509d449cb6346a78285e9a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Wed, 4 Nov 2020 10:56:29 +0100 Subject: [PATCH 05/36] Adds default getDocument to interface, and throw if now exactly one --- .../no/digipost/signature/client/core/SignatureJob.java | 9 +++++++-- .../no/digipost/signature/client/direct/DirectJob.java | 2 +- .../no/digipost/signature/client/portal/PortalJob.java | 6 ------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/core/SignatureJob.java b/src/main/java/no/digipost/signature/client/core/SignatureJob.java index 268b5b41..24d688df 100644 --- a/src/main/java/no/digipost/signature/client/core/SignatureJob.java +++ b/src/main/java/no/digipost/signature/client/core/SignatureJob.java @@ -5,8 +5,13 @@ public interface SignatureJob { - // TODO: Remove this? - Document getDocument(); + default Document getDocument() { + List documents = getDocuments(); + if (documents.size() > 1) { + throw new RuntimeException("Expected one document, but found "+ documents.size()); + } + return getDocuments().stream().findFirst().orElseThrow(() -> new RuntimeException("Expected one document, but found none")); + }; List getDocuments(); diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index 3c3ba194..7227f746 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -41,7 +41,7 @@ public DirectDocument getDocument() { @Override public List getDocuments() { - return unmodifiableList(Collections.singletonList(getDocument())); + return unmodifiableList(Collections.singletonList(document)); } @Override diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 1cfbebb7..3e5674cd 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -34,12 +34,6 @@ public String getReference() { return reference; } - // TODO: Remove this? Or throw exception if more than one document exists? - @Override - public PortalDocument getDocument() { - return documents.get(0); - } - @Override public List getDocuments() { return documents; From 696e39a0f740f4670e226543b0446ac0e62f69b0 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Thu, 12 Nov 2020 01:06:30 +0100 Subject: [PATCH 06/36] Use XMLHref for hrefs to documents in ASiCE bundle --- .../signature/client/asice/manifest/CreateDirectManifest.java | 3 ++- .../signature/client/asice/manifest/CreatePortalManifest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java index b35d96b2..2d179cbb 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java @@ -3,6 +3,7 @@ import no.digipost.signature.api.xml.XMLDirectDocument; import no.digipost.signature.api.xml.XMLDirectSignatureJobManifest; import no.digipost.signature.api.xml.XMLDirectSigner; +import no.digipost.signature.api.xml.XMLHref; import no.digipost.signature.api.xml.XMLSender; import no.digipost.signature.client.core.AuthenticationLevel; import no.digipost.signature.client.core.IdentifierInSignedDocuments; @@ -42,7 +43,7 @@ Object buildXmlManifest(DirectJob job, Sender sender) { .withDocuments(new XMLDirectDocument() .withTitle(document.getTitle()) .withDescription(document.getMessage()) - .withHref(document.getFileName()) + .withHref(XMLHref.of(document.getFileName())) .withMime(document.getMimeType()) ) .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)) diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index e32e4228..0ae91f63 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -3,6 +3,7 @@ import no.digipost.signature.api.xml.XMLAvailability; import no.digipost.signature.api.xml.XMLEmail; import no.digipost.signature.api.xml.XMLEnabled; +import no.digipost.signature.api.xml.XMLHref; import no.digipost.signature.api.xml.XMLNotifications; import no.digipost.signature.api.xml.XMLNotificationsUsingLookup; import no.digipost.signature.api.xml.XMLPortalDocument; @@ -64,7 +65,7 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .withTitle(document.getTitle()) .withNonsensitiveTitle(document.getNonsensitiveTitle()) .withDescription(document.getMessage()) - .withHref(document.getFileName()) + .withHref(XMLHref.of(document.getFileName())) .withMime(document.getMimeType()) ).collect(Collectors.toList()) ) From ec4c71ae0db77ad244d8fb657f75147931ac711b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Tue, 5 Jan 2021 16:13:25 +0100 Subject: [PATCH 07/36] Move title etc from doc to job for portal jobs --- pom.xml | 2 +- .../asice/manifest/CreatePortalManifest.java | 5 ++- .../signature/client/core/Document.java | 8 +--- .../client/direct/DirectDocument.java | 10 ++++- .../client/portal/PortalDocument.java | 25 ++--------- .../signature/client/portal/PortalJob.java | 44 +++++++++++++++---- .../client/asice/CreateASiCETest.java | 4 +- .../manifest/CreatePortalManifestTest.java | 4 +- .../client/docs/PortalClientUseCases.java | 6 ++- 9 files changed, 60 insertions(+), 48 deletions(-) diff --git a/pom.xml b/pom.xml index dab76cd5..d47f3d3e 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 1.8 - multiple-documents-SNAPSHOT + oppdragstittel-SNAPSHOT 1.7.29 diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index 0ae91f63..889681c8 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -60,11 +60,12 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .withSigners(xmlSigners) .withRequiredAuthentication(job.getRequiredAuthentication().map(AuthenticationLevel::getXmlEnumValue).orElse(null)) .withSender(new XMLSender().withOrganizationNumber(sender.getOrganizationNumber())) + .withTitle(job.getTitle()) + .withNonsensitiveTitle(job.getNonsensitiveTitle().orElse(null)) + .withDescription(job.getDescription().orElse(null)) .withDocuments(documents.stream().map(document -> new XMLPortalDocument() .withTitle(document.getTitle()) - .withNonsensitiveTitle(document.getNonsensitiveTitle()) - .withDescription(document.getMessage()) .withHref(XMLHref.of(document.getFileName())) .withMime(document.getMimeType()) ).collect(Collectors.toList()) diff --git a/src/main/java/no/digipost/signature/client/core/Document.java b/src/main/java/no/digipost/signature/client/core/Document.java index 3bdaf02d..1871a134 100644 --- a/src/main/java/no/digipost/signature/client/core/Document.java +++ b/src/main/java/no/digipost/signature/client/core/Document.java @@ -5,14 +5,12 @@ public abstract class Document implements ASiCEAttachable { private String title; - private String message; private String fileName; private byte[] document; private FileType fileType; - protected Document(final String title, final String message, final String fileName, final FileType fileType, final byte[] document) { + protected Document(final String title, final String fileName, final FileType fileType, final byte[] document) { this.title = title; - this.message = message; this.fileName = fileName; this.fileType = fileType; this.document = document; @@ -37,10 +35,6 @@ public String getTitle() { return title; } - public String getMessage() { - return message; - } - public enum FileType { PDF("application/pdf"), TXT("text/plain"); diff --git a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java index 2595e012..36caeb2e 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java @@ -5,14 +5,22 @@ import static no.digipost.signature.client.core.Document.FileType.PDF; public class DirectDocument extends Document { + + private final String message; + private DirectDocument(String title, String message, String fileName, FileType fileType, byte[] document) { - super(title, message, fileName, fileType, document); + super(title, fileName, fileType, document); + this.message = message; } public static Builder builder(final String title, final String fileName, final byte[] document) { return new Builder(title, fileName, document); } + public String getMessage() { + return message; + } + public static class Builder { private String title; diff --git a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java index e7dfae3e..574899ba 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java @@ -5,15 +5,8 @@ import static no.digipost.signature.client.core.Document.FileType.PDF; public class PortalDocument extends Document { - private final String nonsensitiveTitle; - - private PortalDocument(String title, String nonsensitiveTitle, String message, String fileName, FileType fileType, byte[] document) { - super(title, message, fileName, fileType, document); - this.nonsensitiveTitle = nonsensitiveTitle; - } - - public String getNonsensitiveTitle() { - return nonsensitiveTitle; + private PortalDocument(String title, String fileName, FileType fileType, byte[] document) { + super(title, fileName, fileType, document); } public static Builder builder(final String title, final String fileName, final byte[] document) { @@ -23,10 +16,8 @@ public static Builder builder(final String title, final String fileName, final b public static class Builder { private String title; - private String nonsensitiveTitle; private String fileName; private byte[] document; - private String message; private FileType fileType = PDF; public Builder(final String title, final String fileName, final byte[] document) { @@ -35,23 +26,13 @@ public Builder(final String title, final String fileName, final byte[] document) this.document = document; } - public Builder message(String message) { - this.message = message; - return this; - } - - public Builder nonsensitiveTitle(String nonsensitiveTitle) { - this.nonsensitiveTitle = nonsensitiveTitle; - return this; - } - public Builder fileType(final FileType fileType) { this.fileType = fileType; return this; } public PortalDocument build() { - return new PortalDocument(title, nonsensitiveTitle, message, fileName, fileType, document); + return new PortalDocument(title, fileName, fileType, document); } } } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 3e5674cd..81738188 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -17,6 +17,9 @@ public class PortalJob implements SignatureJob { private final List signers; private final List documents; + private String title; + private Optional nonsensitiveTitle = Optional.empty(); + private Optional description = Optional.empty(); private String reference; private Optional activationTime = Optional.empty(); private Long availableSeconds; @@ -24,7 +27,8 @@ public class PortalJob implements SignatureJob { private Optional requiredAuthentication = Optional.empty(); private Optional identifierInSignedDocuments = Optional.empty(); - private PortalJob(List signers, List documents) { + private PortalJob(String title, List signers, List documents) { + this.title = title; this.signers = unmodifiableList(new ArrayList<>(signers)); this.documents = unmodifiableList(new ArrayList<>(documents)); } @@ -67,16 +71,28 @@ public Long getAvailableSeconds() { } - public static Builder builder(PortalDocument document, PortalSigner... signers) { - return builder(Collections.singletonList(document), Arrays.asList(signers)); + public static Builder builder(String title, PortalDocument document, PortalSigner... signers) { + return builder(title, Collections.singletonList(document), Arrays.asList(signers)); } - public static Builder builder(PortalDocument document, List signers) { - return builder(Collections.singletonList(document), signers); + public static Builder builder(String title, PortalDocument document, List signers) { + return builder(title, Collections.singletonList(document), signers); } - public static Builder builder(List documents, List signers) { - return new Builder(signers, documents); + public static Builder builder(String title, List documents, List signers) { + return new Builder(title, signers, documents); + } + + public String getTitle() { + return title; + } + + public Optional getNonsensitiveTitle() { + return nonsensitiveTitle; + } + + public Optional getDescription() { + return description; } public static class Builder implements JobCustomizations { @@ -84,8 +100,8 @@ public static class Builder implements JobCustomizations { private final PortalJob target; private boolean built = false; - private Builder(List signers, List documents) { - target = new PortalJob(signers, documents); + private Builder(String title, List signers, List documents) { + target = new PortalJob(title, signers, documents); } @Override @@ -127,6 +143,16 @@ public Builder availableFor(long duration, TimeUnit unit) { return this; } + public Builder withNonsensitiveTitle(String nonsensitiveTitle) { + target.nonsensitiveTitle = Optional.of(nonsensitiveTitle); + return this; + } + + public Builder withDescription(String description) { + target.description = Optional.of(description); + return this; + } + public PortalJob build() { if (built) throw new IllegalStateException("Can't build twice"); built = true; diff --git a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java index 92dafb3c..c38cd410 100644 --- a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java +++ b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java @@ -62,7 +62,6 @@ public static void initTempFolder() throws URISyntaxException, IOException { .build(); private static final PortalDocument PORTAL_DOCUMENT = PortalDocument.builder("Title", "file.txt", "hello".getBytes()) - .message("Message") .fileType(Document.FileType.TXT) .build(); @@ -78,8 +77,9 @@ public void create_direct_asice_and_write_to_disk() throws IOException { @Test public void create_portal_asice_and_write_to_disk() throws IOException { - PortalJob job = PortalJob.builder(PORTAL_DOCUMENT, PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build()) + PortalJob job = PortalJob.builder("Job title", PORTAL_DOCUMENT, PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build()) .withReference("portal job") + .withDescription("Message") .withActivationTime(clock.instant()) .availableFor(30, DAYS) .build(); diff --git a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java index 79e513e0..5ec9c12c 100644 --- a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java +++ b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java @@ -26,13 +26,13 @@ void accept_valid_manifest() { CreatePortalManifest createManifest = new CreatePortalManifest(clock); PortalDocument document = PortalDocument.builder("Title", "file.txt", "hello".getBytes()) - .message("Message") .fileType(Document.FileType.TXT) .build(); - PortalJob job = PortalJob.builder(document, Collections.singletonList(PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build())) + PortalJob job = PortalJob.builder("Job title", document, Collections.singletonList(PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build())) .withActivationTime(clock.instant()) .availableFor(30, DAYS) + .withDescription("Message") .withIdentifierInSignedDocuments(IdentifierInSignedDocuments.PERSONAL_IDENTIFICATION_NUMBER_AND_NAME) .build(); assertThat(createManifest, where(__ -> __.createManifest(job, new Sender("123456789")), instanceOf(Manifest.class))); diff --git a/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java b/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java index 089f0500..d9fcd61e 100644 --- a/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java +++ b/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java @@ -27,9 +27,10 @@ static void create_and_send_signature_job() { PortalClient client = new PortalClient(clientConfiguration); byte[] documentBytes = null; // Loaded document bytes - PortalDocument document = PortalDocument.builder("Subject", "document.pdf", documentBytes).build(); + PortalDocument document = PortalDocument.builder("Document title", "document.pdf", documentBytes).build(); PortalJob portalJob = PortalJob.builder( + "Job title", document, PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build(), @@ -95,9 +96,10 @@ static void specifying_queues() { Sender sender = new Sender("000000000", PollingQueue.of("CustomPollingQueue")); byte[] documentBytes = null; // Loaded document bytes - PortalDocument document = PortalDocument.builder("Subject", "document.pdf", documentBytes).build(); + PortalDocument document = PortalDocument.builder("Document title", "document.pdf", documentBytes).build(); PortalJob portalJob = PortalJob.builder( + "Job title", document, PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build(), From d277be4f0cfa2387a1e900dd4e4864d95a4f9a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Tue, 5 Jan 2021 16:18:59 +0100 Subject: [PATCH 08/36] Stop using ::set-env --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 01ebc156..0393cabc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,7 +28,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Set release version - run: echo ::set-env name=RELEASE_VERSION::$(echo ${GITHUB_REF:11}"-SNAPSHOT") + run: echo "RELEASE_VERSION=${GITHUB_REF:11}-SNAPSHOT" >> $GITHUB_ENV - name: Build and deploy to Sonatype snapshot uses: digipost/action-maven-publish@1.1.0 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 29e92841..4ecf5560 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: - name: Check out Git repository uses: actions/checkout@v1 - name: Set release version - run: echo ::set-env name=RELEASE_VERSION::$(echo ${GITHUB_REF:10}) + run: echo "RELEASE_VERSION=${GITHUB_REF:10}" >> $GITHUB_ENV - name: Release to Central Repository uses: digipost/action-maven-publish@1.1.0 with: From 277ac8e3aaca2e68e9363dca9820ac139be1561a Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Tue, 12 Jan 2021 17:19:09 +0100 Subject: [PATCH 09/36] Just single document in direct job API --- pom.xml | 2 +- .../signature/client/asice/manifest/CreateDirectManifest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d47f3d3e..9e51c87b 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 1.8 - oppdragstittel-SNAPSHOT + multiple-documents-with-legacy-single-document-support-SNAPSHOT 1.7.29 diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java index 2d179cbb..f7e97a7d 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java @@ -40,7 +40,7 @@ Object buildXmlManifest(DirectJob job, Sender sender) { .withSigners(signers) .withRequiredAuthentication(job.getRequiredAuthentication().map(AuthenticationLevel::getXmlEnumValue).orElse(null)) .withSender(new XMLSender().withOrganizationNumber(sender.getOrganizationNumber())) - .withDocuments(new XMLDirectDocument() + .withDocument(new XMLDirectDocument() .withTitle(document.getTitle()) .withDescription(document.getMessage()) .withHref(XMLHref.of(document.getFileName())) From 2773aa86f25043d4c7ece1760ac22fc64238067e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Wed, 13 Jan 2021 08:56:30 +0100 Subject: [PATCH 10/36] Use oppdragstittel-SNAPSHOT api spec --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9e51c87b..d47f3d3e 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 1.8 - multiple-documents-with-legacy-single-document-support-SNAPSHOT + oppdragstittel-SNAPSHOT 1.7.29 From 2af6c49f8c67648ce249f85bd60d6c2c977d768e Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Thu, 14 Jan 2021 10:08:39 +0100 Subject: [PATCH 11/36] Upgrade dependencies --- pom.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index d47f3d3e..8ccbda7a 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ 1.8 1.8 oppdragstittel-SNAPSHOT - 1.7.29 + 1.7.30 @@ -38,21 +38,21 @@ org.springframework spring-framework-bom - 5.2.1.RELEASE + 5.3.3 pom import org.glassfish.jersey jersey-bom - 2.29.1 + 2.33 pom import org.junit junit-bom - 5.6.0-M1 + 5.7.0 pom import @@ -74,7 +74,7 @@ org.apache.httpcomponents httpclient - 4.5.10 + 4.5.13 commons-logging @@ -85,7 +85,7 @@ org.apache.httpcomponents httpcore - 4.4.12 + 4.4.14 jakarta.annotation @@ -118,13 +118,13 @@ commons-io commons-io - 2.6 + 2.8.0 test commons-codec commons-codec - 1.13 + 1.15 org.springframework @@ -137,12 +137,12 @@ org.springframework.ws spring-xml - 3.0.8.RELEASE + 3.0.10.RELEASE org.apache.commons commons-lang3 - 3.9 + 3.11 @@ -182,7 +182,7 @@ nl.jqno.equalsverifier equalsverifier - 3.1.10 + 3.5.1 test @@ -206,7 +206,7 @@ no.digipost digg - 0.22 + 0.25 test From f165f0f48970099b700d1bc7acee86dd3710ec75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Thu, 14 Jan 2021 14:25:29 +0100 Subject: [PATCH 12/36] Update api version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8ccbda7a..750573e1 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 1.8 - oppdragstittel-SNAPSHOT + multiple-documents-080612f 1.7.30 From fb238735331383ad6afb9fb47f973d00bb3b63da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20St=C3=B8a?= Date: Thu, 14 Jan 2021 14:35:41 +0100 Subject: [PATCH 13/36] Use SNAPSHOT for multi-doc api spec --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 750573e1..88a63db4 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 1.8 - multiple-documents-080612f + multiple-documents-SNAPSHOT 1.7.30 From 04c9ee50650d3499c09662bcff4a5ec1a902a854 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Fri, 22 Jan 2021 20:16:24 +0100 Subject: [PATCH 14/36] Use on API spec 2.8 release candidate 1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 88a63db4..4029697d 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.8 1.8 - multiple-documents-SNAPSHOT + 2.8-RC1 1.7.30 From 9a4d34f028578163aca7ce56fb06981e161d61a2 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Fri, 22 Jan 2021 21:09:54 +0100 Subject: [PATCH 15/36] Upgrade equalsverifier --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4029697d..b441beee 100644 --- a/pom.xml +++ b/pom.xml @@ -182,7 +182,7 @@ nl.jqno.equalsverifier equalsverifier - 3.5.1 + 3.5.2 test From 95554a71eb1959d5c11a2d0aa31cf945f689ee0a Mon Sep 17 00:00:00 2001 From: Sara Eriksen Date: Thu, 4 Feb 2021 13:14:28 +0100 Subject: [PATCH 16/36] Add possibility for multiple documents for direct jobs --- pom.xml | 2 +- .../asice/manifest/CreateDirectManifest.java | 16 +++--- .../client/direct/DirectDocument.java | 17 +----- .../signature/client/direct/DirectJob.java | 53 ++++++++++++------- .../client/asice/CreateASiCETest.java | 7 ++- .../manifest/CreateDirectManifestTest.java | 2 +- .../client/docs/DirectClientUseCases.java | 8 +-- 7 files changed, 55 insertions(+), 50 deletions(-) diff --git a/pom.xml b/pom.xml index 46a72d08..e4cd3152 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ 1.8 1.8 set_with_-Dproject.previousVersion=X.Y - 2.8-RC1 + multiple-documents-SNAPSHOT 1.7.30 diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java index f7e97a7d..130b9578 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java @@ -16,12 +16,13 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class CreateDirectManifest extends ManifestCreator { @Override Object buildXmlManifest(DirectJob job, Sender sender) { - DirectDocument document = job.getDocument(); + List documents = job.getDocuments(); List signers = new ArrayList<>(); for (DirectSigner signer : job.getSigners()) { @@ -40,11 +41,14 @@ Object buildXmlManifest(DirectJob job, Sender sender) { .withSigners(signers) .withRequiredAuthentication(job.getRequiredAuthentication().map(AuthenticationLevel::getXmlEnumValue).orElse(null)) .withSender(new XMLSender().withOrganizationNumber(sender.getOrganizationNumber())) - .withDocument(new XMLDirectDocument() - .withTitle(document.getTitle()) - .withDescription(document.getMessage()) - .withHref(XMLHref.of(document.getFileName())) - .withMime(document.getMimeType()) + .withTitle(job.getTitle()) + .withDescription(job.getDescription().orElse(null)) + .withDocuments(documents.stream().map(document -> + new XMLDirectDocument() + .withTitle(document.getTitle()) + .withHref(XMLHref.of(document.getFileName())) + .withMime(document.getMimeType()) + ).collect(Collectors.toList()) ) .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)) ; diff --git a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java index 36caeb2e..110e72e6 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java @@ -6,27 +6,19 @@ public class DirectDocument extends Document { - private final String message; - - private DirectDocument(String title, String message, String fileName, FileType fileType, byte[] document) { + private DirectDocument(String title, String fileName, FileType fileType, byte[] document) { super(title, fileName, fileType, document); - this.message = message; } public static Builder builder(final String title, final String fileName, final byte[] document) { return new Builder(title, fileName, document); } - public String getMessage() { - return message; - } - public static class Builder { private String title; private String fileName; private byte[] document; - private String message; private FileType fileType = PDF; public Builder(final String title, final String fileName, final byte[] document) { @@ -35,18 +27,13 @@ public Builder(final String title, final String fileName, final byte[] document) this.document = document; } - public Builder message(String message) { - this.message = message; - return this; - } - public Builder fileType(final FileType fileType) { this.fileType = fileType; return this; } public DirectDocument build() { - return new DirectDocument(title, message, fileName, fileType, document); + return new DirectDocument(title, fileName, fileType, document); } } } diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index 7227f746..0795b5bc 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -12,7 +12,9 @@ public class DirectJob implements SignatureJob, WithExitUrls { private String reference; private List signers; - private DirectDocument document; + private List documents; + private String title; + private Optional description = Optional.empty(); private URI completionUrl; private URI rejectionUrl; private URI errorUrl; @@ -21,9 +23,10 @@ public class DirectJob implements SignatureJob, WithExitUrls { private Optional requiredAuthentication = Optional.empty(); private Optional identifierInSignedDocuments = Optional.empty(); - private DirectJob(List signers, DirectDocument document, URI completionUrl, URI rejectionUrl, URI errorUrl) { + private DirectJob(String title, List signers, List documents, URI completionUrl, URI rejectionUrl, URI errorUrl) { + this.title = title; this.signers = unmodifiableList(new ArrayList<>(signers)); - this.document = document; + this.documents = unmodifiableList(new ArrayList<>(documents)); this.completionUrl = completionUrl; this.rejectionUrl = rejectionUrl; this.errorUrl = errorUrl; @@ -35,13 +38,8 @@ public String getReference() { } @Override - public DirectDocument getDocument() { - return document; - } - - @Override - public List getDocuments() { - return unmodifiableList(Collections.singletonList(document)); + public List getDocuments() { + return documents; } @Override @@ -93,13 +91,12 @@ public Optional getStatusRetrievalMethod() { * @param signers The {@link DirectSigner DirectSigners} of the document. * * @return a builder to further customize the job - * @see DirectJob#builder(DirectDocument, WithExitUrls, List) + * @see DirectJob#builder(String, DirectDocument, WithExitUrls, List) */ - public static Builder builder(DirectDocument document, WithExitUrls hasExitUrls, DirectSigner... signers) { - return builder(document, hasExitUrls, Arrays.asList(signers)); + public static Builder builder(String title, DirectDocument document, WithExitUrls hasExitUrls, DirectSigner... signers) { + return builder(title, Collections.singletonList(document), hasExitUrls, Arrays.asList(signers)); } - /** * Create a new DirectJob. * @@ -110,19 +107,32 @@ public static Builder builder(DirectDocument document, WithExitUrls hasExitUrls, * @param signers The {@link DirectSigner DirectSigners} of the document. * * @return a builder to further customize the job - * @see DirectJob#builder(DirectDocument, WithExitUrls, DirectSigner...) + * @see DirectJob#builder(String, DirectDocument, WithExitUrls, DirectSigner...) */ - public static Builder builder(DirectDocument document, WithExitUrls hasExitUrls, List signers) { - return new Builder(signers, document, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); + public static Builder builder(String title, DirectDocument document, WithExitUrls hasExitUrls, List signers) { + return new Builder(title, signers, Collections.singletonList(document), hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); + } + + public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, List signers) { + return new Builder(title, signers, documents, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); + } + + public String getTitle() { + return title; + } + + public Optional getDescription() { + return description; } + public static class Builder implements JobCustomizations { private final DirectJob target; private boolean built = false; - private Builder(List signers, DirectDocument document, URI completionUrl, URI rejectionUrl, URI errorUrl) { - target = new DirectJob(signers, document, completionUrl, rejectionUrl, errorUrl); + private Builder(String title, List signers, List documents, URI completionUrl, URI rejectionUrl, URI errorUrl) { + target = new DirectJob(title, signers, documents, completionUrl, rejectionUrl, errorUrl); } @Override @@ -130,6 +140,11 @@ public Builder withReference(UUID uuid) { return withReference(uuid.toString()); } + public Builder withDescription(String description) { + target.description = Optional.of(description); + return this; + } + @Override public Builder withReference(String reference) { target.reference = reference; diff --git a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java index c38cd410..0bf93b12 100644 --- a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java +++ b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java @@ -56,19 +56,18 @@ public static void initTempFolder() throws URISyntaxException, IOException { private static Path dumpFolder; - private static final DirectDocument DIRECT_DOCUMENT = DirectDocument.builder("Title", "file.txt", "hello".getBytes()) - .message("Message") + private static final DirectDocument DIRECT_DOCUMENT = DirectDocument.builder("Document title", "file.txt", "hello".getBytes()) .fileType(Document.FileType.TXT) .build(); - private static final PortalDocument PORTAL_DOCUMENT = PortalDocument.builder("Title", "file.txt", "hello".getBytes()) + private static final PortalDocument PORTAL_DOCUMENT = PortalDocument.builder("Document title", "file.txt", "hello".getBytes()) .fileType(Document.FileType.TXT) .build(); @Test public void create_direct_asice_and_write_to_disk() throws IOException { - DirectJob job = DirectJob.builder(DIRECT_DOCUMENT, singleExitUrl(URI.create("https://job.well.done.org")), DirectSigner.withPersonalIdentificationNumber("12345678910").build()) + DirectJob job = DirectJob.builder("Job title", DIRECT_DOCUMENT, singleExitUrl(URI.create("https://job.well.done.org")), DirectSigner.withPersonalIdentificationNumber("12345678910").build()) .withReference("direct job") .build(); diff --git a/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java b/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java index c701c7c6..139041f4 100644 --- a/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java +++ b/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java @@ -22,11 +22,11 @@ void accept_valid_manifest() { CreateDirectManifest createManifest = new CreateDirectManifest(); DirectDocument document = DirectDocument.builder("Title", "file.txt", "hello".getBytes()) - .message("Message") .fileType(Document.FileType.TXT) .build(); DirectJob job = DirectJob.builder( + "Job title", document, ExitUrls.of(URI.create("http://localhost/signed"), URI.create("http://localhost/canceled"), URI.create("http://localhost/failed")), DirectSigner.withPersonalIdentificationNumber("12345678910").build()) diff --git a/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java b/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java index 3a48f113..adc7e3a1 100644 --- a/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java +++ b/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java @@ -32,7 +32,7 @@ static void create_and_send_signature_job() { DirectClient client = new DirectClient(clientConfiguration); byte[] documentBytes = null; // Loaded document bytes - DirectDocument document = DirectDocument.builder("Subject", "document.pdf", documentBytes).build(); + DirectDocument document = DirectDocument.builder("Document title", "document.pdf", documentBytes).build(); ExitUrls exitUrls = ExitUrls.of( URI.create("http://sender.org/onCompletion"), @@ -41,7 +41,7 @@ static void create_and_send_signature_job() { ); DirectSigner signer = DirectSigner.withPersonalIdentificationNumber("12345678910").build(); - DirectJob directJob = DirectJob.builder(document, exitUrls, signer).build(); + DirectJob directJob = DirectJob.builder("Job title", document, exitUrls, signer).build(); DirectJobResponse directJobResponse = client.create(directJob); } @@ -102,7 +102,7 @@ static void get_signature_job_status() { static void create_job_and_status_by_polling() { DirectClient client = null; // As initialized earlier - DirectJob directJob = DirectJob.builder(document, exitUrls, signer) + DirectJob directJob = DirectJob.builder("Job title", document, exitUrls, signer) .retrieveStatusBy(StatusRetrievalMethod.POLLING) .build(); @@ -148,7 +148,7 @@ static void specifying_queues() { DirectClient client = null; // As initialized earlier Sender sender = new Sender("000000000", PollingQueue.of("CustomPollingQueue")); - DirectJob directJob = DirectJob.builder(document, exitUrls, signer) + DirectJob directJob = DirectJob.builder("Job title", document, exitUrls, signer) .retrieveStatusBy(StatusRetrievalMethod.POLLING).withSender(sender) .build(); From 2823b9327872125404ea19049f72fb011ffc8c31 Mon Sep 17 00:00:00 2001 From: Sara Eriksen Date: Thu, 4 Feb 2021 13:45:08 +0100 Subject: [PATCH 17/36] Add builder for one direct signer and multiple documents --- .../java/no/digipost/signature/client/direct/DirectJob.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index 0795b5bc..d450db0a 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -117,6 +117,10 @@ public static Builder builder(String title, List documents, With return new Builder(title, signers, documents, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); } + public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, DirectSigner... signers) { + return new Builder(title, Arrays.asList(signers), documents, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); + } + public String getTitle() { return title; } From 20247f4e2a037fd86f1855ea2e2aeca8dcc824a3 Mon Sep 17 00:00:00 2001 From: Sara Eriksen Date: Thu, 4 Feb 2021 14:11:15 +0100 Subject: [PATCH 18/36] Use builder method instead of returning new Builder --- .../no/digipost/signature/client/direct/DirectJob.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index d450db0a..7de492b8 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -110,15 +110,15 @@ public static Builder builder(String title, DirectDocument document, WithExitUrl * @see DirectJob#builder(String, DirectDocument, WithExitUrls, DirectSigner...) */ public static Builder builder(String title, DirectDocument document, WithExitUrls hasExitUrls, List signers) { - return new Builder(title, signers, Collections.singletonList(document), hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); + return builder(title, Collections.singletonList(document), hasExitUrls, signers); } - public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, List signers) { - return new Builder(title, signers, documents, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); + public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, DirectSigner... signers) { + return builder(title, documents, hasExitUrls, Arrays.asList(signers)); } - public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, DirectSigner... signers) { - return new Builder(title, Arrays.asList(signers), documents, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); + public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, List signers) { + return new Builder(title, signers, documents, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); } public String getTitle() { From b6f2f79a882b5cab561261086c09745823a86a9c Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Mon, 8 Feb 2021 10:11:36 +0100 Subject: [PATCH 19/36] API Specification v2.8-RC2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e4cd3152..51701559 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ 1.8 1.8 set_with_-Dproject.previousVersion=X.Y - multiple-documents-SNAPSHOT + 2.8-RC2 1.7.30 From 14bfcf25a08f611d1bc99ef6b2b1578bb453b5a1 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 18:09:14 +0200 Subject: [PATCH 20/36] Remove temporary snapshot repo definition --- pom.xml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/pom.xml b/pom.xml index 51701559..1315ff16 100644 --- a/pom.xml +++ b/pom.xml @@ -7,19 +7,6 @@ signature-api-client-java LOCAL-SNAPSHOT - - - oss.sonatype.org-snapshot - http://oss.sonatype.org/content/repositories/snapshots - - false - - - true - - - - no.digipost digipost-open-super-pom From 5dc66397586ee6dfe5a041f8d2503dd39f4d6fe4 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 18:17:21 +0200 Subject: [PATCH 21/36] Upgrade dependencies --- NOTICE | 3 +-- pom.xml | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/NOTICE b/NOTICE index 53e7cfef..f6aa60f9 100644 --- a/NOTICE +++ b/NOTICE @@ -12,9 +12,8 @@ This software includes third party software subject to the following licenses: Apache Commons Lang under Apache License, Version 2.0 Apache HttpClient under Apache License, Version 2.0 Apache HttpCore under Apache License, Version 2.0 - Extended StAX API under Eclipse Distribution License - v 1.0 - fastinfoset under Apache License, Version 2.0 or Eclipse Distribution License - v 1.0 istack common utility code runtime under Eclipse Distribution License - v 1.0 + Jakarta Activation under EDL 1.0 Jakarta Annotations API under EPL 2.0 or GPL2 w/ CPE jakarta.ws.rs-api under EPL 2.0 or GPL2 w/ CPE jakarta.xml.bind-api under Eclipse Distribution License - v 1.0 diff --git a/pom.xml b/pom.xml index 1315ff16..9e8937ea 100644 --- a/pom.xml +++ b/pom.xml @@ -26,21 +26,21 @@ org.springframework spring-framework-bom - 5.3.3 + 5.3.8 pom import org.glassfish.jersey jersey-bom - 2.33 + 2.34 pom import org.junit junit-bom - 5.7.0 + 5.8.0-M1 pom import @@ -88,7 +88,7 @@ org.glassfish.jaxb jaxb-runtime - 2.3.2 + 2.3.4 runtime @@ -106,7 +106,7 @@ commons-io commons-io - 2.8.0 + 2.9.0 test @@ -125,12 +125,12 @@ org.springframework.ws spring-xml - 3.0.10.RELEASE + 3.1.1 org.apache.commons commons-lang3 - 3.11 + 3.12.0 @@ -170,7 +170,7 @@ nl.jqno.equalsverifier equalsverifier - 3.5.2 + 3.6.1 test @@ -194,7 +194,7 @@ no.digipost digg - 0.25 + 0.29 test @@ -227,12 +227,12 @@ org.glassfish.jaxb jaxb-runtime - 2.3.2 + 2.3.4 jakarta.xml.bind jakarta.xml.bind-api - 2.3.2 + 2.3.3 From ec3fe9882328a9b337b6e3c029080c8f57ab2edd Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 18:23:51 +0200 Subject: [PATCH 22/36] Upgrade Maven plugins --- pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 9e8937ea..1a143efb 100644 --- a/pom.xml +++ b/pom.xml @@ -243,7 +243,7 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.15.2 + 0.15.3 @@ -271,7 +271,7 @@ maven-surefire-plugin - 3.0.0-M4 + 3.0.0-M5 maven-deploy-plugin @@ -283,7 +283,7 @@ maven-dependency-plugin - 3.1.1 + 3.1.2 maven-install-plugin @@ -291,15 +291,15 @@ maven-resources-plugin - 3.1.0 + 3.2.0 maven-site-plugin - 3.8.2 + 3.9.1 maven-javadoc-plugin - 3.1.1 + 3.2.0 maven-jar-plugin @@ -331,7 +331,7 @@ org.codehaus.mojo versions-maven-plugin - 2.7 + 2.8.1 From 677cd39271518100b777bdb9fbc4aa5b8fed594d Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 18:25:08 +0200 Subject: [PATCH 23/36] Add line break Just to avoid unnecessary changed file in pull-request --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d28f0adb..f6fe4e73 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,6 +36,7 @@ jobs: TAG=${GITHUB_REF#refs/heads/}-SNAPSHOT fi echo ::set-output name=version::${TAG//\//-} + deploy_snapshot: if: startsWith(github.ref, 'refs/heads/') needs: makeversion From 87457d454462209793de73a6cf8ce01ddd37ec9e Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 23:25:57 +0200 Subject: [PATCH 24/36] Remove method to get singular document from job --- .../no/digipost/signature/client/core/SignatureJob.java | 8 -------- .../digipost/signature/client/asice/CreateASiCETest.java | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/core/SignatureJob.java b/src/main/java/no/digipost/signature/client/core/SignatureJob.java index 24d688df..31858b03 100644 --- a/src/main/java/no/digipost/signature/client/core/SignatureJob.java +++ b/src/main/java/no/digipost/signature/client/core/SignatureJob.java @@ -5,14 +5,6 @@ public interface SignatureJob { - default Document getDocument() { - List documents = getDocuments(); - if (documents.size() > 1) { - throw new RuntimeException("Expected one document, but found "+ documents.size()); - } - return getDocuments().stream().findFirst().orElseThrow(() -> new RuntimeException("Expected one document, but found none")); - }; - List getDocuments(); Optional getSender(); diff --git a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java index 0bf93b12..443dc4eb 100644 --- a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java +++ b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java @@ -86,7 +86,7 @@ public void create_portal_asice_and_write_to_disk() throws IOException { create_document_bundle_and_dump_to_disk(new CreatePortalManifest(clock), job); } - private void create_document_bundle_and_dump_to_disk(ManifestCreator manifestCreator, JOB job) throws IOException { + private static void create_document_bundle_and_dump_to_disk(ManifestCreator manifestCreator, JOB job) throws IOException { CreateASiCE aSiCECreator = new CreateASiCE<>(manifestCreator, ClientConfiguration.builder(CLIENT_KEYSTORE) .globalSender(new Sender("123456789")) .enableDocumentBundleDiskDump(dumpFolder) @@ -104,7 +104,7 @@ private void create_document_bundle_and_dump_to_disk( fileNames.add(entry.getName()); } } - assertThat(fileNames, hasItem(job.getDocument().getFileName())); + assertThat(fileNames, hasItem(job.getDocuments().get(0).getFileName())); assertThat(fileNames, hasItem("manifest.xml")); assertThat(fileNames, hasItem("META-INF/signatures.xml")); } From 30421a7c3eda1dabea9fa1eb04b18bf0c69d262b Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 23:30:18 +0200 Subject: [PATCH 25/36] Some minor code reformatting --- .../asice/manifest/CreateDirectManifest.java | 18 ++++++------- .../asice/manifest/CreatePortalManifest.java | 25 +++++++------------ .../signature/client/direct/DirectJob.java | 12 +++++++-- .../signature/client/portal/PortalJob.java | 7 +++++- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java index 130b9578..3eaa5b00 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java @@ -10,20 +10,18 @@ import no.digipost.signature.client.core.OnBehalfOf; import no.digipost.signature.client.core.Sender; import no.digipost.signature.client.core.SignatureType; -import no.digipost.signature.client.direct.DirectDocument; import no.digipost.signature.client.direct.DirectJob; import no.digipost.signature.client.direct.DirectSigner; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; public class CreateDirectManifest extends ManifestCreator { @Override Object buildXmlManifest(DirectJob job, Sender sender) { - List documents = job.getDocuments(); - List signers = new ArrayList<>(); for (DirectSigner signer : job.getSigners()) { XMLDirectSigner xmlSigner = new XMLDirectSigner() @@ -43,14 +41,12 @@ Object buildXmlManifest(DirectJob job, Sender sender) { .withSender(new XMLSender().withOrganizationNumber(sender.getOrganizationNumber())) .withTitle(job.getTitle()) .withDescription(job.getDescription().orElse(null)) - .withDocuments(documents.stream().map(document -> - new XMLDirectDocument() + .withDocuments(job.getDocuments().stream() + .map(document -> new XMLDirectDocument() .withTitle(document.getTitle()) .withHref(XMLHref.of(document.getFileName())) - .withMime(document.getMimeType()) - ).collect(Collectors.toList()) - ) - .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)) - ; + .withMime(document.getMimeType())) + .collect(toList())) + .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)); } } diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index 889681c8..82b038ff 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -18,7 +18,6 @@ import no.digipost.signature.client.core.SignatureType; import no.digipost.signature.client.portal.Notifications; import no.digipost.signature.client.portal.NotificationsUsingLookup; -import no.digipost.signature.client.portal.PortalDocument; import no.digipost.signature.client.portal.PortalJob; import no.digipost.signature.client.portal.PortalSigner; @@ -26,8 +25,8 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; +import static java.util.stream.Collectors.toList; import static no.digipost.signature.client.core.exceptions.SignerNotSpecifiedException.SIGNER_NOT_SPECIFIED; public class CreatePortalManifest extends ManifestCreator { @@ -43,7 +42,6 @@ Object buildXmlManifest(PortalJob job, Sender sender) { List xmlSigners = new ArrayList<>(); for (PortalSigner signer : job.getSigners()) { XMLPortalSigner xmlPortalSigner = generateSigner(signer); - if (signer.getNotifications() != null) { xmlPortalSigner.setNotifications(generateNotifications(signer.getNotifications())); } else if (signer.getNotificationsUsingLookup() != null) { @@ -52,8 +50,6 @@ Object buildXmlManifest(PortalJob job, Sender sender) { xmlSigners.add(xmlPortalSigner); } - List documents = job.getDocuments(); - ZonedDateTime activationTime = job.getActivationTime().map(activation -> activation.atZone(clock.getZone())).orElse(null); return new XMLPortalSignatureJobManifest() @@ -63,19 +59,16 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .withTitle(job.getTitle()) .withNonsensitiveTitle(job.getNonsensitiveTitle().orElse(null)) .withDescription(job.getDescription().orElse(null)) - .withDocuments(documents.stream().map(document -> - new XMLPortalDocument() - .withTitle(document.getTitle()) - .withHref(XMLHref.of(document.getFileName())) - .withMime(document.getMimeType()) - ).collect(Collectors.toList()) - ) + .withDocuments(job.getDocuments().stream() + .map(document -> new XMLPortalDocument() + .withTitle(document.getTitle()) + .withHref(XMLHref.of(document.getFileName())) + .withMime(document.getMimeType())) + .collect(toList())) .withAvailability(new XMLAvailability() .withActivationTime(activationTime) - .withAvailableSeconds(job.getAvailableSeconds()) - ) - .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)) - ; + .withAvailableSeconds(job.getAvailableSeconds())) + .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)); } private XMLPortalSigner generateSigner(PortalSigner signer) { diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index 7de492b8..442914b4 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -1,10 +1,18 @@ package no.digipost.signature.client.direct; -import no.digipost.signature.client.core.*; +import no.digipost.signature.client.core.AuthenticationLevel; +import no.digipost.signature.client.core.IdentifierInSignedDocuments; +import no.digipost.signature.client.core.Sender; +import no.digipost.signature.client.core.SignatureJob; import no.digipost.signature.client.core.internal.JobCustomizations; import java.net.URI; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; import static java.util.Collections.unmodifiableList; diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 81738188..14252827 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -7,7 +7,12 @@ import no.digipost.signature.client.core.internal.JobCustomizations; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; import java.util.concurrent.TimeUnit; import static java.util.Collections.unmodifiableList; From 3977dd9a2550c81c38200346adb5ec3ead88fd9e Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 23:42:24 +0200 Subject: [PATCH 26/36] Add a few final modifiers --- .../signature/client/direct/DirectJob.java | 14 +++++++------- .../signature/client/portal/PortalJob.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index 442914b4..b3c2a940 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -18,14 +18,14 @@ public class DirectJob implements SignatureJob, WithExitUrls { - private String reference; - private List signers; - private List documents; - private String title; + private final List signers; + private final List documents; + private final String title; + private final URI completionUrl; + private final URI rejectionUrl; + private final URI errorUrl; private Optional description = Optional.empty(); - private URI completionUrl; - private URI rejectionUrl; - private URI errorUrl; + private String reference; private Optional sender = Optional.empty(); private Optional statusRetrievalMethod = Optional.empty(); private Optional requiredAuthentication = Optional.empty(); diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 14252827..1c849c56 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -22,7 +22,7 @@ public class PortalJob implements SignatureJob { private final List signers; private final List documents; - private String title; + private final String title; private Optional nonsensitiveTitle = Optional.empty(); private Optional description = Optional.empty(); private String reference; From 22834666bc0d33a5dbf42a917559219914bed57e Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Wed, 9 Jun 2021 23:50:27 +0200 Subject: [PATCH 27/36] Change to Java Time API for job availability --- .../client/asice/manifest/CreatePortalManifest.java | 2 +- .../digipost/signature/client/portal/PortalJob.java | 12 ++++++------ .../signature/client/asice/CreateASiCETest.java | 4 ++-- .../asice/manifest/CreatePortalManifestTest.java | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index 82b038ff..6ba87cab 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -67,7 +67,7 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .collect(toList())) .withAvailability(new XMLAvailability() .withActivationTime(activationTime) - .withAvailableSeconds(job.getAvailableSeconds())) + .withAvailableSeconds(job.getAvailable().getSeconds())) .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)); } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 1c849c56..952e2591 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -6,6 +6,7 @@ import no.digipost.signature.client.core.SignatureJob; import no.digipost.signature.client.core.internal.JobCustomizations; +import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; @@ -13,7 +14,6 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.TimeUnit; import static java.util.Collections.unmodifiableList; @@ -27,7 +27,7 @@ public class PortalJob implements SignatureJob { private Optional description = Optional.empty(); private String reference; private Optional activationTime = Optional.empty(); - private Long availableSeconds; + private Duration available; private Optional sender = Optional.empty(); private Optional requiredAuthentication = Optional.empty(); private Optional identifierInSignedDocuments = Optional.empty(); @@ -71,8 +71,8 @@ public Optional getActivationTime() { return activationTime; } - public Long getAvailableSeconds() { - return availableSeconds; + public Duration getAvailable() { + return available; } @@ -143,8 +143,8 @@ public Builder withActivationTime(Instant activationTime) { return this; } - public Builder availableFor(long duration, TimeUnit unit) { - target.availableSeconds = unit.toSeconds(duration); + public Builder availableFor(Duration duration) { + target.available = duration; return this; } diff --git a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java index 443dc4eb..f896346a 100644 --- a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java +++ b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java @@ -26,6 +26,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.Clock; +import java.time.Duration; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -34,7 +35,6 @@ import java.util.zip.ZipInputStream; import static java.nio.file.Files.newDirectoryStream; -import static java.util.concurrent.TimeUnit.DAYS; import static no.digipost.signature.client.TestKonfigurasjon.CLIENT_KEYSTORE; import static no.digipost.signature.client.asice.DumpDocumentBundleToDisk.TIMESTAMP_PATTERN; import static no.digipost.signature.client.asice.DumpDocumentBundleToDisk.referenceFilenamePart; @@ -80,7 +80,7 @@ public void create_portal_asice_and_write_to_disk() throws IOException { .withReference("portal job") .withDescription("Message") .withActivationTime(clock.instant()) - .availableFor(30, DAYS) + .availableFor(Duration.ofDays(30)) .build(); create_document_bundle_and_dump_to_disk(new CreatePortalManifest(clock), job); diff --git a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java index adfd447e..5c9b3da1 100644 --- a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java +++ b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java @@ -10,12 +10,12 @@ import org.junit.jupiter.api.Test; import java.time.Clock; +import java.time.Duration; import java.util.Collections; -import static uk.co.probablyfine.matchers.Java8Matchers.where; -import static java.util.concurrent.TimeUnit.DAYS; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; +import static uk.co.probablyfine.matchers.Java8Matchers.where; class CreatePortalManifestTest { @@ -31,7 +31,7 @@ void accept_valid_manifest() { PortalJob job = PortalJob.builder("Job title", document, Collections.singletonList(PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build())) .withActivationTime(clock.instant()) - .availableFor(30, DAYS) + .availableFor(Duration.ofDays(30)) .withDescription("Message") .withIdentifierInSignedDocuments(IdentifierInSignedDocuments.PERSONAL_IDENTIFICATION_NUMBER_AND_NAME) .build(); From 6bd26c2f283e6ab2e4454291d21910b7565054dd Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Thu, 10 Jun 2021 00:53:29 +0200 Subject: [PATCH 28/36] Clean up construction of Portal and Direct jobs Reduce number of overloaded builder constructors: keep mainly one constructor with lists for both documents and signers, and only one additional for convenience for exactly one document and one signer. Maintaining overloaded methods with vararg variants for multiple list parameters does not scale, and it is easy to just wrap a single element in either Arrays.asList (Java 8) or List.of (Java >= 9). --- .../signature/client/core/Document.java | 10 +-- .../client/direct/DirectDocument.java | 6 +- .../signature/client/direct/DirectJob.java | 73 +++++++++---------- .../client/portal/PortalDocument.java | 7 +- .../signature/client/portal/PortalJob.java | 55 +++++++++----- .../client/asice/CreateASiCETest.java | 2 +- .../manifest/CreateDirectManifestTest.java | 6 +- .../manifest/CreatePortalManifestTest.java | 3 +- .../client/docs/DirectClientUseCases.java | 6 +- .../client/docs/PortalClientUseCases.java | 28 ++++--- 10 files changed, 104 insertions(+), 92 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/core/Document.java b/src/main/java/no/digipost/signature/client/core/Document.java index 1871a134..17413f37 100644 --- a/src/main/java/no/digipost/signature/client/core/Document.java +++ b/src/main/java/no/digipost/signature/client/core/Document.java @@ -4,12 +4,12 @@ public abstract class Document implements ASiCEAttachable { - private String title; - private String fileName; - private byte[] document; - private FileType fileType; + private final String title; + private final String fileName; + private final byte[] document; + private final FileType fileType; - protected Document(final String title, final String fileName, final FileType fileType, final byte[] document) { + protected Document(String title, String fileName, FileType fileType, byte[] document) { this.title = title; this.fileName = fileName; this.fileType = fileType; diff --git a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java index 110e72e6..c920fad1 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java @@ -10,7 +10,7 @@ private DirectDocument(String title, String fileName, FileType fileType, byte[] super(title, fileName, fileType, document); } - public static Builder builder(final String title, final String fileName, final byte[] document) { + public static Builder builder(String title, String fileName, byte[] document) { return new Builder(title, fileName, document); } @@ -21,13 +21,13 @@ public static class Builder { private byte[] document; private FileType fileType = PDF; - public Builder(final String title, final String fileName, final byte[] document) { + public Builder(String title, String fileName, byte[] document) { this.title = title; this.fileName = fileName; this.document = document; } - public Builder fileType(final FileType fileType) { + public Builder fileType(FileType fileType) { this.fileType = fileType; return this; } diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index b3c2a940..ce180b7e 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -8,18 +8,22 @@ import java.net.URI; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.UUID; +import static java.util.Collections.singletonList; import static java.util.Collections.unmodifiableList; + +/** + * Signature job with document(s) to be signed by + * one or more signers in direct flow. + */ public class DirectJob implements SignatureJob, WithExitUrls { - private final List signers; private final List documents; + private final List signers; private final String title; private final URI completionUrl; private final URI rejectionUrl; @@ -31,10 +35,10 @@ public class DirectJob implements SignatureJob, WithExitUrls { private Optional requiredAuthentication = Optional.empty(); private Optional identifierInSignedDocuments = Optional.empty(); - private DirectJob(String title, List signers, List documents, URI completionUrl, URI rejectionUrl, URI errorUrl) { + private DirectJob(String title, List documents, List signers, URI completionUrl, URI rejectionUrl, URI errorUrl) { this.title = title; - this.signers = unmodifiableList(new ArrayList<>(signers)); this.documents = unmodifiableList(new ArrayList<>(documents)); + this.signers = unmodifiableList(new ArrayList<>(signers)); this.completionUrl = completionUrl; this.rejectionUrl = rejectionUrl; this.errorUrl = errorUrl; @@ -88,63 +92,52 @@ public Optional getStatusRetrievalMethod() { return statusRetrievalMethod; } + public String getTitle() { + return title; + } + + public Optional getDescription() { + return description; + } + /** - * Create a new DirectJob. + * Create a new signature job for direct flow. * - * @param document The {@link DirectDocument} that should be signed. - * @param hasExitUrls specifies the urls the user will be redirected back to upon completing/rejecting/failing - * the signing ceremony. See {@link ExitUrls#of(URI, URI, URI)}, and alternatively + * @param document The {@link DirectDocument document} that should be signed. + * @param hasExitUrls specifies the URLs the user will be redirected back to upon completing/rejecting/failing + * to sign the document. See {@link ExitUrls#of(URI, URI, URI)}, and alternatively * {@link ExitUrls#singleExitUrl(URI)}. - * @param signers The {@link DirectSigner DirectSigners} of the document. + * @param signer The {@link DirectSigner signer} of the document. * * @return a builder to further customize the job - * @see DirectJob#builder(String, DirectDocument, WithExitUrls, List) */ - public static Builder builder(String title, DirectDocument document, WithExitUrls hasExitUrls, DirectSigner... signers) { - return builder(title, Collections.singletonList(document), hasExitUrls, Arrays.asList(signers)); + public static Builder builder(String title, DirectDocument document, DirectSigner signer, WithExitUrls hasExitUrls) { + return builder(title, singletonList(document), singletonList(signer), hasExitUrls); } /** - * Create a new DirectJob. + * Create a new signature job for direct flow. * - * @param document The {@link DirectDocument} that should be signed. - * @param hasExitUrls specifies the urls the user will be redirected back to upon completing/rejecting/failing - * the signing ceremony. See {@link ExitUrls#of(URI, URI, URI)}, and alternatively + * @param documents The {@link DirectDocument document} that should be signed. + * @param hasExitUrls specifies the URLs the user will be redirected back to upon completing/rejecting/failing + * to sign the documents. See {@link ExitUrls#of(URI, URI, URI)}, and alternatively * {@link ExitUrls#singleExitUrl(URI)}. - * @param signers The {@link DirectSigner DirectSigners} of the document. + * @param signers The {@link DirectSigner signers} of the document. * * @return a builder to further customize the job - * @see DirectJob#builder(String, DirectDocument, WithExitUrls, DirectSigner...) */ - public static Builder builder(String title, DirectDocument document, WithExitUrls hasExitUrls, List signers) { - return builder(title, Collections.singletonList(document), hasExitUrls, signers); + public static Builder builder(String title, List documents, List signers, WithExitUrls hasExitUrls) { + return new Builder(title, documents, signers, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); } - public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, DirectSigner... signers) { - return builder(title, documents, hasExitUrls, Arrays.asList(signers)); - } - - public static Builder builder(String title, List documents, WithExitUrls hasExitUrls, List signers) { - return new Builder(title, signers, documents, hasExitUrls.getCompletionUrl(), hasExitUrls.getRejectionUrl(), hasExitUrls.getErrorUrl()); - } - - public String getTitle() { - return title; - } - - public Optional getDescription() { - return description; - } - - public static class Builder implements JobCustomizations { private final DirectJob target; private boolean built = false; - private Builder(String title, List signers, List documents, URI completionUrl, URI rejectionUrl, URI errorUrl) { - target = new DirectJob(title, signers, documents, completionUrl, rejectionUrl, errorUrl); + private Builder(String title, List documents, List signers, URI completionUrl, URI rejectionUrl, URI errorUrl) { + target = new DirectJob(title, documents, signers, completionUrl, rejectionUrl, errorUrl); } @Override diff --git a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java index 574899ba..0facf04b 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java @@ -5,11 +5,12 @@ import static no.digipost.signature.client.core.Document.FileType.PDF; public class PortalDocument extends Document { + private PortalDocument(String title, String fileName, FileType fileType, byte[] document) { super(title, fileName, fileType, document); } - public static Builder builder(final String title, final String fileName, final byte[] document) { + public static Builder builder(String title, String fileName, byte[] document) { return new Builder(title, fileName, document); } @@ -20,13 +21,13 @@ public static class Builder { private byte[] document; private FileType fileType = PDF; - public Builder(final String title, final String fileName, final byte[] document) { + public Builder(String title, String fileName, byte[] document) { this.title = title; this.fileName = fileName; this.document = document; } - public Builder fileType(final FileType fileType) { + public Builder fileType(FileType fileType) { this.fileType = fileType; return this; } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 952e2591..8e3a697c 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -9,19 +9,22 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.UUID; +import static java.util.Collections.singletonList; import static java.util.Collections.unmodifiableList; +/** + * Signature job with document(s) to be signed by + * one or more signers in portal flow. + */ public class PortalJob implements SignatureJob { - private final List signers; private final List documents; + private final List signers; private final String title; private Optional nonsensitiveTitle = Optional.empty(); private Optional description = Optional.empty(); @@ -32,10 +35,10 @@ public class PortalJob implements SignatureJob { private Optional requiredAuthentication = Optional.empty(); private Optional identifierInSignedDocuments = Optional.empty(); - private PortalJob(String title, List signers, List documents) { + private PortalJob(String title, List documents, List signers) { this.title = title; - this.signers = unmodifiableList(new ArrayList<>(signers)); this.documents = unmodifiableList(new ArrayList<>(documents)); + this.signers = unmodifiableList(new ArrayList<>(signers)); } @Override @@ -75,19 +78,6 @@ public Duration getAvailable() { return available; } - - public static Builder builder(String title, PortalDocument document, PortalSigner... signers) { - return builder(title, Collections.singletonList(document), Arrays.asList(signers)); - } - - public static Builder builder(String title, PortalDocument document, List signers) { - return builder(title, Collections.singletonList(document), signers); - } - - public static Builder builder(String title, List documents, List signers) { - return new Builder(title, signers, documents); - } - public String getTitle() { return title; } @@ -100,13 +90,38 @@ public Optional getDescription() { return description; } + + /** + * Create a new signature job for portal flow. + * + * @param document The {@link PortalDocument document} that should be signed. + * @param signer The {@link PortalSigner signer} of the document. + * + * @return a builder to further customize the job + */ + public static Builder builder(String title, PortalDocument document, PortalSigner signer) { + return builder(title, singletonList(document), singletonList(signer)); + } + + /** + * Create a new signature job for portal flow. + * + * @param documents The {@link PortalDocument documents} that should be signed. + * @param signers The {@link PortalSigner signers} of the document. + * + * @return a builder to further customize the job + */ + public static Builder builder(String title, List documents, List signers) { + return new Builder(title, documents, signers); + } + public static class Builder implements JobCustomizations { private final PortalJob target; private boolean built = false; - private Builder(String title, List signers, List documents) { - target = new PortalJob(title, signers, documents); + private Builder(String title, List documents, List signers) { + target = new PortalJob(title, documents, signers); } @Override diff --git a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java index f896346a..60dce2d5 100644 --- a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java +++ b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java @@ -67,7 +67,7 @@ public static void initTempFolder() throws URISyntaxException, IOException { @Test public void create_direct_asice_and_write_to_disk() throws IOException { - DirectJob job = DirectJob.builder("Job title", DIRECT_DOCUMENT, singleExitUrl(URI.create("https://job.well.done.org")), DirectSigner.withPersonalIdentificationNumber("12345678910").build()) + DirectJob job = DirectJob.builder("Job title", DIRECT_DOCUMENT, DirectSigner.withPersonalIdentificationNumber("12345678910").build(), singleExitUrl(URI.create("https://job.well.done.org"))) .withReference("direct job") .build(); diff --git a/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java b/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java index 139041f4..c1ef8c60 100644 --- a/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java +++ b/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java @@ -11,9 +11,9 @@ import java.net.URI; -import static uk.co.probablyfine.matchers.Java8Matchers.where; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; +import static uk.co.probablyfine.matchers.Java8Matchers.where; class CreateDirectManifestTest { @@ -28,8 +28,8 @@ void accept_valid_manifest() { DirectJob job = DirectJob.builder( "Job title", document, - ExitUrls.of(URI.create("http://localhost/signed"), URI.create("http://localhost/canceled"), URI.create("http://localhost/failed")), - DirectSigner.withPersonalIdentificationNumber("12345678910").build()) + DirectSigner.withPersonalIdentificationNumber("12345678910").build(), + ExitUrls.of(URI.create("http://localhost/signed"), URI.create("http://localhost/canceled"), URI.create("http://localhost/failed"))) .withIdentifierInSignedDocuments(IdentifierInSignedDocuments.NAME) .build(); assertThat(createManifest, where(__ -> __.createManifest(job, new Sender("123456789")), instanceOf(Manifest.class))); diff --git a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java index 5c9b3da1..3e5cf0ab 100644 --- a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java +++ b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java @@ -11,7 +11,6 @@ import java.time.Clock; import java.time.Duration; -import java.util.Collections; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; @@ -29,7 +28,7 @@ void accept_valid_manifest() { .fileType(Document.FileType.TXT) .build(); - PortalJob job = PortalJob.builder("Job title", document, Collections.singletonList(PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build())) + PortalJob job = PortalJob.builder("Job title", document, PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build()) .withActivationTime(clock.instant()) .availableFor(Duration.ofDays(30)) .withDescription("Message") diff --git a/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java b/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java index adc7e3a1..5638b82c 100644 --- a/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java +++ b/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java @@ -41,7 +41,7 @@ static void create_and_send_signature_job() { ); DirectSigner signer = DirectSigner.withPersonalIdentificationNumber("12345678910").build(); - DirectJob directJob = DirectJob.builder("Job title", document, exitUrls, signer).build(); + DirectJob directJob = DirectJob.builder("Job title", document, signer, exitUrls).build(); DirectJobResponse directJobResponse = client.create(directJob); } @@ -102,7 +102,7 @@ static void get_signature_job_status() { static void create_job_and_status_by_polling() { DirectClient client = null; // As initialized earlier - DirectJob directJob = DirectJob.builder("Job title", document, exitUrls, signer) + DirectJob directJob = DirectJob.builder("Job title", document, signer, exitUrls) .retrieveStatusBy(StatusRetrievalMethod.POLLING) .build(); @@ -148,7 +148,7 @@ static void specifying_queues() { DirectClient client = null; // As initialized earlier Sender sender = new Sender("000000000", PollingQueue.of("CustomPollingQueue")); - DirectJob directJob = DirectJob.builder("Job title", document, exitUrls, signer) + DirectJob directJob = DirectJob.builder("Job title", document, signer, exitUrls) .retrieveStatusBy(StatusRetrievalMethod.POLLING).withSender(sender) .build(); diff --git a/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java b/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java index d9fcd61e..fb5d02e6 100644 --- a/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java +++ b/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java @@ -19,6 +19,8 @@ import java.io.InputStream; import java.time.Instant; +import static java.util.Arrays.asList; + @SuppressWarnings({"unused", "ConstantConditions", "StatementWithEmptyBody", "null"}) class PortalClientUseCases { @@ -31,12 +33,13 @@ static void create_and_send_signature_job() { PortalJob portalJob = PortalJob.builder( "Job title", - document, - PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", - NotificationsUsingLookup.EMAIL_ONLY).build(), - PortalSigner.identifiedByPersonalIdentificationNumber("12345678911", - Notifications.builder().withEmailTo("email@example.com").build()).build(), - PortalSigner.identifiedByEmail("email@example.com").build() + asList(document), + asList( + PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", + NotificationsUsingLookup.EMAIL_ONLY).build(), + PortalSigner.identifiedByPersonalIdentificationNumber("12345678911", + Notifications.builder().withEmailTo("email@example.com").build()).build(), + PortalSigner.identifiedByEmail("email@example.com").build()) ).build(); PortalJobResponse portalJobResponse = client.create(portalJob); @@ -100,12 +103,13 @@ static void specifying_queues() { PortalJob portalJob = PortalJob.builder( "Job title", - document, - PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", - NotificationsUsingLookup.EMAIL_ONLY).build(), - PortalSigner.identifiedByPersonalIdentificationNumber("12345678911", - Notifications.builder().withEmailTo("email@example.com").build()).build(), - PortalSigner.identifiedByEmail("email@example.com").build() + asList(document), + asList( + PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", + NotificationsUsingLookup.EMAIL_ONLY).build(), + PortalSigner.identifiedByPersonalIdentificationNumber("12345678911", + Notifications.builder().withEmailTo("email@example.com").build()).build(), + PortalSigner.identifiedByEmail("email@example.com").build()) ).withSender(sender).build(); PortalJobResponse portalJobResponse = client.create(portalJob); From 45af03783dd415d422bdfe4eb84eb2a9cf8d48dd Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Tue, 15 Jun 2021 01:09:30 +0200 Subject: [PATCH 29/36] Fix NPE if not setting PortalJob.availableFor --- .../client/asice/manifest/CreatePortalManifest.java | 3 ++- .../java/no/digipost/signature/client/portal/PortalJob.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index 6ba87cab..2d009984 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -22,6 +22,7 @@ import no.digipost.signature.client.portal.PortalSigner; import java.time.Clock; +import java.time.Duration; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; @@ -67,7 +68,7 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .collect(toList())) .withAvailability(new XMLAvailability() .withActivationTime(activationTime) - .withAvailableSeconds(job.getAvailable().getSeconds())) + .withAvailableSeconds(job.getAvailable().map(Duration::getSeconds).orElse(null))) .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)); } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 8e3a697c..94ed4f39 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -30,7 +30,7 @@ public class PortalJob implements SignatureJob { private Optional description = Optional.empty(); private String reference; private Optional activationTime = Optional.empty(); - private Duration available; + private Optional available = Optional.empty(); private Optional sender = Optional.empty(); private Optional requiredAuthentication = Optional.empty(); private Optional identifierInSignedDocuments = Optional.empty(); @@ -74,7 +74,7 @@ public Optional getActivationTime() { return activationTime; } - public Duration getAvailable() { + public Optional getAvailable() { return available; } @@ -159,7 +159,7 @@ public Builder withActivationTime(Instant activationTime) { } public Builder availableFor(Duration duration) { - target.available = duration; + target.available = Optional.of(duration); return this; } From 17427719531f7272c183da7f6cbb3c79c47d17fc Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Tue, 15 Jun 2021 01:05:49 +0200 Subject: [PATCH 30/36] Generate filenames for document bundle Instead of requiring to be set explicitly. --- .../client/asice/ASiCEAttachable.java | 27 +++++- .../client/asice/manifest/Manifest.java | 5 +- .../asice/signature/CreateSignature.java | 5 +- .../client/asice/signature/Signature.java | 4 +- .../signature/client/core/Document.java | 32 +++---- .../signature/client/core/DocumentType.java | 28 ++++++ .../client/core/internal/FileName.java | 89 +++++++++++++++++++ .../client/direct/DirectDocument.java | 38 +++++--- .../client/portal/PortalDocument.java | 38 +++++--- .../client/asice/CreateASiCETest.java | 10 +-- .../client/asice/archive/CreateZipTest.java | 7 +- .../manifest/CreateDirectManifestTest.java | 6 +- .../manifest/CreatePortalManifestTest.java | 6 +- .../asice/signature/CreateSignatureTest.java | 15 ++-- .../client/core/internal/FileNameTest.java | 71 +++++++++++++++ .../client/docs/DirectClientUseCases.java | 2 +- .../client/docs/PortalClientUseCases.java | 4 +- 17 files changed, 307 insertions(+), 80 deletions(-) create mode 100644 src/main/java/no/digipost/signature/client/core/DocumentType.java create mode 100644 src/main/java/no/digipost/signature/client/core/internal/FileName.java create mode 100644 src/test/java/no/digipost/signature/client/core/internal/FileNameTest.java diff --git a/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java b/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java index bbd80ac3..dac05291 100644 --- a/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java +++ b/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java @@ -5,12 +5,37 @@ import static org.apache.commons.codec.digest.DigestUtils.sha256; public interface ASiCEAttachable extends SignableFileReference { + + interface Type { + static final Type XML = new Type() { + @Override + public String getMediaType() { + return "application/xml"; + } + + @Override + public String getFileExtension() { + return "xml"; + } + }; + + String getMediaType(); + + String getFileExtension(); + } + + @Override String getFileName(); byte[] getBytes(); - String getMimeType(); + ASiCEAttachable.Type getType(); + + @Override + default String getMimeType() { + return getType().getMediaType(); + } @Override default byte[] getSha256() { diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java index 0a57c9d3..c337eab0 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java @@ -21,7 +21,8 @@ public byte[] getBytes() { } @Override - public String getMimeType() { - return "application/xml"; + public Type getType() { + return Type.XML; } + } diff --git a/src/main/java/no/digipost/signature/client/asice/signature/CreateSignature.java b/src/main/java/no/digipost/signature/client/asice/signature/CreateSignature.java index e236277d..f20c4fc9 100644 --- a/src/main/java/no/digipost/signature/client/asice/signature/CreateSignature.java +++ b/src/main/java/no/digipost/signature/client/asice/signature/CreateSignature.java @@ -169,8 +169,9 @@ private List references(final XMLSignatureFactory xmlSignatureFactory for (int i = 0; i < files.size(); i++) { try { String signatureElementId = "ID_" + i; - String uri = URLEncoder.encode(files.get(i).getFileName(), "UTF-8"); - Reference reference = xmlSignatureFactory.newReference(uri, sha256DigestMethod, null, null, signatureElementId, files.get(i).getSha256()); + SignableFileReference file = files.get(i); + String uri = URLEncoder.encode(file.getFileName(), "UTF-8"); + Reference reference = xmlSignatureFactory.newReference(uri, sha256DigestMethod, null, null, signatureElementId, file.getSha256()); result.add(reference); } catch(UnsupportedEncodingException e) { throw new RuntimeException(e); diff --git a/src/main/java/no/digipost/signature/client/asice/signature/Signature.java b/src/main/java/no/digipost/signature/client/asice/signature/Signature.java index 34933f08..cc3a5400 100644 --- a/src/main/java/no/digipost/signature/client/asice/signature/Signature.java +++ b/src/main/java/no/digipost/signature/client/asice/signature/Signature.java @@ -21,8 +21,8 @@ public byte[] getBytes() { } @Override - public String getMimeType() { - return "application/xml"; + public Type getType() { + return Type.XML; } } diff --git a/src/main/java/no/digipost/signature/client/core/Document.java b/src/main/java/no/digipost/signature/client/core/Document.java index 17413f37..9fb75f76 100644 --- a/src/main/java/no/digipost/signature/client/core/Document.java +++ b/src/main/java/no/digipost/signature/client/core/Document.java @@ -5,44 +5,34 @@ public abstract class Document implements ASiCEAttachable { private final String title; + private final DocumentType documentType; private final String fileName; private final byte[] document; - private final FileType fileType; - protected Document(String title, String fileName, FileType fileType, byte[] document) { + protected Document(String title, DocumentType documentType, String fileName, byte[] document) { this.title = title; + this.documentType = documentType; this.fileName = fileName; - this.fileType = fileType; this.document = document; } + public String getTitle() { + return title; + } + @Override public String getFileName() { return fileName; } @Override - public byte[] getBytes() { - return document; + public Type getType() { + return documentType; } @Override - public String getMimeType() { - return fileType.mimeType; - } - - public String getTitle() { - return title; + public byte[] getBytes() { + return document; } - public enum FileType { - PDF("application/pdf"), - TXT("text/plain"); - - public final String mimeType; - - FileType(final String mimeType) { - this.mimeType = mimeType; - } - } } diff --git a/src/main/java/no/digipost/signature/client/core/DocumentType.java b/src/main/java/no/digipost/signature/client/core/DocumentType.java new file mode 100644 index 00000000..abbabf14 --- /dev/null +++ b/src/main/java/no/digipost/signature/client/core/DocumentType.java @@ -0,0 +1,28 @@ +package no.digipost.signature.client.core; + +import no.digipost.signature.client.asice.ASiCEAttachable; + +public enum DocumentType implements ASiCEAttachable.Type { + + PDF("application/pdf", "pdf"), + TXT("text/plain", "txt"); + + private final String mediaType; + private final String fileExtension; + + DocumentType(String mediaType, String fileExtension) { + this.mediaType = mediaType; + this.fileExtension = fileExtension; + } + + @Override + public String getMediaType() { + return mediaType; + } + + @Override + public String getFileExtension() { + return fileExtension; + } + +} diff --git a/src/main/java/no/digipost/signature/client/core/internal/FileName.java b/src/main/java/no/digipost/signature/client/core/internal/FileName.java new file mode 100644 index 00000000..110353f6 --- /dev/null +++ b/src/main/java/no/digipost/signature/client/core/internal/FileName.java @@ -0,0 +1,89 @@ +package no.digipost.signature.client.core.internal; + +import java.text.Normalizer; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.regex.Pattern; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static java.text.Normalizer.Form.NFD; +import static java.util.Arrays.binarySearch; +import static java.util.function.Function.identity; +import static java.util.stream.Collectors.joining; +import static java.util.stream.IntStream.rangeClosed; + +public final class FileName { + + private static final Map knownReplacements; static { + knownReplacements = new LinkedHashMap<>(); + knownReplacements.put(Pattern.compile("[\\s:;&%\\$\\*\\?\\+=@,\\(\\)\\[\\]\\{\\}#!\"“”\\^`´<>]+"), "_"); //various punctuation + knownReplacements.put(Pattern.compile("[æÆ]"), "ae"); + knownReplacements.put(Pattern.compile("[øØ]"), "oe"); + knownReplacements.put(Pattern.compile("[åÅ]"), "aa"); + } + + private static final char[] allowedChars = Stream.of( + rangeClosed('0', '9'), + rangeClosed('a', 'z'), + IntStream.of('-', '_', '.')) + .flatMapToInt(identity()) + .sorted() + .mapToObj(c -> String.valueOf((char) c)) + .collect(joining()) + .toCharArray(); + + + public static String reduceToFileNameSafeChars(String text) { + if (text == null || text.isEmpty()) { + throw new IllegalArgumentException(text); + } + String knownReplacements = text; + for (Entry replacement : FileName.knownReplacements.entrySet()) { + knownReplacements = replacement.getKey().matcher(knownReplacements).replaceAll(replacement.getValue()); + } + String accentsRemoved = removeAccents(knownReplacements); + return reduceToAlphabet(accentsRemoved.toLowerCase(), allowedChars); + } + + + /** + * Reduce a text to only contain characters of a given alphabet + * using the following algorithm: + *
    + *
  • characters already part of the alphabet are kept as-is
  • + *
  • characters not part of the alphabet is replaced with a + * character from the alphabet in a non-defined, but repeatable manner.
  • + *
+ * + * @param text the source text + * @param alphabet the allowed characters in the resulting String + * @return the resulting string + */ + private static String reduceToAlphabet(String text, char[] alphabet) { + StringBuilder reducedToAllowedChars = new StringBuilder(text.length()); + for (int c : text.toCharArray()) { + if (binarySearch(allowedChars, (char) c) >= 0) { + reducedToAllowedChars.append((char) c); + } else { + reducedToAllowedChars.append(allowedChars[c % allowedChars.length]); + } + } + return reducedToAllowedChars.toString(); + } + + + private static final Pattern UNICODE_ACCENT = Pattern.compile("\\p{M}"); + + /** + * Replaces accented characters (è, ü, etc) with their base glyphs (e, u, etc). + * @see https://stackoverflow.com/questions/3322152/is-there-a-way-to-get-rid-of-accents-and-convert-a-whole-string-to-regular-lette + */ + private static String removeAccents(String text) { + return UNICODE_ACCENT.matcher(Normalizer.normalize(text, NFD)).replaceAll(""); + } + + private FileName() { + } +} diff --git a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java index c920fad1..72c7978b 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java @@ -1,39 +1,51 @@ package no.digipost.signature.client.direct; import no.digipost.signature.client.core.Document; +import no.digipost.signature.client.core.DocumentType; + +import static java.util.Objects.requireNonNull; +import static no.digipost.signature.client.core.DocumentType.PDF; +import static no.digipost.signature.client.core.internal.FileName.reduceToFileNameSafeChars; -import static no.digipost.signature.client.core.Document.FileType.PDF; public class DirectDocument extends Document { - private DirectDocument(String title, String fileName, FileType fileType, byte[] document) { - super(title, fileName, fileType, document); + public static Builder builder(String title, byte[] document) { + return new Builder(title, document); } - public static Builder builder(String title, String fileName, byte[] document) { - return new Builder(title, fileName, document); + + private DirectDocument(String title, DocumentType documentType, String fileName, byte[] document) { + super(title, documentType, fileName, document); } public static class Builder { private String title; + private DocumentType documentType = PDF; private String fileName; private byte[] document; - private FileType fileType = PDF; - public Builder(String title, String fileName, byte[] document) { - this.title = title; - this.fileName = fileName; - this.document = document; + public Builder(String title, byte[] document) { + this.title = requireNonNull(title, "title"); + this.document = requireNonNull(document, "document bytes"); } - public Builder fileType(FileType fileType) { - this.fileType = fileType; + public Builder type(DocumentType documentType) { + this.documentType = requireNonNull(documentType, "document type"); + return this; + } + + public Builder fileName(String fileName) { + this.fileName = fileName; return this; } public DirectDocument build() { - return new DirectDocument(title, fileName, fileType, document); + return new DirectDocument( + title, documentType, + fileName == null ? reduceToFileNameSafeChars(title) + "." + documentType.getFileExtension() : fileName, + document); } } } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java index 0facf04b..5e91f3cd 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java @@ -1,39 +1,51 @@ package no.digipost.signature.client.portal; import no.digipost.signature.client.core.Document; +import no.digipost.signature.client.core.DocumentType; + +import static java.util.Objects.requireNonNull; +import static no.digipost.signature.client.core.DocumentType.PDF; +import static no.digipost.signature.client.core.internal.FileName.reduceToFileNameSafeChars; -import static no.digipost.signature.client.core.Document.FileType.PDF; public class PortalDocument extends Document { - private PortalDocument(String title, String fileName, FileType fileType, byte[] document) { - super(title, fileName, fileType, document); + public static Builder builder(String title, byte[] document) { + return new Builder(title, document); } - public static Builder builder(String title, String fileName, byte[] document) { - return new Builder(title, fileName, document); + + private PortalDocument(String title, DocumentType documentType, String fileName, byte[] document) { + super(title, documentType, fileName, document); } public static class Builder { private String title; + private DocumentType documentType = PDF; private String fileName; private byte[] document; - private FileType fileType = PDF; - public Builder(String title, String fileName, byte[] document) { - this.title = title; - this.fileName = fileName; - this.document = document; + public Builder(String title, byte[] document) { + this.title = requireNonNull(title, "title"); + this.document = requireNonNull(document, "document bytes"); } - public Builder fileType(FileType fileType) { - this.fileType = fileType; + public Builder type(DocumentType documentType) { + this.documentType = requireNonNull(documentType, "document type"); + return this; + } + + public Builder fileName(String fileName) { + this.fileName = fileName; return this; } public PortalDocument build() { - return new PortalDocument(title, fileName, fileType, document); + return new PortalDocument( + title, documentType, + fileName == null ? reduceToFileNameSafeChars(title) + "." + documentType.getFileExtension(): fileName, + document); } } } diff --git a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java index 60dce2d5..39412ee2 100644 --- a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java +++ b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java @@ -4,7 +4,7 @@ import no.digipost.signature.client.asice.manifest.CreateDirectManifest; import no.digipost.signature.client.asice.manifest.CreatePortalManifest; import no.digipost.signature.client.asice.manifest.ManifestCreator; -import no.digipost.signature.client.core.Document; +import no.digipost.signature.client.core.DocumentType; import no.digipost.signature.client.core.Sender; import no.digipost.signature.client.core.SignatureJob; import no.digipost.signature.client.direct.DirectDocument; @@ -56,12 +56,12 @@ public static void initTempFolder() throws URISyntaxException, IOException { private static Path dumpFolder; - private static final DirectDocument DIRECT_DOCUMENT = DirectDocument.builder("Document title", "file.txt", "hello".getBytes()) - .fileType(Document.FileType.TXT) + private static final DirectDocument DIRECT_DOCUMENT = DirectDocument.builder("Document title", "hello".getBytes()) + .type(DocumentType.TXT) .build(); - private static final PortalDocument PORTAL_DOCUMENT = PortalDocument.builder("Document title", "file.txt", "hello".getBytes()) - .fileType(Document.FileType.TXT) + private static final PortalDocument PORTAL_DOCUMENT = PortalDocument.builder("Document title", "hello".getBytes()) + .type(DocumentType.TXT) .build(); diff --git a/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java b/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java index a3f79684..9e5bcd83 100644 --- a/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java +++ b/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java @@ -1,6 +1,7 @@ package no.digipost.signature.client.asice.archive; import no.digipost.signature.client.asice.ASiCEAttachable; +import no.digipost.signature.client.core.DocumentType; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; @@ -41,7 +42,7 @@ private static void verifyZipFile(ZipInputStream zipInputStream, String fileName assertArrayEquals(IOUtils.toByteArray(zipInputStream), contents.getBytes()); } - private ASiCEAttachable file(final String fileName, final String contents) { + private ASiCEAttachable file(String fileName, String contents) { return new ASiCEAttachable() { @Override public String getFileName() { @@ -54,8 +55,8 @@ public byte[] getBytes() { } @Override - public String getMimeType() { - return "text/plain"; + public Type getType() { + return DocumentType.TXT; } }; } diff --git a/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java b/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java index c1ef8c60..9412fbb0 100644 --- a/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java +++ b/src/test/java/no/digipost/signature/client/asice/manifest/CreateDirectManifestTest.java @@ -1,6 +1,5 @@ package no.digipost.signature.client.asice.manifest; -import no.digipost.signature.client.core.Document; import no.digipost.signature.client.core.IdentifierInSignedDocuments; import no.digipost.signature.client.core.Sender; import no.digipost.signature.client.direct.DirectDocument; @@ -11,6 +10,7 @@ import java.net.URI; +import static no.digipost.signature.client.core.DocumentType.TXT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static uk.co.probablyfine.matchers.Java8Matchers.where; @@ -21,9 +21,7 @@ class CreateDirectManifestTest { void accept_valid_manifest() { CreateDirectManifest createManifest = new CreateDirectManifest(); - DirectDocument document = DirectDocument.builder("Title", "file.txt", "hello".getBytes()) - .fileType(Document.FileType.TXT) - .build(); + DirectDocument document = DirectDocument.builder("Title", "hello".getBytes()).type(TXT).build(); DirectJob job = DirectJob.builder( "Job title", diff --git a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java index 3e5cf0ab..4544663e 100644 --- a/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java +++ b/src/test/java/no/digipost/signature/client/asice/manifest/CreatePortalManifestTest.java @@ -1,6 +1,5 @@ package no.digipost.signature.client.asice.manifest; -import no.digipost.signature.client.core.Document; import no.digipost.signature.client.core.IdentifierInSignedDocuments; import no.digipost.signature.client.core.Sender; import no.digipost.signature.client.portal.NotificationsUsingLookup; @@ -12,6 +11,7 @@ import java.time.Clock; import java.time.Duration; +import static no.digipost.signature.client.core.DocumentType.TXT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static uk.co.probablyfine.matchers.Java8Matchers.where; @@ -24,9 +24,7 @@ class CreatePortalManifestTest { void accept_valid_manifest() { CreatePortalManifest createManifest = new CreatePortalManifest(clock); - PortalDocument document = PortalDocument.builder("Title", "file.txt", "hello".getBytes()) - .fileType(Document.FileType.TXT) - .build(); + PortalDocument document = PortalDocument.builder("Title", "hello".getBytes()).type(TXT).build(); PortalJob job = PortalJob.builder("Job title", document, PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build()) .withActivationTime(clock.instant()) diff --git a/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java b/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java index b00ed53b..a8b9d092 100644 --- a/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java +++ b/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java @@ -11,6 +11,7 @@ import no.digipost.signature.api.xml.thirdparty.xmldsig.X509IssuerSerialType; import no.digipost.signature.client.TestKonfigurasjon; import no.digipost.signature.client.asice.ASiCEAttachable; +import no.digipost.signature.client.core.DocumentType; import no.digipost.signature.client.security.KeyStoreConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,12 +27,12 @@ import java.util.Base64; import java.util.List; -import static uk.co.probablyfine.matchers.Java8Matchers.where; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static uk.co.probablyfine.matchers.Java8Matchers.where; public class CreateSignatureTest { @@ -54,8 +55,8 @@ public class CreateSignatureTest { public void setUp() { noekkelpar = TestKonfigurasjon.CLIENT_KEYSTORE; files = asList( - file("dokument.pdf", "hoveddokument-innhold".getBytes(), "application/pdf"), - file("manifest.xml", "manifest-innhold".getBytes(), "application/xml") + file("dokument.pdf", "hoveddokument-innhold".getBytes(), DocumentType.PDF), + file("manifest.xml", "manifest-innhold".getBytes(), ASiCEAttachable.Type.XML) ); ZonedDateTime signingTime = ZonedDateTime.of(2018, 11, 29, 9, 15, 0, 0, ZoneId.of("Europe/Oslo")); @@ -102,8 +103,8 @@ public void test_xades_signed_properties() { @Test public void should_support_filenames_with_spaces_and_other_characters() { List otherFiles = asList( - file("dokument (2).pdf", "hoveddokument-innhold".getBytes(), "application/pdf"), - file("manifest.xml", "manifest-innhold".getBytes(), "application/xml") + file("dokument (2).pdf", "hoveddokument-innhold".getBytes(), DocumentType.PDF), + file("manifest.xml", "manifest-innhold".getBytes(), ASiCEAttachable.Type.XML) ); Signature signature = createSignature.createSignature(otherFiles, noekkelpar); @@ -160,14 +161,14 @@ private void assert_dokument_reference(final Reference dokumentReference) { assertThat(dokumentReference.getDigestMethod().getAlgorithm(), is("http://www.w3.org/2001/04/xmlenc#sha256")); } - private ASiCEAttachable file(final String fileName, final byte[] contents, final String mimeType) { + private ASiCEAttachable file(String fileName, byte[] contents, ASiCEAttachable.Type type) { return new ASiCEAttachable() { @Override public String getFileName() { return fileName; } @Override public byte[] getBytes() { return contents; } @Override - public String getMimeType() { return mimeType; } + public Type getType() { return type; } }; } diff --git a/src/test/java/no/digipost/signature/client/core/internal/FileNameTest.java b/src/test/java/no/digipost/signature/client/core/internal/FileNameTest.java new file mode 100644 index 00000000..641810b2 --- /dev/null +++ b/src/test/java/no/digipost/signature/client/core/internal/FileNameTest.java @@ -0,0 +1,71 @@ +package no.digipost.signature.client.core.internal; + +import org.junit.jupiter.api.Test; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import static no.digipost.signature.client.core.internal.FileName.reduceToFileNameSafeChars; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.quicktheories.QuickTheory.qt; +import static org.quicktheories.generators.SourceDSL.strings; + +class FileNameTest { + + @Test + void convertsToLowerCase() { + assertThat(reduceToFileNameSafeChars("Title"), is("title")); + } + + @Test + void replacesNorwegianCharacters() { + assertThat(reduceToFileNameSafeChars("ÆØÅ"), is("aeoeaa")); + assertThat(reduceToFileNameSafeChars("æøå"), is("aeoeaa")); + } + + @Test + void successiveSpacesIsReplacedWithAnUnderscore() { + assertThat(reduceToFileNameSafeChars("Hei på \t Deg"), is("hei_paa_deg")); + } + + @Test + void successivePunctuationIsReplacedWithAnUnderscore() { + assertThat(reduceToFileNameSafeChars("*@,:;&%$^?+=()[]{}#\"“”!`´<>"), is("_")); + } + + @Test + void emptyNameIsAnError() { + assertThrows(IllegalArgumentException.class, () -> reduceToFileNameSafeChars("")); + assertThrows(IllegalArgumentException.class, () -> reduceToFileNameSafeChars(null)); + } + + @Test + void accentsAndOtherDiacriticalMarksAreRemoved() { + assertThat(reduceToFileNameSafeChars("àáëêÈÉüÜïñÑ"), is("aaeeeeuuinn")); + } + + @Test + void periodAndDashAreKeptAsIs() { + assertThat(reduceToFileNameSafeChars("Morse ...---..."), is("morse_...---...")); + } + + @Test + void urlEncodingWillAlwaysProduceSameString() { + qt() + .forAll(strings().allPossible().ofLengthBetween(1, 100)) + .as(FileName::reduceToFileNameSafeChars) + .checkAssert(safeFileName -> assertThat(urlEncode(safeFileName), equalTo(safeFileName))); + } + + private static String urlEncode(String s) { + try { + return URLEncoder.encode(s, "UTF-8"); + } catch (UnsupportedEncodingException utf8NotSupported) { + throw new RuntimeException(utf8NotSupported.getMessage(), utf8NotSupported); + } + } + +} diff --git a/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java b/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java index 5638b82c..8ceb5142 100644 --- a/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java +++ b/src/test/java/no/digipost/signature/client/docs/DirectClientUseCases.java @@ -32,7 +32,7 @@ static void create_and_send_signature_job() { DirectClient client = new DirectClient(clientConfiguration); byte[] documentBytes = null; // Loaded document bytes - DirectDocument document = DirectDocument.builder("Document title", "document.pdf", documentBytes).build(); + DirectDocument document = DirectDocument.builder("Document title", documentBytes).build(); ExitUrls exitUrls = ExitUrls.of( URI.create("http://sender.org/onCompletion"), diff --git a/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java b/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java index fb5d02e6..e94cbb1e 100644 --- a/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java +++ b/src/test/java/no/digipost/signature/client/docs/PortalClientUseCases.java @@ -29,7 +29,7 @@ static void create_and_send_signature_job() { PortalClient client = new PortalClient(clientConfiguration); byte[] documentBytes = null; // Loaded document bytes - PortalDocument document = PortalDocument.builder("Document title", "document.pdf", documentBytes).build(); + PortalDocument document = PortalDocument.builder("Document title", documentBytes).build(); PortalJob portalJob = PortalJob.builder( "Job title", @@ -99,7 +99,7 @@ static void specifying_queues() { Sender sender = new Sender("000000000", PollingQueue.of("CustomPollingQueue")); byte[] documentBytes = null; // Loaded document bytes - PortalDocument document = PortalDocument.builder("Document title", "document.pdf", documentBytes).build(); + PortalDocument document = PortalDocument.builder("Document title", documentBytes).build(); PortalJob portalJob = PortalJob.builder( "Job title", From 8ca1f1a18b9d02f4cbe15ef9c16bbbd7c5f1bf61 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Mon, 21 Jun 2021 00:07:02 +0200 Subject: [PATCH 31/36] Include index in filename to ensure uniqueness Prevents name crashes when resolving filenames for creating the ASiCE document bundle. --- .../signature/client/core/Document.java | 4 +-- .../signature/client/core/SignatureJob.java | 2 +- .../client/direct/DirectDocument.java | 26 ++++++++----------- .../signature/client/direct/DirectJob.java | 12 ++++++++- .../client/portal/PortalDocument.java | 26 ++++++++----------- .../signature/client/portal/PortalJob.java | 12 ++++++++- .../client/asice/CreateASiCETest.java | 22 +++++++++++----- 7 files changed, 63 insertions(+), 41 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/core/Document.java b/src/main/java/no/digipost/signature/client/core/Document.java index 9fb75f76..1eeaab09 100644 --- a/src/main/java/no/digipost/signature/client/core/Document.java +++ b/src/main/java/no/digipost/signature/client/core/Document.java @@ -2,14 +2,14 @@ import no.digipost.signature.client.asice.ASiCEAttachable; -public abstract class Document implements ASiCEAttachable { +public class Document implements ASiCEAttachable { private final String title; private final DocumentType documentType; private final String fileName; private final byte[] document; - protected Document(String title, DocumentType documentType, String fileName, byte[] document) { + public Document(String title, DocumentType documentType, String fileName, byte[] document) { this.title = title; this.documentType = documentType; this.fileName = fileName; diff --git a/src/main/java/no/digipost/signature/client/core/SignatureJob.java b/src/main/java/no/digipost/signature/client/core/SignatureJob.java index 31858b03..a9211f84 100644 --- a/src/main/java/no/digipost/signature/client/core/SignatureJob.java +++ b/src/main/java/no/digipost/signature/client/core/SignatureJob.java @@ -5,7 +5,7 @@ public interface SignatureJob { - List getDocuments(); + List getDocuments(); Optional getSender(); diff --git a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java index 72c7978b..8dc244b4 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java @@ -1,29 +1,33 @@ package no.digipost.signature.client.direct; -import no.digipost.signature.client.core.Document; import no.digipost.signature.client.core.DocumentType; import static java.util.Objects.requireNonNull; import static no.digipost.signature.client.core.DocumentType.PDF; -import static no.digipost.signature.client.core.internal.FileName.reduceToFileNameSafeChars; -public class DirectDocument extends Document { +public class DirectDocument { public static Builder builder(String title, byte[] document) { return new Builder(title, document); } - private DirectDocument(String title, DocumentType documentType, String fileName, byte[] document) { - super(title, documentType, fileName, document); + public final String title; + public final DocumentType type; + public final byte[] document; + + private DirectDocument(String title, DocumentType type, byte[] document) { + this.title = title; + this.type = type; + this.document = document; } + public static class Builder { private String title; private DocumentType documentType = PDF; - private String fileName; private byte[] document; public Builder(String title, byte[] document) { @@ -36,16 +40,8 @@ public Builder type(DocumentType documentType) { return this; } - public Builder fileName(String fileName) { - this.fileName = fileName; - return this; - } - public DirectDocument build() { - return new DirectDocument( - title, documentType, - fileName == null ? reduceToFileNameSafeChars(title) + "." + documentType.getFileExtension() : fileName, - document); + return new DirectDocument(title, documentType, document); } } } diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index ce180b7e..e27ebf45 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -1,6 +1,7 @@ package no.digipost.signature.client.direct; import no.digipost.signature.client.core.AuthenticationLevel; +import no.digipost.signature.client.core.Document; import no.digipost.signature.client.core.IdentifierInSignedDocuments; import no.digipost.signature.client.core.Sender; import no.digipost.signature.client.core.SignatureJob; @@ -12,8 +13,10 @@ import java.util.Optional; import java.util.UUID; +import static java.lang.String.format; import static java.util.Collections.singletonList; import static java.util.Collections.unmodifiableList; +import static no.digipost.signature.client.core.internal.FileName.reduceToFileNameSafeChars; /** @@ -50,7 +53,14 @@ public String getReference() { } @Override - public List getDocuments() { + public List getDocuments() { + List documents = new ArrayList<>(); + for (int i = 0; i < this.documents.size(); i++) { + DirectDocument doc = this.documents.get(i); + documents.add(new Document(doc.title, doc.type, + format("%04d", i) + "_" + reduceToFileNameSafeChars(doc.title) + "." + doc.type.getFileExtension(), + doc.document)); + } return documents; } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java index 5e91f3cd..8cb2f61f 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java @@ -1,29 +1,33 @@ package no.digipost.signature.client.portal; -import no.digipost.signature.client.core.Document; import no.digipost.signature.client.core.DocumentType; import static java.util.Objects.requireNonNull; import static no.digipost.signature.client.core.DocumentType.PDF; -import static no.digipost.signature.client.core.internal.FileName.reduceToFileNameSafeChars; -public class PortalDocument extends Document { +public class PortalDocument { public static Builder builder(String title, byte[] document) { return new Builder(title, document); } - private PortalDocument(String title, DocumentType documentType, String fileName, byte[] document) { - super(title, documentType, fileName, document); + public final String title; + public final DocumentType type; + public final byte[] document; + + private PortalDocument(String title, DocumentType type, byte[] document) { + this.title = title; + this.type = type; + this.document = document; } + public static class Builder { private String title; private DocumentType documentType = PDF; - private String fileName; private byte[] document; public Builder(String title, byte[] document) { @@ -36,16 +40,8 @@ public Builder type(DocumentType documentType) { return this; } - public Builder fileName(String fileName) { - this.fileName = fileName; - return this; - } - public PortalDocument build() { - return new PortalDocument( - title, documentType, - fileName == null ? reduceToFileNameSafeChars(title) + "." + documentType.getFileExtension(): fileName, - document); + return new PortalDocument(title, documentType, document); } } } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index 94ed4f39..c3c3bee9 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -1,6 +1,7 @@ package no.digipost.signature.client.portal; import no.digipost.signature.client.core.AuthenticationLevel; +import no.digipost.signature.client.core.Document; import no.digipost.signature.client.core.IdentifierInSignedDocuments; import no.digipost.signature.client.core.Sender; import no.digipost.signature.client.core.SignatureJob; @@ -13,8 +14,10 @@ import java.util.Optional; import java.util.UUID; +import static java.lang.String.format; import static java.util.Collections.singletonList; import static java.util.Collections.unmodifiableList; +import static no.digipost.signature.client.core.internal.FileName.reduceToFileNameSafeChars; /** @@ -47,7 +50,14 @@ public String getReference() { } @Override - public List getDocuments() { + public List getDocuments() { + List documents = new ArrayList<>(); + for (int i = 0; i < this.documents.size(); i++) { + PortalDocument doc = this.documents.get(i); + documents.add(new Document(doc.title, doc.type, + format("%04d", i) + "_" + reduceToFileNameSafeChars(doc.title) + "." + doc.type.getFileExtension(), + doc.document)); + } return documents; } diff --git a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java index 39412ee2..05f6073e 100644 --- a/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java +++ b/src/test/java/no/digipost/signature/client/asice/CreateASiCETest.java @@ -4,6 +4,7 @@ import no.digipost.signature.client.asice.manifest.CreateDirectManifest; import no.digipost.signature.client.asice.manifest.CreatePortalManifest; import no.digipost.signature.client.asice.manifest.ManifestCreator; +import no.digipost.signature.client.core.Document; import no.digipost.signature.client.core.DocumentType; import no.digipost.signature.client.core.Sender; import no.digipost.signature.client.core.SignatureJob; @@ -31,16 +32,19 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import static java.nio.file.Files.newDirectoryStream; +import static java.util.Arrays.asList; +import static java.util.stream.Stream.concat; import static no.digipost.signature.client.TestKonfigurasjon.CLIENT_KEYSTORE; import static no.digipost.signature.client.asice.DumpDocumentBundleToDisk.TIMESTAMP_PATTERN; import static no.digipost.signature.client.asice.DumpDocumentBundleToDisk.referenceFilenamePart; import static no.digipost.signature.client.direct.ExitUrls.singleExitUrl; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.containsInAnyOrder; public class CreateASiCETest { @@ -67,7 +71,10 @@ public static void initTempFolder() throws URISyntaxException, IOException { @Test public void create_direct_asice_and_write_to_disk() throws IOException { - DirectJob job = DirectJob.builder("Job title", DIRECT_DOCUMENT, DirectSigner.withPersonalIdentificationNumber("12345678910").build(), singleExitUrl(URI.create("https://job.well.done.org"))) + DirectJob job = DirectJob.builder("Job title", + asList(DIRECT_DOCUMENT, DIRECT_DOCUMENT), + asList(DirectSigner.withPersonalIdentificationNumber("12345678910").build()), + singleExitUrl(URI.create("https://job.well.done.org"))) .withReference("direct job") .build(); @@ -76,7 +83,9 @@ public void create_direct_asice_and_write_to_disk() throws IOException { @Test public void create_portal_asice_and_write_to_disk() throws IOException { - PortalJob job = PortalJob.builder("Job title", PORTAL_DOCUMENT, PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build()) + PortalJob job = PortalJob.builder("Job title", + asList(PORTAL_DOCUMENT, PORTAL_DOCUMENT, PORTAL_DOCUMENT), + asList(PortalSigner.identifiedByPersonalIdentificationNumber("12345678910", NotificationsUsingLookup.EMAIL_ONLY).build())) .withReference("portal job") .withDescription("Message") .withActivationTime(clock.instant()) @@ -104,9 +113,10 @@ private static void create_document_bundle_and_dump_t fileNames.add(entry.getName()); } } - assertThat(fileNames, hasItem(job.getDocuments().get(0).getFileName())); - assertThat(fileNames, hasItem("manifest.xml")); - assertThat(fileNames, hasItem("META-INF/signatures.xml")); + assertThat(fileNames, containsInAnyOrder(concat( + job.getDocuments().stream().map(Document::getFileName), + Stream.of("manifest.xml", "META-INF/signatures.xml")) + .toArray(String[]::new))); } } From f7bb51111661eee37d9d05cde561d3e154d5f0e0 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Mon, 21 Jun 2021 00:33:11 +0200 Subject: [PATCH 32/36] Replace term mimeType with mediaType MediaType is the proper term, formerly known as MIME type https://www.iana.org/assignments/media-types/media-types.xhtml --- .../client/asice/ASiCEAttachable.java | 25 ++----------------- .../asice/manifest/CreateDirectManifest.java | 2 +- .../asice/manifest/CreatePortalManifest.java | 2 +- .../client/asice/manifest/Manifest.java | 4 +-- .../asice/signature/CreateXAdESArtifacts.java | 2 +- .../signature/SignableFileReference.java | 2 +- .../client/asice/signature/Signature.java | 4 +-- .../signature/client/core/Document.java | 10 ++++---- .../signature/client/core/DocumentType.java | 6 +---- .../signature/client/direct/DirectJob.java | 2 +- .../signature/client/portal/PortalJob.java | 2 +- .../client/asice/archive/CreateZipTest.java | 4 +-- .../asice/signature/CreateSignatureTest.java | 12 ++++----- 13 files changed, 26 insertions(+), 51 deletions(-) diff --git a/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java b/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java index dac05291..35b6c327 100644 --- a/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java +++ b/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java @@ -6,36 +6,15 @@ public interface ASiCEAttachable extends SignableFileReference { - interface Type { - static final Type XML = new Type() { - @Override - public String getMediaType() { - return "application/xml"; - } - - @Override - public String getFileExtension() { - return "xml"; - } - }; - - String getMediaType(); - - String getFileExtension(); - } - + public static final String XML_MEDIATYPE = "application/xml"; @Override String getFileName(); byte[] getBytes(); - ASiCEAttachable.Type getType(); - @Override - default String getMimeType() { - return getType().getMediaType(); - } + String getMediaType(); @Override default byte[] getSha256() { diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java index 3eaa5b00..b563decf 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java @@ -45,7 +45,7 @@ Object buildXmlManifest(DirectJob job, Sender sender) { .map(document -> new XMLDirectDocument() .withTitle(document.getTitle()) .withHref(XMLHref.of(document.getFileName())) - .withMime(document.getMimeType())) + .withMime(document.getMediaType())) .collect(toList())) .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)); } diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index 2d009984..293e74d1 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -64,7 +64,7 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .map(document -> new XMLPortalDocument() .withTitle(document.getTitle()) .withHref(XMLHref.of(document.getFileName())) - .withMime(document.getMimeType())) + .withMime(document.getMediaType())) .collect(toList())) .withAvailability(new XMLAvailability() .withActivationTime(activationTime) diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java index c337eab0..ae3c257d 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java @@ -21,8 +21,8 @@ public byte[] getBytes() { } @Override - public Type getType() { - return Type.XML; + public String getMediaType() { + return XML_MEDIATYPE; } } diff --git a/src/main/java/no/digipost/signature/client/asice/signature/CreateXAdESArtifacts.java b/src/main/java/no/digipost/signature/client/asice/signature/CreateXAdESArtifacts.java index 228c9fc8..2ea05a09 100644 --- a/src/main/java/no/digipost/signature/client/asice/signature/CreateXAdESArtifacts.java +++ b/src/main/java/no/digipost/signature/client/asice/signature/CreateXAdESArtifacts.java @@ -60,7 +60,7 @@ private List dataObjectFormats(List result = new ArrayList<>(); for (int i = 0; i < files.size(); i++) { String signatureElementIdReference = format("#ID_%s", i); - result.add(new DataObjectFormat(null, null, files.get(i).getMimeType(), null, signatureElementIdReference)); + result.add(new DataObjectFormat(null, null, files.get(i).getMediaType(), null, signatureElementIdReference)); } return result; } diff --git a/src/main/java/no/digipost/signature/client/asice/signature/SignableFileReference.java b/src/main/java/no/digipost/signature/client/asice/signature/SignableFileReference.java index 3c720f8a..508a1584 100644 --- a/src/main/java/no/digipost/signature/client/asice/signature/SignableFileReference.java +++ b/src/main/java/no/digipost/signature/client/asice/signature/SignableFileReference.java @@ -6,6 +6,6 @@ public interface SignableFileReference { byte[] getSha256(); - String getMimeType(); + String getMediaType(); } diff --git a/src/main/java/no/digipost/signature/client/asice/signature/Signature.java b/src/main/java/no/digipost/signature/client/asice/signature/Signature.java index cc3a5400..092ae72c 100644 --- a/src/main/java/no/digipost/signature/client/asice/signature/Signature.java +++ b/src/main/java/no/digipost/signature/client/asice/signature/Signature.java @@ -21,8 +21,8 @@ public byte[] getBytes() { } @Override - public Type getType() { - return Type.XML; + public String getMediaType() { + return XML_MEDIATYPE; } } diff --git a/src/main/java/no/digipost/signature/client/core/Document.java b/src/main/java/no/digipost/signature/client/core/Document.java index 1eeaab09..857dfc05 100644 --- a/src/main/java/no/digipost/signature/client/core/Document.java +++ b/src/main/java/no/digipost/signature/client/core/Document.java @@ -5,13 +5,13 @@ public class Document implements ASiCEAttachable { private final String title; - private final DocumentType documentType; + private final String mediaType; private final String fileName; private final byte[] document; - public Document(String title, DocumentType documentType, String fileName, byte[] document) { + public Document(String title, String mediaType, String fileName, byte[] document) { this.title = title; - this.documentType = documentType; + this.mediaType = mediaType; this.fileName = fileName; this.document = document; } @@ -26,8 +26,8 @@ public String getFileName() { } @Override - public Type getType() { - return documentType; + public String getMediaType() { + return mediaType; } @Override diff --git a/src/main/java/no/digipost/signature/client/core/DocumentType.java b/src/main/java/no/digipost/signature/client/core/DocumentType.java index abbabf14..17dd509e 100644 --- a/src/main/java/no/digipost/signature/client/core/DocumentType.java +++ b/src/main/java/no/digipost/signature/client/core/DocumentType.java @@ -1,8 +1,6 @@ package no.digipost.signature.client.core; -import no.digipost.signature.client.asice.ASiCEAttachable; - -public enum DocumentType implements ASiCEAttachable.Type { +public enum DocumentType { PDF("application/pdf", "pdf"), TXT("text/plain", "txt"); @@ -15,12 +13,10 @@ public enum DocumentType implements ASiCEAttachable.Type { this.fileExtension = fileExtension; } - @Override public String getMediaType() { return mediaType; } - @Override public String getFileExtension() { return fileExtension; } diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index e27ebf45..4ad6416f 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -57,7 +57,7 @@ public List getDocuments() { List documents = new ArrayList<>(); for (int i = 0; i < this.documents.size(); i++) { DirectDocument doc = this.documents.get(i); - documents.add(new Document(doc.title, doc.type, + documents.add(new Document(doc.title, doc.type.getMediaType(), format("%04d", i) + "_" + reduceToFileNameSafeChars(doc.title) + "." + doc.type.getFileExtension(), doc.document)); } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index c3c3bee9..a8936472 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -54,7 +54,7 @@ public List getDocuments() { List documents = new ArrayList<>(); for (int i = 0; i < this.documents.size(); i++) { PortalDocument doc = this.documents.get(i); - documents.add(new Document(doc.title, doc.type, + documents.add(new Document(doc.title, doc.type.getMediaType(), format("%04d", i) + "_" + reduceToFileNameSafeChars(doc.title) + "." + doc.type.getFileExtension(), doc.document)); } diff --git a/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java b/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java index 9e5bcd83..e574b15b 100644 --- a/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java +++ b/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java @@ -55,8 +55,8 @@ public byte[] getBytes() { } @Override - public Type getType() { - return DocumentType.TXT; + public String getMediaType() { + return DocumentType.TXT.getMediaType(); } }; } diff --git a/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java b/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java index a8b9d092..7dc71256 100644 --- a/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java +++ b/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java @@ -55,8 +55,8 @@ public class CreateSignatureTest { public void setUp() { noekkelpar = TestKonfigurasjon.CLIENT_KEYSTORE; files = asList( - file("dokument.pdf", "hoveddokument-innhold".getBytes(), DocumentType.PDF), - file("manifest.xml", "manifest-innhold".getBytes(), ASiCEAttachable.Type.XML) + file("dokument.pdf", "hoveddokument-innhold".getBytes(), DocumentType.PDF.getMediaType()), + file("manifest.xml", "manifest-innhold".getBytes(), ASiCEAttachable.XML_MEDIATYPE) ); ZonedDateTime signingTime = ZonedDateTime.of(2018, 11, 29, 9, 15, 0, 0, ZoneId.of("Europe/Oslo")); @@ -103,8 +103,8 @@ public void test_xades_signed_properties() { @Test public void should_support_filenames_with_spaces_and_other_characters() { List otherFiles = asList( - file("dokument (2).pdf", "hoveddokument-innhold".getBytes(), DocumentType.PDF), - file("manifest.xml", "manifest-innhold".getBytes(), ASiCEAttachable.Type.XML) + file("dokument (2).pdf", "hoveddokument-innhold".getBytes(), DocumentType.PDF.getMediaType()), + file("manifest.xml", "manifest-innhold".getBytes(), ASiCEAttachable.XML_MEDIATYPE) ); Signature signature = createSignature.createSignature(otherFiles, noekkelpar); @@ -161,14 +161,14 @@ private void assert_dokument_reference(final Reference dokumentReference) { assertThat(dokumentReference.getDigestMethod().getAlgorithm(), is("http://www.w3.org/2001/04/xmlenc#sha256")); } - private ASiCEAttachable file(String fileName, byte[] contents, ASiCEAttachable.Type type) { + private ASiCEAttachable file(String fileName, byte[] contents, String mediaType) { return new ASiCEAttachable() { @Override public String getFileName() { return fileName; } @Override public byte[] getBytes() { return contents; } @Override - public Type getType() { return type; } + public String getMediaType() { return mediaType; } }; } From 5dd4cc6a49043687feedcc5b6dc71e89b3ebd56d Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Mon, 21 Jun 2021 10:46:38 +0200 Subject: [PATCH 33/36] API specification 2.8-RC3 JAXB-classes uses "mediaType" instead of "mime" https://github.com/digipost/signature-api-specification/commit/5d7dcb7c1bbd2381ff93770d64e11b5561d6347e --- pom.xml | 2 +- .../signature/client/asice/manifest/CreateDirectManifest.java | 2 +- .../signature/client/asice/manifest/CreatePortalManifest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 1a143efb..571de768 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 set_with_-Dproject.previousVersion=X.Y - 2.8-RC2 + 2.8-RC3 1.7.30 diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java index b563decf..75b022f2 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreateDirectManifest.java @@ -45,7 +45,7 @@ Object buildXmlManifest(DirectJob job, Sender sender) { .map(document -> new XMLDirectDocument() .withTitle(document.getTitle()) .withHref(XMLHref.of(document.getFileName())) - .withMime(document.getMediaType())) + .withMediaType(document.getMediaType())) .collect(toList())) .withIdentifierInSignedDocuments(job.getIdentifierInSignedDocuments().map(IdentifierInSignedDocuments::getXmlEnumValue).orElse(null)); } diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java index 293e74d1..574fde06 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/CreatePortalManifest.java @@ -64,7 +64,7 @@ Object buildXmlManifest(PortalJob job, Sender sender) { .map(document -> new XMLPortalDocument() .withTitle(document.getTitle()) .withHref(XMLHref.of(document.getFileName())) - .withMime(document.getMediaType())) + .withMediaType(document.getMediaType())) .collect(toList())) .withAvailability(new XMLAvailability() .withActivationTime(activationTime) From 944012fa717a5509a0f482f19691f17a25aff422 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Mon, 21 Jun 2021 10:53:01 +0200 Subject: [PATCH 34/36] Upgrade SLF4J and commons-io --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 571de768..16ef0b51 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ 1.8 set_with_-Dproject.previousVersion=X.Y 2.8-RC3 - 1.7.30 + 1.7.31 @@ -106,7 +106,7 @@ commons-io commons-io - 2.9.0 + 2.10.0 test From bb665c546085a091d96e1092f729ab06e31d6007 Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Tue, 22 Jun 2021 10:45:22 +0200 Subject: [PATCH 35/36] Consistently use "content" for the document bytes A "document" is the entity encapsulating its title, type, checksum, etc, as well as its content. --- NOTICE | 4 ++-- pom.xml | 2 +- .../client/asice/ASiCEAttachable.java | 4 ++-- .../client/asice/archive/CreateZip.java | 4 ++-- .../client/asice/manifest/Manifest.java | 2 +- .../client/asice/signature/Signature.java | 2 +- .../signature/client/core/Document.java | 10 ++++---- .../client/direct/DirectDocument.java | 24 +++++++++---------- .../signature/client/direct/DirectJob.java | 8 +++---- .../client/portal/PortalDocument.java | 24 +++++++++---------- .../signature/client/portal/PortalJob.java | 8 +++---- .../client/asice/archive/CreateZipTest.java | 2 +- .../asice/signature/CreateSignatureTest.java | 8 +++---- 13 files changed, 51 insertions(+), 51 deletions(-) diff --git a/NOTICE b/NOTICE index f6aa60f9..4fa4feb8 100644 --- a/NOTICE +++ b/NOTICE @@ -14,10 +14,10 @@ This software includes third party software subject to the following licenses: Apache HttpCore under Apache License, Version 2.0 istack common utility code runtime under Eclipse Distribution License - v 1.0 Jakarta Activation under EDL 1.0 + Jakarta Activation API jar under EDL 1.0 Jakarta Annotations API under EPL 2.0 or GPL2 w/ CPE + Jakarta XML Binding API under Eclipse Distribution License - v 1.0 jakarta.ws.rs-api under EPL 2.0 or GPL2 w/ CPE - jakarta.xml.bind-api under Eclipse Distribution License - v 1.0 - JavaBeans Activation Framework API jar under EDL 1.0 javax.inject:1 as OSGi bundle under EPL 2.0 or GPL2 w/ CPE JAXB Runtime under Eclipse Distribution License - v 1.0 JAXB2 Basics - Runtime under BSD-Style License diff --git a/pom.xml b/pom.xml index 16ef0b51..7adec564 100644 --- a/pom.xml +++ b/pom.xml @@ -194,7 +194,7 @@ no.digipost digg - 0.29 + 0.30 test diff --git a/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java b/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java index 35b6c327..844ca482 100644 --- a/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java +++ b/src/main/java/no/digipost/signature/client/asice/ASiCEAttachable.java @@ -11,13 +11,13 @@ public interface ASiCEAttachable extends SignableFileReference { @Override String getFileName(); - byte[] getBytes(); + byte[] getContent(); @Override String getMediaType(); @Override default byte[] getSha256() { - return sha256(getBytes()); + return sha256(getContent()); } } diff --git a/src/main/java/no/digipost/signature/client/asice/archive/CreateZip.java b/src/main/java/no/digipost/signature/client/asice/archive/CreateZip.java index e7a10795..0ad6a2be 100644 --- a/src/main/java/no/digipost/signature/client/asice/archive/CreateZip.java +++ b/src/main/java/no/digipost/signature/client/asice/archive/CreateZip.java @@ -16,9 +16,9 @@ public byte[] zipIt(final List files) { try (ZipOutputStream zipOutputStream = new ZipOutputStream(archive)) { for (ASiCEAttachable file : files) { ZipEntry zipEntry = new ZipEntry(file.getFileName()); - zipEntry.setSize(file.getBytes().length); + zipEntry.setSize(file.getContent().length); zipOutputStream.putNextEntry(zipEntry); - zipOutputStream.write(file.getBytes()); + zipOutputStream.write(file.getContent()); zipOutputStream.closeEntry(); } } diff --git a/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java b/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java index ae3c257d..e79823e7 100644 --- a/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java +++ b/src/main/java/no/digipost/signature/client/asice/manifest/Manifest.java @@ -16,7 +16,7 @@ public String getFileName() { } @Override - public byte[] getBytes() { + public byte[] getContent() { return xmlBytes; } diff --git a/src/main/java/no/digipost/signature/client/asice/signature/Signature.java b/src/main/java/no/digipost/signature/client/asice/signature/Signature.java index 092ae72c..5335e154 100644 --- a/src/main/java/no/digipost/signature/client/asice/signature/Signature.java +++ b/src/main/java/no/digipost/signature/client/asice/signature/Signature.java @@ -16,7 +16,7 @@ public String getFileName() { } @Override - public byte[] getBytes() { + public byte[] getContent() { return xmlBytes; } diff --git a/src/main/java/no/digipost/signature/client/core/Document.java b/src/main/java/no/digipost/signature/client/core/Document.java index 857dfc05..bb6884fe 100644 --- a/src/main/java/no/digipost/signature/client/core/Document.java +++ b/src/main/java/no/digipost/signature/client/core/Document.java @@ -7,13 +7,13 @@ public class Document implements ASiCEAttachable { private final String title; private final String mediaType; private final String fileName; - private final byte[] document; + private final byte[] content; - public Document(String title, String mediaType, String fileName, byte[] document) { + public Document(String title, String mediaType, String fileName, byte[] content) { this.title = title; this.mediaType = mediaType; this.fileName = fileName; - this.document = document; + this.content = content; } public String getTitle() { @@ -31,8 +31,8 @@ public String getMediaType() { } @Override - public byte[] getBytes() { - return document; + public byte[] getContent() { + return content; } } diff --git a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java index 8dc244b4..6f03f01d 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectDocument.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectDocument.java @@ -8,40 +8,40 @@ public class DirectDocument { - public static Builder builder(String title, byte[] document) { - return new Builder(title, document); + public static Builder builder(String title, byte[] documentContent) { + return new Builder(title, documentContent); } public final String title; public final DocumentType type; - public final byte[] document; + public final byte[] content; - private DirectDocument(String title, DocumentType type, byte[] document) { + private DirectDocument(String title, DocumentType type, byte[] content) { this.title = title; this.type = type; - this.document = document; + this.content = content; } public static class Builder { private String title; - private DocumentType documentType = PDF; - private byte[] document; + private DocumentType type = PDF; + private byte[] content; - public Builder(String title, byte[] document) { + private Builder(String title, byte[] content) { this.title = requireNonNull(title, "title"); - this.document = requireNonNull(document, "document bytes"); + this.content = requireNonNull(content, "document content"); } - public Builder type(DocumentType documentType) { - this.documentType = requireNonNull(documentType, "document type"); + public Builder type(DocumentType type) { + this.type = requireNonNull(type, "document type"); return this; } public DirectDocument build() { - return new DirectDocument(title, documentType, document); + return new DirectDocument(title, type, content); } } } diff --git a/src/main/java/no/digipost/signature/client/direct/DirectJob.java b/src/main/java/no/digipost/signature/client/direct/DirectJob.java index 4ad6416f..1299ef5c 100644 --- a/src/main/java/no/digipost/signature/client/direct/DirectJob.java +++ b/src/main/java/no/digipost/signature/client/direct/DirectJob.java @@ -56,10 +56,10 @@ public String getReference() { public List getDocuments() { List documents = new ArrayList<>(); for (int i = 0; i < this.documents.size(); i++) { - DirectDocument doc = this.documents.get(i); - documents.add(new Document(doc.title, doc.type.getMediaType(), - format("%04d", i) + "_" + reduceToFileNameSafeChars(doc.title) + "." + doc.type.getFileExtension(), - doc.document)); + DirectDocument document = this.documents.get(i); + documents.add(new Document(document.title, document.type.getMediaType(), + format("%04d", i) + "_" + reduceToFileNameSafeChars(document.title) + "." + document.type.getFileExtension(), + document.content)); } return documents; } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java index 8cb2f61f..c15b3c6a 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalDocument.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalDocument.java @@ -8,40 +8,40 @@ public class PortalDocument { - public static Builder builder(String title, byte[] document) { - return new Builder(title, document); + public static Builder builder(String title, byte[] documentContent) { + return new Builder(title, documentContent); } public final String title; public final DocumentType type; - public final byte[] document; + public final byte[] content; - private PortalDocument(String title, DocumentType type, byte[] document) { + private PortalDocument(String title, DocumentType type, byte[] content) { this.title = title; this.type = type; - this.document = document; + this.content = content; } public static class Builder { private String title; - private DocumentType documentType = PDF; - private byte[] document; + private DocumentType type = PDF; + private byte[] content; - public Builder(String title, byte[] document) { + public Builder(String title, byte[] content) { this.title = requireNonNull(title, "title"); - this.document = requireNonNull(document, "document bytes"); + this.content = requireNonNull(content, "document content"); } - public Builder type(DocumentType documentType) { - this.documentType = requireNonNull(documentType, "document type"); + public Builder type(DocumentType type) { + this.type = requireNonNull(type, "document type"); return this; } public PortalDocument build() { - return new PortalDocument(title, documentType, document); + return new PortalDocument(title, type, content); } } } diff --git a/src/main/java/no/digipost/signature/client/portal/PortalJob.java b/src/main/java/no/digipost/signature/client/portal/PortalJob.java index a8936472..7b0a6a73 100644 --- a/src/main/java/no/digipost/signature/client/portal/PortalJob.java +++ b/src/main/java/no/digipost/signature/client/portal/PortalJob.java @@ -53,10 +53,10 @@ public String getReference() { public List getDocuments() { List documents = new ArrayList<>(); for (int i = 0; i < this.documents.size(); i++) { - PortalDocument doc = this.documents.get(i); - documents.add(new Document(doc.title, doc.type.getMediaType(), - format("%04d", i) + "_" + reduceToFileNameSafeChars(doc.title) + "." + doc.type.getFileExtension(), - doc.document)); + PortalDocument document = this.documents.get(i); + documents.add(new Document(document.title, document.type.getMediaType(), + format("%04d", i) + "_" + reduceToFileNameSafeChars(document.title) + "." + document.type.getFileExtension(), + document.content)); } return documents; } diff --git a/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java b/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java index e574b15b..7cd80db2 100644 --- a/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java +++ b/src/test/java/no/digipost/signature/client/asice/archive/CreateZipTest.java @@ -50,7 +50,7 @@ public String getFileName() { } @Override - public byte[] getBytes() { + public byte[] getContent() { return contents.getBytes(); } diff --git a/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java b/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java index 7dc71256..918d6842 100644 --- a/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java +++ b/src/test/java/no/digipost/signature/client/asice/signature/CreateSignatureTest.java @@ -76,7 +76,7 @@ public void test_generated_signatures() { "PAdNndCACJiWrkHNQ5gTJ+UWx8y2kuzZHEGGTJ+ip9KpCRohDfLapQAMTh0zMLrUNbYpq6kiYWrlxTNfdcVm4skBY0j9Q=="; Signature signature = createSignature.createSignature(files, noekkelpar); - XAdESSignatures xAdESSignatures = (XAdESSignatures) marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(signature.getBytes()))); + XAdESSignatures xAdESSignatures = (XAdESSignatures) marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(signature.getContent()))); assertThat(xAdESSignatures, where(XAdESSignatures::getSignatures, hasSize(1))); no.digipost.signature.api.xml.thirdparty.xmldsig.Signature dSignature = xAdESSignatures.getSignatures().get(0); @@ -89,7 +89,7 @@ public void test_generated_signatures() { public void test_xades_signed_properties() { Signature signature = createSignature.createSignature(files, noekkelpar); - XAdESSignatures xAdESSignatures = (XAdESSignatures) marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(signature.getBytes()))); + XAdESSignatures xAdESSignatures = (XAdESSignatures) marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(signature.getContent()))); no.digipost.signature.api.xml.thirdparty.xmldsig.Object object = xAdESSignatures.getSignatures().get(0).getObjects().get(0); QualifyingProperties xadesProperties = (QualifyingProperties) object.getContent().get(0); @@ -108,7 +108,7 @@ public void should_support_filenames_with_spaces_and_other_characters() { ); Signature signature = createSignature.createSignature(otherFiles, noekkelpar); - XAdESSignatures xAdESSignatures = (XAdESSignatures) marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(signature.getBytes()))); + XAdESSignatures xAdESSignatures = (XAdESSignatures) marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(signature.getContent()))); String uri = xAdESSignatures.getSignatures().get(0).getSignedInfo().getReferences().get(0).getURI(); assertThat(uri, is("dokument+%282%29.pdf")); } @@ -166,7 +166,7 @@ private ASiCEAttachable file(String fileName, byte[] contents, String mediaType) @Override public String getFileName() { return fileName; } @Override - public byte[] getBytes() { return contents; } + public byte[] getContent() { return contents; } @Override public String getMediaType() { return mediaType; } }; From aeb9f7a3ea4046bf89781496f0215510d969546b Mon Sep 17 00:00:00 2001 From: Rune Flobakk Date: Tue, 22 Jun 2021 22:23:28 +0200 Subject: [PATCH 36/36] API specification 2.8 Support multiple documents for jobs in API, final release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7adec564..a78e4f4a 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 set_with_-Dproject.previousVersion=X.Y - 2.8-RC3 + 2.8 1.7.31