Author: schor
Date: Mon Nov 19 16:13:59 2018
New Revision: 1846914

URL: http://svn.apache.org/viewvc?rev=1846914&view=rev
Log:
[UIMA-5907] fix saxon classloader

Modified:
    
uima/uima-as/trunk/uimaj-as-jms/src/main/java/org/apache/uima/adapter/jms/service/Dd2spring.java

Modified: 
uima/uima-as/trunk/uimaj-as-jms/src/main/java/org/apache/uima/adapter/jms/service/Dd2spring.java
URL: 
http://svn.apache.org/viewvc/uima/uima-as/trunk/uimaj-as-jms/src/main/java/org/apache/uima/adapter/jms/service/Dd2spring.java?rev=1846914&r1=1846913&r2=1846914&view=diff
==============================================================================
--- 
uima/uima-as/trunk/uimaj-as-jms/src/main/java/org/apache/uima/adapter/jms/service/Dd2spring.java
 (original)
+++ 
uima/uima-as/trunk/uimaj-as-jms/src/main/java/org/apache/uima/adapter/jms/service/Dd2spring.java
 Mon Nov 19 16:13:59 2018
@@ -163,17 +163,52 @@ public class Dd2spring {
                Runtime.getRuntime().addShutdownHook(shutdownHook);
 
                // Create a classloader with saxon8 that delegates to the user's
-               // classloader
-               ClassLoader currentClassloader = Thread.currentThread()
-                               .getContextClassLoader();
+               // classloader and includes the classes defining xslt helper 
java methods
+               //   org.apache.uima.aae.deploymentDescriptor.XsltGUIDgenerator 
and
+               //   org.apache.uima.aae.deploymentDescriptor.XsltImportByName
+               // We do this by creating a custom class loader, which delegates
+               //   first to the threadlocal class loader, and then to 
+               //   the class loader that loaded this class.
+               //   See https://issues.apache.org/jira/browse/UIMA-5907
+               final ClassLoader tccl = 
Thread.currentThread().getContextClassLoader();
+               ClassLoader tccl_plus_this = new 
ClassLoader(this.getClass().getClassLoader()) {
+                 @Override
+                 protected Class<?> loadClass(String name, boolean resolve) 
throws ClassNotFoundException {
+                   synchronized(Dd2spring.class) {
+                   Class<?> c = null;
+                   try {
+                   c = tccl.loadClass(name);
+                   } catch (ClassNotFoundException e) {
+                     c = getParent().loadClass(name);
+                   }
+                   if (c != null && resolve) {
+                     resolveClass(c);
+                   }
+          return c;
+                 }
+                 }
+                 
+                 @Override
+                 public URL getResource(String name) {
+                   synchronized(Dd2spring.class) {
+                     URL url = tccl.getResource(name);
+                     if (null == url) {
+                       url = getParent().getResource(name);  
+                     }
+               return url;
+                   }
+                 }
+                 
+    };
+               
                if (null == saxonClassLoader) {
                        URL[] classLoaderUrls = new URL[] { saxonClasspathURL };
                        saxonClassLoader = new URLClassLoader(classLoaderUrls,
-                                       currentClassloader);
+                                       tccl_plus_this);
                }
                // configure Saxon with these settings
                SaxonInputs saxonConfig = new SaxonInputs(ddFilePath, tempFile,
-                               dd2SpringXsltFilePath, saxonClassLoader, 
currentClassloader);
+                               dd2SpringXsltFilePath, saxonClassLoader, 
tccl_plus_this);
                
                // creates either command line or java based interface to Saxon
                SaxonInterface saxon = SaxonInterfaceFactory.newSaxonInterface(


Reply via email to