mirror of
https://github.com/apache/poi.git
synced 2025-02-06 10:08:17 +00:00
add TransformerHelper
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1867496 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ba6a63aaeb
commit
780b078c85
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user