summaryrefslogtreecommitdiffstats
path: root/src/bind/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/bind/java/org')
-rw-r--r--src/bind/java/org/inkscape/cmn/ScriptRunner.java211
1 files changed, 170 insertions, 41 deletions
diff --git a/src/bind/java/org/inkscape/cmn/ScriptRunner.java b/src/bind/java/org/inkscape/cmn/ScriptRunner.java
index a128af734..d05afd2e3 100644
--- a/src/bind/java/org/inkscape/cmn/ScriptRunner.java
+++ b/src/bind/java/org/inkscape/cmn/ScriptRunner.java
@@ -25,6 +25,7 @@
package org.inkscape.cmn;
import javax.script.*;
+import java.util.List;
import java.io.FileReader;
import java.io.PrintStream;
import java.io.OutputStream;
@@ -37,9 +38,40 @@ import javax.swing.JOptionPane;
*/
public class ScriptRunner
{
+/**
+ * Pointer back to the BinderyImpl C++ object that launched me
+ */
long backPtr;
+/**
+ * The script engine manager that we want to use
+ */
+ScriptEngineManager scriptEngineManager;
+
+
+//########################################################################
+//# MESSSAGES
+//########################################################################
+static void err(String message)
+{
+ System.err.println("ScriptRunner err:" + message);
+}
+
+static void msg(String message)
+{
+ System.out.println("ScriptRunner:" + message);
+}
+static void trace(String message)
+{
+ log.println("ScriptRunner:" + message);
+}
+
+
+
+//########################################################################
+//# REDIRECT STDERR / STDOUT
+//########################################################################
/**
* Redirect stdout
*/
@@ -55,7 +87,6 @@ public void write(int b)
}
-
/**
* Redirect stderr
*/
@@ -71,14 +102,27 @@ public void write(int b)
}
+/**
+ * A logging stream
+ */
+static PrintStream log;
+public native void logWrite(long ptr, int b);
+class LogStream extends OutputStream
+{
-static void err(String message)
+public void write(int b)
{
- JOptionPane.showMessageDialog(null, message,
- "Script Error", JOptionPane.ERROR_MESSAGE);
+ logWrite(backPtr, b);
}
+}
+
+
+//########################################################################
+//# RUN
+//########################################################################
+
/**
* Run a script buffer
@@ -87,12 +131,16 @@ static void err(String message)
* @param str the script buffer to execute
* @return true if successful, else false
*/
-public boolean run(String lang, String str)
+public boolean doRun(String lang, String str)
{
- ScriptEngineManager factory = new ScriptEngineManager();
// create JavaScript engine
- ScriptEngine engine = factory.getEngineByName(lang);
- // evaluate JavaScript code from given file - specified by first argument
+ ScriptEngine engine = scriptEngineManager.getEngineByName(lang);
+ if (engine == null)
+ {
+ err("doRun: cannot find script engine '" + lang + "'");
+ return false;
+ }
+ //execute script from buffer
try
{
engine.eval(str);
@@ -100,10 +148,41 @@ public boolean run(String lang, String str)
catch (javax.script.ScriptException e)
{
err("Executing script: " + e);
+ e.printStackTrace();
}
return true;
}
+/**
+ * Run a script buffer
+ *
+ * @param backPtr pointer back to the C context that called this
+ * @param lang the scripting language to run
+ * @param str the script buffer to execute
+ * @return true if successful, else false
+ */
+public static boolean run(String lang, String str)
+{
+ //wrap whole thing in try/catch, since this will
+ //likely be called from C
+ try
+ {
+ ScriptRunner runner = getInstance();
+ if (runner == null)
+ {
+ err("ScriptRunner not initialized");
+ return false;
+ }
+ return runner.doRun(lang, str);
+ }
+ catch (Exception e)
+ {
+ err("run :" + e);
+ e.printStackTrace();
+ return false;
+ }
+}
+
/**
* Run a script file
@@ -112,12 +191,16 @@ public boolean run(String lang, String str)
* @param fname the script file to execute
* @return true if successful, else false
*/
-public boolean runFile(String lang, String fname)
+public boolean doRunFile(String lang, String fname)
{
- ScriptEngineManager factory = new ScriptEngineManager();
// create JavaScript engine
- ScriptEngine engine = factory.getEngineByName(lang);
- // evaluate JavaScript code from given file - specified by first argument
+ ScriptEngine engine = scriptEngineManager.getEngineByName(lang);
+ if (engine == null)
+ {
+ err("doRunFile: cannot find script engine '" + lang + "'");
+ return false;
+ }
+ //try opening file and feeding into engine
FileReader in = null;
boolean ret = true;
try
@@ -152,58 +235,104 @@ public boolean runFile(String lang, String fname)
/**
- * Constructor
+ * Run a script file
+ *
* @param backPtr pointer back to the C context that called this
+ * @param lang the scripting language to run
+ * @param fname the script file to execute
+ * @return true if successful, else false
*/
-public ScriptRunner(long backPtr)
+public static boolean runFile(String lang, String fname)
{
- this.backPtr = backPtr;
- System.setOut(new PrintStream(new StdOutStream()));
- System.setErr(new PrintStream(new StdErrStream()));
+ //wrap whole thing in try/catch, since this will
+ //likely be called from C
+ try
+ {
+ ScriptRunner runner = getInstance();
+ if (runner == null)
+ {
+ err("ScriptRunner not initialized");
+ return false;
+ }
+ return runner.doRunFile(lang, fname);
+ }
+ catch (Exception e)
+ {
+ err("run :" + e);
+ return false;
+ }
}
-private static ScriptRunner _instance = null;
+//########################################################################
+//# CONSTRUCTOR
+//########################################################################
+
-public static ScriptRunner getInstance(long backPtr)
+private static ScriptRunner _instance = null;
+public static ScriptRunner getInstance()
{
- if (_instance == null)
- _instance = new ScriptRunner(backPtr);
return _instance;
}
-
-/**
- * Run a script buffer
- *
- * @param backPtr pointer back to the C context that called this
- * @param lang the scripting language to run
- * @param str the script buffer to execute
- * @return true if successful, else false
- */
-public static boolean run(long ptr, String lang, String str)
+private void listFactories()
{
- ScriptRunner runner = getInstance(ptr);
- return runner.run(lang, str);
+ List<ScriptEngineFactory> factories =
+ scriptEngineManager.getEngineFactories();
+ for (ScriptEngineFactory factory: factories)
+ {
+ log.println("ScriptEngineFactory Info");
+ String engName = factory.getEngineName();
+ String engVersion = factory.getEngineVersion();
+ String langName = factory.getLanguageName();
+ String langVersion = factory.getLanguageVersion();
+ log.printf("\tScript Engine: %s (%s)\n",
+ engName, engVersion);
+ List<String> engNames = factory.getNames();
+ for(String name: engNames)
+ {
+ log.printf("\tEngine Alias: %s\n", name);
+ }
+ log.printf("\tLanguage: %s (%s)\n",
+ langName, langVersion);
+ }
}
+
/**
- * Run a script file
- *
+ * Constructor
* @param backPtr pointer back to the C context that called this
- * @param lang the scripting language to run
- * @param fname the script file to execute
- * @return true if successful, else false
*/
-public static boolean runFile(long ptr, String lang, String fname)
+public ScriptRunner(long backPtr)
{
- ScriptRunner runner = getInstance(ptr);
- return runner.runFile(lang, fname);
+ /**
+ * Set up the output, error, and logging stream
+ */
+ System.setOut(new PrintStream(new StdOutStream()));
+ System.setErr(new PrintStream(new StdErrStream()));
+ log = new PrintStream(new LogStream());
+
+ //Point back to C++ object
+ this.backPtr = backPtr;
+
+ //Start up the factory
+ scriptEngineManager = new ScriptEngineManager();
+ listFactories();
+ _instance = this;
}
+static
+{
+
+}
}
+//########################################################################
+//# E N D O F F I L E
+//########################################################################
+
+