You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2018/06/29 21:47:31 UTC

svn commit: r1834705 - in /uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima: analysis_engine/asb/impl/ analysis_engine/impl/ collection/impl/ flow/impl/ impl/ internal/util/ resource/ resource/impl/

Author: schor
Date: Fri Jun 29 21:47:30 2018
New Revision: 1834705

URL: http://svn.apache.org/viewvc?rev=1834705&view=rev
Log:
[UIMA-5802] consolidate most class loading or setting extension class loader parents, include the Thread context class loader

Added:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Class_TCCL.java
Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowControllerContainer.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasConsumerDescription_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasInitializerDescription_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CollectionReaderDescription_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/flow/impl/FlowControllerDescription_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasConsumerFactory_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasInitializerFactory_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CollectionReaderFactory_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/ResourceManagerPearWrapper.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/ResourceManager_impl.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowControllerContainer.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowControllerContainer.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowControllerContainer.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/asb/impl/FlowControllerContainer.java Fri Jun 29 21:47:30 2018
@@ -41,6 +41,7 @@ import org.apache.uima.flow.FlowControll
 import org.apache.uima.flow.FlowControllerDescription;
 import org.apache.uima.flow.JCasFlow_ImplBase;
 import org.apache.uima.impl.Util;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.internal.util.JmxMBeanAgent;
 import org.apache.uima.resource.ConfigurableResource_ImplBase;
 import org.apache.uima.resource.ResourceConfigurationException;
@@ -315,16 +316,7 @@ public class FlowControllerContainer ext
     // load FlowController class
     Class<?> flowControllerClass = null;
     try {
-      // get UIMA extension ClassLoader if available
-      ClassLoader cl = getUimaContextAdmin().getResourceManager().getExtensionClassLoader();
-
-      if (cl != null) {
-        // use UIMA extension ClassLoader to load the class
-        flowControllerClass = cl.loadClass(flowControllerClassName);
-      } else {
-        // use application ClassLoader to load the class
-        flowControllerClass = Class.forName(flowControllerClassName);
-      }
+      flowControllerClass = Class_TCCL.forName(flowControllerClassName, getUimaContextAdmin().getResourceManager());
     } catch (ClassNotFoundException e) {
       throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND,
               new Object[] { flowControllerClassName, aDescriptor.getSourceUrlString() }, e);

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java Fri Jun 29 21:47:30 2018
@@ -42,6 +42,7 @@ import org.apache.uima.cas.TypeSystem;
 import org.apache.uima.cas.impl.CASImpl;
 import org.apache.uima.impl.UimaContext_ImplBase;
 import org.apache.uima.impl.Util;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.internal.util.UUIDGenerator;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.resource.ResourceConfigurationException;
