From bug #50786 - Speed up calls to HSSFColor.getIndexHash() by returning a cached, unmodifiable Map. HSSFColor.getModifiableIndexHash() provides access to the old (slow but modifiable) functionality

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1077920 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2011-03-04 12:50:02 +00:00
parent 63077a605f
commit 640a664542
5 changed files with 27 additions and 15 deletions

View File

@ -34,6 +34,7 @@
<changes> <changes>
<release version="3.8-beta2" date="2011-??-??"> <release version="3.8-beta2" date="2011-??-??">
<action dev="poi-developers" type="fix">50786 - Speed up calls to HSSFColor.getIndexHash() by returning a cached, unmodifiable Map. HSSFColor.getModifiableIndexHash() provides access to the old (slow but modifiable) functionality</action>
<action dev="poi-developers" type="fix">47100 - Change related formulas and named ranges when XSSFWorkbook.setSheetName is called</action> <action dev="poi-developers" type="fix">47100 - Change related formulas and named ranges when XSSFWorkbook.setSheetName is called</action>
</release> </release>
<release version="3.8-beta1" date="2011-03-07"> <release version="3.8-beta1" date="2011-03-07">

View File

@ -37,7 +37,7 @@ import org.apache.poi.hssf.util.HSSFColor;
public class SVTableCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { public class SVTableCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
private static final Color black = getAWTColor(new HSSFColor.BLACK()); private static final Color black = getAWTColor(new HSSFColor.BLACK());
private static final Color white = getAWTColor(new HSSFColor.WHITE()); private static final Color white = getAWTColor(new HSSFColor.WHITE());
private Hashtable colors = HSSFColor.getIndexHash(); private Map<Integer,HSSFColor> colors = HSSFColor.getIndexHash();
private HSSFWorkbook wb; private HSSFWorkbook wb;

View File

@ -31,7 +31,7 @@ import org.apache.poi.hssf.util.*;
* @author Jason Height * @author Jason Height
*/ */
public class SVTableUtils { public class SVTableUtils {
private final static Hashtable colors = HSSFColor.getIndexHash(); private final static Map<Integer,HSSFColor> colors = HSSFColor.getIndexHash();
/** Description of the Field */ /** Description of the Field */
public final static Color black = getAWTColor(new HSSFColor.BLACK()); public final static Color black = getAWTColor(new HSSFColor.BLACK());
/** Description of the Field */ /** Description of the Field */

View File

@ -16,15 +16,15 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.ss.examples.html; package org.apache.poi.ss.examples.html;
import java.util.Formatter;
import java.util.Map;
import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.Formatter;
import java.util.Hashtable;
/** /**
* Implementation of {@link HtmlHelper} for XSSF files. * Implementation of {@link HtmlHelper} for XSSF files.
* *
@ -33,7 +33,7 @@ import java.util.Hashtable;
public class XSSFHtmlHelper implements HtmlHelper { public class XSSFHtmlHelper implements HtmlHelper {
private final XSSFWorkbook wb; private final XSSFWorkbook wb;
private static final Hashtable colors = HSSFColor.getIndexHash(); private static final Map<Integer,HSSFColor> colors = HSSFColor.getIndexHash();
public XSSFHtmlHelper(XSSFWorkbook wb) { public XSSFHtmlHelper(XSSFWorkbook wb) {
this.wb = wb; this.wb = wb;

View File

@ -18,7 +18,9 @@
package org.apache.poi.hssf.util; package org.apache.poi.hssf.util;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Map;
import org.apache.poi.ss.usermodel.Color; import org.apache.poi.ss.usermodel.Color;
@ -37,7 +39,7 @@ import org.apache.poi.ss.usermodel.Color;
* @author Brian Sanders (bsanders at risklabs dot com) - full default color palette * @author Brian Sanders (bsanders at risklabs dot com) - full default color palette
*/ */
public class HSSFColor implements Color { public class HSSFColor implements Color {
// TODO make subclass instances immutable private static Map<Integer,HSSFColor> indexHash;
/** Creates a new instance of HSSFColor */ /** Creates a new instance of HSSFColor */
public HSSFColor() public HSSFColor()
@ -45,17 +47,26 @@ public class HSSFColor implements Color {
} }
/** /**
* this function returns all colors in a hastable. Its not implemented as a * This function returns all the colours in an unmodifiable Map.
* static member/staticly initialized because that would be dirty in a * The map is cached on first use.
* server environment as it is intended. This means you'll eat the time
* it takes to create it once per request but you will not hold onto it
* if you have none of those requests.
* *
* @return a hashtable containing all colors keyed by <tt>Integer</tt> excel-style palette indexes * @return a Map containing all colours keyed by <tt>Integer</tt> excel-style palette indexes
*/ */
public final static Hashtable<Integer,HSSFColor> getIndexHash() { public final static Map<Integer,HSSFColor> getIndexHash() {
if(indexHash == null) {
indexHash = Collections.unmodifiableMap( createColorsByIndexMap() );
}
return createColorsByIndexMap(); return indexHash;
}
/**
* This function returns all the Colours, stored in a Hashtable that
* can be edited. No caching is performed. If you don't need to edit
* the table, then call {@link #getIndexHash()} which returns a
* statically cached imuatable map of colours.
*/
public final static Hashtable<Integer,HSSFColor> getMutableIndexHash() {
return createColorsByIndexMap();
} }
private static Hashtable<Integer,HSSFColor> createColorsByIndexMap() { private static Hashtable<Integer,HSSFColor> createColorsByIndexMap() {