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 <[email protected]>
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);
-    }
-
-}

Reply via email to