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 <[email protected]> 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>
