+ 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();
+ boolean stdout = ArgParser.STDOUTFILENAME.equals(fileName);
+ 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 || stdout))
+ {
+ 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)
+ {
+ 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
+ .getDefault(BackupFiles.ENABLED, null);
+ Console.debug("Setting backups to " + backups);
+ Cache.applicationProperties.put(BackupFiles.ENABLED,
+ Boolean.toString(backups));
+
+ Console.info("Writing " + fileName);
+
+ af.saveAlignment(fileName, ff, stdout);
+ 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, ArgValuesMap avm,
+ ArgValue av)
+ {
+ SubVals subVals = av.getSubVals();
+ ArgValue idAv = avm.getClosestNextArgValueOfArg(av, Arg.SEQID);
+ SequenceI seq = null;
+ if (subVals == null && idAv == null)
+ return null;
+ if (af == null || af.getCurrentView() == null)
+ {
+ return null;
+ }