JAL-629 added eps and imagemap. Added --output and --format with test. Adjusted...
[jalview.git] / src / jalview / bin / Commands.java
index f33202d..79b6ab6 100644 (file)
@@ -2,6 +2,7 @@ package jalview.bin;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -31,10 +32,13 @@ import jalview.gui.StructureChooser;
 import jalview.gui.StructureViewer;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.io.AppletFormatAdapter;
+import jalview.io.BackupFiles;
+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;
@@ -87,15 +91,11 @@ public class Commands
       {
         ArgValuesMap avm = argParser.getLinkedArgs(id);
         theseArgsWereParsed = true;
-        if (id == null)
-        {
-          theseArgsWereParsed &= processUnlinked(id);
-        }
-        else
-        {
-          theseArgsWereParsed &= processLinked(id);
-        }
+        theseArgsWereParsed &= processLinked(id);
+        boolean processLinkedOkay = theseArgsWereParsed;
         theseArgsWereParsed &= processImages(id);
+        if (processLinkedOkay)
+          theseArgsWereParsed &= processOutput(id);
 
         // close ap
         if (avm.getBoolean(Arg.CLOSE))
@@ -252,8 +252,8 @@ public class Commands
           af.getCurrentView().setWrapAlignment(wrap);
 
           // colour aligment?
-          String colour = ArgParser.getFromSubValArgOrPref(avm, Arg.COLOUR,
-                  sv, null, "DEFAULT_COLOUR_PROT", "");
+          String colour = ArgParser.getFromSubValArgOrPref(avm, av,
+                  Arg.COLOUR, sv, null, "DEFAULT_COLOUR_PROT", "");
 
           if ("" != colour)
           {
@@ -261,8 +261,8 @@ public class Commands
           }
 
           // change alignment frame title
-          String title = ArgParser.getFromSubValArgOrPref(avm, Arg.TITLE,
-                  sv, null, null, null);
+          String title = ArgParser.getFromSubValArgOrPref(avm, av,
+                  Arg.TITLE, sv, null, null, null);
           if (title != null)
             af.setTitle(title);
 
@@ -586,16 +586,18 @@ public class Commands
       {
         String val = av.getValue();
         SubVals subVal = av.getSubVals();
-        String type = "png"; // default
         String fileName = subVal.getContent();
         File file = new File(fileName);
-        if (subVal.has("type"))
-        {
-          type = subVal.get("type");
-        }
-        else if (fileName != null)
+        String name = af.getName();
+        String renderer = ArgParser.getValueFromSubValOrArg(avm, av,
+                Arg.RENDERER, subVal);
+        if (renderer == null)
+          renderer = "text";
+        String type = "png"; // default
+        type = ArgParser.getValueFromSubValOrArg(avm, av, Arg.TYPE, subVal);
+        if (type == null && fileName != null)
         {
-          for (String ext : new String[] { "svg", "png", "html" })
+          for (String ext : new String[] { "svg", "png", "html", "eps" })
           {
             if (fileName.toLowerCase(Locale.ROOT).endsWith("." + ext))
             {
@@ -609,19 +611,47 @@ public class Commands
 
         switch (type)
         {
+
         case "svg":
           Console.debug("Outputting type '" + type + "' to " + fileName);
-          af.createSVG(file);
+          af.createSVG(file, renderer);
           break;
+
         case "png":
           Console.debug("Outputting type '" + type + "' to " + fileName);
           af.createPNG(file);
           break;
+
         case "html":
           Console.debug("Outputting type '" + type + "' to " + fileName);
           HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
-          htmlSVG.exportHTML(fileName);
+          htmlSVG.exportHTML(fileName, renderer);
+          break;
+
+        case "biojs":
+          try
+          {
+            BioJsHTMLOutput.refreshVersionInfo(
+                    BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
+          } catch (URISyntaxException e)
+          {
+            e.printStackTrace();
+          }
+          BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
+          bjs.exportHTML(fileName);
+          Console.debug("Creating BioJS MSA Viwer HTML file: " + fileName);
           break;
+
+        case "eps":
+          af.createEPS(file, name);
+          Console.debug("Creating EPS file: " + fileName);
+          break;
+
+        case "imagemap":
+          af.createImageMap(file, name);
+          Console.debug("Creating ImageMap file: " + fileName);
+          break;
+
         default:
           Console.warn(Arg.IMAGE.argString() + " type '" + type
                   + "' not known. Ignoring");
@@ -632,6 +662,119 @@ public class Commands
     return true;
   }
 
+  protected boolean processOutput(String id)
+  {
+    ArgValuesMap avm = argParser.getLinkedArgs(id);
+    AlignFrame af = afMap.get(id);
+
+    if (af == null)
+    {
+      Console.warn("Did not have an alignment window for id=" + id);
+      return false;
+    }
+
+    if (avm.containsArg(Arg.OUTPUT))
+    {
+      for (ArgValue av : avm.getArgValueList(Arg.OUTPUT))
+      {
+        String val = av.getValue();
+        SubVals subVals = av.getSubVals();
+        String fileName = subVals.getContent();
+        File file = new File(fileName);
+        boolean overwrite = ArgParser.getFromSubValArgOrPref(avm,
+                Arg.OVERWRITE, subVals, null, "OVERWRITE_OUTPUT", false);
+        // backups. Use the Arg.BACKUPS or subval "backups" setting first,
+        // otherwise if headless assume false, if not headless use the user
+        // preference with default true.
+        boolean backups = ArgParser.getFromSubValArgOrPref(avm, Arg.BACKUPS,
+                subVals, null,
+                Platform.isHeadless() ? null : BackupFiles.ENABLED,
+                !Platform.isHeadless());
+
+        // if backups is not true then --overwrite must be specified
+        if (file.exists() && !(overwrite || backups))
+        {
+          Console.error("Won't overwrite file '" + fileName + "' without "
+                  + Arg.OVERWRITE.argString() + " or "
+                  + Arg.BACKUPS.argString() + " set");
+          return false;
+        }
+
+        String name = af.getName();
+        String format = ArgParser.getValueFromSubValOrArg(avm, av,
+                Arg.FORMAT, subVals);
+        FileFormats ffs = FileFormats.getInstance();
+        List<String> validFormats = ffs.getWritableFormats(false);
+
+        FileFormatI ff = null;
+        if (format == null && fileName != null)
+        {
+          FORMAT: for (String fname : validFormats)
+          {
+            FileFormatI tff = ffs.forName(fname);
+            String[] extensions = tff.getExtensions().split(",");
+            for (String ext : extensions)
+            {
+              if (fileName.toLowerCase(Locale.ROOT).endsWith("." + ext))
+              {
+                ff = tff;
+                format = ff.getName();
+                break FORMAT;
+              }
+            }
+          }
+        }
+        if (ff == null && format != null)
+        {
+          ff = ffs.forName(format);
+        }
+        if (ff == null)
+        {
+          StringBuilder validSB = new StringBuilder();
+          for (String f : validFormats)
+          {
+            if (validSB.length() > 0)
+              validSB.append(", ");
+            validSB.append(f);
+            FileFormatI tff = ffs.forName(f);
+            validSB.append(" (");
+            validSB.append(tff.getExtensions());
+            validSB.append(")");
+          }
+
+          Jalview.exit("No valid format specified for "
+                  + Arg.OUTPUT.argString() + ". Valid formats are "
+                  + validSB.toString() + ".", 1);
+          // this return really shouldn't happen
+          return false;
+        }
+
+        String savedBackupsPreference = Cache
+                .getDefault(BackupFiles.ENABLED, null);
+        Console.debug("Setting backups to " + backups);
+        Cache.applicationProperties.put(BackupFiles.ENABLED,
+                Boolean.toString(backups));
+        af.saveAlignment(fileName, ff);
+        Console.debug("Returning backups to " + savedBackupsPreference);
+        if (savedBackupsPreference != null)
+          Cache.applicationProperties.put(BackupFiles.ENABLED,
+                  savedBackupsPreference);
+        if (af.isSaveAlignmentSuccessful())
+        {
+          Console.debug("Written alignment '" + name + "' in "
+                  + ff.getName() + " format to " + file);
+        }
+        else
+        {
+          Console.warn("Error writing file " + file + " in " + ff.getName()
+                  + " format!");
+        }
+
+      }
+    }
+    return true;
+  }
+
   private SequenceI getSpecifiedSequence(AlignFrame af, SubVals subId)
   {
     if (subId == null)
@@ -677,9 +820,6 @@ public class Commands
             else
             {
               structfile = likelyStructure.getValue();
-              Console.debug(
-                      "##### Comparing closest previous structure argument '"
-                              + structfile + "'");
             }
           }
         }