You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by me...@apache.org on 2012/08/10 12:16:23 UTC

svn commit: r1371639 - in /xmlgraphics/fop/trunk: src/java/org/apache/fop/afp/fonts/CharacterSetBuilder.java src/java/org/apache/fop/afp/modca/IncludedResourceObject.java src/java/org/apache/fop/afp/util/AFPResourceAccessor.java status.xml

Author: mehdi
Date: Fri Aug 10 10:16:22 2012
New Revision: 1371639

URL: http://svn.apache.org/viewvc?rev=1371639&view=rev
Log:
Bugzilla#53685 - AFP charactersets are cached using more unique keys

Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/CharacterSetBuilder.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/IncludedResourceObject.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/util/AFPResourceAccessor.java
    xmlgraphics/fop/trunk/status.xml

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/CharacterSetBuilder.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/CharacterSetBuilder.java?rev=1371639&r1=1371638&r2=1371639&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/CharacterSetBuilder.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/CharacterSetBuilder.java Fri Aug 10 10:16:22 2012
@@ -236,9 +236,9 @@ public abstract class CharacterSetBuilde
             CharacterSetType charsetType, AFPResourceAccessor accessor, AFPEventProducer eventProducer)
             throws IOException {
         // check for cached version of the characterset
-        String descriptor = characterSetName + "_" + encoding + "_" + codePageName;
-        CharacterSet characterSet = (CharacterSet) characterSetsCache.get(descriptor);
-
+        URI charSetURI = accessor.resolveURI(characterSetName);
+        String cacheKey = charSetURI.toASCIIString() + "_" + characterSetName + "_" + codePageName;
+        CharacterSet characterSet = (CharacterSet) characterSetsCache.get(cacheKey);
         if (characterSet != null) {
             return characterSet;
         }
@@ -257,6 +257,8 @@ public abstract class CharacterSetBuilde
              * chracter global identifier.
              */
             Map<String, String> codePage;
+            // TODO: This could have performance implications if several threads want to use the
+            // codePagesCache to retrieve different codepages.
             synchronized (codePagesCache) {
                 codePage = codePagesCache.get(codePageName);
 
@@ -308,7 +310,7 @@ public abstract class CharacterSetBuilde
         } finally {
             closeInputStream(inputStream);
         }
-        characterSetsCache.put(descriptor, characterSet);
+        characterSetsCache.put(cacheKey, characterSet);
         return characterSet;
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/IncludedResourceObject.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/IncludedResourceObject.java?rev=1371639&r1=1371638&r2=1371639&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/IncludedResourceObject.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/IncludedResourceObject.java Fri Aug 10 10:16:22 2012
@@ -34,7 +34,7 @@ import org.apache.fop.afp.util.AFPResour
  */
 public class IncludedResourceObject extends AbstractNamedAFPObject {
 
-    private AFPResourceAccessor resourceAccessor;
+    private final AFPResourceAccessor resourceAccessor;
     private URI uri;
 
     /**

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/util/AFPResourceAccessor.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/util/AFPResourceAccessor.java?rev=1371639&r1=1371638&r2=1371639&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/util/AFPResourceAccessor.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/util/AFPResourceAccessor.java Fri Aug 10 10:16:22 2012
@@ -24,6 +24,9 @@ import java.io.InputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import org.apache.fop.apps.io.InternalResourceResolver;
 
 /**
@@ -31,8 +34,11 @@ import org.apache.fop.apps.io.InternalRe
  */
 public final class AFPResourceAccessor {
 
+    private static final Log log = LogFactory.getLog(AFPResourceAccessor.class);
+
     private final InternalResourceResolver resourceResolver;
-    private final String baseURI;
+    private final URI baseURI;
+    private final URIResolver uriResolver;
 
     /**
      * Constructor for resource to be accessed via the {@link org.apache.fop.apps.FOUserAgent}. This
@@ -45,7 +51,23 @@ public final class AFPResourceAccessor {
      */
     public AFPResourceAccessor(InternalResourceResolver resourceResolver, String baseURI) {
         this.resourceResolver = resourceResolver;
-        this.baseURI = baseURI;
+        URI actualBaseURI = null;
+        URIResolver uriResolver;
+        if (baseURI == null) {
+            actualBaseURI = null;
+            uriResolver = new NullBaseURIResolver();
+        } else {
+            try {
+                actualBaseURI = InternalResourceResolver.getBaseURI(baseURI);
+                uriResolver = new BaseURIResolver();
+            } catch (URISyntaxException use) {
+                log.error("The URI given \"" + baseURI + "\" is invalid: " + use.getMessage());
+                actualBaseURI = null;
+                uriResolver = new NullBaseURIResolver();
+            }
+        }
+        this.baseURI = actualBaseURI;
+        this.uriResolver = uriResolver;
     }
 
     /**
@@ -57,18 +79,6 @@ public final class AFPResourceAccessor {
         this(resourceResolver, null);
     }
 
-    private URI getResourceURI(URI uri) {
-        if (baseURI == null) {
-            return uri;
-        }
-        try {
-            URI baseURI = InternalResourceResolver.getBaseURI(this.baseURI);
-            return baseURI.resolve(uri);
-        } catch (URISyntaxException use) {
-            return uri;
-        }
-    }
-
     /**
      * Creates an {@link InputStream} given a URI.
      *
@@ -77,6 +87,44 @@ public final class AFPResourceAccessor {
      * @throws IOException if an I/O error occurs while creating the InputStream.
      */
     public InputStream createInputStream(URI uri) throws IOException {
-        return resourceResolver.getResource(getResourceURI(uri));
+        return resourceResolver.getResource(uriResolver.resolveURI(uri));
+    }
+
+    /**
+     * Returns the resolved URI, given the URI of a resource.
+     *
+     * @param uri the resource URI
+     * @return the resolved URI
+     */
+    public URI resolveURI(String uri) {
+        return uriResolver.resolveURI(uri);
+    }
+
+    private interface URIResolver {
+        URI resolveURI(URI uri);
+
+        URI resolveURI(String uri);
+    }
+
+    private final class NullBaseURIResolver implements URIResolver {
+
+        public URI resolveURI(URI uri) {
+            return uri;
+        }
+
+        public URI resolveURI(String uri) {
+            return URI.create("./" + uri.trim());
+        }
+    }
+
+    private final class BaseURIResolver implements URIResolver {
+
+        public URI resolveURI(URI uri) {
+            return baseURI.resolve(uri);
+        }
+
+        public URI resolveURI(String uri) {
+            return baseURI.resolve(uri.trim());
+        }
     }
 }

Modified: xmlgraphics/fop/trunk/status.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/status.xml?rev=1371639&r1=1371638&r2=1371639&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Fri Aug 10 10:16:22 2012
@@ -62,6 +62,10 @@
       documents. Example: the fix of marks layering will be such a case when it's done.
     -->
     <release version="FOP Trunk" date="TBD">
+      <action context="Fonts" dev="MH" type="fix" fixes-bug="53685">
+        Cached AFP charactersets have more unique keys preventing the two characters with
+        but different binaries conflicting.
+      </action>
       <action context="Fonts" dev="MH" type="fix" fixes-bug="53657" due-to="Robert Meyer">
         AFP fonts default to the nominal character increment to font metrics when glyph info
         is missing from the characterset.



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org