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(