From: Ben Soares Date: Fri, 18 Aug 2023 14:33:53 +0000 (+0100) Subject: Merge branch 'bug/JAL-4214_system_freeze_when_opening_file_using_gui_in_linux' into... X-Git-Tag: Release_2_11_3_0~8^2~45 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=8a2a0cda7067530f8481c2aec203e18d555f2dfd;hp=07711595213cb89a9c42e2659c7b208b4a8b8d39;p=jalview.git Merge branch 'bug/JAL-4214_system_freeze_when_opening_file_using_gui_in_linux' into merge/big_merge_of_bens_stuff_before_2_11_3_0 --- diff --git a/build.gradle b/build.gradle index a47a7fd..c4ed582 100644 --- a/build.gradle +++ b/build.gradle @@ -1834,6 +1834,10 @@ tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { te info.events = [ TestLogEvent.FAILED ] } + if (OperatingSystem.current().isMacOsX()) { + testTask.systemProperty "apple.awt.UIElement", "true" + testTask.environment "JAVA_TOOL_OPTIONS", "-Dapple.awt.UIElement=true" + } ignoreFailures = true // Always try to run all tests for all modules @@ -4256,7 +4260,7 @@ task jalviewjsLaunchTest { def stdout def stderr doFirst { - def timeoutms = Integer.valueOf(jalviewjs_chromium_timeout) * 1000 + def timeoutms = Integer.valueOf(jalviewjs_chromium_overall_timeout) * 1000 def binary = file(chromiumBinary) if (!binary.exists()) { @@ -4299,6 +4303,7 @@ task jalviewjsLaunchTest { errorOutput = execStderr executable(chromiumBinary) args(execArgs) + println "COMMAND: '"+commandLine.join(" ")+"'" } executor.shutdownNow() } @@ -4316,7 +4321,7 @@ task jalviewjsLaunchTest { executor.shutdownNow() } // if no change in stderr for 10s then also end - if (noChangeIterations >= 10) { + if (noChangeIterations >= jalviewjs_chromium_idle_timeout) { executor.shutdownNow() } if (stderrString.length() == noChangeBytes) { diff --git a/examples/argfiles/test_fab41.txt b/examples/argfiles/test_fab41.txt index e6f7627..b7f0d45 100644 --- a/examples/argfiles/test_fab41.txt +++ b/examples/argfiles/test_fab41.txt @@ -10,4 +10,4 @@ --paematrix=[label=pAE R4-M5]./examples/test_fab41.result/test_fab41_unrelaxed_rank_4_model_5_scores.json --structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1.pdb --paematrix=[label=pAE R5-M1]./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1_scores.json ---image=output1.html +--image=[textrenderer=text]output1.html diff --git a/examples/argfiles/test_fab41_nostructureviewers.txt b/examples/argfiles/test_fab41_nostructureviewers.txt new file mode 100644 index 0000000..ab52cdf --- /dev/null +++ b/examples/argfiles/test_fab41_nostructureviewers.txt @@ -0,0 +1,14 @@ +--open=./examples/test_fab41.result/sample.a2m +--colour=gecos:flower +--gui +--structure=[structureviewer=none]./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb +--paematrix=[label=pAE R1-M3]./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3_scores.json +--structure=[structureviewer=none]./examples/test_fab41.result/test_fab41_unrelaxed_rank_2_model_4.pdb +--paematrix=[label=pAE R2-M4]./examples/test_fab41.result/test_fab41_unrelaxed_rank_2_model_4_scores.json +--structure=[structureviewer=none]./examples/test_fab41.result/test_fab41_unrelaxed_rank_3_model_2.pdb +--paematrix=[label=pAE R3-M2]./examples/test_fab41.result/test_fab41_unrelaxed_rank_3_model_2_scores.json +--structure=[structureviewer=none]./examples/test_fab41.result/test_fab41_unrelaxed_rank_4_model_5.pdb +--paematrix=[label=pAE R4-M5]./examples/test_fab41.result/test_fab41_unrelaxed_rank_4_model_5_scores.json +--structure=[structureviewer=none]./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1.pdb +--paematrix=[label=pAE R5-M1]./examples/test_fab41.result/test_fab41_unrelaxed_rank_5_model_1_scores.json +--image=[textrenderer=text]output1.html diff --git a/examples/testdata/7WKP-rna1.xml b/examples/testdata/7WKP-rna1.xml new file mode 100644 index 0000000..2703212 --- /dev/null +++ b/examples/testdata/7WKP-rna1.xml @@ -0,0 +1,491 @@ + + + + + + + + + + 1 + 20 + + + + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + + + + GUUAGCAGCC GCAUAGGCUG + + + + LOOP1 + 12 + 14 + + + + + + + Crystallography ? + ? Angstroms + + + 1 + G + + P + 7.232 28.529 -12.305 + + + O3' + 4.752 23.963 -11.820 + + + + 2 + U + + P + 3.868 23.252 -12.962 + + + O3' + 0.983 18.432 -13.409 + + + + 3 + U + + P + 1.438 17.540 -14.670 + + + O3' + -1.417 16.962 -19.633 + + + + 4 + A + + P + -2.710 16.020 -19.430 + + + O3' + -7.138 19.555 -19.112 + + + + 5 + G + + P + -7.829 20.393 -20.298 + + + O3' + -11.316 24.166 -18.659 + + + + 6 + C + + P + -12.021 24.790 -19.958 + + + O3' + -14.686 21.023 -22.223 + + + + 7 + A + + P + -16.102 21.690 -22.577 + + + O3' + -20.284 18.901 -22.582 + + + + 8 + G + + P + -21.555 19.844 -22.854 + + + O3' + -26.285 20.028 -19.599 + + + + 9 + C + + P + -27.355 21.190 -19.880 + + + O3' + -30.900 21.877 -16.104 + + + + 10 + C + + P + -31.737 23.147 -16.621 + + + O3' + -33.685 26.755 -13.690 + + + + 11 + G + + P + -34.360 27.602 -14.877 + + + O3' + -34.025 32.801 -15.050 + + + + 12 + C + + P + -35.037 32.875 -16.296 + + + O3' + -31.850 33.486 -20.341 + + + + 13 + A + + P + -30.767 32.411 -19.837 + + + O3' + -25.756 33.919 -20.714 + + + + 14 + U + + P + -24.465 33.135 -20.171 + + + O3' + -21.219 37.107 -19.013 + + + + 15 + A + + P + -22.129 38.268 -18.376 + + + O3' + -20.542 37.656 -12.798 + + + + 16 + G + + P + -19.666 36.373 -12.391 + + + O3' + -21.101 34.091 -7.803 + + + + 17 + G + + P + -20.251 32.728 -7.687 + + + O3' + -22.951 28.722 -5.266 + + + + 18 + C + + P + -21.797 27.634 -5.014 + + + O3' + -23.692 22.611 -5.084 + + + + 19 + U + + P + -22.583 21.449 -4.989 + + + O3' + -22.919 16.822 -7.040 + + + + 20 + G + + P + -21.585 16.199 -6.397 + + + O3' + -18.522 13.024 -10.277 + + + + + + 1 + + + 2 + + S + H + c + + + + 6 + + + 20 + + + + + + c + + + + 7 + + + 19 + + - + - + c + + + + 8 + + + 18 + + + + + + c + + + + 9 + + + 17 + + + + + + c + + + + 10 + + + 16 + + + + + + c + + + + 11 + + + 15 + + S + H + t + + + + 3 + + + 4 + + ! + ! + ! + + + + 14 + + + 15 + + ! + ! + ! + + + + 6 + + + 20 + + 6 + + + + SG1 + 1 + 5 + + + + + SG2 + 12 + 14 + + + + + + 1 + 133.930 0.000 + + + 2 + 133.930 33.482 + + + 3 + 133.930 66.965 + + + 4 + 133.930 100.447 + + + 5 + 133.930 133.930 + + + 6 + 133.930 167.412 + + + 7 + 133.930 223.216 + + + 8 + 133.930 279.021 + + + 9 + 133.930 334.825 + + + 10 + 133.930 390.629 + + + 11 + 133.930 446.433 + + + 12 + 128.630 516.439 + + + 13 + 66.965 550.000 + + + 14 + 5.300 516.439 + + + 15 + 0.000 446.433 + + + 16 + 0.000 390.629 + + + 17 + 0.000 334.825 + + + 18 + 0.000 279.021 + + + 19 + 0.000 223.216 + + + 20 + 0.000 167.412 + + + + + + + + + + + + diff --git a/getdown/lib/FJVL_VERSION b/getdown/lib/FJVL_VERSION index 35bd812..25d39f4 100644 --- a/getdown/lib/FJVL_VERSION +++ b/getdown/lib/FJVL_VERSION @@ -1 +1 @@ -1.8.3-1.2.14_FJVL +1.8.3-1.3.0_FJVL diff --git a/getdown/lib/JVL_VERSION b/getdown/lib/JVL_VERSION index 0a14c3b..12110b2 100644 --- a/getdown/lib/JVL_VERSION +++ b/getdown/lib/JVL_VERSION @@ -1 +1 @@ -1.8.3-1.2.14_JVL +1.8.3-1.3.0_JVL diff --git a/getdown/lib/getdown-core.jar b/getdown/lib/getdown-core.jar index 7c99c93..fb8f1bc 100644 Binary files a/getdown/lib/getdown-core.jar and b/getdown/lib/getdown-core.jar differ diff --git a/getdown/lib/getdown-launcher-local.jar b/getdown/lib/getdown-launcher-local.jar index c6901ae..c74dcc5 100644 Binary files a/getdown/lib/getdown-launcher-local.jar and b/getdown/lib/getdown-launcher-local.jar differ diff --git a/getdown/lib/getdown-launcher.jar b/getdown/lib/getdown-launcher.jar index 24e3eb2..e1f1726 100644 Binary files a/getdown/lib/getdown-launcher.jar and b/getdown/lib/getdown-launcher.jar differ diff --git a/getdown/src/getdown/ant/pom.xml b/getdown/src/getdown/ant/pom.xml index b0c54e2..d8bb7e9 100644 --- a/getdown/src/getdown/ant/pom.xml +++ b/getdown/src/getdown/ant/pom.xml @@ -4,7 +4,7 @@ com.threerings.getdown getdown - 1.8.3-1.2.14_FJVL + 1.8.3-1.3.0_FJVL getdown-ant diff --git a/getdown/src/getdown/core/pom.xml b/getdown/src/getdown/core/pom.xml index 5dd429d..6126686 100644 --- a/getdown/src/getdown/core/pom.xml +++ b/getdown/src/getdown/core/pom.xml @@ -4,7 +4,7 @@ com.threerings.getdown getdown - 1.8.3-1.2.14_FJVL + 1.8.3-1.3.0_FJVL getdown-core diff --git a/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/LaunchUtil.java b/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/LaunchUtil.java index 0781a11..1faaa28 100644 --- a/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/LaunchUtil.java +++ b/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/LaunchUtil.java @@ -17,6 +17,8 @@ import javax.xml.bind.DatatypeConverter; import java.security.MessageDigest; +import jalview.util.LaunchUtils; + import static com.threerings.getdown.Log.log; /** @@ -88,6 +90,7 @@ public class LaunchUtil return getJVMPath(appdir, false); } + private static String jvmPath = null; /** * Reconstructs the path to the JVM used to launch this process. * @@ -95,22 +98,27 @@ public class LaunchUtil */ public static String getJVMPath (File appdir, boolean windebug) { - // first look in our application directory for an installed VM - String vmpath = checkJVMPath(new File(appdir, LOCAL_JAVA_DIR).getAbsolutePath(), windebug); - if (vmpath == null && isMacOS()) { - vmpath = checkJVMPath(new File(appdir, LOCAL_JAVA_DIR + "/Contents/Home").getAbsolutePath(), windebug); + if (jvmPath != null) { + return jvmPath; } + + // first look in our application directory for an installed VM + final String appDir = isMacOS() ? + (new File(appdir, LOCAL_JAVA_DIR).getAbsolutePath()) + "/Contents/Home" + : new File(appdir, LOCAL_JAVA_DIR).getAbsolutePath(); + + String javaBin = LaunchUtils.findJavaBin(appDir, windebug, false); // then fall back to the VM in which we're already running - if (vmpath == null) { - vmpath = checkJVMPath(System.getProperty("java.home"), windebug); + if (javaBin == null) { + javaBin = LaunchUtils.findJavaBin(System.getProperty("java.home"), windebug, false); } // then throw up our hands and hope for the best - if (vmpath == null) { + if (javaBin == null) { + javaBin = LaunchUtils.findJavaBin(null, windebug, true); log.warning("Unable to find java [appdir=" + appdir + ", java.home=" + System.getProperty("java.home") + "]!"); - vmpath = "java"; } // Oddly, the Mac OS X specific java flag -Xdock:name will only work if java is launched @@ -120,15 +128,16 @@ public class LaunchUtil if (isMacOS()) { try { File localVM = new File("/usr/bin/java").getCanonicalFile(); - if (localVM.equals(new File(vmpath).getCanonicalFile())) { - vmpath = "/usr/bin/java"; + if (localVM.equals(new File(javaBin).getCanonicalFile())) { + javaBin = "/usr/bin/java"; } } catch (IOException ioe) { log.warning("Failed to check Mac OS canonical VM path.", ioe); } } - return vmpath; + jvmPath = javaBin; + return jvmPath; } private static String _getMD5FileChecksum (File file) { diff --git a/getdown/src/getdown/core/src/main/java/jalview/util/LaunchUtils.java b/getdown/src/getdown/core/src/main/java/jalview/util/LaunchUtils.java index ee3b2c6..784eb5a 100644 --- a/getdown/src/getdown/core/src/main/java/jalview/util/LaunchUtils.java +++ b/getdown/src/getdown/core/src/main/java/jalview/util/LaunchUtils.java @@ -32,6 +32,16 @@ import java.util.Properties; public class LaunchUtils { + // setting these is LaunchUtils so don't need to import Platform + public final static boolean isMac = System.getProperty("os.name") + .indexOf("Mac") > -1; + + public final static boolean isWindows = System.getProperty("os.name") + .indexOf("Win") > -1; + + private static boolean isJS = /** @j2sNative true || */ + false; + public static void loadChannelProps(File dir) { ChannelProperties.loadProps(dir); @@ -81,7 +91,11 @@ public class LaunchUtils public static int getJavaCompileVersion() { - if (JAVA_COMPILE_VERSION > 0) + if (LaunchUtils.isJS) + { + return -1; + } + else if (JAVA_COMPILE_VERSION > 0) { return JAVA_COMPILE_VERSION; } @@ -125,7 +139,11 @@ public class LaunchUtils public static int getJavaVersion() { - if (JAVA_VERSION > 0) + if (LaunchUtils.isJS) + { + return -1; + } + else if (JAVA_VERSION > 0) { return JAVA_VERSION; } @@ -153,6 +171,10 @@ public class LaunchUtils public static boolean checkJavaVersion() { + if (LaunchUtils.isJS) + { + return true; + } String buildDetails = "jar:".concat(LaunchUtils.class .getProtectionDomain().getCodeSource().getLocation().toString() .concat("!" + "/.build_properties")); @@ -174,4 +196,88 @@ public class LaunchUtils return true; } + + public static String findJavaBin(boolean winConsole) + { + return findJavaBin(System.getProperty("java.home"), winConsole, true); + } + + /* + * Returns a string path to the most likely java binary wanted to run this + * installation of Jalview. + * + * @param winConsole whether to use java.exe (console) in preference to javaw.exe + * (only affects Windows). + * @param javaHome Try this javaHome dir (defaults to the running java.home). + * @param generic Return a generic java command if not found. + */ + public static String findJavaBin(String javaHome, boolean winConsole, + boolean generic) + { + String javaBin = null; + final String javaExe = winConsole ? "java.exe" : "javaw.exe"; + final String java = "java"; + + if (javaHome != null) + { + // property "channel.app_name" is set by install4j when launching getdown + String propertyAppName = System.getProperty("channel.app_name"); + final String appName = (propertyAppName != null + && propertyAppName.length() > 0) ? propertyAppName + : ChannelProperties.getProperty("app_name"); + + final String javaBinDir = javaHome + File.separator + "bin" + + File.separator; + + // appName and "Jalview" will not point to javaw.exe or java.exe but in + // this case that's okay because the taskbar display name problem doesn't + // manifest in Windows. See JAL-3820, JAL-4189. + for (String name : new String[] { appName, "Jalview", java, javaExe }) + { + if (LaunchUtils.checkJVMSymlink(javaBinDir + name, winConsole)) + { + javaBin = javaBinDir + name; + break; + } + } + } + + if (javaBin == null && generic) + { + javaBin = LaunchUtils.isWindows ? javaExe : java; + } + + return javaBin; + } + + /* + * checkJVMSymlink returns true if the path in testBin *is* a java binary, or + * points to a java binary. + * @param testBin The binary or symbolic link to check + * @param winConsole whether we are in/want a Windows console (only relevant for Windows, + * determines whether we use java.exe or javaw.exe) + */ + private static boolean checkJVMSymlink(String testBin, boolean winConsole) + { + File testBinFile = new File(testBin); + if (!testBinFile.exists()) + { + return false; + } + File targetFile = null; + try + { + targetFile = testBinFile.getCanonicalFile(); + } catch (IOException e) + { + return false; + } + final String javaExe = winConsole ? "java.exe" : "javaw.exe"; + if (targetFile != null && ("java".equals(targetFile.getName()) + || javaExe.equals(targetFile.getName()))) + { + return true; + } + return false; + } } diff --git a/getdown/src/getdown/launcher/pom.xml b/getdown/src/getdown/launcher/pom.xml index ea3b6ef..4374899 100644 --- a/getdown/src/getdown/launcher/pom.xml +++ b/getdown/src/getdown/launcher/pom.xml @@ -4,7 +4,7 @@ com.threerings.getdown getdown - 1.8.3-1.2.14_FJVL + 1.8.3-1.3.0_FJVL getdown-launcher diff --git a/getdown/src/getdown/mvn_cmd b/getdown/src/getdown/mvn_cmd index b30194f..ba092a7 100755 --- a/getdown/src/getdown/mvn_cmd +++ b/getdown/src/getdown/mvn_cmd @@ -3,7 +3,7 @@ if [ x$JVLVERSION != x ]; then export VERSION=$JVLVERSION else - export VERSION=1.8.3-1.2.14_JVL + export VERSION=1.8.3-1.3.0_JVL fi if [ x${VERSION%_JVL} = x$VERSION ]; then diff --git a/getdown/src/getdown/pom.xml b/getdown/src/getdown/pom.xml index ef8c811..51e9514 100644 --- a/getdown/src/getdown/pom.xml +++ b/getdown/src/getdown/pom.xml @@ -10,7 +10,7 @@ com.threerings.getdown getdown pom - 1.8.3-1.2.14_FJVL + 1.8.3-1.3.0_FJVL getdown An application installer and updater. diff --git a/gradle.properties b/gradle.properties index 75231f3..547304f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -201,7 +201,7 @@ jalviewjs_j2s_alt_file_property_config = j2s.config.altfileproperty # for developing in Eclipse as IDE, set this to automatically copy current swingjs/net.sf.j2s.core.jar to your dropins dir jalviewjs_eclipseIDE_auto_copy_j2s_plugin = false # Override this in a local.properties file -jalviewjs_eclipse_root = ~/buildtools/eclipse/jee-2019-09 +jalviewjs_eclipse_root = ~/buildtools/eclipse/latest jalviewjs_eclipse_dropins_dir = utils/jalviewjs/eclipse/dropins jalviewjs_swingjs_zip = swingjs/SwingJS-site.zip @@ -264,7 +264,8 @@ jalviewjs_j2s_closure_stdout = j2s-closure.out jalviewjs_chromium_binary = ~/buildtools/chromium/chrome jalviewjs_macos_chromium_binary = /Applications/Chromium.app/Contents/MacOS/Chromium jalviewjs_chromium_user_dir = chromium -jalviewjs_chromium_timeout = 30 +jalviewjs_chromium_idle_timeout = 10 +jalviewjs_chromium_overall_timeout = 40 jalviewjs_chromium_profile_name = BUILD jalviewjs_stderr_launch = utils/jalviewjs/chromium_test/jalview_bin_Jalview-stderr.html jalviewjs_desktop_init_string = JALVIEWJS: CREATED DESKTOP diff --git a/help/help/html/features/clarguments-basic.html b/help/help/html/features/clarguments-basic.html index 7a87602..7eb2294 100644 --- a/help/help/html/features/clarguments-basic.html +++ b/help/help/html/features/clarguments-basic.html @@ -393,6 +393,7 @@ phylip (phy),
jalview (jvp, jar). +

For example, to open a FASTA file, append another FASTA file and then save the concatenation as a Stockholm file, do

@@ -409,7 +410,21 @@
   

- Important! If you use --output or any other argument that outputs a file, then it will be assumed you want to run Jalview in headless mode (as if you had specified --headless). To use Jalview with --output and not assume headless mode, use the --gui or --noheadless argument (the order doesn't matter). + Important! If you use --output or any other argument that outputs a file, then it will be assumed you want to run Jalview in headless mode (as if you had specified --headless). To use Jalview with --output and not assume headless mode, use the --gui argument (the order doesn't matter). +

+ +

+ If you would like to output an alignment file directly to standard output (often referred to as STDOUT), then use the filename - (a single hyphen). In this case any messages that would normally appear on STDOUT will be diverted to STDERR to avoid invalidating the output file. +

+

+ For example, to open a Stockholm file and pipe it to another command as a Block file, do +

+  jalview --open alignment1.stk --output - --format blc | another_command
+  
+ or equivalently +
+  jalview alignment1.stk --output=[format=blc]- | another_command
+  

--format

diff --git a/help/help/html/features/clarguments-reference.html b/help/help/html/features/clarguments-reference.html index dd0bd52..60951d8 100644 --- a/help/help/html/features/clarguments-reference.html +++ b/help/help/html/features/clarguments-reference.html @@ -65,10 +65,10 @@ ‑‑help‑allHelp for all arguments - ‑‑headless / ‑‑noheadless - Run Jalview in headless (/ or not in headless) mode. In headless mode, no GUI interface will be created and Jalview will quit after all arguments have been processed. + ‑‑headless + Run Jalview in headless mode. In headless mode, no GUI interface will be created and Jalview will quit after all arguments have been processed.
- If you use a command line argument to specify an output file of some kind (--output, --image or --structureimage) then headless mode will be assumed. If you don't want this behaviour use --noheadless or --gui. + If you use a command line argument to specify an output file of some kind (--output, --image or --structureimage) then headless mode will be assumed. If you don't want this behaviour use --gui. @@ -521,6 +521,8 @@ phylip (phy),
jalview (jvp, jar). +
+ To output directly to STDOUT (console output) use the filename - (a single hyphen). In this case all STDOUT messages will instead go to STDERR. If no format is supplied then Fasta will be assumed. format=name ✓ diff --git a/help/help/html/features/clarguments.html b/help/help/html/features/clarguments.html index b763a81..7c2e9d5 100644 --- a/help/help/html/features/clarguments.html +++ b/help/help/html/features/clarguments.html @@ -163,7 +163,7 @@ If you specify an argument for an output file (one or more of --output, --image or --structureimage) then it will be assumed that you wish to run in headless mode.

- You can force Jalview to run in graphical mode using the --gui or --noheadless arguments. + You can force Jalview to run in graphical mode using the --gui argument.

diff --git a/help/help/html/privacy.html b/help/help/html/privacy.html index 9ad61b5..8704ce8 100644 --- a/help/help/html/privacy.html +++ b/help/help/html/privacy.html @@ -34,35 +34,36 @@

Usage data is collected from the logs of various web services that the Jalview Desktop contacts through its normal operation. These are described below:

- -

+

