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
This commit is contained in:
Dominik Stadler 2015-07-27 15:39:34 +00:00
parent 7eb27ea492
commit 7501e761f6
2 changed files with 37 additions and 9 deletions

View File

@ -96,18 +96,23 @@ public class PresetGeometries extends LinkedHashMap<String, CustomGeometry> {
public static synchronized PresetGeometries getInstance(){ public static synchronized PresetGeometries getInstance(){
if(_inst == null) { 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 { try {
InputStream is = PresetGeometries.class. InputStream is = PresetGeometries.class.
getResourceAsStream("presetShapeDefinitions.xml"); getResourceAsStream("presetShapeDefinitions.xml");
_inst.init(is); try {
is.close(); lInst.init(is);
} finally {
is.close();
}
} catch (Exception e){ } catch (Exception e){
throw new RuntimeException(e); throw new RuntimeException(e);
} }
_inst = lInst;
} }
return _inst; return _inst;
} }
} }

View File

@ -18,11 +18,13 @@
*/ */
package org.apache.poi.sl.draw.geom; package org.apache.poi.sl.draw.geom;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
import java.awt.geom.GeneralPath; import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Map; import java.util.Map;
import org.junit.Test; import org.junit.Test;
@ -35,11 +37,9 @@ import org.junit.Test;
public class TestPresetGeometries { public class TestPresetGeometries {
@Test @Test
public void testRead(){ public void testRead(){
Map<String, CustomGeometry> shapes = PresetGeometries.getInstance(); Map<String, CustomGeometry> shapes = PresetGeometries.getInstance();
assertEquals(187, shapes.size()); assertEquals(187, shapes.size());
for(String name : shapes.keySet()) { for(String name : shapes.keySet()) {
CustomGeometry geom = shapes.get(name); CustomGeometry geom = shapes.get(name);
Context ctx = new Context(geom, new Rectangle2D.Double(0, 0, 100, 100), new IAdjustableShape() { Context ctx = new Context(geom, new Rectangle2D.Double(0, 0, 100, 100), new IAdjustableShape() {
@ -52,6 +52,9 @@ public class TestPresetGeometries {
assertNotNull(path); assertNotNull(path);
} }
} }
// we get the same instance on further calls
assertTrue(shapes == PresetGeometries.getInstance());
} }
// helper methods to adjust list of presets for other tests // helper methods to adjust list of presets for other tests
@ -66,4 +69,24 @@ public class TestPresetGeometries {
public static void resetPreset() { public static void resetPreset() {
PresetGeometries._inst = null; 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<URL> 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<URL> resources) {
while(resources.hasMoreElements()) {
URL url = resources.nextElement();
System.out.println("URL: " + url);
}
}
} }