@@ -208,16 +209,7 @@ public class PrimitiveAnalysisEngine_imp
     // load annotator class
     Class<?> annotatorClass = null;
     try {
-      // get UIMA extension ClassLoader if available
-      final ClassLoader cl = getUimaContextAdmin().getResourceManager().getExtensionClassLoader();
-
-      if (cl != null) {
-        // use UIMA extension ClassLoader to load the class
-        annotatorClass = cl.loadClass(annotatorClassName);
-      } else {
-        // use application ClassLoader to load the class
-        annotatorClass = Class.forName(annotatorClassName);
-      }
+      annotatorClass = Class_TCCL.forName(annotatorClassName, getUimaContextAdmin().getResourceManager());
     } catch (ClassNotFoundException e) {
       throw new ResourceInitializationException(
               ResourceInitializationException.ANNOTATOR_CLASS_NOT_FOUND, new Object[] {

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasConsumerDescription_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasConsumerDescription_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasConsumerDescription_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasConsumerDescription_impl.java Fri Jun 29 21:47:30 2018
@@ -26,6 +26,7 @@ import org.apache.uima.Constants;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.collection.CasConsumer;
 import org.apache.uima.collection.CasConsumerDescription;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.impl.ResourceCreationSpecifier_impl;
@@ -88,13 +89,8 @@ public class CasConsumerDescription_impl
     // try to load user class
     // ust UIMA extension ClassLoader if available
     Class<?> implClass;
-    ClassLoader cl = aResourceManager.getExtensionClassLoader();
     try {
-      if (cl != null) {
-        implClass = cl.loadClass(getImplementationName());
-      } else {
-        implClass = Class.forName(getImplementationName());
-      }
+      implClass = Class_TCCL.forName(getImplementationName(), aResourceManager);
     } catch (ClassNotFoundException e) {
       throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND,
               new Object[] { getImplementationName(), getSourceUrlString() }, e);

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasInitializerDescription_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasInitializerDescription_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasInitializerDescription_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CasInitializerDescription_impl.java Fri Jun 29 21:47:30 2018
@@ -26,6 +26,7 @@ import org.apache.uima.Constants;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.collection.CasInitializer;
 import org.apache.uima.collection.CasInitializerDescription;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.impl.ResourceCreationSpecifier_impl;
@@ -88,13 +89,13 @@ public class CasInitializerDescription_i
     // try to load user class
     // ust UIMA extension ClassLoader if available
     Class<?> implClass;
-    ClassLoader cl = aResourceManager.getExtensionClassLoader();
     try {
-      if (cl != null) {
-        implClass = cl.loadClass(getImplementationName());
-      } else {
-        implClass = Class.forName(getImplementationName());
-      }
+      implClass = Class_TCCL.forName(getImplementationName(), aResourceManager);
+//      if (cl != null) {
+//        implClass = cl.loadClass(getImplementationName());
+//      } else {
+//        implClass = Class.forName(getImplementationName());
+//      }
     } catch (ClassNotFoundException e) {
       throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND,
               new Object[] { getImplementationName(), getSourceUrlString() }, e);

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CollectionReaderDescription_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CollectionReaderDescription_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CollectionReaderDescription_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/collection/impl/CollectionReaderDescription_impl.java Fri Jun 29 21:47:30 2018
@@ -25,6 +25,7 @@ import org.apache.uima.Constants;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.collection.CollectionReader;
 import org.apache.uima.collection.CollectionReaderDescription;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.impl.ResourceCreationSpecifier_impl;
@@ -79,15 +80,10 @@ public class CollectionReaderDescription
               new Object[] { getSourceUrlString() });
     }
     // try to load user class
-    // ust UIMA extension ClassLoader if available
+    // use UIMA extension ClassLoader if available
     Class<?> implClass;
-    ClassLoader cl = aResourceManager.getExtensionClassLoader();
     try {
-      if (cl != null) {
-        implClass = cl.loadClass(getImplementationName());
-      } else {
-        implClass = Class.forName(getImplementationName());
-      }
+      implClass = Class_TCCL.forName(getImplementationName(), aResourceManager);
     } catch (ClassNotFoundException e) {
       throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND,
               new Object[] { getImplementationName(), getSourceUrlString() }, e);

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/flow/impl/FlowControllerDescription_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/flow/impl/FlowControllerDescription_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/flow/impl/FlowControllerDescription_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/flow/impl/FlowControllerDescription_impl.java Fri Jun 29 21:47:30 2018
@@ -23,6 +23,7 @@ import org.apache.uima.Constants;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.flow.FlowController;
 import org.apache.uima.flow.FlowControllerDescription;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.impl.ResourceCreationSpecifier_impl;
@@ -77,15 +78,10 @@ public class FlowControllerDescription_i
               new Object[] { getSourceUrlString() });
     }
     // try to load user class
-    // ust UIMA extension ClassLoader if available
+    // use UIMA extension ClassLoader if available
     Class<?> implClass;
