]> source.dussan.org Git - poi.git/commitdiff
add TransformerHelper
authorPJ Fanning <fanningpj@apache.org>
Tue, 24 Sep 2019 20:52:37 +0000 (20:52 +0000)
committerPJ Fanning <fanningpj@apache.org>
Tue, 24 Sep 2019 20:52:37 +0000 (20:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1867496 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/ooxml/dev/OOXMLPrettyPrint.java
src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java
src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java

index 6cf5eb2cfb5e11381fe6da6262a2d93dd770ed23..8e8b9571d1ab96a3b8e2f21e3113585b5e48cd32 100644 (file)
 ==================================================================== */
 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) {
diff --git a/src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java b/src/ooxml/java/org/apache/poi/ooxml/util/TransformerHelper.java
new file mode 100644 (file)
index 0000000..37422c6
--- /dev/null
@@ -0,0 +1,49 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ooxml.util;
+
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
+import javax.xml.XMLConstants;
+import javax.xml.transform.TransformerFactory;
+
+public final class TransformerHelper {
+    private static POILogger logger = POILogFactory.getLogger(TransformerHelper.class);
+
+    private TransformerHelper() {}
+
+    static final TransformerFactory transformerFactory = TransformerFactory.newInstance();
+    static {
+        trySetFeature(transformerFactory, XMLConstants.FEATURE_SECURE_PROCESSING, true);
+    }
+
+    public static TransformerFactory getFactory() {
+        return transformerFactory;
+    }
+
+    private static void trySetFeature(TransformerFactory tf, String feature, boolean enabled) {
+        try {
+            tf.setFeature(feature, enabled);
+        } catch (Exception e) {
+            logger.log(POILogger.WARN, "TransformerFactory Feature unsupported", feature, e);
+        } catch (AbstractMethodError ame) {
+            logger.log(POILogger.WARN, "Cannot set TransformerFactory feature because outdated XML parser in classpath", feature, ame);
+        }
+    }
+}
index 78861db115050a4c4c2b92f0a983c3d34347669c..3c4dc6a2385ec88b592a8e6da10180f8e68ce245 100644 (file)
@@ -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);
-                }
+       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;
-    }
+                               @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.
index 53984fec281c04f75d5f9369b2c907c87b7aebff..65cb5a981c61630e797e092a3273296d37891924 100644 (file)
@@ -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 Comparator<String>{
             //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);
index 616e1198bf10ca54137a8873b660f46353f1f6a5..36a3840223c24c3ad2e3033e9a63107ded9ed1da 100644 (file)
@@ -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");