]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Bugzilla #43940: Use new double format utility to improve thread safety and performan...
authorGlenn Adams <gadams@apache.org>
Sun, 29 Apr 2012 17:00:36 +0000 (17:00 +0000)
committerGlenn Adams <gadams@apache.org>
Sun, 29 Apr 2012 17:00:36 +0000 (17:00 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1331950 13f79535-47bb-0310-9956-ffa450edef68

lib/xmlgraphics-commons-1.5svn.jar
src/java/org/apache/fop/pdf/PDFColorHandler.java
src/java/org/apache/fop/pdf/PDFNumber.java
src/java/org/apache/fop/render/intermediate/IFUtil.java
src/java/org/apache/fop/util/DecimalFormatCache.java [deleted file]
status.xml

index 353b5d26e5c1013f3126a0ca8a022970d1f41999..f5999383b5233488d2b69019261e69608ac242d5 100644 (file)
Binary files a/lib/xmlgraphics-commons-1.5svn.jar and b/lib/xmlgraphics-commons-1.5svn.jar differ
index a15349212a4a52351261b792dcb013b0c4bc7738..8dfcf7f24eff5e15d6ce44c9b32579af201be061 100644 (file)
@@ -23,7 +23,6 @@ import java.awt.Color;
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_ColorSpace;
 import java.awt.color.ICC_Profile;
-import java.text.DecimalFormat;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -36,7 +35,7 @@ import org.apache.xmlgraphics.java2d.color.DeviceCMYKColorSpace;
 import org.apache.xmlgraphics.java2d.color.NamedColorSpace;
 import org.apache.xmlgraphics.java2d.color.profile.ColorProfileUtil;
 
-import org.apache.fop.util.DecimalFormatCache;
+import org.apache.xmlgraphics.util.DoubleFormatUtil;
 
 /**
  * This class handles the registration of color spaces and the generation of PDF code to select
@@ -225,9 +224,9 @@ public class PDFColorHandler {
         if (comps.length != componentCount) {
             throw new IllegalStateException("Color with unexpected component count encountered");
         }
-        DecimalFormat df = DecimalFormatCache.getDecimalFormat(4);
         for (int i = 0, c = comps.length; i < c; i++) {
-            codeBuffer.append(df.format(comps[i])).append(" ");
+            DoubleFormatUtil.formatDouble(comps[i], 4, 4, codeBuffer);
+            codeBuffer.append(" ");
         }
         codeBuffer.append(command).append("\n");
     }
index 95242305c44917f5cd522c26707da0ca7450d2a5..e638a51b1ecd93ba4e00f13de891394ec4b6a49d 100644 (file)
@@ -19,7 +19,7 @@
 
 package org.apache.fop.pdf;
 
-import org.apache.fop.util.DecimalFormatCache;
+import org.apache.xmlgraphics.util.DoubleFormatUtil;
 
 /**
  * This class represents a simple number object. It also contains contains some
@@ -75,7 +75,12 @@ public class PDFNumber extends PDFObject {
      * @return the value as a string
      */
     public static String doubleOut(double doubleDown, int dec) {
-        return DecimalFormatCache.getDecimalFormat(dec).format(doubleDown);
+        if (dec < 0 || dec > 16) {
+            throw new IllegalArgumentException("Parameter dec must be between 1 and 16");
+        }
+        StringBuffer buf = new StringBuffer();
+        DoubleFormatUtil.formatDouble(doubleDown, dec, dec, buf);
+        return buf.toString();
     }
 
     /** {@inheritDoc} */
index a384461acbea8bcdebf2409220e36795a1b4bf67..e8651a3dfda23536004dfbcba2a082fec7ee6703 100644 (file)
@@ -22,9 +22,10 @@ package org.apache.fop.render.intermediate;
 import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 
+import org.apache.xmlgraphics.util.DoubleFormatUtil;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fonts.FontInfo;
-import org.apache.fop.util.DecimalFormatCache;
 
 /**
  * Utility functions for the intermediate format.
@@ -40,7 +41,9 @@ public final class IFUtil {
             //See http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3
             value = 0.0;
         }
-        return DecimalFormatCache.getDecimalFormat(6).format(value);
+        StringBuffer buf = new StringBuffer();
+        DoubleFormatUtil.formatDouble(value, 6, 6, buf);
+        return buf.toString();
     }
 
     /**
diff --git a/src/java/org/apache/fop/util/DecimalFormatCache.java b/src/java/org/apache/fop/util/DecimalFormatCache.java
deleted file mode 100644 (file)
index a6634f5..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* $Id$ */
-
-package org.apache.fop.util;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
-
-/**
- * This class provides a cache for {@link DecimalFormat} instance. {@link DecimalFormat} itself
- * is not thread-safe but since FOP needs to format a lot of numbers the same way, it shall
- * be cached in a {@link ThreadLocal}.
- */
-public final class DecimalFormatCache {
-
-    private DecimalFormatCache() {
-    }
-
-    private static final String BASE_FORMAT = "0.################";
-
-    private static class DecimalFormatThreadLocal extends ThreadLocal {
-
-        private int dec;
-
-        public DecimalFormatThreadLocal(int dec) {
-            this.dec = dec;
-        }
-
-        protected synchronized Object initialValue() {
-            String s = "0";
-            if (dec > 0) {
-                s = BASE_FORMAT.substring(0, dec + 2);
-            }
-            DecimalFormat df = new DecimalFormat(s, new DecimalFormatSymbols(Locale.US));
-            return df;
-        }
-    };
-
-    //DecimalFormat is not thread-safe!
-    private static final ThreadLocal[] DECIMAL_FORMAT_CACHE = new DecimalFormatThreadLocal[17];
-    static {
-        for (int i = 0, c = DECIMAL_FORMAT_CACHE.length; i < c; i++) {
-            DECIMAL_FORMAT_CACHE[i] = new DecimalFormatThreadLocal(i);
-        }
-    }
-
-    /**
-     * Returns a cached {@link DecimalFormat} instance for the given number of decimal digits.
-     * @param dec the number of decimal digits.
-     * @return the DecimalFormat instance
-     */
-    public static DecimalFormat getDecimalFormat(int dec) {
-        if (dec < 0 || dec >= DECIMAL_FORMAT_CACHE.length) {
-            throw new IllegalArgumentException("Parameter dec must be between 1 and "
-                    + (DECIMAL_FORMAT_CACHE.length + 1));
-        }
-        return (DecimalFormat)DECIMAL_FORMAT_CACHE[dec].get();
-    }
-
-}
index b0cec45dd7e26eb272c404c36b48c53b9023f2fc..5e5461b4c615d3b885f6ff99aa0ec270f8994c95 100644 (file)
@@ -63,6 +63,9 @@
       documents. Example: the fix of marks layering will be such a case when it's done.
     -->
     <release version="FOP Trunk" date="TBD">
+      <action context="Code" dev="GA" type="fix" fixes-bug="43940" due-to="Julien AymĂ©, Ognjen Blagojevic">
+        Use new double format utility to improve thread safety and performance.
+      </action>
       <action context="Fonts" dev="GA" type="fix" fixes-bug="53148" due-to="Tassos Charoulis">
         Fix performance regression in JDK 1.6 Update 19 due to use of Java Beans API. Fix checkstyle errors.
       </action>