Stopping Jalview from calling home
If you run Jalview in 'headless mode' via the command line, then the diff --git a/help/help/icons/jalview_docs_logo.png b/help/help/icons/jalview_docs_logo.png new file mode 100644 index 0000000..21f5386 Binary files /dev/null and b/help/help/icons/jalview_docs_logo.png differ diff --git a/help/markdown/releases/release-2_11_2_7.md b/help/markdown/releases/release-2_11_2_7.md new file mode 100644 index 0000000..361d39a --- /dev/null +++ b/help/markdown/releases/release-2_11_2_7.md @@ -0,0 +1,12 @@ +--- +version: 2.11.2.7 +date: 2023-06-30 +channel: "release" +--- + +## New Features +- Jalview now reports usage statistics via Plausible.io + +## Issues Resolved +- PDB structures slow to view when Jalview Java console is open +- chains in PDB or mmCIF files with negative RESNUMs not correctly parsed diff --git a/help/markdown/releases/release-2_11_3_0.md b/help/markdown/releases/release-2_11_3_0.md index 1309483..206bbba 100644 --- a/help/markdown/releases/release-2_11_3_0.md +++ b/help/markdown/releases/release-2_11_3_0.md @@ -1,6 +1,6 @@ --- version: 2.11.3.0 -date: 2023-06-07 +date: 2023-07-19 channel: "release" --- @@ -20,6 +20,9 @@ channel: "release" - Use selected columns for superposition - Highlight aligned positions on all associated structures when mousing over a column +- sequence descriptions are updated from database reference sources if not already defined + + ### Improved support for working with computationally determined models - Alphafold red/orange/yellow/green colourscheme for structures @@ -35,6 +38,8 @@ channel: "release" - Import and display alphafold alignment uncertainty matrices from JSON - Column-wise alignment groups and selections and interactive tree viewer for PAE matrices - Store/Restore PAE data and visualisation settings from Jalview Project +- Multiple residue sidechain highlighting in structure viewers from PAE mouseovers + ### Jalview on the command line @@ -44,6 +49,21 @@ channel: "release" ### Other improvements - Name of alignment and view included in overview window's title +- "add reference annotation" add all positions in reference annotation tracks, not just positions in the currently highlighted columns/selection range +- EMBL-EBI SIFTS file downloads now use split directories + +- sensible responses from the CLI when things go wrong during image export +Add a command line option to set Jalview properties for this session only +Add a command line option to suppress opening the startup file for this session + + +JAL-4187 Powershell launcher script fails when given no arguments with the old ArgsParser + +known issue ? 'Reload' for a jalview project results in all windows being duplicated + + +- Command-line wrapper script for macOS bundle, linux and Windows installations (bash, powershell and .bat wrappers) +- In Linux desktops' task-managers, the grouped Jalview windows get a generic name ## Still in progress (delete on release) @@ -55,6 +75,7 @@ channel: "release" - Create separate gradle test task for some tests - Allow gradle build to create suffixed DEVELOP-... builds with channel appbase +- Jalview bio.tools description maintained under jalview's git repo and bundled with source release ## Issues Resolved - Jmol view not always centred on structures when multiple structures are viewed @@ -75,3 +96,12 @@ channel: "release" - Sequences copied to clipboard from within Jalview cannot be pasted via the desktop's popup menu to a new alignment window - Overview window is saved in project file, and state of 'show hidden regions' is preserved. - JvCacheableInputBoxTest flaky on build server + +## New Known defects +- Cannot cancel structure view open action once it has been started via the structure chooser dialog +- Example project's multiple views do not open in distinct locations when eXpand views is used to show them all separately +- Missing last letter when copying consensus sequence from alignment if first column is hidden + + + + diff --git a/help/markdown/whatsnew/whatsnew-2_11_2_7.md b/help/markdown/whatsnew/whatsnew-2_11_2_7.md new file mode 100644 index 0000000..f884134 --- /dev/null +++ b/help/markdown/whatsnew/whatsnew-2_11_2_7.md @@ -0,0 +1,5 @@ +Jalview 2.11.2.7 is a minor patch release - it includes patches affecting efficiency when importing structures and a small revision to the import processing of structures with negative residue numbering. + +With this release, Jalview usage statistics are now collected by a jalview.org hosted instance of the open source privacy-preserving analytics stack, Plausible.io. + + diff --git a/help/markdown/whatsnew/whatsnew-2_11_3_0.md b/help/markdown/whatsnew/whatsnew-2_11_3_0.md index 59495d5..ec82f83f 100644 --- a/help/markdown/whatsnew/whatsnew-2_11_3_0.md +++ b/help/markdown/whatsnew/whatsnew-2_11_3_0.md @@ -1,5 +1,7 @@ The 2.11.3 series includes support for in-depth exploration of predicted alignment error matrices from AlphaFold in the context of multiple alignments, along with support for standard colourschemes for shading models according to their pLDDT. +We're launching this release at ISMB 2023 - come find us ! + It also introduces new support for native ARM-based OSX architectures, and a few other goodies! diff --git a/j11lib/JGoogleAnalytics_0.3.jar b/j11lib/JGoogleAnalytics_0.3.jar deleted file mode 100644 index 0dbc98c..0000000 Binary files a/j11lib/JGoogleAnalytics_0.3.jar and /dev/null differ diff --git a/j11lib/flatlaf-3.0.jar b/j11lib/flatlaf-3.0.jar deleted file mode 100644 index 75d90d3..0000000 Binary files a/j11lib/flatlaf-3.0.jar and /dev/null differ diff --git a/j11lib/flatlaf-3.1.1.jar b/j11lib/flatlaf-3.1.1.jar deleted file mode 100644 index 2b13cdd..0000000 Binary files a/j11lib/flatlaf-3.1.1.jar and /dev/null differ diff --git a/j11lib/flatlaf-3.2.jar b/j11lib/flatlaf-3.2.jar new file mode 100644 index 0000000..450c1e8 Binary files /dev/null and b/j11lib/flatlaf-3.2.jar differ diff --git a/j11lib/flatlaf-extras-3.0.jar b/j11lib/flatlaf-extras-3.0.jar deleted file mode 100644 index 1f6bbc3..0000000 Binary files a/j11lib/flatlaf-extras-3.0.jar and /dev/null differ diff --git a/j11lib/flatlaf-extras-3.1.1.jar b/j11lib/flatlaf-extras-3.2.jar similarity index 52% rename from j11lib/flatlaf-extras-3.1.1.jar rename to j11lib/flatlaf-extras-3.2.jar index 9d91bd0..ccdbf94 100644 Binary files a/j11lib/flatlaf-extras-3.1.1.jar and b/j11lib/flatlaf-extras-3.2.jar differ diff --git a/j11lib/getdown-core.jar b/j11lib/getdown-core.jar index 7c99c93..fb8f1bc 100644 Binary files a/j11lib/getdown-core.jar and b/j11lib/getdown-core.jar differ diff --git a/j8lib/JGoogleAnalytics_0.3.jar b/j8lib/JGoogleAnalytics_0.3.jar deleted file mode 100644 index 0dbc98c..0000000 Binary files a/j8lib/JGoogleAnalytics_0.3.jar and /dev/null differ diff --git a/j8lib/flatlaf-3.1.1.jar b/j8lib/flatlaf-3.1.1.jar deleted file mode 100644 index 2b13cdd..0000000 Binary files a/j8lib/flatlaf-3.1.1.jar and /dev/null differ diff --git a/j8lib/flatlaf-3.2.jar b/j8lib/flatlaf-3.2.jar new file mode 100644 index 0000000..450c1e8 Binary files /dev/null and b/j8lib/flatlaf-3.2.jar differ diff --git a/j8lib/flatlaf-extras-3.1.1.jar b/j8lib/flatlaf-extras-3.2.jar similarity index 52% rename from j8lib/flatlaf-extras-3.1.1.jar rename to j8lib/flatlaf-extras-3.2.jar index 9d91bd0..ccdbf94 100644 Binary files a/j8lib/flatlaf-extras-3.1.1.jar and b/j8lib/flatlaf-extras-3.2.jar differ diff --git a/j8lib/getdown-core.jar b/j8lib/getdown-core.jar index 7c99c93..fb8f1bc 100644 Binary files a/j8lib/getdown-core.jar and b/j8lib/getdown-core.jar differ diff --git a/resources/lang/Messages.properties b/resources/lang/Messages.properties index 7f5746e..45ed727 100644 --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@ -363,6 +363,7 @@ label.sequences_from = Sequences from {0} label.successfully_loaded_file = Successfully loaded file {0} label.successfully_loaded_matrix = Successfully loaded score matrix {0} label.successfully_saved_to_file_in_format = Successfully saved to file: {0} in {1} format. +label.successfully_printed_to_stdout_in_format = Successfully printed to STDOUT in {0} format. label.copied_sequences_to_clipboard = Copied {0} sequences to clipboard. label.check_file_matches_sequence_ids_alignment = Check that the file matches sequence IDs in the alignment. label.problem_reading_tcoffee_score_file = Problem reading T-COFFEE score file @@ -1452,8 +1453,8 @@ label.choose_tempfac_type = Choose Temperature Factor type label.interpret_tempfac_as = Interpret Temperature Factor as label.add_pae_matrix_file = Add PAE matrix file label.nothing_selected = Nothing selected -prompt.google_analytics_title = Jalview Usage Statistics -prompt.google_analytics = Do you want to help make Jalview better by enabling the collection of usage statistics with Google Analytics?\nYou can enable or disable usage tracking in the preferences. +prompt.analytics_title = Jalview Usage Statistics +prompt.analytics = Do you want to help make Jalview better by enabling the collection of usage statistics with Plausible analytics?\nYou can enable or disable usage tracking in the preferences. label.working_ellipsis = Working ... action.show_groups_on_matrix = Show groups on matrix action.show_groups_on_matrix_tooltip = When enabled, clusters defined on the matrix's associated tree or below the assigned threshold are shown as different colours on the matrix annotation row diff --git a/resources/lang/Messages_es.properties b/resources/lang/Messages_es.properties index a4594dc..5dd8b3d 100644 --- a/resources/lang/Messages_es.properties +++ b/resources/lang/Messages_es.properties @@ -326,6 +326,7 @@ label.sequences_from = Secuencias de {0} label.successfully_loaded_file = Fichero cargado exitosamente {0} label.successfully_loaded_matrix = Matriz cargada exitosamente {0} label.successfully_saved_to_file_in_format = Guardado exitosamente en el fichero: {0} en formato {1}. +label.successfully_printed_to_stdout_in_format = Impresso exitosamente al STDOUT en formato {0}. label.copied_sequences_to_clipboard = Copiadas {0} secuencias en el portapapeles. label.check_file_matches_sequence_ids_alignment = Comprobar que el fichero coincide con el ID de la secuencia en el alineamiento. label.problem_reading_tcoffee_score_file = Problema de lectura del fichero de puntuaciones T-COFFEE @@ -1434,5 +1435,5 @@ label.tftype_default = Default label.tftype_plddt = pLDDT label.add_pae_matrix_file = Añadir un fichero de matriz PAE label.nothing_selected = Nada seleccionado -prompt.google_analytics_title = Jalview Estadísticas de Uso -prompt.google_analytics = ¿Quiere ayudar a mejorar Jalview habilitando la recopilación de estadísticas de uso con Google Analytics?\nPuede habilitar o deshabilitar el seguimiento de uso en las preferencias. +prompt.analytics_title = Jalview Estadísticas de Uso +prompt.analytics = ¿Quiere ayudar a mejorar Jalview habilitando la recopilación de estadísticas de uso con análisis Plausible?\nPuede habilitar o deshabilitar el seguimiento de uso en las preferencias. diff --git a/src/jalview/analysis/AAFrequency.java b/src/jalview/analysis/AAFrequency.java index b1505d6..6967885 100755 --- a/src/jalview/analysis/AAFrequency.java +++ b/src/jalview/analysis/AAFrequency.java @@ -147,7 +147,7 @@ public class AAFrequency { if (sequences[row] == null) { - System.err.println( + jalview.bin.Console.errPrintln( "WARNING: Consensus skipping null sequence - possible race condition."); continue; } @@ -188,7 +188,7 @@ public class AAFrequency } return new Profiles(result); // long elapsed = System.currentTimeMillis() - now; - // System.out.println(elapsed); + // jalview.bin.Console.outPrintln(elapsed); } /** @@ -285,7 +285,7 @@ public class AAFrequency ' ', value); } // long elapsed = System.currentTimeMillis() - now; - // System.out.println(-elapsed); + // jalview.bin.Console.outPrintln(-elapsed); } /** diff --git a/src/jalview/analysis/AlignSeq.java b/src/jalview/analysis/AlignSeq.java index 65fd110..e1d5669 100755 --- a/src/jalview/analysis/AlignSeq.java +++ b/src/jalview/analysis/AlignSeq.java @@ -826,7 +826,7 @@ public class AlignSeq } } - System.out.println(max + " " + min); + jalview.bin.Console.outPrintln(max + " " + min); for (int i = 0; i < n; i++) { @@ -835,12 +835,12 @@ public class AlignSeq int x = psize * i; int y = psize * j; - // System.out.println(mat[i][j]); + // jalview.bin.Console.outPrintln(mat[i][j]); float score = (float) (mat[i][j] - min) / (float) (max - min); g.setColor(new Color(score, 0, 0)); g.fillRect(x, y, psize, psize); - // System.out.println(x + " " + y + " " + score); + // jalview.bin.Console.outPrintln(x + " " + y + " " + score); } } } @@ -890,7 +890,8 @@ public class AlignSeq pdbpos++; } - if (allowmismatch || c1 == c2) + // ignore case differences + if (allowmismatch || (c1 == c2) || (Math.abs(c2-c1)==('a'-'A'))) { // extend mapping interval if (lp1 + 1 != alignpos || lp2 + 1 != pdbpos) @@ -982,7 +983,7 @@ public class AlignSeq bestm = msq; } } - // System.out.println("Best Score for " + (matches.size() + 1) + " :" + // jalview.bin.Console.outPrintln("Best Score for " + (matches.size() + 1) + " :" // + bestscore); matches.add(bestm); aligns.add(bestaseq); diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index b02d49c..b037336 100755 --- a/src/jalview/analysis/AlignmentSorter.java +++ b/src/jalview/analysis/AlignmentSorter.java @@ -453,7 +453,7 @@ public class AlignmentSorter if (tmp.size() != nSeq) { - System.err.println("WARNING: tmp.size()=" + tmp.size() + " != nseq=" + jalview.bin.Console.errPrintln("WARNING: tmp.size()=" + tmp.size() + " != nseq=" + nSeq + " in getOrderByTree - tree contains sequences not in alignment"); } @@ -714,7 +714,7 @@ public class AlignmentSorter String msg = String.format( "Implementation Error - sortByFeature method must be either '%s' or '%s'", FEATURE_SCORE, FEATURE_DENSITY); - System.err.println(msg); + jalview.bin.Console.errPrintln(msg); return; } @@ -832,7 +832,7 @@ public class AlignmentSorter { // int nf = (feats[i] == null) ? 0 // : ((SequenceFeature[]) feats[i]).length; - // // System.err.println("Sorting on Score: seq " + + // // jalview.bin.Console.errPrintln("Sorting on Score: seq " + // seqs[i].getName() // + " Feats: " + nf + " Score : " + scores[i]); } @@ -847,7 +847,7 @@ public class AlignmentSorter int featureCount = feats[i] == null ? 0 : ((SequenceFeature[]) feats[i]).length; scores[i] = featureCount; - // System.err.println("Sorting on Density: seq "+seqs[i].getName()+ + // jalview.bin.Console.errPrintln("Sorting on Density: seq "+seqs[i].getName()+ // " Feats: "+featureCount+" Score : "+scores[i]); } QuickSort.sortByDouble(scores, seqs, sortByFeatureAscending); diff --git a/src/jalview/analysis/AlignmentUtils.java b/src/jalview/analysis/AlignmentUtils.java index 1158c53..f470dc6 100644 --- a/src/jalview/analysis/AlignmentUtils.java +++ b/src/jalview/analysis/AlignmentUtils.java @@ -547,7 +547,7 @@ public class AlignmentUtils if (translated == null || !(aaRes == translated.charAt(0))) { // debug - // System.out.println(("Mismatch at " + i + "/" + aaResidue + ": " + // jalview.bin.Console.outPrintln(("Mismatch at " + i + "/" + aaResidue + ": " // + codon + "(" + translated + ") != " + aaRes)); return false; } @@ -698,7 +698,7 @@ public class AlignmentUtils * unmapped position; treat like a gap */ sourceGapMappedLength += ratio; - // System.err.println("Can't align: no codon mapping to residue " + // jalview.bin.Console.errPrintln("Can't align: no codon mapping to residue " // + sourceDsPos + "(" + sourceChar + ")"); // return; continue; @@ -883,7 +883,7 @@ public class AlignmentUtils { if (protein.isNucleotide() || !dna.isNucleotide()) { - System.err.println("Wrong alignment type in alignProteinAsDna"); + jalview.bin.Console.errPrintln("Wrong alignment type in alignProteinAsDna"); return 0; } List unmappedProtein = new ArrayList<>(); @@ -908,7 +908,7 @@ public class AlignmentUtils { if (protein.isNucleotide() || !dna.isNucleotide()) { - System.err.println("Wrong alignment type in alignProteinAsDna"); + jalview.bin.Console.errPrintln("Wrong alignment type in alignProteinAsDna"); return 0; } // todo: implement this @@ -988,7 +988,7 @@ public class AlignmentUtils .getLength() == mappedFromLength - 1); if (cdsLength != mappedToLength && !addStopCodon) { - System.err.println(String.format( + jalview.bin.Console.errPrintln(String.format( "Can't align cds as protein (length mismatch %d/%d): %s", cdsLength, mappedToLength, cdsSeq.getName())); } @@ -1162,7 +1162,7 @@ public class AlignmentUtils AlignedCodon codon = sequenceCodon.getValue(); if (codon.peptideCol > 1) { - System.err.println( + jalview.bin.Console.errPrintln( "Problem mapping protein with >1 unmapped start positions: " + seq.getName()); } @@ -1512,7 +1512,7 @@ public class AlignmentUtils * @param alignment * the alignment to add them to * @param selectionGroup - * current selection group (or null if none) + * current selection group - may be null, if provided then any added annotation will be trimmed to just those columns in the selection group */ public static void addReferenceAnnotations( Map> annotations, @@ -1536,7 +1536,7 @@ public class AlignmentUtils * @param seq * @param ann * @param selectionGroup - * - may be null + * current selection group - may be null, if provided then any added annotation will be trimmed to just those columns in the selection group * @return annotation added to {@code seq and {@code alignment} */ public static AlignmentAnnotation addReferenceAnnotationTo( @@ -2770,7 +2770,7 @@ public class AlignmentUtils fromRange[i + 1]); if (range == null) { - System.err.println("Error in mapping " + seqMap + " from " + jalview.bin.Console.errPrintln("Error in mapping " + seqMap + " from " + fromSeq.getName()); return false; } diff --git a/src/jalview/analysis/AverageDistanceEngine.java b/src/jalview/analysis/AverageDistanceEngine.java index f4d69d5..d81dd44 100644 --- a/src/jalview/analysis/AverageDistanceEngine.java +++ b/src/jalview/analysis/AverageDistanceEngine.java @@ -44,29 +44,31 @@ public class AverageDistanceEngine extends TreeEngine AlignmentAnnotation aa; + // 0 - normalised dot product + // 1 - L1 - ie (abs(v_1-v_2)/dim(v)) + // L1 is more rational - since can reason about value of difference, + // normalised dot product might give cleaner clusters, but more difficult to + // understand. + + int mode = 1; + /** * compute cosine distance matrix for a given contact matrix and create a * UPGMA tree - * * @param cm + * @param cosineOrDifference false - dot product : true - L1 */ public AverageDistanceEngine(AlignmentViewport av, AlignmentAnnotation aa, - ContactMatrixI cm) + ContactMatrixI cm, boolean cosineOrDifference) { this.av = av; this.aa = aa; this.cm = cm; + mode = (cosineOrDifference) ? 1 :0; calculate(cm); } - // 0 - normalised dot product - // 1 - L1 - ie (abs(v_1-v_2)/dim(v)) - // L1 is more rational - since can reason about value of difference, - // normalised dot product might give cleaner clusters, but more difficult to - // understand. - - int mode = 1; public void calculate(ContactMatrixI cm) { diff --git a/src/jalview/analysis/Conservation.java b/src/jalview/analysis/Conservation.java index cbc4dca..5bb0b09 100755 --- a/src/jalview/analysis/Conservation.java +++ b/src/jalview/analysis/Conservation.java @@ -243,13 +243,13 @@ public class Conservation } else { - System.out.println("SEQUENCE HAS BEEN DELETED!!!"); + jalview.bin.Console.outPrintln("SEQUENCE HAS BEEN DELETED!!!"); } } else { // JBPNote INFO level debug - System.err.println( + jalview.bin.Console.errPrintln( "ERROR: calcSeqNum called with out of range sequence index for Alignment\n"); } } @@ -711,7 +711,7 @@ public class Conservation // tmp = ((max - tmp) * (size - cons2[j][23])) / size; tmp = ((max - tmp) * (size - cons2GapCounts[j])) / size; - // System.out.println(tmp+ " " + j); + // jalview.bin.Console.outPrintln(tmp+ " " + j); quality.setElementAt(Double.valueOf(tmp), j); if (tmp > newmax) diff --git a/src/jalview/analysis/CrossRef.java b/src/jalview/analysis/CrossRef.java index 9b90ca5..41582b4 100644 --- a/src/jalview/analysis/CrossRef.java +++ b/src/jalview/analysis/CrossRef.java @@ -293,7 +293,7 @@ public class CrossRef if (matchInDataset != null && xref.getMap().getTo() != null && matchInDataset != xref.getMap().getTo()) { - System.err.println( + jalview.bin.Console.errPrintln( "Implementation problem (reopen JAL-2154): CrossRef.findInDataset seems to have recovered a different sequence than the one explicitly mapped for xref." + "Found:" + matchInDataset + "\nExpected:" + xref.getMap().getTo() + "\nFor xref:" @@ -424,7 +424,7 @@ public class CrossRef retrieved = sftch.getSequences(sourceRefs, !fromDna); } catch (Exception e) { - System.err.println( + jalview.bin.Console.errPrintln( "Problem whilst retrieving cross references for Sequence : " + seq.getName()); e.printStackTrace(); @@ -607,7 +607,7 @@ public class CrossRef String msg = "Mapping updated from " + ms.getName() + " to retrieved crossreference " + matched.getName(); - System.out.println(msg); + jalview.bin.Console.outPrintln(msg); List toRefs = map.getTo().getDBRefs(); if (toRefs != null) @@ -662,7 +662,7 @@ public class CrossRef cf.addMap(retrievedSequence, map.getTo(), map.getMap()); } catch (Exception e) { - System.err.println( + jalview.bin.Console.errPrintln( "Exception when consolidating Mapped sequence set..."); e.printStackTrace(System.err); } @@ -1029,7 +1029,7 @@ public class CrossRef } if (dataset.getSequences() == null) { - System.err.println("Empty dataset sequence set - NO VECTOR"); + jalview.bin.Console.errPrintln("Empty dataset sequence set - NO VECTOR"); return false; } List ds = dataset.getSequences(); @@ -1041,7 +1041,7 @@ public class CrossRef { if (nxt.getDatasetSequence() != null) { - System.err.println( + jalview.bin.Console.errPrintln( "Implementation warning: CrossRef initialised with a dataset alignment with non-dataset sequences in it! (" + nxt.getDisplayId(true) + " has ds reference " + nxt.getDatasetSequence().getDisplayId(true) diff --git a/src/jalview/analysis/Dna.java b/src/jalview/analysis/Dna.java index 5dcf212..aa71eb7 100644 --- a/src/jalview/analysis/Dna.java +++ b/src/jalview/analysis/Dna.java @@ -653,7 +653,7 @@ public class Dna if (rf != 0) { final String errMsg = "trimming contigs for incomplete terminal codon."; - System.err.println(errMsg); + jalview.bin.Console.errPrintln(errMsg); // map and trim contigs to ORF region vc = scontigs.length - 1; lastnpos = vismapping.shift(lastnpos); // place npos in context of diff --git a/src/jalview/analysis/GeneticCodes.java b/src/jalview/analysis/GeneticCodes.java index 133cb3a..4c826b2 100644 --- a/src/jalview/analysis/GeneticCodes.java +++ b/src/jalview/analysis/GeneticCodes.java @@ -140,7 +140,7 @@ public final class GeneticCodes InputStream is = getClass().getResourceAsStream(fileName); if (is == null) { - System.err.println("Resource file not found: " + fileName); + jalview.bin.Console.errPrintln("Resource file not found: " + fileName); return; } BufferedReader dataIn = new BufferedReader(new InputStreamReader(is)); @@ -166,7 +166,7 @@ public final class GeneticCodes } if (codeTables.isEmpty()) { - System.err.println( + jalview.bin.Console.errPrintln( "No genetic code tables loaded, check format of file " + fileName); } @@ -190,7 +190,7 @@ public final class GeneticCodes InputStream is = getClass().getResourceAsStream(fileName); if (is == null) { - System.err.println("Resource file not found: " + fileName); + jalview.bin.Console.errPrintln("Resource file not found: " + fileName); return; } BufferedReader dataIn = new BufferedReader(new InputStreamReader(is)); @@ -208,7 +208,7 @@ public final class GeneticCodes } else { - System.err.println( + jalview.bin.Console.errPrintln( "Unexpected data in " + fileName + ": " + line); } } diff --git a/src/jalview/analysis/Grouping.java b/src/jalview/analysis/Grouping.java index 066814e..def5d5a 100644 --- a/src/jalview/analysis/Grouping.java +++ b/src/jalview/analysis/Grouping.java @@ -269,7 +269,7 @@ public class Grouping * seqs.length) { for (int i = 0; i < seqs.length; i++) { if (!hasScore[i]) * { scores[i] = (max + i); } else { int nf=(feats[i]==null) ? 0 * :((SequenceFeature[]) feats[i]).length; - * System.err.println("Sorting on Score: seq "+seqs[i].getName()+ + * jalview.bin.Console.errPrintln("Sorting on Score: seq "+seqs[i].getName()+ * " Feats: "+nf+" Score : "+scores[i]); } } } * * jalview.util.QuickSort.sort(scores, seqs); } else if @@ -280,7 +280,7 @@ public class Grouping * (int i=0;i 0) ? "_" + reps : ""), ScoreDescriptions[cols], null); an.setScore(score); - System.out.println(seqs[i].getName() + " score: '" + jalview.bin.Console.outPrintln(seqs[i].getName() + " score: '" + ScoreNames[cols] + "' = " + score); // DEBUG an.setSequenceRef(seqs[i]); seqs[i].addAlignmentAnnotation(an); diff --git a/src/jalview/analysis/Rna.java b/src/jalview/analysis/Rna.java index 9649240..911ee04 100644 --- a/src/jalview/analysis/Rna.java +++ b/src/jalview/analysis/Rna.java @@ -421,8 +421,8 @@ public class Rna final int open = basePair.getBP5(); final int close = basePair.getBP3(); - // System.out.println("open " + open + " close " + close); - // System.out.println("lastclose " + lastclose + " lastopen " + lastopen); + // jalview.bin.Console.outPrintln("open " + open + " close " + close); + // jalview.bin.Console.outPrintln("lastclose " + lastclose + " lastopen " + lastopen); // we're moving from right to left based on closing pair /* @@ -441,7 +441,7 @@ public class Rna { int popen = bps.get(j).getBP5(); - // System.out.println("j " + j + " popen " + popen + " lastopen " + // jalview.bin.Console.outPrintln("j " + j + " popen " + popen + " lastopen " // +lastopen + " open " + open); if ((popen < lastopen) && (popen > open)) { diff --git a/src/jalview/analysis/SeqsetUtils.java b/src/jalview/analysis/SeqsetUtils.java index fdca89d..837462f 100755 --- a/src/jalview/analysis/SeqsetUtils.java +++ b/src/jalview/analysis/SeqsetUtils.java @@ -129,7 +129,7 @@ public class SeqsetUtils { if (sfeatures != null) { - System.err.println( + jalview.bin.Console.errPrintln( "Implementation error: setting dataset sequence for a sequence which has sequence features.\n\tDataset sequence features will not be visible."); } sq.setDatasetSequence(seqds); @@ -244,7 +244,7 @@ public class SeqsetUtils { if (!quiet) { - System.err.println("Can't find '" + ((String) key) + jalview.bin.Console.errPrintln("Can't find '" + ((String) key) + "' in uniquified alignment"); } } @@ -252,7 +252,7 @@ public class SeqsetUtils } if (unmatched.size() > 0 && !quiet) { - System.err.println("Did not find matches for :"); + jalview.bin.Console.errPrintln("Did not find matches for :"); for (Enumeration i = unmatched.elements(); i .hasMoreElements(); System.out .println(((SequenceI) i.nextElement()).getName())) diff --git a/src/jalview/analysis/StructureFrequency.java b/src/jalview/analysis/StructureFrequency.java index c04df6c..3f5099b 100644 --- a/src/jalview/analysis/StructureFrequency.java +++ b/src/jalview/analysis/StructureFrequency.java @@ -148,7 +148,7 @@ public class StructureFrequency { if (sequences[j] == null) { - System.err.println( + jalview.bin.Console.errPrintln( "WARNING: Consensus skipping null sequence - possible race condition."); continue; } diff --git a/src/jalview/analysis/TreeEngine.java b/src/jalview/analysis/TreeEngine.java index daf7836..a7cbc25 100644 --- a/src/jalview/analysis/TreeEngine.java +++ b/src/jalview/analysis/TreeEngine.java @@ -214,7 +214,7 @@ public abstract class TreeEngine { // if (_lycount<_lylimit) // { - // System.err.println("Warning: depth of _recount greater than number of + // jalview.bin.Console.errPrintln("Warning: depth of _recount greater than number of // nodes."); // } if (nd == null) diff --git a/src/jalview/analysis/TreeModel.java b/src/jalview/analysis/TreeModel.java index 0e57a58..90fe089 100644 --- a/src/jalview/analysis/TreeModel.java +++ b/src/jalview/analysis/TreeModel.java @@ -353,13 +353,13 @@ public class TreeModel if ((nd.left() == null) && (nd.right() == null)) { - System.out.println("Leaf = " + ((SequenceI) nd.element()).getName()); - System.out.println("Dist " + nd.dist); - System.out.println("Boot " + nd.getBootstrap()); + jalview.bin.Console.outPrintln("Leaf = " + ((SequenceI) nd.element()).getName()); + jalview.bin.Console.outPrintln("Dist " + nd.dist); + jalview.bin.Console.outPrintln("Boot " + nd.getBootstrap()); } else { - System.out.println("Dist " + nd.dist); + jalview.bin.Console.outPrintln("Dist " + nd.dist); printNode((BinaryNode) nd.left()); printNode((BinaryNode) nd.right()); } @@ -480,10 +480,10 @@ public class TreeModel } else { - System.out.println(" name = " + ((SequenceI) nd.element()).getName()); + jalview.bin.Console.outPrintln(" name = " + ((SequenceI) nd.element()).getName()); } - System.out.println( + jalview.bin.Console.outPrintln( " dist = " + nd.dist + " " + nd.count + " " + nd.height); } @@ -513,7 +513,7 @@ public class TreeModel { // if (_lycount<_lylimit) // { - // System.err.println("Warning: depth of _recount greater than number of + // jalview.bin.Console.errPrintln("Warning: depth of _recount greater than number of // nodes."); // } if (nd == null) diff --git a/src/jalview/analysis/scoremodels/FeatureDistanceModel.java b/src/jalview/analysis/scoremodels/FeatureDistanceModel.java index 9c2f6d1..bcc0855 100644 --- a/src/jalview/analysis/scoremodels/FeatureDistanceModel.java +++ b/src/jalview/analysis/scoremodels/FeatureDistanceModel.java @@ -63,7 +63,7 @@ public class FeatureDistanceModel extends DistanceScoreModel return instance; } catch (InstantiationException | IllegalAccessException e) { - System.err.println("Error in " + getClass().getName() + jalview.bin.Console.errPrintln("Error in " + getClass().getName() + ".getInstance(): " + e.getMessage()); return null; } catch (ReflectiveOperationException roe) diff --git a/src/jalview/analysis/scoremodels/ScoreMatrix.java b/src/jalview/analysis/scoremodels/ScoreMatrix.java index b206339..aa841ac 100644 --- a/src/jalview/analysis/scoremodels/ScoreMatrix.java +++ b/src/jalview/analysis/scoremodels/ScoreMatrix.java @@ -331,12 +331,12 @@ public class ScoreMatrix extends SimilarityScoreModel { if (c >= symbolIndex.length) { - System.err.println(String.format(BAD_ASCII_ERROR, c)); + jalview.bin.Console.errPrintln(String.format(BAD_ASCII_ERROR, c)); return 0; } if (d >= symbolIndex.length) { - System.err.println(String.format(BAD_ASCII_ERROR, d)); + jalview.bin.Console.errPrintln(String.format(BAD_ASCII_ERROR, d)); return 0; } diff --git a/src/jalview/analysis/scoremodels/ScoreModels.java b/src/jalview/analysis/scoremodels/ScoreModels.java index ebc9a26..d0f21bd 100644 --- a/src/jalview/analysis/scoremodels/ScoreModels.java +++ b/src/jalview/analysis/scoremodels/ScoreModels.java @@ -105,7 +105,7 @@ public class ScoreModels return sm; } catch (IOException e) { - System.err.println( + jalview.bin.Console.errPrintln( "Error reading " + resourcePath + ": " + e.getMessage()); } return null; @@ -143,7 +143,7 @@ public class ScoreModels ScoreModelI sm2 = models.get(sm.getName()); if (sm2 != null) { - System.err.println("Warning: replacing score model " + sm2.getName()); + jalview.bin.Console.errPrintln("Warning: replacing score model " + sm2.getName()); } models.put(sm.getName(), sm); } diff --git a/src/jalview/analytics/GoogleAnalytics4.java b/src/jalview/analytics/Plausible.java similarity index 55% rename from src/jalview/analytics/GoogleAnalytics4.java rename to src/jalview/analytics/Plausible.java index ba8a920..ab2de77 100644 --- a/src/jalview/analytics/GoogleAnalytics4.java +++ b/src/jalview/analytics/Plausible.java @@ -1,8 +1,31 @@ +/* + * 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.analytics; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.lang.invoke.MethodHandles; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; @@ -17,75 +40,94 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; -import java.util.UUID; import jalview.bin.Cache; import jalview.bin.Console; import jalview.util.ChannelProperties; +import jalview.util.HttpUtils; -public class GoogleAnalytics4 +public class Plausible { + private static final String USER_AGENT; + private static final String JALVIEW_ID = "Jalview Desktop"; - private static final String SESSION_ID = new Random().toString(); + private static final String DOMAIN = "jalview.org"; - private static final String MEASUREMENT_ID = "G-6TMPHMXEQ0"; + private static final String CONFIG_API_BASE_URL = "https://www.jalview.org/services/config/analytics/url"; - private static final String API_SECRET = "Qb9NSbqkRDqizG6j2BBJ2g"; + private static final String DEFAULT_API_BASE_URL = "https://analytics.jalview.org/api/event"; - // This will generate a different CLIENT_ID each time the application is - // launched. Do we want to store it in .jalview_properties? - private static final String CLIENT_ID = UUID.randomUUID().toString(); + private static final String API_BASE_URL; - private static final String BASE_URL = "https://www.google-analytics.com/mp/collect"; + private static final String clientId; - private static final String DESKTOP_EVENT = "desktop_event"; + public static final String APPLICATION_BASE_URL = "desktop://localhost"; private List> queryStringValues; private List> jsonObject; - private List events; - private List> cookieValues; private static boolean ENABLED = false; - private static GoogleAnalytics4 instance = null; + private static boolean DEBUG = true; - private static final Map defaultParams; + private static Plausible instance = null; + + private static final Map defaultProps; static { - defaultParams = new HashMap<>(); - defaultParams.put("app_name", + defaultProps = new HashMap<>(); + defaultProps.put("app_name", ChannelProperties.getProperty("app_name") + " Desktop"); - defaultParams.put("version", Cache.getProperty("VERSION")); - defaultParams.put("build_date", + defaultProps.put("version", Cache.getProperty("VERSION")); + defaultProps.put("build_date", Cache.getDefault("BUILD_DATE", "unknown")); - defaultParams.put("java_version", System.getProperty("java.version")); + defaultProps.put("java_version", System.getProperty("java.version")); String val = System.getProperty("sys.install4jVersion"); if (val != null) { - defaultParams.put("install4j_version", val); + defaultProps.put("install4j_version", val); } val = System.getProperty("installer_template_version"); if (val != null) { - defaultParams.put("install4j_template_version", val); + defaultProps.put("install4j_template_version", val); } val = System.getProperty("launcher_version"); if (val != null) { - defaultParams.put("launcher_version", val); + defaultProps.put("launcher_version", val); } - defaultParams.put("java_arch", + defaultProps.put("java_arch", System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version")); + defaultProps.put("os", System.getProperty("os.name")); + defaultProps.put("os_version", System.getProperty("os.version")); + defaultProps.put("os_arch", System.getProperty("os.arch")); + String installation = Cache.applicationProperties + .getProperty("INSTALLATION"); + if (installation != null) + { + defaultProps.put("installation", installation); + } + + // ascertain the API_BASE_URL + API_BASE_URL = getAPIBaseURL(); + + // random clientId to make User-Agent unique (to register analytic) + clientId = String.format("%08x", new Random().nextInt()); + + USER_AGENT = HttpUtils.getUserAgent( + MethodHandles.lookup().lookupClass().getCanonicalName() + " " + + clientId); } - private GoogleAnalytics4() + private Plausible() { this.resetLists(); } @@ -95,72 +137,79 @@ public class GoogleAnalytics4 ENABLED = b; } - public void sendAnalytics(String eventName, String... paramsStrings) + public void sendEvent(String eventName, String urlString, + String... propsStrings) { - sendAnalytics(eventName, false, paramsStrings); + sendEvent(eventName, urlString, false, propsStrings); } /** * The simplest way to send an analytic event. * * @param eventName - * The event name. To emulate a webpage view use "page_view" and set - * a "page_location" parameter. See - * https://developers.google.com/analytics/devguides/collection/ga4/events?client_type=gtag - * @param sendDefaultParams - * Flag whether to add the default params about the application. - * @param paramsStrings + * The event name. To emulate a webpage view use "pageview" and set a + * "url" key/value. See https://plausible.io/docs/events-api + * @param sendDefaultProps + * Flag whether to add the default props about the application. + * @param propsStrings * Optional multiple Strings in key, value pairs (there should be an - * even number of paramsStrings) to be set as parameters of the - * event. To emulate a webpage view use "page_location" as the URL in - * a "page_view" event. + * even number of propsStrings) to be set as property of the event. + * To emulate a webpage view set "url" as the URL in a "pageview" + * event. */ - public void sendAnalytics(String eventName, boolean sendDefaultParams, - String... paramsStrings) + public void sendEvent(String eventName, String urlString, + boolean sendDefaultProps, String... propsStrings) { // clear out old lists this.resetLists(); if (!ENABLED) { - Console.debug("GoogleAnalytics4 not enabled."); + Console.debug("Plausible not enabled."); return; } - Map params = new HashMap<>(); - params.put("event_category", DESKTOP_EVENT); - params.put("event_label", eventName); + Map props = new HashMap<>(); // add these to all events from this application instance - if (sendDefaultParams) + if (sendDefaultProps) { - params.putAll(defaultParams); + props.putAll(defaultProps); } - // add (and overwrite with) the passed in params - if (paramsStrings != null && paramsStrings.length > 0) + // add (and overwrite with) the passed in props + if (propsStrings != null && propsStrings.length > 0) { - if (paramsStrings.length % 2 != 0) + if (propsStrings.length % 2 != 0) { Console.warn( - "Cannot addEvent with odd number of paramsStrings. Ignoring the last one."); + "Cannot addEvent with odd number of propsStrings. Ignoring the last one."); } - for (int i = 0; i < paramsStrings.length - 1; i += 2) + for (int i = 0; i < propsStrings.length - 1; i += 2) { - String key = paramsStrings[i]; - String value = paramsStrings[i + 1]; - params.put(key, value); + String key = propsStrings[i]; + String value = propsStrings[i + 1]; + props.put(key, value); } } - addEvent(eventName, params); - addQueryStringValue("measurement_id", MEASUREMENT_ID); - addQueryStringValue("api_secret", API_SECRET); - addJsonValue("client_id", CLIENT_ID); - addJsonValues("events", Event.toObjectList(events)); + addJsonValue("domain", DOMAIN); + addJsonValue("name", eventName); + StringBuilder eventUrlSb = new StringBuilder(APPLICATION_BASE_URL); + if (!APPLICATION_BASE_URL.endsWith("/") && !urlString.startsWith("/")) + { + eventUrlSb.append("/"); + } + eventUrlSb.append(urlString); + addJsonValue("url", eventUrlSb.toString()); + addJsonObject("props", props); StringBuilder urlSb = new StringBuilder(); - urlSb.append(BASE_URL); - urlSb.append('?'); - urlSb.append(buildQueryString()); + urlSb.append(API_BASE_URL); + String qs = buildQueryString(); + if (qs != null && qs.length() > 0) + { + urlSb.append('?'); + urlSb.append(qs); + } try { URL url = new URL(urlSb.toString()); @@ -171,15 +220,21 @@ public class GoogleAnalytics4 String jsonString = buildJson(); - Console.debug("GA4: HTTP Request is: '" + urlSb.toString() + "'"); - Console.debug("GA4: POSTed JSON is:\n" + jsonString); + Console.debug( + "Plausible: HTTP Request is: '" + urlSb.toString() + "'"); + if (DEBUG) + { + Console.debug("Plausible: User-Agent is: '" + USER_AGENT + "'"); + } + Console.debug("Plausible: POSTed JSON is:\n" + jsonString); byte[] jsonBytes = jsonString.getBytes(StandardCharsets.UTF_8); int jsonLength = jsonBytes.length; httpURLConnection.setFixedLengthStreamingMode(jsonLength); httpURLConnection.setRequestProperty("Content-Type", - "application/json; charset=UTF-8"); + "application/json"); + httpURLConnection.setRequestProperty("User-Agent", USER_AGENT); httpURLConnection.connect(); try (OutputStream os = httpURLConnection.getOutputStream()) { @@ -187,50 +242,63 @@ public class GoogleAnalytics4 } int responseCode = httpURLConnection.getResponseCode(); String responseMessage = httpURLConnection.getResponseMessage(); + if (responseCode < 200 || responseCode > 299) { - Console.warn("GoogleAnalytics4 connection failed: '" + responseCode - + " " + responseMessage + "'"); + Console.warn("Plausible connection failed: '" + responseCode + " " + + responseMessage + "'"); } else { - Console.debug("GoogleAnalytics4 connection succeeded: '" - + responseCode + " " + responseMessage + "'"); + Console.debug("Plausible connection succeeded: '" + responseCode + + " " + responseMessage + "'"); + } + + if (DEBUG) + { + BufferedReader br = new BufferedReader(new InputStreamReader( + (httpURLConnection.getInputStream()))); + StringBuilder sb = new StringBuilder(); + String response; + while ((response = br.readLine()) != null) + { + sb.append(response); + } + String body = sb.toString(); + Console.debug("Plausible response content:\n" + body); } } catch (MalformedURLException e) { Console.debug( - "Somehow the GoogleAnalytics4 BASE_URL and queryString is malformed.", + "Somehow the Plausible BASE_URL and queryString is malformed: '" + + urlSb.toString() + "'", e); return; } catch (IOException e) { - Console.debug("Connection to GoogleAnalytics4 BASE_URL '" + BASE_URL + Console.debug("Connection to Plausible BASE_URL '" + API_BASE_URL + "' failed.", e); } catch (ClassCastException e) { Console.debug( - "Couldn't cast URLConnection to HttpURLConnection in GoogleAnalytics4.", + "Couldn't cast URLConnection to HttpURLConnection in Plausible.", e); } } - public void addEvent(String name, Map params) + private void addJsonObject(String key, Map map) { - Event event = new Event(name); - if (params != null && params.size() > 0) + List> list = new ArrayList<>(); + for (String k : map.keySet()) { - for (String key : params.keySet()) - { - String value = params.get(key); - event.addParam(key, value); - } + list.add(stringEntry(k, map.get(k))); } - events.add(event); + addJsonObject(key, list); + } private void addJsonObject(String key, - List> object) + List> object) { jsonObject.add(objectEntry(key, object)); } @@ -268,16 +336,15 @@ public class GoogleAnalytics4 private void resetLists() { jsonObject = new ArrayList<>(); - events = new ArrayList(); queryStringValues = new ArrayList<>(); cookieValues = new ArrayList<>(); } - public static GoogleAnalytics4 getInstance() + public static Plausible getInstance() { if (instance == null) { - instance = new GoogleAnalytics4(); + instance = new Plausible(); } return instance; } @@ -480,52 +547,56 @@ public class GoogleAnalytics4 { return new AbstractMap.SimpleEntry(s, v); } -} - -class Event -{ - private String name; - private List> params; - - @SafeVarargs - public Event(String name, Map.Entry... paramEntries) + private static String getAPIBaseURL() { - this.name = name; - this.params = new ArrayList>(); - for (Map.Entry paramEntry : paramEntries) + try { - if (paramEntry == null) + URL url = new URL(CONFIG_API_BASE_URL); + URLConnection urlConnection = url.openConnection(); + HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection; + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setRequestProperty("User-Agent", USER_AGENT); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(3000); + httpURLConnection.connect(); + int responseCode = httpURLConnection.getResponseCode(); + String responseMessage = httpURLConnection.getResponseMessage(); + + if (responseCode < 200 || responseCode > 299) { - continue; + Console.warn("Config URL connection to '" + CONFIG_API_BASE_URL + + "' failed: '" + responseCode + " " + responseMessage + + "'"); } - params.add(paramEntry); - } - } - public void addParam(String param, String value) - { - params.add(GoogleAnalytics4.stringEntry(param, value)); - } + BufferedReader br = new BufferedReader( + new InputStreamReader((httpURLConnection.getInputStream()))); + StringBuilder sb = new StringBuilder(); + String response; + while ((response = br.readLine()) != null) + { + sb.append(response); + } + if (sb.length() > 7 && sb.substring(0, 5).equals("https")) + { + return sb.toString(); + } - protected List> toObject() - { - List> object = new ArrayList<>(); - object.add(GoogleAnalytics4.objectEntry("name", (Object) name)); - if (params.size() > 0) + } catch (MalformedURLException e) { - object.add(GoogleAnalytics4.objectEntry("params", (Object) params)); - } - return object; - } - - protected static List toObjectList(List events) - { - List eventObjectList = new ArrayList<>(); - for (Event event : events) + Console.debug("Somehow the config URL is malformed: '" + + CONFIG_API_BASE_URL + "'", e); + } catch (IOException e) { - eventObjectList.add((Object) event.toObject()); + Console.debug("Connection to Plausible BASE_URL '" + API_BASE_URL + + "' failed.", e); + } catch (ClassCastException e) + { + Console.debug( + "Couldn't cast URLConnection to HttpURLConnection in Plausible.", + e); } - return eventObjectList; + return DEFAULT_API_BASE_URL; } } diff --git a/src/jalview/api/RotatableCanvasI.java b/src/jalview/api/RotatableCanvasI.java index c6eb6de..1646d89 100644 --- a/src/jalview/api/RotatableCanvasI.java +++ b/src/jalview/api/RotatableCanvasI.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * diff --git a/src/jalview/appletgui/APopupMenu.java b/src/jalview/appletgui/APopupMenu.java index b860a36..413b0d4 100644 --- a/src/jalview/appletgui/APopupMenu.java +++ b/src/jalview/appletgui/APopupMenu.java @@ -393,14 +393,14 @@ public class APopupMenu extends java.awt.PopupMenu urlLink = new UrlLink(link); } catch (Exception foo) { - System.err.println("Exception for URLLink '" + link + "': " + jalview.bin.Console.errPrintln("Exception for URLLink '" + link + "': " + foo.getMessage()); continue; } if (!urlLink.isValid()) { - System.err.println(urlLink.getInvalidMessage()); + jalview.bin.Console.errPrintln(urlLink.getInvalidMessage()); continue; } diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java index 0159bc7..4b858e1 100644 --- a/src/jalview/appletgui/AlignFrame.java +++ b/src/jalview/appletgui/AlignFrame.java @@ -1577,7 +1577,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, /* * When we finally deprecate 1.1 compatibility, we can start to use * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch - * (UnsupportedEncodingException ex) { System.err.println("WARNING - + * (UnsupportedEncodingException ex) { jalview.bin.Console.errPrintln("WARNING - * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url); * ex.printStackTrace(); } */ @@ -1586,7 +1586,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, url = viewport.applet.getCodeBase() + url; } catch (UnsupportedEncodingException ex) { - System.err.println( + jalview.bin.Console.errPrintln( "WARNING = IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR " + url); ex.printStackTrace(); @@ -2975,7 +2975,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); if (viewport.applet.debug) { - System.err.println("Sorting " + alorder.getOrder().size() + jalview.bin.Console.errPrintln("Sorting " + alorder.getOrder().size() + " in alignment '" + getTitle() + "'"); } AlignmentSorter.sortBy(viewport.getAlignment(), alorder); @@ -3061,7 +3061,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { if (viewport.applet == null) { - System.out.println("Not running as applet - no browser available."); + jalview.bin.Console.outPrintln("Not running as applet - no browser available."); } else { @@ -3977,12 +3977,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewer = (Viewer) jmolviewer; } catch (ClassCastException ex) { - System.err.println( + jalview.bin.Console.errPrintln( "Unsupported viewer object :" + jmolviewer.getClass()); } if (viewer == null) { - System.err.println("Can't use this object as a structure viewer:" + jalview.bin.Console.errPrintln("Can't use this object as a structure viewer:" + jmolviewer.getClass()); return null; } @@ -4127,7 +4127,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, chains = (String[]) sqch[1]; if (seqs == null || seqs.length == 0) { - System.err.println( + jalview.bin.Console.errPrintln( "JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to."); } if (protocol == null) @@ -4142,7 +4142,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } if (protocol == null) { - System.err.println("Couldn't work out protocol to open structure: " + jalview.bin.Console.errPrintln("Couldn't work out protocol to open structure: " + pdb.getId()); return; } @@ -4154,7 +4154,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, .setMapping(seqs, chains, pdb.getFile(), protocol, null) == null) { - System.err.println("Failed to map " + pdb.getFile() + " (" + jalview.bin.Console.errPrintln("Failed to map " + pdb.getFile() + " (" + protocol + ") to any sequences"); } return; @@ -4176,7 +4176,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } if (ajm != null) { - System.err.println( + jalview.bin.Console.errPrintln( "Incremental adding and aligning structure to existing Jmol view not yet implemented."); // try and add the pdb structure // ajm.addS @@ -4201,7 +4201,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, SequenceI[][] seqs, String[][] chains, String[] protocols) { // TODO Auto-generated method stub - System.err.println("Aligned Structure View: Not yet implemented."); + jalview.bin.Console.errPrintln("Aligned Structure View: Not yet implemented."); } /** @@ -4258,9 +4258,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (!file.isValid()) { // TODO: raise dialog for gui - System.err.println("Problems parsing T-Coffee scores: " + jalview.bin.Console.errPrintln("Problems parsing T-Coffee scores: " + file.getWarningMessage()); - System.err.println("Origin was:\n" + source); + jalview.bin.Console.errPrintln("Origin was:\n" + source); return false; } @@ -4273,7 +4273,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, || aln.getWidth() != file.getWidth())) { // TODO: raise a dialog box here rather than bomb out. - System.err.println( + jalview.bin.Console.errPrintln( "The scores matrix does not match the alignment dimensions"); } @@ -4289,10 +4289,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } else { - System.err.println("Problems resolving T-Coffee scores:"); + jalview.bin.Console.errPrintln("Problems resolving T-Coffee scores:"); if (file.getWarningMessage() != null) { - System.err.println(file.getWarningMessage()); + jalview.bin.Console.errPrintln(file.getWarningMessage()); } } return false; diff --git a/src/jalview/appletgui/AlignViewport.java b/src/jalview/appletgui/AlignViewport.java index d64cd75..c1de259 100644 --- a/src/jalview/appletgui/AlignViewport.java +++ b/src/jalview/appletgui/AlignViewport.java @@ -77,14 +77,14 @@ public class AlignViewport extends AlignmentViewport } if (widthScale <= 1.0) { - System.err.println( + jalview.bin.Console.errPrintln( "Invalid alignment character width scaling factor (" + widthScale + "). Ignoring."); widthScale = 1; } if (JalviewLite.debug) { - System.err.println( + jalview.bin.Console.errPrintln( "Alignment character width scaling factor is now " + widthScale); } @@ -100,14 +100,14 @@ public class AlignViewport extends AlignmentViewport } if (heightScale <= 1.0) { - System.err.println( + jalview.bin.Console.errPrintln( "Invalid alignment character height scaling factor (" + heightScale + "). Ignoring."); heightScale = 1; } if (JalviewLite.debug) { - System.err.println( + jalview.bin.Console.errPrintln( "Alignment character height scaling factor is now " + heightScale); } diff --git a/src/jalview/appletgui/AlignmentPanel.java b/src/jalview/appletgui/AlignmentPanel.java index fd75296..71ddcef 100644 --- a/src/jalview/appletgui/AlignmentPanel.java +++ b/src/jalview/appletgui/AlignmentPanel.java @@ -363,7 +363,7 @@ public class AlignmentPanel extends Panel { if (JalviewLite.debug) {// DEBUG - System.out.println( + jalview.bin.Console.outPrintln( "DEBUG: scroll didn't happen - results not within alignment : " + seq.getStart() + "," + seq.getEnd()); } @@ -373,7 +373,7 @@ public class AlignmentPanel extends Panel { // DEBUG /* - * System.out.println("DEBUG: scroll: start=" + r[0] + + * jalview.bin.Console.outPrintln("DEBUG: scroll: start=" + r[0] + * " av.getStartRes()=" + av.getStartRes() + " end=" + r[1] + * " seq.end=" + seq.getEnd() + " av.getEndRes()=" + av.getEndRes() + * " hextent=" + hextent); @@ -555,7 +555,7 @@ public class AlignmentPanel extends Panel // this is called after loading new annotation onto alignment if (alignFrame.getSize().height == 0) { - System.out.println( + jalview.bin.Console.outPrintln( "adjustAnnotationHeight frame size zero NEEDS FIXING"); } fontChanged(); @@ -693,7 +693,7 @@ public class AlignmentPanel extends Panel if ((hextent + x) > width) { - System.err.println("hextent was " + hextent + " and x was " + x); + jalview.bin.Console.errPrintln("hextent was " + hextent + " and x was " + x); x = width - hextent; } @@ -710,7 +710,7 @@ public class AlignmentPanel extends Panel if (x < 0) { - System.err.println("x was " + x); + jalview.bin.Console.errPrintln("x was " + x); x = 0; } @@ -1111,7 +1111,7 @@ public class AlignmentPanel extends Panel public void raiseOOMWarning(String string, OutOfMemoryError error) { // TODO: JAL-960 - System.err.println("Out of memory whilst '" + string + "'"); + jalview.bin.Console.errPrintln("Out of memory whilst '" + string + "'"); error.printStackTrace(); } diff --git a/src/jalview/appletgui/AppletJmol.java b/src/jalview/appletgui/AppletJmol.java index b0722c0..cca9aff 100644 --- a/src/jalview/appletgui/AppletJmol.java +++ b/src/jalview/appletgui/AppletJmol.java @@ -275,7 +275,7 @@ public class AppletJmol extends EmbmenuFrame implements "-applet", scriptWindow, null); } catch (Exception e) { - System.err.println( + jalview.bin.Console.errPrintln( "Couldn't create a jmol viewer. Args to allocate viewer were:\nDocumentBase=" + ap.av.applet.getDocumentBase() + "\nCodebase=" + ap.av.applet.getCodeBase()); @@ -320,7 +320,7 @@ public class AppletJmol extends EmbmenuFrame implements { if (jalview.bin.JalviewLite.debug) { - System.err.println( + jalview.bin.Console.errPrintln( "AppletJmol:Trying to reuse existing PDBfile IO parser."); } // re-use the one we opened earlier @@ -330,7 +330,7 @@ public class AppletJmol extends EmbmenuFrame implements { if (jalview.bin.JalviewLite.debug) { - System.err.println( + jalview.bin.Console.errPrintln( "AppletJmol:Creating new PDBfile IO parser."); } FileParse fp = new FileParse(pdbentry.getFile(), protocol); @@ -355,7 +355,7 @@ public class AppletJmol extends EmbmenuFrame implements } catch (Exception e) { // give up! - System.err.println("Couldn't access pdbentry id=" + jalview.bin.Console.errPrintln("Couldn't access pdbentry id=" + pdbentry.getId() + " and file=" + pdbentry.getFile() + " using protocol=" + protocol); e.printStackTrace(); @@ -433,7 +433,7 @@ public class AppletJmol extends EmbmenuFrame implements } catch (OutOfMemoryError ex) { frame.dispose(); - System.err.println( + jalview.bin.Console.errPrintln( "Out of memory when trying to create dialog box with sequence-structure mapping."); return; } diff --git a/src/jalview/appletgui/ExtJmol.java b/src/jalview/appletgui/ExtJmol.java index 47f9df0..e2b8f23 100644 --- a/src/jalview/appletgui/ExtJmol.java +++ b/src/jalview/appletgui/ExtJmol.java @@ -154,7 +154,7 @@ public class ExtJmol extends JalviewJmolBinding { // This never gets called because we haven't overriden the associated Jmol's // console - System.err.println( + jalview.bin.Console.errPrintln( "WARNING: unexpected call to ExtJmol's showConsole method. (showConsole=" + show); } diff --git a/src/jalview/appletgui/PCAPanel.java b/src/jalview/appletgui/PCAPanel.java index 7c0dfa9..7730210 100644 --- a/src/jalview/appletgui/PCAPanel.java +++ b/src/jalview/appletgui/PCAPanel.java @@ -145,7 +145,7 @@ public class PCAPanel extends EmbmenuFrame top = pcaModel.getTop(); } catch (OutOfMemoryError x) { - System.err.println("Out of memory when calculating PCA."); + jalview.bin.Console.errPrintln("Out of memory when calculating PCA."); return; } calcSettings.setEnabled(true); diff --git a/src/jalview/appletgui/PairwiseAlignPanel.java b/src/jalview/appletgui/PairwiseAlignPanel.java index bc775c6..566aad9 100644 --- a/src/jalview/appletgui/PairwiseAlignPanel.java +++ b/src/jalview/appletgui/PairwiseAlignPanel.java @@ -102,7 +102,7 @@ public class PairwiseAlignPanel extends Panel implements ActionListener if (count > 2) { - System.out.println( + jalview.bin.Console.outPrintln( "Pairwise alignment scaled similarity score matrix\n"); for (int i = 0; i < count; i++) @@ -111,7 +111,7 @@ public class PairwiseAlignPanel extends Panel implements ActionListener ("" + i) + " " + seqs[i].getName()); } - System.out.println("\n"); + jalview.bin.Console.outPrintln("\n"); for (int i = 0; i < count; i++) { @@ -122,7 +122,7 @@ public class PairwiseAlignPanel extends Panel implements ActionListener } } - System.out.println("\n"); + jalview.bin.Console.outPrintln("\n"); } } diff --git a/src/jalview/appletgui/RedundancyPanel.java b/src/jalview/appletgui/RedundancyPanel.java index bd36b0d..a5b652f 100644 --- a/src/jalview/appletgui/RedundancyPanel.java +++ b/src/jalview/appletgui/RedundancyPanel.java @@ -148,7 +148,7 @@ public class RedundancyPanel extends SliderPanel validate(); sliderValueChanged(); - // System.out.println("blob done "+ (System.currentTimeMillis()-start)); + // jalview.bin.Console.outPrintln("blob done "+ (System.currentTimeMillis()-start)); } void sliderValueChanged() diff --git a/src/jalview/appletgui/RotatableCanvas.java b/src/jalview/appletgui/RotatableCanvas.java index a870ca4..87266b4 100755 --- a/src/jalview/appletgui/RotatableCanvas.java +++ b/src/jalview/appletgui/RotatableCanvas.java @@ -145,7 +145,7 @@ public class RotatableCanvas extends Panel implements MouseListener, scale = findScale(); - // System.out.println("Scale factor = " + scale); + // jalview.bin.Console.outPrintln("Scale factor = " + scale); addMouseListener(this); addKeyListener(this); @@ -301,7 +301,7 @@ public class RotatableCanvas extends Panel implements MouseListener, scale = findScale(); - // System.out.println("New scale = " + scale); + // jalview.bin.Console.outPrintln("New scale = " + scale); img = createImage(getSize().width, getSize().height); ig = img.getGraphics(); @@ -427,7 +427,7 @@ public class RotatableCanvas extends Panel implements MouseListener, } else if (evt.getKeyChar() == 's') { - System.err.println("DEBUG: Rectangle selection"); // log.debug + jalview.bin.Console.errPrintln("DEBUG: Rectangle selection"); // log.debug if (rectx2 != -1 && recty2 != -1) { rectSelect(rectx1, recty1, rectx2, recty2); diff --git a/src/jalview/appletgui/SeqPanel.java b/src/jalview/appletgui/SeqPanel.java index 70366e4..c573612 100644 --- a/src/jalview/appletgui/SeqPanel.java +++ b/src/jalview/appletgui/SeqPanel.java @@ -772,7 +772,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, @Override public void updateColours(SequenceI seq, int index) { - System.out.println("update the seqPanel colours"); + jalview.bin.Console.outPrintln("update the seqPanel colours"); // repaint(); } @@ -1817,7 +1817,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, { if (av.getAlignment() == null) { - System.out.println("Selection message: alignviewport av SeqSetId=" + jalview.bin.Console.outPrintln("Selection message: alignviewport av SeqSetId=" + av.getSequenceSetId() + " ViewId=" + av.getViewId() + " 's alignment is NULL! returning immediatly."); return; @@ -1869,7 +1869,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (copycolsel && av.hasHiddenColumns() && (av.getColumnSelection() == null)) { - System.err.println("Bad things"); + jalview.bin.Console.errPrintln("Bad things"); } if (repaint) { diff --git a/src/jalview/appletgui/TreePanel.java b/src/jalview/appletgui/TreePanel.java index 671fee1..0316e0b 100644 --- a/src/jalview/appletgui/TreePanel.java +++ b/src/jalview/appletgui/TreePanel.java @@ -166,7 +166,7 @@ public class TreePanel extends EmbmenuFrame } else { - System.out.println("Original Tree Data not available"); + jalview.bin.Console.outPrintln("Original Tree Data not available"); } } diff --git a/src/jalview/bin/Cache.java b/src/jalview/bin/Cache.java index fc9ddda..3750d9d 100755 --- a/src/jalview/bin/Cache.java +++ b/src/jalview/bin/Cache.java @@ -43,6 +43,7 @@ import java.util.Collections; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Properties; @@ -52,7 +53,7 @@ import java.util.TreeSet; import javax.swing.LookAndFeel; import javax.swing.UIManager; -import jalview.analytics.GoogleAnalytics4; +import jalview.analytics.Plausible; import jalview.datamodel.PDBEntry; import jalview.gui.Preferences; import jalview.gui.UserDefinedColours; @@ -128,7 +129,7 @@ import jalview.ws.sifts.SiftsSettings; * service *
  • QUESTIONNAIRE last questionnaire:responder id string from questionnaire * service
  • - *
  • USAGESTATS (false - user prompted) Enable google analytics tracker for + *
  • USAGESTATS (false - user prompted) Enable analytics tracker for * collecting usage statistics
  • *
  • SHOW_OVERVIEW boolean for overview window display
  • *
  • ANTI_ALIAS boolean for smooth fonts
  • @@ -406,9 +407,9 @@ public class Cache fis = new URL(propertiesFile).openStream(); if (!Jalview.quiet()) { - System.out.println( + jalview.bin.Console.outPrintln( "Loading jalview properties from : " + propertiesFile); - System.out.println( + jalview.bin.Console.outPrintln( "Disabling Jalview writing to user's local properties file."); } propsAreReadOnly = true; @@ -439,7 +440,8 @@ public class Cache } catch (Exception ex) { if (!Jalview.quiet()) - System.out.println("Error reading properties file: " + ex); + jalview.bin.Console + .outPrintln("Error reading properties file: " + ex); } } @@ -496,7 +498,8 @@ public class Cache } catch (Exception ex) { if (!Jalview.quiet()) - System.out.println("Error reading author details: " + ex); + jalview.bin.Console + .outPrintln("Error reading author details: " + ex); authorDetails = null; } if (authorDetails == null) @@ -582,10 +585,10 @@ public class Cache { if (!Jalview.quiet()) { - System.out.println( + jalview.bin.Console.outPrintln( "Non-fatal exception when checking version at " + remoteBuildPropertiesUrl + ":"); - System.out.println(ex); + jalview.bin.Console.printStackTrace(ex); } remoteVersion = getProperty("VERSION"); } @@ -635,7 +638,7 @@ public class Cache url = Cache.class.getResource(resourcePath).toString(); } catch (Exception ex) { - System.err.println("Failed to resolve resource " + resourcePath + jalview.bin.Console.errPrintln("Failed to resolve resource " + resourcePath + ": " + ex.getMessage()); } } @@ -686,7 +689,8 @@ public class Cache } catch (Exception ex) { if (!Jalview.quiet()) - System.out.println("Error reading build details: " + ex); + jalview.bin.Console + .outPrintln("Error reading build details: " + ex); applicationProperties.remove("VERSION"); } String codeVersion = getProperty("VERSION"); @@ -706,8 +710,9 @@ public class Cache new BuildDetails(codeVersion, null, codeInstallation); if (printVersion && reportVersion) { - System.out.println(ChannelProperties.getProperty("app_name") - + " version: " + codeVersion + codeInstallation); + jalview.bin.Console + .outPrintln(ChannelProperties.getProperty("app_name") + + " version: " + codeVersion + codeInstallation); } } @@ -783,8 +788,8 @@ public class Cache } catch (NumberFormatException e) { if (!Jalview.quiet()) - System.out.println("Error parsing int property '" + property - + "' with value '" + string + "'"); + jalview.bin.Console.outPrintln("Error parsing int property '" + + property + "' with value '" + string + "'"); } } @@ -834,7 +839,7 @@ public class Cache } catch (Exception ex) { if (!Jalview.quiet()) - System.out.println( + jalview.bin.Console.outPrintln( "Error setting property: " + key + " " + obj + "\n" + ex); } return oldValue; @@ -866,7 +871,7 @@ public class Cache } catch (Exception ex) { if (!Jalview.quiet()) - System.out.println("Error saving properties: " + ex); + jalview.bin.Console.outPrintln("Error saving properties: " + ex); } } } @@ -954,146 +959,41 @@ public class Cache } /** - * GA tracker object - actually JGoogleAnalyticsTracker null if tracking not - * enabled. + * Initialise the tracker if it is not done already. */ - protected static Object tracker = null; - - protected static Class trackerfocus = null; - - protected static Class jgoogleanalyticstracker = null; - - private static boolean useGA4 = true; - - /** - * Initialise the google tracker if it is not done already. - */ - public static void initGoogleTracker() + public static void initAnalytics() { - if (useGA4) - { - GoogleAnalytics4.setEnabled(true); + Plausible.setEnabled(true); - String appName = ChannelProperties.getProperty("app_name") - + " Desktop"; - String version = Cache.getProperty("VERSION") + "_" - + Cache.getDefault("BUILD_DATE", "unknown"); - String path; - /* we don't want to encode ':' as "%3A" for backward compatibility with the UA setup - try - { - path = "/" + String.join("/", URLEncoder.encode(appName, "UTF-8"), - URLEncoder.encode(version, "UTF-8"), - URLEncoder.encode(APPLICATION_STARTED, "UTF-8")); - } catch (UnsupportedEncodingException e) - { - */ - path = ("/" + String.join("/", appName, version, APPLICATION_STARTED)) - .replace(' ', '+'); - /* - } - */ - GoogleAnalytics4 ga4 = GoogleAnalytics4.getInstance(); - - // This will add a page_view similar to the old UA analytics. - // We probably want to get rid of this once the application_launch event - // is being processed properly. - ga4.sendAnalytics("page_view", "page_location", path, "page_title", - APPLICATION_STARTED); - - // This will send a new "application_launch" event with parameters - // including the old-style "path", the channel name and version - ga4.sendAnalytics("application_launch", true, "page_location", path); - } - else + String appName = ChannelProperties.getProperty("app_name") + " Desktop"; + String version = Cache.getProperty("VERSION") + "_" + + Cache.getDefault("BUILD_DATE", "unknown"); + String path; + /* we don't want to encode ':' as "%3A" for backward compatibility with the UA setup + try { - if (tracker == null) - { - if (jgoogleanalyticstracker == null) - { - // try to get the tracker class - try - { - jgoogleanalyticstracker = Cache.class.getClassLoader() - .loadClass( - "com.boxysystems.jgoogleanalytics.JGoogleAnalyticsTracker"); - trackerfocus = Cache.class.getClassLoader().loadClass( - "com.boxysystems.jgoogleanalytics.FocusPoint"); - } catch (Exception e) - { - Console.debug( - "com.boxysystems.jgoogleanalytics package is not present - tracking not enabled."); - tracker = null; - jgoogleanalyticstracker = null; - trackerfocus = null; - return; - } - } - // now initialise tracker - Exception re = null, ex = null; - Error err = null; - String vrs = "No Version Accessible"; - try - { - // Google analytics tracking code for Library Finder - tracker = jgoogleanalyticstracker - .getConstructor(new Class[] - { String.class, String.class, String.class }) - .newInstance(new Object[] - { ChannelProperties.getProperty("app_name") + " Desktop", - (vrs = Cache.getProperty("VERSION") + "_" - + Cache.getDefault("BUILD_DATE", "unknown")), - "UA-9060947-1" }); - jgoogleanalyticstracker - .getMethod("trackAsynchronously", new Class[] - { trackerfocus }) - .invoke(tracker, new Object[] - { trackerfocus - .getConstructor(new Class[] - { String.class }) - .newInstance(new Object[] - { APPLICATION_STARTED }) }); - } catch (RuntimeException e) - { - re = e; - } catch (Exception e) - { - ex = e; - } catch (Error e) - { - err = e; - } - if (re != null || ex != null || err != null) - { - if (re != null) - { - Console.debug("Caught runtime exception in googletracker init:", - re); - } - if (ex != null) - { - Console.warn( - "Failed to initialise GoogleTracker for Jalview Desktop with version " - + vrs, - ex); - } - if (err != null) - { - Console.error( - "Whilst initing GoogleTracker for Jalview Desktop version " - + vrs, - err); - } - } - else - { - Console.debug("Successfully initialised tracker."); - } - } + path = "/" + String.join("/", URLEncoder.encode(appName, "UTF-8"), + URLEncoder.encode(version, "UTF-8"), + URLEncoder.encode(APPLICATION_STARTED, "UTF-8")); + } catch (UnsupportedEncodingException e) + { + */ + List pathParts = new ArrayList<>(); + pathParts.add(appName); + pathParts.add(version); + pathParts.add(APPLICATION_STARTED); + path = ("/" + String.join("/", pathParts)).replace(' ', '+'); + /* } + */ + Plausible plausible = Plausible.getInstance(); + + // This will send a new "application_launch" event with parameters + // including the old-style "path", the channel name and version + plausible.sendEvent("application_launch", path, true); } - private static final String APPLICATION_STARTED = "Application Started."; + private static final String APPLICATION_STARTED = "Application Started"; /** * get the user's default colour if available @@ -1161,7 +1061,7 @@ public class Cache return date_format.parse(val); } catch (Exception ex) { - System.err.println("Invalid or corrupt date in property '" + jalview.bin.Console.errPrintln("Invalid or corrupt date in property '" + propertyName + "' : value was '" + val + "'"); } } @@ -1185,7 +1085,7 @@ public class Cache return Integer.valueOf(val); } catch (NumberFormatException x) { - System.err.println("Invalid integer in property '" + property + jalview.bin.Console.errPrintln("Invalid integer in property '" + property + "' (value was '" + val + "')"); } } @@ -1250,7 +1150,8 @@ public class Cache } catch (Exception ex) { if (!Jalview.quiet()) - System.out.println("Error loading User ColourFile\n" + ex); + jalview.bin.Console + .outPrintln("Error loading User ColourFile\n" + ex); } } if (!files.equals(coloursFound.toString())) @@ -1756,7 +1657,7 @@ public class Cache return null; if (!file.exists()) { - System.err.println("Could not load bootstrap preferences file '" + jalview.bin.Console.errPrintln("Could not load bootstrap preferences file '" + filename + "'"); return null; } @@ -1773,11 +1674,11 @@ public class Cache } } catch (FileNotFoundException e) { - System.err.println("Could not find bootstrap preferences file '" + jalview.bin.Console.errPrintln("Could not find bootstrap preferences file '" + file.getAbsolutePath() + "'"); } catch (IOException e) { - System.err.println( + jalview.bin.Console.errPrintln( "IOException when loading bootstrap preferences file '" + file.getAbsolutePath() + "'"); } diff --git a/src/jalview/bin/Commands.java b/src/jalview/bin/Commands.java index 7f493e0..63247a7 100644 --- a/src/jalview/bin/Commands.java +++ b/src/jalview/bin/Commands.java @@ -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; @@ -103,16 +102,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()) + AlignFrame af = afMap.get(id); + while (af != null && af.getViewport().isCalcInProgress()) { - try { + try + { Thread.sleep(25); - } catch (Exception q) {}; + } catch (Exception q) + { + } + ; } - + theseArgsWereParsed &= processImages(id); if (processLinkedOkay) theseArgsWereParsed &= processOutput(id); @@ -162,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; @@ -252,23 +251,22 @@ public class Commands af = fileLoader.LoadFileWaitTillLoaded(openFile, protocol, format); - // wrap alignment? - boolean wrap = ArgParser.getFromSubValArgOrPref(avm, Arg.WRAP, sv, - null, "WRAP_ALIGNMENT", false); - af.getCurrentView().setWrapAlignment(wrap); - // colour alignment? String colour = ArgParser.getFromSubValArgOrPref(avm, av, Arg.COLOUR, sv, null, "DEFAULT_COLOUR_PROT", ""); if ("" != colour) { ColourSchemeI cs = ColourSchemeProperty.getColourScheme( - af.getViewport(), af.getViewport().getAlignment(), colour); - - if (cs==null && !"None".equals(colour)) + af.getViewport(), af.getViewport().getAlignment(), + colour); + + if (cs == null && !"None".equals(colour)) + { + Console.warn( + "Couldn't parse '" + colour + "' as a colourscheme."); + } + else { - Console.warn("Couldn't parse '"+colour+"' as a colourscheme."); - } else { af.changeColour(cs); } Jalview.testoutput(argParser, Arg.COLOUR, "zappo", colour); @@ -357,6 +355,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); @@ -548,20 +552,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 @@ -569,22 +560,36 @@ public class Commands structureFilepath, tft, paeFilepath, false, ssFromStructure, false, viewerType); - if (sv==null) + if (sv == null) { Console.error("Failed to import and open structure view."); continue; } - while (sv.isBusy()) + try { - try { + long tries = 1000; + while (sv.isBusy() && tries > 0) + { Thread.sleep(25); + if (sv.isBusy()) + { + tries--; + Console.debug( + "Waiting for viewer for " + structureFilepath); + } } - catch (Exception x) + 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) @@ -624,12 +629,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 @@ -640,13 +646,18 @@ public class Commands if (sview instanceof AppJmol) { AppJmol jmol = (AppJmol) sview; - try { + try + { + Console.debug("Rendering image to " + structureImageFile); jmol.makePDBImage(structureImageFile, imageType, renderer, - userBis); - } - catch (ImageOutputException ioexc) + userBis); + Console.debug("Finished Rendering image to " + + structureImageFile); + + } catch (ImageOutputException ioexc) { - Console.warn("Unexpected error whilst exporting image to "+structureImageFile,ioexc); + Console.warn("Unexpected error whilst exporting image to " + + structureImageFile, ioexc); } } @@ -661,6 +672,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) @@ -756,57 +776,60 @@ public class Commands Cache.setProperty("EXPORT_EMBBED_BIOJSON", "false"); Console.info("Writing " + file); - try { - 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": - Console.debug("Creating BioJS MSA Viwer HTML file: " + fileName); - try - { - BioJsHTMLOutput.refreshVersionInfo( - BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY); - } catch (URISyntaxException e) + switch (type) { - 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); - 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; - } - } catch (Exception ioex) { - Console.warn("Unexpected error during export",ioex); + } catch (Exception ioex) + { + Console.warn("Unexpected error during export", ioex); } } } @@ -831,6 +854,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); @@ -843,7 +867,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 " @@ -881,23 +905,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 @@ -908,7 +939,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, diff --git a/src/jalview/bin/Console.java b/src/jalview/bin/Console.java index 30fd530..c42d519 100644 --- a/src/jalview/bin/Console.java +++ b/src/jalview/bin/Console.java @@ -20,6 +20,7 @@ */ package jalview.bin; +import java.io.PrintStream; import java.util.Locale; import jalview.log.JLogger; @@ -43,8 +44,8 @@ public class Console } else { - System.out.println(message); - t.printStackTrace(); + outPrintln(message); + Console.printStackTrace(t); } } @@ -57,7 +58,7 @@ public class Console } else { - System.out.println(message); + outPrintln(message); } } @@ -70,8 +71,8 @@ public class Console } else { - System.out.println(message); - t.printStackTrace(); + outPrintln(message); + Console.printStackTrace(t); } } @@ -83,7 +84,7 @@ public class Console } else { - System.out.println(message); + outPrintln(message); } } @@ -96,8 +97,8 @@ public class Console } else { - System.out.println(message); - t.printStackTrace(); + outPrintln(message); + Console.printStackTrace(t); } } @@ -110,7 +111,7 @@ public class Console } else { - System.out.println(message); + outPrintln(message); } } @@ -123,7 +124,7 @@ public class Console } else { - System.out.println(message); + outPrintln(message); } } @@ -135,8 +136,8 @@ public class Console } else { - System.out.println(message); - t.printStackTrace(); + outPrintln(message); + Console.printStackTrace(t); } } @@ -149,7 +150,7 @@ public class Console } else { - System.err.println(message); + jalview.bin.Console.errPrintln(message); } } @@ -162,8 +163,8 @@ public class Console } else { - System.err.println(message); - t.printStackTrace(System.err); + jalview.bin.Console.errPrintln(message); + Console.printStackTrace(t); } } @@ -176,7 +177,7 @@ public class Console } else { - System.err.println(message); + jalview.bin.Console.errPrintln(message); } } @@ -189,8 +190,8 @@ public class Console } else { - System.err.println(message); - t.printStackTrace(System.err); + jalview.bin.Console.errPrintln(message); + Console.printStackTrace(t); } } @@ -253,7 +254,7 @@ public class Console { if (!Jalview.quiet()) { - System.err.println( + jalview.bin.Console.errPrintln( "Setting initial log level to " + logLevel.name()); } Log4j.init(logLevel); @@ -267,8 +268,9 @@ public class Console log = JLoggerLog4j.getLogger(Cache.JALVIEW_LOGGER_NAME, logLevel); } catch (NoClassDefFoundError e) { - System.err.println("Could not initialise the logger framework"); - e.printStackTrace(); + jalview.bin.Console + .errPrintln("Could not initialise the logger framework"); + Console.printStackTrace(e); } // Test message @@ -306,6 +308,86 @@ public class Console } } + public static void outPrint() + { + outPrint(""); + } + + public static void outPrintln() + { + outPrintln(""); + } + + public static void outPrint(Object message) + { + outPrintMessage(message, false, false); + } + + public static void outPrint(Object message, boolean forceStdout) + { + outPrintMessage(message, false, forceStdout); + } + + public static void outPrintln(Object message) + { + outPrintMessage(message, true, false); + } + + public static PrintStream outputStream(boolean forceStdout) + { + // send message to stderr if an output file to stdout is expected + if (!forceStdout && Jalview.getInstance() != null + && Jalview.getInstance().bootstrapArgs != null + && Jalview.getInstance().bootstrapArgs.outputToStdout()) + { + return System.err; + } + else + { + return System.out; + } + } + + public static void outPrintMessage(Object message, boolean newline, + boolean forceStdout) + { + PrintStream ps = outputStream(forceStdout); + if (newline) + { + ps.println(message); + } + else + { + ps.print(message); + } + } + + public static void errPrint() + { + errPrint(""); + } + + public static void errPrintln() + { + errPrintln(""); + } + + public static void errPrint(Object message) + { + System.err.print(message); + } + + public static void errPrintln(Object message) + { + System.err.println(message); + } + + public static void printStackTrace(Throwable t) + { + // send message to stderr if output to stdout is expected + t.printStackTrace(System.err); + } + public final static String LOGGING_TEST_MESSAGE = "Logging to STDERR"; -} +} \ No newline at end of file diff --git a/src/jalview/bin/GetMemory.java b/src/jalview/bin/GetMemory.java index b01dfb8..5332704 100644 --- a/src/jalview/bin/GetMemory.java +++ b/src/jalview/bin/GetMemory.java @@ -61,7 +61,7 @@ class GetMemory } catch (NoClassDefFoundError e) { // com.sun.management.OperatingSystemMXBean doesn't exist in this JVM - System.err.println( + jalview.bin.Console.errPrintln( "No com.sun.management.OperatingSystemMXBean: cannot get total physical memory size"); } diff --git a/src/jalview/bin/HiDPISetting.java b/src/jalview/bin/HiDPISetting.java index 2bce673..e14c032 100644 --- a/src/jalview/bin/HiDPISetting.java +++ b/src/jalview/bin/HiDPISetting.java @@ -20,9 +20,8 @@ */ package jalview.bin; -import java.util.Locale; - import java.awt.HeadlessException; +import java.util.Locale; public class HiDPISetting { @@ -117,8 +116,9 @@ public class HiDPISetting } } catch (NumberFormatException e) { - System.err.println(setHiDPIScalePropertyName + " property give (" - + setHiDPIScaleProperty + ") but not parseable as integer"); + jalview.bin.Console.errPrintln(setHiDPIScalePropertyName + + " property give (" + setHiDPIScaleProperty + + ") but not parseable as integer"); } } if (setHiDPI && setHiDPIScale > 0) @@ -135,8 +135,8 @@ public class HiDPISetting try { int existingPropertyVal = Integer.parseInt(existingProperty); - System.out.println("Existing " + scalePropertyName + " is " - + existingPropertyVal); + jalview.bin.Console.outPrintln("Existing " + scalePropertyName + + " is " + existingPropertyVal); if (existingPropertyVal > 1) { setHiDPIScale(existingPropertyVal); @@ -144,8 +144,9 @@ public class HiDPISetting } } catch (NumberFormatException e) { - System.out.println("Could not convert property " + scalePropertyName - + " vale '" + existingProperty + "' to number"); + jalview.bin.Console.outPrintln( + "Could not convert property " + scalePropertyName + + " vale '" + existingProperty + "' to number"); } } @@ -159,7 +160,11 @@ public class HiDPISetting dpi = screenInfo.getScreenResolution(); } catch (HeadlessException e) { - System.err.println("Cannot get screen resolution: " + e.getMessage()); + if (isLinux) + { + jalview.bin.Console.errPrintln( + "Cannot get screen resolution: " + e.getMessage()); + } } // try and get screen size height and width @@ -171,8 +176,12 @@ public class HiDPISetting mindimension = Math.min(height, width); } catch (HeadlessException e) { - System.err.println( - "Cannot get screen size height and width:" + e.getMessage()); + if (isLinux) + { + jalview.bin.Console + .errPrintln("Cannot get screen size height and width:" + + e.getMessage()); + } } // attempt at a formula for scaling based on screen dpi and mindimension. diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 3a733f3..810d835 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -274,7 +274,7 @@ public class Jalview * */ { - System.out.println("not in js"); + Console.outPrintln("not in js"); } // BH - for event debugging in JavaScript (Java mode only) @@ -383,29 +383,30 @@ public class Jalview }.start(); } - if (!quiet() || bootstrapArgs.contains(Arg.VERSION)) + if (!quiet() || !bootstrapArgs.outputToStdout() + || bootstrapArgs.contains(Arg.VERSION)) { - System.out.println( + Console.outPrintln( "Java version: " + System.getProperty("java.version")); - System.out.println("Java home: " + System.getProperty("java.home")); - System.out.println("Java arch: " + System.getProperty("os.arch") + " " + Console.outPrintln("Java home: " + System.getProperty("java.home")); + Console.outPrintln("Java arch: " + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version")); String val = System.getProperty("sys.install4jVersion"); if (val != null) { - System.out.println("Install4j version: " + val); + Console.outPrintln("Install4j version: " + val); } val = System.getProperty("installer_template_version"); if (val != null) { - System.out.println("Install4j template version: " + val); + Console.outPrintln("Install4j template version: " + val); } val = System.getProperty("launcher_version"); if (val != null) { - System.out.println("Launcher version: " + val); + Console.outPrintln("Launcher version: " + val); } } @@ -463,6 +464,7 @@ public class Jalview // register SIGTERM listener Runtime.getRuntime().addShutdownHook(new Thread() { + @Override public void run() { Console.debug("Running shutdown hook"); @@ -509,7 +511,7 @@ public class Jalview Cache.loadProperties(usrPropsFile); if (usrPropsFile != null) { - System.out.println( + Console.outPrintln( "CMD [-props " + usrPropsFile + "] executed successfully!"); testoutput(bootstrapArgs, Arg.PROPS, "test/jalview/bin/testProps.jvprops", usrPropsFile); @@ -541,7 +543,7 @@ public class Jalview { List> helpArgs = bootstrapArgs .getList(Arg.HELP); - System.out.println(Arg.usage(helpArgs.stream().map(e -> e.getKey()) + Console.outPrintln(Arg.usage(helpArgs.stream().map(e -> e.getKey()) .collect(Collectors.toList()))); Jalview.exit(null, 0); } @@ -551,7 +553,7 @@ public class Jalview * Now using new usage statement. showUsage(); */ - System.out.println(Arg.usage()); + Console.outPrintln(Arg.usage()); Jalview.exit(null, 0); } @@ -581,13 +583,13 @@ public class Jalview try { Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl); - System.out.println( + Console.outPrintln( "CMD [-jabaws " + jabawsUrl + "] executed successfully!"); testoutput(bootstrapArgs, Arg.JABAWS, "http://www.compbio.dundee.ac.uk/jabaws", jabawsUrl); } catch (MalformedURLException e) { - System.err.println( + jalview.bin.Console.errPrintln( "Invalid jabaws parameter: " + jabawsUrl + " ignored"); } } @@ -617,7 +619,8 @@ public class Jalview } else { - System.out.println("Executing setprop argument: " + setprop); + jalview.bin.Console + .errPrintln("Executing setprop argument: " + setprop); if (Platform.isJS()) { Cache.setProperty(setprop.substring(0, p), @@ -633,8 +636,7 @@ public class Jalview { headless = true; } - System.setProperty("http.agent", - "Jalview Desktop/" + Cache.getDefault("VERSION", "Unknown")); + System.setProperty("http.agent", HttpUtils.getUserAgent()); try { @@ -750,7 +752,7 @@ public class Jalview } else { - System.out.println("CMD [-nousagestats] executed successfully!"); + Console.outPrintln("CMD [-nousagestats] executed successfully!"); testoutput(argparser, Arg.NOUSAGESTATS); } @@ -766,7 +768,7 @@ public class Jalview // questionnaire Console.debug("Starting questionnaire url at " + url); desktop.checkForQuestionnaire(url); - System.out.println("CMD questionnaire[-" + url + Console.outPrintln("CMD questionnaire[-" + url + "] executed successfully!"); } else @@ -787,8 +789,8 @@ public class Jalview } else { - System.out - .println("CMD [-noquestionnaire] executed successfully!"); + Console.outPrintln( + "CMD [-noquestionnaire] executed successfully!"); testoutput(argparser, Arg.QUESTIONNAIRE); } @@ -810,6 +812,7 @@ public class Jalview // Run Commands from cli cmds = new Commands(argparser, headlessArg); boolean commandsSuccess = cmds.argsWereParsed(); + if (commandsSuccess) { if (headlessArg) @@ -877,7 +880,7 @@ public class Jalview .getString("status.processing_commandline_args"), progress = System.currentTimeMillis()); } - System.out.println("CMD [-open " + file + "] executed successfully!"); + Console.outPrintln("CMD [-open " + file + "] executed successfully!"); if (!Platform.isJS()) /** @@ -914,7 +917,7 @@ public class Jalview format); if (af == null) { - System.out.println("error"); + Console.outPrintln("error"); } else { @@ -929,7 +932,7 @@ public class Jalview if (cs != null) { - System.out.println( + Console.outPrintln( "CMD [-colour " + data + "] executed successfully!"); } af.changeColour(cs); @@ -941,8 +944,8 @@ public class Jalview { af.parseFeaturesFile(data, AppletFormatAdapter.checkProtocol(data)); - // System.out.println("Added " + data); - System.out.println( + // Console.outPrintln("Added " + data); + Console.outPrintln( "CMD groups[-" + data + "] executed successfully!"); } data = aparser.getValue("features", true); @@ -950,8 +953,8 @@ public class Jalview { af.parseFeaturesFile(data, AppletFormatAdapter.checkProtocol(data)); - // System.out.println("Added " + data); - System.out.println( + // Console.outPrintln("Added " + data); + Console.outPrintln( "CMD [-features " + data + "] executed successfully!"); } @@ -959,8 +962,8 @@ public class Jalview if (data != null) { af.loadJalviewDataFile(data, null, null, null); - // System.out.println("Added " + data); - System.out.println( + // Console.outPrintln("Added " + data); + Console.outPrintln( "CMD [-annotations " + data + "] executed successfully!"); } // set or clear the sortbytree flag. @@ -969,7 +972,7 @@ public class Jalview af.getViewport().setSortByTree(true); if (af.getViewport().getSortByTree()) { - System.out.println("CMD [-sortbytree] executed successfully!"); + Console.outPrintln("CMD [-sortbytree] executed successfully!"); } } if (aparser.contains("no-annotation")) @@ -977,7 +980,7 @@ public class Jalview af.getViewport().setShowAnnotation(false); if (!af.getViewport().isShowAnnotation()) { - System.out.println("CMD no-annotation executed successfully!"); + Console.outPrintln("CMD no-annotation executed successfully!"); } } if (aparser.contains("nosortbytree")) @@ -985,8 +988,8 @@ public class Jalview af.getViewport().setSortByTree(false); if (!af.getViewport().getSortByTree()) { - System.out - .println("CMD [-nosortbytree] executed successfully!"); + Console.outPrintln( + "CMD [-nosortbytree] executed successfully!"); } } data = aparser.getValue("tree", true); @@ -994,7 +997,7 @@ public class Jalview { try { - System.out.println( + Console.outPrintln( "CMD [-tree " + data + "] executed successfully!"); NewickFile nf = new NewickFile(data, AppletFormatAdapter.checkProtocol(data)); @@ -1002,7 +1005,7 @@ public class Jalview .setCurrentTree(af.showNewickTree(nf, data).getTree()); } catch (IOException ex) { - System.err.println("Couldn't add tree " + data); + jalview.bin.Console.errPrintln("Couldn't add tree " + data); ex.printStackTrace(System.err); } } @@ -1011,9 +1014,9 @@ public class Jalview { // Execute the groovy script after we've done all the rendering stuff // and before any images or figures are generated. - System.out.println("Executing script " + groovyscript); + Console.outPrintln("Executing script " + groovyscript); executeGroovyScript(groovyscript, af); - System.out.println("CMD groovy[" + groovyscript + Console.outPrintln("CMD groovy[" + groovyscript + "] executed successfully!"); groovyscript = null; } @@ -1027,14 +1030,14 @@ public class Jalview if (outputFormat.equalsIgnoreCase("png")) { - System.out.println("Creating PNG image: " + file); + Console.outPrintln("Creating PNG image: " + file); af.createPNG(new File(file)); imageName = (new File(file)).getName(); continue; } else if (outputFormat.equalsIgnoreCase("svg")) { - System.out.println("Creating SVG image: " + file); + Console.outPrintln("Creating SVG image: " + file); File imageFile = new File(file); imageName = imageFile.getName(); af.createSVG(imageFile); @@ -1046,7 +1049,7 @@ public class Jalview imageName = imageFile.getName(); HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel); - System.out.println("Creating HTML image: " + file); + Console.outPrintln("Creating HTML image: " + file); htmlSVG.exportHTML(file); continue; } @@ -1054,7 +1057,8 @@ public class Jalview { if (file == null) { - System.err.println("The output html file must not be null"); + jalview.bin.Console.errPrintln( + "The output html file must not be null"); return; } try @@ -1066,21 +1070,21 @@ public class Jalview e.printStackTrace(); } BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel); - System.out.println( + Console.outPrintln( "Creating BioJS MSA Viwer HTML file: " + file); bjs.exportHTML(file); continue; } else if (outputFormat.equalsIgnoreCase("imgMap")) { - System.out.println("Creating image map: " + file); + Console.outPrintln("Creating image map: " + file); af.createImageMap(new File(file), imageName); continue; } else if (outputFormat.equalsIgnoreCase("eps")) { File outputFile = new File(file); - System.out.println( + Console.outPrintln( "Creating EPS file: " + outputFile.getAbsolutePath()); af.createEPS(outputFile); continue; @@ -1092,14 +1096,14 @@ public class Jalview outFormat = FileFormats.getInstance().forName(outputFormat); } catch (Exception formatP) { - System.out.println("Couldn't parse " + outFormat + Console.outPrintln("Couldn't parse " + outFormat + " as a valid Jalview format string."); } if (outFormat != null) { if (!outFormat.isWritable()) { - System.out.println( + Console.outPrintln( "This version of Jalview does not support alignment export as " + outputFormat); } @@ -1108,19 +1112,19 @@ public class Jalview af.saveAlignment(file, outFormat); if (af.isSaveAlignmentSuccessful()) { - System.out.println("Written alignment in " + Console.outPrintln("Written alignment in " + outFormat.getName() + " format to " + file); } else { - System.out.println("Error writing file " + file + " in " + Console.outPrintln("Error writing file " + file + " in " + outFormat.getName() + " format!!"); } } } } catch (ImageOutputException ioexc) { - System.out.println( + Console.outPrintln( "Unexpected error whilst exporting image to " + file); ioexc.printStackTrace(); } @@ -1129,7 +1133,7 @@ public class Jalview while (aparser.getSize() > 0) { - System.out.println("Unknown arg: " + aparser.nextValue()); + Console.outPrintln("Unknown arg: " + aparser.nextValue()); } } } @@ -1197,12 +1201,12 @@ public class Jalview { if (Cache.groovyJarsPresent()) { - System.out.println("Executing script " + groovyscript); + Console.outPrintln("Executing script " + groovyscript); executeGroovyScript(groovyscript, startUpAlframe); } else { - System.err.println( + jalview.bin.Console.errPrintln( "Sorry. Groovy Support is not available, so ignoring the provided groovy script " + groovyscript); } @@ -1497,7 +1501,7 @@ public class Jalview UIManager.put("TabbedPane.tabType", "card"); UIManager.put("TabbedPane.showTabSeparators", true); UIManager.put("TabbedPane.showContentSeparator", true); - UIManager.put("TabbedPane.tabSeparatorsFullHeight", true); + // UIManager.put("TabbedPane.tabSeparatorsFullHeight", true); UIManager.put("TabbedPane.tabsOverlapBorder", true); UIManager.put("TabbedPane.hasFullBorder", true); UIManager.put("TabbedPane.tabLayoutPolicy", "scroll"); @@ -1547,7 +1551,7 @@ public class Jalview /* private static void showUsage() { - System.out.println( + jalview.bin.Console.outPrintln( "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n" + "-nodisplay\tRun Jalview without User Interface.\n" + "-props FILE\tUse the given Jalview properties file instead of users default.\n" @@ -1573,7 +1577,7 @@ public class Jalview + "-questionnaire URL\tQueries the given URL for information about any Jalview user questionnaires.\n" + "-noquestionnaire\tTurn off questionnaire check.\n" + "-nonews\tTurn off check for Jalview news.\n" - + "-nousagestats\tTurn off google analytics tracking for this session.\n" + + "-nousagestats\tTurn off analytics tracking for this session.\n" + "-sortbytree OR -nosortbytree\tEnable or disable sorting of the given alignment by the given tree\n" // + // "-setprop PROPERTY=VALUE\tSet the given Jalview property, @@ -1596,16 +1600,15 @@ public class Jalview */ PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop, "USAGESTATS", - MessageManager.getString("prompt.google_analytics_title"), - MessageManager.getString("prompt.google_analytics"), + MessageManager.getString("prompt.plausible_analytics_title"), + MessageManager.getString("prompt.plausible_analytics"), new Runnable() { @Override public void run() { - Console.debug( - "Initialising googletracker for usage stats."); - Cache.initGoogleTracker(); + Console.debug("Initialising analytics for usage stats."); + Cache.initAnalytics(); Console.debug("Tracking enabled."); } }, new Runnable() @@ -1613,7 +1616,7 @@ public class Jalview @Override public void run() { - Console.debug("Not enabling Google Tracking."); + Console.debug("Not enabling analytics."); } }, null, true); desktop.addDialogThread(prompter); @@ -1659,9 +1662,10 @@ public class Jalview } catch (Exception ex) { - System.err.println("Failed to read from STDIN into tempfile " - + ((tfile == null) ? "(tempfile wasn't created)" - : tfile.toString())); + jalview.bin.Console + .errPrintln("Failed to read from STDIN into tempfile " + + ((tfile == null) ? "(tempfile wasn't created)" + : tfile.toString())); ex.printStackTrace(); return; } @@ -1670,7 +1674,7 @@ public class Jalview sfile = tfile.toURI().toURL(); } catch (Exception x) { - System.err.println( + jalview.bin.Console.errPrintln( "Unexpected Malformed URL Exception for temporary file created from STDIN: " + tfile.toURI()); x.printStackTrace(); @@ -1687,17 +1691,20 @@ public class Jalview tfile = new File(groovyscript); if (!tfile.exists()) { - System.err.println("File '" + groovyscript + "' does not exist."); + jalview.bin.Console.errPrintln( + "File '" + groovyscript + "' does not exist."); return; } if (!tfile.canRead()) { - System.err.println("File '" + groovyscript + "' cannot be read."); + jalview.bin.Console.errPrintln( + "File '" + groovyscript + "' cannot be read."); return; } if (tfile.length() < 1) { - System.err.println("File '" + groovyscript + "' is empty."); + jalview.bin.Console + .errPrintln("File '" + groovyscript + "' is empty."); return; } try @@ -1705,7 +1712,7 @@ public class Jalview sfile = tfile.getAbsoluteFile().toURI().toURL(); } catch (Exception ex) { - System.err.println("Failed to create a file URL for " + jalview.bin.Console.errPrintln("Failed to create a file URL for " + tfile.getAbsoluteFile()); return; } @@ -1730,8 +1737,9 @@ public class Jalview } } catch (Exception e) { - System.err.println("Exception Whilst trying to execute file " + sfile - + " as a groovy script."); + jalview.bin.Console + .errPrintln("Exception Whilst trying to execute file " + sfile + + " as a groovy script."); e.printStackTrace(System.err); } @@ -1787,11 +1795,11 @@ public class Jalview { if (exitcode == 0) { - System.out.println(message); + Console.outPrintln(message); } else { - System.err.println(message); + jalview.bin.Console.errPrintln(message); } } } @@ -1883,7 +1891,7 @@ public class Jalview if (yes && ((s1 == null && s2 == null) || (s1 != null && s1.equals(s2)))) { - System.out.println("[TESTOUTPUT] arg " + a.argString() + "='" + s1 + Console.outPrintln("[TESTOUTPUT] arg " + a.argString() + "='" + s1 + "' was set"); } } @@ -1941,6 +1949,6 @@ public class Jalview { message = a.argString() + (yes ? " was set" : " was not set"); } - System.out.println("[TESTOUTPUT] arg " + message); + Console.outPrintln("[TESTOUTPUT] arg " + message); } } diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index 7d66f6d..e8be95f 100644 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -292,7 +292,7 @@ public class JalviewLite extends Applet { if (debug) { - System.err.println("Selecting region using separator string '" + jalview.bin.Console.errPrintln("Selecting region using separator string '" + separator + "'"); } } @@ -344,7 +344,7 @@ public class JalviewLite extends Applet from--; } catch (NumberFormatException ex) { - System.err.println( + jalview.bin.Console.errPrintln( "ERROR: Couldn't parse first integer in range element column selection string '" + cl + "' - format is 'from-to'"); return; @@ -355,7 +355,7 @@ public class JalviewLite extends Applet to--; } catch (NumberFormatException ex) { - System.err.println( + jalview.bin.Console.errPrintln( "ERROR: Couldn't parse second integer in range element column selection string '" + cl + "' - format is 'from-to'"); return; @@ -396,13 +396,13 @@ public class JalviewLite extends Applet } if (debug) { - System.err.println("Range '" + cl + "' deparsed as [" + from + jalview.bin.Console.errPrintln("Range '" + cl + "' deparsed as [" + from + "," + to + "]"); } } else { - System.err.println("ERROR: Invalid Range '" + cl + jalview.bin.Console.errPrintln("ERROR: Invalid Range '" + cl + "' deparsed as [" + from + "," + to + "]"); } } @@ -422,7 +422,7 @@ public class JalviewLite extends Applet } else { - System.err.println( + jalview.bin.Console.errPrintln( "ERROR: Couldn't parse integer from point selection element of column selection string '" + cl + "'"); return; @@ -451,13 +451,13 @@ public class JalviewLite extends Applet csel.addElement(r); if (debug) { - System.err.println("Point selection '" + cl + jalview.bin.Console.errPrintln("Point selection '" + cl + "' deparsed as [" + r + "]"); } } else { - System.err.println("ERROR: Invalid Point selection '" + cl + jalview.bin.Console.errPrintln("ERROR: Invalid Point selection '" + cl + "' deparsed as [" + r + "]"); } } @@ -940,7 +940,7 @@ public class JalviewLite extends Applet listener = listener.trim(); if (listener.length() == 0) { - System.err.println( + jalview.bin.Console.errPrintln( "jalview Javascript error: Ignoring empty function for mouseover listener."); return; } @@ -952,11 +952,11 @@ public class JalviewLite extends Applet .addStructureViewerListener(mol); if (debug) { - System.err.println("Added a mouseover listener for " + jalview.bin.Console.errPrintln("Added a mouseover listener for " + ((af == null) ? "All frames" : "Just views for " + af.getAlignViewport().getSequenceSetId())); - System.err.println("There are now " + javascriptListeners.size() + jalview.bin.Console.errPrintln("There are now " + javascriptListeners.size() + " listeners in total."); } } @@ -987,7 +987,7 @@ public class JalviewLite extends Applet listener = listener.trim(); if (listener.length() == 0) { - System.err.println( + jalview.bin.Console.errPrintln( "jalview Javascript error: Ignoring empty function for selection listener."); return; } @@ -999,11 +999,11 @@ public class JalviewLite extends Applet .addSelectionListener(mol); if (debug) { - System.err.println("Added a selection listener for " + jalview.bin.Console.errPrintln("Added a selection listener for " + ((af == null) ? "All frames" : "Just views for " + af.getAlignViewport().getSequenceSetId())); - System.err.println("There are now " + javascriptListeners.size() + jalview.bin.Console.errPrintln("There are now " + javascriptListeners.size() + " listeners in total."); } } @@ -1027,7 +1027,7 @@ public class JalviewLite extends Applet listener = listener.trim(); if (listener.length() == 0) { - System.err.println( + jalview.bin.Console.errPrintln( "jalview Javascript error: Ignoring empty function for selection listener."); return; } @@ -1039,9 +1039,9 @@ public class JalviewLite extends Applet .addStructureViewerListener(mol); if (debug) { - System.err.println("Added a javascript structure viewer listener '" + jalview.bin.Console.errPrintln("Added a javascript structure viewer listener '" + listener + "'"); - System.err.println("There are now " + javascriptListeners.size() + jalview.bin.Console.errPrintln("There are now " + javascriptListeners.size() + " listeners in total."); } } @@ -1087,7 +1087,7 @@ public class JalviewLite extends Applet rprt = debug; if (debug) { - System.err.println("Removed listener '" + listener + "'"); + jalview.bin.Console.errPrintln("Removed listener '" + listener + "'"); } } else @@ -1097,7 +1097,7 @@ public class JalviewLite extends Applet } if (rprt) { - System.err.println("There are now " + javascriptListeners.size() + jalview.bin.Console.errPrintln("There are now " + javascriptListeners.size() + " listeners in total."); } } @@ -1105,14 +1105,14 @@ public class JalviewLite extends Applet @Override public void stop() { - System.err.println("Applet " + getName() + " stop()."); + jalview.bin.Console.errPrintln("Applet " + getName() + " stop()."); tidyUp(); } @Override public void destroy() { - System.err.println("Applet " + getName() + " destroy()."); + jalview.bin.Console.errPrintln("Applet " + getName() + " destroy()."); tidyUp(); } @@ -1189,7 +1189,7 @@ public class JalviewLite extends Applet } } catch (NumberFormatException e) { - System.err.println("Ignoring invalid residue number string '" + jalview.bin.Console.errPrintln("Ignoring invalid residue number string '" + pdbResNum + "'"); } @@ -1220,7 +1220,7 @@ public class JalviewLite extends Applet } catch (Exception ex) { - System.err.println("Couldn't parse integer arguments (topRow='" + jalview.bin.Console.errPrintln("Couldn't parse integer arguments (topRow='" + topRow + "' and leftHandColumn='" + leftHandColumn + "')"); ex.printStackTrace(); @@ -1251,7 +1251,7 @@ public class JalviewLite extends Applet } catch (Exception ex) { - System.err.println("Couldn't parse integer arguments (topRow='" + jalview.bin.Console.errPrintln("Couldn't parse integer arguments (topRow='" + topRow + "')"); ex.printStackTrace(); } @@ -1283,7 +1283,7 @@ public class JalviewLite extends Applet } catch (Exception ex) { - System.err.println( + jalview.bin.Console.errPrintln( "Couldn't parse integer arguments (leftHandColumn='" + leftHandColumn + "')"); ex.printStackTrace(); @@ -1415,18 +1415,18 @@ public class JalviewLite extends Applet { if (debug) { - System.err.println("Applet context is '" + jalview.bin.Console.errPrintln("Applet context is '" + getAppletContext().getClass().toString() + "'"); } JSObject scriptObject = JSObject.getWindow(this); if (debug && scriptObject != null) { - System.err.println("Applet has Javascript callback support."); + jalview.bin.Console.errPrintln("Applet has Javascript callback support."); } } catch (Exception ex) { - System.err.println( + jalview.bin.Console.errPrintln( "Warning: No JalviewLite javascript callbacks available."); if (debug) { @@ -1436,9 +1436,9 @@ public class JalviewLite extends Applet if (debug) { - System.err.println("JalviewLite Version " + getVersion()); - System.err.println("Build Date : " + getBuildDate()); - System.err.println("Installation : " + getInstallation()); + jalview.bin.Console.errPrintln("JalviewLite Version " + getVersion()); + jalview.bin.Console.errPrintln("Build Date : " + getBuildDate()); + jalview.bin.Console.errPrintln("Installation : " + getInstallation()); } String externalsviewer = getParameter("externalstructureviewer"); if (externalsviewer != null) @@ -1465,7 +1465,7 @@ public class JalviewLite extends Applet separator = sep; if (debug) { - System.err.println("Separator set to '" + separator + "'"); + jalview.bin.Console.errPrintln("Separator set to '" + separator + "'"); } } else @@ -1573,7 +1573,7 @@ public class JalviewLite extends Applet { if (tries > 0) { - System.err.println("LiveConnect request thread going to sleep."); + jalview.bin.Console.errPrintln("LiveConnect request thread going to sleep."); } try { @@ -1584,7 +1584,7 @@ public class JalviewLite extends Applet ; if (tries++ > 0) { - System.err.println("LiveConnect request thread woken up."); + jalview.bin.Console.errPrintln("LiveConnect request thread woken up."); } try { @@ -1595,7 +1595,7 @@ public class JalviewLite extends Applet } } catch (Exception jsex) { - System.err.println("Attempt " + tries + jalview.bin.Console.errPrintln("Attempt " + tries + " to access LiveConnect javascript failed."); } } @@ -1632,14 +1632,14 @@ public class JalviewLite extends Applet "Calling oninit callback '" + initjscallback + "'."); } catch (Exception e) { - System.err.println("Exception when executing _oninit callback '" + jalview.bin.Console.errPrintln("Exception when executing _oninit callback '" + initjscallback + "'."); e.printStackTrace(); } } else { - System.err.println("Not executing _oninit callback '" + jalview.bin.Console.errPrintln("Not executing _oninit callback '" + initjscallback + "' - no scripting allowed."); } } @@ -1700,7 +1700,7 @@ public class JalviewLite extends Applet ((AlignFrame) frame).viewport.applet.currentAlignFrame = (AlignFrame) frame; if (debug) { - System.err.println("Activated window " + frame); + jalview.bin.Console.errPrintln("Activated window " + frame); } } // be good. @@ -1715,7 +1715,7 @@ public class JalviewLite extends Applet * * public void windowDeactivated(WindowEvent e) { if (currentAlignFrame == * frame) { currentAlignFrame = null; if (debug) { - * System.err.println("Deactivated window "+frame); } } + * jalview.bin.Console.errPrintln("Deactivated window "+frame); } } * super.windowDeactivated(e); } */ }); @@ -1801,7 +1801,7 @@ public class JalviewLite extends Applet } if (!jmolAvailable) { - System.out.println( + jalview.bin.Console.outPrintln( "Jmol not available - Using mc_view for structures"); } } catch (java.lang.ClassNotFoundException ex) @@ -1813,7 +1813,7 @@ public class JalviewLite extends Applet jmolAvailable = false; if (debug) { - System.err.println( + jalview.bin.Console.errPrintln( "Skipping Jmol check. Will use mc_view (probably)"); } } @@ -1844,7 +1844,7 @@ public class JalviewLite extends Applet { if (JalviewLite.debug) { - System.err.println(msg); + jalview.bin.Console.errPrintln(msg); } } @@ -1884,7 +1884,7 @@ public class JalviewLite extends Applet { if (debug) { - System.err.println("Prepended document base '" + documentBase + jalview.bin.Console.errPrintln("Prepended document base '" + documentBase + "' to make: '" + withDocBase + "'"); } protocol = DataSourceType.URL; @@ -1903,7 +1903,7 @@ public class JalviewLite extends Applet protocol = DataSourceType.URL; if (debug) { - System.err.println("Prepended codebase '" + codeBase + jalview.bin.Console.errPrintln("Prepended codebase '" + codeBase + "' to make: '" + withCodeBase + "'"); } return withCodeBase; @@ -2010,7 +2010,7 @@ public class JalviewLite extends Applet + " as " + (al1.isNucleotide() ? "protein product" : "cDNA") + " for " + af.getTitle(); - System.err.println(msg); + jalview.bin.Console.errPrintln(msg); } } @@ -2084,7 +2084,7 @@ public class JalviewLite extends Applet dbgMsg(">>>Dump finished."); } catch (Exception e) { - System.err.println( + jalview.bin.Console.errPrintln( "Exception when trying to dump the content of the file parameter."); e.printStackTrace(); } @@ -2214,7 +2214,7 @@ public class JalviewLite extends Applet { // this may not really be a problem but we give a warning // anyway - System.err.println( + jalview.bin.Console.errPrintln( "Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence " + i + ")"); } @@ -2320,7 +2320,7 @@ public class JalviewLite extends Applet } else { - System.err.println( + jalview.bin.Console.errPrintln( "Annotations were not added from annotation file '" + param + "'"); } @@ -2392,13 +2392,13 @@ public class JalviewLite extends Applet { if (debug) { - System.err.println( + jalview.bin.Console.errPrintln( "Attempting to load T-COFFEE score file from the scoreFile parameter"); } result = alignFrame.loadScoreFile(sScoreFile); if (!result) { - System.err.println( + jalview.bin.Console.errPrintln( "Failed to parse T-COFFEE parameter as a valid score file ('" + sScoreFile + "')"); } @@ -2469,13 +2469,13 @@ public class JalviewLite extends Applet boolean rtn = (getClass().getResourceAsStream("/" + f) != null); if (debug) { - System.err.println("Resource '" + f + "' was " + jalview.bin.Console.errPrintln("Resource '" + f + "' was " + (rtn ? "" : "not ") + "located by classloader."); } return rtn; } catch (Exception ex) { - System.out.println("Exception checking resources: " + f + " " + ex); + jalview.bin.Console.outPrintln("Exception checking resources: " + f + " " + ex); return false; } } @@ -2496,7 +2496,7 @@ public class JalviewLite extends Applet { return initialAlignFrame; } - System.err.println( + jalview.bin.Console.errPrintln( "Implementation error: Jalview Applet API cannot work out which AlignFrame to use."); return null; } @@ -2564,18 +2564,18 @@ public class JalviewLite extends Applet jv.removeAllElements(); if (debug) { - System.err.println("Array from '" + separator + jalview.bin.Console.errPrintln("Array from '" + separator + "' separated List:\n" + v.length); for (int i = 0; i < v.length; i++) { - System.err.println("item " + i + " '" + v[i] + "'"); + jalview.bin.Console.errPrintln("item " + i + " '" + v[i] + "'"); } } return v; } if (debug) { - System.err.println( + jalview.bin.Console.errPrintln( "Empty Array from '" + separator + "' separated List"); } return null; @@ -2620,13 +2620,13 @@ public class JalviewLite extends Applet { System.err .println("Returning '" + separator + "' separated List:\n"); - System.err.println(v); + jalview.bin.Console.errPrintln(v); } return v.toString(); } if (debug) { - System.err.println( + jalview.bin.Console.errPrintln( "Returning empty '" + separator + "' separated List\n"); } return "" + separator; @@ -2745,7 +2745,7 @@ public class JalviewLite extends Applet this.separator = separator; if (debug) { - System.err.println("Default Separator now: '" + separator + "'"); + jalview.bin.Console.errPrintln("Default Separator now: '" + separator + "'"); } } @@ -2901,7 +2901,7 @@ public class JalviewLite extends Applet Color col = ColorUtils.parseColourString(colprop); if (col == null) { - System.err.println("Couldn't parse '" + colprop + "' as a colour for " + jalview.bin.Console.errPrintln("Couldn't parse '" + colprop + "' as a colour for " + colparam); } return (col == null) ? defcolour : col; @@ -2971,7 +2971,7 @@ public class JalviewLite extends Applet } if (debug) { - System.err.println( + jalview.bin.Console.errPrintln( "resolveUrlForLocalOrAbsolute returning " + resolvedPath); } return resolvedPath; @@ -3000,7 +3000,7 @@ public class JalviewLite extends Applet : getDocumentBase()); if (debug) { - System.err.println("Show url (prepended " + prepend + jalview.bin.Console.errPrintln("Show url (prepended " + prepend + " - toggle resolvetocodebase if code/docbase resolution is wrong): " + url); } @@ -3009,7 +3009,7 @@ public class JalviewLite extends Applet { if (debug) { - System.err.println("Show url: " + url); + jalview.bin.Console.errPrintln("Show url: " + url); } } if (url.indexOf("javascript:") == 0) diff --git a/src/jalview/bin/JalviewLiteURLRetrieve.java b/src/jalview/bin/JalviewLiteURLRetrieve.java index f2ffda5..d38892a 100644 --- a/src/jalview/bin/JalviewLiteURLRetrieve.java +++ b/src/jalview/bin/JalviewLiteURLRetrieve.java @@ -64,7 +64,7 @@ public class JalviewLiteURLRetrieve extends Applet DataSourceType protocol = null; try { - System.out.println("Loading thread started with:\n>>file\n" + file + jalview.bin.Console.outPrintln("Loading thread started with:\n>>file\n" + file + ">>endfile"); // This might throw a security exception in certain browsers // Netscape Communicator for instance. @@ -77,7 +77,7 @@ public class JalviewLiteURLRetrieve extends Applet rtn = true; is.close(); } - System.err.println("Resource '" + file + "' was " + jalview.bin.Console.errPrintln("Resource '" + file + "' was " + (rtn ? "" : "not") + " located by classloader."); if (rtn) { @@ -86,7 +86,7 @@ public class JalviewLiteURLRetrieve extends Applet } catch (Exception ex) { - System.out.println( + jalview.bin.Console.outPrintln( "Exception checking resources: " + file + " " + ex); } if (file.indexOf("://") > -1) @@ -99,7 +99,7 @@ public class JalviewLiteURLRetrieve extends Applet protocol = DataSourceType.FILE; } - System.out.println("Trying to get contents of resource:"); + jalview.bin.Console.outPrintln("Trying to get contents of resource:"); FileParse fp = new FileParse(file, protocol); if (fp.isValid()) { @@ -112,7 +112,7 @@ public class JalviewLiteURLRetrieve extends Applet } else { - System.out.println("Resource at " + file + jalview.bin.Console.outPrintln("Resource at " + file + " cannot be read with protocol==" + protocol); return; } @@ -121,11 +121,11 @@ public class JalviewLiteURLRetrieve extends Applet if (format == null) { format = new IdentifyFile().identify(file, protocol); - System.out.println("Format is " + format); + jalview.bin.Console.outPrintln("Format is " + format); } else { - System.out.println("User specified Format is " + format); + jalview.bin.Console.outPrintln("User specified Format is " + format); } AlignmentI al = null; try @@ -133,17 +133,17 @@ public class JalviewLiteURLRetrieve extends Applet al = new AppletFormatAdapter().readFile(file, protocol, format); } catch (java.io.IOException ex) { - System.err.println("Failed to open the file."); + jalview.bin.Console.errPrintln("Failed to open the file."); ex.printStackTrace(); } if (al != null) { - System.out.println(new AppletFormatAdapter() + jalview.bin.Console.outPrintln(new AppletFormatAdapter() .formatSequences(FileFormat.Fasta, al, false)); } } catch (Exception e) { - System.err.println("bailing out : Unexpected exception:"); + jalview.bin.Console.errPrintln("bailing out : Unexpected exception:"); e.printStackTrace(); } } diff --git a/src/jalview/bin/JalviewTaskbar.java b/src/jalview/bin/JalviewTaskbar.java index c7ababa..e04c04f 100644 --- a/src/jalview/bin/JalviewTaskbar.java +++ b/src/jalview/bin/JalviewTaskbar.java @@ -46,7 +46,7 @@ public class JalviewTaskbar } else { - System.out.println("Unable to setIconImage()"); + Console.outPrintln("Unable to setIconImage()"); } } } diff --git a/src/jalview/bin/Launcher.java b/src/jalview/bin/Launcher.java index 9ddfa0d..e1415be 100644 --- a/src/jalview/bin/Launcher.java +++ b/src/jalview/bin/Launcher.java @@ -50,28 +50,7 @@ public class Launcher { private final static String startClass = "jalview.bin.Jalview"; - private static boolean checkJVMSymlink(String testBin) - { - File testBinFile = new File(testBin); - if (!testBinFile.exists()) - { - return false; - } - File targetFile = null; - try - { - targetFile = testBinFile.getCanonicalFile(); - } catch (IOException e) - { - return false; - } - if (targetFile != null && ("java".equals(targetFile.getName()) - || "java.exe".equals(targetFile.getName()))) - { - return true; - } - return false; - } + private final static String headlessProperty = "java.awt.headless"; /** * main method for jalview.bin.Launcher. This restarts the same JRE's JVM with @@ -85,57 +64,27 @@ public class Launcher { if (!LaunchUtils.checkJavaVersion()) { - System.err.println("WARNING - The Java version being used (Java " - + LaunchUtils.getJavaVersion() - + ") may lead to problems. This installation of Jalview should be used with Java " - + LaunchUtils.getJavaCompileVersion() + "."); - } - final String appName = ChannelProperties.getProperty("app_name"); - final String javaBinDir = System.getProperty("java.home") - + File.separator + "bin" + File.separator; - String javaBin = null; - if (javaBin == null && checkJVMSymlink(javaBinDir + appName)) - { - javaBin = javaBinDir + appName; - } - if (javaBin == null && checkJVMSymlink(javaBinDir + "Jalview")) - { - javaBin = javaBinDir + "Jalview"; - } - if (javaBin == null && checkJVMSymlink(javaBinDir + "java")) - { - javaBin = javaBinDir + "java"; - } - if (javaBin == null) - { - javaBin = "java"; - } - - List command = new ArrayList<>(); - command.add(javaBin); - - String memSetting = null; - - boolean isAMac = System.getProperty("os.name").indexOf("Mac") > -1; - - for (String jvmArg : ManagementFactory.getRuntimeMXBean() - .getInputArguments()) - { - command.add(jvmArg); + jalview.bin.Console + .errPrintln("WARNING - The Java version being used (Java " + + LaunchUtils.getJavaVersion() + + ") may lead to problems. This installation of Jalview should be used with Java " + + LaunchUtils.getJavaCompileVersion() + "."); } - command.add("-cp"); - command.add(ManagementFactory.getRuntimeMXBean().getClassPath()); String jvmmempc = null; String jvmmemmax = null; boolean debug = false; boolean wait = true; boolean quiet = false; + boolean headless = false; + boolean gui = false; + boolean stdout = false; // must set --debug before --launcher... boolean launcherstop = false; boolean launcherprint = false; boolean launcherwait = false; ArrayList arguments = new ArrayList<>(); + String previousArg = null; for (String arg : args) { if (arg.equals("--debug")) @@ -146,6 +95,19 @@ public class Launcher { quiet = true; } + if (arg.equals("--headless")) + { + headless = true; + } + if (arg.equals("--gui")) + { + gui = true; + } + if (arg.equals("--output=-") + || (arg.equals("-") && "--output".equals(previousArg))) + { + stdout = true; + } if (debug && arg.equals("--launcherprint")) { launcherprint = true; @@ -163,6 +125,7 @@ public class Launcher { wait = false; } + previousArg = arg; // Don't add the --launcher... args to Jalview launch if (arg.startsWith("--launcher")) { @@ -203,6 +166,29 @@ public class Launcher arguments.add(arg); } } + if (gui) + { + // --gui takes precedence over --headless + headless = false; + } + + final String appName = ChannelProperties.getProperty("app_name"); + + // if we're using jalview.bin.Launcher we always assume a console is in use + final String javaBin = LaunchUtils.findJavaBin(true); + + List command = new ArrayList<>(); + command.add(javaBin); + + String memSetting = null; + + for (String jvmArg : ManagementFactory.getRuntimeMXBean() + .getInputArguments()) + { + command.add(jvmArg); + } + command.add("-cp"); + command.add(ManagementFactory.getRuntimeMXBean().getClassPath()); // use saved preferences if no cmdline args boolean useCustomisedSettings = LaunchUtils @@ -225,6 +211,7 @@ public class Launcher boolean memSet = false; boolean dockIcon = false; boolean dockName = false; + boolean headlessProp = false; for (int i = 0; i < command.size(); i++) { String arg = command.get(i); @@ -245,6 +232,10 @@ public class Launcher { dockName = true; } + else if (arg.startsWith("-D" + headlessProperty + "=")) + { + headlessProp = true; + } } if (!memSet) @@ -259,7 +250,7 @@ public class Launcher } } - if (isAMac) + if (LaunchUtils.isMac) { if (!dockIcon) { @@ -280,11 +271,16 @@ public class Launcher + appName); } } + if (headless && !headlessProp) + { + System.setProperty(headlessProperty, "true"); + command.add("-D" + headlessProperty + "=true"); + } String scalePropertyArg = HiDPISetting.getScalePropertyArg(); if (scalePropertyArg != null) { - sysout(debug, quiet, "Running " + startClass + " with scale setting " + syserr(debug, quiet, "Running " + startClass + " with scale setting " + scalePropertyArg); command.add(scalePropertyArg); } @@ -297,10 +293,10 @@ public class Launcher if ((Boolean.parseBoolean(System.getProperty("launcherprint", "false")) || launcherprint)) { - sysout(debug, quiet, + syserr(debug, quiet, "LAUNCHER COMMAND: " + String.join(" ", builder.command())); } - sysout(debug, quiet, + syserr(debug, quiet, "Running " + startClass + " with " + (memSetting == null ? "no memory setting" : ("memory setting " + memSetting))); @@ -308,7 +304,7 @@ public class Launcher if (Boolean.parseBoolean(System.getProperty("launcherstop", "false")) || (debug && launcherstop)) { - sysout(debug, quiet, + syserr(debug, quiet, "System property 'launcherstop' is set and not 'false'. Exiting."); System.exit(0); } @@ -318,22 +314,23 @@ public class Launcher Process process = builder.start(); if (wait || launcherwait) { - sysout(debug, quiet, "Launching application process"); + syserr(debug, quiet, "Launching application process"); process.waitFor(); } else { int waitInt = 0; - sysout(debug, quiet, + syserr(debug, quiet, "Wait time for application process is " + waitInt + "ms"); process.waitFor(waitInt, TimeUnit.MILLISECONDS); } - sysout(debug, quiet, "Launcher process ending"); + syserr(debug, quiet, "Launcher process ending"); } catch (IOException e) { if (e.getMessage().toLowerCase(Locale.ROOT).contains("memory")) { - System.err.println("Caught a memory exception: " + e.getMessage()); + jalview.bin.Console + .errPrintln("Caught a memory exception: " + e.getMessage()); // Probably the "Cannot allocate memory" error, try without the memory // setting ArrayList commandNoMem = new ArrayList<>(); @@ -346,7 +343,7 @@ public class Launcher } final ProcessBuilder builderNoMem = new ProcessBuilder( commandNoMem); - System.err.println("Command without memory setting: " + jalview.bin.Console.errPrintln("Command without memory setting: " + String.join(" ", builderNoMem.command())); try { @@ -368,11 +365,11 @@ public class Launcher } } - private static void sysout(boolean debug, boolean quiet, String message) + private static void syserr(boolean debug, boolean quiet, String message) { if (debug && !quiet) { - System.out.println("LAUNCHERDEBUG - " + message); + jalview.bin.Console.errPrintln("LAUNCHERDEBUG - " + message); } } diff --git a/src/jalview/bin/MemorySetting.java b/src/jalview/bin/MemorySetting.java index bb545cb..7458d55 100644 --- a/src/jalview/bin/MemorySetting.java +++ b/src/jalview/bin/MemorySetting.java @@ -354,7 +354,7 @@ public class MemorySetting else { // number too big for a Long. Limit to Long.MAX_VALUE - System.out.println("Memory parsing of '" + memString + jalview.bin.Console.outPrintln("Memory parsing of '" + memString + "' produces number too big. Limiting to Long.MAX_VALUE=" + Long.MAX_VALUE); return Long.MAX_VALUE; @@ -395,7 +395,7 @@ public class MemorySetting ADJUSTMENT_MESSAGE = reason; if (!quiet) { - System.out.println(reason); + jalview.bin.Console.outPrintln(reason); } } diff --git a/src/jalview/bin/argparser/Arg.java b/src/jalview/bin/argparser/Arg.java index 2f25978..7882d7b 100644 --- a/src/jalview/bin/argparser/Arg.java +++ b/src/jalview/bin/argparser/Arg.java @@ -29,8 +29,8 @@ public enum Arg Opt.UNARY, Opt.BOOTSTRAP), HEADLESS(Type.CONFIG, "Run Jalview in headless mode. No GUI interface will be created and Jalview will quit after all arguments have been processed. " - + "Headless mode is assumed if an output file is to be generated, this can be overridden with --noheadless or --gui.", - Opt.BOOLEAN, Opt.BOOTSTRAP), + + "Headless mode is assumed if an output file is to be generated, this can be overridden with --gui.", + Opt.UNARY, Opt.BOOTSTRAP), GUI(Type.CONFIG, "Do not run Jalview in headless mode. This overrides the assumption of headless mode when an output file is to be generated.", Opt.UNARY, Opt.BOOTSTRAP), @@ -93,11 +93,10 @@ public enum Arg + "turn-propensity,\n" + "buried-index,\n" + "nucleotide,\n" + "nucleotide-ambiguity,\n" + "purine-pyrimidine,\n" + "rna-helices,\n" - + "t-coffee-scores,\n" + "sequence-id.\n" - +"\n" + + "t-coffee-scores,\n" + "sequence-id.\n" + "\n" + "Names of user defined colourschemes will also work,\n" - +"and jalview colourscheme specifications like\n" - +"--colour=\"D,E=red; K,R,H=0022FF; C,c=yellow\"", + + "and jalview colourscheme specifications like\n" + + "--colour=\"D,E=red; K,R,H=0022FF; C,c=yellow\"", Opt.STRING, Opt.LINKED, Opt.ALLOWALL), FEATURES(Type.OPENING, "Add a feature file or URL to the open alignment.", Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS), @@ -200,7 +199,7 @@ public enum Arg + "clustal (aln),\n" + "phylip (phy),\n" + "jalview (jvp, jar).", Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS, Opt.ALLOWALL, - Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.PRIMARY), + Opt.REQUIREINPUT, Opt.OUTPUTFILE, Opt.STDOUT, Opt.PRIMARY), FORMAT(Type.OUTPUT, "Sets the format for the preceding --output file. Valid formats are:\n" + "fasta,\n" + "pfam,\n" + "stockholm,\n" + "pir,\n" @@ -384,6 +383,11 @@ public enum Arg */ OUTPUTFILE("output file --headless will be assumed unless --gui used"), /* + * A STDOUT Arg can take an output filename that can be '-' to mean print to STDOUT. + */ + STDOUT("allows the output filename '" + ArgParser.STDOUTFILENAME + + "' to mean output to STDOUT"), + /* * A STORED Arg resets and creates a new set of "opened" linkedIds */ STORED(null), diff --git a/src/jalview/bin/argparser/ArgParser.java b/src/jalview/bin/argparser/ArgParser.java index 907b1fa..3862375 100644 --- a/src/jalview/bin/argparser/ArgParser.java +++ b/src/jalview/bin/argparser/ArgParser.java @@ -50,6 +50,8 @@ public class ArgParser public static final char EQUALS = '='; + public static final String STDOUTFILENAME = "-"; + protected static final String NEGATESTRING = "no"; /** @@ -209,12 +211,15 @@ public class ArgParser public ArgParser(String[] args, boolean initsubstitutions, BootstrapArgs bsa) { - // Make a mutable new ArrayList so that shell globbing parser works. - // (When shell file globbing is used, there are a sequence of non-Arg - // arguments (which are the expanded globbed filenames) that need to be - // consumed by the --append/--argfile/etc Arg which is most easily done by - // removing these filenames from the list one at a time. This can't be done - // with an ArrayList made with only Arrays.asList(String[] args). ) + /* + * Make a mutable new ArrayList so that shell globbing parser works. + * (When shell file globbing is used, there are a sequence of non-Arg + * arguments (which are the expanded globbed filenames) that need to be + * consumed by the --append/--argfile/etc Arg which is most easily done + * by removing these filenames from the list one at a time. This can't be + * done with an ArrayList made with only Arrays.asList(String[] args) as + * that is not mutable. ) + */ this(new ArrayList<>(Arrays.asList(args)), initsubstitutions, false, bsa); } @@ -260,27 +265,30 @@ public class ArgParser boolean allowPrivate) { this.substitutions = initsubstitutions; - boolean openEachInitialFilenames = true; - for (int i = 0; i < args.size(); i++) - { - String arg = args.get(i); - // If the first arguments do not start with "--" or "-" or is not "open" - // and` is a filename that exists it is probably a file/list of files to - // open so we fake an Arg.OPEN argument and when adding files only add the - // single arg[i] and increment the defaultLinkedIdCounter so that each of - // these files is opened separately. - if (openEachInitialFilenames && !arg.startsWith(DOUBLEDASH) - && !arg.startsWith("-") && !arg.equals("open") - && (new File(arg).exists() - || HttpUtils.startsWithHttpOrHttps(arg))) - { - arg = Arg.OPEN.argString(); - } - else + /* + * If the first argument does not start with "--" or "-" or is not "open", + * and is a filename that exists or a URL, it is probably a file/list of + * files to open so we insert an Arg.OPEN argument before it. This will + * mean the list of files at the start of the arguments are all opened + * separately. + */ + if (args.size() > 0) + { + String arg0 = args.get(0); + if (arg0 != null + && (!arg0.startsWith(DOUBLEDASH) && !arg0.startsWith("-") + && !arg0.equals("open") && (new File(arg0).exists() + || HttpUtils.startsWithHttpOrHttps(arg0)))) { - openEachInitialFilenames = false; + // insert "--open" at the start + args.add(0, Arg.OPEN.argString()); } + } + + for (int i = 0; i < args.size(); i++) + { + String arg = args.get(i); // look for double-dash, e.g. --arg if (arg.startsWith(DOUBLEDASH)) @@ -431,7 +439,7 @@ public class ArgParser { // There is no "=" so value is next arg or args (possibly shell // glob-expanded) - if ((openEachInitialFilenames ? i : i + 1) >= args.size()) + if (i + 1 >= args.size()) { // no value to take for arg, which wants a value Console.error("Argument '" + a.getName() @@ -446,8 +454,7 @@ public class ArgParser { // if this is the first argument with a file list at the start of // the args we add filenames from index i instead of i+1 - globVals = getShellGlobbedFilenameValues(a, args, - openEachInitialFilenames ? i : i + 1); + globVals = getShellGlobbedFilenameValues(a, args, i + 1); } else { diff --git a/src/jalview/bin/argparser/BootstrapArgs.java b/src/jalview/bin/argparser/BootstrapArgs.java index 4b7b180..ec62bcd 100644 --- a/src/jalview/bin/argparser/BootstrapArgs.java +++ b/src/jalview/bin/argparser/BootstrapArgs.java @@ -28,6 +28,8 @@ public class BootstrapArgs private Set argsTypes = new HashSet<>(); + private boolean outputToStdout = false; + public static BootstrapArgs getBootstrapArgs(String[] args) { List argList = new ArrayList<>(Arrays.asList(args)); @@ -53,7 +55,7 @@ public class BootstrapArgs { if (argFiles.contains(inArgFile)) { - System.err.println( + jalview.bin.Console.errPrintln( "Looped argfiles detected: '" + inArgFile.getPath() + "'"); return; } @@ -127,11 +129,6 @@ public class BootstrapArgs } } - if (ArgParser.argMap.containsKey(argName) && val == null) - { - val = "true"; - } - Arg a = ArgParser.argMap.get(argName); if (a != null) @@ -152,7 +149,27 @@ public class BootstrapArgs if (a == null || !a.hasOption(Opt.BOOTSTRAP)) { - // not a valid bootstrap arg + // not a bootstrap arg + + // make a check for an output going to stdout + if (a != null && a.hasOption(Opt.OUTPUTFILE) + && a.hasOption(Opt.STDOUT)) + { + if (val == null && i + 1 < args.size()) + { + val = args.get(i + 1); + } + if (val.startsWith("[") && val.indexOf(']') > 0) + { + val = val.substring(val.indexOf(']') + 1); + } + + if (ArgParser.STDOUTFILENAME.equals(val)) + { + this.outputToStdout = true; + } + } + continue; } @@ -188,6 +205,11 @@ public class BootstrapArgs } else { + if (val == null) + { + val = "true"; + } + add(a, type, val); } } @@ -362,7 +384,7 @@ public class BootstrapArgs } else if (this.contains(Arg.HEADLESS)) { - // --headless, --noheadless specified => use value + // --headless has been specified on the command line => headless isHeadless = this.getBoolean(Arg.HEADLESS); } else if (this.argsHaveOption(Opt.OUTPUTFILE)) @@ -373,4 +395,9 @@ public class BootstrapArgs } return isHeadless; } + + public boolean outputToStdout() + { + return this.outputToStdout; + } } diff --git a/src/jalview/commands/EditCommand.java b/src/jalview/commands/EditCommand.java index 62ef660..c15bbf8 100644 --- a/src/jalview/commands/EditCommand.java +++ b/src/jalview/commands/EditCommand.java @@ -473,7 +473,7 @@ public class EditCommand implements CommandI { command.seqs[s].insertCharAt(command.position, command.number, command.gapChar); - // System.out.println("pos: "+command.position+" number: + // jalview.bin.Console.outPrintln("pos: "+command.position+" number: // "+command.number); } @@ -486,7 +486,7 @@ public class EditCommand implements CommandI // // for (int s = 0; s < command.seqs.length; s++) // { - // System.out.println("pos: "+command.position+" number: "+command.number); + // jalview.bin.Console.outPrintln("pos: "+command.position+" number: "+command.number); // command.seqs[s].insertCharAt(command.position, command.number,'A'); // } // @@ -1433,7 +1433,7 @@ public class EditCommand implements CommandI } else { - System.err.println("Can't undo edit action " + action); + jalview.bin.Console.errPrintln("Can't undo edit action " + action); // throw new IllegalStateException("Can't undo edit action " + // action); } diff --git a/src/jalview/datamodel/AlignedCodonFrame.java b/src/jalview/datamodel/AlignedCodonFrame.java index f5154ec..cb74a66 100644 --- a/src/jalview/datamodel/AlignedCodonFrame.java +++ b/src/jalview/datamodel/AlignedCodonFrame.java @@ -707,7 +707,7 @@ public class AlignedCodonFrame ds.setSequenceFeatures(dna.getSequenceFeatures()); // dnaSeqs[i] = ds; ssm.fromSeq = ds; - System.out.println("Realised mapped sequence " + ds.getName()); + jalview.bin.Console.outPrintln("Realised mapped sequence " + ds.getName()); } } } diff --git a/src/jalview/datamodel/AlignmentAnnotation.java b/src/jalview/datamodel/AlignmentAnnotation.java index de98c64..7e6b904 100755 --- a/src/jalview/datamodel/AlignmentAnnotation.java +++ b/src/jalview/datamodel/AlignmentAnnotation.java @@ -126,7 +126,7 @@ public class AlignmentAnnotation invalidrnastruc = -1; } catch (WUSSParseException px) { - // DEBUG System.out.println(px); + // DEBUG jalview.bin.Console.outPrintln(px); invalidrnastruc = px.getProblemPos(); } if (invalidrnastruc > -1) @@ -142,7 +142,7 @@ public class AlignmentAnnotation scaleColLabel = true; _markRnaHelices(); } - // System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup()); + // jalview.bin.Console.outPrintln("featuregroup " + _rnasecstr[0].getFeatureGroup()); } @@ -156,10 +156,10 @@ public class AlignmentAnnotation { /* - * System.out.println(this.annotation._rnasecstr[x] + " Begin" + + * jalview.bin.Console.outPrintln(this.annotation._rnasecstr[x] + " Begin" + * this.annotation._rnasecstr[x].getBegin()); */ - // System.out.println(this.annotation._rnasecstr[x].getFeatureGroup()); + // jalview.bin.Console.outPrintln(this.annotation._rnasecstr[x].getFeatureGroup()); int val = 0; try { @@ -386,7 +386,7 @@ public class AlignmentAnnotation char firstChar = 0; for (int i = 0; i < annotations.length; i++) { - // DEBUG System.out.println(i + ": " + annotations[i]); + // DEBUG jalview.bin.Console.outPrintln(i + ": " + annotations[i]); if (annotations[i] == null) { continue; @@ -394,14 +394,14 @@ public class AlignmentAnnotation if (annotations[i].secondaryStructure == 'H' || annotations[i].secondaryStructure == 'E') { - // DEBUG System.out.println( "/H|E/ '" + + // DEBUG jalview.bin.Console.outPrintln( "/H|E/ '" + // annotations[i].secondaryStructure + "'"); hasIcons |= true; } else // Check for RNA secondary structure { - // DEBUG System.out.println( "/else/ '" + + // DEBUG jalview.bin.Console.outPrintln( "/else/ '" + // annotations[i].secondaryStructure + "'"); // TODO: 2.8.2 should this ss symbol validation check be a function in // RNA/ResidueProperties ? @@ -446,7 +446,7 @@ public class AlignmentAnnotation } } - // System.out.println("displaychar " + annotations[i].displayCharacter); + // jalview.bin.Console.outPrintln("displaychar " + annotations[i].displayCharacter); if (annotations[i].displayCharacter == null || annotations[i].displayCharacter.length() == 0) diff --git a/src/jalview/datamodel/AlignmentView.java b/src/jalview/datamodel/AlignmentView.java index e6604d1..6ab71c7 100644 --- a/src/jalview/datamodel/AlignmentView.java +++ b/src/jalview/datamodel/AlignmentView.java @@ -1128,11 +1128,11 @@ public class AlignmentView public static void testSelectionViews(AlignmentI alignment, HiddenColumns hidden, SequenceGroup selection) { - System.out.println("Testing standard view creation:\n"); + jalview.bin.Console.outPrintln("Testing standard view creation:\n"); AlignmentView view = null; try { - System.out.println( + jalview.bin.Console.outPrintln( "View with no hidden columns, no limit to selection, no groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, false, false, false); @@ -1141,12 +1141,12 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection but no groups marked."); } try { - System.out.println( + jalview.bin.Console.outPrintln( "View with no hidden columns, no limit to selection, and all groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, false, false, true); @@ -1154,12 +1154,12 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection marked but no groups marked."); } try { - System.out.println( + jalview.bin.Console.outPrintln( "View with no hidden columns, limited to selection and no groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, false, true, false); @@ -1167,12 +1167,12 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection restricted but no groups marked."); } try { - System.out.println( + jalview.bin.Console.outPrintln( "View with no hidden columns, limited to selection, and all groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, false, true, true); @@ -1180,12 +1180,12 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection restricted and groups marked."); } try { - System.out.println( + jalview.bin.Console.outPrintln( "View *with* hidden columns, no limit to selection, no groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, true, false, false); @@ -1193,12 +1193,12 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection but no groups marked."); } try { - System.out.println( + jalview.bin.Console.outPrintln( "View *with* hidden columns, no limit to selection, and all groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, true, false, true); @@ -1206,12 +1206,12 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection marked but no groups marked."); } try { - System.out.println( + jalview.bin.Console.outPrintln( "View *with* hidden columns, limited to selection and no groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, true, true, false); @@ -1219,12 +1219,12 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection restricted but no groups marked."); } try { - System.out.println( + jalview.bin.Console.outPrintln( "View *with* hidden columns, limited to selection, and all groups to be collected:"); view = new AlignmentView(alignment, hidden, selection, true, true, true); @@ -1232,7 +1232,7 @@ public class AlignmentView } catch (Exception e) { e.printStackTrace(); - System.err.println( + jalview.bin.Console.errPrintln( "Failed to generate alignment with selection restricted and groups marked."); } diff --git a/src/jalview/datamodel/ContactListImpl.java b/src/jalview/datamodel/ContactListImpl.java index 69dcf71..bb31c5d 100644 --- a/src/jalview/datamodel/ContactListImpl.java +++ b/src/jalview/datamodel/ContactListImpl.java @@ -55,9 +55,9 @@ public class ContactListImpl implements ContactListI { from_column = 0; } - if (to_column > getContactHeight()) + if (to_column >= getContactHeight()) { - to_column = getContactHeight(); + to_column = getContactHeight()-1; } ContactRange cr = new ContactRange(); cr.setFrom_column(from_column); diff --git a/src/jalview/datamodel/ContactMatrixI.java b/src/jalview/datamodel/ContactMatrixI.java index 1d20987..925025f 100644 --- a/src/jalview/datamodel/ContactMatrixI.java +++ b/src/jalview/datamodel/ContactMatrixI.java @@ -5,6 +5,9 @@ import java.util.Arrays; import java.util.BitSet; import java.util.List; +import jalview.util.ColorUtils; +import jalview.ws.datamodel.MappableContactMatrixI; + public interface ContactMatrixI { @@ -122,4 +125,79 @@ public interface ContactMatrixI } void setGroupSet(GroupSet makeGroups); + + default void randomlyReColourGroups() { + if (hasGroupSet()) + { + GroupSetI groups = getGroupSet(); + for (BitSet group:groups.getGroups()) + { + groups.setColorForGroup(group, ColorUtils.getARandomColor()); + } + } + } + + default void transferGroupColorsTo(AlignmentAnnotation aa) + { + if (hasGroupSet()) + { + GroupSetI groups = getGroupSet(); + // stash colors in linked annotation row. + // doesn't work yet. TESTS! + int sstart = aa.sequenceRef != null ? aa.sequenceRef.getStart() - 1 + : 0; + Annotation ae; + Color gpcol = null; + int[] seqpos = null; + for (BitSet gp : groups.getGroups()) + { + gpcol = groups.getColourForGroup(gp); + for (int p = gp.nextSetBit(0); p >= 0 + && p < Integer.MAX_VALUE; p = gp.nextSetBit(p + 1)) + { + if (this instanceof MappableContactMatrixI) + { + MappableContactMatrixI mcm = (MappableContactMatrixI) this; + seqpos = mcm.getMappedPositionsFor(aa.sequenceRef, p); + if (seqpos == null) + { + // no mapping for this column. + continue; + } + // TODO: handle ranges... + ae = aa.getAnnotationForPosition(seqpos[0]); + } + else + { + ae = aa.getAnnotationForPosition(p + sstart); + } + if (ae != null) + { + ae.colour = gpcol.brighter().darker(); + } + } + } + } + } + + /** + * look up the colour for a column in the associated contact matrix + * @return Color.white or assigned colour + */ + default Color getGroupColorForPosition(int column) + { + if (hasGroupSet()) + { + GroupSetI groups = getGroupSet(); + for (BitSet gp:groups.getGroups()) + { + if (gp.get(column)) + { + return groups.getColourForGroup(gp); + } + } + } + return Color.white; + } + } diff --git a/src/jalview/datamodel/DBRefSource.java b/src/jalview/datamodel/DBRefSource.java index f384b1e..3b1757b 100755 --- a/src/jalview/datamodel/DBRefSource.java +++ b/src/jalview/datamodel/DBRefSource.java @@ -154,6 +154,11 @@ public class DBRefSource public static boolean isPrimaryCandidate(String ucversion) { + if (ucversion==null) + { + // Null/empty version is not a real reference ? + return false; + } // tricky - this test really needs to search the sequence's set of dbrefs to // see if there is a primary reference that derived this reference. for (int i = allSources.length; --i >= 0;) diff --git a/src/jalview/datamodel/GroupSet.java b/src/jalview/datamodel/GroupSet.java index c7a73b7..db38e7b 100644 --- a/src/jalview/datamodel/GroupSet.java +++ b/src/jalview/datamodel/GroupSet.java @@ -145,30 +145,59 @@ public class GroupSet implements GroupSetI return treeType; } - public static GroupSet makeGroups(ContactMatrixI matrix, float thresh, + public static GroupSet makeGroups(ContactMatrixI matrix, boolean autoCut) + { + return makeGroups(matrix, autoCut, 0, autoCut); + } + public static GroupSet makeGroups(ContactMatrixI matrix, boolean auto, float thresh, boolean abs) { AverageDistanceEngine clusterer = new AverageDistanceEngine(null, null, - matrix); + matrix, true); double height = clusterer.findHeight(clusterer.getTopNode()); + Console.debug("Column tree height: " + height); String newick = new jalview.io.NewickFile(clusterer.getTopNode(), false, true).print(); String treeType = "UPGMA"; Console.trace("Newick string\n" + newick); List nodegroups; - if (abs ? height > thresh : 0 < thresh && thresh < 1) + float cut = -1f; + if (auto) { - float cut = abs ? (float) (thresh / height) : thresh; - Console.debug("Threshold " + cut + " for height=" + height); - - nodegroups = clusterer.groupNodes(cut); + double rootw = 0; + int p = 2; + BinaryNode bn = clusterer.getTopNode(); + while (p-- > 0 & bn.left() != null) + { + if (bn.left() != null) + { + bn = bn.left(); + } + if (bn.left() != null) + { + rootw = bn.height; + } + } + thresh = Math.max((float) (rootw / height) - 0.01f, 0); + cut = thresh; + nodegroups = clusterer.groupNodes(thresh); } else { - nodegroups = new ArrayList(); - nodegroups.add(clusterer.getTopNode()); + if (abs ? (height > thresh) : (0 < thresh && thresh < 1)) + { + cut = abs ? thresh : (float) (thresh * height); + Console.debug("Threshold " + cut + " for height=" + height); + nodegroups = clusterer.groupNodes(cut); + } + else + { + nodegroups = new ArrayList(); + nodegroups.add(clusterer.getTopNode()); + } } + List groups = new ArrayList<>(); for (BinaryNode root : nodegroups) { @@ -179,7 +208,8 @@ public class GroupSet implements GroupSetI } groups.add(gpset); } - GroupSet grps = new GroupSet(abs, thresh, groups, treeType, newick); + GroupSet grps = new GroupSet(abs, (cut == -1f) ? thresh : cut, groups, + treeType, newick); return grps; } diff --git a/src/jalview/datamodel/HiddenSequences.java b/src/jalview/datamodel/HiddenSequences.java index b5efeb4..e2ef318 100755 --- a/src/jalview/datamodel/HiddenSequences.java +++ b/src/jalview/datamodel/HiddenSequences.java @@ -159,7 +159,7 @@ public class HiddenSequences if (alignmentIndex < 0 || hiddenSequences[alignmentIndex] != null) { - System.out.println("ERROR!!!!!!!!!!!"); + jalview.bin.Console.outPrintln("ERROR!!!!!!!!!!!"); return; } @@ -239,7 +239,7 @@ public class HiddenSequences } else { - System.out.println( + jalview.bin.Console.outPrintln( seq.getName() + " has been deleted whilst hidden"); } } diff --git a/src/jalview/datamodel/SearchResults.java b/src/jalview/datamodel/SearchResults.java index 909a0fe..8d6cbb1 100755 --- a/src/jalview/datamodel/SearchResults.java +++ b/src/jalview/datamodel/SearchResults.java @@ -269,7 +269,7 @@ public class SearchResults implements SearchResultsI else { // debug - // System.err.println("Outwith bounds!" + matchStart+">"+end +" or " + // jalview.bin.Console.errPrintln("Outwith bounds!" + matchStart+">"+end +" or " // + matchEnd+"<"+start); } } diff --git a/src/jalview/datamodel/Sequence.java b/src/jalview/datamodel/Sequence.java index 32d295a..7a5d5bc 100755 --- a/src/jalview/datamodel/Sequence.java +++ b/src/jalview/datamodel/Sequence.java @@ -174,7 +174,7 @@ public class Sequence extends ASequence implements SequenceI { if (name == null) { - System.err.println( + jalview.bin.Console.errPrintln( "POSSIBLE IMPLEMENTATION ERROR: null sequence name passed to constructor."); name = ""; } @@ -387,7 +387,7 @@ public class Sequence extends ASequence implements SequenceI { if (sf.getType() == null) { - System.err.println( + jalview.bin.Console.errPrintln( "SequenceFeature type may not be null: " + sf.toString()); return false; } @@ -1754,6 +1754,13 @@ public class Sequence extends ASequence implements SequenceI transferAnnotation(entry.getDatasetSequence(), mp); return; } + // transfer from entry to sequence + // if entry has a description and sequence doesn't, then transfer + if (entry.getDescription()!=null && (description==null || description.trim().length()==0)) + { + description = entry.getDescription(); + } + // transfer any new features from entry onto sequence if (entry.getSequenceFeatures() != null) { diff --git a/src/jalview/datamodel/SequenceGroup.java b/src/jalview/datamodel/SequenceGroup.java index 326793d..9837104 100755 --- a/src/jalview/datamodel/SequenceGroup.java +++ b/src/jalview/datamodel/SequenceGroup.java @@ -644,7 +644,7 @@ public class SequenceGroup implements AnnotatedCollectionI } catch (java.lang.OutOfMemoryError err) { // TODO: catch OOM - System.out.println("Out of memory loading groups: " + err); + jalview.bin.Console.outPrintln("Out of memory loading groups: " + err); } return upd; } diff --git a/src/jalview/datamodel/features/FeatureMatcher.java b/src/jalview/datamodel/features/FeatureMatcher.java index 65cba0d..124909c 100644 --- a/src/jalview/datamodel/features/FeatureMatcher.java +++ b/src/jalview/datamodel/features/FeatureMatcher.java @@ -147,7 +147,7 @@ public class FeatureMatcher implements FeatureMatcherI int nextQuotePos = descriptor.indexOf(QUOTE, 1); if (nextQuotePos == -1) { - System.err.println(invalidFormat); + jalview.bin.Console.errPrintln(invalidFormat); return null; } firstField = descriptor.substring(1, nextQuotePos); @@ -159,7 +159,7 @@ public class FeatureMatcher implements FeatureMatcherI int nextSpacePos = descriptor.indexOf(SPACE); if (nextSpacePos == -1) { - System.err.println(invalidFormat); + jalview.bin.Console.errPrintln(invalidFormat); return null; } firstField = descriptor.substring(0, nextSpacePos); @@ -193,7 +193,7 @@ public class FeatureMatcher implements FeatureMatcherI cond = Condition.fromString(leftToParse); if (cond == null || cond.needsAPattern()) { - System.err.println(invalidFormat); + jalview.bin.Console.errPrintln(invalidFormat); return null; } } @@ -214,7 +214,7 @@ public class FeatureMatcher implements FeatureMatcherI else { // unbalanced quote - System.err.println(invalidFormat); + jalview.bin.Console.errPrintln(invalidFormat); return null; } } diff --git a/src/jalview/datamodel/features/FeatureMatcherSet.java b/src/jalview/datamodel/features/FeatureMatcherSet.java index a5efe5d..eae3664 100644 --- a/src/jalview/datamodel/features/FeatureMatcherSet.java +++ b/src/jalview/datamodel/features/FeatureMatcherSet.java @@ -93,7 +93,7 @@ public class FeatureMatcherSet implements FeatureMatcherSetI if (spacePos == -1) { // trailing junk after a match condition - System.err.println(invalid); + jalview.bin.Console.errPrintln(invalid); return null; } String conjunction = leftToParse.substring(0, spacePos); @@ -109,7 +109,7 @@ public class FeatureMatcherSet implements FeatureMatcherSetI else { // not an AND or an OR - invalid - System.err.println(invalid); + jalview.bin.Console.errPrintln(invalid); return null; } } @@ -123,7 +123,7 @@ public class FeatureMatcherSet implements FeatureMatcherSetI int closePos = leftToParse.indexOf(CLOSE_BRACKET); if (closePos == -1) { - System.err.println(invalid); + jalview.bin.Console.errPrintln(invalid); return null; } nextCondition = leftToParse.substring(1, closePos); @@ -137,7 +137,7 @@ public class FeatureMatcherSet implements FeatureMatcherSetI FeatureMatcher fm = FeatureMatcher.fromString(nextCondition); if (fm == null) { - System.err.println(invalid); + jalview.bin.Console.errPrintln(invalid); return null; } try @@ -154,7 +154,7 @@ public class FeatureMatcherSet implements FeatureMatcherSetI } catch (IllegalStateException e) { // thrown if OR and AND are mixed - System.err.println(invalid); + jalview.bin.Console.errPrintln(invalid); return null; } diff --git a/src/jalview/datamodel/features/FeatureStore.java b/src/jalview/datamodel/features/FeatureStore.java index eb5688c..c19d782 100644 --- a/src/jalview/datamodel/features/FeatureStore.java +++ b/src/jalview/datamodel/features/FeatureStore.java @@ -401,7 +401,7 @@ public class FeatureStore SequenceFeature sf = contactFeatureEnds.get(index); if (!sf.isContactFeature()) { - System.err.println("Error! non-contact feature type " + sf.getType() + jalview.bin.Console.errPrintln("Error! non-contact feature type " + sf.getType() + " in contact features list"); index++; continue; @@ -454,7 +454,7 @@ public class FeatureStore SequenceFeature sf = contactFeatureStarts.get(index); if (!sf.isContactFeature()) { - System.err.println("Error! non-contact feature " + sf.toString() + jalview.bin.Console.errPrintln("Error! non-contact feature " + sf.toString() + " in contact features list"); index++; continue; diff --git a/src/jalview/datamodel/features/SequenceFeatures.java b/src/jalview/datamodel/features/SequenceFeatures.java index 905fd8b..ed4474e 100644 --- a/src/jalview/datamodel/features/SequenceFeatures.java +++ b/src/jalview/datamodel/features/SequenceFeatures.java @@ -88,7 +88,7 @@ public class SequenceFeatures implements SequenceFeaturesI String type = sf.getType(); if (type == null) { - System.err.println("Feature type may not be null: " + sf.toString()); + jalview.bin.Console.errPrintln("Feature type may not be null: " + sf.toString()); return false; } diff --git a/src/jalview/ext/ensembl/EnsemblGene.java b/src/jalview/ext/ensembl/EnsemblGene.java index 75a7154..391fd6f 100644 --- a/src/jalview/ext/ensembl/EnsemblGene.java +++ b/src/jalview/ext/ensembl/EnsemblGene.java @@ -226,7 +226,7 @@ public class EnsemblGene extends EnsemblSeqProxy return true; } catch (NumberFormatException e) { - System.err.println("Bad integers in description " + description); + jalview.bin.Console.errPrintln("Bad integers in description " + description); } } return false; diff --git a/src/jalview/ext/ensembl/EnsemblLookup.java b/src/jalview/ext/ensembl/EnsemblLookup.java index 0813ba8..e188986 100644 --- a/src/jalview/ext/ensembl/EnsemblLookup.java +++ b/src/jalview/ext/ensembl/EnsemblLookup.java @@ -222,7 +222,7 @@ public class EnsemblLookup extends EnsemblRestClient ids, -1, MODE_MAP, null); } catch (IOException | ParseException e) { - System.err.println("Error parsing " + identifier + " lookup response " + jalview.bin.Console.errPrintln("Error parsing " + identifier + " lookup response " + e.getMessage()); return null; } diff --git a/src/jalview/ext/ensembl/EnsemblMap.java b/src/jalview/ext/ensembl/EnsemblMap.java index f2ab195..1fd9a23 100644 --- a/src/jalview/ext/ensembl/EnsemblMap.java +++ b/src/jalview/ext/ensembl/EnsemblMap.java @@ -157,7 +157,7 @@ public class EnsemblMap extends EnsemblRestClient return (parseAssemblyMappingResponse(url)); } catch (Throwable t) { - System.out.println("Error calling " + url + ": " + t.getMessage()); + jalview.bin.Console.outPrintln("Error calling " + url + ": " + t.getMessage()); return null; } } @@ -265,7 +265,7 @@ public class EnsemblMap extends EnsemblRestClient return null; } catch (Throwable t) { - System.out.println("Error calling " + url + ": " + t.getMessage()); + jalview.bin.Console.outPrintln("Error calling " + url + ": " + t.getMessage()); return null; } } @@ -342,7 +342,7 @@ public class EnsemblMap extends EnsemblRestClient String ass = mapped.get("assembly_name").toString(); if (assembly != null && !assembly.equals(ass)) { - System.err.println( + jalview.bin.Console.errPrintln( "EnsemblMap found multiple assemblies - can't resolve"); return null; } @@ -350,7 +350,7 @@ public class EnsemblMap extends EnsemblRestClient String chr = mapped.get("seq_region_name").toString(); if (chromosome != null && !chromosome.equals(chr)) { - System.err.println( + jalview.bin.Console.errPrintln( "EnsemblMap found multiple chromosomes - can't resolve"); return null; } diff --git a/src/jalview/ext/ensembl/EnsemblRestClient.java b/src/jalview/ext/ensembl/EnsemblRestClient.java index 4a5544e..540fc98 100644 --- a/src/jalview/ext/ensembl/EnsemblRestClient.java +++ b/src/jalview/ext/ensembl/EnsemblRestClient.java @@ -211,7 +211,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher return pingString != null; } catch (Throwable t) { - System.err.println( + jalview.bin.Console.errPrintln( "Error connecting to " + pingUrl + ": " + t.getMessage()); } finally { @@ -313,7 +313,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher * note: a GET request for an invalid id returns an error code e.g. 415 * but POST request returns 200 and an empty Fasta response */ - System.err.println("Response code " + responseCode);// + " for " + url); + jalview.bin.Console.errPrintln("Response code " + responseCode);// + " for " + url); return null; } @@ -338,7 +338,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher protected HttpURLConnection tryConnection(URL url, List ids, int readTimeout) throws IOException, ProtocolException { - // System.out.println(System.currentTimeMillis() + " " + url); + // jalview.bin.Console.outPrintln(System.currentTimeMillis() + " " + url); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); @@ -387,14 +387,14 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher int retrySecs = Integer.valueOf(retryDelay); if (retrySecs > 0 && retrySecs < 10) { - System.err.println( + jalview.bin.Console.errPrintln( "Ensembl REST service rate limit exceeded, waiting " + retryDelay + " seconds before retrying"); Thread.sleep(1000 * retrySecs); } } catch (NumberFormatException | InterruptedException e) { - System.err.println("Error handling Retry-After: " + e.getMessage()); + jalview.bin.Console.errPrintln("Error handling Retry-After: " + e.getMessage()); } } } @@ -566,7 +566,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher } } catch (NumberFormatException e) { - System.err.println("Error in REST version: " + e.toString()); + jalview.bin.Console.errPrintln("Error in REST version: " + e.toString()); } /* @@ -578,14 +578,14 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher expected) == 1; if (laterVersion) { - System.err.println(String.format( + jalview.bin.Console.errPrintln(String.format( "EnsemblRestClient expected %s REST version %s but found %s, see %s", getDbSource(), expected, version, REST_CHANGE_LOG)); } info.restVersion = version; } catch (Throwable t) { - System.err.println( + jalview.bin.Console.errPrintln( "Error checking Ensembl REST version: " + t.getMessage()); } } @@ -617,7 +617,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher domainData.get(getDomain()).dataVersion = versions.get(0).toString(); } catch (Throwable e) {// could be IOException | ParseException e) { - System.err.println( + jalview.bin.Console.errPrintln( "Error checking Ensembl data version: " + e.getMessage()); } } diff --git a/src/jalview/ext/ensembl/EnsemblSeqProxy.java b/src/jalview/ext/ensembl/EnsemblSeqProxy.java index 56eda5e..949c52e 100644 --- a/src/jalview/ext/ensembl/EnsemblSeqProxy.java +++ b/src/jalview/ext/ensembl/EnsemblSeqProxy.java @@ -155,7 +155,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient String msg = "Aborting ID retrieval after " + v + " chunks. Unexpected problem (" + r.getLocalizedMessage() + ")"; - System.err.println(msg); + jalview.bin.Console.errPrintln(msg); r.printStackTrace(); break; } @@ -240,7 +240,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient } } catch (IOException e) { - System.err.println( + jalview.bin.Console.errPrintln( "Error transferring Ensembl features: " + e.getMessage()); } // Platform.timeCheck("ESP.addfeat done", Platform.TIME_MARK); @@ -265,12 +265,12 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient String accId = querySeq.getName(); try { - System.out.println("Adding protein product for " + accId); + jalview.bin.Console.outPrintln("Adding protein product for " + accId); AlignmentI protein = new EnsemblProtein(getDomain()) .getSequenceRecords(accId); if (protein == null || protein.getHeight() == 0) { - System.out.println("No protein product found for " + accId); + jalview.bin.Console.outPrintln("No protein product found for " + accId); return; } SequenceI proteinSeq = protein.getSequenceAt(0); @@ -382,7 +382,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient seq.addDBRef(xrefs.get(i)); } - // System.out.println("primaries are " + seq.getPrimaryDBRefs().toString()); + // jalview.bin.Console.outPrintln("primaries are " + seq.getPrimaryDBRefs().toString()); /* * and add a reference to itself */ @@ -430,7 +430,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient if (seqs.size() != ids.size()) { - System.out.println(String.format( + jalview.bin.Console.outPrintln(String.format( "Only retrieved %d sequences for %d query strings", seqs.size(), ids.size())); } @@ -508,7 +508,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient result.add(sequence); } catch (ParseException | IOException e) { - System.err.println("Error processing JSON response: " + e.toString()); + jalview.bin.Console.errPrintln("Error processing JSON response: " + e.toString()); // ignore } // Platform.timeCheck("ENS seqproxy2", Platform.TIME_MARK); @@ -659,7 +659,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient if (regions.isEmpty()) { - System.out.println("Failed to identify target sequence for " + accId + jalview.bin.Console.outPrintln("Failed to identify target sequence for " + accId + " from genomic features"); return null; } @@ -829,7 +829,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient boolean result = transferFeatures(sfs, targetSequence, mapping, accessionId); - // System.out.println("transferFeatures (" + (sfs.size()) + " --> " + // jalview.bin.Console.outPrintln("transferFeatures (" + (sfs.size()) + " --> " // + targetSequence.getFeatures().getFeatureCount(true) + ") to " // + targetSequence.getName() + " took " // + (System.currentTimeMillis() - start) + "ms"); diff --git a/src/jalview/ext/htsjdk/HtsContigDb.java b/src/jalview/ext/htsjdk/HtsContigDb.java index 9a985b6..8cce87a 100644 --- a/src/jalview/ext/htsjdk/HtsContigDb.java +++ b/src/jalview/ext/htsjdk/HtsContigDb.java @@ -261,7 +261,7 @@ public class HtsContigDb { if (!isValid() || !refFile.isIndexed()) { - System.err.println( + jalview.bin.Console.errPrintln( "Cannot read contig as file is invalid or not indexed"); return null; } diff --git a/src/jalview/ext/jmol/JalviewJmolBinding.java b/src/jalview/ext/jmol/JalviewJmolBinding.java index 21a19ae..870db65 100644 --- a/src/jalview/ext/jmol/JalviewJmolBinding.java +++ b/src/jalview/ext/jmol/JalviewJmolBinding.java @@ -163,21 +163,21 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel public void createImage(String file, String type, int quality) { - System.out.println("JMOL CREATE IMAGE"); + jalview.bin.Console.outPrintln("JMOL CREATE IMAGE"); } @Override public String createImage(String fileName, String type, Object textOrBytes, int quality) { - System.out.println("JMOL CREATE IMAGE"); + jalview.bin.Console.outPrintln("JMOL CREATE IMAGE"); return null; } @Override public String eval(String strEval) { - // System.out.println(strEval); + // jalview.bin.Console.outPrintln(strEval); // "# 'eval' is implemented only for the applet."; return null; } @@ -476,7 +476,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel lastMessage = strInfo; if (data != null) { - System.err.println("Ignoring additional hover info: " + data + jalview.bin.Console.errPrintln("Ignoring additional hover info: " + data + " (other info: '" + strInfo + "' pos " + atomIndex + ")"); } mouseOverStructure(atomIndex, strInfo); @@ -497,7 +497,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel */ if (strData != null) { - System.err.println("Ignoring additional pick data string " + strData); + jalview.bin.Console.errPrintln("Ignoring additional pick data string " + strData); } int chainSeparator = strInfo.indexOf(":"); int p = 0; @@ -599,7 +599,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel (data == null) ? ((String) null) : (String) data[1]); break; case ERROR: - // System.err.println("Ignoring error callback."); + // jalview.bin.Console.errPrintln("Ignoring error callback."); break; case SYNC: case RESIZE: @@ -609,13 +609,13 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel case CLICK: default: - System.err.println( + jalview.bin.Console.errPrintln( "Unhandled callback " + type + " " + data[1].toString()); break; } } catch (Exception e) { - System.err.println("Squashed Jmol callback handler error:"); + jalview.bin.Console.errPrintln("Squashed Jmol callback handler error:"); e.printStackTrace(); } } @@ -864,7 +864,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel public void setCallbackFunction(String callbackType, String callbackFunction) { - System.err.println("Ignoring set-callback request to associate " + jalview.bin.Console.errPrintln("Ignoring set-callback request to associate " + callbackType + " with function " + callbackFunction); } @@ -938,7 +938,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel String buttonsToShow) { - System.err.println("Allocating Jmol Viewer: " + commandOptions); + jalview.bin.Console.errPrintln("Allocating Jmol Viewer: " + commandOptions); if (commandOptions == null) { @@ -956,7 +956,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel console = createJmolConsole(consolePanel, buttonsToShow); } catch (Throwable e) { - System.err.println("Could not create Jmol application console. " + jalview.bin.Console.errPrintln("Could not create Jmol application console. " + e.getMessage()); e.printStackTrace(); } diff --git a/src/jalview/ext/jmol/JmolParser.java b/src/jalview/ext/jmol/JmolParser.java index c64dac1..0ca2ba8 100644 --- a/src/jalview/ext/jmol/JmolParser.java +++ b/src/jalview/ext/jmol/JmolParser.java @@ -338,7 +338,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener } } catch (OutOfMemoryError er) { - System.out.println( + jalview.bin.Console.outPrintln( "OUT OF MEMORY LOADING TRANSFORMING JMOL MODEL TO JALVIEW MODEL"); throw new IOException(MessageManager .getString("exception.outofmemory_loading_mmcif_file")); @@ -391,7 +391,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener org.jmol.modelset.Atom prevAtom, HashMap chainTerMap) { - // System.out.println("Atom: " + curAtom.getAtomNumber() + // jalview.bin.Console.outPrintln("Atom: " + curAtom.getAtomNumber() // + " Last atom index " + curAtom.group.lastAtomIndex); if (chainTerMap == null || prevAtom == null) { @@ -488,7 +488,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener { int length = sq.getLength(); boolean ssFound = false; - Annotation asecstr[] = new Annotation[length + firstResNum - 1]; + Annotation asecstr[] = new Annotation[length + (firstResNum-sq.getStart())]; for (int p = 0; p < length; p++) { if (secstr[p] >= 'A' && secstr[p] <= 'z') diff --git a/src/jalview/ext/paradise/Annotate3D.java b/src/jalview/ext/paradise/Annotate3D.java index de1d90c..3817ee9 100644 --- a/src/jalview/ext/paradise/Annotate3D.java +++ b/src/jalview/ext/paradise/Annotate3D.java @@ -229,7 +229,7 @@ class RvalsIterator implements Iterator, AutoCloseable if (sval == null) { - System.err.println( + jalview.bin.Console.errPrintln( "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :" + val.toString()); diff --git a/src/jalview/ext/pymol/PymolManager.java b/src/jalview/ext/pymol/PymolManager.java index 7dfdb0c..ddc8d84 100644 --- a/src/jalview/ext/pymol/PymolManager.java +++ b/src/jalview/ext/pymol/PymolManager.java @@ -158,7 +158,7 @@ public class PymolManager boolean getReply) { String postBody = getPostRequest(command); - // System.out.println(postBody);// debug + // jalview.bin.Console.outPrintln(postBody);// debug String rpcUrl = "http://127.0.0.1:" + this.pymolXmlRpcPort; PrintWriter out = null; BufferedReader in = null; diff --git a/src/jalview/ext/rbvi/chimera/ChimeraListener.java b/src/jalview/ext/rbvi/chimera/ChimeraListener.java index 40b0ff0..af31b78 100644 --- a/src/jalview/ext/rbvi/chimera/ChimeraListener.java +++ b/src/jalview/ext/rbvi/chimera/ChimeraListener.java @@ -126,12 +126,12 @@ public class ChimeraListener extends AbstractRequestHandler } else if (message.startsWith(MODEL_CHANGED)) { - System.err.println(message); + jalview.bin.Console.errPrintln(message); processModelChanged(message.substring(MODEL_CHANGED.length())); } else { - System.err.println("Unexpected chimeraNotification: " + message); + jalview.bin.Console.errPrintln("Unexpected chimeraNotification: " + message); } } } @@ -143,7 +143,7 @@ public class ChimeraListener extends AbstractRequestHandler */ protected void processModelChanged(String message) { - // System.out.println(message + " (not implemented in Jalview)"); + // jalview.bin.Console.outPrintln(message + " (not implemented in Jalview)"); } /** diff --git a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java index aebfede..a292e88 100644 --- a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java +++ b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java @@ -207,7 +207,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel startListening(chimeraListener.getUri()); } catch (BindException e) { - System.err.println( + jalview.bin.Console.errPrintln( "Failed to start Chimera listener: " + e.getMessage()); } } @@ -568,7 +568,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel private void log(String message) { - System.err.println("## Chimera log: " + message); + jalview.bin.Console.errPrintln("## Chimera log: " + message); } /** @@ -627,7 +627,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel executeCommand(false, null, command); } catch (IOException e) { - System.err.println("Sending commands to Chimera via file failed with " + jalview.bin.Console.errPrintln("Sending commands to Chimera via file failed with " + e.getMessage()); } } diff --git a/src/jalview/fts/core/FTSDataColumnPreferences.java b/src/jalview/fts/core/FTSDataColumnPreferences.java index 0971235..86b8c7d 100644 --- a/src/jalview/fts/core/FTSDataColumnPreferences.java +++ b/src/jalview/fts/core/FTSDataColumnPreferences.java @@ -94,7 +94,7 @@ public class FTSDataColumnPreferences extends JScrollPane int x = 0; for (FTSDataColumnI field : allFTSDataColumns) { - // System.out.println("allFTSDataColumns==" + allFTSDataColumns); + // jalview.bin.Console.outPrintln("allFTSDataColumns==" + allFTSDataColumns); if (field.getName().equalsIgnoreCase("all")) { continue; @@ -106,7 +106,7 @@ public class FTSDataColumnPreferences extends JScrollPane data[x++] = new Object[] { ftsRestClient .getAllDefaultDisplayedFTSDataColumns().contains(field), field.getName(), field.getGroup() }; - // System.out.println(" PUIS " + field.getName() + " ET AUSSI " + + // jalview.bin.Console.outPrintln(" PUIS " + field.getName() + " ET AUSSI " + // field.getGroup() + "X = " + x); break; case STRUCTURE_CHOOSER: diff --git a/src/jalview/fts/service/alphafold/AlphafoldRestClient.java b/src/jalview/fts/service/alphafold/AlphafoldRestClient.java index 7e95dd2..a631902 100644 --- a/src/jalview/fts/service/alphafold/AlphafoldRestClient.java +++ b/src/jalview/fts/service/alphafold/AlphafoldRestClient.java @@ -118,7 +118,7 @@ public class AlphafoldRestClient } catch (Exception e) { e.printStackTrace(); - System.out.println("offending value:" + fieldData); + jalview.bin.Console.outPrintln("offending value:" + fieldData); } } } diff --git a/src/jalview/fts/service/pdb/PDBFTSRestClient.java b/src/jalview/fts/service/pdb/PDBFTSRestClient.java index 796bc0e..5619075 100644 --- a/src/jalview/fts/service/pdb/PDBFTSRestClient.java +++ b/src/jalview/fts/service/pdb/PDBFTSRestClient.java @@ -175,7 +175,7 @@ public class PDBFTSRestClient extends FTSRestClient URI uri = webResource.getURI(); - System.out.println(uri); + jalview.bin.Console.outPrintln(uri); ClientResponse clientResponse = null; int responseStatus = -1; // Get the JSON string from the response object or directly from the @@ -183,7 +183,7 @@ public class PDBFTSRestClient extends FTSRestClient Map jsonObj = null; String responseString = null; - System.out.println("query >>>>>>> " + pdbRestRequest.toString()); + jalview.bin.Console.outPrintln("query >>>>>>> " + pdbRestRequest.toString()); if (!isMocked()) { @@ -413,10 +413,10 @@ public class PDBFTSRestClient extends FTSRestClient for (FTSDataColumnI field : diplayFields) { - // System.out.println("Field " + field); + // jalview.bin.Console.outPrintln("Field " + field); String fieldData = (pdbJsonDoc.get(field.getCode()) == null) ? "" : pdbJsonDoc.get(field.getCode()).toString(); - // System.out.println("Field Data : " + fieldData); + // jalview.bin.Console.outPrintln("Field Data : " + fieldData); if (field.isPrimaryKeyColumn()) { primaryKey = fieldData; @@ -440,7 +440,7 @@ public class PDBFTSRestClient extends FTSRestClient } catch (Exception e) { e.printStackTrace(); - System.out.println("offending value:" + fieldData); + jalview.bin.Console.outPrintln("offending value:" + fieldData); } } } diff --git a/src/jalview/fts/service/threedbeacons/TDBeaconsFTSPanel.java b/src/jalview/fts/service/threedbeacons/TDBeaconsFTSPanel.java index 253de42..dfb39cb 100644 --- a/src/jalview/fts/service/threedbeacons/TDBeaconsFTSPanel.java +++ b/src/jalview/fts/service/threedbeacons/TDBeaconsFTSPanel.java @@ -277,7 +277,7 @@ public class TDBeaconsFTSPanel extends GFTSPanel @Override protected void showHelp() { - System.out.println("No help implemented yet."); + jalview.bin.Console.outPrintln("No help implemented yet."); } diff --git a/src/jalview/fts/service/threedbeacons/TDBeaconsFTSRestClient.java b/src/jalview/fts/service/threedbeacons/TDBeaconsFTSRestClient.java index d7f534e..c275bda 100644 --- a/src/jalview/fts/service/threedbeacons/TDBeaconsFTSRestClient.java +++ b/src/jalview/fts/service/threedbeacons/TDBeaconsFTSRestClient.java @@ -101,7 +101,7 @@ public class TDBeaconsFTSRestClient extends FTSRestClient webResource = client.resource(DEFAULT_THREEDBEACONS_DOMAIN + query); URI uri = webResource.getURI(); - System.out.println(uri.toString()); + jalview.bin.Console.outPrintln(uri.toString()); // Execute the REST request ClientResponse clientResponse; @@ -269,7 +269,7 @@ public class TDBeaconsFTSRestClient extends FTSRestClient String fieldData = (tdbJsonStructure.get(field.getCode()) == null) ? " " : tdbJsonStructure.get(field.getCode()).toString(); - // System.out.println("Field : " + field + " Data : " + fieldData); + // jalview.bin.Console.outPrintln("Field : " + field + " Data : " + fieldData); if (field.isPrimaryKeyColumn()) { primaryKey = fieldData; @@ -293,7 +293,7 @@ public class TDBeaconsFTSRestClient extends FTSRestClient } catch (Exception e) { // e.printStackTrace(); - System.out.println("offending value:" + fieldData + fieldData); + jalview.bin.Console.outPrintln("offending value:" + fieldData + fieldData); } } } diff --git a/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java b/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java index 1827293..df48c0d 100644 --- a/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java +++ b/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java @@ -219,7 +219,7 @@ public class UniProtFTSRestClient extends FTSRestClient .getEntity(String.class); // Make redundant objects eligible for garbage collection to conserve // memory - // System.out.println(">>>>> response : " + // jalview.bin.Console.outPrintln(">>>>> response : " // + uniProtTabDelimittedResponseString); if (clientResponse.getStatus() != 200) { @@ -307,7 +307,7 @@ public class UniProtFTSRestClient extends FTSRestClient firstRow = false; continue; } - // System.out.println(dataRow); + // jalview.bin.Console.outPrintln(dataRow); result.add(getFTSData(dataRow, uniprotRestRequest)); } searchResult.setNumberOfItemsFound(xTotalResults); @@ -389,7 +389,7 @@ public class UniProtFTSRestClient extends FTSRestClient } catch (Exception e) { e.printStackTrace(); - System.out.println("offending value:" + fieldData); + jalview.bin.Console.outPrintln("offending value:" + fieldData); } } } catch (Exception e) diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index ab705c2..217175e 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -49,6 +49,7 @@ import java.beans.PropertyChangeEvent; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.URL; import java.util.ArrayList; @@ -157,7 +158,6 @@ import jalview.viewmodel.AlignmentViewport; import jalview.viewmodel.ViewportRanges; import jalview.ws.DBRefFetcher; import jalview.ws.DBRefFetcher.FetchFinishedListenerI; -import jalview.ws.datamodel.alphafold.PAEContactMatrix; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; import jalview.ws.jws2.jabaws2.Jws2Instance; @@ -624,12 +624,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // if (viewport.cursorMode) // { // alignPanel.seqPanel.insertNucAtCursor(false,"A"); - // //System.out.println("A"); + // //jalview.bin.Console.outPrintln("A"); // } // break; /* * case KeyEvent.VK_CLOSE_BRACKET: if (viewport.cursorMode) { - * System.out.println("closing bracket"); } break; + * jalview.bin.Console.outPrintln("closing bracket"); } break; */ case KeyEvent.VK_DELETE: case KeyEvent.VK_BACK_SPACE: @@ -830,7 +830,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void propertyChange(PropertyChangeEvent evt) { - // // System.out.println("Discoverer property change."); + // // jalview.bin.Console.outPrintln("Discoverer property + // change."); // if (evt.getPropertyName().equals("services")) { SwingUtilities.invokeLater(new Runnable() @@ -839,7 +840,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - System.err.println( + jalview.bin.Console.errPrintln( "Rebuild WS Menu for service change"); BuildWebServiceMenu(); } @@ -854,7 +855,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void internalFrameClosed( javax.swing.event.InternalFrameEvent evt) { - // System.out.println("deregistering discoverer listener"); + // jalview.bin.Console.outPrintln("deregistering discoverer listener"); Desktop.instance.removeJalviewPropertyChangeListener("services", thisListener); closeMenuItem_actionPerformed(true); @@ -1251,8 +1252,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ public void saveAlignment(String file, FileFormatI format) { + saveAlignment(file, format, false); + } + + public void saveAlignment(String file, FileFormatI format, boolean stdout) + { lastSaveSuccessful = true; - lastFilenameSaved = file; + if (!stdout) + { + lastFilenameSaved = file; + } lastFormatSaved = format; if (FileFormat.Jalview.equals(format)) @@ -1263,6 +1272,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, shortName = shortName .substring(shortName.lastIndexOf(File.separatorChar) + 1); } + // TODO deal with stdout=true lastSaveSuccessful = new Jalview2XML().saveAlignment(this, file, shortName); @@ -1298,7 +1308,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, else { // create backupfiles object and get new temp filename destination - boolean doBackup = BackupFiles.getEnabled(); + boolean doBackup = BackupFiles.getEnabled() && !stdout; BackupFiles backupfiles = null; if (doBackup) { @@ -1310,7 +1320,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, String tempFilePath = doBackup ? backupfiles.getTempFilePath() : file; Console.trace("ALIGNFRAME setting PrintWriter"); - PrintWriter out = new PrintWriter(new FileWriter(tempFilePath)); + PrintWriter out = stdout + ? new PrintWriter(new OutputStreamWriter(System.out)) + : new PrintWriter(new FileWriter(tempFilePath)); if (backupfiles != null) { @@ -1319,13 +1331,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } out.print(output); - Console.trace("ALIGNFRAME about to close file"); - out.close(); - Console.trace("ALIGNFRAME closed file"); - AlignFrame.this.setTitle(file); - statusBar.setText(MessageManager.formatMessage( - "label.successfully_saved_to_file_in_format", new Object[] - { fileName, format.getName() })); + out.flush(); + if (!stdout) + { + Console.trace("ALIGNFRAME about to close file"); + out.close(); + Console.trace("ALIGNFRAME closed file"); + } + AlignFrame.this.setTitle(stdout ? "STDOUT" : file); + if (stdout) + { + statusBar.setText(MessageManager.formatMessage( + "label.successfully_printed_to_stdout_in_format", + new Object[] + { format.getName() })); + } + else + { + statusBar.setText(MessageManager.formatMessage( + "label.successfully_saved_to_file_in_format", + new Object[] + { fileName, format.getName() })); + } lastSaveSuccessful = true; } catch (IOException e) { @@ -1456,9 +1483,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void htmlMenuItem_actionPerformed(ActionEvent e) { HtmlSvgOutput htmlSVG = new HtmlSvgOutput(alignPanel); - try { + try + { htmlSVG.exportHTML(null); - } catch (ImageOutputException x) { + } catch (ImageOutputException x) + { // report problem to console and raise dialog } } @@ -1467,51 +1496,64 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void bioJSMenuItem_actionPerformed(ActionEvent e) { BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel); - try { - bjs.exportHTML(null); - } catch (ImageOutputException x) { - // report problem to console and raise dialog - } + try + { + bjs.exportHTML(null); + } catch (ImageOutputException x) + { + // report problem to console and raise dialog + } } public void createImageMap(File file, String image) { - try { - alignPanel.makePNGImageMap(file, image); - } catch (ImageOutputException x) { + try + { + alignPanel.makePNGImageMap(file, image); + } catch (ImageOutputException x) + { // report problem to console and raise dialog } } @Override - public void createPNG_actionPerformed(ActionEvent e) { - try{ + public void createPNG_actionPerformed(ActionEvent e) + { + try + { createPNG(null); } catch (ImageOutputException ioex) { // raise dialog, and report via console } } + @Override - public void createEPS_actionPerformed(ActionEvent e) { - try{ + public void createEPS_actionPerformed(ActionEvent e) + { + try + { createEPS(null); } catch (ImageOutputException ioex) { // raise dialog, and report via console } - + } + @Override - public void createSVG_actionPerformed(ActionEvent e) { - try{ + public void createSVG_actionPerformed(ActionEvent e) + { + try + { createSVG(null); } catch (ImageOutputException ioex) { // raise dialog, and report via console } - + } + /** * Creates a PNG image of the alignment and writes it to the given file. If * the file is null, the user is prompted to choose a file. @@ -1523,7 +1565,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, createPNG(f, null, BitmapImageSizing.nullBitmapImageSizing()); } - public void createPNG(File f, String renderer, BitmapImageSizing userBis) throws ImageOutputException + public void createPNG(File f, String renderer, BitmapImageSizing userBis) + throws ImageOutputException { alignPanel.makeAlignmentImage(TYPE.PNG, f, renderer, userBis); } @@ -1534,7 +1577,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * * @param f */ - public void createEPS(File f) throws ImageOutputException + public void createEPS(File f) throws ImageOutputException { createEPS(f, null); } @@ -1550,7 +1593,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * * @param f */ - public void createSVG(File f) throws ImageOutputException + public void createSVG(File f) throws ImageOutputException { createSVG(f, null); } @@ -2341,12 +2384,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // annotation was duplicated earlier alignment.addAnnotation(sequences[i].getAnnotation()[a]); // take care of contact matrix too - ContactMatrixI cm=sequences[i].getContactMatrixFor(sequences[i].getAnnotation()[a]); - if (cm!=null) + ContactMatrixI cm = sequences[i] + .getContactMatrixFor(sequences[i].getAnnotation()[a]); + if (cm != null) { - alignment.addContactListFor(sequences[i].getAnnotation()[a], cm); + alignment.addContactListFor(sequences[i].getAnnotation()[a], + cm); } - + alignment.setAnnotationIndex(sequences[i].getAnnotation()[a], a); } @@ -2454,7 +2499,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception ex) { ex.printStackTrace(); - System.out.println("Exception whilst pasting: " + ex); + jalview.bin.Console.outPrintln("Exception whilst pasting: " + ex); // could be anything being pasted in here } @@ -2502,7 +2547,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception ex) { ex.printStackTrace(); - System.out.println("Exception whilst pasting: " + ex); + jalview.bin.Console.outPrintln("Exception whilst pasting: " + ex); // could be anything being pasted in here } catch (OutOfMemoryError oom) { @@ -3138,11 +3183,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void wrapMenuItem_actionPerformed(ActionEvent e) { - scaleAbove.setVisible(wrapMenuItem.isSelected()); - scaleLeft.setVisible(wrapMenuItem.isSelected()); - scaleRight.setVisible(wrapMenuItem.isSelected()); - viewport.setWrapAlignment(wrapMenuItem.isSelected()); + setWrapFormat(wrapMenuItem.isSelected(), false); + } + + public void setWrapFormat(boolean b, boolean setMenuItem) + { + scaleAbove.setVisible(b); + scaleLeft.setVisible(b); + scaleRight.setVisible(b); + viewport.setWrapAlignment(b); alignPanel.updateLayout(); + if (setMenuItem) + { + wrapMenuItem.setSelected(b); + } } @Override @@ -4239,8 +4293,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return tp; } - public void showContactMapTree(AlignmentAnnotation aa, - ContactMatrixI cm) + public void showContactMapTree(AlignmentAnnotation aa, ContactMatrixI cm) { int x = 4, y = 5; int w = 400, h = 500; @@ -4249,10 +4302,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { NewickFile fin = new NewickFile( new FileParse(cm.getNewick(), DataSourceType.PASTE)); - String title = cm.getAnnotLabel() + " " + cm.getTreeMethod() + " tree" - + aa.sequenceRef != null + String title = aa.label + " " + cm.getTreeMethod() + " tree" + + (aa.sequenceRef != null ? (" for " + aa.sequenceRef.getDisplayId(false)) - : ""; + : ""); showColumnWiseTree(fin, aa, title, w, h, x, y); } catch (Throwable xx) @@ -4272,7 +4325,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { return null; } - TreePanel tp = new TreePanel(alignPanel, nf, aa, title); + TreePanel tp = new TreePanel(alignPanel, nf, aa, treeTitle); tp.setSize(w, h); @@ -4281,7 +4334,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, tp.setLocation(x, y); } - Desktop.addInternalFrame(tp, title, w, h); + Desktop.addInternalFrame(tp, treeTitle, w, h); return tp; } catch (Throwable xx) { @@ -4303,7 +4356,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { try { - System.err.println("Waiting for building menu to finish."); + jalview.bin.Console + .errPrintln("Waiting for building menu to finish."); Thread.sleep(10); } catch (Exception e) { @@ -4319,7 +4373,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, final List legacyItems = new ArrayList<>(); try { - // System.err.println("Building ws menu again " + // jalview.bin.Console.errPrintln("Building ws menu again " // + Thread.currentThread()); // TODO: add support for context dependent disabling of services based // on @@ -4857,7 +4911,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Desktop.instance); if (pe != null) { - System.err.println("Associated file : " + jalview.bin.Console.errPrintln("Associated file : " + (fm[0].toString()) + " with " + toassoc.getDisplayId(true)); assocfiles++; @@ -5890,7 +5944,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.getAlignment())); } catch (Exception ex) { - System.err.println(ex.getMessage()); + jalview.bin.Console.errPrintln(ex.getMessage()); return; } } @@ -5912,7 +5966,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, console.runScript(); } catch (Exception ex) { - System.err.println((ex.toString())); + jalview.bin.Console.errPrintln((ex.toString())); JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager.getString("label.couldnt_run_groovy_script"), MessageManager.getString("label.groovy_support_failed"), @@ -5921,7 +5975,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - System.err.println("Can't run Groovy script as console not found"); + jalview.bin.Console + .errPrintln("Can't run Groovy script as console not found"); } } diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index 5613f16..ef9e575 100644 --- a/src/jalview/gui/AlignViewport.java +++ b/src/jalview/gui/AlignViewport.java @@ -45,7 +45,6 @@ import jalview.bin.Console; import jalview.commands.CommandI; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; -import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; import jalview.datamodel.ContactMatrixI; diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index 3dfb510..ee71483 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -50,6 +50,7 @@ import jalview.api.AlignmentViewPanel; import jalview.bin.Cache; import jalview.bin.Console; import jalview.bin.Jalview; +import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.HiddenColumns; import jalview.datamodel.SearchResultsI; @@ -269,10 +270,7 @@ public class AlignmentPanel extends GAlignmentPanel implements Dimension r = null; if (av.getIdWidth() < 0) { - int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300); - int idWidth = Math.min(afwidth - 200, 2 * afwidth / 3); - int maxwidth = Math.max(IdwidthAdjuster.MIN_ID_WIDTH, idWidth); - r = calculateIdWidth(maxwidth); + r = calculateDefaultAlignmentIdWidth(); av.setIdWidth(r.width); } else @@ -294,6 +292,14 @@ public class AlignmentPanel extends GAlignmentPanel implements return r; } + public Dimension calculateDefaultAlignmentIdWidth() + { + int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300); + int idWidth = Math.min(afwidth - 200, 2 * afwidth / 3); + int maxwidth = Math.max(IdwidthAdjuster.MIN_ID_WIDTH, idWidth); + return calculateIdWidth(-1, false, false); + } + /** * Calculate the width of the alignment labels based on the displayed names * and any bounds on label width set in preferences. @@ -305,6 +311,12 @@ public class AlignmentPanel extends GAlignmentPanel implements */ protected Dimension calculateIdWidth(int maxwidth) { + return calculateIdWidth(maxwidth, true, false); + } + + public Dimension calculateIdWidth(int maxwidth, + boolean includeAnnotations, boolean visibleOnly) + { Container c = new Container(); FontMetrics fm = c.getFontMetrics( @@ -324,18 +336,29 @@ public class AlignmentPanel extends GAlignmentPanel implements } // Also check annotation label widths - i = 0; - - if (al.getAlignmentAnnotation() != null) + if (includeAnnotations && al.getAlignmentAnnotation() != null) { - fm = c.getFontMetrics(getAlabels().getFont()); - - while (i < al.getAlignmentAnnotation().length) + if (Jalview.isHeadlessMode()) { - String label = al.getAlignmentAnnotation()[i].label; - int stringWidth = fm.stringWidth(label); + AnnotationLabels aal = this.getAlabels(); + int stringWidth = aal.drawLabels(null, false, idWidth, false, fm); idWidth = Math.max(idWidth, stringWidth); - i++; + } + else + { + fm = c.getFontMetrics(getAlabels().getFont()); + + for (i = 0; i < al.getAlignmentAnnotation().length; i++) + { + AlignmentAnnotation aa = al.getAlignmentAnnotation()[i]; + if (visibleOnly && !aa.visible) + { + continue; + } + String label = aa.label; + int stringWidth = fm.stringWidth(label); + idWidth = Math.max(idWidth, stringWidth); + } } } @@ -543,7 +566,7 @@ public class AlignmentPanel extends GAlignmentPanel implements // this is called after loading new annotation onto alignment if (alignFrame.getHeight() == 0) { - System.out.println("NEEDS FIXING"); + jalview.bin.Console.outPrintln("NEEDS FIXING"); } validateAnnotationDimensions(true); addNotify(); @@ -567,21 +590,29 @@ public class AlignmentPanel extends GAlignmentPanel implements // not be called directly by programs. // I note that addNotify() is called in several areas of Jalview. - int annotationHeight = getAnnotationPanel().adjustPanelHeight(); - annotationHeight = getAnnotationPanel() - .adjustForAlignFrame(adjustPanelHeight, annotationHeight); + AnnotationPanel ap = getAnnotationPanel(); + int annotationHeight = ap.adjustPanelHeight(); + annotationHeight = ap.adjustForAlignFrame(adjustPanelHeight, + annotationHeight); hscroll.addNotify(); - annotationScroller.setPreferredSize( - new Dimension(annotationScroller.getWidth(), annotationHeight)); - Dimension e = idPanel.getSize(); - alabels.setSize(new Dimension(e.width, annotationHeight)); + int idWidth = e.width; + boolean manuallyAdjusted = this.getIdPanel().getIdCanvas() + .manuallyAdjusted(); + annotationScroller.setPreferredSize(new Dimension( + manuallyAdjusted ? idWidth : annotationScroller.getWidth(), + annotationHeight)); + + alabels.setPreferredSize(new Dimension(idWidth, annotationHeight)); annotationSpaceFillerHolder.setPreferredSize(new Dimension( - annotationSpaceFillerHolder.getWidth(), annotationHeight)); + manuallyAdjusted ? idWidth + : annotationSpaceFillerHolder.getWidth(), + annotationHeight)); annotationScroller.validate(); annotationScroller.addNotify(); + ap.validate(); } /** @@ -597,9 +628,10 @@ public class AlignmentPanel extends GAlignmentPanel implements boolean wrap = av.getWrapAlignment(); ViewportRanges ranges = av.getRanges(); ranges.setStartSeq(0); - scalePanelHolder.setVisible(!wrap); + // scalePanelHolder.setVisible(!wrap); hscroll.setVisible(!wrap); - idwidthAdjuster.setVisible(!wrap); + // Allow idPanel width adjustment in wrap mode + idwidthAdjuster.setVisible(true); if (wrap) { @@ -633,7 +665,7 @@ public class AlignmentPanel extends GAlignmentPanel implements } } - idSpaceFillerPanel1.setVisible(!wrap); + // idSpaceFillerPanel1.setVisible(!wrap); repaint(); } @@ -854,10 +886,27 @@ public class AlignmentPanel extends GAlignmentPanel implements public void paintComponent(Graphics g) { invalidate(); // needed so that the id width adjuster works correctly - Dimension d = getIdPanel().getIdCanvas().getPreferredSize(); - idPanelHolder.setPreferredSize(d); - hscrollFillerPanel.setPreferredSize(new Dimension(d.width, 12)); + int idWidth = d.width; + + // check wrapped alignment as at least 1 residue width + if (av.getWrapAlignment()) + { + SeqCanvas sc = this.getSeqPanel().seqCanvas; + if (sc != null && sc.getWidth() < sc.getMinimumWrappedCanvasWidth()) + { + // need to make some adjustments + idWidth -= (sc.getMinimumWrappedCanvasWidth() - sc.getWidth()); + av.setIdWidth(idWidth); + av.getAlignPanel().getIdPanel().getIdCanvas() + .setManuallyAdjusted(true); + + validateAnnotationDimensions(false); + } + } + + idPanelHolder.setPreferredSize(new Dimension(idWidth, d.height)); + hscrollFillerPanel.setPreferredSize(new Dimension(idWidth, 12)); validate(); // needed so that the id width adjuster works correctly @@ -1172,10 +1221,12 @@ public class AlignmentPanel extends GAlignmentPanel implements } int w = getIdPanel().getWidth(); + w = this.calculateIdWidth(-1, true, true).width; return (w > 0 ? w : calculateIdWidth().width); } - void makeAlignmentImage(ImageMaker.TYPE type, File file, String renderer) throws ImageOutputException + void makeAlignmentImage(ImageMaker.TYPE type, File file, String renderer) + throws ImageOutputException { makeAlignmentImage(type, file, renderer, BitmapImageSizing.nullBitmapImageSizing()); @@ -1196,6 +1247,7 @@ public class AlignmentPanel extends GAlignmentPanel implements final int borderBottomOffset = 5; AlignmentDimension aDimension = getAlignmentDimension(); + // todo use a lambda function in place of callback here? ImageWriterI writer = new ImageWriterI() { @@ -1266,7 +1318,8 @@ public class AlignmentPanel extends GAlignmentPanel implements } - public void makePNGImageMap(File imgMapFile, String imageName) throws ImageOutputException + public void makePNGImageMap(File imgMapFile, String imageName) + throws ImageOutputException { // /////ONLY WORKS WITH NON WRAPPED ALIGNMENTS // //////////////////////////////////////////// @@ -1391,7 +1444,8 @@ public class AlignmentPanel extends GAlignmentPanel implements } catch (Exception ex) { - throw new ImageOutputException("couldn't write ImageMap due to unexpected error",ex); + throw new ImageOutputException( + "couldn't write ImageMap due to unexpected error", ex); } } // /////////END OF IMAGE MAP @@ -1407,8 +1461,7 @@ public class AlignmentPanel extends GAlignmentPanel implements { int seqPanelWidth = getSeqPanel().seqCanvas.getWidth(); - if (System.getProperty("java.awt.headless") != null - && System.getProperty("java.awt.headless").equals("true")) + if (Jalview.isHeadlessMode()) { seqPanelWidth = alignFrame.getWidth() - getVisibleIdWidth() - vscroll.getPreferredSize().width diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java index 6b82a37..20e1b1b 100755 --- a/src/jalview/gui/AnnotationLabels.java +++ b/src/jalview/gui/AnnotationLabels.java @@ -20,6 +20,7 @@ */ package jalview.gui; +import java.awt.Canvas; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; @@ -50,6 +51,8 @@ import javax.swing.ToolTipManager; import jalview.analysis.AlignSeq; import jalview.analysis.AlignmentUtils; +import jalview.bin.Cache; +import jalview.bin.Jalview; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; @@ -85,7 +88,7 @@ public class AnnotationLabels extends JPanel /** * height in pixels for allowing height adjuster to be active */ - private static int HEIGHT_ADJUSTER_HEIGHT = 10; + public static int HEIGHT_ADJUSTER_HEIGHT = 10; private static final Font font = new Font("Arial", Font.PLAIN, 11); @@ -113,6 +116,8 @@ public class AnnotationLabels extends JPanel private static final String COPYCONS_SEQ = MessageManager .getString("label.copy_consensus_sequence"); + private static final String ADJUST_ANNOTATION_LABELS_WIDTH_PREF = "ADJUST_ANNOTATION_LABELS_WIDTH"; + private final boolean debugRedraw = false; private AlignmentPanel ap; @@ -131,6 +136,10 @@ public class AnnotationLabels extends JPanel private boolean resizePanel = false; + private int annotationIdWidth = -1; + + public static final String RESIZE_MARGINS_MARK_PREF = "RESIZE_MARGINS_MARK"; + /** * Creates a new AnnotationLabels object * @@ -138,7 +147,6 @@ public class AnnotationLabels extends JPanel */ public AnnotationLabels(AlignmentPanel ap) { - this.ap = ap; av = ap.av; ToolTipManager.sharedInstance().registerComponent(this); @@ -418,65 +426,74 @@ public class AnnotationLabels extends JPanel pop.add(consclipbrd); } - addColourOrFilterByOptions(ap,aa[selectedRow],pop); - + addColourOrFilterByOptions(ap, aa[selectedRow], pop); + if (aa[selectedRow].graph == AlignmentAnnotation.CONTACT_MAP) { - addContactMatrixOptions(ap,aa[selectedRow],pop); - // Set/adjust threshold for grouping ? - // colour alignment by this [type] - // select/hide columns by this row - - } + addContactMatrixOptions(ap, aa[selectedRow], pop); + // Set/adjust threshold for grouping ? + // colour alignment by this [type] + // select/hide columns by this row + } - + } + pop.show(this, evt.getX(), evt.getY()); } static void addColourOrFilterByOptions(final AlignmentPanel ap, - final AlignmentAnnotation alignmentAnnotation, final JPopupMenu pop) + final AlignmentAnnotation alignmentAnnotation, + final JPopupMenu pop) { JMenuItem item; - item = new JMenuItem(MessageManager.getString("label.colour_by_annotation")); + item = new JMenuItem( + MessageManager.getString("label.colour_by_annotation")); item.addActionListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { - AnnotationColourChooser.displayFor(ap.av, ap,alignmentAnnotation,false); + AnnotationColourChooser.displayFor(ap.av, ap, alignmentAnnotation, + false); }; }); pop.add(item); - if (alignmentAnnotation.sequenceRef!=null) + if (alignmentAnnotation.sequenceRef != null) { - item = new JMenuItem(MessageManager.getString("label.colour_by_annotation")+" ("+MessageManager.getString("label.per_seq")+")"); + item = new JMenuItem( + MessageManager.getString("label.colour_by_annotation") + " (" + + MessageManager.getString("label.per_seq") + ")"); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - AnnotationColourChooser.displayFor(ap.av, ap,alignmentAnnotation,true); + AnnotationColourChooser.displayFor(ap.av, ap, alignmentAnnotation, + true); }; }); pop.add(item); } - item = new JMenuItem(MessageManager.getString("action.select_by_annotation")); + item = new JMenuItem( + MessageManager.getString("action.select_by_annotation")); item.addActionListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { - AnnotationColumnChooser.displayFor(ap.av,ap,alignmentAnnotation); + AnnotationColumnChooser.displayFor(ap.av, ap, alignmentAnnotation); }; }); pop.add(item); } + static void addContactMatrixOptions(final AlignmentPanel ap, - final AlignmentAnnotation alignmentAnnotation, final JPopupMenu pop) + final AlignmentAnnotation alignmentAnnotation, + final JPopupMenu pop) { - + final ContactMatrixI cm = ap.av.getContactMatrix(alignmentAnnotation); JMenuItem item; if (cm != null) @@ -485,10 +502,13 @@ public class AnnotationLabels extends JPanel if (cm.hasGroups()) { - JCheckBoxMenuItem chitem = new JCheckBoxMenuItem(MessageManager.getString("action.show_groups_on_matrix")); - chitem.setToolTipText(MessageManager.getString("action.show_groups_on_matrix_tooltip")); - boolean showGroups = alignmentAnnotation.isShowGroupsForContactMatrix(); - final AlignmentAnnotation sel_row=alignmentAnnotation; + JCheckBoxMenuItem chitem = new JCheckBoxMenuItem( + MessageManager.getString("action.show_groups_on_matrix")); + chitem.setToolTipText(MessageManager + .getString("action.show_groups_on_matrix_tooltip")); + boolean showGroups = alignmentAnnotation + .isShowGroupsForContactMatrix(); + final AlignmentAnnotation sel_row = alignmentAnnotation; chitem.setState(showGroups); chitem.addActionListener(new ActionListener() { @@ -497,16 +517,20 @@ public class AnnotationLabels extends JPanel public void actionPerformed(ActionEvent e) { sel_row.setShowGroupsForContactMatrix(chitem.getState()); - ap.getAnnotationPanel() - .paint(ap.getAnnotationPanel().getGraphics()); + // so any annotation colour changes are propagated - though they + // probably won't be unless the annotation row colours are removed + // too! + ap.alignmentChanged(); } }); pop.add(chitem); } if (cm.hasTree()) { - item = new JMenuItem(MessageManager.getString("action.show_tree_for_matrix")); - item.setToolTipText(MessageManager.getString("action.show_tree_for_matrix_tooltip")); + item = new JMenuItem( + MessageManager.getString("action.show_tree_for_matrix")); + item.setToolTipText(MessageManager + .getString("action.show_tree_for_matrix_tooltip")); item.addActionListener(new ActionListener() { @@ -522,8 +546,10 @@ public class AnnotationLabels extends JPanel } else { - item = new JMenuItem(MessageManager.getString("action.cluster_matrix")); - item.setToolTipText(MessageManager.getString("action.cluster_matrix_tooltip")); + item = new JMenuItem( + MessageManager.getString("action.cluster_matrix")); + item.setToolTipText( + MessageManager.getString("action.cluster_matrix_tooltip")); item.addActionListener(new ActionListener() { @Override @@ -535,8 +561,15 @@ public class AnnotationLabels extends JPanel public void run() { final long progBar; - ap.alignFrame.setProgressBar(MessageManager.formatMessage("action.clustering_matrix_for",cm.getAnnotDescr(),5f), progBar = System.currentTimeMillis()); - cm.setGroupSet(GroupSet.makeGroups(cm, 5f, true)); + ap.alignFrame.setProgressBar( + MessageManager.formatMessage( + "action.clustering_matrix_for", + cm.getAnnotDescr(), 5f), + progBar = System.currentTimeMillis()); + cm.setGroupSet(GroupSet.makeGroups(cm, true)); + cm.randomlyReColourGroups(); + cm.transferGroupColorsTo(alignmentAnnotation); + ap.alignmentChanged(); ap.alignFrame.showContactMapTree(alignmentAnnotation, cm); ap.alignFrame.setProgressBar(null, progBar); } @@ -1136,7 +1169,6 @@ public class AnnotationLabels extends JPanel } drawComponent(g2, true, width); - } /** @@ -1166,32 +1198,146 @@ public class AnnotationLabels extends JPanel * @param width * Width for scaling labels */ - public void drawComponent(Graphics g, boolean clip, int width) + public void drawComponent(Graphics g, boolean clip, int givenWidth) { - if (av.getFont().getSize() < 10) + int width = givenWidth; + IdwidthAdjuster iwa = null; + if (ap != null) { - g.setFont(font); + iwa = ap.idwidthAdjuster; + if ((Cache.getDefault(ADJUST_ANNOTATION_LABELS_WIDTH_PREF, true) + || Jalview.isHeadlessMode())) + { + Graphics2D g2d = (Graphics2D) g; + Graphics dummy = g2d.create(); + int newAnnotationIdWidth = drawLabels(dummy, clip, width, false, + null); + dummy.dispose(); + Dimension d = ap.calculateDefaultAlignmentIdWidth(); + int alignmentIdWidth = d.width; + if (iwa != null && !iwa.manuallyAdjusted()) + { + // If no manual adjustment to ID column with has been made then adjust + // width match widest of alignment or annotation id widths + boolean allowShrink = Cache.getDefault("ALLOW_SHRINK_ID_WIDTH", + false); + width = Math.max(alignmentIdWidth, newAnnotationIdWidth); + if (clip && width < givenWidth && !allowShrink) + { + width = givenWidth; + } + } + else if (newAnnotationIdWidth != annotationIdWidth + && newAnnotationIdWidth > givenWidth + && newAnnotationIdWidth > alignmentIdWidth) + { + // otherwise if the annotation id width has become larger than the + // current id width, increase + width = newAnnotationIdWidth; + annotationIdWidth = newAnnotationIdWidth; + } + // set the width if it's changed + if (width != ap.av.getIdWidth()) + { + iwa.setWidth(width); + } + } } else { - g.setFont(av.getFont()); + int newAnnotationIdWidth = drawLabels(g, clip, width, false, null); + width = Math.max(newAnnotationIdWidth, givenWidth); + } + drawLabels(g, clip, width, true, null); + } + + /** + * Render the full set of annotation Labels for the alignment at the given + * cursor. If actuallyDraw is false or g is null then no actual drawing will + * occur, but the widest label width will be returned. If g is null then + * fmetrics must be supplied. + * + * Returns the width of the annotation labels. + * + * @param g + * Graphics2D instance (needed for font scaling) + * @param clip + * - true indicates that only current visible area needs to be + * rendered + * @param width + * Width for scaling labels + * @param fmetrics + * FontMetrics if Graphics object g is null + */ + public int drawLabels(Graphics g0, boolean clip, int width, + boolean actuallyDraw, FontMetrics fmetrics) + { + if (clip) + { + clip = Cache.getDefault("MOVE_SEQUENCE_ID_WITH_VISIBLE_ANNOTATIONS", + true); + } + Graphics g = null; + // create a dummy Graphics object if not drawing and one is supplied + if (g0 != null) + { + if (!actuallyDraw) + { + Graphics2D g2d = (Graphics2D) g0; + g = g2d.create(); + } + else + { + g = g0; + } } + int actualWidth = 0; + if (g != null) + { + if (av.getFont().getSize() < 10) + { + g.setFont(font); + } + else + { + g.setFont(av.getFont()); + } + } + + FontMetrics fm = fmetrics == null ? g.getFontMetrics(g.getFont()) + : fmetrics; + if (actuallyDraw) + { + g.setColor(Color.white); + g.fillRect(0, 0, getWidth(), getHeight()); + + if (!Cache.getDefault(RESIZE_MARGINS_MARK_PREF, false) + && !av.getWrapAlignment()) + { + g.setColor(Color.LIGHT_GRAY); + g.drawLine(0, HEIGHT_ADJUSTER_HEIGHT / 4, HEIGHT_ADJUSTER_WIDTH / 4, + HEIGHT_ADJUSTER_HEIGHT / 4); + g.drawLine(0, 3 * HEIGHT_ADJUSTER_HEIGHT / 4, + HEIGHT_ADJUSTER_WIDTH / 4, 3 * HEIGHT_ADJUSTER_HEIGHT / 4); - FontMetrics fm = g.getFontMetrics(g.getFont()); - g.setColor(Color.white); - g.fillRect(0, 0, getWidth(), getHeight()); + } + } - g.translate(0, getScrollOffset()); - g.setColor(Color.black); + if (actuallyDraw) + { + g.translate(0, getScrollOffset()); + g.setColor(Color.black); + } SequenceI lastSeqRef = null; String lastLabel = null; AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation(); - int fontHeight = g.getFont().getSize(); + int fontHeight = g != null ? g.getFont().getSize() + : fm.getFont().getSize(); int y = 0; int x = 0; int graphExtras = 0; int offset = 0; - Font baseFont = g.getFont(); + Font baseFont = g != null ? g.getFont() : fm.getFont(); FontMetrics baseMetrics = fm; int ofontH = fontHeight; int sOffset = 0; @@ -1232,7 +1378,7 @@ public class AnnotationLabels extends JPanel { if (debugRedraw) { - System.out.println("before vis: " + i); + jalview.bin.Console.outPrintln("before vis: " + i); } before = true; } @@ -1246,7 +1392,7 @@ public class AnnotationLabels extends JPanel { if (debugRedraw) { - System.out.println( + jalview.bin.Console.outPrintln( "Scroll offset: " + sOffset + " after vis: " + i); } after = true; @@ -1255,8 +1401,10 @@ public class AnnotationLabels extends JPanel continue; } } - g.setColor(Color.black); - + if (actuallyDraw && g != null) + { + g.setColor(Color.black); + } offset = -aa[i].height / 2; if (aa[i].hasText) @@ -1301,7 +1449,9 @@ public class AnnotationLabels extends JPanel vertBar = true; } } - x = width - fm.stringWidth(label) - 3; + + int labelWidth = fm.stringWidth(label) + 3; + x = width - labelWidth; if (aa[i].graphGroup > -1) { @@ -1334,10 +1484,15 @@ public class AnnotationLabels extends JPanel s = ((float) fontHeight) / (float) ofontH; Font f = baseFont .deriveFont(AffineTransform.getScaleInstance(s, s)); - g.setFont(f); - fm = g.getFontMetrics(); - graphExtras = (aa[i].height - (groupSize * (fontHeight + 8))) - / 2; + Canvas c = new Canvas(); + fm = c.getFontMetrics(f); + if (actuallyDraw && g != null) + { + g.setFont(f); + // fm = g.getFontMetrics(); + graphExtras = (aa[i].height + - (groupSize * (fontHeight + 8))) / 2; + } } } if (visible) @@ -1346,58 +1501,81 @@ public class AnnotationLabels extends JPanel { if (aa[gg].graphGroup == aa[i].graphGroup) { - x = width - fm.stringWidth(aa[gg].label) - 3; - g.drawString(aa[gg].label, x, y - graphExtras); - - if (aa[gg]._linecolour != null) + labelWidth = fm.stringWidth(aa[gg].label) + 3; + x = width - labelWidth; + if (actuallyDraw && g != null) { + g.drawString(aa[gg].label, x, y - graphExtras); - g.setColor(aa[gg]._linecolour); - g.drawLine(x, y - graphExtras + 3, - x + fm.stringWidth(aa[gg].label), - y - graphExtras + 3); - } + if (aa[gg]._linecolour != null) + { + + g.setColor(aa[gg]._linecolour); + g.drawLine(x, y - graphExtras + 3, + x + fm.stringWidth(aa[gg].label), + y - graphExtras + 3); + } - g.setColor(Color.black); + g.setColor(Color.black); + } graphExtras += fontHeight + 8; } } } - g.setFont(baseFont); + if (actuallyDraw && g != null) + { + g.setFont(baseFont); + } fm = baseMetrics; fontHeight = ofontH; } else { - if (vertBar) + if (actuallyDraw && g != null) { - g.drawLine(width - 3, y + offset - fontHeight, width - 3, - (int) (y - 1.5 * aa[i].height - offset - fontHeight)); - // g.drawLine(20, y + offset, x - 20, y + offset); + if (vertBar) + { + g.drawLine(width - 3, y + offset - fontHeight, width - 3, + (int) (y - 1.5 * aa[i].height - offset - fontHeight)); + // g.drawLine(20, y + offset, x - 20, y + offset); + } + g.drawString(label, x, y + offset); } - g.drawString(label, x, y + offset); } lastSeqRef = aa[i].sequenceRef; + + if (labelWidth > actualWidth) + { + actualWidth = labelWidth; + } } } if (!resizePanel && dragEvent != null && aa != null) { - g.setColor(Color.lightGray); - g.drawString( - (aa[selectedRow].sequenceRef == null ? "" - : aa[selectedRow].sequenceRef.getName()) - + aa[selectedRow].label, - dragEvent.getX(), dragEvent.getY() - getScrollOffset()); + if (actuallyDraw && g != null) + { + g.setColor(Color.lightGray); + g.drawString( + (aa[selectedRow].sequenceRef == null ? "" + : aa[selectedRow].sequenceRef.getName()) + + aa[selectedRow].label, + dragEvent.getX(), dragEvent.getY() - getScrollOffset()); + } } if (!av.getWrapAlignment() && ((aa == null) || (aa.length < 1))) { - g.drawString(MessageManager.getString("label.right_click"), 2, 8); - g.drawString(MessageManager.getString("label.to_add_annotation"), 2, - 18); + if (actuallyDraw && g != null) + { + g.drawString(MessageManager.getString("label.right_click"), 2, 8); + g.drawString(MessageManager.getString("label.to_add_annotation"), 2, + 18); + } } + + return actualWidth; } public int getScrollOffset() diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index 8e04048..8a957bc 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -737,7 +737,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, if (evt.isControlDown() && PAEContactMatrix.PAEMATRIX.equals(clicked.getCalcId())) { - int c = fr - 1; + int c = fr; ContactRange cr = forCurrentX.getRangeFor(fr, to); double cval; // TODO: could use GraphLine instead of arbitrary picking @@ -747,7 +747,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, // controls feathering - what other elements in row/column // should we select double thresh = cr.getMean() + (cr.getMax() - cr.getMean()) * .15; - while (c > 0) + while (c >= 0) { cval = forCurrentX.getContactAt(c); if (// cr.getMin() <= cval && @@ -1078,12 +1078,12 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, ContactGeometry lastXcgeom = new ContactGeometry(forFromX, cma.graphHeight); ContactGeometry.contactInterval lastXci = lastXcgeom - .mapFor(rowIndex[1], rowIndex[1] - deltaY); + .mapFor(rowIndex[1], rowIndex[1] + deltaY); ContactGeometry cXcgeom = new ContactGeometry(forToX, cma.graphHeight); ContactGeometry.contactInterval cXci = cXcgeom.mapFor(rowIndex[1], - rowIndex[1] - deltaY); + rowIndex[1] + deltaY); // mark rectangular region formed by drag jalview.bin.Console.trace("Matrix Selection from last(" + fromXc @@ -1247,7 +1247,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, { row = i; res[0] = row; - res[1] = height - yPos; + res[1] = yPos-lheight; break; } } @@ -1301,6 +1301,10 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, // TODO abstract tooltip generator so different implementations can be built if (ann.graph == AlignmentAnnotation.CONTACT_MAP) { + if (rowAndOffset>=ann.graphHeight) + { + return null; + } ContactListI clist = av.getContactList(ann, column); if (clist != null) { @@ -1503,7 +1507,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, tried = true; } catch (IllegalArgumentException exc) { - System.err.println( + jalview.bin.Console.errPrintln( "Serious issue with viewport geometry imgWidth requested was " + imgWidth); return; @@ -1646,7 +1650,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, && (fadedImage == null || fadedImage.getWidth() != imgWidth || fadedImage.getHeight() != image.getHeight())) { - // System.err.println("redraw faded image ("+(fadedImage==null ? + // jalview.bin.Console.errPrintln("redraw faded image ("+(fadedImage==null ? // "null image" : "") + " lastGood="+lastImageGood+")"); fadedImage = new BufferedImage(imgWidth, image.getHeight(), BufferedImage.TYPE_INT_RGB); diff --git a/src/jalview/gui/AppJmol.java b/src/jalview/gui/AppJmol.java index 1758b5b..950f129 100644 --- a/src/jalview/gui/AppJmol.java +++ b/src/jalview/gui/AppJmol.java @@ -28,9 +28,16 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.io.File; +import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.FutureTask; import javax.swing.JPanel; import javax.swing.JSplitPane; @@ -364,9 +371,9 @@ public class AppJmol extends StructureViewerBase } if (waitTotal > waitMax) { - System.err.println("Timed out waiting for Jmol to load files after " + jalview.bin.Console.errPrintln("Timed out waiting for Jmol to load files after " + waitTotal + "ms"); - // System.err.println("finished: " + jmb.isFinishedInit() + // jalview.bin.Console.errPrintln("finished: " + jmb.isFinishedInit() // + "; loaded: " + Arrays.toString(jmb.getPdbFile()) // + "; files: " + files.toString()); jmb.getStructureFiles(); @@ -472,11 +479,48 @@ public class AppJmol extends StructureViewerBase }; String view = MessageManager.getString("action.view") .toLowerCase(Locale.ROOT); - ImageExporter exporter = new ImageExporter(writer, + final ImageExporter exporter = new ImageExporter(writer, getProgressIndicator(), type, getTitle()); - exporter.doExport(file, this, width, height, view, renderer, userBis); - + final Throwable[] exceptions = new Throwable[1]; + exceptions[0] = null; + final AppJmol us = this; + try + { + Thread runner = Executors.defaultThreadFactory().newThread(new Runnable() + { + @Override + public void run() + { + try + { + exporter.doExport(file, us, width, height, view, renderer, + userBis); + } catch (Throwable t) + { + exceptions[0] = t; + } + } + }); + runner.start(); + do { Thread.sleep(25); } while (runner.isAlive()); + } catch (Throwable e) + { + throw new ImageOutputException( + "Unexpected error when generating image", e); + } + if (exceptions[0] != null) + { + if (exceptions[0] instanceof ImageOutputException) + { + throw ((ImageOutputException) exceptions[0]); + } + else + { + throw new ImageOutputException( + "Unexpected error when generating image", exceptions[0]); + } + } } @Override @@ -488,7 +532,7 @@ public class AppJmol extends StructureViewerBase .openURL("http://wiki.jmol.org");// http://jmol.sourceforge.net/docs/JmolUserGuide/"); } catch (Exception ex) { - System.err.println("Show Jmol help failed with: " + ex.getMessage()); + jalview.bin.Console.errPrintln("Show Jmol help failed with: " + ex.getMessage()); } } diff --git a/src/jalview/gui/AppVarna.java b/src/jalview/gui/AppVarna.java index 6fac8fc..eb2368d 100644 --- a/src/jalview/gui/AppVarna.java +++ b/src/jalview/gui/AppVarna.java @@ -476,7 +476,7 @@ public class AppVarna extends JInternalFrame if (shift != null) { int i = shift.shift(newBase.getIndex()); - // System.err.println("shifted "+(arg1.getIndex())+" to "+i); + // jalview.bin.Console.errPrintln("shifted "+(arg1.getIndex())+" to "+i); ssm.mouseOverVamsasSequence(seq, i, this); } else diff --git a/src/jalview/gui/AppVarnaBinding.java b/src/jalview/gui/AppVarnaBinding.java index 5cfe72a..8951df0 100644 --- a/src/jalview/gui/AppVarnaBinding.java +++ b/src/jalview/gui/AppVarnaBinding.java @@ -574,7 +574,7 @@ public class AppVarnaBinding extends JalviewVarnaBinding } catch (ExceptionNAViewAlgorithm e) { // only throwable for draw mode = 3 NAView - System.err.println("Error drawing RNA: " + e.getMessage()); + jalview.bin.Console.errPrintln("Error drawing RNA: " + e.getMessage()); } } } diff --git a/src/jalview/gui/BlogReader.java b/src/jalview/gui/BlogReader.java index af59ca7..c120a1b 100644 --- a/src/jalview/gui/BlogReader.java +++ b/src/jalview/gui/BlogReader.java @@ -772,7 +772,7 @@ public class BlogReader extends JPanel String formattedDate = Cache.setDateProperty( "JALVIEW_NEWS_RSS_LASTMODIFIED", lastread.getTime()); BlogReader me = new BlogReader(); - System.out.println("Set last date to " + formattedDate); + jalview.bin.Console.outPrintln("Set last date to " + formattedDate); if (me.isNewsNew()) { Console.debug("There is news to read."); diff --git a/src/jalview/gui/ChimeraViewFrame.java b/src/jalview/gui/ChimeraViewFrame.java index cc6a785..f13e151 100644 --- a/src/jalview/gui/ChimeraViewFrame.java +++ b/src/jalview/gui/ChimeraViewFrame.java @@ -343,7 +343,7 @@ public class ChimeraViewFrame extends StructureViewerBase boolean opened = jmb.openSession(chimeraSessionFile); if (!opened) { - System.err.println("An error occurred opening Chimera session file " + jalview.bin.Console.errPrintln("An error occurred opening Chimera session file " + chimeraSessionFile); } } diff --git a/src/jalview/gui/ColourMenuHelper.java b/src/jalview/gui/ColourMenuHelper.java index c1c75f1..574ba28 100644 --- a/src/jalview/gui/ColourMenuHelper.java +++ b/src/jalview/gui/ColourMenuHelper.java @@ -304,7 +304,7 @@ public class ColourMenuHelper } } catch (Exception ex) { - System.out.println("Error loading User ColourFile\n" + ex); + jalview.bin.Console.outPrintln("Error loading User ColourFile\n" + ex); } } diff --git a/src/jalview/gui/Console.java b/src/jalview/gui/Console.java index 5a23048..6a6cb56 100644 --- a/src/jalview/gui/Console.java +++ b/src/jalview/gui/Console.java @@ -433,20 +433,20 @@ public class Console extends WindowAdapter // you may omit this part for your application // - System.out.println("Hello World 2"); - System.out.println("All fonts available to Graphic2D:\n"); + jalview.bin.Console.outPrintln("Hello World 2"); + jalview.bin.Console.outPrintln("All fonts available to Graphic2D:\n"); GraphicsEnvironment ge = GraphicsEnvironment .getLocalGraphicsEnvironment(); String[] fontNames = ge.getAvailableFontFamilyNames(); for (int n = 0; n < fontNames.length; n++) { - System.out.println(fontNames[n]); + jalview.bin.Console.outPrintln(fontNames[n]); } // Testing part: simple an error thrown anywhere in this JVM will be printed // on the Console // We do it with a seperate Thread becasue we don't wan't to break a Thread // used by the Console. - System.out.println("\nLets throw an error on this console"); + jalview.bin.Console.outPrintln("\nLets throw an error on this console"); errorThrower = new Thread(this); errorThrower.setDaemon(true); errorThrower.start(); diff --git a/src/jalview/gui/CrossRefAction.java b/src/jalview/gui/CrossRefAction.java index c15cf2d..6cb59c3 100644 --- a/src/jalview/gui/CrossRefAction.java +++ b/src/jalview/gui/CrossRefAction.java @@ -432,7 +432,7 @@ public class CrossRefAction implements Runnable MessageManager.getString("label.cant_map_cds"), MessageManager.getString("label.operation_failed"), JvOptionPane.OK_OPTION); - System.err.println("Failed to make CDS alignment"); + jalview.bin.Console.errPrintln("Failed to make CDS alignment"); return null; } @@ -466,7 +466,7 @@ public class CrossRefAction implements Runnable if (copyAlignment.getHeight() <= 0) { - System.err.println("No Sequences generated for xRef type " + source); + jalview.bin.Console.errPrintln("No Sequences generated for xRef type " + source); return null; } diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index b901ae4..efefa21 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -439,7 +439,7 @@ public class Desktop extends jalview.jbgui.GDesktop * Send this message to stderr as the warning that follows (due to * reflection) also goes to stderr. */ - System.err.println( + jalview.bin.Console.errPrintln( "Linux platform only! You may have the following warning next: \"WARNING: An illegal reflective access operation has occurred\"\nThis is expected and cannot be avoided, sorry about that."); } final String awtAppClassName = "awtAppClassName"; @@ -873,7 +873,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } catch (Exception ex) { - System.out.println( + jalview.bin.Console.outPrintln( "Unable to paste alignment from system clipboard:\n" + ex); } } @@ -1078,7 +1078,36 @@ public class Desktop extends jalview.jbgui.GDesktop setKeyBindings(frame); - desktop.add(frame); + // Since the latest FlatLaf patch, we occasionally have problems showing structureViewer frames... + int tries=3; + boolean shown=false; + Exception last=null; + do + { + try + { + desktop.add(frame); + shown=true; + } catch (IllegalArgumentException iaex) + { + last=iaex; + tries--; + jalview.bin.Console.info( + "Squashed IllegalArgument Exception (" + tries + " left) for "+frame.getTitle(), + iaex); + try + { + Thread.sleep(5); + } catch (InterruptedException iex) + { + } + ; + } + } while (!shown && tries > 0); + if (!shown) + { + jalview.bin.Console.error("Serious Problem whilst showing window "+frame.getTitle(),last); + } windowMenu.add(menuItem); @@ -1601,7 +1630,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } catch (Exception ex) { - System.err.println("Error opening help: " + ex.getMessage()); + jalview.bin.Console.errPrintln("Error opening help: " + ex.getMessage()); } } @@ -1832,7 +1861,7 @@ public class Desktop extends jalview.jbgui.GDesktop boolean autoSave = projectFile != null && !saveAs && BackupFiles.getEnabled(); - // System.out.println("autoSave="+autoSave+", projectFile='"+projectFile+"', + // jalview.bin.Console.outPrintln("autoSave="+autoSave+", projectFile='"+projectFile+"', // saveAs="+saveAs+", Backups // "+(BackupFiles.getEnabled()?"enabled":"disabled")); @@ -3381,7 +3410,7 @@ public class Desktop extends jalview.jbgui.GDesktop { if (Platform.isAMacAndNotJS()) { - System.err.println( + jalview.bin.Console.errPrintln( "Please ignore plist error - occurs due to problem with java 8 on OSX"); } } @@ -3623,8 +3652,22 @@ public class Desktop extends jalview.jbgui.GDesktop { Desktop.instance.closeAll_actionPerformed(null); Desktop.instance.setVisible(false); - Desktop.instance.dispose(); + Desktop us = Desktop.instance; Desktop.instance = null; + // call dispose in a separate thread - try to avoid indirect deadlocks + new Thread(new Runnable() { + @Override + public void run() + { + ExecutorService dex = us.dialogExecutor; + if (dex!=null) { + dex.shutdownNow(); + us.dialogExecutor=null; + us.block.drainPermits(); + } + us.dispose(); + } + }).start(); } } diff --git a/src/jalview/gui/FeatureSettings.java b/src/jalview/gui/FeatureSettings.java index 2e9731d..184fdc5 100644 --- a/src/jalview/gui/FeatureSettings.java +++ b/src/jalview/gui/FeatureSettings.java @@ -1019,7 +1019,7 @@ public class FeatureSettings extends JPanel } } catch (Exception ex) { - System.out.println("Error loading User Colour File\n" + ex); + jalview.bin.Console.outPrintln("Error loading User Colour File\n" + ex); } } @@ -1608,7 +1608,7 @@ public class FeatureSettings extends JPanel { Color newColor = gcol.getMaxColour(); comp.setBackground(newColor); - // System.err.println("Width is " + w / 2); + // jalview.bin.Console.errPrintln("Width is " + w / 2); Icon ficon = new FeatureIcon(gcol, comp.getBackground(), w, h, thr); comp.setIcon(ficon); // tt+="RGB value: Max (" + newColor.getRed() + ", " diff --git a/src/jalview/gui/FeatureTypeSettings.java b/src/jalview/gui/FeatureTypeSettings.java index 09bb2a3..327f6ca 100644 --- a/src/jalview/gui/FeatureTypeSettings.java +++ b/src/jalview/gui/FeatureTypeSettings.java @@ -1096,7 +1096,7 @@ public class FeatureTypeSettings extends JalviewDialog { if (featureSettings != null) { - System.err.println( + jalview.bin.Console.errPrintln( "IMPLEMENTATION ISSUE: overwriting action listener for FeatureColourChooser"); } featureSettings = listener; diff --git a/src/jalview/gui/Help.java b/src/jalview/gui/Help.java index 658b34f..8829be9 100644 --- a/src/jalview/gui/Help.java +++ b/src/jalview/gui/Help.java @@ -133,7 +133,7 @@ public class Help hb.setCurrentID(id.getId()); } catch (BadIDException bad) { - System.out.println("Bad help link: " + id.getId() + jalview.bin.Console.outPrintln("Bad help link: " + id.getId() + ": must match a target in help.jhm"); throw bad; } diff --git a/src/jalview/gui/IdCanvas.java b/src/jalview/gui/IdCanvas.java index c94dee0..eb0715a 100755 --- a/src/jalview/gui/IdCanvas.java +++ b/src/jalview/gui/IdCanvas.java @@ -22,6 +22,7 @@ package jalview.gui; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; @@ -382,6 +383,12 @@ public class IdCanvas extends JPanel implements ViewportListenerI void drawIdsWrapped(Graphics2D g, AlignViewport alignViewport, int startSeq, int pageHeight) { + drawIdsWrapped(g, alignViewport, startSeq, pageHeight, -1); + } + + void drawIdsWrapped(Graphics2D g, AlignViewport alignViewport, + int startSeq, int pageHeight, int idWidth) + { int alignmentWidth = alignViewport.getAlignment().getWidth(); final int alheight = alignViewport.getAlignment().getHeight(); @@ -428,8 +435,23 @@ public class IdCanvas extends JPanel implements ViewportListenerI if (labels != null && alignViewport.isShowAnnotation()) { + int getWidth = getWidth(); + int thisIdWidth = getWidth; g.translate(0, ypos + (alheight * charHeight)); - labels.drawComponent(g, getWidth()); + if (!manuallyAdjusted()) + { + int getAnnotationsIdWidth = labels.drawLabels(g, false, -1, false, + null); + thisIdWidth = idWidth < 0 ? getAnnotationsIdWidth : idWidth; + if (thisIdWidth > getWidth) + { + this.setPreferredSize( + new Dimension(thisIdWidth, this.getHeight())); + this.repaint(); + alignViewport.setIdWidth(thisIdWidth); + } + } + labels.drawComponent(g, false, thisIdWidth); g.translate(0, -ypos - (alheight * charHeight)); } @@ -585,4 +607,16 @@ public class IdCanvas extends JPanel implements ViewportListenerI repaint(); } } + + private boolean manuallyAdjusted = false; + + public boolean manuallyAdjusted() + { + return manuallyAdjusted; + } + + public void setManuallyAdjusted(boolean b) + { + manuallyAdjusted = b; + } } diff --git a/src/jalview/gui/IdwidthAdjuster.java b/src/jalview/gui/IdwidthAdjuster.java index 4ba0699..4596e1f 100755 --- a/src/jalview/gui/IdwidthAdjuster.java +++ b/src/jalview/gui/IdwidthAdjuster.java @@ -20,8 +20,6 @@ */ package jalview.gui; -import jalview.api.AlignViewportI; - import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; @@ -31,6 +29,9 @@ import java.awt.event.MouseMotionListener; import javax.swing.JPanel; +import jalview.api.AlignViewportI; +import jalview.bin.Cache; + /** * DOCUMENT ME! * @@ -136,6 +137,18 @@ public class IdwidthAdjuster extends JPanel return; } + /* + * don't allow residue width to be < 1 in wrapped format + */ + if (viewport.getWrapAlignment()) + { + SeqCanvas sc = ap.getSeqPanel().seqCanvas; + if (sc != null && sc.getWrappedCanvasWidth(sc.getWidth() - dif) < 1) + { + return; + } + } + oldX = evt.getX(); /* @@ -146,9 +159,29 @@ public class IdwidthAdjuster extends JPanel return; } viewport.setIdWidth(newWidth); + ap.validateAnnotationDimensions(false); + ap.paintAlignment(true, false); + + ap.getIdPanel().getIdCanvas().setManuallyAdjusted(true); + } + + public void setWidth(int newWidth) + { + if (newWidth < MIN_ID_WIDTH + || ap.getIdPanel().getIdCanvas().manuallyAdjusted()) + { + return; + } + final AlignViewportI viewport = ap.getAlignViewport(); + viewport.setIdWidth(newWidth); ap.paintAlignment(true, false); } + public boolean manuallyAdjusted() + { + return ap.getIdPanel().getIdCanvas().manuallyAdjusted(); + } + @Override public void mouseMoved(MouseEvent evt) { @@ -167,8 +200,21 @@ public class IdwidthAdjuster extends JPanel @Override public void paintComponent(Graphics g) { + int width = getWidth(); + int height = getHeight(); g.setColor(Color.white); - g.fillRect(0, 0, getWidth(), getHeight()); + g.fillRect(0, 0, width, height); + + if (!Cache.getDefault(AnnotationLabels.RESIZE_MARGINS_MARK_PREF, false)) + // && !ap.getAlignViewport().getWrapAlignment()) // now allowing adjustment + // in wrap mode + { + int spacer = Math.max(2, AnnotationLabels.HEIGHT_ADJUSTER_HEIGHT / 4); + g.setColor(Color.LIGHT_GRAY); + g.drawLine(width - 3 * spacer, 0, width - 3 * spacer, height / 2); + g.drawLine(width - spacer, 0, width - spacer, height / 2); + } + setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); } } diff --git a/src/jalview/gui/ImageExporter.java b/src/jalview/gui/ImageExporter.java index f337b39..4ea30d9 100644 --- a/src/jalview/gui/ImageExporter.java +++ b/src/jalview/gui/ImageExporter.java @@ -124,6 +124,11 @@ public class ImageExporter */ if (file == null && !Jalview.isHeadlessMode()) { + if (Desktop.instance.isInBatchMode()) + { + // defensive error report - we could wait for user input.. I guess ? + throw(new ImageOutputException("Need an output file to render to when exporting images in batch mode!")); + } JalviewFileChooser chooser = imageType.getFileChooser(); chooser.setFileView(new JalviewFileView()); MessageManager.formatMessage("label.create_image_of", diff --git a/src/jalview/gui/JDatabaseTree.java b/src/jalview/gui/JDatabaseTree.java index 327eade..9ae764e 100644 --- a/src/jalview/gui/JDatabaseTree.java +++ b/src/jalview/gui/JDatabaseTree.java @@ -122,7 +122,7 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener } else { - System.err.println("dupe ig for : " + dbs[i] + " \t" + jalview.bin.Console.errPrintln("dupe ig for : " + dbs[i] + " \t" + dbp.getDbName() + " (" + dbp.getDbSource() + ")"); source.remove(tn); } @@ -552,7 +552,7 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener @Override public void setVisible(boolean arg0) { - System.out.println("setVisible: " + arg0); + jalview.bin.Console.outPrintln("setVisible: " + arg0); super.setVisible(arg0); } } diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index 5da37fe..eaaa2a1 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -718,7 +718,7 @@ public class JvOptionPane extends JOptionPane private static void outputMessage(Object message) { - System.out.println(">>> JOption Message : " + message.toString()); + jalview.bin.Console.outPrintln(">>> JOption Message : " + message.toString()); } public static Object getMockResponse() @@ -1137,7 +1137,13 @@ public class JvOptionPane extends JOptionPane private void internalDialogHandleResponse() { - String responseString = (String) this.getValue(); + Object value = this.getValue(); + if (value == null + || (value instanceof Integer && (Integer) value == -1)) + { + return; + } + String responseString = value.toString(); int response = ourOptions.indexOf(responseString); if (!Platform.isJS()) diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java index e0427cc..f05110f 100644 --- a/src/jalview/gui/OptsAndParamsPage.java +++ b/src/jalview/gui/OptsAndParamsPage.java @@ -713,7 +713,7 @@ public class OptsAndParamsPage } } catch (NumberFormatException e) { - System.err.println(e.toString()); + jalview.bin.Console.errPrintln(e.toString()); } if (minValue != null || maxValue != null) { @@ -750,7 +750,7 @@ public class OptsAndParamsPage } } catch (NumberFormatException e) { - System.err.println(e.toString()); + jalview.bin.Console.errPrintln(e.toString()); } if (minValue != null && maxValue != null) { diff --git a/src/jalview/gui/PaintRefresher.java b/src/jalview/gui/PaintRefresher.java index 953fdc5..36849b0 100755 --- a/src/jalview/gui/PaintRefresher.java +++ b/src/jalview/gui/PaintRefresher.java @@ -194,7 +194,7 @@ public class PaintRefresher { // raise an implementation warning here - not sure if this situation // will ever occur - System.err.println( + jalview.bin.Console.errPrintln( "IMPLEMENTATION PROBLEM: DATASET out of sync due to an insert whilst calling PaintRefresher.validateSequences(AlignmentI, ALignmentI)"); } List alsq = comp.getSequences(); diff --git a/src/jalview/gui/PairwiseAlignPanel.java b/src/jalview/gui/PairwiseAlignPanel.java index c4b5367..b5b6ffc 100755 --- a/src/jalview/gui/PairwiseAlignPanel.java +++ b/src/jalview/gui/PairwiseAlignPanel.java @@ -104,7 +104,7 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel if (!first) { - System.out.println(DASHES); + jalview.bin.Console.outPrintln(DASHES); textarea.append(DASHES); } first = false; @@ -139,7 +139,7 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel for (int i = 0; i < seqs.length; i++) { - System.out.println( + jalview.bin.Console.outPrintln( String.format("%3d %s", i + 1, seqs[i].getDisplayId(true))); } @@ -151,7 +151,7 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel { System.out.print(String.format("%7d", i + 1)); } - System.out.println(); + jalview.bin.Console.outPrintln(); for (int i = 0; i < seqs.length; i++) { @@ -163,10 +163,10 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel */ System.out.print(String.format("%7.3f", scores[i][j] / totscore)); } - System.out.println(); + jalview.bin.Console.outPrintln(); } - System.out.println("\n"); + jalview.bin.Console.outPrintln("\n"); } /** diff --git a/src/jalview/gui/PopupMenu.java b/src/jalview/gui/PopupMenu.java index be9293f..7e86704 100644 --- a/src/jalview/gui/PopupMenu.java +++ b/src/jalview/gui/PopupMenu.java @@ -1734,10 +1734,9 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener protected void addReferenceAnnotations_actionPerformed( Map> candidates) { - final SequenceGroup selectionGroup = this.ap.av.getSelectionGroup(); final AlignmentI alignment = this.ap.getAlignment(); AlignmentUtils.addReferenceAnnotations(candidates, alignment, - selectionGroup); + null); refresh(); } @@ -2190,7 +2189,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener String[] omitHidden = null; - System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens + jalview.bin.Console.outPrintln("PROMPT USER HERE"); // TODO: decide if a prompt happens // or we simply trust the user wants // wysiwig behaviour diff --git a/src/jalview/gui/ProgressBar.java b/src/jalview/gui/ProgressBar.java index 011d810..d68d95f 100644 --- a/src/jalview/gui/ProgressBar.java +++ b/src/jalview/gui/ProgressBar.java @@ -231,7 +231,7 @@ public class ProgressBar implements IProgressIndicator final JPanel progressPanel = progressBars.get(id); if (progressPanel == null) { - System.err.println( + jalview.bin.Console.errPrintln( "call setProgressBar before registering the progress bar's handler."); return; } diff --git a/src/jalview/gui/PymolBindingModel.java b/src/jalview/gui/PymolBindingModel.java index 705102a..62dce24 100644 --- a/src/jalview/gui/PymolBindingModel.java +++ b/src/jalview/gui/PymolBindingModel.java @@ -121,7 +121,7 @@ public class PymolBindingModel extends AAStructureBindingModel protected List executeCommand(StructureCommandI command, boolean getReply) { - // System.out.println(command.toString()); // debug + // jalview.bin.Console.outPrintln(command.toString()); // debug return pymolManager.sendCommand(command, getReply); } diff --git a/src/jalview/gui/RedundancyPanel.java b/src/jalview/gui/RedundancyPanel.java index 8d66a44..f487011 100755 --- a/src/jalview/gui/RedundancyPanel.java +++ b/src/jalview/gui/RedundancyPanel.java @@ -184,7 +184,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable validate(); sliderValueChanged(); - // System.out.println((System.currentTimeMillis()-start)); + // jalview.bin.Console.outPrintln((System.currentTimeMillis()-start)); } void sliderValueChanged() diff --git a/src/jalview/gui/RestInputParamEditDialog.java b/src/jalview/gui/RestInputParamEditDialog.java index 8ae5408..9b199fd 100644 --- a/src/jalview/gui/RestInputParamEditDialog.java +++ b/src/jalview/gui/RestInputParamEditDialog.java @@ -53,7 +53,7 @@ public class RestInputParamEditDialog extends GRestInputParamEditDialog .newInstance()); } catch (Throwable x) { - System.err.println( + jalview.bin.Console.errPrintln( "Unexpected exception when instantiating rest input type."); x.printStackTrace(); } @@ -166,7 +166,7 @@ public class RestInputParamEditDialog extends GRestInputParamEditDialog updated = true; } catch (InvalidArgumentException ex) { - System.err.println( + jalview.bin.Console.errPrintln( "IMPLEMENTATION ERROR: Invalid argument for type : " + typeList.getSelectedValue() + "\n"); ex.printStackTrace(); @@ -215,7 +215,7 @@ public class RestInputParamEditDialog extends GRestInputParamEditDialog types.add(jtype.getURLtokenPrefix()); } catch (Throwable x) { - System.err.println( + jalview.bin.Console.errPrintln( "Unexpected exception when instantiating rest input type."); x.printStackTrace(); } diff --git a/src/jalview/gui/RestServiceEditorPane.java b/src/jalview/gui/RestServiceEditorPane.java index cda76d9..8953626 100644 --- a/src/jalview/gui/RestServiceEditorPane.java +++ b/src/jalview/gui/RestServiceEditorPane.java @@ -363,7 +363,7 @@ public class RestServiceEditorPane extends GRestServiceEditorPane mtch.group(2) + ":" + mtch.group(3), mtch.group(1), mtch.group(2), mtch.group(3), inputTypes, warnings)) { - System.err.println( + jalview.bin.Console.errPrintln( "IMPLEMENTATION PROBLEM: Cannot parse RestService input parameter string '" + its + "'" + "\n" + warnings); } @@ -389,7 +389,7 @@ public class RestServiceEditorPane extends GRestServiceEditorPane } catch (Throwable x) { - System.err.println( + jalview.bin.Console.errPrintln( "IMPLEMENTATION PROBLEM: Cannot parse RestService output parameter string '" + its + "'" + "\n" + warnings); } @@ -399,7 +399,7 @@ public class RestServiceEditorPane extends GRestServiceEditorPane } else { - System.err.println( + jalview.bin.Console.errPrintln( "IMPLEMENTATION PROBLEM: Restservice generated from GUI is invalid\n" + warnings); diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index d15cdcf..0faedb0 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -343,7 +343,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI } } - // System.err.println(">>> FastPaint to " + transX + " " + transY + " " + // jalview.bin.Console.errPrintln(">>> FastPaint to " + transX + " " + transY + " " // + horizontal + " " + vertical + " " + startRes + " " + endRes // + " " + startSeq + " " + endSeq); @@ -362,7 +362,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI // Call repaint on alignment panel so that repaints from other alignment // panel components can be aggregated. Otherwise performance of the // overview window and others may be adversely affected. - // System.out.println("SeqCanvas fastPaint() repaint() request..."); + // jalview.bin.Console.outPrintln("SeqCanvas fastPaint() repaint() request..."); av.getAlignPanel().repaint(); } finally { @@ -550,6 +550,20 @@ public class SeqCanvas extends JPanel implements ViewportListenerI return (canvasWidth - labelWidthEast - labelWidthWest) / charWidth; } + public int getMinimumWrappedCanvasWidth() + { + int charWidth = av.getCharWidth(); + FontMetrics fm = getFontMetrics(av.getFont()); + int labelWidth = 0; + if (av.getScaleRightWrapped() || av.getScaleLeftWrapped()) + { + labelWidth = getLabelWidth(fm); + } + labelWidthEast = av.getScaleRightWrapped() ? labelWidth : 0; + labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0; + return labelWidthEast + labelWidthWest + charWidth; + } + /** * Returns a pixel width sufficient to show the largest sequence coordinate * (end position) in the alignment, calculated as the FontMetrics width of @@ -1665,7 +1679,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void propertyChange(PropertyChangeEvent evt) { String eventName = evt.getPropertyName(); - // System.err.println(">>SeqCanvas propertyChange " + eventName); + // jalview.bin.Console.errPrintln(">>SeqCanvas propertyChange " + eventName); if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED)) { fastPaint = true; @@ -1675,7 +1689,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT)) { fastPaint = false; - // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT"); + // jalview.bin.Console.errPrintln("!!!! fastPaint false from MOVE_VIEWPORT"); repaint(); return; } diff --git a/src/jalview/gui/SeqCanvas.java.broken b/src/jalview/gui/SeqCanvas.java.broken index c0a86df..3560efd 100755 --- a/src/jalview/gui/SeqCanvas.java.broken +++ b/src/jalview/gui/SeqCanvas.java.broken @@ -377,7 +377,7 @@ public class SeqCanvas extends JComponent } catch (OutOfMemoryError er) { System.gc(); - System.err.println("SeqCanvas OutOfMemory Redraw Error.\n" + er); + jalview.bin.Console.errPrintln("SeqCanvas OutOfMemory Redraw Error.\n" + er); new OOMWarning("Creating alignment image for display", er); return; diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 55f06fc..ce60be6 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -137,7 +137,7 @@ public class SeqPanel extends JPanel MousePos o = (MousePos) obj; boolean b = (column == o.column && seqIndex == o.seqIndex && annotationIndex == o.annotationIndex); - // System.out.println(obj + (b ? "= " : "!= ") + this); + // jalview.bin.Console.outPrintln(obj + (b ? "= " : "!= ") + this); return b; } @@ -881,7 +881,7 @@ public class SeqPanel extends JPanel if (lastMessage == null || !lastMessage.equals(tmp)) { - // System.err.println("mouseOver Sequence: "+tmp); + // jalview.bin.Console.errPrintln("mouseOver Sequence: "+tmp); ssm.mouseOverSequence(sequence, index, pos, av); } lastMessage = tmp; @@ -1006,7 +1006,7 @@ public class SeqPanel extends JPanel @Override public void updateColours(SequenceI seq, int index) { - System.out.println("update the seqPanel colours"); + jalview.bin.Console.outPrintln("update the seqPanel colours"); // repaint(); } @@ -2861,7 +2861,7 @@ public class SeqPanel extends JPanel if (copycolsel && av.hasHiddenColumns() && (av.getAlignment().getHiddenColumns() == null)) { - System.err.println("Bad things"); + jalview.bin.Console.errPrintln("Bad things"); } if (repaint) // always true! { diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index 6b4c74a..137655f 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -599,7 +599,7 @@ public class SequenceFetcher extends JPanel implements Runnable + ((StringPair) database.getSelectedItem()).getDisplay()); // error // +="Couldn't retrieve sequences from "+database.getSelectedItem(); - System.err.println("Retrieval failed for source ='" + jalview.bin.Console.errPrintln("Retrieval failed for source ='" + ((StringPair) database.getSelectedItem()).getDisplay() + "' and query\n'" + textArea.getText() + "'\n"); e.printStackTrace(); diff --git a/src/jalview/gui/SplashScreen.java b/src/jalview/gui/SplashScreen.java index 0b7af0d..ff409e0 100755 --- a/src/jalview/gui/SplashScreen.java +++ b/src/jalview/gui/SplashScreen.java @@ -172,7 +172,7 @@ public class SplashScreen extends JPanel } if (mt.isErrorAny()) { - System.err.println("Error when loading images!"); + jalview.bin.Console.errPrintln("Error when loading images!"); } } while (!mt.checkAll()); Desktop.instance.setIconImages(ChannelProperties.getIconList()); @@ -228,7 +228,7 @@ public class SplashScreen extends JPanel protected boolean refreshText() { String newtext = Desktop.instance.getAboutMessage(); - // System.err.println("Text found: \n"+newtext+"\nEnd of newtext."); + // jalview.bin.Console.errPrintln("Text found: \n"+newtext+"\nEnd of newtext."); if (oldTextLength != newtext.length()) { iframe.setVisible(false); diff --git a/src/jalview/gui/StructureChooser.java b/src/jalview/gui/StructureChooser.java index 6fce984..d00b1c2 100644 --- a/src/jalview/gui/StructureChooser.java +++ b/src/jalview/gui/StructureChooser.java @@ -71,7 +71,6 @@ import jalview.gui.structurechooser.PDBStructureChooserQuerySource; import jalview.gui.structurechooser.StructureChooserQuerySource; import jalview.gui.structurechooser.ThreeDBStructureChooserQuerySource; import jalview.io.DataSourceType; -import jalview.io.FileFormatException; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; import jalview.jbgui.FilterOption; @@ -85,7 +84,6 @@ import jalview.util.StringUtils; import jalview.ws.DBRefFetcher; import jalview.ws.DBRefFetcher.FetchFinishedListenerI; import jalview.ws.datamodel.alphafold.PAEContactMatrix; -import jalview.ws.dbsources.EBIAlfaFold; import jalview.ws.seqfetcher.DbSourceProxy; import jalview.ws.sifts.SiftsSettings; @@ -1525,7 +1523,7 @@ public class StructureChooser extends GStructureChooser // for moment, it will work fine as is because it is self-contained String searchTerm = text.toLowerCase(Locale.ROOT); searchTerm = searchTerm.split(":")[0]; - // System.out.println(">>>>> search term : " + searchTerm); + // jalview.bin.Console.outPrintln(">>>>> search term : " + searchTerm); List wantedFields = new ArrayList<>(); FTSRestRequest pdbRequest = new FTSRestRequest(); pdbRequest.setAllowEmptySeq(false); @@ -1801,7 +1799,9 @@ public class StructureChooser extends GStructureChooser sc.mainFrame.dispose(); if (showRefAnnotations) + { showReferenceAnnotationsForSequence(ap.alignFrame, seq); + } return sv; } diff --git a/src/jalview/gui/StructureViewer.java b/src/jalview/gui/StructureViewer.java index 6cef665..ad3fc6a 100644 --- a/src/jalview/gui/StructureViewer.java +++ b/src/jalview/gui/StructureViewer.java @@ -21,9 +21,11 @@ package jalview.gui; import java.util.ArrayList; +import java.util.EnumSet; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; @@ -66,7 +68,27 @@ public class StructureViewer public enum ViewerType { - JMOL, CHIMERA, CHIMERAX, PYMOL + JMOL, CHIMERA, CHIMERAX, PYMOL; + + public static ViewerType getFromString(String viewerString) + { + ViewerType viewerType = null; + if (!"none".equals(viewerString)) + { + for (ViewerType v : EnumSet.allOf(ViewerType.class)) + { + String name = v.name().toLowerCase(Locale.ROOT).replaceAll(" ", + ""); + if (viewerString.equals(name)) + { + viewerType = v; + break; + } + } + } + return viewerType; + } + }; /** diff --git a/src/jalview/gui/StructureViewerBase.java b/src/jalview/gui/StructureViewerBase.java index 01a3c2d..b8d2cce 100644 --- a/src/jalview/gui/StructureViewerBase.java +++ b/src/jalview/gui/StructureViewerBase.java @@ -1197,7 +1197,7 @@ public abstract class StructureViewerBase extends GStructureViewer } } catch (Exception e) { - System.err.println( + jalview.bin.Console.errPrintln( "Error retrieving PDB id " + pdbid + ": " + e.getMessage()); } finally { diff --git a/src/jalview/gui/TreeCanvas.java b/src/jalview/gui/TreeCanvas.java index 55ce44a..6fbd422 100755 --- a/src/jalview/gui/TreeCanvas.java +++ b/src/jalview/gui/TreeCanvas.java @@ -53,6 +53,7 @@ import javax.swing.ToolTipManager; import jalview.analysis.Conservation; import jalview.analysis.TreeModel; import jalview.api.AlignViewportI; +import jalview.bin.Console; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.BinaryNode; @@ -66,6 +67,7 @@ import jalview.datamodel.SequenceNode; import jalview.gui.JalviewColourChooser.ColourChooserListener; import jalview.schemes.ColourSchemeI; import jalview.structure.SelectionSource; +import jalview.util.ColorUtils; import jalview.util.Format; import jalview.util.MessageManager; import jalview.ws.datamodel.MappableContactMatrixI; @@ -221,6 +223,13 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, boolean has_placeholders = false; longestName = ""; + AlignmentAnnotation aa = tp.getAssocAnnotation(); + ContactMatrixI cm = (aa!=null) ? av.getContactMatrix(aa) : null; + if (cm!=null && cm.hasCutHeight()) + { + threshold=(float) cm.getCutHeight(); + } + for (int i = 0; i < leaves.size(); i++) { BinaryNode lf = leaves.elementAt(i); @@ -236,6 +245,14 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, longestName = TreeCanvas.PLACEHOLDER + ((Sequence) lf.element()).getName(); } + if (tp.isColumnWise() && cm!=null) + { + // get color from group colours, if they are set for the matrix + try { + Color col = cm.getGroupColorForPosition(parseColumnNode(lf)); + setColor(lf,col.brighter()); + } catch (NumberFormatException ex) {}; + } } setMarkPlaceholders(has_placeholders); @@ -259,7 +276,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, * @param offy * DOCUMENT ME! */ - public void drawNode(Graphics g, BinaryNode node, float chunk, + public void drawNode(Graphics g, BinaryNode node, double chunk, double wscale, int width, int offx, int offy) { if (node == null) @@ -778,7 +795,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, + ((BinaryNode) top.right()).count; } - float chunk = (float) (height - (offy)) / top.count; + double chunk = (double) (height - (offy)) / (double)top.count; drawNode(g2, tree.getTopNode(), chunk, wscale, width, offx, offy); @@ -1025,7 +1042,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, threshold = 0f; } } - + Console.log.debug("Tree cut threshold set at:" + threshold); PaintRefresher.Refresh(tp, getAssociatedPanel().av.getSequenceSetId()); repaint(); @@ -1040,8 +1057,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, Map colors = new HashMap(); for (int i = 0; i < groups.size(); i++) { - Color col = new Color((int) (Math.random() * 255), - (int) (Math.random() * 255), (int) (Math.random() * 255)); + Color col = ColorUtils.getARandomColor(); + setColor(groups.get(i), col.brighter()); Vector l = tree.findLeaves(groups.get(i)); @@ -1071,41 +1088,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, cm.setColorForGroup(gp, colors.get(gp)); } } - // stash colors in linked annotation row. - // doesn't work yet. TESTS! - int sstart = aa.sequenceRef != null ? aa.sequenceRef.getStart() - 1 - : 0; - Annotation ae; - Color gpcol = null; - int[] seqpos = null; - for (BitSet gp : colors.keySet()) - { - gpcol = colors.get(gp); - for (int p = gp.nextSetBit(0); p >= 0 - && p < Integer.MAX_VALUE; p = gp.nextSetBit(p + 1)) - { - if (cm instanceof MappableContactMatrixI) - { - MappableContactMatrixI mcm = (MappableContactMatrixI) cm; - seqpos = mcm.getMappedPositionsFor(aa.sequenceRef, p); - if (seqpos == null) - { - // no mapping for this column. - continue; - } - // TODO: handle ranges... - ae = aa.getAnnotationForPosition(seqpos[0]); - } - else - { - ae = aa.getAnnotationForPosition(p + sstart); - } - if (ae != null) - { - ae.colour = gpcol.brighter().darker(); - } - } - } + cm.transferGroupColorsTo(aa); } } @@ -1123,15 +1106,18 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, } } } - + private int parseColumnNode(BinaryNode bn) throws NumberFormatException + { + return Integer.parseInt( + bn.getName().substring(bn.getName().indexOf("c") + 1)); + } private boolean isColumnForNodeSelected(BinaryNode bn) { SequenceI rseq = tp.assocAnnotation.sequenceRef; int colm = -1; try { - colm = Integer.parseInt( - bn.getName().substring(bn.getName().indexOf("c") + 1)); + colm = parseColumnNode(bn); } catch (Exception e) { return false; @@ -1198,8 +1184,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, // parse out from nodename try { - colm = Integer.parseInt( - bn.getName().substring(bn.getName().indexOf("c") + 1)); + colm = parseColumnNode(bn); } catch (Exception e) { continue; @@ -1244,14 +1229,14 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable, if (mcm!=null) { int[] seqpos = mcm.getMappedPositionsFor( - tp.assocAnnotation.sequenceRef, colm); + rseq, colm); if (seqpos == null) { // no mapping for this column. continue; } // TODO: handle ranges... - offp = seqpos[0]-1; + offp = rseq.findIndex(seqpos[0])-1; } else { diff --git a/src/jalview/gui/TreePanel.java b/src/jalview/gui/TreePanel.java index 5ccd68d..0a0c1b8 100755 --- a/src/jalview/gui/TreePanel.java +++ b/src/jalview/gui/TreePanel.java @@ -179,17 +179,18 @@ public class TreePanel extends GTreePanel this.treeType = type; this.scoreModelName = modelName; + treeCanvas = new TreeCanvas(this, ap, scrollPane); + scrollPane.setViewportView(treeCanvas); + if (columnWise) { bootstrapMenu.setVisible(false); - placeholdersMenu.setSelected(false); + placeholdersMenu.setState(false); placeholdersMenu.setVisible(false); - fitToWindow.setSelected(false); + fitToWindow.setState(false); sortAssocViews.setVisible(false); } - treeCanvas = new TreeCanvas(this, ap, scrollPane); - scrollPane.setViewportView(treeCanvas); addKeyListener(new KeyAdapter() { @@ -260,7 +261,7 @@ public class TreePanel extends GTreePanel { if (tree == null) { - System.out.println("tree is null"); + jalview.bin.Console.outPrintln("tree is null"); // TODO: deal with case when a change event is received whilst a // tree is still being calculated - should save reference for // processing message later. @@ -268,7 +269,7 @@ public class TreePanel extends GTreePanel } if (evt.getNewValue() == null) { - System.out.println( + jalview.bin.Console.outPrintln( "new alignment sequences vector value is null"); } @@ -391,9 +392,9 @@ public class TreePanel extends GTreePanel ? new NJTree(av, sm, similarityParams) : new AverageDistanceTree(av, sm, similarityParams); tree = new TreeModel(njtree); - showDistances(true); + // don't display distances for columnwise trees } - + showDistances(!columnWise); tree.reCount(tree.getTopNode()); tree.findHeight(tree.getTopNode()); treeCanvas.setTree(tree); @@ -895,7 +896,7 @@ public class TreePanel extends GTreePanel pg.close(); } catch (Exception ex) { - System.err.println("Error writing tree as EPS"); + jalview.bin.Console.errPrintln("Error writing tree as EPS"); ex.printStackTrace(); } } diff --git a/src/jalview/gui/VamsasApplication.java b/src/jalview/gui/VamsasApplication.java index 8a8ba8d..28f6c59 100644 --- a/src/jalview/gui/VamsasApplication.java +++ b/src/jalview/gui/VamsasApplication.java @@ -614,7 +614,7 @@ public class VamsasApplication implements SelectionSource, VamsasSource cdoc = null; } catch (Exception ee) { - System.err.println("Exception whilst updating :"); + jalview.bin.Console.errPrintln("Exception whilst updating :"); ee.printStackTrace(System.err); // recover object map backup, since its probably corrupted with references // to Vobjects that don't exist anymore. @@ -803,7 +803,7 @@ public class VamsasApplication implements SelectionSource, VamsasSource // we only care about AlignmentSequence selections SelectionMessage sm = (SelectionMessage) message; sm.validate(); - System.err.println("Received\n" + sm.getRawMessage()); + jalview.bin.Console.errPrintln("Received\n" + sm.getRawMessage()); Object[] jvobjs = sm.getVorbaIDs() == null ? null : new Object[sm.getVorbaIDs().length]; if (jvobjs == null) diff --git a/src/jalview/gui/WebserviceInfo.java b/src/jalview/gui/WebserviceInfo.java index 7eeee9a..961caa7 100644 --- a/src/jalview/gui/WebserviceInfo.java +++ b/src/jalview/gui/WebserviceInfo.java @@ -359,7 +359,7 @@ public class WebserviceInfo extends GWebserviceInfo @Override public void internalFrameClosed(InternalFrameEvent evt) { - // System.out.println("Shutting down webservice client"); + // jalview.bin.Console.outPrintln("Shutting down webservice client"); WSClientI service = thisinfo.getthisService(); if (service != null && service.isCancellable()) { diff --git a/src/jalview/gui/WsJobParameters.java b/src/jalview/gui/WsJobParameters.java index e1613da..196eb32 100644 --- a/src/jalview/gui/WsJobParameters.java +++ b/src/jalview/gui/WsJobParameters.java @@ -493,7 +493,7 @@ public class WsJobParameters extends JPanel implements ItemListener, else { // TODO: show warning - System.err.println("Invalid name. Not saved."); + jalview.bin.Console.errPrintln("Invalid name. Not saved."); } } @@ -642,7 +642,7 @@ public class WsJobParameters extends JPanel implements ItemListener, } else { - System.err.println("Ignoring unknown service argument type " + jalview.bin.Console.errPrintln("Ignoring unknown service argument type " + myarg.getClass().getName()); } } @@ -685,7 +685,7 @@ public class WsJobParameters extends JPanel implements ItemListener, { if (arg instanceof OptionI) { - // System.out.println("Setting option " + // jalview.bin.Console.outPrintln("Setting option " // + System.identityHashCode(arg) + ":" + arg.getName() // + " with " + arg.getDefaultValue()); opanp.selectOption((OptionI) arg, arg.getValue()); @@ -874,7 +874,7 @@ public class WsJobParameters extends JPanel implements ItemListener, if (cw + 120 > panewidth) { jobOptions.add(pbox, "wrap"); - // System.out.println("Wrap on "+pbox.option.getName()); + // jalview.bin.Console.outPrintln("Wrap on "+pbox.option.getName()); cw = hgap + pbox.getSize().width; fh = true; } @@ -946,7 +946,7 @@ public class WsJobParameters extends JPanel implements ItemListener, } // TODO: waste some time trying to eliminate any unnecessary .validate calls // here - // System.out.println("Size will be : "+w+","+os); + // jalview.bin.Console.outPrintln("Size will be : "+w+","+os); // optsAndparams.setPreferredSize(null); // paramPane.getViewport().setView(optsAndparams); paramPane.getViewport().setAutoscrolls(true); @@ -976,7 +976,7 @@ public class WsJobParameters extends JPanel implements ItemListener, disc.run(); } catch (Exception e) { - System.err.println("Aborting. Problem discovering services."); + jalview.bin.Console.errPrintln("Aborting. Problem discovering services."); e.printStackTrace(); return; } @@ -1023,7 +1023,7 @@ public class WsJobParameters extends JPanel implements ItemListener, pr = en.next(); } { - System.out.println("Testing opts dupes for " + jalview.bin.Console.outPrintln("Testing opts dupes for " + lastserv.getUri() + " : " + lastserv.getActionText() + ":" + pr.getName()); List