JAL-629 Move more stdout messages to stderr when outputting file to stdout
[jalview.git] / src / jalview / bin / Commands.java
index 3437bfd..17a1af2 100644 (file)
@@ -44,6 +44,9 @@ import jalview.io.FileLoader;
 import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.NewickFile;
+import jalview.io.exceptions.ImageOutputException;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.ColourSchemeProperty;
 import jalview.structure.StructureImportSettings.TFType;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.FileUtils;
@@ -100,6 +103,20 @@ public class Commands
         theseArgsWereParsed &= processLinked(id);
         processGroovyScript(id);
         boolean processLinkedOkay = theseArgsWereParsed;
+
+        // wait around until alignFrame isn't busy
+        AlignFrame af = afMap.get(id);
+        while (af != null && af.getViewport().isCalcInProgress())
+        {
+          try
+          {
+            Thread.sleep(25);
+          } catch (Exception q)
+          {
+          }
+          ;
+        }
+
         theseArgsWereParsed &= processImages(id);
         if (processLinkedOkay)
           theseArgsWereParsed &= processOutput(id);
@@ -107,7 +124,7 @@ public class Commands
         // close ap
         if (avm.getBoolean(Arg.CLOSE))
         {
-          AlignFrame af = afMap.get(id);
+          af = afMap.get(id);
           if (af != null)
           {
             af.closeMenuItem_actionPerformed(true);
@@ -249,7 +266,19 @@ public class Commands
                   Arg.COLOUR, sv, null, "DEFAULT_COLOUR_PROT", "");
           if ("" != colour)
           {
-            af.changeColour_actionPerformed(colour);
+            ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
+                    af.getViewport(), af.getViewport().getAlignment(),
+                    colour);
+
+            if (cs == null && !"None".equals(colour))
+            {
+              Console.warn(
+                      "Couldn't parse '" + colour + "' as a colourscheme.");
+            }
+            else
+            {
+              af.changeColour(cs);
+            }
             Jalview.testoutput(argParser, Arg.COLOUR, "zappo", colour);
           }
 
@@ -452,14 +481,6 @@ public class Commands
           Console.debug("Using structure file "
                   + structureFile.getAbsolutePath());
 
-          // ##### Does this need to happen? Follow
-          // openStructureFileForSequence() below
-          /*
-          PDBEntry fileEntry = new AssociatePdbFileWithSeq()
-                  .associatePdbWithSeq(structureFile.getAbsolutePath(),
-                          DataSourceType.FILE, seq, true, Desktop.instance);
-                          */
-
           // open structure view
           AlignmentPanel ap = af.alignPanel;
           if (headless)
@@ -505,15 +526,6 @@ public class Commands
                   Arg.NOTEMPFAC, subVals, null, "ADD_TEMPFACT_ANN", false,
                   true);
           TFType tft = notempfac ? null : TFType.DEFAULT;
-          /*
-          String tftString = subVals.get("tempfac");
-          ArgValue tftAv = getArgAssociatedWithStructure(Arg.TEMPFAC, avm,
-                  af, structureFilepath);
-          if (tftString == null && tftAv != null)
-          {
-            tftString = tftAv.getSubVals().getContent();
-          }
-          */
           if (tftString != null && !notempfac)
           {
             // get kind of temperature factor annotation
@@ -565,26 +577,58 @@ public class Commands
                           structureFilepath, tft, paeFilepath, false,
                           ssFromStructure, false, viewerType);
 
-          if (headless)
+          if (sv == null)
           {
-            sv.setAsync(false);
+            Console.error("Failed to import and open structure view.");
+            continue;
           }
-
+          try
+          {
+            long tries = 1000;
+            while (sv.isBusy() && tries > 0)
+            {
+              Thread.sleep(25);
+              if (sv.isBusy())
+              {
+                tries--;
+                Console.debug(
+                        "Waiting for viewer for " + structureFilepath);
+              }
+            }
+            if (tries == 0 && sv.isBusy())
+            {
+              Console.warn(
+                      "Gave up waiting for structure viewer to load. Something may have gone wrong.");
+            }
+          } catch (Exception x)
+          {
+            Console.warn("Exception whilst waiting for structure viewer "
+                    + structureFilepath, x);
+          }
+          Console.debug(
+                  "Successfully opened viewer for " + structureFilepath);
           String structureImageFilename = ArgParser.getValueFromSubValOrArg(
                   avm, av, Arg.STRUCTUREIMAGE, subVals);
           if (sv != null && structureImageFilename != null)
           {
+            ArgValue siAv = avm.getClosestNextArgValueOfArg(av,
+                    Arg.STRUCTUREIMAGE);
+            SubVals sisv = null;
+            if (structureImageFilename.equals(siAv.getValue()))
+            {
+              sisv = siAv.getSubVals();
+            }
             File structureImageFile = new File(structureImageFilename);
             String width = ArgParser.getValueFromSubValOrArg(avm, av,
-                    Arg.STRUCTUREIMAGEWIDTH, subVals);
+                    Arg.STRUCTUREIMAGEWIDTH, sisv);
             String height = ArgParser.getValueFromSubValOrArg(avm, av,
-                    Arg.STRUCTUREIMAGEHEIGHT, subVals);
+                    Arg.STRUCTUREIMAGEHEIGHT, sisv);
             String scale = ArgParser.getValueFromSubValOrArg(avm, av,
-                    Arg.STRUCTUREIMAGESCALE, subVals);
+                    Arg.STRUCTUREIMAGESCALE, sisv);
             String renderer = ArgParser.getValueFromSubValOrArg(avm, av,
-                    Arg.STRUCTUREIMAGETEXTRENDERER, subVals);
+                    Arg.STRUCTUREIMAGETEXTRENDERER, sisv);
             String typeS = ArgParser.getValueFromSubValOrArg(avm, av,
-                    Arg.STRUCTUREIMAGETYPE, subVals);
+                    Arg.STRUCTUREIMAGETYPE, sisv);
             if (typeS == null || typeS.length() == 0)
             {
               typeS = FileUtils.getExtension(structureImageFile);
@@ -602,12 +646,13 @@ public class Commands
             }
             BitmapImageSizing userBis = ImageMaker
                     .parseScaleWidthHeightStrings(scale, width, height);
