This is an automated email from the ASF dual-hosted git repository.

tballison pushed a commit to branch TIKA-4868-performance-improvements
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 17e67b4d311d83ae298c3cdefbc19d287ef7e889
Author: tallison <[email protected]>
AuthorDate: Tue Sep 1 17:11:18 2026 -0400

    don't double detect
---
 CHANGES.txt                                                      | 7 +++++++
 .../src/main/java/org/apache/tika/detect/CompositeDetector.java  | 2 +-
 .../src/main/java/org/apache/tika/detect/DefaultDetector.java    | 9 +++++++++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 397b2915b8..8c2b56af66 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,12 @@
 Release 4.1.0 - unreleased
 
+   * DefaultDetector honors CONTENT_TYPE_USER_OVERRIDE and
+     CONTENT_TYPE_PARSER_OVERRIDE before running magic detection, matching
+     CompositeDetector's contract. Removes the second full magic scan every
+     pipes parse paid per document. Compat note: with a user override set,
+     DefaultDetector no longer lets a more specific magic result overrule
+     the override (TIKA-4868).
+
    * Markdown output is ~4x faster on large documents:
      ToMarkdownContentHandler now buffers the commonmark renderer's
      per-character writes instead of paying the synchronized
diff --git 
a/tika-core/src/main/java/org/apache/tika/detect/CompositeDetector.java 
b/tika-core/src/main/java/org/apache/tika/detect/CompositeDetector.java
index 027b6f4c6d..158dbdeaec 100644
--- a/tika-core/src/main/java/org/apache/tika/detect/CompositeDetector.java
+++ b/tika-core/src/main/java/org/apache/tika/detect/CompositeDetector.java
@@ -96,7 +96,7 @@ public class CompositeDetector implements Detector {
      * @param metadata
      * @return mediaType if a parseable mediatype was sent in via user or 
parser overrides
      */
-    private static MediaType detectOverrides(Metadata metadata) {
+    protected static MediaType detectOverrides(Metadata metadata) {
         String override = 
metadata.get(TikaCoreProperties.CONTENT_TYPE_USER_OVERRIDE);
         if (!StringUtils.isBlank(override)) {
             MediaType mt = MediaType.parse(override);
diff --git 
a/tika-core/src/main/java/org/apache/tika/detect/DefaultDetector.java 
b/tika-core/src/main/java/org/apache/tika/detect/DefaultDetector.java
index 6b19b87867..bda7f5e6f9 100644
--- a/tika-core/src/main/java/org/apache/tika/detect/DefaultDetector.java
+++ b/tika-core/src/main/java/org/apache/tika/detect/DefaultDetector.java
@@ -135,6 +135,15 @@ public class DefaultDetector extends CompositeDetector {
     @Override
     public MediaType detect(TikaInputStream tis, Metadata metadata, 
ParseContext parseContext)
             throws IOException {
+        // 0. An override short-circuits detection entirely, as in 
CompositeDetector.
+        // Without this check the magic scan below runs even when a prior 
detect pass
+        // recorded its result as CONTENT_TYPE_PARSER_OVERRIDE -- doubling 
detection
+        // cost on every pipes parse.
+        MediaType override = detectOverrides(metadata);
+        if (override != null) {
+            return override;
+        }
+
         // 1. Magic detection via MimeTypes
         MediaType magicType = mimeTypes.detect(tis, metadata, parseContext);
         metadata.set(TikaCoreProperties.CONTENT_TYPE_MAGIC_DETECTED, 
magicType.toString());

Reply via email to