From 7501e761f6e91459fb7d7ae01348a4eda61ad235 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 27 Jul 2015 15:39:34 +0000 Subject: [PATCH] Adjust init of PresetGeometries to not keep the object if static initialization fails git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1692898 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/sl/draw/geom/PresetGeometries.java | 13 +++++--- .../sl/draw/geom/TestPresetGeometries.java | 33 ++++++++++++++++--- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/poi/sl/draw/geom/PresetGeometries.java b/src/java/org/apache/poi/sl/draw/geom/PresetGeometries.java index 676155361a..c5aef249fe 100644 --- a/src/java/org/apache/poi/sl/draw/geom/PresetGeometries.java +++ b/src/java/org/apache/poi/sl/draw/geom/PresetGeometries.java @@ -96,18 +96,23 @@ public class PresetGeometries extends LinkedHashMap { public static synchronized PresetGeometries getInstance(){ if(_inst == null) { - _inst = new PresetGeometries(); + // use a local object first to not assign a partly constructed object + // in case of failure + PresetGeometries lInst = new PresetGeometries(); try { InputStream is = PresetGeometries.class. getResourceAsStream("presetShapeDefinitions.xml"); - _inst.init(is); - is.close(); + try { + lInst.init(is); + } finally { + is.close(); + } } catch (Exception e){ throw new RuntimeException(e); } + _inst = lInst; } return _inst; } - } diff --git a/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java b/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java index 079a22a8db..841d5f81da 100644 --- a/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java +++ b/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java @@ -18,11 +18,13 @@ */ package org.apache.poi.sl.draw.geom; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; +import java.io.IOException; +import java.net.URL; +import java.util.Enumeration; import java.util.Map; import org.junit.Test; @@ -35,11 +37,9 @@ import org.junit.Test; public class TestPresetGeometries { @Test public void testRead(){ - Map shapes = PresetGeometries.getInstance(); assertEquals(187, shapes.size()); - for(String name : shapes.keySet()) { CustomGeometry geom = shapes.get(name); Context ctx = new Context(geom, new Rectangle2D.Double(0, 0, 100, 100), new IAdjustableShape() { @@ -52,8 +52,11 @@ public class TestPresetGeometries { assertNotNull(path); } } + + // we get the same instance on further calls + assertTrue(shapes == PresetGeometries.getInstance()); } - + // helper methods to adjust list of presets for other tests public static void clearPreset() { // ensure that we are initialized @@ -66,4 +69,24 @@ public class TestPresetGeometries { public static void resetPreset() { PresetGeometries._inst = null; } + + @Test + public void testCheckXMLParser() throws Exception{ + // Gump reports a strange error because of an unavailable XML Parser, let's try to find out where + // this comes from + // + Enumeration resources = this.getClass().getClassLoader().getResources("META-INF/services/javax.xml.stream.XMLEventFactory"); + printURLs(resources); + resources = ClassLoader.getSystemResources("META-INF/services/javax.xml.stream.XMLEventFactory"); + printURLs(resources); + resources = ClassLoader.getSystemResources("org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml"); + printURLs(resources); + } + + private void printURLs(Enumeration resources) { + while(resources.hasMoreElements()) { + URL url = resources.nextElement(); + System.out.println("URL: " + url); + } + } } -- 2.39.5