jalview.release=releases/Release_2_11_3_Branch
-jalview.version=2.11.3.1
+jalview.version=2.11.3.2
--- /dev/null
+---
+version: 2.11.3.2
+date: 2023-12-01
+channel: "release"
+---
+
+## New Features
+
+## Issues Resolved
+
+- <!-- JAL-4344 --> --structureimage exports an image without the fully rendered structure when run via CLI (known defect since 2.11.3.0)
+- <!-- JAL-4165 --> Missing last letter when copying consensus sequence from alignment after applying filter (known defect affecting 2.10.4 onwards)
+- <!-- JAL-4342 --> export all alignment annotation as CSV produces an empty file or cut'n'paste text box
+
+
--- /dev/null
+The 2.11.3.2 release addresses a handful of minor defects and known issues, and
+fixes a critical bug affecting structure viewer image export when jalview is
+run as a command line tool on native and conda-based installations.
{
private final static String startClass = "jalview.bin.Jalview";
+ // not setting this yet due to problem with Jmol
private final static String headlessProperty = "java.awt.headless";
+ // used for headless macOS
+ private final static String macosHeadlessProperty = "apple.awt.UIElement";
+
+ // arguments that assume headless mode
+ private final static String[] assumeHeadlessArgs = { "headless", "output",
+ "image", "structureimage" };
+
/**
* main method for jalview.bin.Launcher. This restarts the same JRE's JVM with
* the same arguments but with memory adjusted based on extracted -jvmmempc
boolean wait = true;
boolean quiet = false;
boolean headless = false;
+ boolean assumeheadless = false;
boolean gui = false;
+ boolean help = false;
boolean stdout = false;
// must set --debug before --launcher...
boolean launcherstop = false;
boolean launcherwait = false;
ArrayList<String> arguments = new ArrayList<>();
String previousArg = null;
+ // set debug first
for (String arg : args)
{
if (arg.equals("--debug"))
{
debug = true;
}
+ }
+ for (String arg : args)
+ {
if (arg.equals("--quiet"))
{
quiet = true;
}
- if (arg.equals("--headless"))
- {
- headless = true;
- }
- if (arg.equals("--gui"))
+ else if (arg.equals("--gui"))
{
gui = true;
}
- if (arg.equals("--output=-")
- || (arg.equals("-") && "--output".equals(previousArg)))
+ else if (arg.equals("--help"))
{
- stdout = true;
+ help = true;
}
- if (debug && arg.equals("--launcherprint"))
+ else if (arg.equals("--version"))
{
- launcherprint = true;
+ help = true;
}
- if (debug && arg.equals("--launcherstop"))
+
+ if (!assumeheadless)
{
- launcherstop = true;
+ for (String a : assumeHeadlessArgs)
+ {
+ if (arg.equals("--" + a) || arg.startsWith("--" + a + "="))
+ {
+ assumeheadless = true;
+ }
+ }
}
- if (debug && arg.equals("--launcherwait"))
+
+ if (arg.equals("--output=-")
+ || (arg.equals("-") && "--output".equals(previousArg)))
{
- launcherwait = true;
+ stdout = true;
}
- // this ends the launcher immediately
- if (debug && arg.equals("--launchernowait"))
+
+ if (debug)
{
- wait = false;
+ if (arg.equals("--launcherprint"))
+ {
+ launcherprint = true;
+ }
+ else if (arg.equals("--launcherstop"))
+ {
+ launcherstop = true;
+ }
+ else if (arg.equals("--launcherwait"))
+ {
+ launcherwait = true;
+ }
+ else
+ // this ends the launcher immediately
+ if (arg.equals("--launchernowait"))
+ {
+ wait = false;
+ }
}
previousArg = arg;
// Don't add the --launcher... args to Jalview launch
arguments.add(arg);
}
}
- if (gui)
+ if (help)
+ {
+ // --help takes precedence over --gui
+ headless = true;
+ }
+ else if (gui)
{
// --gui takes precedence over --headless
headless = false;
}
+ else
+ {
+ // --output arguments assume headless mode
+ headless = assumeheadless;
+ }
final String appName = ChannelProperties.getProperty("app_name");
boolean dockIcon = false;
boolean dockName = false;
boolean headlessProp = false;
+ boolean macosHeadlessProp = false;
for (int i = 0; i < command.size(); i++)
{
String arg = command.get(i);
{
headlessProp = true;
}
+ else if (arg.startsWith("-D" + macosHeadlessProperty + "="))
+ {
+ macosHeadlessProp = true;
+ }
}
if (!memSet)
// -Xdock:name=... doesn't actually work :(
// Leaving it in in case it gets fixed
command.add("-Xdock:name=" + appName);
- // this launches WITHOUT an icon in the macOS dock. Could be useful for
- // getdown?
- // command.add("-Dapple.awt.UIElement=false");
// This also does not work for the dock
command.add("-Dcom.apple.mrj.application.apple.menu.about.name="
+ appName);
if (headless && !headlessProp)
{
System.setProperty(headlessProperty, "true");
- command.add("-D" + headlessProperty + "=true");
+ /* not setting this in java invocation of running jalview due to problem with Jmol */
+ if (help)
+ {
+ command.add("-D" + headlessProperty + "=true");
+ }
+ }
+ if (headless && LaunchUtils.isMac && !macosHeadlessProp)
+ {
+ System.setProperty(macosHeadlessProperty, "true");
+ command.add("-D" + macosHeadlessProperty + "=true");
}
String scalePropertyArg = HiDPISetting.getScalePropertyArg();
frame.setTitle(MessageManager.getString("label.export_annotations"));
}
+ public void setExportAsCSV()
+ {
+ if (CSVFormat != null)
+ {
+ CSVFormat.setSelected(true);
+ }
+ }
+
private void toFile_actionPerformed()
{
// TODO: JAL-3048 JalviewFileChooser - Save option
*
* @return
*/
- private String getText()
+ public String getText()
{
return exportFeatures ? getFeaturesText() : getAnnotationsText();
}
*
* @return
*/
- private String getAnnotationsText()
+ public String getAnnotationsText()
{
String text;
if (CSVFormat.isSelected())
{
- text = new AnnotationFile().printCSVAnnotations(annotations);
+ text = new AnnotationFile().printCSVAnnotations(
+ wholeView ? ap.av.getAlignment().getAlignmentAnnotation()
+ : annotations);
}
else
{
*
* @return
*/
- private String getFeaturesText()
+ public String getFeaturesText()
{
String text;
SequenceI[] sequences = ap.av.getAlignment().getSequencesArray();
if (av.hasHiddenColumns())
{
Iterator<int[]> it = av.getAlignment().getHiddenColumns()
- .getVisContigsIterator(0, sq.getLength(), false);
+ .getVisContigsIterator(0, sq.getLength() + 1, false);
omitHidden = new String[] { sq.getSequenceStringFromIterator(it) };
}
--- /dev/null
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.io;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import static org.testng.AssertJUnit.assertNotNull;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.gui.AlignFrame;
+import jalview.gui.AnnotationExporter;
+import jalview.gui.JvOptionPane;
+
+public class AnnotationExporterTest
+{
+
+ @BeforeClass(alwaysRun = true)
+ public void setUpJvOptionPane()
+ {
+ JvOptionPane.setInteractiveMode(false);
+ JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+ }
+
+ @Test(groups = "Functional")
+ public void testAnnotationExportAsCSV()
+ {
+ /*
+ * JAL-4342 test that export all alignment annotation as CSV or as an annotations file DOES NOT produce empty text box/file
+ */
+ AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+ ">Seq1\nQRSIL\n>Seq2\nFTHND\n>Seq3\nRPVSL\n",
+ DataSourceType.PASTE);
+ AlignmentAnnotation[] annots = af.alignPanel.getAlignment()
+ .getAlignmentAnnotation();
+
+ assertTrue(annots.length > 1);
+ // set up exporter
+ AnnotationExporter ae = new AnnotationExporter(af.alignPanel);
+ ae.exportAnnotations();
+ ae.setExportAsCSV();
+
+ String exported;
+ exported = ae.getAnnotationsText();
+ assertNotNull(exported);
+ assertTrue(exported.contains(annots[0].label));
+ assertTrue(exported.contains(annots[1].label));
+
+ // just one annotation row
+ ae.exportAnnotation(annots[1]);
+ exported = ae.getAnnotationsText();
+ assertNotNull(exported);
+ assertFalse(exported.contains(annots[0].label));
+ assertTrue(exported.contains(annots[1].label));
+
+ }
+}
###############################
declare -a ARGS=("${@}")
-ARG1=$1
# this function is because there's no readlink -f in Darwin/macOS
function readlinkf() {
--headless|--output|--image|--structureimage)
HEADLESS=1
;;
- --help|--help-*|--version)
+ --help|--help-*|--version|-h)
HELP=1
;;
--gui)
if [ "${ISMACOS}" = 1 ]; then
# MACOS ONLY
DIR="$(dirname "$(readlinkf "$0")")"
- JVMARGS=( "${JVMARGS[@]}" "-Xdock:icon=${DIR}/jalview_logo.png" )
+ if [ -e "${DIR}/jalview_logo.png" ]; then
+ JVMARGS=( "${JVMARGS[@]}" "-Xdock:icon=${DIR}/jalview_logo.png" )
+ fi
else
# NOT MACOS
DIR="$(dirname "$(readlink -f "$0")")"
fi
if [ "${HEADLESS}" = 1 ]; then
- # this suppresses the Java icon appearing in the macOS Dock and maybe other things in other OSes
- JVMARGS=( "${JVMARGS[@]}" "-Djava.awt.headless=true" )
+ # not setting java.awt.headless in java invocation of running jalview due to problem with Jmol
+ if [ "${HELP}" = 1 ]; then
+ JVMARGS=( "${JVMARGS[@]}" "-Djava.awt.headless=true" )
+ fi
+ # this suppresses the Java icon appearing in the macOS Dock
+ if [ "${ISMACOS}" = 1 ]; then
+ JVMARGS=( "${JVMARGS[@]}" "-Dapple.awt.UIElement=true" )
+ fi
fi
JAVA=java
fi
JVMARGS=( "${JVMARGS[@]}" "-DCONSOLEWIDTH=${COLUMNS}" )
+function quotearray() {
+ QUOTEDVALS=""
+ for VAL in "${@}"; do
+ if [ \! "$QUOTEDVALS" = "" ]; then
+ QUOTEDVALS="${QUOTEDVALS} "
+ fi
+ QUOTEDVALS="${QUOTEDVALS}\"${VAL}\""
+ done
+ echo $QUOTEDVALS
+}
+
+JVMARGSSTR=$(quotearray "${JVMARGS[@]}")
+ARGSSTR=$(quotearray "${ARGS[@]}")
+
if [ "${DEBUG}" = 1 ]; then
- echo Shell running: "${JAVA}" "${JVMARGS[@]}" -jar \""${JARPATH}"\" "${ARGS[@]}"
+ echo Shell running: \""${JAVA}"\" ${JVMARGSSTR} -jar \""${JARPATH}"\" ${ARGSSTR}
fi
"${JAVA}" "${JVMARGS[@]}" -jar "${JARPATH}" "${ARGS[@]}"
#!/usr/bin/env bash
declare -a ARGS=("${@}")
-ARG1=$1
# this whole next part is because there's no readlink -f in Darwin
function readlinkf() {
fi
if [ "${HEADLESS}" = 1 ]; then
- # this suppresses the Java icon appearing in the macOS Dock and maybe other things in other OSes
- JVMARGS=( "${JVMARGS[@]}" "-Djava.awt.headless=true" )
+ # not setting java.awt.headless in java invocation of running jalview due to problem with Jmol
+ if [ "${HELP}" = 1 ]; then
+ JVMARGS=( "${JVMARGS[@]}" "-Djava.awt.headless=true" )
+ fi
+ # this suppresses the Java icon appearing in the macOS Dock
+ if [ "${ISMACOS}" = 1 ]; then
+ JVMARGS=( "${JVMARGS[@]}" "-Dapple.awt.UIElement=true" )
+ fi
fi
SYSJAVA=java
echo "Cannot find bundled java, using system ${JAVA} and hoping for the best!" >&2
fi
+function quotearray() {
+ QUOTEDVALS=""
+ for VAL in "${@}"; do
+ if [ \! "$QUOTEDVALS" = "" ]; then
+ QUOTEDVALS="${QUOTEDVALS} "
+ fi
+ QUOTEDVALS="${QUOTEDVALS}\"${VAL}\""
+ done
+ echo $QUOTEDVALS
+}
+
+JVMARGSSTR=$(quotearray "${JVMARGS[@]}")
+ARGSSTR=$(quotearray "${ARGS[@]}")
+
if [ "${DEBUG}" = 1 ]; then
- echo Shell running: \""${JAVA}"\" \""${JVMARGS[@]}"\" -cp \""${CLASSPATH}"\" jalview.bin.Launcher "${ARGS[@]}"
+ echo Shell running: \""${JAVA}"\" ${JVMARGSSTR} -cp \""${CLASSPATH}"\" jalview.bin.Launcher ${ARGSSTR}
fi
"${JAVA}" "${JVMARGS[@]}" -cp "${CLASSPATH}" jalview.bin.Launcher "${ARGS[@]}"