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]);
+ }
+}