update author list in license for (JAL-826)
[jalview.git] / src / jalview / bin / Jalview.java
index b599f0f..272250e 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
- * 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, J Engelhardt, LM Lui, 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;
@@ -81,8 +83,9 @@ public class Jalview
             + System.getProperty("os.version"));
     if (new Platform().isAMac())
     {
-       System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Jalview");
-       System.setProperty("apple.laf.useScreenMenuBar", "true");
+      System.setProperty("com.apple.mrj.application.apple.menu.about.name",
+              "Jalview");
+      System.setProperty("apple.laf.useScreenMenuBar", "true");
     }
 
     ArgsParser aparser = new ArgsParser(args);
@@ -247,7 +250,7 @@ public class Jalview
       {
         try
         {
-          String viprotocol = Jalview.checkProtocol(vamsasImport);
+          String viprotocol = jalview.io.AppletFormatAdapter.checkProtocol(vamsasImport);
           if (viprotocol == jalview.io.FormatAdapter.FILE)
           {
             inSession = desktop.vamsasImport(new File(vamsasImport));
@@ -315,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://"))
@@ -332,7 +340,7 @@ public class Jalview
         }
       }
 
-      protocol = checkProtocol(file);
+      protocol = jalview.io.AppletFormatAdapter.checkProtocol(file);
 
       format = new jalview.io.IdentifyFile().Identify(file, protocol);
 
@@ -368,20 +376,20 @@ public class Jalview
       data = aparser.getValue("groups", true);
       if (data != null)
       {
-        af.parseFeaturesFile(data, checkProtocol(data));
+        af.parseFeaturesFile(data, jalview.io.AppletFormatAdapter.checkProtocol(data));
         System.out.println("Added " + data);
       }
       data = aparser.getValue("features", true);
       if (data != null)
       {
-        af.parseFeaturesFile(data, checkProtocol(data));
+        af.parseFeaturesFile(data, jalview.io.AppletFormatAdapter.checkProtocol(data));
         System.out.println("Added " + data);
       }
 
       data = aparser.getValue("annotations", true);
       if (data != null)
       {
-        af.loadJalviewDataFile(data);
+        af.loadJalviewDataFile(data, null, null, null);
         System.out.println("Added " + data);
       }
       // set or clear the sortbytree flag.
@@ -399,7 +407,7 @@ public class Jalview
         jalview.io.NewickFile fin = null;
         try
         {
-          fin = new jalview.io.NewickFile(data, checkProtocol(data));
+          fin = new jalview.io.NewickFile(data, jalview.io.AppletFormatAdapter.checkProtocol(data));
           if (fin != null)
           {
             af.getViewport().setCurrentTree(
@@ -412,7 +420,7 @@ public class Jalview
           ex.printStackTrace(System.err);
         }
       }
-      // todo - load PDB structure to alignment
+      // TODO - load PDB structure(s) to alignment JAL-629
       // (associate with identical sequence in alignment, or a specified
       // sequence)
 
@@ -441,7 +449,7 @@ public class Jalview
         if (jalview.bin.Cache.groovyJarsPresent())
         {
           System.out.println("Executing script " + groovyscript);
-          executeGroovyScript(groovyscript, desktop);
+          executeGroovyScript(groovyscript, new Object[] {desktop,af});
         }
         else
         {
@@ -503,8 +511,15 @@ public class Jalview
             && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true))
     {
       file = jalview.bin.Cache.getDefault("STARTUP_FILE",
-              "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)
@@ -543,7 +558,7 @@ public class Jalview
       if (jalview.bin.Cache.groovyJarsPresent())
       {
         System.out.println("Executing script " + groovyscript);
-        executeGroovyScript(groovyscript, desktop);
+        executeGroovyScript(groovyscript, new Object[] { desktop, startUpAlframe});
       }
       else
       {
@@ -553,8 +568,11 @@ public class Jalview
       }
     }
     // and finally, turn off batch mode indicator - if the desktop still exists
-    if (desktop!=null)
+    if (desktop != null)
     {
+      if (progress!=-1) {
+        desktop.setProgressBar(null, progress);
+      }
       desktop.setInBatchMode(false);
     }
   }
@@ -600,22 +618,29 @@ public class Jalview
    *          'Jalview' object.
    */
   private static void executeGroovyScript(String groovyscript,
-          Object jalviewContext)
+          Object[] jalviewContext)
   {
     if (jalviewContext == null)
     {
       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;
@@ -630,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
@@ -669,25 +715,61 @@ public class Jalview
        * = new Binding(); binding.setVariable("input", "world");
        * gse.run("hello.groovy", binding); </code>
        */
-      ClassLoader cl = jalviewContext.getClass().getClassLoader();
+      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;
+      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",
-              new Class[]
-              { String.class, Object.class });
-      setvar.invoke(gbinding, new Object[]
-      { "Jalview", jalviewContext });
+      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)
     {
@@ -700,7 +782,7 @@ public class Jalview
     {
       // delete temp file that we made - but only if it was successfully
       // executed
-      sfile.delete();
+      tfile.delete();
     }
   }
 
@@ -790,17 +872,6 @@ public class Jalview
     }
     return ff;
   }
-
-  private static String checkProtocol(String file)
-  {
-    String protocol = jalview.io.FormatAdapter.FILE;
-
-    if (file.indexOf("http:") > -1 || file.indexOf("file:") > -1)
-    {
-      protocol = jalview.io.FormatAdapter.URL;
-    }
-    return protocol;
-  }
 }
 
 /**