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 2026/08/12 15:48:01 UTC
(tika) 06/24: TIKA-4809: Remove the /translate endpoints
This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch TIKA-4809-stage-9
in repository https://gitbox.apache.org/repos/asf/tika.git
commit a60612c84ec20f7d59a235f2c2f54eebaec669c9
Author: tallison <ta...@apache.org>
AuthorDate: Mon Aug 10 16:11:11 2026 -0400
TIKA-4809: Remove the /translate endpoints
---
.../migration-to-4x/migrating-tika-server-4x.adoc | 8 ++
.../ROOT/pages/using-tika/server/index.adoc | 1 -
tika-server/tika-server-core/pom.xml | 5 -
.../org/apache/tika/server/core/ServerStatus.java | 2 +-
.../apache/tika/server/core/TikaServerProcess.java | 4 -
.../server/core/resource/TranslateResource.java | 137 ---------------------
.../tika/server/core/TranslateResourceTest.java | 88 -------------
7 files changed, 9 insertions(+), 236 deletions(-)
diff --git a/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc b/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc
index 376789ff4c..e79dd92398 100644
--- a/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc
+++ b/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc
@@ -89,6 +89,14 @@ The separate `/config` endpoints have been removed. Configuration is now handled
**Migration:** Use `POST /tika` or `POST /tika/json` with a `config` part in your multipart request.
+==== `/translate/*`
+
+The translation endpoints have been removed, along with tika-server's dependency on `tika-translate`.
+
+These endpoints were never usable as shipped. Every request had to name a fully-qualified translator implementation class in the URL path, and each of the bundled implementations wraps a commercial API that requires credentials the server has no way to supply -- there is no configuration surface for them and none was ever wired up. With the default distribution, every request returned an error.
+
+**Migration:** Call the translation service you use directly, or invoke `tika-translate` from your own code. Tika's translation support is unaffected; only the server endpoints are gone.
+
=== Error Response Bodies Are Now JSON
In 3.x, error responses from `/tika`, `/rmeta`, and `/unpack` returned a plain-text
diff --git a/docs/modules/ROOT/pages/using-tika/server/index.adoc b/docs/modules/ROOT/pages/using-tika/server/index.adoc
index 5e39c5a99b..40594bed85 100644
--- a/docs/modules/ROOT/pages/using-tika/server/index.adoc
+++ b/docs/modules/ROOT/pages/using-tika/server/index.adoc
@@ -188,7 +188,6 @@ curl -T document.pdf http://localhost:9998/meta/Content-Type # single field
* `/mime-types` — known MIME types
* `/detect/stream` — type detection only (no parsing)
* `/language/stream`, `/language/string` — language detection
-* `/translate/all/\{translator}/\{src}/\{dest}` — translation
* `/pipes`, `/async` — Pipes-based bulk processing
NOTE: `/pipes` and `/async` require `allowPipes` (they drive process-isolated fetching
diff --git a/tika-server/tika-server-core/pom.xml b/tika-server/tika-server-core/pom.xml
index d2b602b94e..06846dc8e0 100644
--- a/tika-server/tika-server-core/pom.xml
+++ b/tika-server/tika-server-core/pom.xml
@@ -46,11 +46,6 @@
<artifactId>tika-serialization</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>tika-translate</artifactId>
- <version>${project.version}</version>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>tika-langdetect-charsoup</artifactId>
diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatus.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatus.java
index 51f29af919..6219a72839 100644
--- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatus.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatus.java
@@ -84,6 +84,6 @@ public class ServerStatus {
}
public enum TASK {
- PARSE, DETECT, TRANSLATE
+ PARSE, DETECT
}
}
diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
index 8db6425753..f13773c2af 100644
--- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
@@ -87,7 +87,6 @@ import org.apache.tika.server.core.resource.TikaServerResource;
import org.apache.tika.server.core.resource.TikaServerStatus;
import org.apache.tika.server.core.resource.TikaVersion;
import org.apache.tika.server.core.resource.TikaWelcome;
-import org.apache.tika.server.core.resource.TranslateResource;
import org.apache.tika.server.core.resource.UnpackerResource;
import org.apache.tika.server.core.writer.CSVMessageBodyWriter;
import org.apache.tika.server.core.writer.JSONMessageBodyWriter;
@@ -355,7 +354,6 @@ public class TikaServerProcess {
resourceProviders.add(new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource)));
resourceProviders.add(new SingletonResourceProvider(new DetectorResource(serverStatus, tikaResource)));
resourceProviders.add(new SingletonResourceProvider(new LanguageResource()));
- resourceProviders.add(new SingletonResourceProvider(new TranslateResource(serverStatus)));
resourceProviders.add(new SingletonResourceProvider(tikaResource));
resourceProviders.add(new SingletonResourceProvider(new UnpackerResource(tikaResource)));
resourceProviders.add(new SingletonResourceProvider(new TikaMimeTypes(tikaResource)));
@@ -379,8 +377,6 @@ public class TikaServerProcess {
resourceProviders.add(new SingletonResourceProvider(new DetectorResource(serverStatus, tikaResource)));
} else if ("language".equals(endPoint)) {
resourceProviders.add(new SingletonResourceProvider(new LanguageResource()));
- } else if ("translate".equals(endPoint)) {
- resourceProviders.add(new SingletonResourceProvider(new TranslateResource(serverStatus)));
} else if ("tika".equals(endPoint)) {
resourceProviders.add(new SingletonResourceProvider(tikaResource));
} else if ("unpack".equals(endPoint)) {
diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TranslateResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TranslateResource.java
deleted file mode 100644
index d90a48d763..0000000000
--- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TranslateResource.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.server.core.resource;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.PUT;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.Produces;
-import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.tika.config.ServiceLoader;
-import org.apache.tika.exception.TikaException;
-import org.apache.tika.language.detect.LanguageDetector;
-import org.apache.tika.language.detect.LanguageResult;
-import org.apache.tika.language.translate.Translator;
-import org.apache.tika.server.core.ServerStatus;
-
-@Path("/translate")
-public class TranslateResource {
- private static final Logger LOG = LoggerFactory.getLogger(TranslateResource.class);
- private final ServerStatus serverStatus;
- private Translator defaultTranslator;
- private ServiceLoader loader;
-
- public TranslateResource(ServerStatus serverStatus) {
- this.loader = new ServiceLoader(ServiceLoader.class.getClassLoader());
- //TODO -- implement translators
- //this.defaultTranslator = TikaResource
- // .getTikaLoader()
- // .getTranslator();
- this.serverStatus = serverStatus;
- }
-
- // TIKA-4526: handle @PUT and @POST separately to avoid nondeterministic failures
- @POST
- @Path("/all/{translator}/{src}/{dest}")
- @Consumes("*/*")
- @Produces("text/plain")
- public String translatePost(final InputStream is, @PathParam("translator") String translator, @PathParam("src") String sLang, @PathParam("dest") String dLang)
- throws TikaException, IOException {
- return doTranslate(IOUtils.toString(is, UTF_8), translator, sLang, dLang);
- }
-
- @PUT
- @Path("/all/{translator}/{src}/{dest}")
- @Consumes("*/*")
- @Produces("text/plain")
- public String translatePut(final InputStream is, @PathParam("translator") String translator, @PathParam("src") String sLang, @PathParam("dest") String dLang)
- throws TikaException, IOException {
- return doTranslate(IOUtils.toString(is, UTF_8), translator, sLang, dLang);
- }
-
- @POST
- @Path("/all/{translator}/{dest}")
- @Consumes("*/*")
- @Produces("text/plain")
- public String autoTranslatePost(final InputStream is, @PathParam("translator") String translator, @PathParam("dest") String dLang) throws TikaException, IOException {
- return doAutoTranslate(IOUtils.toString(is, UTF_8), translator, dLang);
- }
-
- @PUT
- @Path("/all/{translator}/{dest}")
- @Consumes("*/*")
- @Produces("text/plain")
- public String autoTranslatePut(final InputStream is, @PathParam("translator") String translator, @PathParam("dest") String dLang) throws TikaException, IOException {
- return doAutoTranslate(IOUtils.toString(is, UTF_8), translator, dLang);
- }
-
- private String doTranslate(String content, String translator, String sLang, String dLang) throws TikaException, IOException {
- LOG.debug("Using translator: [{}]: src: [{}]: dest: [{}]", translator, sLang, dLang);
- Translator translate = byClassName(translator);
- if (translate == null) {
- translate = this.defaultTranslator;
- LOG.debug("Using default translator");
- }
- long taskId = serverStatus.start(ServerStatus.TASK.TRANSLATE, null);
- try {
- return translate.translate(content, sLang, dLang);
- } catch (OutOfMemoryError e) {
- LOG.error("OOM while translating");
- throw e;
- } finally {
- serverStatus.complete(taskId);
- }
- }
-
- private String doAutoTranslate(String content, String translator, String dLang) throws TikaException, IOException {
- LanguageResult language = LanguageDetector.getDefaultLanguageDetector()
- .loadModels()
- .detect(content);
- if (language.isUnknown()) {
- throw new TikaException("Unable to detect language to use for translation of text");
- }
-
- String sLang = language.getLanguage();
- LOG.debug("LanguageIdentifier: detected source lang: [{}]", sLang);
-
- return doTranslate(content, translator, sLang, dLang);
- }
-
- private Translator byClassName(String className) {
- List<Translator> translators = loader.loadStaticServiceProviders(Translator.class);
- for (Translator t : translators) {
- if (t
- .getClass()
- .getName()
- .equals(className)) {
- return t;
- }
- }
- return null;
- }
-}
diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
deleted file mode 100644
index ec7316525b..0000000000
--- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.server.core;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import jakarta.ws.rs.core.Response;
-import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.junit.jupiter.api.Test;
-
-import org.apache.tika.server.core.resource.TranslateResource;
-import org.apache.tika.server.core.writer.TarWriter;
-import org.apache.tika.server.core.writer.ZipWriter;
-
-public class TranslateResourceTest extends CXFTestBase {
-
- private static final String TRANSLATE_PATH = "/translate";
- private static final String TRANSLATE_ALL_PATH = TRANSLATE_PATH + "/all";
- private static final String TRANSLATE_TXT = "This won't translate";
- private static final String LINGO_PATH = "/org.apache.tika.language.translate.impl.Lingo24Translator";
- private static final String SRCDEST = "/es/en";
- private static final String DEST = "/en";
-
- @Override
- protected void setUpResources(JAXRSServerFactoryBean sf) {
- sf.setResourceClasses(TranslateResource.class);
- sf.setResourceProvider(TranslateResource.class, new SingletonResourceProvider(new TranslateResource(new ServerStatus())));
-
- }
-
- @Override
- protected void setUpProviders(JAXRSServerFactoryBean sf) {
- List<Object> providers = new ArrayList<>();
- providers.add(new TarWriter());
- providers.add(new ZipWriter());
- providers.add(new TikaServerParseExceptionMapper());
- sf.setProviders(providers);
-
- }
-
- @Test
- public void testTranslateFull() throws Exception {
- String url = endPoint + TRANSLATE_ALL_PATH + LINGO_PATH + SRCDEST;
- Response response = WebClient
- .create(url)
- .type("text/plain")
- .accept("*/*")
- .put(TRANSLATE_TXT);
- assertNotNull(response);
- String translated = getStringFromInputStream((InputStream) response.getEntity());
- assertEquals(TRANSLATE_TXT, translated);
- }
-
- @Test
- public void testTranslateAutoLang() throws Exception {
- String url = endPoint + TRANSLATE_ALL_PATH + LINGO_PATH + DEST;
- Response response = WebClient
- .create(url)
- .type("text/plain")
- .accept("*/*")
- .put(TRANSLATE_TXT);
- assertNotNull(response);
- String translated = getStringFromInputStream((InputStream) response.getEntity());
- assertEquals(TRANSLATE_TXT, translated);
- }
-
-}