You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2016/04/18 17:06:14 UTC

tika git commit: clean up to "Add DOM and Stax parsers to ParseContext

Repository: tika
Updated Branches:
  refs/heads/master 3d491317c -> 172c58443


clean up to "Add DOM and Stax parsers to ParseContext


Project: http://git-wip-us.apache.org/repos/asf/tika/repo
Commit: http://git-wip-us.apache.org/repos/asf/tika/commit/172c5844
Tree: http://git-wip-us.apache.org/repos/asf/tika/tree/172c5844
Diff: http://git-wip-us.apache.org/repos/asf/tika/diff/172c5844

Branch: refs/heads/master
Commit: 172c58443550d256a94994aba24c6600a2397256
Parents: 3d49131
Author: tballison <ta...@mitre.org>
Authored: Mon Apr 18 11:05:34 2016 -0400
Committer: tballison <ta...@mitre.org>
Committed: Mon Apr 18 11:05:34 2016 -0400

----------------------------------------------------------------------
 .../batch/builders/BatchProcessBuilder.java     | 15 ++++----
 .../builders/CommandLineParserBuilder.java      | 16 ++++-----
 .../java/org/apache/tika/config/TikaConfig.java | 14 +++-----
 .../tika/config/TikaConfigSerializer.java       |  4 +--
 .../org/apache/tika/mime/MimeTypesReader.java   | 20 ++++++-----
 .../org/apache/tika/parser/ParseContext.java    | 30 +++++++++-------
 .../external/ExternalParsersConfigReader.java   | 11 ++----
 .../org/apache/tika/parser/mock/MockParser.java | 12 +++----
 .../tika/parser/epub/EpubContentParser.java     | 33 ++++-------------
 .../ooxml/XSSFExcelExtractorDecorator.java      | 11 +++---
 .../parser/odf/OpenDocumentContentParser.java   | 37 +++++---------------
 .../org/apache/tika/parser/pdf/PDFParser.java   |  2 +-
 12 files changed, 75 insertions(+), 130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java
----------------------------------------------------------------------
diff --git a/tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java b/tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java
index 83afa78..df5e4bf 100644
--- a/tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java
+++ b/tika-batch/src/main/java/org/apache/tika/batch/builders/BatchProcessBuilder.java
@@ -18,8 +18,6 @@ package org.apache.tika.batch.builders;
  */
 
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collections;
@@ -33,6 +31,9 @@ import org.apache.tika.batch.FileResource;
 import org.apache.tika.batch.FileResourceCrawler;
 import org.apache.tika.batch.Interrupter;
 import org.apache.tika.batch.StatusReporter;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.io.IOExceptionWithCause;
+import org.apache.tika.parser.ParseContext;
 import org.apache.tika.util.ClassLoaderUtil;
 import org.apache.tika.util.XMLDOMUtil;
 import org.w3c.dom.Document;
