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

Reply via email to