-    ClassLoader cl = aResourceManager.getExtensionClassLoader();
     try {
-      if (cl != null) {
-        implClass = cl.loadClass(getImplementationName());
-      } else {
-        implClass = Class.forName(getImplementationName());
-      }
+      implClass = Class_TCCL.forName(getImplementationName(), aResourceManager);
     } catch (ClassNotFoundException e) {
       throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND,
               new Object[] { getImplementationName(), getSourceUrlString() }, e);

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasConsumerFactory_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasConsumerFactory_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasConsumerFactory_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasConsumerFactory_impl.java Fri Jun 29 21:47:30 2018
@@ -27,6 +27,7 @@ import org.apache.uima.analysis_engine.i
 import org.apache.uima.collection.CasConsumer;
 import org.apache.uima.collection.CasConsumerDescription;
 import org.apache.uima.collection.base_cpm.CasDataConsumer;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.Resource;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
@@ -65,21 +66,9 @@ public class CasConsumerFactory_impl imp
         }
 
         // load class using UIMA Extension ClassLoader if there is one
-        ClassLoader cl = null;
         Class<?> implClass = null;
-        ResourceManager resourceManager = null;
-        if (aAdditionalParams != null) {
-          resourceManager = (ResourceManager) aAdditionalParams
-                  .get(Resource.PARAM_RESOURCE_MANAGER);
-        }
-        if (resourceManager != null) {
-          cl = resourceManager.getExtensionClassLoader();
-        }
-        if (cl == null) {
-          cl = this.getClass().getClassLoader();
-        }
         try {
-          implClass = Class.forName(className, true, cl);
+          implClass = Class_TCCL.forName(className, aAdditionalParams);
         } catch (ClassNotFoundException e) {
           throw new ResourceInitializationException(
                   ResourceInitializationException.CLASS_NOT_FOUND, new Object[] { className,

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasInitializerFactory_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasInitializerFactory_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasInitializerFactory_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CasInitializerFactory_impl.java Fri Jun 29 21:47:30 2018
@@ -25,6 +25,7 @@ import org.apache.uima.ResourceFactory;
 import org.apache.uima.collection.CasInitializer;
 import org.apache.uima.collection.CasInitializerDescription;
 import org.apache.uima.collection.base_cpm.CasDataInitializer;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.Resource;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
@@ -49,20 +50,8 @@ public class CasInitializerFactory_impl
       String className = desc.getImplementationName();
 
       // load class using UIMA Extension ClassLoader if there is one
-      ClassLoader cl = null;
-      ResourceManager resourceManager = null;
-      if (aAdditionalParams != null) {
-        resourceManager = (ResourceManager) aAdditionalParams.get(Resource.PARAM_RESOURCE_MANAGER);
-      }
-      if (resourceManager != null) {
-        cl = resourceManager.getExtensionClassLoader();
-      }
-      if (cl == null) {
-        cl = this.getClass().getClassLoader();
-      }
-
       try {
-        Class<?> implClass = Class.forName(className, true, cl);
+        Class<?> implClass = Class_TCCL.forName(className, aAdditionalParams);
 
         // check to see if this is a subclass of BaseCollectionReader and of aResourceClass
         if (!CasInitializer.class.isAssignableFrom(implClass)

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CollectionReaderFactory_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CollectionReaderFactory_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CollectionReaderFactory_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CollectionReaderFactory_impl.java Fri Jun 29 21:47:30 2018
@@ -26,6 +26,7 @@ import org.apache.uima.ResourceFactory;
 import org.apache.uima.collection.CollectionReaderDescription;
 import org.apache.uima.collection.CollectionReader_ImplBase;
 import org.apache.uima.collection.base_cpm.BaseCollectionReader;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.Resource;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
@@ -69,20 +70,8 @@ public class CollectionReaderFactory_imp
       }
 
       // load class using UIMA Extension ClassLoader if there is one
-      ClassLoader cl = null;
-      ResourceManager resourceManager = null;
-      if (aAdditionalParams != null) {
-        resourceManager = (ResourceManager) aAdditionalParams.get(Resource.PARAM_RESOURCE_MANAGER);
-      }
-      if (resourceManager != null) {
-        cl = resourceManager.getExtensionClassLoader();
-      }
-      if (cl == null) {
-        cl = this.getClass().getClassLoader();
-      }
-
       try {
-        Class<?> implClass = Class.forName(className, true, cl);
+        Class<?> implClass = Class_TCCL.forName(className, aAdditionalParams);
 
         // check to see if this is a subclass of BaseCollectionReader and of aResourceClass
         if (!BaseCollectionReader.class.isAssignableFrom(implClass)) {

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/impl/CustomResourceFactory_impl.java Fri Jun 29 21:47:30 2018
@@ -22,6 +22,7 @@ package org.apache.uima.impl;
 import java.util.Map;
 
 import org.apache.uima.ResourceFactory;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.resource.CustomResourceSpecifier;
 import org.apache.uima.resource.Resource;
 import org.apache.uima.resource.ResourceInitializationException;
@@ -43,22 +44,10 @@ public class CustomResourceFactory_impl
       String className = ((CustomResourceSpecifier)aSpecifier).getResourceClassName();
       //check additional params map for ResourceManager, and use the UIMA extension ClassLoader
       //if one exists
-      ClassLoader loader = null;
-      ResourceManager resMgr = null;
-      if (aAdditionalParams != null) {
-        resMgr = (ResourceManager)aAdditionalParams.get(Resource.PARAM_RESOURCE_MANAGER);
-      }
-      if (resMgr != null) {
-        loader = resMgr.getExtensionClassLoader();
-      }
-      if (loader == null) {
-        loader = this.getClass().getClassLoader();
-      }
-      
       //load the Resourceclass
       Class<?> resourceClass;
       try {
-        resourceClass = Class.forName(className, true, loader);
+        resourceClass = Class_TCCL.forName(className, aAdditionalParams);
       } catch (ClassNotFoundException e) {
         throw new ResourceInitializationException(
                 ResourceInitializationException.CLASS_NOT_FOUND, new Object[] { className,

Added: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Class_TCCL.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Class_TCCL.java?rev=1834705&view=auto
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Class_TCCL.java (added)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/Class_TCCL.java Fri Jun 29 21:47:30 2018
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.internal.util;
+
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.uima.resource.Resource;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.resource.ResourceManager;
+
+/**
+ * Utilities supporting a unified approach to loading classes,
+ * incorporating the resource manager's classloader if available,
+ * and making use of the Thread Context Class Loader (TCCL)
+ */
+public class Class_TCCL {
+
+  static public <T> Class<T> forName(String className) 
+      throws ClassNotFoundException {
+    return forName(className, null, true);
+  }
+  
+  static public <T> Class<T> forName(String className, ResourceManager rm) 
+      throws ClassNotFoundException {
+    return forName(className, rm, true);
+  }  
+  
+  static public <T> Class<T> forName(String className, ResourceManager rm, boolean resolve) 
+      throws ClassNotFoundException {
+    return (Class<T>) Class.forName(className, resolve, get_cl(rm));
+  }
+  
+  static public <T> Class<T> forName(String className, Map<String, Object> additionalParams) 
+      throws ClassNotFoundException {
+    ResourceManager rm = (additionalParams != null)
+                           ? (ResourceManager) additionalParams.get(Resource.PARAM_RESOURCE_MANAGER)
+                           : null;
+    return forName(className, rm);
+  }
+  
+  static public ClassLoader get_cl(ResourceManager rm) {
+    
+    ClassLoader cl = (rm == null) ? null : rm.getExtensionClassLoader();
+    
+    if (cl == null) 
+      cl = get_parent_cl();Thread.currentThread().getContextClassLoader();
+    
+    if (cl == null) 
+      cl = Class_TCCL.class.getClassLoader();  // this class's classloader
+    
+    return cl;
+  }
+  
+  static public ClassLoader get_parent_cl() {
+    ClassLoader cl = Thread.currentThread().getContextClassLoader();
+    return (cl == null) 
+             ? Class_TCCL.class.getClassLoader()
+             : cl;
+  }
+
+  // only for Java 8 + , needs lambda
+//  static public <T> Class<T> loadclass_throw_if_not_found(
+//      String className, ResourceManager rm, Supplier<String> sourceUrl) 
+//          throws ResourceInitializationException {
+//    try {
+//      Class<T> c = forName(className, rm);
+//      return c;
+//    } catch (ClassNotFoundException e) {
+//      throw new ResourceInitializationException(ResourceInitializationException.CLASS_NOT_FOUND,
+//              new Object[] { className, sourceUrl.get() }, e);
+//    }
+//  }
+}

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/ResourceManagerPearWrapper.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/ResourceManagerPearWrapper.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/ResourceManagerPearWrapper.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/ResourceManagerPearWrapper.java Fri Jun 29 21:47:30 2018
@@ -29,6 +29,8 @@ package org.apache.uima.resource;
  */
 public interface ResourceManagerPearWrapper extends ResourceManager {
   /**
+   * N O T E :     N O   L O N G E R    U S E D    2018
+   * 
    * Pear Wrapper Resource Managers share all their values with their parent,
    * except for the 2 values used to store the Classpath and Datapath.
    * 

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/ResourceManager_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/ResourceManager_impl.java?rev=1834705&r1=1834704&r2=1834705&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/ResourceManager_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/ResourceManager_impl.java Fri Jun 29 21:47:30 2018
@@ -35,6 +35,7 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.UIMA_IllegalStateException;
 import org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase;
+import org.apache.uima.internal.util.Class_TCCL;
 import org.apache.uima.internal.util.UIMAClassLoader;
 import org.apache.uima.resource.CasManager;
 import org.apache.uima.resource.DataResource;
@@ -303,7 +304,7 @@ public class ResourceManager_impl implem
   public synchronized void setExtensionClassPath(String classpath, boolean resolveResource)
           throws MalformedURLException {
     // create UIMA extension ClassLoader with the given classpath
-    uimaCL = new UIMAClassLoader(classpath, this.getClass().getClassLoader());
+    uimaCL = new UIMAClassLoader(classpath, Class_TCCL.get_parent_cl());
 
     if (resolveResource) {
       // set UIMA extension ClassLoader also to resolve resources
@@ -835,25 +836,17 @@ public class ResourceManager_impl implem
   
   @Override
   public <N> Class<N> loadUserClass(String name) throws ClassNotFoundException {
-    ClassLoader cl = getExtensionClassLoader();
-    if (cl == null) {
-      cl = this.getClass().getClassLoader();
-    }
-    return (Class<N>) Class.forName(name, true, cl);
+    return Class_TCCL.forName(name, this, true);
   }
   
   public static Class<?> loadUserClass(String name, ResourceManager rm) throws ClassNotFoundException {
-    return (rm == null) 
-             ? Class.forName(name, true, ResourceManager_impl.class.getClassLoader())
-             : rm.loadUserClass(name);
+    return Class_TCCL.forName(name, rm, true);
   }
   
   public static Class<?> loadUserClassOrThrow(String name, ResourceManager rm, ResourceSpecifier aSpecifier) 
       throws ResourceInitializationException {
     try {
-      return (rm == null) 
-               ? Class.forName(name, true, ResourceManager_impl.class.getClassLoader())
-               : rm.loadUserClass(name);
+      return Class_TCCL.forName(name, rm, true);
     } catch (ClassNotFoundException e) {
       throw new ResourceInitializationException(
           ResourceInitializationException.CLASS_NOT_FOUND, new Object[] { name,