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>