This is an automated email from the ASF dual-hosted git repository. tballison pushed a commit to branch TIKA-4809-stage-1 in repository https://gitbox.apache.org/repos/asf/tika.git
commit 1a6aeac2f0f1e6f0e4ebfd135758ffb452bedb6e Author: tallison <[email protected]> AuthorDate: Fri Aug 7 10:30:54 2026 -0400 TIKA-4809: Remove TikaResource's static singleton --- .../apache/tika/server/core/TikaServerProcess.java | 44 +++++++------- .../server/core/resource/DetectorResource.java | 8 ++- .../server/core/resource/MetadataResource.java | 27 +++++---- .../server/core/resource/PipesParsingHelper.java | 6 +- .../core/resource/RecursiveMetadataResource.java | 23 +++++--- .../tika/server/core/resource/TikaDetectors.java | 10 ++-- .../tika/server/core/resource/TikaMimeTypes.java | 6 +- .../tika/server/core/resource/TikaParsers.java | 10 ++-- .../tika/server/core/resource/TikaResource.java | 67 +++++++++++----------- .../server/core/resource/UnpackerResource.java | 21 ++++--- .../org/apache/tika/server/core/CXFTestBase.java | 3 +- .../core/ConfigEndpointSecurityEnabledTest.java | 2 +- .../server/core/ConfigEndpointSecurityTest.java | 2 +- .../server/core/RecursiveMetadataResourceTest.java | 2 +- .../apache/tika/server/core/StackTraceTest.java | 11 ++-- .../apache/tika/server/core/TikaMimeTypesTest.java | 2 +- .../apache/tika/server/core/TikaResourceTest.java | 2 +- .../tika/server/core/TikaServerProcessTest.java | 6 +- .../apache/tika/server/core/TikaWelcomeTest.java | 4 +- .../standard/resource/XMPMetadataResource.java | 5 ++ .../tika/server/standard/DetectorResourceTest.java | 2 +- .../server/standard/JsonMaxFieldLengthTest.java | 2 +- .../tika/server/standard/MetadataResourceTest.java | 4 +- .../server/standard/OpenNLPMetadataFilterTest.java | 4 +- .../standard/OptimaizeMetadataFilterTest.java | 4 +- .../standard/RecursiveMetadataFilterTest.java | 2 +- .../standard/RecursiveMetadataResourceTest.java | 2 +- .../tika/server/standard/TikaDetectorsTest.java | 2 +- .../tika/server/standard/TikaMimeTypesTest.java | 2 +- .../tika/server/standard/TikaParsersTest.java | 2 +- .../tika/server/standard/TikaResourceTest.java | 2 +- .../UnpackerResourceConfigDisabledTest.java | 2 +- .../tika/server/standard/UnpackerResourceTest.java | 2 +- .../standard/UnpackerResourceWithConfigTest.java | 2 +- 34 files changed, 165 insertions(+), 130 deletions(-) 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 5826421f1d..422cbe05f8 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 @@ -192,13 +192,13 @@ public class TikaServerProcess { LOG.info("Pipes-based parsing enabled for /tika and /rmeta endpoints"); } - TikaResource.init(tikaLoader, serverStatus, pipesParsingHelper, + TikaResource tikaResource = new TikaResource(tikaLoader, serverStatus, pipesParsingHelper, tikaServerConfig.isAllowPerRequestConfig()); JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); List<ResourceProvider> resourceProviders = new ArrayList<>(); List<Object> providers = new ArrayList<>(); - loadAllProviders(tikaServerConfig, serverStatus, resourceProviders, providers); + loadAllProviders(tikaServerConfig, serverStatus, tikaResource, resourceProviders, providers); sf.setResourceProviders(resourceProviders); @@ -296,9 +296,10 @@ public class TikaServerProcess { return parameters; } - private static void loadAllProviders(TikaServerConfig tikaServerConfig, ServerStatus serverStatus, List<ResourceProvider> resourceProviders, List<Object> writers) + private static void loadAllProviders(TikaServerConfig tikaServerConfig, ServerStatus serverStatus, + TikaResource tikaResource, List<ResourceProvider> resourceProviders, List<Object> writers) throws TikaException, SAXException, IOException { - List<ResourceProvider> tmpCoreProviders = loadCoreProviders(tikaServerConfig, serverStatus); + List<ResourceProvider> tmpCoreProviders = loadCoreProviders(tikaServerConfig, serverStatus, tikaResource); resourceProviders.addAll(tmpCoreProviders); resourceProviders.add(new SingletonResourceProvider(new TikaWelcome(tmpCoreProviders))); @@ -345,23 +346,24 @@ public class TikaServerProcess { } // package-private so the pipes/async start-guard can be exercised directly in tests - static List<ResourceProvider> loadCoreProviders(TikaServerConfig tikaServerConfig, ServerStatus serverStatus) throws TikaException, IOException, SAXException { + static List<ResourceProvider> loadCoreProviders(TikaServerConfig tikaServerConfig, ServerStatus serverStatus, + TikaResource tikaResource) throws TikaException, IOException, SAXException { List<ResourceProvider> resourceProviders = new ArrayList<>(); boolean addAsyncResource = false; boolean addPipesResource = false; if (tikaServerConfig .getEndpoints() .size() == 0) { - resourceProviders.add(new SingletonResourceProvider(new MetadataResource())); - resourceProviders.add(new SingletonResourceProvider(new RecursiveMetadataResource())); - resourceProviders.add(new SingletonResourceProvider(new DetectorResource(serverStatus))); + resourceProviders.add(new SingletonResourceProvider(new MetadataResource(tikaResource))); + 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(new TikaResource())); - resourceProviders.add(new SingletonResourceProvider(new UnpackerResource())); - resourceProviders.add(new SingletonResourceProvider(new TikaMimeTypes())); - resourceProviders.add(new SingletonResourceProvider(new TikaDetectors())); - resourceProviders.add(new SingletonResourceProvider(new TikaParsers())); + resourceProviders.add(new SingletonResourceProvider(tikaResource)); + resourceProviders.add(new SingletonResourceProvider(new UnpackerResource(tikaResource))); + resourceProviders.add(new SingletonResourceProvider(new TikaMimeTypes(tikaResource))); + resourceProviders.add(new SingletonResourceProvider(new TikaDetectors(tikaResource))); + resourceProviders.add(new SingletonResourceProvider(new TikaParsers(tikaResource))); resourceProviders.add(new SingletonResourceProvider(new TikaVersion())); if (tikaServerConfig.isAllowPipes()) { addAsyncResource = true; @@ -373,25 +375,25 @@ public class TikaServerProcess { } else { for (String endPoint : tikaServerConfig.getEndpoints()) { if ("meta".equals(endPoint)) { - resourceProviders.add(new SingletonResourceProvider(new MetadataResource())); + resourceProviders.add(new SingletonResourceProvider(new MetadataResource(tikaResource))); } else if ("rmeta".equals(endPoint)) { - resourceProviders.add(new SingletonResourceProvider(new RecursiveMetadataResource())); + resourceProviders.add(new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource))); } else if ("detect".equals(endPoint)) { - resourceProviders.add(new SingletonResourceProvider(new DetectorResource(serverStatus))); + 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(new TikaResource())); + resourceProviders.add(new SingletonResourceProvider(tikaResource)); } else if ("unpack".equals(endPoint)) { - resourceProviders.add(new SingletonResourceProvider(new UnpackerResource())); + resourceProviders.add(new SingletonResourceProvider(new UnpackerResource(tikaResource))); } else if ("mime".equals(endPoint)) { - resourceProviders.add(new SingletonResourceProvider(new TikaMimeTypes())); + resourceProviders.add(new SingletonResourceProvider(new TikaMimeTypes(tikaResource))); } else if ("detectors".equals(endPoint)) { - resourceProviders.add(new SingletonResourceProvider(new TikaDetectors())); + resourceProviders.add(new SingletonResourceProvider(new TikaDetectors(tikaResource))); } else if ("parsers".equals(endPoint)) { - resourceProviders.add(new SingletonResourceProvider(new TikaParsers())); + resourceProviders.add(new SingletonResourceProvider(new TikaParsers(tikaResource))); } else if ("version".equals(endPoint)) { resourceProviders.add(new SingletonResourceProvider(new TikaVersion())); } else if ("pipes".equals(endPoint)) { diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/DetectorResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/DetectorResource.java index cd34bff138..1960c22323 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/DetectorResource.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/DetectorResource.java @@ -41,9 +41,11 @@ import org.apache.tika.server.core.ServerStatus; public class DetectorResource { private static final Logger LOG = LoggerFactory.getLogger(DetectorResource.class); private final ServerStatus serverStatus; + private final TikaResource tikaResource; - public DetectorResource(ServerStatus serverStatus) { + public DetectorResource(ServerStatus serverStatus, TikaResource tikaResource) { this.serverStatus = serverStatus; + this.tikaResource = tikaResource; } @PUT @@ -51,7 +53,7 @@ public class DetectorResource { @Consumes("*/*") @Produces("text/plain") public String detect(final InputStream is, @Context HttpHeaders httpHeaders, @Context final UriInfo info) { - ParseContext parseContext = TikaResource.createParseContext(); + ParseContext parseContext = tikaResource.createParseContext(); Metadata met = Metadata.newInstance(parseContext); String filename = TikaResource.detectFilename(httpHeaders.getRequestHeaders()); @@ -60,7 +62,7 @@ public class DetectorResource { long taskId = serverStatus.start(ServerStatus.TASK.DETECT, filename); try (TikaInputStream tis = TikaInputStream.get(is)) { - return TikaResource + return tikaResource .getTikaLoader() .loadDetectors() .detect(tis, met, parseContext) diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/MetadataResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/MetadataResource.java index 123a780e18..ec0d9bc46f 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/MetadataResource.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/MetadataResource.java @@ -17,7 +17,6 @@ package org.apache.tika.server.core.resource; import static org.apache.tika.server.core.resource.TikaResource.fillMetadata; -import static org.apache.tika.server.core.resource.TikaResource.setupMultipartConfig; import java.io.IOException; import java.io.InputStream; @@ -51,12 +50,18 @@ import org.apache.tika.parser.Parser; public class MetadataResource { private static final Logger LOG = LoggerFactory.getLogger(MetadataResource.class); + private final TikaResource tikaResource; + + public MetadataResource(TikaResource tikaResource) { + this.tikaResource = tikaResource; + } + @POST @Consumes("multipart/form-data") @Produces({"text/csv", "application/json"}) @Path("form") public Response getMetadataFromMultipart(Attachment att, @Context UriInfo info) throws Exception { - ParseContext context = TikaResource.createParseContext(); + ParseContext context = tikaResource.createParseContext(); try (TikaInputStream tis = TikaInputStream.get(att.getObject(InputStream.class))) { return Response .ok(parseMetadata(tis, Metadata.newInstance(context), att.getHeaders(), info)) @@ -78,15 +83,15 @@ public class MetadataResource { @Context UriInfo info) throws Exception { // Load default context from config, then overlay with request config - ParseContext context = TikaResource.createParseContext(); + ParseContext context = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(context); - try (TikaInputStream tis = setupMultipartConfig(attachments, metadata, context)) { + try (TikaInputStream tis = tikaResource.setupMultipartConfig(attachments, metadata, context)) { // No need to parse embedded docs for metadata-only extraction context.set(DocumentSelector.class, metadata1 -> false); - Parser parser = TikaResource.createParser(); + Parser parser = tikaResource.createParser(); TikaResource.logRequest(LOG, "/meta/config", metadata); - TikaResource.parse(parser, LOG, info.getPath(), tis, new LanguageHandler() { + tikaResource.parse(parser, LOG, info.getPath(), tis, new LanguageHandler() { public void endDocument() { metadata.set("language", getLanguage().getLanguage()); } @@ -99,7 +104,7 @@ public class MetadataResource { @PUT @Produces({"text/csv", "application/json"}) public Response getMetadata(InputStream is, @Context HttpHeaders httpHeaders, @Context UriInfo info) throws Exception { - ParseContext context = TikaResource.createParseContext(); + ParseContext context = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(context); try (TikaInputStream tis = TikaInputStream.get(is)) { return Response @@ -139,7 +144,7 @@ public class MetadataResource { // use BAD request to indicate that we may not have had enough data to // process the request Response.Status defaultErrorResponse = Response.Status.BAD_REQUEST; - ParseContext context = TikaResource.createParseContext(); + ParseContext context = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(context); boolean success = false; try (TikaInputStream tis = TikaInputStream.get(is)) { @@ -173,14 +178,14 @@ public class MetadataResource { protected Metadata parseMetadata(TikaInputStream tis, Metadata metadata, MultivaluedMap<String, String> httpHeaders, UriInfo info) throws IOException, TikaConfigException { // Load default context from config (includes DigesterFactory from parse-context) - final ParseContext context = TikaResource.createParseContext(); - Parser parser = TikaResource.createParser(); + final ParseContext context = tikaResource.createParseContext(); + Parser parser = tikaResource.createParser(); fillMetadata(parser, metadata, httpHeaders); //no need to parse embedded docs context.set(DocumentSelector.class, metadata1 -> false); TikaResource.logRequest(LOG, "/meta", metadata); - TikaResource.parse(parser, LOG, info.getPath(), tis, new LanguageHandler() { + tikaResource.parse(parser, LOG, info.getPath(), tis, new LanguageHandler() { public void endDocument() { metadata.set("language", getLanguage().getLanguage()); } diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java index fa29824de4..89414d2992 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java @@ -260,7 +260,11 @@ public class PipesParsingHelper { LOG.debug("Parse returned empty result, status: {}", result.status()); String message = result.message(); if (message != null && !message.isEmpty()) { - ParseContext context = TikaResource.createParseContext(); + // Plain ParseContext, not TikaResource.createParseContext() -- this class is + // constructed before TikaResource (which takes it as a constructor arg), so + // depending back on TikaResource here would be circular. Only used to build + // an error-result Metadata object; no actual parsing happens on this path. + ParseContext context = new ParseContext(); Metadata errorMetadata = Metadata.newInstance(context); errorMetadata.add(TikaCoreProperties.CONTAINER_EXCEPTION, message); return Collections.singletonList(errorMetadata); diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/RecursiveMetadataResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/RecursiveMetadataResource.java index 2f33377762..0f858c909c 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/RecursiveMetadataResource.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/RecursiveMetadataResource.java @@ -20,7 +20,6 @@ import static org.apache.tika.server.core.resource.TikaResource.fillMetadata; import static org.apache.tika.server.core.resource.TikaResource.getWriteLimit; import static org.apache.tika.server.core.resource.TikaResource.setupContentHandlerFactory; import static org.apache.tika.server.core.resource.TikaResource.setupContentHandlerFactoryIfNeeded; -import static org.apache.tika.server.core.resource.TikaResource.setupMultipartConfig; import java.io.InputStream; import java.util.List; @@ -54,16 +53,22 @@ public class RecursiveMetadataResource { protected static final BasicContentHandlerFactory.HANDLER_TYPE DEFAULT_HANDLER_TYPE = BasicContentHandlerFactory.HANDLER_TYPE.MARKDOWN; private static final Logger LOG = LoggerFactory.getLogger(RecursiveMetadataResource.class); + private final TikaResource tikaResource; + + public RecursiveMetadataResource(TikaResource tikaResource) { + this.tikaResource = tikaResource; + } + /** * Parses content and returns metadata list. * Metadata filtering is done in the child process, so no filtering needed here. */ - public static List<Metadata> parseMetadata(TikaInputStream tis, Metadata metadata, + public List<Metadata> parseMetadata(TikaInputStream tis, Metadata metadata, MultivaluedMap<String, String> httpHeaders, ServerHandlerConfig handlerConfig) throws Exception { - final ParseContext context = TikaResource.createParseContext(); + final ParseContext context = tikaResource.createParseContext(); fillMetadata(null, metadata, httpHeaders); TikaResource.logRequest(LOG, "/rmeta", metadata); @@ -80,7 +85,7 @@ public class RecursiveMetadataResource { } // Filtering is done in child process, no need to filter again - return TikaResource.parseWithPipes(tis, metadata, context, ParseMode.RMETA); + return tikaResource.parseWithPipes(tis, metadata, context, ParseMode.RMETA); } static ServerHandlerConfig buildHandlerConfig(MultivaluedMap<String, String> httpHeaders, String handlerTypeName, ParseMode parseMode) { @@ -125,7 +130,7 @@ public class RecursiveMetadataResource { @Produces({"application/json"}) @Path("form{" + HANDLER_TYPE_PARAM + " : (\\w+)?}") public Response getMetadataFromMultipart(Attachment att, @PathParam(HANDLER_TYPE_PARAM) String handlerTypeName) throws Exception { - ParseContext context = TikaResource.createParseContext(); + ParseContext context = tikaResource.createParseContext(); try (TikaInputStream tis = TikaInputStream.get(att.getObject(InputStream.class))) { tis.getPath(); // Spool to temp file for pipes-based parsing List<Metadata> metadataList = parseMetadata(tis, Metadata.newInstance(context), att.getHeaders(), @@ -147,9 +152,9 @@ public class RecursiveMetadataResource { List<Attachment> attachments, @Context HttpHeaders httpHeaders) throws Exception { - ParseContext context = TikaResource.createParseContext(); + ParseContext context = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(context); - try (TikaInputStream tis = setupMultipartConfig(attachments, metadata, context)) { + try (TikaInputStream tis = tikaResource.setupMultipartConfig(attachments, metadata, context)) { TikaResource.logRequest(LOG, "/rmeta/config", metadata); @@ -168,7 +173,7 @@ public class RecursiveMetadataResource { handlerConfig.writeLimit(), handlerConfig.throwOnWriteLimitReached()); // Filtering is done in child process, no need to filter again - List<Metadata> metadataList = TikaResource.parseWithPipes(tis, metadata, context, ParseMode.RMETA); + List<Metadata> metadataList = tikaResource.parseWithPipes(tis, metadata, context, ParseMode.RMETA); return new MetadataList(metadataList); } @@ -200,7 +205,7 @@ public class RecursiveMetadataResource { @Produces("application/json") @Path("{" + HANDLER_TYPE_PARAM + " : (\\w+)?}") public Response getMetadata(InputStream is, @Context HttpHeaders httpHeaders, @PathParam(HANDLER_TYPE_PARAM) String handlerTypeName) throws Exception { - ParseContext context = TikaResource.createParseContext(); + ParseContext context = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(context); try (TikaInputStream tis = TikaInputStream.get(is)) { tis.getPath(); // Spool to temp file for pipes-based parsing diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaDetectors.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaDetectors.java index 07b12285b8..45975b513d 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaDetectors.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaDetectors.java @@ -40,9 +40,11 @@ import org.apache.tika.server.core.HTMLHelper; public class TikaDetectors { private HTMLHelper html; + private final TikaResource tikaResource; - public TikaDetectors() { + public TikaDetectors(TikaResource tikaResource) { this.html = new HTMLHelper(); + this.tikaResource = tikaResource; } @GET @@ -50,7 +52,7 @@ public class TikaDetectors { public String getDectorsHTML() throws TikaConfigException { StringBuffer h = new StringBuffer(); html.generateHeader(h, "Detectors available to Apache Tika"); - detectorAsHTML(TikaResource + detectorAsHTML(tikaResource .getTikaLoader() .loadDetectors(), h, 2); html.generateFooter(h); @@ -83,7 +85,7 @@ public class TikaDetectors { @Produces(jakarta.ws.rs.core.MediaType.APPLICATION_JSON) public String getDetectorsJSON() throws IOException, TikaConfigException { Map<String, Object> details = new HashMap<>(); - detectorAsMap(TikaResource + detectorAsMap(tikaResource .getTikaLoader() .loadDetectors(), details); return new ObjectMapper().writeValueAsString(details); @@ -111,7 +113,7 @@ public class TikaDetectors { @Produces("text/plain") public String getDetectorsPlain() throws TikaConfigException { StringBuffer text = new StringBuffer(); - renderDetector(TikaResource + renderDetector(tikaResource .getTikaLoader() .loadDetectors(), text, 0); return text.toString(); diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java index 69a18dd89a..5a7deba23a 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java @@ -52,9 +52,11 @@ import org.apache.tika.server.core.HTMLHelper; public class TikaMimeTypes { private HTMLHelper html; + private final TikaResource tikaResource; - public TikaMimeTypes() { + public TikaMimeTypes(TikaResource tikaResource) { this.html = new HTMLHelper(); + this.tikaResource = tikaResource; } private static String[] copyToStringArray(MediaType[] aliases) { @@ -364,7 +366,7 @@ public class TikaMimeTypes { } protected List<MediaTypeDetails> getMediaTypes() throws TikaConfigException { - TikaLoader tikaLoader = TikaResource.getTikaLoader(); + TikaLoader tikaLoader = tikaResource.getTikaLoader(); MimeTypes mimeTypes = TikaLoader.getMimeTypes(); MediaTypeRegistry registry = mimeTypes.getMediaTypeRegistry(); Map<MediaType, Parser> parsers = ((CompositeParser) tikaLoader.loadParsers()).getParsers(); diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaParsers.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaParsers.java index 318ff5afc4..1f028b5b62 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaParsers.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaParsers.java @@ -48,9 +48,11 @@ import org.apache.tika.server.core.HTMLHelper; public class TikaParsers { private static final ParseContext EMPTY_PC = new ParseContext(); private HTMLHelper html; + private final TikaResource tikaResource; - public TikaParsers() { + public TikaParsers(TikaResource tikaResource) { this.html = new HTMLHelper(); + this.tikaResource = tikaResource; } @GET @@ -67,7 +69,7 @@ public class TikaParsers { } protected String getParsersHTML(boolean withMimeTypes) throws TikaConfigException { - ParserDetails p = new ParserDetails(TikaResource + ParserDetails p = new ParserDetails(tikaResource .getTikaLoader() .loadParsers()); @@ -134,7 +136,7 @@ public class TikaParsers { protected String getParsersJSON(boolean withMimeTypes) throws IOException, TikaConfigException { Map<String, Object> details = new HashMap<>(); - parserAsMap(new ParserDetails(TikaResource + parserAsMap(new ParserDetails(tikaResource .getTikaLoader() .loadParsers()), withMimeTypes, details); ObjectMapper objectMapper = new ObjectMapper(); @@ -180,7 +182,7 @@ public class TikaParsers { protected String getParsersPlain(boolean withMimeTypes) throws TikaConfigException { StringBuffer text = new StringBuffer(); - renderParser(new ParserDetails(TikaResource + renderParser(new ParserDetails(tikaResource .getTikaLoader() .loadParsers()), withMimeTypes, text, ""); return text.toString(); diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java index ca1d38429e..fd8cd651b4 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java @@ -62,7 +62,6 @@ import org.apache.tika.exception.WriteLimitReachedException; import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; import org.apache.tika.metadata.TikaCoreProperties; -import org.apache.tika.metadata.writefilter.MetadataWriteLimiterFactory; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.pipes.api.ParseMode; @@ -84,29 +83,31 @@ public class TikaResource { public static final String HANDLER_TYPE_HEADER = "X-Tika-Handler"; private static final String META_PREFIX = "meta_"; private static final Logger LOG = LoggerFactory.getLogger(TikaResource.class); - private static TikaLoader TIKA_LOADER; - private static ServerStatus SERVER_STATUS = null; - private static PipesParsingHelper PIPES_PARSING_HELPER = null; - private static MetadataWriteLimiterFactory DEFAULT_METADATA_WRITE_LIMITER_FACTORY = null; + + // Instance (not static): production only ever creates one CXF server -- and so + // one TikaResource -- per JVM, so this was never a functional requirement, just + // a shortcut. Static state here made every TikaResource-derived server config + // process-wide, so two CXF servers in the same JVM (as tests do, for speed -- + // real deployments never do this) silently stomped on each other's config. + private final TikaLoader tikaLoader; + private final ServerStatus serverStatus; + private final PipesParsingHelper pipesParsingHelper; // Whether per-request config injection (multipart "config" parts) is permitted. // Enforced in setupMultipartConfig so every config-consuming endpoint honors it. - private static boolean ALLOW_PER_REQUEST_CONFIG = false; + private final boolean allowPerRequestConfig; /** - * Initialize TikaResource with pipes-based parsing for process isolation. - * * @param tikaLoader the Tika loader * @param serverStatus server status tracker * @param pipesParsingHelper helper for pipes-based parsing, may be null if /tika endpoint is not enabled * @param allowPerRequestConfig whether per-request config injection is permitted */ - public static void init(TikaLoader tikaLoader, ServerStatus serverStatus, - PipesParsingHelper pipesParsingHelper, boolean allowPerRequestConfig) { - TIKA_LOADER = tikaLoader; - SERVER_STATUS = serverStatus; - PIPES_PARSING_HELPER = pipesParsingHelper; - ALLOW_PER_REQUEST_CONFIG = allowPerRequestConfig; - // MetadataWriteLimiterFactory is now loaded dynamically via loadParseContext() + public TikaResource(TikaLoader tikaLoader, ServerStatus serverStatus, + PipesParsingHelper pipesParsingHelper, boolean allowPerRequestConfig) { + this.tikaLoader = tikaLoader; + this.serverStatus = serverStatus; + this.pipesParsingHelper = pipesParsingHelper; + this.allowPerRequestConfig = allowPerRequestConfig; } /** @@ -114,8 +115,8 @@ public class TikaResource { * * @return the helper */ - public static PipesParsingHelper getPipesParsingHelper() { - return PIPES_PARSING_HELPER; + public PipesParsingHelper getPipesParsingHelper() { + return pipesParsingHelper; } /** @@ -124,9 +125,9 @@ public class TikaResource { * * @return a new ParseContext with defaults applied */ - public static ParseContext createParseContext() { + public ParseContext createParseContext() { try { - return TIKA_LOADER.loadParseContext(); + return tikaLoader.loadParseContext(); } catch (TikaConfigException e) { // Fall back to empty context if loading fails LOG.warn("Failed to load ParseContext from config, using empty context", e); @@ -136,12 +137,12 @@ public class TikaResource { @SuppressWarnings("serial") - public static Parser createParser() throws TikaConfigException, IOException { - return TIKA_LOADER.loadAutoDetectParser(); + public Parser createParser() throws TikaConfigException, IOException { + return tikaLoader.loadAutoDetectParser(); } - public static TikaLoader getTikaLoader() { - return TIKA_LOADER; + public TikaLoader getTikaLoader() { + return tikaLoader; } public static String detectFilename(MultivaluedMap<String, String> httpHeaders) { @@ -245,7 +246,7 @@ public class TikaResource { * @return TikaInputStream wrapping the file attachment's content * @throws IOException if file attachment is missing or config processing fails */ - public static TikaInputStream setupMultipartConfig(List<Attachment> attachments, + public TikaInputStream setupMultipartConfig(List<Attachment> attachments, Metadata metadata, ParseContext context) throws IOException, TikaConfigException { Attachment fileAtt = null; @@ -275,7 +276,7 @@ public class TikaResource { // Enforce the per-request config gate where the config part is actually // consumed, so every endpoint that accepts a config part honors // allowPerRequestConfig uniformly. - if (configAtt != null && !ALLOW_PER_REQUEST_CONFIG) { + if (configAtt != null && !allowPerRequestConfig) { throw new WebApplicationException(Response.status(Response.Status.FORBIDDEN) .entity("Per-request configuration is disabled. Set allowPerRequestConfig=true in server config.") .type(MediaType.TEXT_PLAIN) @@ -340,12 +341,12 @@ public class TikaResource { * @param parseContext parse context * @throws IOException wrapper for all exceptions */ - public static void parse(Parser parser, Logger logger, String path, TikaInputStream inputStream, + public void parse(Parser parser, Logger logger, String path, TikaInputStream inputStream, ContentHandler handler, Metadata metadata, ParseContext parseContext) throws IOException { String fileName = metadata.get(TikaCoreProperties.RESOURCE_NAME_KEY); - long taskId = SERVER_STATUS.start(ServerStatus.TASK.PARSE, fileName); + long taskId = serverStatus.start(ServerStatus.TASK.PARSE, fileName); try { parser.parse(inputStream, handler, metadata, parseContext); } catch (SAXException e) { @@ -362,7 +363,7 @@ public class TikaResource { logger.warn("{}: OOM ({})", path, fileName, e); throw new TikaServerParseException(new TikaException("Out of memory", e)); } finally { - SERVER_STATUS.complete(taskId); + serverStatus.complete(taskId); inputStream.close(); } } @@ -381,19 +382,19 @@ public class TikaResource { * @return list of metadata objects from parsing * @throws IOException if parsing fails */ - public static List<Metadata> parseWithPipes(TikaInputStream tis, Metadata metadata, + public List<Metadata> parseWithPipes(TikaInputStream tis, Metadata metadata, ParseContext parseContext, ParseMode parseMode) throws IOException { - if (PIPES_PARSING_HELPER == null) { + if (pipesParsingHelper == null) { throw new IllegalStateException("Pipes-based parsing is not enabled"); } String fileName = metadata.get(TikaCoreProperties.RESOURCE_NAME_KEY); - long taskId = SERVER_STATUS.start(ServerStatus.TASK.PARSE, fileName); + long taskId = serverStatus.start(ServerStatus.TASK.PARSE, fileName); try { - return PIPES_PARSING_HELPER.parse(tis, metadata, parseContext, parseMode); + return pipesParsingHelper.parse(tis, metadata, parseContext, parseMode); } finally { - SERVER_STATUS.complete(taskId); + serverStatus.complete(taskId); } } diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/UnpackerResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/UnpackerResource.java index f19e684bcc..be64893bca 100644 --- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/UnpackerResource.java +++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/UnpackerResource.java @@ -17,7 +17,6 @@ package org.apache.tika.server.core.resource; import static org.apache.tika.server.core.resource.TikaResource.fillMetadata; -import static org.apache.tika.server.core.resource.TikaResource.setupMultipartConfig; import java.io.InputStream; import java.nio.file.Files; @@ -145,6 +144,12 @@ public class UnpackerResource { private static final Logger LOG = LoggerFactory.getLogger(UnpackerResource.class); + private final TikaResource tikaResource; + + public UnpackerResource(TikaResource tikaResource) { + this.tikaResource = tikaResource; + } + /** * Extracts embedded documents from a container file (simple PUT, no config). * Returns a zip archive containing the extracted files. @@ -158,7 +163,7 @@ public class UnpackerResource { @PUT @Produces("application/zip") public Response unpack(InputStream is, @Context HttpHeaders httpHeaders, @Context UriInfo info) throws Exception { - ParseContext pc = TikaResource.createParseContext(); + ParseContext pc = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(pc); try (TikaInputStream tis = TikaInputStream.get(is)) { tis.getPath(); // Spool to temp file for pipes-based parsing @@ -182,9 +187,9 @@ public class UnpackerResource { @Consumes("multipart/form-data") @Produces("application/zip") public Response unpackWithConfig(List<Attachment> attachments, @Context HttpHeaders httpHeaders, @Context UriInfo info) throws Exception { - ParseContext pc = TikaResource.createParseContext(); + ParseContext pc = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(pc); - try (TikaInputStream tis = setupMultipartConfig(attachments, metadata, pc)) { + try (TikaInputStream tis = tikaResource.setupMultipartConfig(attachments, metadata, pc)) { TikaResource.logRequest(LOG, "/unpack", metadata); return doUnpack(tis, metadata, pc, false); } @@ -203,7 +208,7 @@ public class UnpackerResource { @PUT @Produces("application/zip") public Response unpackAll(InputStream is, @Context HttpHeaders httpHeaders, @Context UriInfo info) throws Exception { - ParseContext pc = TikaResource.createParseContext(); + ParseContext pc = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(pc); try (TikaInputStream tis = TikaInputStream.get(is)) { tis.getPath(); // Spool to temp file for pipes-based parsing @@ -227,9 +232,9 @@ public class UnpackerResource { @Consumes("multipart/form-data") @Produces("application/zip") public Response unpackAllWithConfig(List<Attachment> attachments, @Context HttpHeaders httpHeaders, @Context UriInfo info) throws Exception { - ParseContext pc = TikaResource.createParseContext(); + ParseContext pc = tikaResource.createParseContext(); Metadata metadata = Metadata.newInstance(pc); - try (TikaInputStream tis = setupMultipartConfig(attachments, metadata, pc)) { + try (TikaInputStream tis = tikaResource.setupMultipartConfig(attachments, metadata, pc)) { TikaResource.logRequest(LOG, "/unpack/all", metadata); return doUnpack(tis, metadata, pc, true); } @@ -246,7 +251,7 @@ public class UnpackerResource { * @return streaming response with the zip file */ private Response doUnpack(TikaInputStream tis, Metadata metadata, ParseContext pc, boolean saveAll) throws Exception { - PipesParsingHelper helper = TikaResource.getPipesParsingHelper(); + PipesParsingHelper helper = tikaResource.getPipesParsingHelper(); if (helper == null) { throw new WebApplicationException("Pipes-based parsing is not enabled", Response.Status.SERVICE_UNAVAILABLE); } diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java index 06392256b1..da625df6dd 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java @@ -99,6 +99,7 @@ public abstract class CXFTestBase { protected final static int DIGESTER_READ_LIMIT = 20 * 1024 * 1024; protected Server server; protected TikaLoader tika; + protected TikaResource tikaResource; private PipesParser pipesParser; private Path pipesConfigPath; private Path inputTempDirectory = null; @@ -216,7 +217,7 @@ public abstract class CXFTestBase { PipesParsingHelper pipesParsingHelper = new PipesParsingHelper(this.pipesParser, pipesConfig, inputTempDirectory, getUnpackEmitterBasePath(), false); - TikaResource.init(tika, new ServerStatus(), pipesParsingHelper, isAllowPerRequestConfig()); + tikaResource = new TikaResource(tika, new ServerStatus(), pipesParsingHelper, isAllowPerRequestConfig()); } finally { // Only delete tika config, keep pipes config for child processes Files.deleteIfExists(tmp); diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java index e7335bf7ea..03a048450f 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java @@ -47,7 +47,7 @@ public class ConfigEndpointSecurityEnabledTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaResource.class); - sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(new TikaResource())); + sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(tikaResource)); } @Override diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java index 314574899a..03b45bedb5 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java @@ -48,7 +48,7 @@ public class ConfigEndpointSecurityTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaResource.class); - sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(new TikaResource())); + sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(tikaResource)); } @Override diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/RecursiveMetadataResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/RecursiveMetadataResourceTest.java index 930225db26..b90e661979 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/RecursiveMetadataResourceTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/RecursiveMetadataResourceTest.java @@ -46,7 +46,7 @@ public class RecursiveMetadataResourceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(RecursiveMetadataResource.class); - sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource())); + sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource))); } @Override diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java index 43a30e8c1c..c1aa7b7248 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java @@ -46,7 +46,6 @@ import org.apache.tika.serialization.config.JsonConfigHelper; import org.apache.tika.server.core.resource.DetectorResource; import org.apache.tika.server.core.resource.MetadataResource; import org.apache.tika.server.core.resource.RecursiveMetadataResource; -import org.apache.tika.server.core.resource.TikaResource; import org.apache.tika.server.core.resource.UnpackerResource; import org.apache.tika.server.core.writer.CSVMessageBodyWriter; import org.apache.tika.server.core.writer.JSONMessageBodyWriter; @@ -71,11 +70,11 @@ public class StackTraceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { List<ResourceProvider> rCoreProviders = new ArrayList<>(); - rCoreProviders.add(new SingletonResourceProvider(new MetadataResource())); - rCoreProviders.add(new SingletonResourceProvider(new RecursiveMetadataResource())); - rCoreProviders.add(new SingletonResourceProvider(new DetectorResource(new ServerStatus()))); - rCoreProviders.add(new SingletonResourceProvider(new TikaResource())); - rCoreProviders.add(new SingletonResourceProvider(new UnpackerResource())); + rCoreProviders.add(new SingletonResourceProvider(new MetadataResource(tikaResource))); + rCoreProviders.add(new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource))); + rCoreProviders.add(new SingletonResourceProvider(new DetectorResource(new ServerStatus(), tikaResource))); + rCoreProviders.add(new SingletonResourceProvider(tikaResource)); + rCoreProviders.add(new SingletonResourceProvider(new UnpackerResource(tikaResource))); sf.setResourceProviders(rCoreProviders); } diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaMimeTypesTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaMimeTypesTest.java index 51b7cdcc10..31e5817a47 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaMimeTypesTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaMimeTypesTest.java @@ -34,7 +34,7 @@ public class TikaMimeTypesTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaMimeTypes.class); - sf.setResourceProvider(TikaMimeTypes.class, new SingletonResourceProvider(new TikaMimeTypes())); + sf.setResourceProvider(TikaMimeTypes.class, new SingletonResourceProvider(new TikaMimeTypes(tikaResource))); } @Override diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java index 79948d2a8d..c5d5ce6da7 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java @@ -49,7 +49,7 @@ public class TikaResourceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaResource.class); - sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(new TikaResource())); + sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(tikaResource)); } @Override diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerProcessTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerProcessTest.java index bfc52a4f80..351daa770b 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerProcessTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerProcessTest.java @@ -40,15 +40,15 @@ public class TikaServerProcessTest { // The pipes/async endpoints fork processes and read/write via fetchers/emitters; the // start-guard must refuse them unless allowPipes is set, even when listed. assertThrows(TikaConfigException.class, - () -> TikaServerProcess.loadCoreProviders(config(false, "pipes"), null)); + () -> TikaServerProcess.loadCoreProviders(config(false, "pipes"), null, null)); assertThrows(TikaConfigException.class, - () -> TikaServerProcess.loadCoreProviders(config(false, "async"), null)); + () -> TikaServerProcess.loadCoreProviders(config(false, "async"), null, null)); } @Test public void ordinaryEndpointIsAllowedWithoutAllowPipes() { // The guard must not false-fire on a non-forking endpoint. assertDoesNotThrow( - () -> TikaServerProcess.loadCoreProviders(config(false, "meta"), null)); + () -> TikaServerProcess.loadCoreProviders(config(false, "meta"), null, null)); } } diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaWelcomeTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaWelcomeTest.java index f3c43cdea1..0a83a51e08 100644 --- a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaWelcomeTest.java +++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaWelcomeTest.java @@ -43,8 +43,8 @@ public class TikaWelcomeTest extends CXFTestBase { protected void setUpResources(JAXRSServerFactoryBean sf) { List<ResourceProvider> rpsCore = new ArrayList<>(); rpsCore.add(new SingletonResourceProvider(new TikaVersion())); - rpsCore.add(new SingletonResourceProvider(new DetectorResource(new ServerStatus()))); - rpsCore.add(new SingletonResourceProvider(new MetadataResource())); + rpsCore.add(new SingletonResourceProvider(new DetectorResource(new ServerStatus(), tikaResource))); + rpsCore.add(new SingletonResourceProvider(new MetadataResource(tikaResource))); List<ResourceProvider> all = new ArrayList<>(rpsCore); all.add(new SingletonResourceProvider(new TikaWelcome(rpsCore))); sf.setResourceProviders(all); diff --git a/tika-server/tika-server-standard/src/main/java/org/apache/tika/server/standard/resource/XMPMetadataResource.java b/tika-server/tika-server-standard/src/main/java/org/apache/tika/server/standard/resource/XMPMetadataResource.java index db4fe68453..3fc7b4501b 100644 --- a/tika-server/tika-server-standard/src/main/java/org/apache/tika/server/standard/resource/XMPMetadataResource.java +++ b/tika-server/tika-server-standard/src/main/java/org/apache/tika/server/standard/resource/XMPMetadataResource.java @@ -34,10 +34,15 @@ import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.server.core.resource.MetadataResource; +import org.apache.tika.server.core.resource.TikaResource; import org.apache.tika.server.core.resource.TikaServerResource; public class XMPMetadataResource extends MetadataResource implements TikaServerResource { + public XMPMetadataResource(TikaResource tikaResource) { + super(tikaResource); + } + @PUT @Path("{field}") @Produces({"application/rdf+xml"}) diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java index 2109f0af75..cf2ebc0a1f 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java @@ -46,7 +46,7 @@ public class DetectorResourceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(DetectorResource.class); - sf.setResourceProvider(DetectorResource.class, new SingletonResourceProvider(new DetectorResource(new ServerStatus()))); + sf.setResourceProvider(DetectorResource.class, new SingletonResourceProvider(new DetectorResource(new ServerStatus(), tikaResource))); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java index 4eb13e5f83..4e2af3c6c5 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java @@ -49,7 +49,7 @@ public class JsonMaxFieldLengthTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaResource.class); - sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(new TikaResource())); + sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(tikaResource)); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java index 863a7735ac..6e205486ee 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java @@ -66,8 +66,8 @@ public class MetadataResourceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(MetadataResource.class, XMPMetadataResource.class); - sf.setResourceProvider(MetadataResource.class, new SingletonResourceProvider(new MetadataResource())); - sf.setResourceProvider(XMPMetadataResource.class, new SingletonResourceProvider(new XMPMetadataResource())); + sf.setResourceProvider(MetadataResource.class, new SingletonResourceProvider(new MetadataResource(tikaResource))); + sf.setResourceProvider(XMPMetadataResource.class, new SingletonResourceProvider(new XMPMetadataResource(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OpenNLPMetadataFilterTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OpenNLPMetadataFilterTest.java index cad8a260ab..e11fa79013 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OpenNLPMetadataFilterTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OpenNLPMetadataFilterTest.java @@ -51,8 +51,8 @@ public class OpenNLPMetadataFilterTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(RecursiveMetadataResource.class, TikaResource.class); - sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource())); - sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(new TikaResource())); + sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource))); + sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(tikaResource)); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OptimaizeMetadataFilterTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OptimaizeMetadataFilterTest.java index 327af86f51..ab4502e42e 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OptimaizeMetadataFilterTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/OptimaizeMetadataFilterTest.java @@ -51,8 +51,8 @@ public class OptimaizeMetadataFilterTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(RecursiveMetadataResource.class, TikaResource.class); - sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource())); - sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(new TikaResource())); + sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource))); + sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(tikaResource)); } diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataFilterTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataFilterTest.java index d200fa88a8..53f41b04a1 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataFilterTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataFilterTest.java @@ -56,7 +56,7 @@ public class RecursiveMetadataFilterTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(RecursiveMetadataResource.class); - sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource())); + sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataResourceTest.java index a7610581b0..21efbd7300 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/RecursiveMetadataResourceTest.java @@ -71,7 +71,7 @@ public class RecursiveMetadataResourceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(RecursiveMetadataResource.class); - sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource())); + sf.setResourceProvider(RecursiveMetadataResource.class, new SingletonResourceProvider(new RecursiveMetadataResource(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaDetectorsTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaDetectorsTest.java index ae76831340..fd2543a51b 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaDetectorsTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaDetectorsTest.java @@ -43,7 +43,7 @@ public class TikaDetectorsTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaDetectors.class); - sf.setResourceProvider(TikaDetectors.class, new SingletonResourceProvider(new TikaDetectors())); + sf.setResourceProvider(TikaDetectors.class, new SingletonResourceProvider(new TikaDetectors(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaMimeTypesTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaMimeTypesTest.java index b21134365c..cd4578561b 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaMimeTypesTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaMimeTypesTest.java @@ -42,7 +42,7 @@ public class TikaMimeTypesTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaMimeTypes.class); - sf.setResourceProvider(TikaMimeTypes.class, new SingletonResourceProvider(new TikaMimeTypes())); + sf.setResourceProvider(TikaMimeTypes.class, new SingletonResourceProvider(new TikaMimeTypes(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaParsersTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaParsersTest.java index e437aa4823..590ea03263 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaParsersTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaParsersTest.java @@ -44,7 +44,7 @@ public class TikaParsersTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaParsers.class); - sf.setResourceProvider(TikaParsers.class, new SingletonResourceProvider(new TikaParsers())); + sf.setResourceProvider(TikaParsers.class, new SingletonResourceProvider(new TikaParsers(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java index ca30d36833..8c2d954bf9 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java @@ -75,7 +75,7 @@ public class TikaResourceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(TikaResource.class); - sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(new TikaResource())); + sf.setResourceProvider(TikaResource.class, new SingletonResourceProvider(tikaResource)); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java index 4f6f73175f..59e13a302e 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java @@ -58,7 +58,7 @@ public class UnpackerResourceConfigDisabledTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(UnpackerResource.class); - sf.setResourceProvider(UnpackerResource.class, new SingletonResourceProvider(new UnpackerResource())); + sf.setResourceProvider(UnpackerResource.class, new SingletonResourceProvider(new UnpackerResource(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java index 56eb711c47..2620d84465 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java @@ -106,7 +106,7 @@ public class UnpackerResourceTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(UnpackerResource.class); - sf.setResourceProvider(UnpackerResource.class, new SingletonResourceProvider(new UnpackerResource())); + sf.setResourceProvider(UnpackerResource.class, new SingletonResourceProvider(new UnpackerResource(tikaResource))); } @Override diff --git a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java index d72ece4158..92e28a6730 100644 --- a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java +++ b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java @@ -80,7 +80,7 @@ public class UnpackerResourceWithConfigTest extends CXFTestBase { @Override protected void setUpResources(JAXRSServerFactoryBean sf) { sf.setResourceClasses(UnpackerResource.class); - sf.setResourceProvider(UnpackerResource.class, new SingletonResourceProvider(new UnpackerResource())); + sf.setResourceProvider(UnpackerResource.class, new SingletonResourceProvider(new UnpackerResource(tikaResource))); } @Override
