Merge branch 'patch/JAL-3561_JAL-3660_fileformatexport_CLI' into releases/Release_2_1...
authorJim Procter <jprocter@issues.jalview.org>
Mon, 17 Aug 2020 15:25:07 +0000 (16:25 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Mon, 17 Aug 2020 15:25:07 +0000 (16:25 +0100)
1  2 
src/jalview/bin/Jalview.java

   */
  package jalview.bin;
  
+ import jalview.ext.so.SequenceOntology;
+ import jalview.gui.AlignFrame;
+ import jalview.gui.Desktop;
+ import jalview.gui.PromptUserConfig;
+ import jalview.io.AppletFormatAdapter;
+ import jalview.io.BioJsHTMLOutput;
+ import jalview.io.DataSourceType;
+ import jalview.io.FileFormat;
+ import jalview.io.FileFormatException;
+ import jalview.io.FileFormatI;
+ import jalview.io.FileFormats;
+ import jalview.io.FileLoader;
+ import jalview.io.HtmlSvgOutput;
+ import jalview.io.IdentifyFile;
+ import jalview.io.NewickFile;
+ import jalview.io.gff.SequenceOntologyFactory;
+ import jalview.schemes.ColourSchemeI;
+ import jalview.schemes.ColourSchemeProperty;
+ import jalview.util.MessageManager;
+ import jalview.util.Platform;
+ import jalview.ws.jws2.Jws2Discoverer;
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FileOutputStream;
@@@ -40,33 -62,13 +62,33 @@@ import java.util.HashMap
  import java.util.Map;
  import java.util.Vector;
  
 -import javax.swing.LookAndFeel;
  import javax.swing.UIManager;
 +import javax.swing.UIManager.LookAndFeelInfo;
  
  import com.threerings.getdown.util.LaunchUtil;
  
  import groovy.lang.Binding;
  import groovy.util.GroovyScriptEngine;
 +import jalview.ext.so.SequenceOntology;
 +import jalview.gui.AlignFrame;
 +import jalview.gui.Desktop;
 +import jalview.gui.PromptUserConfig;
 +import jalview.io.AppletFormatAdapter;
 +import jalview.io.BioJsHTMLOutput;
 +import jalview.io.DataSourceType;
 +import jalview.io.FileFormat;
 +import jalview.io.FileFormatException;
 +import jalview.io.FileFormatI;
 +import jalview.io.FileLoader;
 +import jalview.io.HtmlSvgOutput;
 +import jalview.io.IdentifyFile;
 +import jalview.io.NewickFile;
 +import jalview.io.gff.SequenceOntologyFactory;
 +import jalview.schemes.ColourSchemeI;
 +import jalview.schemes.ColourSchemeProperty;
 +import jalview.util.MessageManager;
 +import jalview.util.Platform;
 +import jalview.ws.jws2.Jws2Discoverer;
  
  /**
   * Main class for Jalview Application <br>
@@@ -182,7 -184,7 +204,7 @@@ public class Jalvie
     * main class for Jalview application
     * 
     * @param args
 -   *               open <em>filename</em>
 +   *          open <em>filename</em>
     */
    public static void main(String[] args)
    {
    {
      System.setSecurityManager(null);
      System.out
 -            .println("Java version: "
 -                    + System.getProperty("java.version"));
 +            .println("Java version: " + System.getProperty("java.version"));
      System.out.println("Java Home: " + System.getProperty("java.home"));
      System.out.println(System.getProperty("os.arch") + " "
              + System.getProperty("os.name") + " "
              + System.getProperty("os.version"));
      String val = System.getProperty("sys.install4jVersion");
 -    if (val != null) {
 -    System.out.println("Install4j version: " + val);
 +    if (val != null)
 +    {
 +      System.out.println("Install4j version: " + val);
      }
      val = System.getProperty("installer_template_version");
 -    if (val != null) {
 +    if (val != null)
 +    {
        System.out.println("Install4j template version: " + val);
      }
      val = System.getProperty("launcher_version");
 -    if (val != null) {
 +    if (val != null)
 +    {
        System.out.println("Launcher version: " + val);
      }
  
  
      desktop = null;
  
 -    try
 -    {
 -      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 -    } catch (Exception ex)
 -    {
 -      System.err.println("Unexpected Look and Feel Exception");
 -      ex.printStackTrace();
 -    }
 -    if (Platform.isAMac())
 -    {
 -
 -      LookAndFeel lookAndFeel = ch.randelshofer.quaqua.QuaquaManager
 -              .getLookAndFeel();
 -      System.setProperty("com.apple.mrj.application.apple.menu.about.name",
 -              "Jalview");
 -      System.setProperty("apple.laf.useScreenMenuBar", "true");
 -      if (lookAndFeel != null)
 -      {
 -        try
 -        {
 -          UIManager.setLookAndFeel(lookAndFeel);
 -        } catch (Throwable e)
 -        {
 -          System.err.println(
 -                  "Failed to set QuaQua look and feel: " + e.toString());
 -        }
 -      }
 -      if (lookAndFeel == null
 -              || !(lookAndFeel.getClass().isAssignableFrom(
 -                      UIManager.getLookAndFeel().getClass()))
 -              || !UIManager.getLookAndFeel().getClass().toString()
 -                      .toLowerCase().contains("quaqua"))
 -      {
 -        try
 -        {
 -          System.err.println(
 -                  "Quaqua LaF not available on this plaform. Using VAqua(4).\nSee https://issues.jalview.org/browse/JAL-2976");
 -          UIManager.setLookAndFeel("org.violetlib.aqua.AquaLookAndFeel");
 -        } catch (Throwable e)
 -        {
 -          System.err.println(
 -                  "Failed to reset look and feel: " + e.toString());
 -        }
 -      }
 -    }
 +    setLookAndFeel();
  
      /*
       * configure 'full' SO model if preferences say to, else use the default (SO
  
      if (!headless)
      {
 +
        desktop = new Desktop();
        desktop.setInBatchMode(true); // indicate we are starting up
  
          JalviewTaskbar.setTaskbar(this);
        } catch (Exception e)
        {
 -        System.out.println("Cannot set Taskbar");
 +        Cache.log.info("Cannot set Taskbar");
 +        Cache.log.error(e.getMessage());
          // e.printStackTrace();
        } catch (Throwable t)
        {
 -        System.out.println("Cannot set Taskbar");
 +        Cache.log.info("Cannot set Taskbar");
 +        Cache.log.error(t.getMessage());
          // t.printStackTrace();
        }
  
              af.createEPS(outputFile);
              continue;
            }
-           if (af.saveAlignment(file, format))
-           {
-             System.out.println("Written alignment in " + format
-                     + " format to " + file);
+           FileFormatI outFormat=null;
+           try {
+             outFormat = FileFormats.getInstance().forName(outputFormat);
+           } catch (Exception formatP) {
+             System.out.println("Couldn't parse "+outFormat+" as a valid Jalview format string.");
            }
-           else
+           if (outFormat != null)
            {
-             System.out.println("Error writing file " + file + " in "
-                     + format + " format!!");
+             if (!outFormat.isWritable())
+             {
+               System.out.println(
+                       "This version of Jalview does not support alignment export as "
+                               + outputFormat);
+             }
+             else
+             {
+               if (af.saveAlignment(file, outFormat))
+               {
+                 System.out.println("Written alignment in " + format
+                         + " format to " + file);
+               }
+               else
+               {
+                 System.out.println("Error writing file " + file + " in "
+                         + format + " format!!");
+               }
+             }
            }
          }
  
          while (aparser.getSize() > 0)
      }
    }
  
 +  private static void setLookAndFeel()
 +  {
 +    // property laf = "crossplatform", "system", "gtk", "metal", "nimbus" or
 +    // "mac"
 +    // If not set (or chosen laf fails), use the normal SystemLaF and if on Mac,
 +    // try Quaqua/Vaqua.
 +    String lafProp = System.getProperty("laf");
 +    String lafSetting = Cache.getDefault("PREFERRED_LAF", null);
 +    String laf = "none";
 +    if (lafProp != null)
 +    {
 +      laf = lafProp;
 +    }
 +    else if (lafSetting != null)
 +    {
 +      laf = lafSetting;
 +    }
 +    boolean lafSet = false;
 +    switch (laf)
 +    {
 +    case "crossplatform":
 +      lafSet = setCrossPlatformLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "system":
 +      lafSet = setSystemLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "gtk":
 +      lafSet = setGtkLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "metal":
 +      lafSet = setMetalLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "nimbus":
 +      lafSet = setNimbusLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "quaqua":
 +      lafSet = setQuaquaLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "vaqua":
 +      lafSet = setVaquaLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "mac":
 +      lafSet = setMacLookAndFeel();
 +      if (!lafSet)
 +      {
 +        Cache.log.error("Could not set requested laf=" + laf);
 +      }
 +      break;
 +    case "none":
 +      break;
 +    default:
 +      Cache.log.error("Requested laf=" + laf + " not implemented");
 +    }
 +    if (!lafSet)
 +    {
 +      setSystemLookAndFeel();
 +      if (Platform.isLinux())
 +      {
 +        setMetalLookAndFeel();
 +      }
 +      if (Platform.isAMac())
 +      {
 +        setMacLookAndFeel();
 +      }
 +    }
 +  }
 +
 +  private static boolean setCrossPlatformLookAndFeel()
 +  {
 +    return setGenericLookAndFeel(false);
 +  }
 +
 +  private static boolean setSystemLookAndFeel()
 +  {
 +    return setGenericLookAndFeel(true);
 +  }
 +
 +  private static boolean setGenericLookAndFeel(boolean system)
 +  {
 +    boolean set = false;
 +    try
 +    {
 +      UIManager.setLookAndFeel(
 +              system ? UIManager.getSystemLookAndFeelClassName()
 +                      : UIManager.getCrossPlatformLookAndFeelClassName());
 +      set = true;
 +    } catch (Exception ex)
 +    {
 +      Cache.log.error("Unexpected Look and Feel Exception");
 +      Cache.log.error(ex.getMessage());
 +      Cache.log.debug(Cache.getStackTraceString(ex));
 +    }
 +    return set;
 +  }
 +
 +  private static boolean setSpecificLookAndFeel(String name,
 +          String className, boolean nameStartsWith)
 +  {
 +    boolean set = false;
 +    try
 +    {
 +      for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
 +      {
 +        if (info.getName() != null && nameStartsWith
 +                ? info.getName().toLowerCase()
 +                        .startsWith(name.toLowerCase())
 +                : info.getName().toLowerCase().equals(name.toLowerCase()))
 +        {
 +          className = info.getClassName();
 +          break;
 +        }
 +      }
 +      UIManager.setLookAndFeel(className);
 +      set = true;
 +    } catch (Exception ex)
 +    {
 +      Cache.log.error("Unexpected Look and Feel Exception");
 +      Cache.log.error(ex.getMessage());
 +      Cache.log.debug(Cache.getStackTraceString(ex));
 +    }
 +    return set;
 +  }
 +
 +  private static boolean setGtkLookAndFeel()
 +  {
 +    return setSpecificLookAndFeel("gtk",
 +            "com.sun.java.swing.plaf.gtk.GTKLookAndFeel", true);
 +  }
 +
 +  private static boolean setMetalLookAndFeel()
 +  {
 +    return setSpecificLookAndFeel("metal",
 +            "javax.swing.plaf.metal.MetalLookAndFeel", false);
 +  }
 +
 +  private static boolean setNimbusLookAndFeel()
 +  {
 +    return setSpecificLookAndFeel("nimbus",
 +            "javax.swing.plaf.nimbus.NimbusLookAndFeel", false);
 +  }
 +
 +  private static boolean setQuaquaLookAndFeel()
 +  {
 +    return setSpecificLookAndFeel("quaqua",
 +            ch.randelshofer.quaqua.QuaquaManager.getLookAndFeel().getClass()
 +                    .getName(),
 +            false);
 +  }
 +
 +  private static boolean setVaquaLookAndFeel()
 +  {
 +    return setSpecificLookAndFeel("vaqua",
 +            "org.violetlib.aqua.AquaLookAndFeel", false);
 +  }
 +
 +  private static boolean setMacLookAndFeel()
 +  {
 +    boolean set = false;
 +    System.setProperty("com.apple.mrj.application.apple.menu.about.name",
 +            "Jalview");
 +    System.setProperty("apple.laf.useScreenMenuBar", "true");
 +    set = setQuaquaLookAndFeel();
 +    if ((!set) || !UIManager.getLookAndFeel().getClass().toString()
 +            .toLowerCase().contains("quaqua"))
 +    {
 +      set = setVaquaLookAndFeel();
 +    }
 +    return set;
 +  }
 +
    private static void showUsage()
    {
      System.out.println(
                      + "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n"
                      + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n"
                      + "-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"
 +                    + "-jvmmempc=PERCENT\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to PERCENT% of total physical memory detected. This defaults to 90 if total physical memory can be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
 +                    + "-jvmmemmax=MAXMEMORY\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to MAXMEMORY. MAXMEMORY can be specified in bytes, kilobytes(k), megabytes(m), gigabytes(g) or if you're lucky enough, terabytes(t). This defaults to 32g if total physical memory can be detected, or to 8g if total physical memory cannot be detected. See https://www.jalview.org/help/html/memory.html for more details.\n"
                      + "\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n");
    }
  
     * Locate the given string as a file and pass it to the groovy interpreter.
     * 
     * @param groovyscript
 -   *                         the script to execute
 +   *          the script to execute
     * @param jalviewContext
 -   *                         the Jalview Desktop object passed in to the groovy
 -   *                         binding as the 'Jalview' object.
 +   *          the Jalview Desktop object passed in to the groovy binding as the
 +   *          'Jalview' object.
     */
    private void executeGroovyScript(String groovyscript, AlignFrame af)
    {
    }
  
    /**
 -   * Quit method delegates to Desktop.quit - unless running in headless mode when
 -   * it just ends the JVM
 +   * Quit method delegates to Desktop.quit - unless running in headless mode
 +   * when it just ends the JVM
     */
    public void quit()
    {