From: James Procter Date: Thu, 30 Nov 2023 16:55:54 +0000 (+0000) Subject: Merge branch 'develop' into releases/Release_2_11_3_Branch X-Git-Tag: Release_2_11_3_2 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=63363f5d656679c0eb0276c95be65b3b7b2c5ae2;hp=bec7c06338ee402f6cde54173ddff2295ca702df;p=jalview.git Merge branch 'develop' into releases/Release_2_11_3_Branch --- diff --git a/RELEASE b/RELEASE index a5d5f52..f733246 100644 --- a/RELEASE +++ b/RELEASE @@ -1,2 +1,2 @@ jalview.release=releases/Release_2_11_3_Branch -jalview.version=2.11.3.1 +jalview.version=2.11.3.2 diff --git a/help/markdown/releases/release-2_11_3_2.md b/help/markdown/releases/release-2_11_3_2.md new file mode 100644 index 0000000..6c0b587 --- /dev/null +++ b/help/markdown/releases/release-2_11_3_2.md @@ -0,0 +1,15 @@ +--- +version: 2.11.3.2 +date: 2023-12-01 +channel: "release" +--- + +## New Features + +## Issues Resolved + +- --structureimage exports an image without the fully rendered structure when run via CLI (known defect since 2.11.3.0) +- Missing last letter when copying consensus sequence from alignment after applying filter (known defect affecting 2.10.4 onwards) +- export all alignment annotation as CSV produces an empty file or cut'n'paste text box + + diff --git a/help/markdown/whatsnew/whatsnew-2_11_3_2.md b/help/markdown/whatsnew/whatsnew-2_11_3_2.md new file mode 100644 index 0000000..20405df --- /dev/null +++ b/help/markdown/whatsnew/whatsnew-2_11_3_2.md @@ -0,0 +1,3 @@ +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. diff --git a/src/jalview/bin/Launcher.java b/src/jalview/bin/Launcher.java index e1415be..507f501 100644 --- a/src/jalview/bin/Launcher.java +++ b/src/jalview/bin/Launcher.java @@ -50,8 +50,16 @@ public class Launcher { 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 @@ -77,7 +85,9 @@ public class Launcher 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; @@ -85,45 +95,70 @@ public class Launcher boolean launcherwait = false; ArrayList 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 @@ -166,11 +201,21 @@ public class Launcher 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"); @@ -212,6 +257,7 @@ public class Launcher 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); @@ -236,6 +282,10 @@ public class Launcher { headlessProp = true; } + else if (arg.startsWith("-D" + macosHeadlessProperty + "=")) + { + macosHeadlessProp = true; + } } if (!memSet) @@ -263,9 +313,6 @@ public class Launcher // -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); @@ -274,7 +321,16 @@ public class Launcher 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(); diff --git a/src/jalview/gui/AnnotationExporter.java b/src/jalview/gui/AnnotationExporter.java index 894db79..a23496d 100644 --- a/src/jalview/gui/AnnotationExporter.java +++ b/src/jalview/gui/AnnotationExporter.java @@ -163,6 +163,14 @@ public class AnnotationExporter extends JPanel 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 @@ -202,7 +210,7 @@ public class AnnotationExporter extends JPanel * * @return */ - private String getText() + public String getText() { return exportFeatures ? getFeaturesText() : getAnnotationsText(); } @@ -213,12 +221,14 @@ public class AnnotationExporter extends JPanel * * @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 { @@ -241,7 +251,7 @@ public class AnnotationExporter extends JPanel * * @return */ - private String getFeaturesText() + public String getFeaturesText() { String text; SequenceI[] sequences = ap.av.getAlignment().getSequencesArray(); diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java index 6b98944..94f8790 100755 --- a/src/jalview/gui/AnnotationLabels.java +++ b/src/jalview/gui/AnnotationLabels.java @@ -1112,7 +1112,7 @@ public class AnnotationLabels extends JPanel if (av.hasHiddenColumns()) { Iterator it = av.getAlignment().getHiddenColumns() - .getVisContigsIterator(0, sq.getLength(), false); + .getVisContigsIterator(0, sq.getLength() + 1, false); omitHidden = new String[] { sq.getSequenceStringFromIterator(it) }; } diff --git a/test/jalview/io/AnnotationExporterTest.java b/test/jalview/io/AnnotationExporterTest.java new file mode 100644 index 0000000..6a627d8 --- /dev/null +++ b/test/jalview/io/AnnotationExporterTest.java @@ -0,0 +1,77 @@ +/* + * 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 . + * 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)); + + } +} diff --git a/utils/conda/jalview.sh b/utils/conda/jalview.sh index 995195f..9ac2807 100755 --- a/utils/conda/jalview.sh +++ b/utils/conda/jalview.sh @@ -26,7 +26,6 @@ ############################### declare -a ARGS=("${@}") -ARG1=$1 # this function is because there's no readlink -f in Darwin/macOS function readlinkf() { @@ -72,7 +71,7 @@ for RAWARG in "${@}"; do --headless|--output|--image|--structureimage) HEADLESS=1 ;; - --help|--help-*|--version) + --help|--help-*|--version|-h) HELP=1 ;; --gui) @@ -99,15 +98,23 @@ declare -a JVMARGS=() 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 @@ -171,8 +178,22 @@ elif command -v resize 2>&1 >/dev/null; then 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[@]}" diff --git a/utils/getdown/bin/jalview.sh b/utils/getdown/bin/jalview.sh index 849d71a..90d1558 100755 --- a/utils/getdown/bin/jalview.sh +++ b/utils/getdown/bin/jalview.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash declare -a ARGS=("${@}") -ARG1=$1 # this whole next part is because there's no readlink -f in Darwin function readlinkf() { @@ -85,8 +84,14 @@ else 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 @@ -163,8 +168,22 @@ if [ \! -e "${JAVA}" ]; then 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[@]}"