From a468509f149008ddb12dff5cdbd0cabebf233ec1 Mon Sep 17 00:00:00 2001 From: benfry Date: Mon, 22 Oct 2012 20:15:27 +0000 Subject: [PATCH] better solution for JDT, ECJ, and class loading dynamically to get XQMode working --- app/src/processing/app/Mode.java | 16 ++++++++++ .../app/contrib/ModeContribution.java | 1 + .../app/tools/InstallCommander.java | 1 - app/src/processing/mode/java/Compiler.java | 32 ++++++++++++++++--- build/build.xml | 2 +- build/macosx/template.app/Contents/Info.plist | 2 +- build/windows/launcher/config-cmd.xml | 1 - build/windows/launcher/config.xml | 1 - 8 files changed, 46 insertions(+), 10 deletions(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 0d5a14aeb..bdc4fc36e 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -51,6 +51,12 @@ public abstract class Mode { /** Library folder for core. (Used for OpenGL in particular.) */ protected Library coreLibrary; + + /** + * ClassLoader used to retrieve classes for this mode. Useful if you want + * to grab any additional classes that subclass what's in the mode folder. + */ + protected ClassLoader classLoader; // public Mode(Base base, File folder) { @@ -71,6 +77,16 @@ public abstract class Mode { rebuildLibraryList(); // rebuildExamplesMenu(); } + + + public void setClassLoader(ClassLoader loader) { + this.classLoader = loader; + } + + + public ClassLoader getClassLoader() { + return classLoader; + } /** diff --git a/app/src/processing/app/contrib/ModeContribution.java b/app/src/processing/app/contrib/ModeContribution.java index edf0599d2..f5693e64c 100644 --- a/app/src/processing/app/contrib/ModeContribution.java +++ b/app/src/processing/app/contrib/ModeContribution.java @@ -96,6 +96,7 @@ public class ModeContribution extends InstalledContribution { Class modeClass = loader.loadClass(className); Constructor con = modeClass.getConstructor(Base.class, File.class); mode = (Mode) con.newInstance(base, folder); + mode.setClassLoader(loader); mode.setupGUI(); } diff --git a/app/src/processing/app/tools/InstallCommander.java b/app/src/processing/app/tools/InstallCommander.java index 499d47475..80aa8461e 100644 --- a/app/src/processing/app/tools/InstallCommander.java +++ b/app/src/processing/app/tools/InstallCommander.java @@ -82,7 +82,6 @@ public class InstallCommander implements Tool { String[] jarList = new String[] { "pde.jar", "antlr.jar", - "jdt-core.jar", "jna.jar", "ant.jar", "ant-launcher.jar", diff --git a/app/src/processing/mode/java/Compiler.java b/app/src/processing/mode/java/Compiler.java index dc52e27b8..b9a8f059b 100644 --- a/app/src/processing/mode/java/Compiler.java +++ b/app/src/processing/mode/java/Compiler.java @@ -27,9 +27,10 @@ import processing.app.*; import processing.core.*; import java.io.*; +import java.lang.reflect.Method; -import org.eclipse.jdt.core.compiler.batch.BatchCompiler; -import org.eclipse.jdt.core.compiler.CompilationProgress; +//import org.eclipse.jdt.core.compiler.batch.BatchCompiler; +//import org.eclipse.jdt.core.compiler.CompilationProgress; public class Compiler { @@ -107,10 +108,31 @@ public class Compiler { PrintWriter writer = new PrintWriter(internalWriter); //result = com.sun.tools.javac.Main.compile(command, writer); - - CompilationProgress progress = null; + PrintWriter outWriter = new PrintWriter(System.out); - success = BatchCompiler.compile(command, outWriter, writer, progress); + + // Version that's not dynamically loaded + //CompilationProgress progress = null; + //success = BatchCompiler.compile(command, outWriter, writer, progress); + + // Version that *is* dynamically loaded. First gets the mode class loader + // so that it can grab the compiler JAR files from it. + ClassLoader loader = build.mode.getClassLoader(); + try { + Class batchClass = + Class.forName("org.eclipse.jdt.core.compiler.batch.BatchCompiler", false, loader); + Class progressClass = + Class.forName("org.eclipse.jdt.core.compiler.CompilationProgress", false, loader); + Class[] compileArgs = + new Class[] { String[].class, PrintWriter.class, PrintWriter.class, progressClass }; + Method compileMethod = batchClass.getMethod("compile", compileArgs); + success = (Boolean) + compileMethod.invoke(null, new Object[] { command, outWriter, writer, null }); + } catch (Exception e) { + e.printStackTrace(); + throw new SketchException("Unknown error inside the compiler."); + } + // Close out the stream for good measure writer.flush(); writer.close(); diff --git a/build/build.xml b/build/build.xml index 3a1ed383c..47ee0083e 100644 --- a/build/build.xml +++ b/build/build.xml @@ -37,7 +37,7 @@ - + diff --git a/build/macosx/template.app/Contents/Info.plist b/build/macosx/template.app/Contents/Info.plist index 4353b58d4..83cae7825 100755 --- a/build/macosx/template.app/Contents/Info.plist +++ b/build/macosx/template.app/Contents/Info.plist @@ -81,7 +81,7 @@ - $JAVAROOT/pde.jar:$JAVAROOT/core/library/core.jar:$JAVAROOT/ant.jar:$JAVAROOT/ant-launcher.jar:$JAVAROOT/antlr.jar:$JAVAROOT/jdt-core.jar:$JAVAROOT/jna.jar:$JAVAROOT/quaqua.jar + $JAVAROOT/pde.jar:$JAVAROOT/core/library/core.jar:$JAVAROOT/ant.jar:$JAVAROOT/ant-launcher.jar:$JAVAROOT/antlr.jar:$JAVAROOT/jna.jar:$JAVAROOT/quaqua.jar Properties diff --git a/build/windows/launcher/config-cmd.xml b/build/windows/launcher/config-cmd.xml index fdcc8656b..dcf3d1dc0 100755 --- a/build/windows/launcher/config-cmd.xml +++ b/build/windows/launcher/config-cmd.xml @@ -18,7 +18,6 @@ lib/pde.jar core/library/core.jar lib/jna.jar - lib/jdt-core.jar lib/antlr.jar lib/ant.jar lib/ant-launcher.jar diff --git a/build/windows/launcher/config.xml b/build/windows/launcher/config.xml index b36c6574c..6ae678be7 100755 --- a/build/windows/launcher/config.xml +++ b/build/windows/launcher/config.xml @@ -18,7 +18,6 @@ lib/pde.jar core/library/core.jar lib/jna.jar - lib/jdt-core.jar lib/antlr.jar lib/ant.jar lib/ant-launcher.jar