From e8ffa50fa382268ee481f2e581bf7bf99183d69d Mon Sep 17 00:00:00 2001 From: caylipp Date: Tue, 21 Jul 2026 15:54:55 +0200 Subject: [PATCH 01/10] #825: Add Gc Log Analyzer commandlet - resolve merge conflicts in CHANGELOG.adoc --- CHANGELOG.adoc | 1 + .../com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java | 2 ++ cli/src/main/resources/nls/Help.properties | 2 ++ cli/src/main/resources/nls/Help_de.properties | 2 ++ 4 files changed, 7 insertions(+) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 5932a42dce..8f4c98d8f7 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -37,6 +37,7 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/2056[#2056]: Replaced progress bar with general progress information for installing plugins in VSCode * https://github.com/devonfw/IDEasy/issues/1659[#1659]: Abort runTool with warning when global tool installer runs in background * https://github.com/devonfw/IDEasy/issues/1720[#1720]: Integrate SoapUI +* https://github.com/devonfw/IDEasy/issues/825[#825]: Add commandlet for GC Log Analyzer The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/47?closed=1[milestone 2026.07.002]. diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index 88c7724e68..2585ec4e34 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -28,6 +28,7 @@ import com.devonfw.tools.ide.tool.docker.Docker; import com.devonfw.tools.ide.tool.dotnet.DotNet; import com.devonfw.tools.ide.tool.eclipse.Eclipse; +import com.devonfw.tools.ide.tool.gcloganalyzer.GcLogAnalyzer; import com.devonfw.tools.ide.tool.gcviewer.GcViewer; import com.devonfw.tools.ide.tool.gh.Gh; import com.devonfw.tools.ide.tool.go.Go; @@ -135,6 +136,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Npm(context)); add(new Mvn(context)); add(new Msvc(context)); + add(new GcLogAnalyzer(context)); add(new GcViewer(context)); add(new Gradle(context)); add(new Eclipse(context)); diff --git a/cli/src/main/resources/nls/Help.properties b/cli/src/main/resources/nls/Help.properties index aacdefef89..4e581833cf 100644 --- a/cli/src/main/resources/nls/Help.properties +++ b/cli/src/main/resources/nls/Help.properties @@ -32,6 +32,8 @@ cmd.env.opt.--bash=Convert Windows path syntax to bash for usage in git-bash. cmd.fix-vpn-tls-problem=Commandlet to fix the VPN TLS problem on Windows. cmd.fix-vpn-tls-problem.detail=If you are using a VPN on Windows and encounter TLS problems, this commandlet can help you fix the issue by adding the necessary certificates to your Java keystore. Simply run the following command:\nide fix-vpn-tls-problem cmd.fix-vpn-tls-problem.val.url=The URL that is affected by the VPN TLS problem (e.g. 'https://api.azul.com'), if not provided the commandlet will test 'https://github.com' by default. +cmd.gcloganalyzer=Tool commandlet for GC Log Analyzer (Analyze and visualize garbage collection logs of Java). +cmd.gcloganalyzer.detail=GC Log Analyzer by Azul Systems is a tool for analyzing and visualizing Java garbage collection logs. Detailed documentation can be found at https://docs.azul.com/prime/gcla/about-gcla cmd.gcviewer=Tool commandlet for GC Viewer (View garbage collector logs of Java). cmd.gcviewer.detail=GCViewer is a tool for analyzing and visualizing Java garbage collection logs. Detailed documentation can be found at https://github.com/chewiebug/GCViewer cmd.get-edition=Get the edition of the selected tool. diff --git a/cli/src/main/resources/nls/Help_de.properties b/cli/src/main/resources/nls/Help_de.properties index 83bd160e63..9d4bf47d2f 100644 --- a/cli/src/main/resources/nls/Help_de.properties +++ b/cli/src/main/resources/nls/Help_de.properties @@ -32,6 +32,8 @@ cmd.env.opt.--bash=Konvertiert Windows-Pfad-Syntax nach Bash zur Verwendung in g cmd.fix-vpn-tls-problem=Wekzeug Kommando zum Beheben von VPN TLS Problemen auf Windows cmd.fix-vpn-tls-problem.detail=Auf einigen Windows-Systemen kann es zu Problemen mit der TLS-Verbindung kommen, wenn eine VPN-Verbindung aktiv ist. Dieses Werkzeug Kommando bietet eine Lösung für dieses Problem, indem es die TLS-Einstellungen anpasst, um die Kompatibilität mit VPN-Verbindungen zu verbessern. Um dieses Problem zu beheben, führen Sie einfach den folgenden Befehl aus:\nide fix-vpn-tls-problem cmd.fix-vpn-tls-problem.val.url=Die URL, die von dem VPN TLS Problem betroffen ist (e.g. 'https://api.azul.com'). Ohne eingabe einer URL wird standardmäßig: 'https://github.com' angefragt. +cmd.gcloganalyzer=Werkzeug Kommando für GC Log Analyzer (Analyse und Visualisierung von Garbage-Collector Logs von Java). +cmd.gcloganalyzer.detail=GC Log Analyzer von Azul Systems ist ein Tool zur Analyse und Visualisierung von Java-Garbage-Collection-Protokollen. Detaillierte Dokumentation ist zu finden unter https://docs.azul.com/prime/gcla/about-gcla cmd.gcviewer=Werkzeug Kommando für GC Viewer (Anzeige von Garbage-Collector Logs von Java). cmd.gcviewer.detail=GCViewer ist ein Tool zur Analyse und Visualisierung von Java-Garbage-Collection-Protokollen. Detaillierte Dokumentation ist zu finden unter https://github.com/chewiebug/GCViewer cmd.get-edition=Zeigt die Edition des selektierten Werkzeugs an. From d2ece50ddce2cec1b371bf4c01ee098784ee2faa Mon Sep 17 00:00:00 2001 From: caylipp Date: Tue, 21 Jul 2026 14:35:11 +0200 Subject: [PATCH 02/10] #825: Add Gc Log Analyzer commandlet - add Gcloganalyzer commandlet .java --- .../ide/tool/gcloganalyzer/GcLogAnalyzer.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java b/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java new file mode 100644 index 0000000000..9b3c42193b --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java @@ -0,0 +1,55 @@ +package com.devonfw.tools.ide.tool.gcloganalyzer; + +import java.nio.file.Path; +import java.util.List; +import java.util.Set; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.process.ProcessContext; +import com.devonfw.tools.ide.process.ProcessMode; +import com.devonfw.tools.ide.process.ProcessResult; +import com.devonfw.tools.ide.tool.LocalToolCommandlet; +import com.devonfw.tools.ide.tool.ToolCommandlet; + +/** + * {@link ToolCommandlet} for GC Log Analyzer by Azul Systems. + */ +public class GcLogAnalyzer extends LocalToolCommandlet { + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public GcLogAnalyzer(IdeContext context) { + + super(context, "gcloganalyzer", Set.of(Tag.JAVA, Tag.ANALYSE)); + } + + @Override + protected void doRun() { + + runTool(ProcessMode.BACKGROUND, null, this.arguments.asList()); + } + + @Override + public ProcessResult runTool(ProcessContext pc, ProcessMode processMode, List args) { + + pc.directory(getToolPath()); + pc.executable("java"); + pc.addArg("-jar"); + pc.addArg(resolveGcLogAnalyzerJarPath().getFileName().toString()); + pc.addArgs(args); + return pc.run(processMode); + } + + private Path resolveGcLogAnalyzerJarPath() { + + String version = getInstalledVersion().toString(); + if (version.endsWith(".0.0")) { + version = version.substring(0, version.length() - 2); + } + return getToolPath().resolve("GCLogAnalyzer-" + version + "-ca.jar"); + } +} From 679632113f1317d0401b918ffb01c7496c567a15 Mon Sep 17 00:00:00 2001 From: caylipp Date: Tue, 21 Jul 2026 15:48:28 +0200 Subject: [PATCH 03/10] #825: Add Gc Log Analyzer commandlet - add test and fixture files --- .../tool/gcloganalyzer/GcLogAnalyzerTest.java | 58 +++++++++++++++++++ .../gcloganalyzer/24.10.0.0/urls | 1 + .../gcloganalyzer/dependencies.json | 8 +++ .../_ide/urls/java/java/17.0.10_7/urls | 1 + .../project/settings/ide.properties | 2 + .../project/workspaces/main/.gitkeep | 0 .../repository/java/java/default/bin/java | 2 + .../repository/java/java/default/bin/java.cmd | 2 + 8 files changed, 74 insertions(+) create mode 100644 cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/24.10.0.0/urls create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/dependencies.json create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/java/java/17.0.10_7/urls create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/project/settings/ide.properties create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/project/workspaces/main/.gitkeep create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java.cmd diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java new file mode 100644 index 0000000000..47fb5e1e42 --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java @@ -0,0 +1,58 @@ +package com.devonfw.tools.ide.tool.gcloganalyzer; + +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; + +/** + * Test of {@link GcLogAnalyzer}. + */ +@WireMockTest +class GcLogAnalyzerTest extends AbstractIdeContextTest { + + private static final String PROJECT_GCLOGANALYZER = "gcloganalyzer"; + + private static final String VERSION = "24.10.0.0"; + + private static final String ARTIFACT_VERSION = "24.10.0"; + + @Test + void testGcLogAnalyzerInstall(WireMockRuntimeInfo wireMockRuntimeInfo) { + + IdeTestContext context = newContext(PROJECT_GCLOGANALYZER, wireMockRuntimeInfo); + GcLogAnalyzer commandlet = context.getCommandletManager().getCommandlet(GcLogAnalyzer.class); + + commandlet.install(); + + assertThat(commandlet.getInstalledVersion().toString()).isEqualTo(VERSION); + assertThat(context.getSoftwarePath().resolve("gcloganalyzer/.ide.software.version")).hasContent(VERSION); + assertThat(context.getSoftwarePath() + .resolve("gcloganalyzer/GCLogAnalyzer-" + ARTIFACT_VERSION + "-ca.jar")) + .hasContent("This is a fake GC Log Analyzer jar file.\n"); + assertThat(context.getSoftwarePath() + .resolve("gcloganalyzer/GCLogAnalyzer-" + ARTIFACT_VERSION + "-ca")) + .doesNotExist(); + assertThat(context).logAtSuccess() + .hasMessageContaining("Successfully installed gcloganalyzer in version " + VERSION); + } + + @Test + void testGcLogAnalyzerRunWithArguments(WireMockRuntimeInfo wireMockRuntimeInfo) { + + IdeTestContext context = newContext(PROJECT_GCLOGANALYZER, wireMockRuntimeInfo); + GcLogAnalyzer commandlet = context.getCommandletManager().getCommandlet(GcLogAnalyzer.class); + + commandlet.arguments.addValue("--generate-html"); + commandlet.arguments.addValue("output"); + commandlet.arguments.addValue("gc.log"); + + commandlet.run(); + + assertThat(context.getSoftwarePath().resolve("java/bin/java")).exists(); + assertThat(context).logAtInfo().hasMessageContaining( + "java -jar GCLogAnalyzer-" + ARTIFACT_VERSION + "-ca.jar --generate-html output gc.log"); + } +} diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/24.10.0.0/urls b/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/24.10.0.0/urls new file mode 100644 index 0000000000..3c44b47bec --- /dev/null +++ b/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/24.10.0.0/urls @@ -0,0 +1 @@ +${testbaseurl}/download/gcloganalyzer/gcloganalyzer/24.10.0.0/GCLogAnalyzer-24.10.0-ca.zip \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/dependencies.json b/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/dependencies.json new file mode 100644 index 0000000000..8b376ba251 --- /dev/null +++ b/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/gcloganalyzer/gcloganalyzer/dependencies.json @@ -0,0 +1,8 @@ +{ + "[24.0.0,25.0.0)": [ + { + "tool": "java", + "versionRange": "[11,)" + } + ] +} diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/java/java/17.0.10_7/urls b/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/java/java/17.0.10_7/urls new file mode 100644 index 0000000000..22eab573d1 --- /dev/null +++ b/cli/src/test/resources/ide-projects/gcloganalyzer/_ide/urls/java/java/17.0.10_7/urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10_7/java-17.0.10_7.tgz \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/project/settings/ide.properties b/cli/src/test/resources/ide-projects/gcloganalyzer/project/settings/ide.properties new file mode 100644 index 0000000000..291c74a7f1 --- /dev/null +++ b/cli/src/test/resources/ide-projects/gcloganalyzer/project/settings/ide.properties @@ -0,0 +1,2 @@ +JAVA_VERSION=17.0.10_7 +GCLOGANALYZER_VERSION=24.10.0.0 \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/project/workspaces/main/.gitkeep b/cli/src/test/resources/ide-projects/gcloganalyzer/project/workspaces/main/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java b/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java new file mode 100644 index 0000000000..0aa8af9dc5 --- /dev/null +++ b/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java @@ -0,0 +1,2 @@ +#!/bin/bash +echo "java $*" \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java.cmd b/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java.cmd new file mode 100644 index 0000000000..bbaac38028 --- /dev/null +++ b/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java.cmd @@ -0,0 +1,2 @@ +@echo off +echo java %* \ No newline at end of file From 9c85dffde016428353966ca0aeb919e1902d4770 Mon Sep 17 00:00:00 2001 From: caylipp Date: Tue, 21 Jul 2026 16:38:46 +0200 Subject: [PATCH 04/10] #825: Add Gc Log Analyzer commandlet - add gc log jar for testing --- .../GCLogAnalyzer-24.10.0-ca/GCLogAnalyzer-24.10.0-ca.jar | 1 + 1 file changed, 1 insertion(+) create mode 100644 cli/src/test/resources/ide-projects/gcloganalyzer/repository/gcloganalyzer/gcloganalyzer/default/GCLogAnalyzer-24.10.0-ca/GCLogAnalyzer-24.10.0-ca.jar diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/repository/gcloganalyzer/gcloganalyzer/default/GCLogAnalyzer-24.10.0-ca/GCLogAnalyzer-24.10.0-ca.jar b/cli/src/test/resources/ide-projects/gcloganalyzer/repository/gcloganalyzer/gcloganalyzer/default/GCLogAnalyzer-24.10.0-ca/GCLogAnalyzer-24.10.0-ca.jar new file mode 100644 index 0000000000..4972ebb4eb --- /dev/null +++ b/cli/src/test/resources/ide-projects/gcloganalyzer/repository/gcloganalyzer/gcloganalyzer/default/GCLogAnalyzer-24.10.0-ca/GCLogAnalyzer-24.10.0-ca.jar @@ -0,0 +1 @@ +This is a fake GC Log Analyzer jar file. \ No newline at end of file From 7b55710d6e3b73e9c2b2fcf9924608e55a407287 Mon Sep 17 00:00:00 2001 From: caylipp Date: Wed, 22 Jul 2026 10:16:01 +0200 Subject: [PATCH 05/10] #825: Add Gc Log Analyzer commandlet - add license entry --- documentation/LICENSE.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/LICENSE.adoc b/documentation/LICENSE.adoc index f6257d260c..5b38abce54 100644 --- a/documentation/LICENSE.adoc +++ b/documentation/LICENSE.adoc @@ -49,6 +49,7 @@ The column `inclusion` indicates the way the component is included: |https://logback.qos.ch/[logback-classic]|Directly included|https://logback.qos.ch/license.html[LGPL 2.1] |https://openjdk.java.net/[OpenJDK] / https://adoptopenjdk.net/[AdoptOpenJDK] (Java)|Default Setup|https://openjdk.java.net/legal/gplv2+ce.html[GPLv2] |https://go.dev[GO]|Optional|https://go.dev/LICENSE[BSD 3-Clause] +|https://docs.azul.com/gc-log-analyzer/[GC Log Analyzer]|Optional|https://opensource.org/license/BSD-3-clause[BSD 3-Clause] |https://github.com/github/copilot-cli[GitHub Copilot CLI]|Optional|https://github.com/github/copilot-cli/blob/main/LICENSE.md[Proprietary] |https://github.com/anthropics/claude-code/tree/main[Claude Code CLI]|Optional|https://github.com/anthropics/claude-code/blob/main/LICENSE.md[Proprietary] |https://maven.apache.org/[Maven]|Default Setup|https://www.apache.org/licenses/LICENSE-2.0[Apache 2.0] From e161665c28eed0b8621d4aa6d8e6dc2c4dfe6957 Mon Sep 17 00:00:00 2001 From: caylipp Date: Wed, 22 Jul 2026 10:42:22 +0200 Subject: [PATCH 06/10] #825: Add Gc Log Analyzer commandlet - fix test --- .../tool/gcloganalyzer/GcLogAnalyzerTest.java | 63 ++++++++++++++----- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java index 47fb5e1e42..be8d46278f 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java @@ -22,37 +22,66 @@ class GcLogAnalyzerTest extends AbstractIdeContextTest { @Test void testGcLogAnalyzerInstall(WireMockRuntimeInfo wireMockRuntimeInfo) { - IdeTestContext context = newContext(PROJECT_GCLOGANALYZER, wireMockRuntimeInfo); - GcLogAnalyzer commandlet = context.getCommandletManager().getCommandlet(GcLogAnalyzer.class); + // arrange + IdeTestContext context = + newContext(PROJECT_GCLOGANALYZER, wireMockRuntimeInfo); + GcLogAnalyzer commandlet = new GcLogAnalyzer(context); + // act commandlet.install(); - assertThat(commandlet.getInstalledVersion().toString()).isEqualTo(VERSION); - assertThat(context.getSoftwarePath().resolve("gcloganalyzer/.ide.software.version")).hasContent(VERSION); - assertThat(context.getSoftwarePath() - .resolve("gcloganalyzer/GCLogAnalyzer-" + ARTIFACT_VERSION + "-ca.jar")) - .hasContent("This is a fake GC Log Analyzer jar file.\n"); - assertThat(context.getSoftwarePath() - .resolve("gcloganalyzer/GCLogAnalyzer-" + ARTIFACT_VERSION + "-ca")) - .doesNotExist(); - assertThat(context).logAtSuccess() - .hasMessageContaining("Successfully installed gcloganalyzer in version " + VERSION); + // assert + assertInstallation(context, commandlet); } @Test - void testGcLogAnalyzerRunWithArguments(WireMockRuntimeInfo wireMockRuntimeInfo) { + void testGcLogAnalyzerRunWithArguments( + WireMockRuntimeInfo wireMockRuntimeInfo) { - IdeTestContext context = newContext(PROJECT_GCLOGANALYZER, wireMockRuntimeInfo); - GcLogAnalyzer commandlet = context.getCommandletManager().getCommandlet(GcLogAnalyzer.class); + // arrange + IdeTestContext context = + newContext(PROJECT_GCLOGANALYZER, wireMockRuntimeInfo); + GcLogAnalyzer commandlet = new GcLogAnalyzer(context); commandlet.arguments.addValue("--generate-html"); commandlet.arguments.addValue("output"); commandlet.arguments.addValue("gc.log"); + // act commandlet.run(); - assertThat(context.getSoftwarePath().resolve("java/bin/java")).exists(); + // assert + assertInstallation(context, commandlet); assertThat(context).logAtInfo().hasMessageContaining( - "java -jar GCLogAnalyzer-" + ARTIFACT_VERSION + "-ca.jar --generate-html output gc.log"); + "java -jar GCLogAnalyzer-" + ARTIFACT_VERSION + + "-ca.jar --generate-html output gc.log"); + } + + private void assertInstallation( + IdeTestContext context, GcLogAnalyzer commandlet) { + + assertThat(commandlet.getInstalledVersion().toString()) + .isEqualTo(VERSION); + + assertThat(context.getSoftwarePath() + .resolve("java/bin/java")) + .exists(); + + assertThat(context.getSoftwarePath() + .resolve("gcloganalyzer/.ide.software.version")) + .hasContent(VERSION); + + assertThat(context.getSoftwarePath() + .resolve("gcloganalyzer/GCLogAnalyzer-" + + ARTIFACT_VERSION + "-ca.jar")) + .hasContent("This is a fake GC Log Analyzer jar file.\n"); + + assertThat(context.getSoftwarePath() + .resolve("gcloganalyzer/GCLogAnalyzer-" + + ARTIFACT_VERSION + "-ca")) + .doesNotExist(); + + assertThat(context).logAtSuccess().hasMessageContaining( + "Successfully installed gcloganalyzer in version " + VERSION); } } From 1af870f35451f521311b830fed4a7e5e110c3ed0 Mon Sep 17 00:00:00 2001 From: caylipp Date: Wed, 22 Jul 2026 10:57:11 +0200 Subject: [PATCH 07/10] #825: Add Gc Log Analyzer commandlet - fix test - fix java and make it executable --- .../tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java | 4 +++- .../gcloganalyzer/repository/java/java/default/bin/java | 0 2 files changed, 3 insertions(+), 1 deletion(-) mode change 100644 => 100755 cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java index be8d46278f..d42db51743 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzerTest.java @@ -51,7 +51,9 @@ void testGcLogAnalyzerRunWithArguments( commandlet.run(); // assert - assertInstallation(context, commandlet); + assertThat(context.getSoftwarePath().resolve("java/bin/java")) + .exists(); + assertThat(context).logAtInfo().hasMessageContaining( "java -jar GCLogAnalyzer-" + ARTIFACT_VERSION + "-ca.jar --generate-html output gc.log"); diff --git a/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java b/cli/src/test/resources/ide-projects/gcloganalyzer/repository/java/java/default/bin/java old mode 100644 new mode 100755 From 401f1c2cf8d4d9bb767ea358706f7aa96c6c47ff Mon Sep 17 00:00:00 2001 From: caylipp Date: Wed, 5 Aug 2026 10:10:34 +0200 Subject: [PATCH 08/10] #825: Address review point - use ProcessResult runTool --- .../devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java b/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java index 9b3c42193b..b50b72a5cb 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java @@ -28,9 +28,9 @@ public GcLogAnalyzer(IdeContext context) { } @Override - protected void doRun() { + public ProcessResult runTool(List args) { - runTool(ProcessMode.BACKGROUND, null, this.arguments.asList()); + return runTool(ProcessMode.BACKGROUND, null, args); } @Override From 16e7e533e56827f167794ce8b4a9e64a1c54b930 Mon Sep 17 00:00:00 2001 From: caylipp Date: Wed, 5 Aug 2026 13:22:31 +0200 Subject: [PATCH 09/10] #825: Address review point --- .../ide/tool/gcloganalyzer/GcLogAnalyzer.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java b/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java index b50b72a5cb..53b780e7a7 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/gcloganalyzer/GcLogAnalyzer.java @@ -1,7 +1,9 @@ package com.devonfw.tools.ide.tool.gcloganalyzer; +import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.Locale; import java.util.Set; import com.devonfw.tools.ide.common.Tag; @@ -46,10 +48,17 @@ public ProcessResult runTool(ProcessContext pc, ProcessMode processMode, List jarFiles = this.context.getFileAccess().listChildren( + getToolPath(), + path -> Files.isRegularFile(path) && path.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".jar") + ); + + if (jarFiles.size() == 1) { + return jarFiles.getFirst(); } - return getToolPath().resolve("GCLogAnalyzer-" + version + "-ca.jar"); + + return jarFiles.stream().filter(path -> path.getFileName().toString() + .regionMatches(true, 0, "GCLogAnalyzer-", 0, "GCLogAnalyzer-".length())).findFirst() + .orElseThrow(() -> new IllegalStateException("Could not find GC Log Analyzer JAR in " + getToolPath())); } } From 6987a71d2ba52bf36e0f8c4b40583710b7fb4915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Thu, 6 Aug 2026 13:22:41 +0200 Subject: [PATCH 10/10] #825: moved up in CHANGELOG --- CHANGELOG.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index cee799347a..e26eb92e8f 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -21,6 +21,7 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEAsy/issues/2181[#2181]: Merged the VsCode and VsCodium plugin folder and added excluded-editions as an option for plugins * https://github.com/devonfw/IDEasy/issues/2145[#2145]: Improve documentation on symlink regarding ide ln * https://github.com/devonfw/IDEasy/issues/2235[#2235]: Language flag in cli dosn't take effect in some terminals +* https://github.com/devonfw/IDEasy/issues/825[#825]: Add commandlet for GC Log Analyzer The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/48?closed=1[milestone 2026.08.001]. @@ -38,7 +39,6 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/2056[#2056]: Replaced progress bar with general progress information for installing plugins in VSCode * https://github.com/devonfw/IDEasy/issues/1659[#1659]: Abort runTool with warning when global tool installer runs in background * https://github.com/devonfw/IDEasy/issues/1720[#1720]: Integrate SoapUI -* https://github.com/devonfw/IDEasy/issues/825[#825]: Add commandlet for GC Log Analyzer The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/47?closed=1[milestone 2026.07.002].