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

rec pushed a commit to branch 
feature/UIMA-6232-Reduce-overhead-of-createTypeSystemDescription-and-friends
in repository https://gitbox.apache.org/repos/asf/uima-uimafit.git

commit 506fe81aed1b6f77bec200d0bbab7d13020fb107
Merge: a444822 d92a61b
Author: Richard Eckart de Castilho <r...@apache.org>
AuthorDate: Fri May 15 11:53:46 2020 +0200

    [UIMA-6232] Reduce overhead of createTypeSystemDescription() and friends
    
    * Update branch for merging into master
    
    Merge branch 'master' into 
feature/UIMA-6232-Reduce-overhead-of-createTypeSystemDescription-and-friends
    
    * master: (124 commits)
      [maven-release-plugin] prepare for next development iteration
      [maven-release-plugin] prepare release uimafit-3.1.0
      [maven-release-plugin] prepare for next development iteration
      [maven-release-plugin] prepare release uimafit-3.1.0
      [NO JIRA] Adjust UIMA version in the NOTICE file of the binary 
distribution
      [maven-release-plugin] prepare for next development iteration
      [maven-release-plugin] prepare release uimafit-3.1.0
      [NO JIRA] Update documentation to changed API in ExternalResourceFactory 
and removed a spurious character
      [NO JIRA] Adjusted comparison version for API change report
      [NO JIRA] Updated README file for release.
      [NO JIRA] Updated README file for release.
      [UIMA-6214] Method signature class in ExternalResourceFactory
      Update an Eclipse metadata file.
      [UIMA-5847] Remove UV3 bug workarounds in FSCollectionFactory
      [UIMA-6216] Upgrade to UIMA Core 3.1.1
      [NO JIRA] Fix NOTICE file
      No issue. Make japicmp pick up the right post-analysis file.
      No issue. Set version to 3.1.0-SNAPSHOT
      [UIMA-6181]b Fix complaints about maven-plugin-plugin in Eclipse
      [No Issue] Minor improvement of unit test illustrating error when binding 
resources to aggregates with nested dependent AEs.
      ...
    
    # Conflicts:
    #   
uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
    #   
uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java
    #   
uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java

 CONTRIBUTING.md                                    |   3 +-
 README                                             |  36 +-
 api-change-report.html                             |  13 +-
 pom.xml                                            |  52 +-
 src/main/assembly/bin.xml                          |  28 +-
 src/main/dist-bin/LICENSE                          |   2 +-
 src/main/dist-bin/NOTICE                           |  16 +-
 uimafit-benchmark/pom.xml                          |  23 +-
 .../org/apache/uima/fit/benchmark/Benchmark.java   |   2 +-
 .../uima/fit/benchmark/RunnableWithExceptions.java |   4 +-
 .../uima/fit/benchmark/CasUtilBenchmark.java       |  33 ++
 .../uima/fit/benchmark/JCasUtilBenchmark.java      |  27 +
 .../src/test/resources/simplelogger.properties     |   1 +
 uimafit-core/NOTICE                                |   4 +
 uimafit-core/pom.xml                               |  56 +-
 .../uima/fit/component/CasAnnotator_ImplBase.java  |  15 -
 .../component/CasCollectionReader_ImplBase.java    |  12 +-
 .../uima/fit/component/CasConsumer_ImplBase.java   |  15 -
 .../fit/component/CasFlowController_ImplBase.java  |  15 -
 .../uima/fit/component/CasMultiplier_ImplBase.java |  15 -
 .../uima/fit/component/ExternalResourceAware.java  |   8 +-
 .../uima/fit/component/JCasAnnotator_ImplBase.java |  15 -
 .../component/JCasCollectionReader_ImplBase.java   |  13 +-
 .../uima/fit/component/JCasConsumer_ImplBase.java  |  15 -
 .../fit/component/JCasFlowController_ImplBase.java |  15 -
 .../fit/component/JCasMultiplier_ImplBase.java     |  15 -
 .../uima/fit/component/Resource_ImplBase.java      |  14 +-
 .../uima/fit/factory/AnalysisEngineFactory.java    |  10 +-
 .../org/apache/uima/fit/factory/CasFactory.java    |  34 +-
 .../uima/fit/factory/CollectionReaderFactory.java  |  50 +-
 .../fit/factory/ConfigurationParameterFactory.java |  13 +-
 .../uima/fit/factory/ExternalResourceFactory.java  | 371 ++++++++----
 .../uima/fit/factory/FlowControllerFactory.java    |  10 +-
 .../apache/uima/fit/factory/FsIndexFactory.java    |  10 +-
 .../org/apache/uima/fit/factory/JCasFactory.java   |  49 +-
 .../uima/fit/factory/TypePrioritiesFactory.java    |  19 +-
 .../fit/factory/TypeSystemDescriptionFactory.java  |  11 +-
 .../apache/uima/fit/internal/ExtendedLogger.java   | 450 ---------------
 .../org/apache/uima/fit/internal/MetaDataUtil.java |   2 +-
 .../uima/fit/internal/ResourceManagerFactory.java  |  60 +-
 .../apache/uima/fit/pipeline/SimplePipeline.java   |  47 +-
 .../uima/fit/testing/factory/TokenBuilder.java     |   1 -
 .../java/org/apache/uima/fit/util/CasUtil.java     |  75 ++-
 .../apache/uima/fit/util/FSCollectionFactory.java  | 322 +++++++----
 .../main/java/org/apache/uima/fit/util/FSUtil.java |  53 +-
 .../java/org/apache/uima/fit/util/JCasUtil.java    |  15 +-
 .../ConfigurationParameterInitializerTest.java     |   2 +-
 .../AnalysisEngineFactoryExternalResourceTest.java |  61 +-
 ...ollectionReaderFactoryExternalResourceTest.java |   7 +-
 .../factory/ExternalResourceConfiguratorTest.java  |   4 +-
 .../fit/factory/ExternalResourceFactoryTest.java   | 173 ++++--
 .../FlowControllerFactoryExternalResourceTest.java |   5 +-
 .../org/apache/uima/fit/factory/LoggingTest.java   | 375 -------------
 .../fit/factory/TypePrioritiesFactoryTest.java     |  30 +-
 .../apache/uima/fit/pipeline/JCasIterableTest.java |  10 +-
 .../uima/fit/pipeline/SimplePipelineTest.java      |   6 +-
 .../uima/fit/util/FSCollectionFactoryTest.java     |  76 ++-
 .../java/org/apache/uima/fit/util/FSUtilTest.java  |  27 +-
 .../org/apache/uima/fit/util/JCasUtilTest.java     |  17 +-
 .../{JCasUtilTest.java => JCasUtilv3Test.java}     | 385 +++++++------
 .../resources/data/reference/JCasBuilderTest.dump  |  22 +-
 .../test/resources/data/reference/test.xmi.dump    |  28 +-
 uimafit-core/src/test/resources/log4j.properties   |   5 -
 .../src/test/resources/simplelogger.properties     |   1 +
 .../.settings/org.eclipse.core.resources.prefs     |   1 +
 uimafit-cpe/pom.xml                                |  82 +--
 .../java/org/apache/uima/fit/cpe/CpePipeline.java  |  27 +-
 .../uima/fit/cpe/ExternalResourceFactoryTest.java  |  30 +-
 .../src/test/resources/simplelogger.properties     |   1 +
 uimafit-docbook/pom.xml                            |  58 +-
 .../tools.uimafit.configurationparameters.xml      |   2 +-
 .../docbook/tools.uimafit.externalresources.xml    |   2 +-
 .../src/docbook/tools.uimafit.migration.xml        | 171 ++++--
 uimafit-examples/NOTICE                            |   3 +
 uimafit-examples/pom.xml                           | 267 ++++-----
 .../examples/resource/ExternalResourceExample.java |   7 +-
 .../resource/ExternalResourceExample2.java         |   7 +-
 .../resource/ExternalResourceExample3.java         |   6 +-
 .../examples/tutorial/ex2/RoomNumberAnnotator.java |   3 +-
 .../tutorial/ex6/UimaAcronymAnnotator.java         |   8 +-
 .../tutorial/ex6/UimaMeetingAnnotator.java         |   8 +-
 .../src/main/resources/simplelogger.properties     |   1 +
 .../fit/examples/tutorial/ex6/Example6Test.java    |   8 +-
 .../.settings/org.eclipse.jdt.core.prefs           | 288 ----------
 .../.settings/org.eclipse.jdt.ui.prefs             |   3 -
 uimafit-legacy-support/NOTICE                      |   8 -
 ...marker-file-identifying-api-compatibility-check |   1 -
 uimafit-legacy-support/pom.xml                     | 144 -----
 .../uima/fit/legacy/AnnotationConverter.java       |  44 --
 .../uima/fit/legacy/LegacySupportPluginImpl.java   | 158 ------
 .../fit/legacy/converter/AnnotationLiteral.java    | 277 ---------
 .../converter/ConfigurationParameterConverter.java |  98 ----
 .../ContextlessAnnotationConverterBase.java        |  41 --
 .../converter/ExternalResourceConverter.java       |  92 ---
 .../converter/FsIndexCollectionConverter.java      |  67 ---
 .../fit/legacy/converter/FsIndexConverter.java     |  92 ---
 .../fit/legacy/converter/FsIndexKeyConverter.java  |  63 ---
 .../legacy/converter/NoConversionConverter.java    |  59 --
 .../converter/OperationalPropertiesConverter.java  |  67 ---
 .../legacy/converter/SofaCapabilityConverter.java  |  75 ---
 .../legacy/converter/TypeCapabilityConverter.java  |  75 ---
 .../org/apache/uima/fit/ComponentTestBase.java     |  89 ---
 .../uima/fit/component/CasDumpWriterTest.java      |  61 --
 .../JCasCollectionReader_ImplBaseTest.java         |  88 ---
 .../fit/component/ViewCreatorAnnotatorTest.java    | 182 ------
 .../fit/component/ViewTextCopierAnnotatorTest.java |  92 ---
 .../ConfigurationParameterInitializerTest.java     | 472 ----------------
 .../apache/uima/fit/data/CreateSampleXCASFile.java |  59 --
 .../apache/uima/fit/data/CreateSampleXMIFile.java  |  54 --
 .../uima/fit/descriptor/TypeCapabilityTest.java    |  57 --
 .../uima/fit/factory/AggregateBuilderTest.java     | 209 -------
 .../uima/fit/factory/AggregateWithReaderTest.java  | 198 -------
 .../AnalysisEngineFactoryExternalResourceTest.java | 404 --------------
 .../fit/factory/AnalysisEngineFactoryTest.java     | 467 ----------------
 .../uima/fit/factory/AnnotationFactoryTest.java    |  45 --
 ...ollectionReaderFactoryExternalResourceTest.java |  91 ---
 .../fit/factory/CollectionReaderFactoryTest.java   | 127 -----
 .../factory/ConfigurationParameterFactoryTest.java | 221 --------
 .../factory/ExternalResourceConfiguratorTest.java  |  82 ---
 .../fit/factory/ExternalResourceFactoryTest.java   | 411 --------------
 .../FlowControllerFactoryExternalResourceTest.java |  93 ---
 .../uima/fit/factory/FsIndexFactoryTest.java       | 132 -----
 .../apache/uima/fit/factory/JCasBuilderTest.java   |  73 ---
 .../apache/uima/fit/factory/JCasFactoryTest.java   |  71 ---
 .../org/apache/uima/fit/factory/LoggingTest.java   | 311 -----------
 .../ResourceCreationSpecifierFactoryTest.java      |  56 --
 .../uima/fit/factory/SofaMappingFactoryTest.java   |  40 --
 .../fit/factory/TypePrioritiesFactoryTest.java     |  47 --
 .../factory/TypeSystemDescriptionFactoryTest.java  |  48 --
 .../uima/fit/factory/UimaContextFactoryTest.java   |  70 ---
 .../initializable/InitializableFactoryTest.java    | 123 ----
 .../uima/fit/factory/testAes/Annotator1.java       |  50 --
 .../uima/fit/factory/testAes/Annotator2.java       |  63 ---
 .../uima/fit/factory/testAes/Annotator3.java       |  57 --
 .../uima/fit/factory/testAes/Annotator4.java       |  45 --
 .../apache/uima/fit/factory/testAes/FlowAE1.java   |  38 --
 .../apache/uima/fit/factory/testAes/FlowAE2.java   |  45 --
 .../apache/uima/fit/factory/testAes/FlowAE3.java   |  48 --
 .../uima/fit/factory/testAes/ParameterizedAE.java  | 409 --------------
 .../uima/fit/factory/testAes/ParameterizedAE2.java |  56 --
 .../testAes/ReversableTestFlowController.java      |  88 ---
 .../apache/uima/fit/factory/testAes/ViewNames.java |  38 --
 .../fit/factory/testCrs/SingleFileXReader.java     | 127 -----
 .../fit/factory/testCrs/SingleFileXReaderTest.java | 117 ----
 .../fit/factory/testRes/TestExternalResource.java  |  41 --
 .../factory/testRes/TestSharedResourceObject.java  |  48 --
 .../uima/fit/testing/factory/TokenBuilderTest.java | 242 --------
 .../java/org/apache/uima/fit/util/CasUtilTest.java | 188 -------
 .../apache/uima/fit/util/ContainmentIndexTest.java |  69 ---
 .../apache/uima/fit/util/DisableLoggingTest.java   | 106 ----
 .../uima/fit/util/FSCollectionFactoryTest.java     | 211 -------
 .../org/apache/uima/fit/util/HideOutputTest.java   |  72 ---
 .../org/apache/uima/fit/util/JCasIterableTest.java |  43 --
 .../org/apache/uima/fit/util/JCasUtilTest.java     | 621 ---------------------
 .../org/apache/uima/fit/util/LocaleUtilTest.java   |  64 ---
 .../apache/uima/fit/util/SimplePipelineTest.java   |  48 --
 .../org/apache/uima/fit/util/TypeSystemUtil.java   |  46 --
 .../resources/META-INF/org.uimafit/fsindexes.txt   |   1 -
 .../test/resources/META-INF/org.uimafit/types.txt  |   1 -
 .../resources/data/descriptor/DefaultValueAE1.xml  |  36 --
 .../resources/data/descriptor/DefaultValueAE2.xml  |  36 --
 .../src/test/resources/data/descriptor/README      |   3 -
 .../src/test/resources/data/docs/bad.xcas          |   1 -
 .../src/test/resources/data/docs/test.xcas         |   1 -
 .../src/test/resources/data/docs/test.xmi          |   1 -
 .../test/resources/data/docs/unix-newlines.txt.bin |   8 -
 .../resources/data/docs/windows-newlines.txt.bin   |   9 -
 .../resources/data/reference/JCasBuilderTest.dump  |  69 ---
 .../test/resources/data/reference/test.xmi.dump    |  92 ---
 .../apache/uima/fit/component/NoOpAnnotator.xml    |  48 --
 .../uima/fit/factory/testCrs/SingleFileXReader.xml |  60 --
 .../apache/uima/fit/index/AutoImportableIndex.xml  |  38 --
 .../org/apache/uima/fit/type/AnalyzedText.xml      |  39 --
 .../org/apache/uima/fit/type/Sentence.xml          |  32 --
 .../resources/org/apache/uima/fit/type/Token.xml   |  44 --
 uimafit-maven-plugin/pom.xml                       | 324 +++++------
 uimafit-maven-plugin/src/it/default/pom.xml        | 110 ++--
 .../org/apache/uima/fit/maven/EnhanceMojo.java     |   7 +-
 .../uima/fit/maven/GenerateDescriptorsMojo.java    |   2 +-
 .../java/org/apache/uima/fit/maven/util/Util.java  |   2 +-
 uimafit-parent/pom.xml                             | 135 +++--
 uimafit-spring/NOTICE                              |   3 +
 uimafit-spring/pom.xml                             | 111 ++--
 .../spring/SpringContextResourceManagerTest.java   |   4 +-
 .../src/test/resources/simplelogger.properties     |   1 +
 185 files changed, 2166 insertions(+), 12152 deletions(-)

