From: Glenn Adams Date: Sun, 29 Apr 2012 17:00:36 +0000 (+0000) Subject: Bugzilla #43940: Use new double format utility to improve thread safety and performan... X-Git-Tag: fop-1_1rc1old~26 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6c90bb6701e513803420f78bb10a47cc195aabcd;p=xmlgraphics-fop.git Bugzilla #43940: Use new double format utility to improve thread safety and performance. Submitted by Julien Aymé, Ognjen Blagojevic. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1331950 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/xmlgraphics-commons-1.5svn.jar b/lib/xmlgraphics-commons-1.5svn.jar index 353b5d26e..f5999383b 100644 Binary files a/lib/xmlgraphics-commons-1.5svn.jar and b/lib/xmlgraphics-commons-1.5svn.jar differ diff --git a/src/java/org/apache/fop/pdf/PDFColorHandler.java b/src/java/org/apache/fop/pdf/PDFColorHandler.java index a15349212..8dfcf7f24 100644 --- a/src/java/org/apache/fop/pdf/PDFColorHandler.java +++ b/src/java/org/apache/fop/pdf/PDFColorHandler.java @@ -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"); } diff --git a/src/java/org/apache/fop/pdf/PDFNumber.java b/src/java/org/apache/fop/pdf/PDFNumber.java index 95242305c..e638a51b1 100644 --- a/src/java/org/apache/fop/pdf/PDFNumber.java +++ b/src/java/org/apache/fop/pdf/PDFNumber.java @@ -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} */ diff --git a/src/java/org/apache/fop/render/intermediate/IFUtil.java b/src/java/org/apache/fop/render/intermediate/IFUtil.java index a384461ac..e8651a3df 100644 --- a/src/java/org/apache/fop/render/intermediate/IFUtil.java +++ b/src/java/org/apache/fop/render/intermediate/IFUtil.java @@ -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 index a6634f50b..000000000 --- a/src/java/org/apache/fop/util/DecimalFormatCache.java +++ /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(); - } - -} diff --git a/status.xml b/status.xml index b0cec45dd..5e5461b4c 100644 --- a/status.xml +++ b/status.xml @@ -63,6 +63,9 @@ documents. Example: the fix of marks layering will be such a case when it's done. --> + + Use new double format utility to improve thread safety and performance. + Fix performance regression in JDK 1.6 Update 19 due to use of Java Beans API. Fix checkstyle errors.