From 013c39d4eaab0ed509d21e83676fa4da284d7fde Mon Sep 17 00:00:00 2001 From: jprocter Date: Fri, 11 Jan 2008 13:52:16 +0000 Subject: [PATCH 1/1] added groovy argument for launching a groovy script from the command line --- src/jalview/bin/Jalview.java | 91 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index bfd6d70..5d0b9d6 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -18,7 +18,9 @@ */ package jalview.bin; +import java.io.File; import java.io.IOException; +import java.lang.reflect.Constructor; import java.util.*; import javax.swing.*; @@ -78,6 +80,7 @@ public class Jalview + "-noquestionnaire\tTurn off questionnaire check." + "-dasserver nickname=URL\tAdd and enable a das server with given nickname (alphanumeric or underscores only) for retrieval of features for all alignments." + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them." + + "-groovy FILE\tExecute groovy script in FILE, after all other arguments have been processed." + "\n\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n"); System.exit(0); } @@ -160,6 +163,9 @@ public class Jalview jalview.io.FileLoader fileLoader = new jalview.io.FileLoader(); Vector getFeatures = null; // vector of das source nicknames to fetch features from // loading is done. + String groovyscript = null; // script to execute after all loading is completed one way or another + // extract groovy argument and execute if necessary + groovyscript = aparser.getValue("groovy"); file = aparser.getValue("open"); if (file == null && desktop == null) @@ -272,6 +278,19 @@ public class Jalview } } } + if (groovyscript!=null) + { + // Execute the groovy script after we've done all the rendering stuff + // and before any images or figures are generated. + if (jalview.bin.Cache.groovyJarsPresent()) + { + System.out.println("Executing script "+groovyscript); + executeGroovyScript(groovyscript, desktop); + } else { + System.err.println("Sorry. Groovy Support is not available, so ignoring the provided groovy script "+groovyscript); + } + groovyscript = null; + } String imageName = "unnamed.png"; while (aparser.getSize() > 1) { @@ -345,6 +364,7 @@ public class Jalview startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol, format); getFeatures = checkDasArguments(aparser); + // extract groovy arguments before anything else. } // Once all loading is done. Retrieve features. if (getFeatures!=null) @@ -354,6 +374,77 @@ public class Jalview startFeatureFetching(getFeatures); } } + if (groovyscript!=null) + { + if (jalview.bin.Cache.groovyJarsPresent()) + { + System.out.println("Executing script "+groovyscript); + executeGroovyScript(groovyscript, desktop); + } else { + System.err.println("Sorry. Groovy Support is not available, so ignoring the provided groovy script "+groovyscript); + } + } + + // Once all other stuff is done, execute any groovy scripts (in order) + } + /** + * Locate the given string as a file and pass it to the groovy interpreter. + * @param groovyscript the script to execute + * @param jalviewContext the Jalview Desktop object passed in to the groovy binding as the 'Jalview' object. + */ + private static void executeGroovyScript(String groovyscript, Object jalviewContext) + { + if (jalviewContext==null) + { + System.err.println("Sorry. Groovy support is currently only available when running with the Jalview GUI enabled."); + } + File sfile = new File(groovyscript); + if (!sfile.exists()) + { + System.err.println("File '"+groovyscript+"' does not exist."); + return; + } + if (!sfile.canRead()) + { + System.err.println("File '"+groovyscript+"' cannot be read."); + return; + } + if (sfile.length()<1) + { + System.err.println("File '"+groovyscript+"' is empty."); + return; + } + try { + /* The following code performs the GroovyScriptEngine invocation using reflection, + * and is equivalent to this fragment from the embedding groovy documentation on + * the groovy site: + * + import groovy.lang.Binding; + import groovy.util.GroovyScriptEngine; + + String[] roots = new String[] { "/my/groovy/script/path" }; + GroovyScriptEngine gse = new GroovyScriptEngine(roots); + Binding binding = new Binding(); + binding.setVariable("input", "world"); + gse.run("hello.groovy", binding); + * + */ + ClassLoader cl = jalviewContext.getClass().getClassLoader(); + Class gbindingc = cl.loadClass("groovy.lang.Binding"); + Constructor gbcons = gbindingc.getConstructor(null); + Object gbinding = gbcons.newInstance(null); + java.lang.reflect.Method setvar = gbindingc.getMethod("setVariable", new Class[] { String.class, Object.class} ); + setvar.invoke(gbinding, new Object[] { "Jalview", jalviewContext}); + Class gsec = cl.loadClass("groovy.util.GroovyScriptEngine"); + Constructor gseccons = gsec.getConstructor(new Class[] { String[].class }); + Object gse = gseccons.newInstance(new Object[] { new String[] { groovyscript } }); + java.lang.reflect.Method run = gsec.getMethod("run", new Class[]{ String.class, gbindingc }); + run.invoke(gse, new Object[] { sfile.getName(), gbinding }); + } catch (Exception e) + { + System.err.println("Exception Whilst trying to execute file "+sfile+" as a groovy script."); + e.printStackTrace(System.err); + } } /** * Check commandline for any das server definitions or any fetchfrom switches -- 1.7.10.2