@@ -65,15 +66,11 @@ public class BatchProcessBuilder {
      */
     public BatchProcess build(InputStream is, Map<String,String> runtimeAttributes) throws IOException {
         Document doc = null;
-        DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
-        DocumentBuilder docBuilder = null;
         try {
-            docBuilder = fact.newDocumentBuilder();
+            DocumentBuilder docBuilder = new ParseContext().getDocumentBuilder();
             doc = docBuilder.parse(is);
-        } catch (ParserConfigurationException e) {
-            throw new IOException(e);
-        } catch (SAXException e) {
-            throw new IOException(e);
+        } catch (TikaException|SAXException e) {
+            throw new IOExceptionWithCause(e);
         }
         Node docElement = doc.getDocumentElement();
         return build(docElement, runtimeAttributes);

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineParserBuilder.java
----------------------------------------------------------------------
diff --git a/tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineParserBuilder.java b/tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineParserBuilder.java
index 9a32f12..66b55bf 100644
--- a/tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineParserBuilder.java
+++ b/tika-batch/src/main/java/org/apache/tika/batch/builders/CommandLineParserBuilder.java
@@ -18,14 +18,15 @@ package org.apache.tika.batch.builders;
  */
 
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Locale;
 
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.io.IOExceptionWithCause;
+import org.apache.tika.parser.ParseContext;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -41,16 +42,13 @@ public class CommandLineParserBuilder {
 
     public Options build(InputStream is) throws IOException {
         Document doc = null;
-        DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
-        DocumentBuilder docBuilder = null;
         try {
-            docBuilder = fact.newDocumentBuilder();
+            DocumentBuilder docBuilder = new ParseContext().getDocumentBuilder();
             doc = docBuilder.parse(is);
-        } catch (ParserConfigurationException e) {
-            throw new IOException(e);
-        } catch (SAXException e) {
-            throw new IOException(e);
+        } catch (TikaException|SAXException e) {
+            throw new IOExceptionWithCause(e);
         }
+
         Node docElement = doc.getDocumentElement();
         NodeList children = docElement.getChildNodes();
         Node commandlineNode = null;

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java
----------------------------------------------------------------------
diff --git a/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java b/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java
index 7b943f2..0e3acd9 100644
--- a/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java
+++ b/tika-core/src/main/java/org/apache/tika/config/TikaConfig.java
@@ -16,6 +16,8 @@
  */
 package org.apache.tika.config;
 
+import javax.imageio.spi.ServiceRegistry;
+import javax.xml.parsers.DocumentBuilder;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -33,11 +35,6 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
-import javax.imageio.spi.ServiceRegistry;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
 import org.apache.tika.concurrent.ConfigurableThreadPoolExecutor;
 import org.apache.tika.concurrent.SimpleThreadPoolExecutor;
 import org.apache.tika.detect.CompositeDetector;
@@ -54,6 +51,7 @@ import org.apache.tika.mime.MimeTypesFactory;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.CompositeParser;
 import org.apache.tika.parser.DefaultParser;
+import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.ParserDecorator;
 import org.w3c.dom.Document;
@@ -351,11 +349,7 @@ public class TikaConfig {
     }
 
     private static DocumentBuilder getBuilder() throws TikaException {
-        try {
-            return DocumentBuilderFactory.newInstance().newDocumentBuilder();
-        } catch (ParserConfigurationException e) {
-            throw new TikaException("XML parser not available", e);
-        }
+        return new ParseContext().getDocumentBuilder();
     }
 
     private static Element getChild(Element element, String name) {

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-core/src/main/java/org/apache/tika/config/TikaConfigSerializer.java
----------------------------------------------------------------------
diff --git a/tika-core/src/main/java/org/apache/tika/config/TikaConfigSerializer.java b/tika-core/src/main/java/org/apache/tika/config/TikaConfigSerializer.java
index 3c19cfd..e882ca9 100644
--- a/tika-core/src/main/java/org/apache/tika/config/TikaConfigSerializer.java
+++ b/tika-core/src/main/java/org/apache/tika/config/TikaConfigSerializer.java
@@ -17,7 +17,6 @@
 package org.apache.tika.config;
 
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;
@@ -61,8 +60,7 @@ public class TikaConfigSerializer {
      */
     public static void serialize(TikaConfig config, Mode mode, Writer writer, Charset charset)
             throws Exception {
-        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
-        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+        DocumentBuilder docBuilder = new ParseContext().getDocumentBuilder();
 
         // root elements
         Document doc = docBuilder.newDocument();

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-core/src/main/java/org/apache/tika/mime/MimeTypesReader.java
----------------------------------------------------------------------
diff --git a/tika-core/src/main/java/org/apache/tika/mime/MimeTypesReader.java b/tika-core/src/main/java/org/apache/tika/mime/MimeTypesReader.java
index b832b93..abd8cb2 100644
--- a/tika-core/src/main/java/org/apache/tika/mime/MimeTypesReader.java
+++ b/tika-core/src/main/java/org/apache/tika/mime/MimeTypesReader.java
@@ -16,15 +16,7 @@
  */
 package org.apache.tika.mime;
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
+import javax.xml.XMLConstants;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
@@ -33,6 +25,14 @@ import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.sax.SAXResult;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import org.w3c.dom.Document;
 import org.xml.sax.Attributes;
@@ -116,6 +116,8 @@ public class MimeTypesReader extends DefaultHandler implements MimeTypesReaderMe
         try {
             SAXParserFactory factory = SAXParserFactory.newInstance();
             factory.setNamespaceAware(false);
+            factory.setFeature(
+                    XMLConstants.FEATURE_SECURE_PROCESSING, true);
             SAXParser parser = factory.newSAXParser();
             parser.parse(stream, this);
         } catch (ParserConfigurationException e) {

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-core/src/main/java/org/apache/tika/parser/ParseContext.java
----------------------------------------------------------------------
diff --git a/tika-core/src/main/java/org/apache/tika/parser/ParseContext.java b/tika-core/src/main/java/org/apache/tika/parser/ParseContext.java
index 2ff07e5..9863cbf 100644
--- a/tika-core/src/main/java/org/apache/tika/parser/ParseContext.java
+++ b/tika-core/src/main/java/org/apache/tika/parser/ParseContext.java
@@ -133,7 +133,7 @@ public class ParseContext implements Serializable {
      * Returns the SAX parser factory specified in this parsing context.
      * If a factory is not explicitly specified, then a default factory
      * instance is created and returned. The default factory instance is
-     * configured to be namespace-aware and to use
+     * configured to be namespace-aware, not validating, and to use
      * {@link XMLConstants#FEATURE_SECURE_PROCESSING secure XML processing}.
      *
      * @since Apache Tika 0.8
@@ -144,6 +144,7 @@ public class ParseContext implements Serializable {
         if (factory == null) {
             factory = SAXParserFactory.newInstance();
             factory.setNamespaceAware(true);
+            factory.setValidating(false);
             try {
                 factory.setFeature(
                         XMLConstants.FEATURE_SECURE_PROCESSING, true);
@@ -170,7 +171,7 @@ public class ParseContext implements Serializable {
      * @since Apache Tika 1.13
      * @return DOM parser factory
      */
-    public DocumentBuilderFactory getDocumentBuilderFactory() {
+    private DocumentBuilderFactory getDocumentBuilderFactory() {
         //borrowed from Apache POI
         DocumentBuilderFactory documentBuilderFactory = get(DocumentBuilderFactory.class);
         if (documentBuilderFactory == null) {
@@ -185,28 +186,33 @@ public class ParseContext implements Serializable {
 
     /**
      * Returns the DOM builder specified in this parsing context.
-     * If a factory is not explicitly specified, then a builder
+     * If a builder is not explicitly specified, then a builder
      * instance is created and returned. The builder instance is
-     * configured to apply an {@link #IGNORING_ENTITY_RESOLVER}.
+     * configured to apply an {@link #IGNORING_ENTITY_RESOLVER},
+     * and it sets the ErrorHandler to <code>null</code>.
      *
      * @since Apache Tika 1.13
      * @return DOM Builder
      */
-    public DocumentBuilder getDocumentBuilder() {
+    public DocumentBuilder getDocumentBuilder() throws TikaException {
+        DocumentBuilder documentBuilder = get(DocumentBuilder.class);
+        if (documentBuilder != null) {
+            return documentBuilder;
+        }
         try {
             DocumentBuilderFactory documentBuilderFactory = getDocumentBuilderFactory();
-            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+            documentBuilder = documentBuilderFactory.newDocumentBuilder();
             documentBuilder.setEntityResolver(IGNORING_ENTITY_RESOLVER);
             documentBuilder.setErrorHandler(null);
             return documentBuilder;
         } catch (ParserConfigurationException e) {
-            throw new IllegalStateException("cannot create a DocumentBuilder", e);
+            throw new TikaException("XML parser not available", e);
         }
     }
 
-    private static void trySetSAXFeature(DocumentBuilderFactory dbf, String feature, boolean enabled) {
+    private static void trySetSAXFeature(DocumentBuilderFactory dbf, String feature, boolean value) {
         try {
-            dbf.setFeature(feature, enabled);
+            dbf.setFeature(feature, value);
         } catch (Exception|AbstractMethodError e) {
         }
     }
@@ -241,16 +247,16 @@ public class ParseContext implements Serializable {
      */
     public XMLInputFactory getXMLInputFactory() {
         XMLInputFactory factory = get(XMLInputFactory.class);
-        if (factory == null) {
-            factory = XMLInputFactory.newFactory().newFactory();
+        if (factory != null) {
+            return factory;
         }
+        factory = XMLInputFactory.newFactory();
 
         tryToSetProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
         tryToSetProperty(factory, XMLInputFactory.IS_VALIDATING, false);
 
         tryToSetProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
         tryToSetProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
-
         factory.setXMLResolver(new XMLResolver() {
             @Override
             public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParsersConfigReader.java
----------------------------------------------------------------------
diff --git a/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParsersConfigReader.java b/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParsersConfigReader.java
index d2ca91f..2fd3cb5 100644
--- a/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParsersConfigReader.java
+++ b/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParsersConfigReader.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tika.parser.external;
 
+import javax.xml.parsers.DocumentBuilder;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -27,13 +28,10 @@ import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.mime.MimeTypeException;
+import org.apache.tika.parser.ParseContext;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -56,12 +54,9 @@ public final class ExternalParsersConfigReader implements ExternalParsersConfigR
    
    public static List<ExternalParser> read(InputStream stream) throws TikaException, IOException {
       try {
-          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-          DocumentBuilder builder = factory.newDocumentBuilder();
+          DocumentBuilder builder = new ParseContext().getDocumentBuilder();
           Document document = builder.parse(new InputSource(stream));
           return read(document);
-      } catch (ParserConfigurationException e) {
-          throw new TikaException("Unable to create an XML parser", e);
       } catch (SAXException e) {
           throw new TikaException("Invalid parser configuration", e);
       }

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-core/src/test/java/org/apache/tika/parser/mock/MockParser.java
----------------------------------------------------------------------
diff --git a/tika-core/src/test/java/org/apache/tika/parser/mock/MockParser.java b/tika-core/src/test/java/org/apache/tika/parser/mock/MockParser.java
index a920502..510ca69 100644
--- a/tika-core/src/test/java/org/apache/tika/parser/mock/MockParser.java
+++ b/tika-core/src/test/java/org/apache/tika/parser/mock/MockParser.java
@@ -21,8 +21,6 @@ package org.apache.tika.parser.mock;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -36,6 +34,7 @@ import java.util.Set;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.extractor.EmbeddedDocumentExtractor;
 import org.apache.tika.extractor.ParsingEmbeddedDocumentExtractor;
+import org.apache.tika.io.IOExceptionWithCause;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaMetadataKeys;
 import org.apache.tika.mime.MediaType;
@@ -80,15 +79,12 @@ public class MockParser extends AbstractParser {
                       Metadata metadata, ParseContext context) throws IOException,
             SAXException, TikaException {
         Document doc = null;
-        DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
-        DocumentBuilder docBuilder = null;
         try {
-            docBuilder = fact.newDocumentBuilder();
+            DocumentBuilder docBuilder = context.getDocumentBuilder();
             doc = docBuilder.parse(stream);
-        } catch (ParserConfigurationException e) {
-            throw new IOException(e);
         } catch (SAXException e) {
-            throw new IOException(e);
+            //to distinguish between SAX on read vs SAX while writing
+            throw new IOExceptionWithCause(e);
         }
         Node root = doc.getDocumentElement();
         NodeList actions = root.getChildNodes();

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-parsers/src/main/java/org/apache/tika/parser/epub/EpubContentParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/epub/EpubContentParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/epub/EpubContentParser.java
index 4debbf0..94b5caa 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/epub/EpubContentParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/epub/EpubContentParser.java
@@ -16,16 +16,12 @@
  */
 package org.apache.tika.parser.epub;
 
+import javax.xml.parsers.SAXParser;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collections;
 import java.util.Set;
 
-import javax.xml.XMLConstants;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
 import org.apache.commons.io.input.CloseShieldInputStream;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
@@ -36,7 +32,6 @@ import org.apache.tika.sax.OfflineContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
 
 /**
  * Parser for EPUB OPS <code>*.html</code> files.
@@ -54,27 +49,11 @@ public class EpubContentParser extends AbstractParser {
             Metadata metadata, ParseContext context)
             throws IOException, SAXException, TikaException {
         final XHTMLContentHandler xhtml =
-            new XHTMLContentHandler(handler,metadata);
-
-        try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setValidating(false);
-            factory.setNamespaceAware(true);
-            try {
-                factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
-            } catch (SAXNotRecognizedException e) {
-                // TIKA-329: Some XML parsers do not support the secure-processing
-                // feature, even though it's required by JAXP in Java 5. Ignoring
-                // the exception is fine here, deployments without this feature
-                // are inherently vulnerable to XML denial-of-service attacks.
-            }
-            SAXParser parser = factory.newSAXParser();
-            parser.parse(
-                    new CloseShieldInputStream(stream),
-                    new OfflineContentHandler(xhtml));
-        } catch (ParserConfigurationException e) {
-            throw new TikaException("XML parser configuration error", e);
-        }
+                new XHTMLContentHandler(handler, metadata);
+        SAXParser parser = context.getSAXParser();
+        parser.parse(
+                new CloseShieldInputStream(stream),
+                new OfflineContentHandler(xhtml));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
index 5006d0b..0e44abd 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
@@ -16,9 +16,7 @@
  */
 package org.apache.tika.parser.microsoft.ooxml;
 
-import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -70,11 +68,13 @@ public class XSSFExcelExtractorDecorator extends AbstractOOXMLExtractor {
     private final DataFormatter formatter;
     private final List<PackagePart> sheetParts = new ArrayList<PackagePart>();
     private Metadata metadata;
+    private ParseContext parseContext;
 
     public XSSFExcelExtractorDecorator(
             ParseContext context, XSSFEventBasedExcelExtractor extractor, Locale locale) {
         super(context, extractor);
 
+        this.parseContext = context;
         this.extractor = extractor;
         extractor.setFormulasNotResults(false);
         extractor.setLocale(locale);
@@ -92,6 +92,7 @@ public class XSSFExcelExtractorDecorator extends AbstractOOXMLExtractor {
             throws SAXException, XmlException, IOException, TikaException {
 
         this.metadata = metadata;
+        this.parseContext = context;
         metadata.set(TikaMetadataKeys.PROTECTED, "false");
 
         super.getXHTML(handler, metadata, context);
@@ -186,10 +187,8 @@ public class XSSFExcelExtractorDecorator extends AbstractOOXMLExtractor {
             InputStream sheetInputStream)
             throws IOException, SAXException {
         InputSource sheetSource = new InputSource(sheetInputStream);
-        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
-        saxFactory.setNamespaceAware(true);
         try {
-            SAXParser saxParser = saxFactory.newSAXParser();
+            SAXParser saxParser = parseContext.getSAXParser();
             XMLReader sheetParser = saxParser.getXMLReader();
             XSSFSheetInterestingPartsCapturer handler =
                     new XSSFSheetInterestingPartsCapturer(new XSSFSheetXMLHandler(
@@ -201,7 +200,7 @@ public class XSSFExcelExtractorDecorator extends AbstractOOXMLExtractor {
             if (handler.hasProtection) {
                 metadata.set(TikaMetadataKeys.PROTECTED, "true");
             }
-        } catch (ParserConfigurationException e) {
+        } catch (TikaException e) {
             throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());
         }
     }

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
index 1bf3f7f..a32d406 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
@@ -16,12 +16,10 @@
  */
 package org.apache.tika.parser.odf;
 
-import javax.xml.XMLConstants;
+import static org.apache.tika.sax.XHTMLContentHandler.XHTML;
+
 import javax.xml.namespace.QName;
-import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.BitSet;
@@ -38,18 +36,15 @@ import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.ElementMappingContentHandler;
+import org.apache.tika.sax.ElementMappingContentHandler.TargetElement;
 import org.apache.tika.sax.OfflineContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
-import org.apache.tika.sax.ElementMappingContentHandler.TargetElement;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
 import org.xml.sax.helpers.AttributesImpl;
 import org.xml.sax.helpers.DefaultHandler;
 
-import static org.apache.tika.sax.XHTMLContentHandler.XHTML;
-
 /**
  * Parser for ODF <code>content.xml</code> files.
  */
@@ -490,26 +485,12 @@ public class OpenDocumentContentParser extends AbstractParser {
 
         DefaultHandler dh = new OpenDocumentElementMappingContentHandler(handler, MAPPINGS);
 
-        try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setValidating(false);
-            factory.setNamespaceAware(true);
-            try {
-                factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
-            } catch (SAXNotRecognizedException e) {
-                // TIKA-329: Some XML parsers do not support the secure-processing
-                // feature, even though it's required by JAXP in Java 5. Ignoring
-                // the exception is fine here, deployments without this feature
-                // are inherently vulnerable to XML denial-of-service attacks.
-            }
-            SAXParser parser = factory.newSAXParser();
-            parser.parse(
-                    new CloseShieldInputStream(stream),
-                    new OfflineContentHandler(
-                            new NSNormalizerContentHandler(dh)));
-        } catch (ParserConfigurationException e) {
-            throw new TikaException("XML parser configuration error", e);
-        }
+
+        SAXParser parser = context.getSAXParser();
+        parser.parse(
+            new CloseShieldInputStream(stream),
+            new OfflineContentHandler(
+                    new NSNormalizerContentHandler(dh)));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tika/blob/172c5844/tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDFParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
index e102d27..b677d84 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
@@ -602,7 +602,7 @@ public class PDFParser extends AbstractParser {
             DocumentBuilder documentBuilder = context.getDocumentBuilder();
             documentBuilder.setErrorHandler((ErrorHandler)null);
             return documentBuilder.parse(is);
-        } catch (IOException|SAXException e) {
+        } catch (IOException|SAXException|TikaException e) {
             //swallow
         }
         return null;