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

reta pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/main by this push:
     new dfc027205cd Bump cxf.tika.version from 3.3.2 to 4.0.0 (#3409)
dfc027205cd is described below

commit dfc027205cde8a9ee95258ecac50bdbd056feee3
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AuthorDate: Mon Aug 31 10:05:08 2026 -0400

    Bump cxf.tika.version from 3.3.2 to 4.0.0 (#3409)
    
    * Bump cxf.tika.version from 3.3.2 to 4.0.0
    
    Bumps `cxf.tika.version` from 3.3.2 to 4.0.0.
    
    Updates `org.apache.tika:tika-core` from 3.3.2 to 4.0.0
    - [Changelog](https://github.com/apache/tika/blob/main/CHANGES.txt)
    - [Commits](https://github.com/apache/tika/compare/3.3.2...4.0.0)
    
    Updates `org.apache.tika:tika-parser-pdf-module` from 3.3.2 to 4.0.0
    
    ---
    updated-dependencies:
    - dependency-name: org.apache.tika:tika-core
      dependency-version: 4.0.0
      dependency-type: direct:development
      update-type: version-update:semver-major
    - dependency-name: org.apache.tika:tika-parser-pdf-module
      dependency-version: 4.0.0
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
    Signed-off-by: dependabot[bot] <[email protected]>
    
    * Use reflection to support Tika 3.x / 4.x release lines
    
    * Fix Tika 4 detector context handling (#3410)
    
    ---------
    
    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] 
<49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: Andriy Redko <[email protected]>
    Co-authored-by: Suraj Rajan <[email protected]>
---
 distribution/src/main/release/samples/pom.xml      |  2 +-
 parent/pom.xml                                     |  2 +-
 .../ext/search/tika/TikaContentExtractor.java      | 45 ++++++++++++++++++++--
 .../ext/search/tika/TikaContentExtractorTest.java  | 21 +++++++++-
 4 files changed, 63 insertions(+), 7 deletions(-)

diff --git a/distribution/src/main/release/samples/pom.xml 
b/distribution/src/main/release/samples/pom.xml
index ac0688a1177..9bc02fa7011 100644
--- a/distribution/src/main/release/samples/pom.xml
+++ b/distribution/src/main/release/samples/pom.xml
@@ -37,7 +37,7 @@
         <cxf.netty.version>4.2.17.Final</cxf.netty.version>
         
<cxf.httpcomponents.client.version>4.5.14</cxf.httpcomponents.client.version>
         <cxf.swagger.ui.version>5.32.14</cxf.swagger.ui.version>
-        <cxf.tika.version>3.3.2</cxf.tika.version>
+        <cxf.tika.version>4.0.0</cxf.tika.version>
         <cxf.tomcat.version>11.0.25</cxf.tomcat.version>
         <cxf.jboss.weld.version>6.0.4.Final</cxf.jboss.weld.version>
         <cxf.gson.version>2.14.0</cxf.gson.version>
diff --git a/parent/pom.xml b/parent/pom.xml
index 222c4336f3c..567db52fdf2 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -224,7 +224,7 @@
         <cxf.stax-ex.version>1.8.3</cxf.stax-ex.version>
         <cxf.swagger.ui.version>5.32.14</cxf.swagger.ui.version>
         <cxf.swagger.v3.version>2.2.54</cxf.swagger.v3.version>
-        <cxf.tika.version>3.3.2</cxf.tika.version>
+        <cxf.tika.version>4.0.0</cxf.tika.version>
         <cxf.tomcat.version>11.0.25</cxf.tomcat.version>
         
<cxf.tomitribe.http.signature.version>1.8</cxf.tomitribe.http.signature.version>
         <cxf.undertow.version>2.4.2.Final</cxf.undertow.version>
diff --git 
a/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractor.java
 
b/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractor.java
index 8ec0e4805df..d17578fce28 100644
--- 
a/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractor.java
+++ 
b/rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractor.java
@@ -21,6 +21,10 @@ package org.apache.cxf.jaxrs.ext.search.tika;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+import java.lang.reflect.UndeclaredThrowableException;
 import java.util.Collections;
 import java.util.List;
 import java.util.logging.Level;
@@ -45,9 +49,35 @@ import org.apache.tika.sax.ToTextContentHandler;
 
 public class TikaContentExtractor {
     private static final Logger LOG = 
LogUtils.getL7dLogger(TikaContentExtractor.class);
+    private static final MethodHandle MH_DETECTOR;
+    private static final MethodHandle MH_DETECTOR_FALLBACK;
 
     private final List<Parser> parsers;
     private final Detector detector;
+    
+    static {
+        MethodHandle detector = null;
+        MethodHandle detectorFallback = null;
+
+        try {
+            detector = MethodHandles
+                .publicLookup()
+                .findVirtual(Detector.class, "detect",  
MethodType.methodType(MediaType.class,
+                        TikaInputStream.class, Metadata.class, 
ParseContext.class));
+        } catch (NoSuchMethodException | IllegalAccessException e) {
+            try {
+                detectorFallback = MethodHandles
+                    .publicLookup()
+                    .findVirtual(Detector.class, "detect", 
MethodType.methodType(MediaType.class,
+                        InputStream.class, Metadata.class));
+            } catch (NoSuchMethodException | IllegalAccessException e1) {
+                throw new UndeclaredThrowableException(e1, "Unable to detect 
Tika version");
+            }
+        }
+
+        MH_DETECTOR = detector;
+        MH_DETECTOR_FALLBACK = detectorFallback;
+    }
 
     /**
      * Create new Tika-based content extractor using AutoDetectParser.
@@ -173,12 +203,20 @@ public class TikaContentExtractor {
         final TikaInputStream tin = TikaInputStream.get(in);
 
         try {
+            if (context == null) {
+                context = new ParseContext();
+            }
+
             // Try to validate that input stream media type is supported by 
the parser
             MediaType mediaType = null;
             if (mtHint != null) {
                 mediaType = MediaType.parse(mtHint.toString());
             } else if (detector != null && in.markSupported()) {
-                mediaType = detector.detect(tin, metadata);
+                if (MH_DETECTOR != null) {
+                    mediaType = (MediaType) 
MH_DETECTOR.bindTo(detector).invoke(tin, metadata, context);
+                } else {
+                    mediaType = (MediaType) 
MH_DETECTOR_FALLBACK.bindTo(detector).invoke(tin, metadata);
+                }
             }
             if (mediaType != null) {
                 metadata.set(HttpHeaders.CONTENT_TYPE, mediaType.toString());
@@ -200,9 +238,6 @@ public class TikaContentExtractor {
                 return null;
             }
 
-            if (context == null) {
-                context = new ParseContext();
-            }
             if (context.get(Parser.class) == null) {
                 // to process the embedded attachments
                 context.set(Parser.class,
@@ -231,6 +266,8 @@ public class TikaContentExtractor {
             LOG.log(Level.WARNING, "Unable to parse input stream", ex);
         } catch (final TikaException ex) {
             LOG.log(Level.WARNING, "Unable to parse input stream", ex);
+        } catch (final Throwable ex) {
+            LOG.log(Level.WARNING, "Unable to parse input stream", ex);
         }
 
         return null;
diff --git 
a/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractorTest.java
 
b/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractorTest.java
index e53ebf1ad20..2b49a3c0b2b 100644
--- 
a/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractorTest.java
+++ 
b/rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/tika/TikaContentExtractorTest.java
@@ -18,12 +18,16 @@
  */
 package org.apache.cxf.jaxrs.ext.search.tika;
 
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.util.Collections;
 
 import org.apache.cxf.jaxrs.ext.search.SearchBean;
 import org.apache.cxf.jaxrs.ext.search.SearchCondition;
 import org.apache.cxf.jaxrs.ext.search.SearchConditionParser;
 import org.apache.cxf.jaxrs.ext.search.fiql.FiqlParser;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.pdf.PDFParser;
 
 import org.junit.Before;
@@ -84,4 +88,19 @@ public class TikaContentExtractorTest {
     public void testExtractionFromNullInputStreamFails() {
         assertNull("Document should be null, it is encrypted", 
extractor.extract((InputStream)null));
     }
-}
\ No newline at end of file
+
+    @Test
+    public void testDetectorReceivesParseContext() {
+        ParseContext[] detectorContext = new ParseContext[1];
+        TikaContentExtractor another = new TikaContentExtractor(
+            Collections.singletonList(new PDFParser()),
+            (stream, metadata, context) -> {
+                detectorContext[0] = context;
+                return MediaType.OCTET_STREAM;
+            });
+
+        another.extract(new ByteArrayInputStream(new byte[0]));
+
+        assertNotNull(detectorContext[0]);
+    }
+}

Reply via email to