From 67c82c98fbd59ff04f3556f1b28569958a5e66c6 Mon Sep 17 00:00:00 2001 From: Adrian Cumiskey Date: Tue, 18 Nov 2008 09:57:08 +0000 Subject: [PATCH] Merged revisions 718309,718502 via svnmerge from https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk ........ r718309 | adelmelle | 2008-11-17 18:18:20 +0000 (Mon, 17 Nov 2008) | 4 lines Bugzilla 46211: Fixed some multi-threading issues in FontCache.java (+ some minor cleanup: simplification of conditionals) Thanks to rogov.AT.devexperts.com for tracing and reporting the problem. ........ r718502 | adelmelle | 2008-11-18 06:43:08 +0000 (Tue, 18 Nov 2008) | 1 line Removed erroneous end-element... ........ git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@718538 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/fop/fonts/FontCache.java | 42 +++++++------------- status.xml | 15 +++++-- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/java/org/apache/fop/fonts/FontCache.java b/src/java/org/apache/fop/fonts/FontCache.java index 2528989bb..a3ff1b672 100644 --- a/src/java/org/apache/fop/fonts/FontCache.java +++ b/src/java/org/apache/fop/fonts/FontCache.java @@ -48,7 +48,7 @@ public final class FontCache implements Serializable { * Serialization Version UID. Change this value if you want to make sure the user's cache * file is purged after an update. */ - private static final long serialVersionUID = 605232520271754718L; + private static final long serialVersionUID = 605232520271754719L; /** logging instance */ private static Log log = LogFactory.getLog(FontCache.class); @@ -64,7 +64,7 @@ public final class FontCache implements Serializable { private transient boolean changed = false; /** change lock */ - private transient Object changeLock = new Object(); + private final Object changeLock = new Object(); /** master mapping of font url -> font info. This needs to be * a list, since a TTC file may contain more than 1 font. */ @@ -80,12 +80,6 @@ public final class FontCache implements Serializable { //nop } - private void readObject(java.io.ObjectInputStream in) - throws IOException, ClassNotFoundException { - in.defaultReadObject(); - this.changeLock = new Object(); //Initialize transient field - } - private static File getUserHome() { String s = System.getProperty("user.home"); if (s != null) { @@ -226,10 +220,8 @@ public final class FontCache implements Serializable { * @return boolean */ public boolean containsFont(String embedUrl) { - if (embedUrl != null) { - return getFontFileMap().containsKey(embedUrl); - } - return false; + return (embedUrl != null + && getFontFileMap().containsKey(embedUrl)); } /** @@ -238,10 +230,8 @@ public final class FontCache implements Serializable { * @return font */ public boolean containsFont(EmbedFontInfo fontInfo) { - if (fontInfo != null) { - return getFontFileMap().containsKey(getCacheKey(fontInfo)); - } - return false; + return (fontInfo != null + && getFontFileMap().containsKey(getCacheKey(fontInfo))); } /** @@ -316,10 +306,7 @@ public final class FontCache implements Serializable { * @return CachedFontFile object */ public CachedFontFile getFontFile(String embedUrl) { - if (containsFont(embedUrl)) { - return (CachedFontFile)getFontFileMap().get(embedUrl); - } - return null; + return containsFont(embedUrl) ? (CachedFontFile) getFontFileMap().get(embedUrl) : null; } /** @@ -362,8 +349,8 @@ public final class FontCache implements Serializable { * @return whether this is a failed font */ public boolean isFailedFont(String embedUrl, long lastModified) { - if (getFailedFontMap().containsKey(embedUrl)) { - synchronized (changeLock) { + synchronized (changeLock) { + if (getFailedFontMap().containsKey(embedUrl)) { long failedLastModified = ((Long)getFailedFontMap().get(embedUrl)).longValue(); if (lastModified != failedLastModified) { // this font has been changed so lets remove it @@ -371,10 +358,11 @@ public final class FontCache implements Serializable { getFailedFontMap().remove(embedUrl); changed = true; } + return true; + } else { + return false; } - return true; } - return false; } /** @@ -457,10 +445,8 @@ public final class FontCache implements Serializable { } public boolean containsFont(EmbedFontInfo efi) { - if (efi.getPostScriptName() != null) { - return getFileFontsMap().containsKey(efi.getPostScriptName()); - } - return false; + return efi.getPostScriptName() != null + && getFileFontsMap().containsKey(efi.getPostScriptName()); } public EmbedFontInfo[] getEmbedFontInfos() { diff --git a/status.xml b/status.xml index 8bb42c351..c0e1e5a3d 100644 --- a/status.xml +++ b/status.xml @@ -54,17 +54,24 @@ - AFP Output: An AFPGraphics2D implementation which provides the ability to use Batik to drive the production of AFP Graphics (GOCA) output from SVG. - Added SVG support for AFP (GOCA). + AFP Output: An AFPGraphics2D implementation which provides the ability to use Batik to drive the production of AFP Graphics (GOCA) output from SVG. - AFP Output: Resource group leveling, external streaming and de-duplication of images and graphics using IncludeObject and ResourceGroup. + AFP Output: Resource group leveling, external streaming, and de-duplication of images and graphics using IncludeObject and ResourceGroup. AFP Output: Native image embedding support (e.g. JPEG, GIF, TIFF) using ObjectContainer and a MOD:CA Registry implementation. - AFP Output: More robust AFP font parsing, although it is still in need of some rework in the future. + More robust AFP font parsing, although it is still in need of some rework in the future. + + + Fixed some multi-threading issues in FontCache.java: +
    +
  • remove the unused private readObject()
  • +
  • make the changeLock member final (initialization-safety + impossible to reassign)
  • +
  • perform the HashMap check for a failed font inside the synchronized block to avoid a race condition
  • +
Added PDF /Launch action: references to URIs using the file:// protocol will now generate -- 2.39.5