Skip to content

Commit

Permalink
used URLClassLoader instead of changing java.class.path to dynamicall…
Browse files Browse the repository at this point in the history
…y load plugin jars (Lighthouse unclebob#63)
  • Loading branch information
timander committed Oct 9, 2009
1 parent b325ede commit 16e64a1
Show file tree
Hide file tree
Showing 9 changed files with 110 additions and 78 deletions.
Binary file added plugins/test-plugin-x.jar
Binary file not shown.
Binary file added plugins/test-plugin-y.jar
Binary file not shown.
1 change: 0 additions & 1 deletion plugins/testJar1.jar

This file was deleted.

1 change: 0 additions & 1 deletion plugins/testJar2.jar

This file was deleted.

29 changes: 0 additions & 29 deletions src/fitnesse/components/PluginClasspathLoader.java

This file was deleted.

47 changes: 0 additions & 47 deletions src/fitnesse/components/PluginClasspathLoaderTest.java

This file was deleted.

53 changes: 53 additions & 0 deletions src/fitnesse/components/PluginsClassLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package fitnesse.components;

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;


public class PluginsClassLoader {

protected String pluginsDirectory = "plugins";

public void addPluginsToClassLoader() {
File pluginsDir = new File(pluginsDirectory);
if (pluginsDir.exists()) {
for (File plugin : pluginsDir.listFiles()) {
if (plugin.getName().endsWith("jar")) {
addFile(plugin);
}
}
}
}


public void addFile(File plugin) {
try {
addURL(plugin.toURI().toURL());
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}


public void addURL(URL url) {
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(sysloader, url);
} catch (NoSuchMethodException nsme) {
throw new RuntimeException("Error, could not add URL to system classloader", nsme);
} catch (InvocationTargetException ite) {
throw new RuntimeException("Error, could not add URL to system classloader", ite);
} catch (IllegalAccessException iae) {
throw new RuntimeException("Error, could not add URL to system classloader", iae);
}
}


}
51 changes: 51 additions & 0 deletions src/fitnesse/components/PluginsClassLoaderTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package fitnesse.components;

import static org.junit.Assert.*;
import org.junit.Test;


public class PluginsClassLoaderTest {

@Test
public void whenPluginsDirectoryDoesNotExist() {
try {
PluginsClassLoader pluginsClassLoader = new PluginsClassLoader();
pluginsClassLoader.pluginsDirectory = "nonExistingPluginsDirectory";
pluginsClassLoader.addPluginsToClassLoader();
assertTrue("didn't cause exception", true);
} catch (Exception e) {
fail("if exception occurs when plugins directory does not exist");
}
}

@Test
public void addPluginsToClassLoader() {
String[] dynamicClasses = new String[]{"fitnesse.testing.PluginX", "fitnesse.testing.PluginY"};
assertLoadingClassCausesException(dynamicClasses);
new PluginsClassLoader().addPluginsToClassLoader();
assertLoadingClassWorksNow(dynamicClasses);
}

private void assertLoadingClassWorksNow(String... dynamicClasses) {
for (String dynamicClass : dynamicClasses) {
try {
Class<?> dynamicallyLoadedClass = Class.forName(dynamicClass);
assertEquals(dynamicClass, dynamicallyLoadedClass.getName());
} catch (ClassNotFoundException e) {
fail(e.getMessage());
}
}
}

private void assertLoadingClassCausesException(String... dynamicClasses) {
for (String dynamicClass : dynamicClasses) {
try {
Class.forName(dynamicClass);
fail("plugins are not yet added to the classloader");
} catch (ClassNotFoundException e) {
assertEquals(dynamicClass, e.getMessage());
}
}
}

}
6 changes: 6 additions & 0 deletions src/fitnesseMain/FitNesseMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.io.File;

import fitnesse.components.PluginsClassLoader;
import util.CommandLine;
import fitnesse.Arguments;
import fitnesse.ComponentFactory;
Expand Down Expand Up @@ -35,6 +36,7 @@ public static void main(String[] args) throws Exception {
}

private static void launchFitNesse(Arguments arguments) throws Exception {
loadPlugins();
FitNesseContext context = loadContext(arguments);
VelocityFactory.makeVelocityFactory(context);
Updater updater = null;
Expand All @@ -46,6 +48,10 @@ private static void launchFitNesse(Arguments arguments) throws Exception {
updateAndLaunch(arguments, context, fitnesse);
}

private static void loadPlugins() {
new PluginsClassLoader().addPluginsToClassLoader();
}

static void updateAndLaunch(Arguments arguments, FitNesseContext context,
FitNesse fitnesse) throws Exception {
if (!arguments.isOmittingUpdates())
Expand Down

0 comments on commit 16e64a1

Please sign in to comment.