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/11/19 16:13:59 UTC

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

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(