==================================================================== */
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.
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)) {
}
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) {
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+ }
+}
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 {
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.
* @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.
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;
//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);
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;
}
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");