From 7b43a5d77304e64ae8a8a02a885a244d743de988 Mon Sep 17 00:00:00 2001 From: rougeSE Date: Wed, 19 Oct 2016 21:50:18 -0600 Subject: [PATCH] Updated WWXML to support configuration of OutputKeys to format XML Change WWXML to allow for configuring the OutputKeys that control the output of the XML created from a Transformer. This is primarily to allow for pretty printing XML docs. Also updated RestorableSupport to allow configuring the XML produced by this class independantly from WWXML. This allows for the XML created to be embedded into other XML documents by disabling the xml-declaration. Updated other classes that was directly creating Transformers and use the WWXML.createTransformer() to allow for global configuration of XML generation. --- src/config/worldwind.xml | 8 ++++ .../nasa/worldwind/formats/gpx/GpxWriter.java | 4 +- .../worldwind/util/RestorableSupport.java | 21 +++++++-- src/gov/nasa/worldwind/util/WWXML.java | 44 ++++++++++++++++++- .../applications/sar/SARAnnotationWriter.java | 4 +- .../worldwindx/examples/kml/ExportKML.java | 10 +++-- 6 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/config/worldwind.xml b/src/config/worldwind.xml index dfe4931bd4..0ebcc607ce 100644 --- a/src/config/worldwind.xml +++ b/src/config/worldwind.xml @@ -100,4 +100,12 @@ jar:file:milstd2525-symbols.zip! (local zip archive) --> + + + + + + + \ No newline at end of file diff --git a/src/gov/nasa/worldwind/formats/gpx/GpxWriter.java b/src/gov/nasa/worldwind/formats/gpx/GpxWriter.java index c7fc5c2bb9..5d2bbb0864 100644 --- a/src/gov/nasa/worldwind/formats/gpx/GpxWriter.java +++ b/src/gov/nasa/worldwind/formats/gpx/GpxWriter.java @@ -6,6 +6,7 @@ package gov.nasa.worldwind.formats.gpx; import gov.nasa.worldwind.util.Logging; +import gov.nasa.worldwind.util.WWXML; import gov.nasa.worldwind.tracks.Track; import gov.nasa.worldwind.tracks.TrackSegment; import gov.nasa.worldwind.tracks.TrackPoint; @@ -153,8 +154,7 @@ private void doWriteTrackPoint(TrackPoint point, org.w3c.dom.Element elem) private void doFlush() throws javax.xml.transform.TransformerException { - javax.xml.transform.TransformerFactory factory = javax.xml.transform.TransformerFactory.newInstance(); - javax.xml.transform.Transformer transformer = factory.newTransformer(); + javax.xml.transform.Transformer transformer = WWXML.createTransformer(); javax.xml.transform.Source source = new javax.xml.transform.dom.DOMSource(this.doc); transformer.transform(source, this.result); } diff --git a/src/gov/nasa/worldwind/util/RestorableSupport.java b/src/gov/nasa/worldwind/util/RestorableSupport.java index f3ef304ecc..370c5cc579 100644 --- a/src/gov/nasa/worldwind/util/RestorableSupport.java +++ b/src/gov/nasa/worldwind/util/RestorableSupport.java @@ -5,6 +5,7 @@ */ package gov.nasa.worldwind.util; +import gov.nasa.worldwind.Configuration; import gov.nasa.worldwind.avlist.*; import gov.nasa.worldwind.geom.*; import gov.nasa.worldwind.render.OffsetsList; @@ -44,7 +45,8 @@ public class RestorableSupport { protected static final String DEFAULT_DOCUMENT_ELEMENT_TAG_NAME = "restorableState"; protected static final String DEFAULT_STATE_OBJECT_TAG_NAME = "stateObject"; - + private static final String PROP_OUTPUTKEY = RestorableSupport.class.getName() + ".outputkey"; + protected org.w3c.dom.Document doc; protected javax.xml.xpath.XPath xpath; protected String stateObjectTagName; @@ -203,14 +205,25 @@ protected static void createDocumentElement(org.w3c.dom.Document doc, String tag */ public String getStateAsXml() { - javax.xml.transform.TransformerFactory transformerFactory = - javax.xml.transform.TransformerFactory.newInstance(); + //Check for any restorablestate ouputkeys for the transformer + Map outputKeys = new HashMap(); + Integer i=1; + String outputKey = PROP_OUTPUTKEY + "." + i; + String value; + while((value = Configuration.getStringValue(outputKey)) != null) + { + String[] parts = value.split(","); + outputKeys.put(parts[0], parts[1]); + i++; + outputKey = PROP_OUTPUTKEY + "." + i; + } + try { // The StringWriter will receive the document xml. java.io.StringWriter stringWriter = new java.io.StringWriter(); // Attempt to write the Document to the StringWriter. - javax.xml.transform.Transformer transformer = transformerFactory.newTransformer(); + javax.xml.transform.Transformer transformer = WWXML.createTransformer(outputKeys); transformer.transform( new javax.xml.transform.dom.DOMSource(this.doc), new javax.xml.transform.stream.StreamResult(stringWriter)); diff --git a/src/gov/nasa/worldwind/util/WWXML.java b/src/gov/nasa/worldwind/util/WWXML.java index 80827c22a4..656eaba799 100644 --- a/src/gov/nasa/worldwind/util/WWXML.java +++ b/src/gov/nasa/worldwind/util/WWXML.java @@ -28,6 +28,7 @@ import java.nio.ByteBuffer; import java.text.*; import java.util.*; +import java.util.Map.Entry; /** * A collection of static methods use for opening, reading and otherwise working with XML files. @@ -38,7 +39,9 @@ public class WWXML { public static final String XLINK_URI = "http://www.w3.org/1999/xlink"; - + private static final String PROP_OUTPUTKEY = WWXML.class.getName() + ".outputkey"; + + /** * Create a DOM builder. * @@ -88,12 +91,49 @@ public static DocumentBuilder createDocumentBuilder(boolean isNamespaceAware) * @throws WWRuntimeException if an error occurs. */ public static Transformer createTransformer() + { + return createTransformer(null); + } + + /** + * Create a XML transformer. + * @parameter outputKeys a map of {@link javax.xml.transform.OutputKeys} settings + * @return a {@link javax.xml.transform.Transformer} + * + * @throws WWRuntimeException if an error occurs. + */ + public static Transformer createTransformer(Map outputKeys) { TransformerFactory transformerFactory = TransformerFactory.newInstance(); try { - return transformerFactory.newTransformer(); + Transformer transformer = transformerFactory.newTransformer(); + + //Check for any globally assigned ouputkeys for the transformer + Integer i=1; + String outputKey = PROP_OUTPUTKEY + "." + i; + String value; + while((value = Configuration.getStringValue(outputKey)) != null) + { + String[] parts = value.split(","); + transformer.setOutputProperty(parts[0], parts[1]); + i++; + outputKey = PROP_OUTPUTKEY + "." + i; + } + + if(outputKeys != null) + { + //Now set any provided outputkeys + Iterator> it = outputKeys.entrySet().iterator(); + while (it.hasNext()) + { + Map.Entry pair = (Map.Entry)it.next(); + transformer.setOutputProperty(pair.getKey().toString(), pair.getValue()); + } + } + + return transformer; } catch (TransformerConfigurationException e) { diff --git a/src/gov/nasa/worldwindx/applications/sar/SARAnnotationWriter.java b/src/gov/nasa/worldwindx/applications/sar/SARAnnotationWriter.java index e3c92682a8..c7a4cd332d 100644 --- a/src/gov/nasa/worldwindx/applications/sar/SARAnnotationWriter.java +++ b/src/gov/nasa/worldwindx/applications/sar/SARAnnotationWriter.java @@ -6,6 +6,7 @@ package gov.nasa.worldwindx.applications.sar; import gov.nasa.worldwind.util.Logging; +import gov.nasa.worldwind.util.WWXML; /** * @author dcollins @@ -138,8 +139,7 @@ private void doWriteAnnotation(SARAnnotation sarAnnotation, org.w3c.dom.Element private void doFlush() throws javax.xml.transform.TransformerException { - javax.xml.transform.TransformerFactory factory = javax.xml.transform.TransformerFactory.newInstance(); - javax.xml.transform.Transformer transformer = factory.newTransformer(); + javax.xml.transform.Transformer transformer = WWXML.createTransformer(); javax.xml.transform.Source source = new javax.xml.transform.dom.DOMSource(this.doc); transformer.transform(source, this.result); } diff --git a/src/gov/nasa/worldwindx/examples/kml/ExportKML.java b/src/gov/nasa/worldwindx/examples/kml/ExportKML.java index d30afc3eb0..dec62ed028 100644 --- a/src/gov/nasa/worldwindx/examples/kml/ExportKML.java +++ b/src/gov/nasa/worldwindx/examples/kml/ExportKML.java @@ -10,6 +10,7 @@ import gov.nasa.worldwind.geom.*; import gov.nasa.worldwind.render.*; import gov.nasa.worldwind.util.Logging; +import gov.nasa.worldwind.util.WWXML; import javax.xml.transform.*; import javax.xml.transform.stream.*; @@ -156,10 +157,11 @@ public static void main(String[] args) String xmlString = stringWriter.toString(); // Set up a transformer to pretty-print the XML - Transformer transformer = TransformerFactory.newInstance().newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); - + Map outputKeys = new HashMap(); + outputKeys.put(OutputKeys.INDENT, "yes"); + outputKeys.put("{http://xml.apache.org/xslt}indent-amount", "4"); + Transformer transformer = WWXML.createTransformer(outputKeys); + // Write the pretty-printed document to stdout transformer.transform(new StreamSource(new StringReader(xmlString)), new StreamResult(System.out)); }