+            // TODO MAKE THIS VIEWER INDEPENDENT!!
             switch (StructureViewer.getViewerType())
             {
             case JMOL:
               try
               {
-                Thread.sleep(1000);
+                Thread.sleep(1000); // WHY ???
               } catch (InterruptedException e)
               {
                 // TODO Auto-generated catch block
@@ -618,8 +663,20 @@ public class Commands
               if (sview instanceof AppJmol)
               {
                 AppJmol jmol = (AppJmol) sview;
-                jmol.makePDBImage(structureImageFile, imageType, renderer,
-                        userBis);
+                try
+                {
+                  Console.debug("Rendering image to " + structureImageFile);
+                  jmol.makePDBImage(structureImageFile, imageType, renderer,
+                          userBis);
+                  Console.debug("Finished Rendering image to "
+                          + structureImageFile);
+
+                } catch (ImageOutputException ioexc)
+                {
+                  Console.warn("Unexpected error whilst exporting image to "
+                          + structureImageFile, ioexc);
+                }
+
               }
               break;
             default:
@@ -727,54 +784,60 @@ public class Commands
         Cache.setProperty("EXPORT_EMBBED_BIOJSON", "false");
 
         Console.info("Writing " + file);
-
-        switch (type)
+        try
         {
-
-        case "svg":
-          Console.debug("Outputting type '" + type + "' to " + fileName);
-          af.createSVG(file, renderer);
-          break;
-
-        case "png":
-          Console.debug("Outputting type '" + type + "' to " + fileName);
-          af.createPNG(file, null, userBis);
-          break;
-
-        case "html":
-          Console.debug("Outputting type '" + type + "' to " + fileName);
-          HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
-          htmlSVG.exportHTML(fileName, renderer);
-          break;
-
-        case "biojs":
-          try
+          switch (type)
           {
-            BioJsHTMLOutput.refreshVersionInfo(
-                    BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
-          } catch (URISyntaxException e)
-          {
-            e.printStackTrace();
+
+          case "svg":
+            Console.debug("Outputting type '" + type + "' to " + fileName);
+            af.createSVG(file, renderer);
+            break;
+
+          case "png":
+            Console.debug("Outputting type '" + type + "' to " + fileName);
+            af.createPNG(file, null, userBis);
+            break;
+
+          case "html":
+            Console.debug("Outputting type '" + type + "' to " + fileName);
+            HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
+            htmlSVG.exportHTML(fileName, renderer);
+            break;
+
+          case "biojs":
+            Console.debug(
+                    "Creating BioJS MSA Viwer HTML file: " + fileName);
+            try
+            {
+              BioJsHTMLOutput.refreshVersionInfo(
+                      BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
+            } catch (URISyntaxException e)
+            {
+              e.printStackTrace();
+            }
+            BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
+            bjs.exportHTML(fileName);
+            break;
+
+          case "eps":
+            Console.debug("Creating EPS file: " + fileName);
+            af.createEPS(file, name);
+            break;
+
+          case "imagemap":
+            Console.debug("Creating ImageMap file: " + fileName);
+            af.createImageMap(file, name);
+            break;
+
+          default:
+            Console.warn(Arg.IMAGE.argString() + " type '" + type
+                    + "' not known. Ignoring");
+            break;
           }
-          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");
-          break;
+        } catch (Exception ioex)
+        {
+          Console.warn("Unexpected error during export", ioex);
         }
       }
     }
@@ -799,6 +862,7 @@ public class Commands
         String val = av.getValue();
         SubVals subVals = av.getSubVals();
         String fileName = subVals.getContent();
+        boolean stdout = ArgParser.STDOUTFILENAME.equals(fileName);
         File file = new File(fileName);
         boolean overwrite = ArgParser.getFromSubValArgOrPref(avm,
                 Arg.OVERWRITE, subVals, null, "OVERWRITE_OUTPUT", false);
@@ -811,7 +875,7 @@ public class Commands
                 !Platform.isHeadless());
 
         // if backups is not true then --overwrite must be specified
-        if (file.exists() && !(overwrite || backups))
+        if (file.exists() && !(overwrite || backups || stdout))
         {
           Console.error("Won't overwrite file '" + fileName + "' without "
                   + Arg.OVERWRITE.argString() + " or "
@@ -849,23 +913,30 @@ public class Commands
         }
         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(")");
+          if (stdout)
+          {
+            ff = FileFormat.Fasta;
           }
+          else
+          {
+            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;
+            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
@@ -876,7 +947,7 @@ public class Commands
 
         Console.info("Writing " + fileName);
 
-        af.saveAlignment(fileName, ff);
+        af.saveAlignment(fileName, ff, stdout);
         Console.debug("Returning backups to " + savedBackupsPreference);
         if (savedBackupsPreference != null)
           Cache.applicationProperties.put(BackupFiles.ENABLED,