JAL-4279 move on if the file doesn't exist, or Identify fails for the file.
[jalview.git] / src / jalview / bin / Commands.java
index cdfb67a..8164182 100644 (file)
@@ -6,7 +6,6 @@ import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -67,6 +66,8 @@ public class Commands
 
   private Map<String, AlignFrame> afMap;
 
+  private Map<String, List<StructureViewer>> svMap;
+
   private boolean commandArgsProvided = false;
 
   private boolean argsWereParsed = false;
@@ -82,16 +83,15 @@ public class Commands
     headless = h;
     desktop = d;
     afMap = new HashMap<>();
-    if (argparser != null)
-    {
-      processArgs(argparser, headless);
-    }
   }
 
-  private boolean processArgs(ArgParser argparser, boolean h)
+  protected boolean processArgs()
   {
-    argParser = argparser;
-    headless = h;
+    if (argParser == null)
+    {
+      return true;
+    }
+
     boolean theseArgsWereParsed = false;
 
     if (argParser != null && argParser.getLinkedIds() != null)
@@ -100,9 +100,10 @@ public class Commands
       {
         ArgValuesMap avm = argParser.getLinkedArgs(id);
         theseArgsWereParsed = true;
-        theseArgsWereParsed &= processLinked(id);
+        boolean processLinkedOkay = processLinked(id);
+        theseArgsWereParsed &= processLinkedOkay;
+
         processGroovyScript(id);
-        boolean processLinkedOkay = theseArgsWereParsed;
 
         // wait around until alignFrame isn't busy
         AlignFrame af = afMap.get(id);
@@ -118,8 +119,11 @@ public class Commands
         }
 
         theseArgsWereParsed &= processImages(id);
+
         if (processLinkedOkay)
+        {
           theseArgsWereParsed &= processOutput(id);
+        }
 
         // close ap
         if (avm.getBoolean(Arg.CLOSE))
@@ -154,11 +158,6 @@ public class Commands
     return argsWereParsed;
   }
 
-  protected boolean processUnlinked(String id)
-  {
-    return processLinked(id);
-  }
-
   protected boolean processLinked(String id)
   {
     boolean theseArgsWereParsed = false;
@@ -166,13 +165,9 @@ public class Commands
     if (avm == null)
       return true;
 
-    /*
-     * // script to execute after all loading is completed one way or another String
-     * groovyscript = m.get(Arg.GROOVY) == null ? null :
-     * m.get(Arg.GROOVY).getValue(); String file = m.get(Arg.OPEN) == null ? null :
-     * m.get(Arg.OPEN).getValue(); String data = null; FileFormatI format = null;
-     * DataSourceType protocol = null;
-     */
+    // set wrap scope here so it can be applied after structures are opened
+    boolean wrap = false;
+
     if (avm.containsArg(Arg.APPEND) || avm.containsArg(Arg.OPEN))
     {
       commandArgsProvided = true;
@@ -222,6 +217,7 @@ public class Commands
             if (!(new File(openFile)).exists())
             {
               Console.warn("Can't find file '" + openFile + "'");
+              continue;
             }
           }
         }
@@ -236,6 +232,7 @@ public class Commands
         } catch (FileFormatException e1)
         {
           Console.error("Unknown file format for '" + openFile + "'");
+          continue;
         }
 
         af = afMap.get(id);
@@ -252,14 +249,24 @@ public class Commands
           Console.debug(
                   "Opening '" + openFile + "' in new alignment frame");
           FileLoader fileLoader = new FileLoader(!headless);
-
-          af = fileLoader.LoadFileWaitTillLoaded(openFile, protocol,
-                  format);
-
-          // wrap alignment?
-          boolean wrap = ArgParser.getFromSubValArgOrPref(avm, Arg.WRAP, sv,
-                  null, "WRAP_ALIGNMENT", false);
-          af.getCurrentView().setWrapAlignment(wrap);
+          boolean xception=false;
+          try {
+            af = fileLoader.LoadFileWaitTillLoaded(openFile, protocol,
+                    format);
+          } catch (Throwable thr)
+          {
+            xception=true;
+            Console.error("Couldn't open '"+openFile+"' as "+format+" "+thr.getLocalizedMessage()+ " (Enable debug for full stack trace)");
+            Console.debug("Exception when opening '"+openFile+"'",thr);
+          }
+          finally
+          {
+            if (af==null && !xception)
+            {
+              Console.info("Ignoring '"+openFile+"' - no alignment data found.");
+              continue;
+            }
+          }
 
           // colour alignment?
           String colour = ArgParser.getFromSubValArgOrPref(avm, av,
@@ -365,6 +372,12 @@ public class Commands
                     false, false);
           }
 
