From 2d606cc5bb6c7db2c55de8b0ec147430fd470670 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 06:59:23 +0000 Subject: [PATCH 1/4] Initial plan From 79cc951fc802e011358ab10a191fede58da6091b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 07:05:49 +0000 Subject: [PATCH 2/4] fix: use LinkedHashMap in getHeaderNameAndPositions to preserve user-requested field order Co-authored-by: holmeso <7066552+holmeso@users.noreply.github.com> --- .../src/au/edu/qimr/qannotate/nanno/AnnotationSourceTSV.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qannotate/src/au/edu/qimr/qannotate/nanno/AnnotationSourceTSV.java b/qannotate/src/au/edu/qimr/qannotate/nanno/AnnotationSourceTSV.java index 41e20e907..5c303594a 100644 --- a/qannotate/src/au/edu/qimr/qannotate/nanno/AnnotationSourceTSV.java +++ b/qannotate/src/au/edu/qimr/qannotate/nanno/AnnotationSourceTSV.java @@ -3,7 +3,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -81,7 +81,7 @@ public static String getLastHeaderLine(List headerLines) { * return an empty map if any of the fields are not in the header */ public static Map getHeaderNameAndPositions(String fieldNames, String header) { - Map namePositions = new HashMap<>(); + Map namePositions = new LinkedHashMap<>(); System.out.println("header: " + header); From d646599e18c7ffb023e70ee43f915a0c3018bcf5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 08:55:56 +0000 Subject: [PATCH 3/4] fix: remove --enable-preview, fix Executor classpath quoting, update test expectations - Revert --enable-preview from build.gradle (List.getFirst/getLast are standard Java 21, not preview) - Revert --enable-preview from AnnotateTest.java Executor call - Update jsonInputsTSV expected value to match user-requested field order (aaref,HGVSc_VEP,HGVSp_VEP) with LinkedHashMap - Fix Executor.java: use getJavaPath() instead of literal "java", remove shell-style quotes from classpath (ProcessBuilder does not use a shell), switch array/jvmArgs constructors to ProcessBuilder Co-authored-by: holmeso <7066552+holmeso@users.noreply.github.com> --- .../qimr/qannotate/nanno/AnnotateTest.java | 2 +- .../org/qcmg/common/commandline/Executor.java | 54 +++++++++++++++++-- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java b/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java index 96b4c666c..a032392cb 100644 --- a/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java +++ b/qannotate/test/au/edu/qimr/qannotate/nanno/AnnotateTest.java @@ -115,7 +115,7 @@ public void jsonInputsTSV() throws IOException { AnnotateUtils.populateAnnotationSources(ais, sources); assertEquals(1, sources.size()); String annotation = sources.getFirst().getAnnotation(ChrPositionUtils.convertContigAndPositionToLong("1", 655652), new ChrPositionRefAlt("chr1", 655652, 655652, "A", "T")); - assertEquals("HGVSc_VEP=c.1A>C\tHGVSp_VEP=p.Met1?\taaref=M", annotation); + assertEquals("aaref=M\tHGVSc_VEP=c.1A>C\tHGVSp_VEP=p.Met1?", annotation); } @Test diff --git a/qcommon/src/org/qcmg/common/commandline/Executor.java b/qcommon/src/org/qcmg/common/commandline/Executor.java index 246754425..e44b4b758 100644 --- a/qcommon/src/org/qcmg/common/commandline/Executor.java +++ b/qcommon/src/org/qcmg/common/commandline/Executor.java @@ -8,6 +8,7 @@ package org.qcmg.common.commandline; import java.io.IOException; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -17,18 +18,61 @@ public class Executor { private final StreamConsumer outputStreamConsumer; private final StreamConsumer errorStreamConsumer; - private final int errCode; + private final int errCode; + + private static String getJavaPath() { + return Paths.get(System.getProperty("java.home"), "bin", "java").toString(); + } public Executor(String arguments, String qualifiedMainClassName) throws IOException, InterruptedException { - this("java", "-classpath", "\"" + System.getProperty("java.class.path") + "\"", qualifiedMainClassName, arguments); + this(getJavaPath(), "-classpath", System.getProperty("java.class.path"), qualifiedMainClassName, arguments); } - public Executor(String [] arguments, String qualifiedMainClassName) throws IOException, InterruptedException { - this("java -classpath " + System.getProperty("java.class.path") + " " + qualifiedMainClassName + " " + Arrays.toString(arguments) ); + public Executor(String [] arguments, String qualifiedMainClassName) throws IOException, InterruptedException { + String javaPath = getJavaPath(); + String classPath = System.getProperty("java.class.path"); + List commands = new ArrayList<>(); + commands.add(javaPath); + commands.add("-classpath"); + commands.add(classPath); + commands.add(qualifiedMainClassName); + commands.addAll(Arrays.asList(arguments)); + + ProcessBuilder processBuilder = new ProcessBuilder(commands); + Process process = processBuilder.start(); + outputStreamConsumer = new StreamConsumer(process.getInputStream()); + errorStreamConsumer = new StreamConsumer(process.getErrorStream()); + outputStreamConsumer.run(); + errorStreamConsumer.run(); + errCode = process.waitFor(); } public Executor(String jvmArgs, String arguments, String qualifiedMainClassName) throws IOException, InterruptedException { - this("java -classpath " + System.getProperty("java.class.path") + " " + jvmArgs + " " + qualifiedMainClassName + " " + arguments); + String javaPath = getJavaPath(); + String classPath = System.getProperty("java.class.path"); + List commands = new ArrayList<>(); + commands.add(javaPath); + commands.add("-classpath"); + commands.add(classPath); + for (String arg : jvmArgs.split(" ")) { + if (!arg.isEmpty()) { + commands.add(arg); + } + } + commands.add(qualifiedMainClassName); + for (String arg : arguments.split(" ")) { + if (!arg.isEmpty()) { + commands.add(arg); + } + } + + ProcessBuilder processBuilder = new ProcessBuilder(commands); + Process process = processBuilder.start(); + outputStreamConsumer = new StreamConsumer(process.getInputStream()); + errorStreamConsumer = new StreamConsumer(process.getErrorStream()); + outputStreamConsumer.run(); + errorStreamConsumer.run(); + errCode = process.waitFor(); } // constructor for running a command line From f3e112a7c0f17a8abd8b302935ccd02d0701c8e6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 01:25:59 +0000 Subject: [PATCH 4/4] revert: remove Executor.java changes from this PR Co-authored-by: holmeso <7066552+holmeso@users.noreply.github.com> --- .../org/qcmg/common/commandline/Executor.java | 54 ++----------------- 1 file changed, 5 insertions(+), 49 deletions(-) diff --git a/qcommon/src/org/qcmg/common/commandline/Executor.java b/qcommon/src/org/qcmg/common/commandline/Executor.java index e44b4b758..246754425 100644 --- a/qcommon/src/org/qcmg/common/commandline/Executor.java +++ b/qcommon/src/org/qcmg/common/commandline/Executor.java @@ -8,7 +8,6 @@ package org.qcmg.common.commandline; import java.io.IOException; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -18,61 +17,18 @@ public class Executor { private final StreamConsumer outputStreamConsumer; private final StreamConsumer errorStreamConsumer; - private final int errCode; - - private static String getJavaPath() { - return Paths.get(System.getProperty("java.home"), "bin", "java").toString(); - } + private final int errCode; public Executor(String arguments, String qualifiedMainClassName) throws IOException, InterruptedException { - this(getJavaPath(), "-classpath", System.getProperty("java.class.path"), qualifiedMainClassName, arguments); + this("java", "-classpath", "\"" + System.getProperty("java.class.path") + "\"", qualifiedMainClassName, arguments); } - public Executor(String [] arguments, String qualifiedMainClassName) throws IOException, InterruptedException { - String javaPath = getJavaPath(); - String classPath = System.getProperty("java.class.path"); - List commands = new ArrayList<>(); - commands.add(javaPath); - commands.add("-classpath"); - commands.add(classPath); - commands.add(qualifiedMainClassName); - commands.addAll(Arrays.asList(arguments)); - - ProcessBuilder processBuilder = new ProcessBuilder(commands); - Process process = processBuilder.start(); - outputStreamConsumer = new StreamConsumer(process.getInputStream()); - errorStreamConsumer = new StreamConsumer(process.getErrorStream()); - outputStreamConsumer.run(); - errorStreamConsumer.run(); - errCode = process.waitFor(); + public Executor(String [] arguments, String qualifiedMainClassName) throws IOException, InterruptedException { + this("java -classpath " + System.getProperty("java.class.path") + " " + qualifiedMainClassName + " " + Arrays.toString(arguments) ); } public Executor(String jvmArgs, String arguments, String qualifiedMainClassName) throws IOException, InterruptedException { - String javaPath = getJavaPath(); - String classPath = System.getProperty("java.class.path"); - List commands = new ArrayList<>(); - commands.add(javaPath); - commands.add("-classpath"); - commands.add(classPath); - for (String arg : jvmArgs.split(" ")) { - if (!arg.isEmpty()) { - commands.add(arg); - } - } - commands.add(qualifiedMainClassName); - for (String arg : arguments.split(" ")) { - if (!arg.isEmpty()) { - commands.add(arg); - } - } - - ProcessBuilder processBuilder = new ProcessBuilder(commands); - Process process = processBuilder.start(); - outputStreamConsumer = new StreamConsumer(process.getInputStream()); - errorStreamConsumer = new StreamConsumer(process.getErrorStream()); - outputStreamConsumer.run(); - errorStreamConsumer.run(); - errCode = process.waitFor(); + this("java -classpath " + System.getProperty("java.class.path") + " " + jvmArgs + " " + qualifiedMainClassName + " " + arguments); } // constructor for running a command line