You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2022/07/28 12:31:24 UTC

[uima-uimafit] 01/01: #195 - Detect descriptors via SPI

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

rec pushed a commit to branch feature/195-Detect-descriptors-via-SPI
in repository https://gitbox.apache.org/repos/asf/uima-uimafit.git

commit 81f5454e281975cef6965225bd793090c6934def
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Thu Jul 28 14:29:47 2022 +0200

    #195 - Detect descriptors via SPI
    
    - Add ability to pick up type system descriptors via SPI
---
 .../uima/fit/factory/TypeSystemDescriptionFactory.java | 18 ++++++++++++++++++
 uimafit-parent/pom.xml                                 |  2 +-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
index a91d9a3..b13bd35 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
@@ -25,6 +25,7 @@ import static org.apache.uima.util.CasCreationUtils.mergeTypeSystems;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.ServiceLoader;
 import java.util.WeakHashMap;
 
 import org.apache.uima.fit.internal.ClassLoaderUtils;
@@ -36,12 +37,14 @@ import org.apache.uima.resource.metadata.Import;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 import org.apache.uima.resource.metadata.impl.Import_impl;
 import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
+import org.apache.uima.spi.TypeSystemDescriptionProvider;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.XMLInputSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class TypeSystemDescriptionFactory {
+
   private static final Logger LOG = LoggerFactory.getLogger(TypeSystemDescriptionFactory.class);
 
   private static final Object SCAN_LOCK = new Object();
@@ -58,6 +61,7 @@ public final class TypeSystemDescriptionFactory {
   }
 
   private TypeSystemDescriptionFactory() {
+
     // This class is not meant to be instantiated
   }
 
@@ -69,6 +73,7 @@ public final class TypeSystemDescriptionFactory {
    * @return A TypeSystemDescription that includes the types from all of the specified files.
    */
   public static TypeSystemDescription createTypeSystemDescription(String... descriptorNames) {
+
     TypeSystemDescription typeSystem = new TypeSystemDescription_impl();
     List<Import> imports = new ArrayList<>();
     for (String descriptorName : descriptorNames) {
@@ -90,6 +95,7 @@ public final class TypeSystemDescriptionFactory {
    */
   public static TypeSystemDescription createTypeSystemDescriptionFromPath(
           String... descriptorURIs) {
+
     TypeSystemDescription typeSystem = new TypeSystemDescription_impl();
     List<Import> imports = new ArrayList<>();
     for (String descriptorURI : descriptorURIs) {
@@ -113,6 +119,7 @@ public final class TypeSystemDescriptionFactory {
    */
   public static TypeSystemDescription createTypeSystemDescription()
           throws ResourceInitializationException {
+
     ClassLoader cl = ClassLoaderUtils.findClassloader();
     TypeSystemDescription tsd = typeDescriptorByClassloader.get(cl);
     if (tsd == null) {
@@ -130,6 +137,15 @@ public final class TypeSystemDescriptionFactory {
           }
         }
 
+        ServiceLoader<TypeSystemDescriptionProvider> loader = ServiceLoader
+                .load(TypeSystemDescriptionProvider.class);
+        loader.forEach(tsdp -> {
+          for (TypeSystemDescription _tsd : tsdp.listTypeSystemDescriptions()) {
+            tsdList.add(_tsd);
+            LOG.debug("Loaded SPI-provided type system at [{}]", _tsd.getSourceUrlString());
+          }
+        });
+
         LOG.trace("Merging type systems and resolving imports...");
         ResourceManager resMgr = ResourceManagerFactory.newResourceManager();
         tsd = mergeTypeSystems(tsdList, resMgr);
@@ -149,6 +165,7 @@ public final class TypeSystemDescriptionFactory {
    *           if the locations could not be resolved.
    */
   public static String[] scanTypeDescriptors() throws ResourceInitializationException {
+
     synchronized (SCAN_LOCK) {
       ClassLoader cl = ClassLoaderUtils.findClassloader();
       String[] typeDescriptorLocations = typeDescriptorLocationsByClassloader.get(cl);
@@ -165,6 +182,7 @@ public final class TypeSystemDescriptionFactory {
    * all auto-import locations.
    */
   public static void forceTypeDescriptorsScan() {
+
     synchronized (SCAN_LOCK) {
       typeDescriptorLocationsByClassloader.clear();
       typeDescriptorByClassloader.clear();
diff --git a/uimafit-parent/pom.xml b/uimafit-parent/pom.xml
index 30fe106..843345a 100644
--- a/uimafit-parent/pom.xml
+++ b/uimafit-parent/pom.xml
@@ -52,7 +52,7 @@
     <mockito-version>4.4.0</mockito-version>
     <spring-version>5.3.20</spring-version>
     <slf4j-version>1.7.36</slf4j-version>
-    <uima-version>3.3.0</uima-version>
+    <uima-version>3.4.0-SNAPSHOT</uima-version>
     <xmlunit-version>2.9.0</xmlunit-version>
   </properties>