Author: ssteiner Date: Fri Feb 26 13:23:21 2021 New Revision: 1886951 URL: http://svn.apache.org/viewvc?rev=1886951&view=rev Log: FOP-3002: Optimise memory usage for data uri
Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java?rev=1886951&r1=1886950&r2=1886951&view=diff ============================================================================== --- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java (original) +++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java Fri Feb 26 13:23:21 2021 @@ -23,6 +23,7 @@ package org.apache.fop.pdf; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collection; @@ -36,6 +37,8 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.xmlgraphics.image.loader.util.SoftMapCache; + import org.apache.fop.pdf.StandardStructureAttributes.Table.Scope; import org.apache.fop.pdf.xref.CrossReferenceStream; import org.apache.fop.pdf.xref.CrossReferenceTable; @@ -131,6 +134,7 @@ public class PDFDocument { /* TODO: Should be modified (works only for image subtype) */ private Map<String, PDFXObject> xObjectsMap = new HashMap<String, PDFXObject>(); + private SoftMapCache xObjectsMapFast = new SoftMapCache(false); private Map<String, PDFFont> fontMap = new HashMap<String, PDFFont>(); @@ -800,7 +804,7 @@ public class PDFDocument { */ @Deprecated public PDFImageXObject getImage(String key) { - return (PDFImageXObject)this.xObjectsMap.get(key); + return (PDFImageXObject)getXObject(key); } /** @@ -810,7 +814,34 @@ public class PDFDocument { * @return the PDFXObject for the key if found */ public PDFXObject getXObject(String key) { - return this.xObjectsMap.get(key); + Object xObj = xObjectsMapFast.get(key); + if (xObj != null) { + return (PDFXObject) xObj; + } + return xObjectsMap.get(toHashCode(key)); + } + + private void putXObject(String key, PDFXObject pdfxObject) { + xObjectsMapFast.clear(); + xObjectsMapFast.put(key, pdfxObject); + xObjectsMap.put(toHashCode(key), pdfxObject); + } + + private String toHashCode(String key) { + if (key.length() < 1024) { + return key; + } + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] thedigest = md.digest(key.getBytes("UTF-8")); + StringBuilder hex = new StringBuilder(); + for (byte b : thedigest) { + hex.append(String.format("%02x", b)); + } + return hex.toString(); + } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { + throw new RuntimeException(e); + } } /** @@ -859,7 +890,7 @@ public class PDFDocument { public PDFImageXObject addImage(PDFResourceContext res, PDFImage img) { // check if already created String key = img.getKey(); - PDFImageXObject xObject = (PDFImageXObject)this.xObjectsMap.get(key); + PDFImageXObject xObject = (PDFImageXObject)getXObject(key); if (xObject != null) { if (res != null) { res.addXObject(xObject); @@ -876,7 +907,7 @@ public class PDFDocument { if (res != null) { res.addXObject(xObject); } - this.xObjectsMap.put(key, xObject); + putXObject(key, xObject); return xObject; } @@ -899,7 +930,7 @@ public class PDFDocument { String key) { // check if already created - PDFFormXObject xObject = (PDFFormXObject)xObjectsMap.get(key); + PDFFormXObject xObject = (PDFFormXObject)getXObject(key); if (xObject != null) { if (res != null) { res.addXObject(xObject); @@ -916,7 +947,7 @@ public class PDFDocument { if (res != null) { res.addXObject(xObject); } - this.xObjectsMap.put(key, xObject); + putXObject(key, xObject); return xObject; } --------------------------------------------------------------------- To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org