fetch groovy script from URL (JAL-899) and show progress bar when handling CLI comman...
authorjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 5 Aug 2011 15:49:55 +0000 (16:49 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 5 Aug 2011 15:49:55 +0000 (16:49 +0100)
src/jalview/bin/Jalview.java

index b83bdc0..5357e81 100755 (executable)
@@ -24,6 +24,8 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URL;
 import java.net.URLDecoder;
 import java.security.AllPermission;
@@ -332,6 +334,10 @@ public class Jalview
           }
         }
       }
+      if (!headless)
+      {
+        desktop.setProgressBar("Processing commandline arguments...", Jalview.class.hashCode());
+      }
 
       protocol = jalview.io.AppletFormatAdapter.checkProtocol(file);
 
@@ -556,6 +562,7 @@ public class Jalview
     // and finally, turn off batch mode indicator - if the desktop still exists
     if (desktop != null)
     {
+      desktop.setProgressBar(null, Jalview.class.hashCode());
       desktop.setInBatchMode(false);
     }
   }
@@ -608,15 +615,22 @@ public class Jalview
       System.err
               .println("Sorry. Groovy support is currently only available when running with the Jalview GUI enabled.");
     }
-    File sfile = null;
+    /**
+     * for scripts contained in files
+     */
+    File tfile = null;
+    /**
+     * script's URI
+     */
+    URL sfile = null;
     if (groovyscript.trim().equals("STDIN"))
     {
       // read from stdin into a tempfile and execute it
       try
       {
-        sfile = File.createTempFile("jalview", "groovy");
+        tfile = File.createTempFile("jalview", "groovy");
         PrintWriter outfile = new PrintWriter(new OutputStreamWriter(
-                new FileOutputStream(sfile)));
+                new FileOutputStream(tfile)));
         BufferedReader br = new BufferedReader(
                 new java.io.InputStreamReader(System.in));
         String line = null;
@@ -631,30 +645,51 @@ public class Jalview
       } catch (Exception ex)
       {
         System.err.println("Failed to read from STDIN into tempfile "
-                + ((sfile == null) ? "(tempfile wasn't created)" : sfile
+                + ((tfile == null) ? "(tempfile wasn't created)" : tfile
                         .toString()));
         ex.printStackTrace();
         return;
       }
+      try {
+        sfile = tfile.toURI().toURL();
+      } catch (Exception x)
+      {
+        System.err.println("Unexpected Malformed URL Exception for temporary file created from STDIN: "+tfile.toURI());
+        x.printStackTrace();
+        return;
+      }
     }
     else
     {
-      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
+      {
+        sfile = new URI(groovyscript).toURL();
+      } catch (Exception x)
+      {
+        tfile = new File(groovyscript);
+        if (!tfile.exists())
+        {
+          System.err.println("File '" + groovyscript + "' does not exist.");
+          return;
+        }
+        if (!tfile.canRead())
+        {
+          System.err.println("File '" + groovyscript + "' cannot be read.");
+          return;
+        }
+        if (tfile.length() < 1)
+        {
+          System.err.println("File '" + groovyscript + "' is empty.");
+          return;
+        }
+        try {
+        sfile = tfile.getAbsoluteFile().toURI().toURL();
+        } catch (Exception ex)
+        {
+          System.err.println("Failed to create a file URL for "+tfile.getAbsoluteFile());
+          return;
+        }
+      }
     }
     boolean success = false;
     try
@@ -672,44 +707,59 @@ public class Jalview
        */
       Class[] bspec;
       Object[] binding;
-      int blen=((jalviewContext[0]==null) ? 0 : 1) + ((jalviewContext[1]==null) ? 0 : 1);
-      String cnames[] = new String[] { "Jalview", "currentAlFrame"};
-      bspec=new Class[blen*2];
-      binding=new Object[blen*2];
-      blen=0;
-      ClassLoader cl=null;
-      for (int jc=0;jc<jalviewContext.length;jc++)
-      {
-       if (jalviewContext[jc]!=null) { 
-         if (cl==null)
-         {
-                 cl = jalviewContext[jc].getClass().getClassLoader();
-         }
-               bspec[blen*2] = String.class;
-         bspec[blen*2+1] = Object.class;
-         binding[blen*2]=cnames[jc];
-         binding[blen*2+1]=jalviewContext[jc];
-         blen++;
+      int blen = ((jalviewContext[0] == null) ? 0 : 1)
+              + ((jalviewContext[1] == null) ? 0 : 1);
+      String cnames[] = new String[]
+      { "Jalview", "currentAlFrame" };
+      bspec = new Class[blen * 2];
+      binding = new Object[blen * 2];
+      blen = 0;
+      ClassLoader cl = null;
+      Map vbinding = new Hashtable();
+      for (int jc = 0; jc < jalviewContext.length; jc++)
+      {
+        if (jalviewContext[jc] != null)
+        {
+          if (cl == null)
+          {
+            cl = jalviewContext[jc].getClass().getClassLoader();
+          }
+          bspec[blen * 2] = String.class;
+          bspec[blen * 2 + 1] = Object.class;
+          binding[blen * 2] = cnames[jc];
+          binding[blen * 2 + 1] = jalviewContext[jc];
+          vbinding.put(cnames[jc], jalviewContext[jc]);
+          blen++;
         }
       }
       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",
-              bspec);
-      
-      setvar.invoke(gbinding, binding);
+      Constructor gbcons;
+      Object gbinding;
+      try
+      {
+        gbcons = gbindingc.getConstructor(Map.class);
+        gbinding = gbcons.newInstance(vbinding);
+      } catch (NoSuchMethodException x)
+      {
+        // old style binding config - using series of string/object values to
+        // setVariable.
+        gbcons = gbindingc.getConstructor(null);
+        gbinding = gbcons.newInstance(null);
+        java.lang.reflect.Method setvar = gbindingc.getMethod(
+                "setVariable", bspec);
+        setvar.invoke(gbinding, binding);
+      }
+      ;
       Class gsec = cl.loadClass("groovy.util.GroovyScriptEngine");
       Constructor gseccons = gsec.getConstructor(new Class[]
       { URL[].class }); // String[].class });
       Object gse = gseccons.newInstance(new Object[]
       { new URL[]
-      { sfile.toURL() } }); // .toString() } });
+      { sfile } }); // .toString() } });
       java.lang.reflect.Method run = gsec.getMethod("run", new Class[]
       { String.class, gbindingc });
       run.invoke(gse, new Object[]
-      { sfile.getName(), gbinding });
+      { sfile.toString(), gbinding });
       success = true;
     } catch (Exception e)
     {
@@ -722,7 +772,7 @@ public class Jalview
     {
       // delete temp file that we made - but only if it was successfully
       // executed
-      sfile.delete();
+      tfile.delete();
     }
   }