Author: fanningpj
Date: Tue Sep 24 20:52:37 2019
New Revision: 1867496

URL: http://svn.apache.org/viewvc?rev=1867496&view=rev
Log:
add TransformerHelper

Added:
    poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java
      - copied, changed from r1867492, 
poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/DocumentHelper.java
Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/ooxml/dev/OOXMLPrettyPrint.java
    poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
    
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/ooxml/dev/OOXMLPrettyPrint.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/ooxml/dev/OOXMLPrettyPrint.java?rev=1867496&r1=1867495&r2=1867496&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/ooxml/dev/OOXMLPrettyPrint.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/ooxml/dev/OOXMLPrettyPrint.java Tue 
Sep 24 20:52:37 2019
@@ -16,35 +16,24 @@
 ==================================================================== */
 package org.apache.poi.ooxml.dev;
 
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Enumeration;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
-import java.util.zip.ZipOutputStream;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
 import org.apache.poi.ooxml.util.DocumentHelper;
+import org.apache.poi.ooxml.util.TransformerHelper;
 import org.apache.poi.openxml4j.opc.internal.ZipHelper;
 import org.apache.poi.openxml4j.util.ZipSecureFile;
 import org.apache.poi.util.IOUtils;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.*;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
 /**
  * Reads a zipped OOXML file and produces a copy with the included
  * pretty-printed XML files.
@@ -82,8 +71,7 @@ public class OOXMLPrettyPrint {
         System.out.println("Done.");
     }
 
-    private static void handleFile(File file, File outFile) throws 
ZipException,
-            IOException, ParserConfigurationException {
+    private static void handleFile(File file, File outFile) throws IOException 
{
         System.out.println("Reading zip-file " + file + " and writing 
pretty-printed XML to " + outFile);
 
         try (ZipSecureFile zipFile = ZipHelper.openZipFile(file)) {
@@ -121,7 +109,7 @@ public class OOXMLPrettyPrint {
     }
 
     private static void pretty(Document document, OutputStream outputStream, 
int indent) throws TransformerException {
-        TransformerFactory transformerFactory = 
TransformerFactory.newInstance();
+        TransformerFactory transformerFactory = TransformerHelper.getFactory();
         Transformer transformer = transformerFactory.newTransformer();
         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
         if (indent > 0) {

Copied: 
poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java (from 
r1867492, 
poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/DocumentHelper.java)
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java?p2=poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java&p1=poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/DocumentHelper.java&r1=1867492&r2=1867496&rev=1867496&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/DocumentHelper.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java 
Tue Sep 24 20:52:37 2019
@@ -17,187 +17,33 @@
 
 package org.apache.poi.ooxml.util;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.util.concurrent.TimeUnit;
-
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.stream.events.Namespace;
-
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
-import org.w3c.dom.*;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-public final class DocumentHelper {
-    private static POILogger logger = 
POILogFactory.getLogger(DocumentHelper.class);
-    private static long lastLog;
-
-    private DocumentHelper() {}
 
-    private static class DocHelperErrorHandler implements ErrorHandler {
-
-        public void warning(SAXParseException exception) {
-            printError(POILogger.WARN, exception);
-        }
-
-        public void error(SAXParseException exception) {
-            printError(POILogger.ERROR, exception);
-        }
+import javax.xml.XMLConstants;
+import javax.xml.transform.TransformerFactory;
 
-        public void fatalError(SAXParseException exception) throws 
SAXException {
-            printError(POILogger.FATAL, exception);
-            throw exception;
-        }
+public final class TransformerHelper {
+    private static POILogger logger = 
POILogFactory.getLogger(TransformerHelper.class);
 
-        /** Prints the error message. */
-        private void printError(int type, SAXParseException ex) {
-            StringBuilder sb = new StringBuilder();
-            
-            String systemId = ex.getSystemId();
-            if (systemId != null) {
-                int index = systemId.lastIndexOf('/');
-                if (index != -1)
-                    systemId = systemId.substring(index + 1);
-                sb.append(systemId);
-            }
-            sb.append(':');
-            sb.append(ex.getLineNumber());
-            sb.append(':');
-            sb.append(ex.getColumnNumber());
-            sb.append(": ");
-            sb.append(ex.getMessage());
+    private TransformerHelper() {}
 
-            logger.log(type, sb.toString(), ex);
-        }
-    }
-    
-    /**
-     * Creates a new document builder, with sensible defaults
-     *
-     * @throws IllegalStateException If creating the DocumentBuilder fails, 
e.g.
-     *  due to {@link ParserConfigurationException}.
-     */
-    public static DocumentBuilder newDocumentBuilder() {
-        try {
-            DocumentBuilder documentBuilder = 
documentBuilderFactory.newDocumentBuilder();
-            
documentBuilder.setEntityResolver(SAXHelper.IGNORING_ENTITY_RESOLVER);
-            documentBuilder.setErrorHandler(new DocHelperErrorHandler());
-            return documentBuilder;
-        } catch (ParserConfigurationException e) {
-            throw new IllegalStateException("cannot create a DocumentBuilder", 
e);
-        }
+    static final TransformerFactory transformerFactory = 
TransformerFactory.newInstance();
+    static {
+        trySetFeature(transformerFactory, 
XMLConstants.FEATURE_SECURE_PROCESSING, true);
     }
 
-    static final DocumentBuilderFactory documentBuilderFactory = 
DocumentBuilderFactory.newInstance();
-    static {
-        documentBuilderFactory.setNamespaceAware(true);
-        documentBuilderFactory.setValidating(false);
-        //this doesn't appear to work, and we still need to limit
-        //entity expansions to 1 in trySetXercesSecurityManager
-        documentBuilderFactory.setExpandEntityReferences(false);
-        trySetFeature(documentBuilderFactory, 
XMLConstants.FEATURE_SECURE_PROCESSING, true);
-        trySetFeature(documentBuilderFactory, 
POIXMLConstants.FEATURE_DISALLOW_DOCTYPE_DECL, true);
-        trySetFeature(documentBuilderFactory, 
POIXMLConstants.FEATURE_LOAD_DTD_GRAMMAR, false);
-        trySetFeature(documentBuilderFactory, 
POIXMLConstants.FEATURE_LOAD_EXTERNAL_DTD, false);
-        trySetXercesSecurityManager(documentBuilderFactory);
+    public static TransformerFactory getFactory() {
+        return transformerFactory;
     }
 
-    private static void trySetFeature(@SuppressWarnings("SameParameterValue") 
DocumentBuilderFactory dbf, String feature, boolean enabled) {
+    private static void trySetFeature(TransformerFactory tf, String feature, 
boolean enabled) {
         try {
-            dbf.setFeature(feature, enabled);
+            tf.setFeature(feature, enabled);
         } catch (Exception e) {
-            logger.log(POILogger.WARN, "DocumentBuilderFactory Feature 
unsupported", feature, e);
+            logger.log(POILogger.WARN, "TransformerFactory Feature 
unsupported", feature, e);
         } catch (AbstractMethodError ame) {
-            logger.log(POILogger.WARN, "Cannot set DocumentBuilderFactory 
feature because outdated XML parser in classpath", feature, ame);
+            logger.log(POILogger.WARN, "Cannot set TransformerFactory feature 
because outdated XML parser in classpath", feature, ame);
         }
     }
-    
-    private static void 
trySetXercesSecurityManager(@SuppressWarnings("SameParameterValue") 
DocumentBuilderFactory dbf) {
-        // Try built-in JVM one first, standalone if not
-        for (String securityManagerClassName : new String[]{
-                //"com.sun.org.apache.xerces.internal.util.SecurityManager",
-                "org.apache.xerces.util.SecurityManager"
-        }) {
-            try {
-                Object mgr = 
Class.forName(securityManagerClassName).newInstance();
-                Method setLimit = 
mgr.getClass().getMethod("setEntityExpansionLimit", Integer.TYPE);
-                setLimit.invoke(mgr, 1);
-                dbf.setAttribute(POIXMLConstants.PROPERTY_SECURITY_MANAGER, 
mgr);
-                // Stop once one can be setup without error
-                return;
-            } catch (ClassNotFoundException e) {
-                // continue without log, this is expected in some setups
-            } catch (Throwable e) {     // NOSONAR - also catch things like 
NoClassDefError here
-                if(System.currentTimeMillis() > lastLog + 
TimeUnit.MINUTES.toMillis(5)) {
-                    logger.log(POILogger.WARN, "DocumentBuilderFactory 
Security Manager could not be setup [log suppressed for 5 minutes]", e);
-                    lastLog = System.currentTimeMillis();
-                }
-            }
-        }
-
-        // separate old version of Xerces not found => use the builtin way of 
setting the property
-        // Note: when entity_expansion_limit==0, there is no limit!
-        try {
-            dbf.setAttribute(POIXMLConstants.PROPERTY_ENTITY_EXPANSION_LIMIT, 
1);
-        } catch (Throwable e) {
-            if(System.currentTimeMillis() > lastLog + 
TimeUnit.MINUTES.toMillis(5)) {
-                logger.log(POILogger.WARN, "DocumentBuilderFactory Entity 
Expansion Limit could not be setup [log suppressed for 5 minutes]", e);
-                lastLog = System.currentTimeMillis();
-            }
-        }
-    }
-
-    /**
-     * Parses the given stream via the default (sensible)
-     * DocumentBuilder
-     * @param inp Stream to read the XML data from
-     * @return the parsed Document 
-     */
-    public static Document readDocument(InputStream inp) throws IOException, 
SAXException {
-        return newDocumentBuilder().parse(inp);
-    }
-
-    /**
-     * Parses the given stream via the default (sensible)
-     * DocumentBuilder
-     * @param inp sax source to read the XML data from
-     * @return the parsed Document 
-     */
-    public static Document readDocument(InputSource inp) throws IOException, 
SAXException {
-        return newDocumentBuilder().parse(inp);
-    }
-
-    // must only be used to create empty documents, do not use it for parsing!
-    private static final DocumentBuilder documentBuilderSingleton = 
newDocumentBuilder();
-
-    /**
-     * Creates a new DOM Document
-     */
-    public static Document createDocument() {
-        return documentBuilderSingleton.newDocument();
-    }
-
-    /**
-     * Adds a namespace declaration attribute to the given element.
-     */
-    public static void addNamespaceDeclaration(Element element, String 
namespacePrefix, String namespaceURI) {
-        element.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
-                XMLConstants.XMLNS_ATTRIBUTE + ':' + namespacePrefix,
-                namespaceURI);
-    }
-
-    /**
-     * Adds a namespace declaration attribute to the given element.
-     */
-    public static void addNamespaceDeclaration(Element element, Namespace 
namespace) {
-        addNamespaceDeclaration(element, namespace.getPrefix(), 
namespace.getNamespaceURI());
-    }
 }

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java?rev=1867496&r1=1867495&r2=1867496&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java Tue 
Sep 24 20:52:37 2019
@@ -27,10 +27,10 @@ import javax.xml.transform.Result;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import org.apache.poi.ooxml.util.TransformerHelper;
 import org.w3c.dom.Document;
 
 public final class StreamHelper {
@@ -38,12 +38,10 @@ public final class StreamHelper {
        private StreamHelper() {
                // Do nothing
        }
-  
-  private static final TransformerFactory transformerFactory = 
TransformerFactory.newInstance();
-  
-  private static synchronized Transformer getIdentityTransformer() throws 
TransformerException {
-    return transformerFactory.newTransformer();
-  }
+
+       private static synchronized Transformer getIdentityTransformer() throws 
TransformerException {
+               return TransformerHelper.getFactory().newTransformer();
+       }
 
        /**
         * Save the document object in the specified output stream.
@@ -55,38 +53,38 @@ public final class StreamHelper {
         * @return <b>true</b> if the xml is successfully written in the stream,
         *         else <b>false</b>.
         */
-    public static boolean saveXmlInStream(Document xmlContent,
-            OutputStream outStream) {
-        try {
-            Transformer trans = getIdentityTransformer();
-            Source xmlSource = new DOMSource(xmlContent);
-            // prevent close of stream by transformer:
-            Result outputTarget = new StreamResult(new FilterOutputStream(
-                    outStream) {
-                @Override
-                public void write(byte[] b, int off, int len)
-                        throws IOException {
-                    out.write(b, off, len);
-                }
-
-                @Override
-                public void close() throws IOException {
-                    out.flush(); // only flush, don't close!
-                }
-            });
-            // xmlContent.setXmlStandalone(true);
-            trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-            // don't indent xml documents, the indent will cause errors in 
calculating the xml signature
-            // because of different handling of linebreaks in Windows/Unix
-            // see https://stackoverflow.com/questions/36063375
-            trans.setOutputProperty(OutputKeys.INDENT, "no");
-            trans.setOutputProperty(OutputKeys.STANDALONE, "yes");
-            trans.transform(xmlSource, outputTarget);
-        } catch (TransformerException e) {
-            return false;
-        }
-        return true;
-    }
+       public static boolean saveXmlInStream(Document xmlContent,
+                                                                               
  OutputStream outStream) {
+               try {
+                       Transformer trans = getIdentityTransformer();
+                       Source xmlSource = new DOMSource(xmlContent);
+                       // prevent close of stream by transformer:
+                       Result outputTarget = new StreamResult(new 
FilterOutputStream(
+                                       outStream) {
+                               @Override
+                               public void write(byte[] b, int off, int len)
+                                               throws IOException {
+                                       out.write(b, off, len);
+                               }
+
+                               @Override
+                               public void close() throws IOException {
+                                       out.flush(); // only flush, don't close!
+                               }
+                       });
+                       // xmlContent.setXmlStandalone(true);
+                       trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+                       // don't indent xml documents, the indent will cause 
errors in calculating the xml signature
+                       // because of different handling of linebreaks in 
Windows/Unix
+                       // see https://stackoverflow.com/questions/36063375
+                       trans.setOutputProperty(OutputKeys.INDENT, "no");
+                       trans.setOutputProperty(OutputKeys.STANDALONE, "yes");
+                       trans.transform(xmlSource, outputTarget);
+               } catch (TransformerException e) {
+                       return false;
+               }
+               return true;
+       }
 
        /**
         * Copy the input stream into the output stream.

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java?rev=1867496&r1=1867495&r2=1867496&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java 
Tue Sep 24 20:52:37 2019
@@ -33,13 +33,13 @@ import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.validation.Schema;
 import javax.xml.validation.SchemaFactory;
 import javax.xml.validation.Validator;
 
+import org.apache.poi.ooxml.util.TransformerHelper;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.ooxml.util.DocumentHelper;
@@ -218,8 +218,7 @@ public class XSSFExportToXml implements
             //Output the XML
 
             //set up a transformer
-            TransformerFactory transfac = TransformerFactory.newInstance();
-            Transformer trans = transfac.newTransformer();
+            Transformer trans = 
TransformerHelper.getFactory().newTransformer();
             trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
             trans.setOutputProperty(OutputKeys.INDENT, "yes");
             trans.setOutputProperty(OutputKeys.ENCODING, encoding);

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java?rev=1867496&r1=1867495&r2=1867496&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
 (original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
 Tue Sep 24 20:52:37 2019
@@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets
 import java.util.EnumMap;
 import java.util.Map;
 
+import org.apache.poi.ooxml.util.TransformerHelper;
 import org.apache.poi.ss.usermodel.DifferentialStyleProvider;
 import org.apache.poi.ss.usermodel.TableStyle;
 import org.apache.poi.ss.usermodel.TableStyleType;
@@ -439,7 +440,7 @@ public enum XSSFBuiltinTableStyle {
     }
 
     private static String writeToString(Node node) throws IOException, 
TransformerException {
-        TransformerFactory tf = TransformerFactory.newInstance();
+        TransformerFactory tf = TransformerHelper.getFactory();
         try (StringWriter sw = new StringWriter()){
             Transformer transformer = tf.newTransformer();
             transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, 
"yes");



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org
For additional commands, e-mail: commits-h...@poi.apache.org

Reply via email to