apply version 2.7 copyright
[jalview.git] / src / jalview / bin / Jalview.java
index b83bdc0..dd61e76 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
  * 
  * This file is part of Jalview.
  * 
@@ -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;
@@ -316,9 +318,14 @@ public class Jalview
         }
       }
     }
+    long progress=-1;
     // Finally, deal with the remaining input data.
     if (file != null)
     {
+      if (!headless)
+      {
+        desktop.setProgressBar("Processing commandline arguments...", progress=System.currentTimeMillis());
+      }
       System.out.println("Opening file: " + file);
 
       if (!file.startsWith("http://"))
@@ -504,8 +511,15 @@ public class Jalview
             && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true))
     {
       file = jalview.bin.Cache.getDefault("STARTUP_FILE",
-              jalview.bin.Cache.getDefault("www.jalview.org", "http://www.jalview.org")+"/examples/exampleFile_2_3.jar");
-
+              jalview.bin.Cache.getDefault("www.jalview.org", "http://www.jalview.org")+"/examples/exampleFile_2_7.jar");
+      if (file.equals("http://www.jalview.org/examples/exampleFile_2_3.jar"))
+      {
+        // hardwire upgrade of the startup file
+        file.replace("_2_3.jar","_2_7.jar");
+        // and remove the stale setting 
+        jalview.bin.Cache.removeProperty("STARTUP_FILE");
+      }
+      
       protocol = "File";
 
       if (file.indexOf("http:") > -1)
@@ -556,6 +570,9 @@ public class Jalview
     // and finally, turn off batch mode indicator - if the desktop still exists
     if (desktop != null)
     {
+      if (progress!=-1) {
+        desktop.setProgressBar(null, progress);
+      }
       desktop.setInBatchMode(false);
     }
   }
@@ -608,15 +625,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 +655,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 +717,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 +782,7 @@ public class Jalview
     {
       // delete temp file that we made - but only if it was successfully
       // executed
-      sfile.delete();
+      tfile.delete();
     }
   }