diff --cc 
uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
index bfc7923,0b32eb1..a8fa976
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
@@@ -26,9 -26,7 +26,8 @@@ import static org.apache.uima.fit.inter
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
 +import java.util.WeakHashMap;
  
- import org.apache.commons.logging.LogFactory;
  import org.apache.uima.fit.descriptor.FsIndex;
  import org.apache.uima.fit.descriptor.FsIndexKey;
  import org.apache.uima.fit.internal.MetaDataType;
@@@ -43,7 -41,8 +42,9 @@@ import org.apache.uima.resource.metadat
  import org.apache.uima.resource.metadata.impl.Import_impl;
  import org.apache.uima.util.InvalidXMLException;
  import org.apache.uima.util.XMLInputSource;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
 +import org.springframework.util.ClassUtils;
  
  /**
   */
@@@ -259,29 -250,18 +262,28 @@@ public final class FsIndexFactory 
     *           if the index collection could not be assembled
     */
    public static FsIndexCollection createFsIndexCollection() throws 
ResourceInitializationException {
 -    List<FsIndexDescription> fsIndexList = new 
ArrayList<FsIndexDescription>();
 -    for (String location : scanIndexDescriptors()) {
 -      try {
 -        XMLInputSource xmlInput = new XMLInputSource(location);
 -        FsIndexCollection fsIdxCol = 
getXMLParser().parseFsIndexCollection(xmlInput);
 -        fsIdxCol.resolveImports();
 -        fsIndexList.addAll(asList(fsIdxCol.getFsIndexes()));
 -        LOG.debug("Detected index at [{}]", location);
 -      } catch (IOException e) {
 -        throw new ResourceInitializationException(e);
 -      } catch (InvalidXMLException e) {
 -        LOG.warn("[{}] is not a index descriptor file. Ignoring.", location, 
e);
 +    ClassLoader cl = ClassUtils.getDefaultClassLoader();
 +    FsIndexCollection aggFsIdxCol = fsIndexCollectionsByClassloader.get(cl);
 +    if (aggFsIdxCol == null) {
 +      synchronized (CREATE_LOCK) {
 +        List<FsIndexDescription> fsIndexList = new ArrayList<>();
 +        for (String location : scanIndexDescriptors()) {
 +          try {
 +            XMLInputSource xmlInput = new XMLInputSource(location);
 +            FsIndexCollection fsIdxCol = 
getXMLParser().parseFsIndexCollection(xmlInput);
 +            fsIdxCol.resolveImports();
 +            fsIndexList.addAll(asList(fsIdxCol.getFsIndexes()));
-             LogFactory.getLog(FsIndexFactory.class).debug("Detected index at 
[" + location + "]");
++            LOG.debug("Detected index at [{}]", location);
 +          } catch (IOException e) {
 +            throw new ResourceInitializationException(e);
 +          } catch (InvalidXMLException e) {
-             LogFactory.getLog(FsIndexFactory.class)
-                     .warn("[" + location + "] is not a index descriptor file. 
Ignoring.", e);
++            LOG.warn("[{}] is not a index descriptor file. Ignoring.", 
location, e);
 +          }
 +        }
 +
 +        aggFsIdxCol = createFsIndexCollection(
 +                fsIndexList.toArray(new 
FsIndexDescription[fsIndexList.size()]));
 +        fsIndexCollectionsByClassloader.put(cl, aggFsIdxCol);
        }
      }
  
diff --cc 
uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java
index 1759bc9,f75abf7..2073441
--- 
a/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java
+++ 
b/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java
@@@ -25,11 -25,10 +25,11 @@@ import static org.apache.uima.fit.util.
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
 +import java.util.WeakHashMap;
  
- import org.apache.commons.logging.LogFactory;
  import org.apache.uima.fit.internal.MetaDataType;
  import org.apache.uima.fit.internal.ResourceManagerFactory;
+ import org.apache.uima.jcas.cas.TOP;
  import org.apache.uima.resource.ResourceInitializationException;
  import org.apache.uima.resource.ResourceManager;
  import org.apache.uima.resource.metadata.TypePriorities;
@@@ -38,21 -37,15 +38,25 @@@ import org.apache.uima.resource.metadat
  import org.apache.uima.util.CasCreationUtils;
  import org.apache.uima.util.InvalidXMLException;
  import org.apache.uima.util.XMLInputSource;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
 +import org.springframework.util.ClassUtils;
  
  public final class TypePrioritiesFactory {
+   private static final Logger LOG = 
LoggerFactory.getLogger(TypePrioritiesFactory.class);
+     
    private static final Object SCAN_LOCK = new Object();
  
 -  private static String[] typePriorityDescriptorLocations;
 +  private static final Object CREATE_LOCK = new Object();
 +
 +  private static WeakHashMap<ClassLoader, String[]> 
typePrioritesLocationsByClassloader;
 +
 +  private static WeakHashMap<ClassLoader, TypePriorities> 
typePrioritiesByClassloader;
 +
 +  static {
 +    typePrioritesLocationsByClassloader = new WeakHashMap<>();
 +    typePrioritiesByClassloader = new WeakHashMap<>();
 +  }
  
    private TypePrioritiesFactory() {
      // This class is not meant to be instantiated
@@@ -105,30 -103,18 +114,28 @@@
     *           if the collected type priorities cannot be merged.
     */
    public static TypePriorities createTypePriorities() throws 
ResourceInitializationException {
 -    List<TypePriorities> typePrioritiesList = new ArrayList<TypePriorities>();
 -    for (String location : scanTypePrioritiesDescriptors()) {
 -      try {
 -        XMLInputSource xmlInput = new XMLInputSource(location);
 -        TypePriorities typePriorities = 
getXMLParser().parseTypePriorities(xmlInput);
 -        typePriorities.resolveImports();
 -        typePrioritiesList.add(typePriorities);
 -        LOG.debug("Detected type priorities at [{}]", location);
 -      } catch (IOException e) {
 -        throw new ResourceInitializationException(e);
 -      } catch (InvalidXMLException e) {
 -        LOG.warn("[{}] is not a type priorities descriptor file. Ignoring.", 
location, e);
 +    ClassLoader cl = ClassUtils.getDefaultClassLoader();
 +    TypePriorities aggTypePriorities = typePrioritiesByClassloader.get(cl);
 +    if (aggTypePriorities == null) {
 +      synchronized (CREATE_LOCK) {
 +        List<TypePriorities> typePrioritiesList = new ArrayList<>();
 +        for (String location : scanTypePrioritiesDescriptors()) {
 +          try {
 +            XMLInputSource xmlInput = new XMLInputSource(location);
 +            TypePriorities typePriorities = 
getXMLParser().parseTypePriorities(xmlInput);
 +            typePriorities.resolveImports();
 +            typePrioritiesList.add(typePriorities);
-             LogFactory.getLog(TypePrioritiesFactory.class)
-                     .debug("Detected type priorities at [" + location + "]");
++            LOG.debug("Detected type priorities at [{}]", location);
 +          } catch (IOException e) {
 +            throw new ResourceInitializationException(e);
 +          } catch (InvalidXMLException e) {
-             LogFactory.getLog(TypePrioritiesFactory.class).warn(
-                     "[" + location + "] is not a type priorities descriptor 
file. Ignoring.", e);
++            LOG.warn("[{}] is not a type priorities descriptor file. 
Ignoring.", location, e);
 +          }
 +        }
 +
 +        ResourceManager resMgr = ResourceManagerFactory.newResourceManager();
 +        aggTypePriorities = 
CasCreationUtils.mergeTypePriorities(typePrioritiesList, resMgr);
 +        typePrioritiesByClassloader.put(cl, aggTypePriorities);
        }
      }
  
diff --cc 
uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
index ab3e9f8,a0a2f98..dc05a40
--- 
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,9 -25,7 +25,8 @@@ import static org.apache.uima.util.CasC
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
 +import java.util.WeakHashMap;
  
- import org.apache.commons.logging.LogFactory;
  import org.apache.uima.fit.internal.MetaDataType;
  import org.apache.uima.fit.internal.ResourceManagerFactory;
  import org.apache.uima.resource.ResourceInitializationException;
@@@ -38,21 -36,15 +37,25 @@@ import org.apache.uima.resource.metadat
  import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
  import org.apache.uima.util.InvalidXMLException;
  import org.apache.uima.util.XMLInputSource;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
 +import org.springframework.util.ClassUtils;
  
  public final class TypeSystemDescriptionFactory {
+   private static final Logger LOG = 
LoggerFactory.getLogger(TypeSystemDescriptionFactory.class);
+   
    private static final Object SCAN_LOCK = new Object();
  
 -  private static String[] typeDescriptorLocations;
 +  private static final Object CREATE_LOCK = new Object();
 +
 +  private static WeakHashMap<ClassLoader, String[]> 
typeDescriptorLocationsByClassloader;
 +
 +  private static WeakHashMap<ClassLoader, TypeSystemDescription> 
typeDescriptorByClassloader;
 +
 +  static {
 +    typeDescriptorLocationsByClassloader = new WeakHashMap<>();
 +    typeDescriptorByClassloader = new WeakHashMap<>();
 +  }
  
    private TypeSystemDescriptionFactory() {
      // This class is not meant to be instantiated
@@@ -110,31 -101,21 +113,29 @@@
     */
    public static TypeSystemDescription createTypeSystemDescription()
            throws ResourceInitializationException {
 -    List<TypeSystemDescription> tsdList = new 
ArrayList<TypeSystemDescription>();
 -    for (String location : scanTypeDescriptors()) {
 -      try {
 -        XMLInputSource xmlInputType1 = new XMLInputSource(location);
 -        tsdList.add(getXMLParser().parseTypeSystemDescription(xmlInputType1));
 -        LOG.debug("Detected type system at [{}]", location);
 -      } catch (IOException e) {
 -        throw new ResourceInitializationException(e);
 -      } catch (InvalidXMLException e) {
 -        LOG.warn("[{}] is not a type file. Ignoring.", location, e);
 +    ClassLoader cl = ClassUtils.getDefaultClassLoader();
 +    TypeSystemDescription tsd = typeDescriptorByClassloader.get(cl);
 +    if (tsd == null) {
 +      synchronized (CREATE_LOCK) {
 +        List<TypeSystemDescription> tsdList = new ArrayList<>();
 +        for (String location : scanTypeDescriptors()) {
 +          try {
 +            XMLInputSource xmlInputType1 = new XMLInputSource(location);
 +            
tsdList.add(getXMLParser().parseTypeSystemDescription(xmlInputType1));
-             LogFactory.getLog(TypeSystemDescription.class)
-                 .debug("Detected type system at [" + location + "]");
++            LOG.debug("Detected type system at [{}]", location);
 +          } catch (IOException e) {
 +            throw new ResourceInitializationException(e);
 +          } catch (InvalidXMLException e) {
-             LogFactory.getLog(TypeSystemDescription.class)
-                 .warn("[" + location + "] is not a type file. Ignoring.", e);
++            LOG.warn("[{}] is not a type file. Ignoring.", location, e);
 +          }
 +        }
 +
 +        ResourceManager resMgr = ResourceManagerFactory.newResourceManager();
 +        tsd = mergeTypeSystems(tsdList, resMgr);
 +        typeDescriptorByClassloader.put(cl, tsd);
        }
      }
 -
 -    ResourceManager resMgr = ResourceManagerFactory.newResourceManager();
 -    return mergeTypeSystems(tsdList, resMgr);
 +    return (TypeSystemDescription) tsd.clone();
    }
  
    /**
diff --cc 
uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java
index c616d84,797eae8..8cda479
--- 
a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java
+++ 
b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java
@@@ -23,9 -23,8 +23,9 @@@ import java.io.FileOutputStream
  import java.io.IOException;
  import java.io.OutputStream;
  import java.lang.reflect.Modifier;
 +
  import org.apache.commons.io.IOUtils;
- import org.apache.commons.lang.exception.ExceptionUtils;
+ import org.apache.commons.lang3.exception.ExceptionUtils;
  import org.apache.maven.plugin.AbstractMojo;
  import org.apache.maven.plugin.MojoExecutionException;
  import org.apache.maven.plugins.annotations.Component;

Reply via email to