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/08/26 13:28:53 UTC

[uima-uimaj] 01/01: #245 - Utility method for loading type systems in SPI providers

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

rec pushed a commit to branch feature/245-Utility-method-for-loading-type-systems-in-SPI-providers
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git

commit f3b0e300c159952c79756223a3d17dc9bde3aa4e
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Fri Aug 26 15:28:45 2022 +0200

    #245 - Utility method for loading type systems in SPI providers
    
    - Added utility method
---
 .../java/org/apache/uima/util/TypeSystemUtil.java  | 61 ++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/uimaj-core/src/main/java/org/apache/uima/util/TypeSystemUtil.java b/uimaj-core/src/main/java/org/apache/uima/util/TypeSystemUtil.java
index 302daaed2..0879e0452 100644
--- a/uimaj-core/src/main/java/org/apache/uima/util/TypeSystemUtil.java
+++ b/uimaj-core/src/main/java/org/apache/uima/util/TypeSystemUtil.java
@@ -19,6 +19,8 @@
 
 package org.apache.uima.util;
 
+import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -30,13 +32,72 @@ import org.apache.uima.cas.Feature;
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.TypeSystem;
 import org.apache.uima.cas.impl.LowLevelTypeSystem;
+import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.impl.ResourceManager_impl;
 import org.apache.uima.resource.metadata.AllowedValue;
 import org.apache.uima.resource.metadata.FeatureDescription;
 import org.apache.uima.resource.metadata.TypeDescription;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.spi.TypeSystemDescriptionProvider;
 
 public class TypeSystemUtil {
 
+  /**
+   * Loads type system descriptions and resolves their imports. For example when you place a
+   * {@link TypeSystemDescriptionProvider} implementation and place the type system descriptions it
+   * should provide in the same package, you can use this method to conveniently load them simply by
+   * name in the provider implementation.
+   * 
+   * <pre>
+   * public class MyTypeSystemDescriptionProvider implements TypeSystemDescriptionProvider {
+   *   {@code @Override}
+   *   public List<TypeSystemDescription> listTypeSystemDescriptions() {
+   *     return TypeSystemUtil.loadTypeSystemDescriptionsFromClasspath(this, "TypeSystem1.xml",
+   *             "TypeSystem2.xml");
+   *   }
+   * }
+   * </pre>
+   * 
+   * 
+   * @param aContext
+   *          a context class. If the locations are not absolute, then they are looked up relative
+   *          to this context class as per {@link Class#getResource(String)}.
+   * @param typeSystemDescriptionLocations
+   *          type system description locations to load.
+   * @return list of the loaded and resolved descriptions.
+   */
+  public static List<TypeSystemDescription> loadTypeSystemDescriptionsFromClasspath(
+          Class<?> aContext, String... typeSystemDescriptionLocations) {
+
+    ResourceManager resMgr = new ResourceManager_impl(aContext.getClassLoader());
+    try {
+      List<TypeSystemDescription> typeSystemDescriptions = new ArrayList<>();
+
+      for (String typeSystem : typeSystemDescriptionLocations) {
+        URL resource = aContext.getResource(typeSystem);
+        if (resource == null) {
+          UIMAFramework.getLogger()
+                  .error("Unable to locate type system description as a resource [{}]", typeSystem);
+          continue;
+        }
+
+        try {
+          TypeSystemDescription tsd = UIMAFramework.getXMLParser()
+                  .parseTypeSystemDescription(new XMLInputSource(resource));
+          tsd.resolveImports(resMgr);
+          typeSystemDescriptions.add(tsd);
+        } catch (InvalidXMLException | IOException e) {
+          UIMAFramework.getLogger().error("Error loading type system description [{}] from [{}]",
+                  typeSystem, resource, e);
+        }
+      }
+
+      return typeSystemDescriptions;
+    } finally {
+      resMgr.destroy();
+    }
+  }
+
   /**
    * Convert a {@link TypeSystem} to an equivalent {@link TypeSystemDescription}.
    *