+          // wrap alignment? do this last for formatting reasons
+          wrap = ArgParser.getFromSubValArgOrPref(avm, Arg.WRAP, sv, null,
+                  "WRAP_ALIGNMENT", false);
+          // af.setWrapFormat(wrap) is applied after structures are opened for
+          // annotation reasons
+
           // store the AlignFrame for this id
           afMap.put(id, af);
 
@@ -556,20 +569,7 @@ public class Commands
           String sViewer = ArgParser.getFromSubValArgOrPref(avm,
                   Arg.STRUCTUREVIEWER, Position.AFTER, av, subVals, null,
                   null, "jmol");
-          ViewerType viewerType = null;
-          if (!"none".equals(sViewer))
-          {
-            for (ViewerType v : EnumSet.allOf(ViewerType.class))
-            {
-              String name = v.name().toLowerCase(Locale.ROOT)
-                      .replaceAll(" ", "");
-              if (sViewer.equals(name))
-              {
-                viewerType = v;
-                break;
-              }
-            }
-          }
+          ViewerType viewerType = ViewerType.getFromString(sViewer);
 
           // TODO use ssFromStructure
           StructureViewer sv = StructureChooser
@@ -605,6 +605,18 @@ public class Commands
             Console.warn("Exception whilst waiting for structure viewer "
                     + structureFilepath, x);
           }
+
+          // add StructureViewer to svMap list
+          if (svMap == null)
+          {
+            svMap = new HashMap<>();
+          }
+          if (svMap.get(id) == null)
+          {
+            svMap.put(id, new ArrayList<>());
+          }
+          svMap.get(id).add(sv);
+
           Console.debug(
                   "Successfully opened viewer for " + structureFilepath);
           String structureImageFilename = ArgParser.getValueFromSubValOrArg(
@@ -650,14 +662,6 @@ public class Commands
             switch (StructureViewer.getViewerType())
             {
             case JMOL:
-              try
-              {
-                Thread.sleep(1000); // WHY ???
-              } catch (InterruptedException e)
-              {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-              }
               JalviewStructureDisplayI sview = sv
                       .getJalviewStructureDisplay();
               if (sview instanceof AppJmol)
@@ -689,6 +693,15 @@ public class Commands
       }
     }
 
+    if (wrap)
+    {
+      AlignFrame af = afMap.get(id);
+      if (af != null)
+      {
+        af.setWrapFormat(wrap, true);
+      }
+    }
+
     /*
     boolean doShading = avm.getBoolean(Arg.TEMPFAC_SHADING);
     if (doShading)
@@ -862,6 +875,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);
@@ -874,7 +888,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 "
@@ -912,23 +926,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(")");
-          }
-
-          Jalview.exit("No valid format specified for "
-                  + Arg.OUTPUT.argString() + ". Valid formats are "
-                  + validSB.toString() + ".", 1);
-          // this return really shouldn't happen
-          return false;
+          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;
+          }
         }
 
         String savedBackupsPreference = Cache
@@ -939,7 +960,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,
@@ -995,4 +1016,32 @@ public class Commands
     }
     return seq;
   }
+
+  public AlignFrame[] getAlignFrames()
+  {
+    AlignFrame[] afs = null;
+    if (afMap != null)
+    {
+      afs = (AlignFrame[]) afMap.values().toArray();
+    }
+
+    return afs;
+  }
+
+  public List<StructureViewer> getStructureViewers()
+  {
+    List<StructureViewer> svs = null;
+    if (svMap != null)
+    {
+      for (List<StructureViewer> svList : svMap.values())
+      {
+        if (svs == null)
+        {
+          svs = new ArrayList<>();
+        }
+        svs.addAll(svList);
+      }
+    }
+    return svs;
+  }
 }