This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new 9b211c5e11 TIKA-4700 -- this adds a few more components to the 
activator and service loader for osgi. (#2751)
9b211c5e11 is described below

commit 9b211c5e110782357e5b0b84ceda274c7e1919ac
Author: Tim Allison <[email protected]>
AuthorDate: Thu Apr 9 07:37:01 2026 -0400

    TIKA-4700 -- this adds a few more components to the activator and service 
loader for osgi. (#2751)
---
 .../java/org/apache/tika/config/ServiceLoader.java | 10 ++++---
 .../java/org/apache/tika/config/TikaActivator.java | 31 +++++++++++++++-------
 2 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/tika-core/src/main/java/org/apache/tika/config/ServiceLoader.java 
b/tika-core/src/main/java/org/apache/tika/config/ServiceLoader.java
index 86cdd97711..ad2c616f0a 100644
--- a/tika-core/src/main/java/org/apache/tika/config/ServiceLoader.java
+++ b/tika-core/src/main/java/org/apache/tika/config/ServiceLoader.java
@@ -37,22 +37,26 @@ import java.util.regex.Pattern;
 import aQute.bnd.annotation.spi.ServiceConsumer;
 
 import org.apache.tika.detect.Detector;
+import org.apache.tika.detect.EncodingDetector;
 import org.apache.tika.exception.TikaConfigException;
+import org.apache.tika.language.detect.LanguageDetector;
+import org.apache.tika.metadata.filter.MetadataFilter;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.utils.ServiceLoaderUtils;
 
 /**
  * Internal utility class that Tika uses to look up service providers.
  * Supports both static service loading using the {@link ServiceLoader} 
mechanism (and via
- * <a 
href="https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html";>OSGi
 Service Loader Mediator</a>) 
+ * <a 
href="https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html";>OSGi
 Service Loader Mediator</a>)
  * as well as dynamic loading via OSGi service tracking (from the {@link 
TikaActivator} class).
- * However the Tika parsers don't register as regular OSGi services, 
- * so the dynamic loading is only used for detectors and parser services from 
non-Tika bundles.
  *
  * @since Apache Tika 0.9
  */
 @ServiceConsumer(Parser.class)
 @ServiceConsumer(Detector.class)
+@ServiceConsumer(EncodingDetector.class)
+@ServiceConsumer(LanguageDetector.class)
+@ServiceConsumer(MetadataFilter.class)
 public class ServiceLoader {
 
     /**
diff --git a/tika-core/src/main/java/org/apache/tika/config/TikaActivator.java 
b/tika-core/src/main/java/org/apache/tika/config/TikaActivator.java
index e076f1c2dd..271a1683fb 100644
--- a/tika-core/src/main/java/org/apache/tika/config/TikaActivator.java
+++ b/tika-core/src/main/java/org/apache/tika/config/TikaActivator.java
@@ -16,6 +16,9 @@
  */
 package org.apache.tika.config;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -24,6 +27,9 @@ import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
 import org.apache.tika.detect.Detector;
+import org.apache.tika.detect.EncodingDetector;
+import org.apache.tika.language.detect.LanguageDetector;
+import org.apache.tika.metadata.filter.MetadataFilter;
 import org.apache.tika.parser.Parser;
 
 /**
@@ -39,26 +45,31 @@ import org.apache.tika.parser.Parser;
  */
 public class TikaActivator implements BundleActivator, 
ServiceTrackerCustomizer {
 
-    private ServiceTracker detectorTracker;
-
-    private ServiceTracker parserTracker;
+    private final List<ServiceTracker> trackers = new ArrayList<>();
 
     private BundleContext bundleContext;
-    //-----------------------------------------------------< BundleActivator >
 
     public void start(final BundleContext context) throws Exception {
         bundleContext = context;
 
-        detectorTracker = new ServiceTracker(context, 
Detector.class.getName(), this);
-        parserTracker = new ServiceTracker(context, Parser.class.getName(), 
this);
+        trackService(context, Detector.class);
+        trackService(context, Parser.class);
+        trackService(context, EncodingDetector.class);
+        trackService(context, LanguageDetector.class);
+        trackService(context, MetadataFilter.class);
+    }
 
-        detectorTracker.open();
-        parserTracker.open();
+    private void trackService(BundleContext context, Class<?> iface) {
+        ServiceTracker tracker = new ServiceTracker(context, iface.getName(), 
this);
+        trackers.add(tracker);
+        tracker.open();
     }
 
     public void stop(BundleContext context) throws Exception {
-        parserTracker.close();
-        detectorTracker.close();
+        for (ServiceTracker tracker : trackers) {
+            tracker.close();
+        }
+        trackers.clear();
     }
 
     public Object addingService(ServiceReference reference) {

Reply via email to