summaryrefslogtreecommitdiffstats
path: root/daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java')
-rw-r--r--daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java b/daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java
new file mode 100644
index 0000000..1a02ff7
--- /dev/null
+++ b/daemon/src/main/java/org/openslx/taskmanager/util/ClassLoaderHack.java
@@ -0,0 +1,66 @@
+package org.openslx.taskmanager.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+public class ClassLoaderHack
+{
+ @SuppressWarnings( "rawtypes" )
+ private static final Class[] parameters = new Class[] { URL.class };
+
+ public static void addFile( String s ) throws IOException
+ {
+ File f = new File( s );
+ addFile( f );
+ }
+
+ public static void addFile( File f ) throws IOException
+ {
+ addURL( f.toURI().toURL() );
+ }
+
+ public static void addURL( URL u ) throws IOException
+ {
+ URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader();
+ Class<URLClassLoader> sysclass = URLClassLoader.class;
+
+ try {
+ Method method = sysclass.getDeclaredMethod( "addURL", parameters );
+ method.setAccessible( true );
+ method.invoke( sysloader, new Object[] { u } );
+ System.out.println( "Loaded " + u.toString() );
+ } catch ( Throwable t ) {
+ t.printStackTrace();
+ throw new IOException( "Error, could not add URL to system classloader" );
+ }
+
+ }
+
+ /**
+ * Get Class meta-object for given class in package. Only return class if it's somehow
+ * extending from given baseClass.
+ *
+ * @param packageName package to search in
+ * @param className name of class to look for
+ * @param baseClass class the class in question has to be extended from
+ * @return class meta object, or null if not found
+ */
+ @SuppressWarnings( "unchecked" )
+ public static <T> Class<? extends T> getClass( String packageName, String className, Class<T> baseClass )
+ {
+ final Class<?> clazz;
+ try {
+ clazz = Class.forName( packageName + '.' + className, true, ClassLoader.getSystemClassLoader() );
+ } catch ( ClassNotFoundException e ) {
+ return null;
+ }
+ if ( clazz == null || ( baseClass != null && !baseClass.isAssignableFrom( clazz ) ) ) {
+ return null;
+ }
+ return (Class<? extends T>)clazz;
+ }
+
+}