From 86a4de7d42f9d6dcb83bab46946d22013827f6b2 Mon Sep 17 00:00:00 2001 From: Milamber Date: Wed, 26 Aug 2026 10:05:02 +0200 Subject: [PATCH] Migrate to Apache Tika 4.0.0 Bump tika-core to 4.0.0 and drop the no-op tika-parsers aggregator (packaging=pom, non-transitive: it shipped no jar and only pulled extra BOMs into dependency verification). Replace the removed TikaConfig with a plain Tika() for MIME detection in HTTPFileArg and ParseCurlCommandAction, and delete the now-unused tika-config.xml. Wrap the Parser.parse input in TikaInputStream in Document, as the Parser interface now requires it in 4.x. Add trusted keys for the BOMs imported by tika-core's parent POM (com.azure, io.grpc, org.eclipse.jetty, org.testcontainers) and update the expected release jar entry to tika-core-4.0.0.jar. Reflect the bump in the 6.0.0 "Non-functional changes" changelog entry (the dev cycle already moved 1.x -> 3.x; update it to 4.x). Co-Authored-By: Claude Opus 4.8 --- gradle/verification-metadata.xml | 4 ++++ src/bom-thirdparty/build.gradle.kts | 3 +-- .../java/org/apache/jmeter/util/Document.java | 5 ++--- src/dist/src/dist/expected_release_jars.csv | 2 +- src/protocol/http/build.gradle.kts | 7 ++----- .../gui/action/ParseCurlCommandAction.java | 14 +------------ .../protocol/http/util/HTTPFileArg.java | 14 +------------ .../protocol/http/gui/action/tika-config.xml | 21 ------------------- xdocs/changes.xml | 2 +- 9 files changed, 13 insertions(+), 59 deletions(-) delete mode 100644 src/protocol/http/src/main/resources/org/apache/jmeter/protocol/http/gui/action/tika-config.xml diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 69fb2e633dd..eedbce6676b 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -129,8 +129,10 @@ + + @@ -167,6 +169,7 @@ + @@ -175,6 +178,7 @@ + diff --git a/src/bom-thirdparty/build.gradle.kts b/src/bom-thirdparty/build.gradle.kts index ffd0b4073f5..ea87db3f27a 100644 --- a/src/bom-thirdparty/build.gradle.kts +++ b/src/bom-thirdparty/build.gradle.kts @@ -117,8 +117,7 @@ dependencies { api("org.apache.logging.log4j:log4j-core:2.26.0") api("org.apache.logging.log4j:log4j-slf4j2-impl:2.26.0") api("org.apache.rat:apache-rat:0.17") - api("org.apache.tika:tika-core:3.2.3") - api("org.apache.tika:tika-parsers:3.2.3") + api("org.apache.tika:tika-core:4.0.0") api("org.apache.velocity:velocity:1.7") api("org.apache.xmlgraphics:xmlgraphics-commons:2.11") api("org.apiguardian:apiguardian-api:1.1.2") diff --git a/src/core/src/main/java/org/apache/jmeter/util/Document.java b/src/core/src/main/java/org/apache/jmeter/util/Document.java index 7b0ca1059e0..ed9c520afcf 100644 --- a/src/core/src/main/java/org/apache/jmeter/util/Document.java +++ b/src/core/src/main/java/org/apache/jmeter/util/Document.java @@ -17,10 +17,9 @@ package org.apache.jmeter.util; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; +import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; @@ -53,7 +52,7 @@ public static String getTextFromDocument(byte[] document) { ContentHandler handler = new BodyContentHandler(MAX_DOCUMENT_SIZE > 0 ? MAX_DOCUMENT_SIZE : -1); // -1 to disable the write limit Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); - InputStream stream = new ByteArrayInputStream(document); // open the stream + TikaInputStream stream = TikaInputStream.get(document); // open the stream try { parser.parse(stream, handler, metadata, context); response = handler.toString(); diff --git a/src/dist/src/dist/expected_release_jars.csv b/src/dist/src/dist/expected_release_jars.csv index 12ef9a5b9e2..7a1135db886 100644 --- a/src/dist/src/dist/expected_release_jars.csv +++ b/src/dist/src/dist/expected_release_jars.csv @@ -152,7 +152,7 @@ 195922,stax2-api-4.2.2.jar 10192,swing-extensions-laf-support-0.1.3.jar 2539,swing-extensions-visual-padding-0.1.3.jar -778543,tika-core-3.2.3.jar +664580,tika-core-4.0.0.jar 73265,txw2-4.0.6.jar 173935,unbescape-1.1.6.RELEASE.jar 1612256,woodstox-core-7.1.1.jar diff --git a/src/protocol/http/build.gradle.kts b/src/protocol/http/build.gradle.kts index af6b3482f5d..2a6c3ffd46b 100644 --- a/src/protocol/http/build.gradle.kts +++ b/src/protocol/http/build.gradle.kts @@ -70,12 +70,9 @@ dependencies { testImplementation(testFixtures(projects.src.core)) testImplementation(testFixtures(projects.src.testkitWiremock)) testImplementation("org.wiremock:wiremock") - // For some reason JMeter bundles just tika-core and tika-parsers without transitive - // dependencies. So we exclude those + // JMeter bundles just tika-core (without transitive dependencies) for MIME-type + // detection. Document parsing relies on a user-supplied tika-app.jar at runtime. implementation("org.apache.tika:tika-core") { isTransitive = false } - runtimeOnly("org.apache.tika:tika-parsers") { - isTransitive = false - } } diff --git a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/gui/action/ParseCurlCommandAction.java b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/gui/action/ParseCurlCommandAction.java index 5e78a1a0c59..48624134052 100644 --- a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/gui/action/ParseCurlCommandAction.java +++ b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/gui/action/ParseCurlCommandAction.java @@ -105,11 +105,8 @@ import org.apache.jorphan.gui.JMeterUIDefaults; import org.apache.jorphan.util.StringUtilities; import org.apache.tika.Tika; -import org.apache.tika.config.TikaConfig; -import org.apache.tika.exception.TikaException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.xml.sax.SAXException; import com.google.auto.service.AutoService; @@ -138,16 +135,7 @@ public class ParseCurlCommandAction extends AbstractAction implements MenuCreato private JSyntaxTextArea cURLCommandTA; private JLabel statusText; private JCheckBox uploadCookiesCheckBox; - private final Tika tika = createTika(); - - private Tika createTika() { - try { - return new Tika(new TikaConfig(this.getClass().getClassLoader() - .getResourceAsStream("org/apache/jmeter/protocol/http/gui/action/tika-config.xml"))); - } catch (TikaException | IOException | SAXException e) { - return new Tika(); - } - } + private final Tika tika = new Tika(); public ParseCurlCommandAction() { super(); diff --git a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/util/HTTPFileArg.java b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/util/HTTPFileArg.java index bf38e101cdc..9b4921978fe 100644 --- a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/util/HTTPFileArg.java +++ b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/util/HTTPFileArg.java @@ -28,9 +28,6 @@ import org.apache.jmeter.testelement.schema.PropertyDescriptor; import org.apache.jorphan.util.StringUtilities; import org.apache.tika.Tika; -import org.apache.tika.config.TikaConfig; -import org.apache.tika.exception.TikaException; -import org.xml.sax.SAXException; /** * Class representing a file parameter for http upload. @@ -46,7 +43,7 @@ public class HTTPFileArg extends AbstractTestElement implements Serializable { /** temporary storage area for the body header. */ private String header; - private static final Tika tika = createTika(); + private static final Tika tika = new Tika(); /** * Constructor for an empty HTTPFileArg object @@ -87,15 +84,6 @@ public HTTPFileArg(String path, String paramname, String mimetype) { setMimeType(detectMimeType(path, mimetype)); } - private static Tika createTika() { - try { - return new Tika(new TikaConfig(HTTPFileArg.class.getClassLoader() - .getResourceAsStream("org/apache/jmeter/protocol/http/gui/action/tika-config.xml"))); - } catch (TikaException | IOException | SAXException e) { - return new Tika(); - } - } - private static String detectMimeType(String path, String mimetype) { if (StringUtilities.isNotBlank(mimetype)) { return mimetype; diff --git a/src/protocol/http/src/main/resources/org/apache/jmeter/protocol/http/gui/action/tika-config.xml b/src/protocol/http/src/main/resources/org/apache/jmeter/protocol/http/gui/action/tika-config.xml deleted file mode 100644 index e621d9c7a4f..00000000000 --- a/src/protocol/http/src/main/resources/org/apache/jmeter/protocol/http/gui/action/tika-config.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - diff --git a/xdocs/changes.xml b/xdocs/changes.xml index 988377c81b1..0fadcca8eeb 100644 --- a/xdocs/changes.xml +++ b/xdocs/changes.xml @@ -91,7 +91,7 @@ Summary

Non-functional changes

    -
  • Update Apache Tika to 3.x from 1.x to use the latest parser engine.
  • +
  • Update Apache Tika to 4.x from 1.x to use the latest parser engine.
  • Update Saxon-HE to 12.x from 11.x for XSLT and XQuery processing.
  • Update Groovy to 5.x for the Groovy-based scripting environment.
  • Update Bouncy Castle to 1.82 for cryptographic operations.