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