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 2014/02/20 19:47:47 UTC

svn commit: r1570299 - in /uima/uimaj/trunk/uimaj-core/src: main/java/org/apache/uima/internal/util/UIMAClassLoader.java test/java/org/apache/uima/internal/util/UIMAClassLoaderTest.java

Author: schor
Date: Thu Feb 20 18:47:46 2014
New Revision: 1570299

URL: http://svn.apache.org/r1570299
Log:
[UIMA-3642] Enable parallel loading with UIMAClassLoader, for Java 7 and later.  Use reflection to avoid compile errors with older Javas

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/UIMAClassLoaderTest.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java?rev=1570299&r1=1570298&r2=1570299&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java Thu Feb 20 18:47:46 2014
@@ -20,6 +20,8 @@
 package org.apache.uima.internal.util;
 
 import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -37,10 +39,20 @@ import java.util.StringTokenizer;
  */
 public class UIMAClassLoader extends URLClassLoader {
   
-  private final static boolean SUPPORTS_PARALLEL_LOADING = Float.parseFloat(System.getProperty("java.version").substring(0,3)) >= 1.7;
+  //public so other users can use this
+  public final static boolean SUPPORTS_PARALLEL_LOADING = Float.parseFloat(System.getProperty("java.version").substring(0,3)) >= 1.7;
   static {
     if (SUPPORTS_PARALLEL_LOADING) {
-      ClassLoader.registerAsParallelCapable();
+      try {
+        Method m = ClassLoader.class.getDeclaredMethod("registerAsParallelCapable");
+        m.setAccessible(true);
+        m.invoke(null);
+      } catch (NoSuchMethodException e) {
+      } catch (SecurityException e) {
+      } catch (IllegalAccessException e) {
+      } catch (IllegalArgumentException e) {
+      } catch (InvocationTargetException e) {
+      }
     }
   }
   /**
@@ -173,4 +185,5 @@ public class UIMAClassLoader extends URL
     }
     return c;    
   }
+  
 }

Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/UIMAClassLoaderTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/UIMAClassLoaderTest.java?rev=1570299&r1=1570298&r2=1570299&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/UIMAClassLoaderTest.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/UIMAClassLoaderTest.java Thu Feb 20 18:47:46 2014
@@ -20,6 +20,7 @@
 package org.apache.uima.internal.util;
 
 import java.io.File;
+import java.lang.reflect.Method;
 import java.net.URL;
 
 import junit.framework.Assert;
@@ -60,8 +61,21 @@ public class UIMAClassLoaderTest extends
     Assert.assertNull(rsrcMgr.getExtensionClassLoader());
 
     rsrcMgr.setExtensionClassPath("../this/is/a/simple/test.jar", false);
-
-    Assert.assertNotNull(rsrcMgr.getExtensionClassLoader());
+    ClassLoader cl = rsrcMgr.getExtensionClassLoader();
+    Assert.assertNotNull(cl);
+    if (UIMAClassLoader.SUPPORTS_PARALLEL_LOADING) {
+      //assertTrue(cl != cl.getClassLoadingLock("Aclass"));
+      Class classOfLoader = cl.getClass().getSuperclass();
+      while (classOfLoader.getName() != "java.lang.ClassLoader") {
+        classOfLoader = classOfLoader.getSuperclass(); 
+      }
+      Method m = classOfLoader.getDeclaredMethod("getClassLoadingLock", String.class);
+      m.setAccessible(true);
+      Object o = m.invoke(cl, "someString");
+      Object o2 = m.invoke(cl, "s2");
+      assertTrue(o != o2);
+      assertTrue(cl != o);      
+    }
   }
 
   public void testAdvancedRsrcMgrCLassLoaderCreation() throws Exception {