From 3679f37f129b16daadb490d6987fdd038b096bfc Mon Sep 17 00:00:00 2001 From: Jakob Heher Date: Mon, 8 Aug 2022 13:32:30 +0200 Subject: cached asynchronous pdf-as placeholders --- .../signer/pdfas/PdfAs4SignatureParameter.java | 2 +- .../signer/pdfas/PdfAs4SignaturePlaceholder.java | 70 ++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignaturePlaceholder.java (limited to 'pdf-over-signer') diff --git a/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignatureParameter.java b/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignatureParameter.java index 4356f1e0..78dda185 100644 --- a/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignatureParameter.java +++ b/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignatureParameter.java @@ -83,7 +83,7 @@ public class PdfAs4SignatureParameter { /** The signature profile in use */ public Profile signatureProfile = Profile.getDefaultProfile(); - public Image getPlaceholder() { + Image getPlaceholder() { String sigProfile = getPdfAsSignatureProfileId(); String sigEmblem = (this.emblem == null ? null : this.emblem.getCachedFileName()); diff --git a/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignaturePlaceholder.java b/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignaturePlaceholder.java new file mode 100644 index 00000000..b944bf24 --- /dev/null +++ b/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SignaturePlaceholder.java @@ -0,0 +1,70 @@ +package at.asit.pdfover.signer.pdfas; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.TreeMap; +import java.util.function.Consumer; + +import at.asit.pdfover.commons.utils.ImageUtil; + +/** + * caches placeholders for signature parameters (placeholder generation is pretty slow) + */ +public final class PdfAs4SignaturePlaceholder implements Runnable { + private static TreeMap cache = new TreeMap<>( + Comparator + .comparing(PdfAs4SignatureParameter::getPdfAsSignatureProfileId) + .thenComparing((p) -> { return (p.emblem != null) ? p.emblem.getOriginalFileHash() : ""; }) + .thenComparing((p) -> { return p.signatureNote; }, Comparator.nullsFirst(String::compareTo)) + ); + + /** + * request a placeholder for the specified parameter asynchronously + * @param callback the callback to be invoked on completion (may also be invoked before this function returns!) + */ + public static void For(PdfAs4SignatureParameter param, Consumer callback) { + synchronized(cache) { + cache.computeIfAbsent(param, (p) -> new PdfAs4SignaturePlaceholder(p)).AddCallback(callback); + } + } + + private final PdfAs4SignatureParameter param; + private PdfAs4SignaturePlaceholder(PdfAs4SignatureParameter param) { + this.param = param; + new Thread(this).start(); + } + + private java.awt.image.BufferedImage awtImageData; + /** AWT image data for the placeholder */ + public java.awt.image.BufferedImage getAWTImage() { return this.awtImageData; } + private org.eclipse.swt.graphics.ImageData swtImageData; + /** SWT image data for the placeholder */ + public org.eclipse.swt.graphics.ImageData getSWTImage() { return this.swtImageData; } + + private ArrayList> callbacks = new ArrayList<>(); + private void AddCallback(Consumer c) { + synchronized (this) { + if (this.callbacks != null) + { + this.callbacks.add(c); + return; + } /* else... */ + } + /* ... else, not synchronized */ + c.accept(this); + } + + + @Override + public void run() { + this.awtImageData = (java.awt.image.BufferedImage) this.param.getPlaceholder(); + this.swtImageData = ImageUtil.convertToSWT(this.awtImageData); + ArrayList> _callbacks; + synchronized (this) { + _callbacks = this.callbacks; + this.callbacks = null; + } + _callbacks.forEach((c) -> c.accept(this)); + } + +} -- cgit v1.2.3