diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index c2f3d50e1..0f5b74ef2 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ + 44627 - Improve the thread safety of POILogFactory 30311 - Initial support for Conditional Formatting 44609 - Handle leading spaces in formulas, such as '= 4' 44608 - Support for PercentPtg in the formula evaluator diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index e0468b2f8..5884c0df4 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 44627 - Improve the thread safety of POILogFactory 30311 - Initial support for Conditional Formatting 44609 - Handle leading spaces in formulas, such as '= 4' 44608 - Support for PercentPtg in the formula evaluator diff --git a/src/java/org/apache/poi/util/POILogFactory.java b/src/java/org/apache/poi/util/POILogFactory.java index 74ea822a5..a9ce66f36 100644 --- a/src/java/org/apache/poi/util/POILogFactory.java +++ b/src/java/org/apache/poi/util/POILogFactory.java @@ -33,14 +33,25 @@ import java.util.*; public class POILogFactory { - // map of POILogger instances, with classes as keys - private static Map _loggers = new HashMap();; - + /** + * Map of POILogger instances, with classes as keys + */ + private static Map _loggers = new HashMap();; /** - * construct a POILogFactory. + * A common instance of NullLogger, as it does nothing + * we only need the one */ + private static POILogger _nullLogger = new NullLogger(); + /** + * The name of the class to use. Initialised the + * first time we need it + */ + private static String _loggerClassName = null; + /** + * Construct a POILogFactory. + */ private POILogFactory() { } @@ -69,28 +80,48 @@ public class POILogFactory public static POILogger getLogger(final String cat) { POILogger logger = null; - - if (_loggers.containsKey(cat)) - { - logger = ( POILogger ) _loggers.get(cat); + + // If we haven't found out what logger to use yet, + // then do so now + // Don't look it up until we're first asked, so + // that our users can set the system property + // between class loading and first use + if(_loggerClassName == null) { + try { + _loggerClassName = System.getProperty("org.apache.poi.util.POILogger"); + } catch(Exception e) {} + + // Use the default logger if none specified, + // or none could be fetched + if(_loggerClassName == null) { + _loggerClassName = _nullLogger.getClass().getName(); + } } - else - { - try{ - String loggerClassName = System.getProperty("org.apache.poi.util.POILogger"); - Class loggerClass = Class.forName(loggerClassName); + + // Short circuit for the null logger, which + // ignores all categories + if(_loggerClassName.equals(_nullLogger.getClass().getName())) { + return _nullLogger; + } + + + // Fetch the right logger for them, creating + // it if that's required + if (_loggers.containsKey(cat)) { + logger = ( POILogger ) _loggers.get(cat); + } else { + try { + Class loggerClass = Class.forName(_loggerClassName); logger = ( POILogger ) loggerClass.newInstance(); - } - catch(Exception e){ - - logger = new NullLogger(); + logger.initialize(cat); + } catch(Exception e) { + // Give up and use the null logger + logger = _nullLogger; } - logger.initialize(cat); - + // Save for next time _loggers.put(cat, logger); } return logger; } - -} // end public class POILogFactory +} // end public class POILogFactory \ No newline at end of file diff --git a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java index 4c84f04b7..73ddcad54 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java @@ -36,23 +36,23 @@ import junit.framework.*; public class TestRawDataBlock extends TestCase { - - /** - * Constructor TestRawDataBlock - * - * @param name - */ - - public TestRawDataBlock(String name) - { - super(name); - + static { // We always want to use our own // logger System.setProperty( "org.apache.poi.util.POILogger", "org.apache.poi.util.DummyPOILogger" ); + } + + /** + * Constructor TestRawDataBlock + * + * @param name + */ + public TestRawDataBlock(String name) + { + super(name); } /** diff --git a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java index d15102976..0f65c0e8a 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java @@ -36,23 +36,23 @@ import junit.framework.*; public class TestRawDataBlockList extends TestCase { - - /** - * Constructor TestRawDataBlockList - * - * @param name - */ - - public TestRawDataBlockList(String name) - { - super(name); - + static { // We always want to use our own // logger System.setProperty( "org.apache.poi.util.POILogger", "org.apache.poi.util.DummyPOILogger" ); + } + + /** + * Constructor TestRawDataBlockList + * + * @param name + */ + public TestRawDataBlockList(String name) + { + super(name); } /** @@ -60,7 +60,6 @@ public class TestRawDataBlockList * * @exception IOException */ - public void testNormalConstructor() throws IOException {