From 2a6fdd3e8c315282db909efb520312505a0ceba1 Mon Sep 17 00:00:00 2001 From: jprocter Date: Tue, 29 Jan 2008 10:11:32 +0000 Subject: [PATCH] groovy scripts can be read from stdin --- src/jalview/bin/Jalview.java | 45 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 5d0b9d6..faf98db 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -18,8 +18,12 @@ */ package jalview.bin; +import java.io.BufferedReader; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; import java.lang.reflect.Constructor; import java.util.*; @@ -80,7 +84,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." + + "-groovy FILE\tExecute groovy script in FILE, after all other arguments have been processed (if FILE is the text 'STDIN' then the file will be read from STDIN)" + "\n\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n"); System.exit(0); } @@ -398,7 +402,32 @@ public class Jalview { System.err.println("Sorry. Groovy support is currently only available when running with the Jalview GUI enabled."); } - File sfile = new File(groovyscript); + File sfile = null; + if (groovyscript.trim().equals("STDIN")) + { + // read from stdin into a tempfile and execute it + try { + sfile = File.createTempFile("jalview", "groovy"); + PrintWriter outfile = new PrintWriter(new OutputStreamWriter(new FileOutputStream(sfile))); + BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in)); + String line=null; + while ((line=br.readLine())!=null) + { + outfile.write(line+"\n"); + } + br.close(); + outfile.flush(); + outfile.close(); + + } catch (Exception ex) + { + System.err.println("Failed to read from STDIN into tempfile "+((sfile==null) ? "(tempfile wasn't created)" : sfile.toString())); + ex.printStackTrace(); + return; + } + } else { + sfile = new File(groovyscript); + } if (!sfile.exists()) { System.err.println("File '"+groovyscript+"' does not exist."); @@ -414,6 +443,7 @@ public class Jalview System.err.println("File '"+groovyscript+"' is empty."); return; } + boolean success = false; try { /* The following code performs the GroovyScriptEngine invocation using reflection, * and is equivalent to this fragment from the embedding groovy documentation on @@ -437,13 +467,20 @@ public class Jalview 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 } }); + Object gse = gseccons.newInstance(new Object[] { new String[] { sfile.toURL().toString() } }); java.lang.reflect.Method run = gsec.getMethod("run", new Class[]{ String.class, gbindingc }); - run.invoke(gse, new Object[] { sfile.getName(), gbinding }); + run.invoke(gse, new Object[] { sfile.toURL().toString(), gbinding }); + success = true; } catch (Exception e) { System.err.println("Exception Whilst trying to execute file "+sfile+" as a groovy script."); e.printStackTrace(System.err); + + } + if (success && groovyscript.equals("STDIN")) + { + // delete temp file that we made - but only if it was successfully executed + sfile.delete(); } } /** -- 1.7.10.2