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

src/ooxml/java/org/apache/poi/ooxml/util/XPathHelper.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/poifs/crypt/dsig/SignaturePart.java
src/ooxml/java/org/apache/poi/xssf/extractor/XSSFImportFromXML.java

diff --git a/src/ooxml/java/org/apache/poi/ooxml/util/XPathHelper.java b/src/ooxml/java/org/apache/poi/ooxml/util/XPathHelper.java
new file mode 100644 (file)
index 0000000..ef492bd
--- /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.xpath.XPathFactory;
+
+public final class XPathHelper {
+    private static POILogger logger = POILogFactory.getLogger(XPathHelper.class);
+
+    private XPathHelper() {}
+
+    static final XPathFactory xpathFactory = XPathFactory.newInstance();
+    static {
+        trySetFeature(xpathFactory, XMLConstants.FEATURE_SECURE_PROCESSING, true);
+    }
+
+    public static XPathFactory getFactory() {
+        return xpathFactory;
+    }
+
+    private static void trySetFeature(XPathFactory xpf, String feature, boolean enabled) {
+        try {
+            xpf.setFeature(feature, enabled);
+        } catch (Exception e) {
+            logger.log(POILogger.WARN, "XPathFactory Feature unsupported", feature, e);
+        } catch (AbstractMethodError ame) {
+            logger.log(POILogger.WARN, "Cannot set XPathFactory feature because outdated XML parser in classpath", feature, ame);
+        }
+    }
+}
index e68b7a72d094e5dc72861190ed9789b212edffb7..dab69bd2508fc70a509e811843aef8e51c256e75 100644 (file)
@@ -38,10 +38,10 @@ import javax.xml.namespace.NamespaceContext;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
 
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.ooxml.util.DocumentHelper;
+import org.apache.poi.ooxml.util.XPathHelper;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
@@ -107,7 +107,7 @@ public class SignaturePart {
      */
     public boolean validate() {
         KeyInfoKeySelector keySelector = new KeyInfoKeySelector();
-        XPath xpath = XPathFactory.newInstance().newXPath();
+        XPath xpath = XPathHelper.getFactory().newXPath();
         xpath.setNamespaceContext(new XPathNSContext());
 
         try {
@@ -165,7 +165,7 @@ public class SignaturePart {
         signatureConfig.setSigningCertificateChain(certChain);
         signatureConfig.setSignatureMethodFromUri(xmlSignature.getSignedInfo().getSignatureMethod().getAlgorithm());
 
-        final XPath xpath = XPathFactory.newInstance().newXPath();
+        final XPath xpath = XPathHelper.getFactory().newXPath();
         xpath.setNamespaceContext(new XPathNSContext());
 
         final Map<String,Consumer<String>> m = new HashMap();
index e19cdae915dd27f898f07d78d0a1babc38d8bc3f..43095deba64a164d959c477cf2242e4b5c0ddaca 100644 (file)
@@ -34,8 +34,8 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
 
+import org.apache.poi.ooxml.util.XPathHelper;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.ooxml.util.DocumentHelper;
@@ -95,8 +95,7 @@ public class XSSFImportFromXML {
 
         List<XSSFTable> tables = _map.getRelatedTables();
 
-        XPathFactory xpathFactory = XPathFactory.newInstance();
-        XPath xpath = xpathFactory.newXPath();
+        XPath xpath = XPathHelper.getFactory().newXPath();
 
         // Setting namespace context to XPath
         // Assuming that the namespace prefix in the mapping xpath is the
@@ -305,4 +304,5 @@ public class XSSFImportFromXML {
             return null;
         }
     }
+
 }