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}.
*