From 029f03d54fe4e3500bb42166449b531df27382d2 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 27 Mar 2026 17:52:24 +0100 Subject: [PATCH 01/61] #1296: implemented basic IdeDialog Class --- .../main/java/com/devonfw/ide/gui/App.java | 8 ++++ .../com/devonfw/ide/gui/modal/IdeDialog.java | 42 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 590e29d4b5..faee0c1a0c 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -10,6 +10,7 @@ import javafx.stage.Screen; import javafx.stage.Stage; +import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.version.IdeVersion; /** @@ -34,6 +35,13 @@ public void start(Stage primaryStage) throws IOException { primaryStage.setMinWidth(scene.getWidth()); primaryStage.setMinHeight(scene.getHeight()); primaryStage.show(); + + //TODO: Remove this before PR! + IdeDialog welcomeDialog = new IdeDialog(IdeDialog.AlertType.INFORMATION); + welcomeDialog.setTitle("Welcome to IDEasy"); + welcomeDialog.setHeaderText("Welcome to IDEasy"); + welcomeDialog.setContentText("Thank you for using "); + welcomeDialog.showAndWait(); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java new file mode 100644 index 0000000000..2ee467ae23 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java @@ -0,0 +1,42 @@ +package com.devonfw.ide.gui.modal; + +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +/** + * Custom Alert class for IDEasy to allow interaction via the CLIs questions/modals/selections. + */ +public class IdeDialog extends Alert { + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + */ + public IdeDialog(AlertType alertType) { + + super(alertType); + setupDefaultProperties(); + } + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + * @param message main message displayed in the dialoge + * @param buttonTypes defines the different buttons that the alert displays. + */ + public IdeDialog(AlertType alertType, String message, ButtonType... buttonTypes) { + + super(alertType, message, buttonTypes); + setupDefaultProperties(); + } + + private void setupDefaultProperties() { + + setTitle("IDEasy"); + + setOnShowing(event -> { + Stage stage = (Stage) getDialogPane().getScene().getWindow(); + stage.getIcons().add(new Image("com/devonfw/ide/gui/assets/devonfw.png")); + }); + } +} From 89cfb670431cd7168fe3157034963a28e8752a04 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Mon, 30 Mar 2026 11:53:34 +0200 Subject: [PATCH 02/61] #1296: Added basic context state manager class - Added testing class for modals --- .../ide/commandlet/CommandletManagerImpl.java | 1 + .../ide/commandlet/TestModalsCommandlet.java | 29 ++++++++ .../devonfw/ide/gui/IdeGuiContextManager.java | 67 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java 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 c44f5b7403..ff9af5cf23 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 @@ -147,6 +147,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Corepack(context)); add(new Pip(context)); add(new Go(context)); + add(new TestModalsCommandlet(context)); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java new file mode 100644 index 0000000000..4aa3755f2b --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -0,0 +1,29 @@ +package com.devonfw.tools.ide.commandlet; + +import com.devonfw.tools.ide.context.IdeContext; + +public class TestModalsCommandlet extends Commandlet { + + IdeContext context; + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public TestModalsCommandlet(IdeContext context) { + super(context); + addKeyword("testQuestion"); + this.context = context; + } + + @Override + public String getName() { + return "testQuestion"; + } + + @Override + protected void doRun() { + context.question("Test Question", "Yes", "No", "Maybe"); + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java new file mode 100644 index 0000000000..0022de7c8b --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java @@ -0,0 +1,67 @@ +package com.devonfw.ide.gui; + +import java.io.FileNotFoundException; +import java.nio.file.Path; + +import com.devonfw.tools.ide.context.IdeStartContextImpl; + +/** + * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). + */ +public class IdeGuiContextManager { + + private String projectDirectory; + + /** + * Project context based on which project the user works in. + */ + private IdeGuiContext currentContext; + + private IdeGuiContextManager() { + } + + /** + * @return the singleton instance of the {@link IdeGuiContextManager}. + */ + public static IdeGuiContextManager getInstance() { + + return Holder.INSTANCE; + } + + /** + * @param projectName name of the project folder + * @param workspaceName name of the workspace folder + * @return the new {@link IdeGuiContext} for the selected project and workspace. + * @throws FileNotFoundException if workspace or project does not exist + */ + public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { + + Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + + if (!workspacePath.toFile().exists()) { + throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); + } + + IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); + this.currentContext = newContext; + return this.currentContext; + } + + /** + * @return the current {@link IdeGuiContext} based on the selected project. + */ + public IdeGuiContext getCurrentContext() { + + return this.currentContext; + } + + /** + * Holder class for the singleton instance. The static keyword ensures the thread-safety of the singleton. + * + * @see More info + */ + private static class Holder { + + private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + } +} From a53296d1cddeb4f957697ba77dda77dc013e1072 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Mon, 30 Mar 2026 14:42:35 +0200 Subject: [PATCH 03/61] #1785: Added basic question/confirmation modal implementation - Added logging to IdeGuiStateManager. - Added functionality, that selecting a different project now switches the IdeContext to the new project. --- .../ide/commandlet/TestModalsCommandlet.java | 4 +- .../main/java/com/devonfw/ide/gui/App.java | 8 ---- .../com/devonfw/ide/gui/IdeGuiContext.java | 41 +++++++++++++++++++ ...xtManager.java => IdeGuiStateManager.java} | 31 +++++++++----- .../com/devonfw/ide/gui/MainController.java | 31 ++++++++++---- 5 files changed, 88 insertions(+), 27 deletions(-) rename gui/src/main/java/com/devonfw/ide/gui/{IdeGuiContextManager.java => IdeGuiStateManager.java} (60%) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java index 4aa3755f2b..43fa6fd93f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -24,6 +24,8 @@ public String getName() { @Override protected void doRun() { - context.question("Test Question", "Yes", "No", "Maybe"); + //context.question("Test Question", "Yes", "No", "Maybe"); + Object result = context.question(new String[] { "Red", "Green", "Blue", "Yellow" }, "Test Checkbox Question", "Yes", "No", "Maybe"); + System.out.println(result); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index faee0c1a0c..590e29d4b5 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -10,7 +10,6 @@ import javafx.stage.Screen; import javafx.stage.Stage; -import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.version.IdeVersion; /** @@ -35,13 +34,6 @@ public void start(Stage primaryStage) throws IOException { primaryStage.setMinWidth(scene.getWidth()); primaryStage.setMinHeight(scene.getHeight()); primaryStage.show(); - - //TODO: Remove this before PR! - IdeDialog welcomeDialog = new IdeDialog(IdeDialog.AlertType.INFORMATION); - welcomeDialog.setTitle("Welcome to IDEasy"); - welcomeDialog.setHeaderText("Welcome to IDEasy"); - welcomeDialog.setContentText("Thank you for using "); - welcomeDialog.showAndWait(); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index c16732d70a..dae8887154 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,7 +1,14 @@ package com.devonfw.ide.gui; import java.nio.file.Path; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.VBox; +import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -25,12 +32,46 @@ public IdeGuiContext(IdeStartContextImpl startContext, Path workingDirectory) { @Override protected String readLine() { + return ""; } @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { + return new IdeProgressBarNone(title, 0, unitName, unitSize); } + @Override + public boolean question(String question, Object... args) { + + IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); + dialog.showAndWait(); + return dialog.getResult() == ButtonType.YES; + } + + @Override + public O question(O[] options, String question, Object... args) { + + IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); + + dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); + + DialogPane pane = dialog.getDialogPane(); + ToggleGroup group = new ToggleGroup(); + + VBox vbox = new VBox(10); + for (O option : options) { + RadioButton button = new RadioButton(option.toString()); + button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); + button.setToggleGroup(group); + vbox.getChildren().add(button); + } + pane.setContent(vbox); + dialog.showAndWait(); + + RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); + + return selectedOption == null ? null : (O) selectedOption.getText(); + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java similarity index 60% rename from gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java rename to gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java index 0022de7c8b..2fabdb8b94 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java @@ -3,28 +3,35 @@ import java.io.FileNotFoundException; import java.nio.file.Path; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.devonfw.tools.ide.context.IdeStartContextImpl; +import com.devonfw.tools.ide.log.IdeLogLevel; +import com.devonfw.tools.ide.log.IdeLogListenerBuffer; /** * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). */ -public class IdeGuiContextManager { +public class IdeGuiStateManager { + + private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); - private String projectDirectory; + private final String projectDirectory; /** * Project context based on which project the user works in. */ private IdeGuiContext currentContext; - private IdeGuiContextManager() { + private IdeGuiStateManager() { + this.projectDirectory = System.getenv("IDE_ROOT"); } /** - * @return the singleton instance of the {@link IdeGuiContextManager}. + * @return the singleton instance of the {@link IdeGuiStateManager}. */ - public static IdeGuiContextManager getInstance() { - + public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } @@ -36,14 +43,18 @@ public static IdeGuiContextManager getInstance() { */ public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { - Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + LOG.debug("Switching context to project {} and workspace {}", projectName, workspaceName); + + Path workspacePath = Path.of(projectDirectory, projectName, "workspaces", workspaceName); if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } - IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); - this.currentContext = newContext; + final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); + IdeLogLevel logLevel = IdeLogLevel.DEBUG; + IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); + this.currentContext = new IdeGuiContext(startContext, workspacePath); return this.currentContext; } @@ -62,6 +73,6 @@ public IdeGuiContext getCurrentContext() { */ private static class Holder { - private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 0e64f0a47e..954a5d3cf2 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -1,5 +1,6 @@ package com.devonfw.ide.gui; +import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -8,10 +9,9 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; +import com.devonfw.ide.gui.modal.IdeDialog; +import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.context.IdeStartContextImpl; -import com.devonfw.tools.ide.log.IdeLogLevel; -import com.devonfw.tools.ide.log.IdeLogListenerBuffer; import com.devonfw.tools.ide.variable.IdeVariables; /** @@ -107,6 +107,10 @@ private void setProjectsComboBox() { vsCodeOpen.setDisable(false); selectedWorkspace.setValue("main"); this.workspaceValue = Path.of("main"); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + + //TODO: remove this before PR + IdeGuiStateManager.getInstance().getCurrentContext().getCommandletManager().getCommandlet(TestModalsCommandlet.class).run(); }); } @@ -128,14 +132,25 @@ private void setWorkspaceValue() { } } this.workspaceValue = Path.of(selectedWorkspace.getValue()); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); } private void openIDE(String inIde) { - final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); - IdeLogLevel logLevel = IdeLogLevel.INFO; - IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); - IdeGuiContext context = new IdeGuiContext(startContext, Path.of(this.directoryPath).resolve(this.projectValue).resolve(this.workspaceValue)); - context.getCommandletManager().getCommandlet(inIde).run(); + IdeGuiStateManager + .getInstance() + .getCurrentContext() + .getCommandletManager() + .getCommandlet(inIde) + .run(); + } + + private void updateContext(String selectedProjectName, String selectedWorkspaceName) { + try { + IdeGuiStateManager.getInstance().switchContext(selectedProjectName, selectedWorkspaceName); + } catch (FileNotFoundException e) { + IdeDialog errorDialog = new IdeDialog(IdeDialog.AlertType.ERROR, e.getMessage()); + errorDialog.showAndWait(); + } } } From 37cad74f65c07e9c0c5815d379c2633da82aeee6 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 27 Mar 2026 17:52:24 +0100 Subject: [PATCH 04/61] #1296: implemented basic IdeDialog Class --- .../main/java/com/devonfw/ide/gui/App.java | 1 - .../com/devonfw/ide/gui/modal/IdeDialog.java | 42 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 3094e5185c..9023131653 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -10,7 +10,6 @@ import javafx.stage.Screen; import javafx.stage.Stage; -import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.version.IdeVersion; /** diff --git a/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java new file mode 100644 index 0000000000..2ee467ae23 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java @@ -0,0 +1,42 @@ +package com.devonfw.ide.gui.modal; + +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +/** + * Custom Alert class for IDEasy to allow interaction via the CLIs questions/modals/selections. + */ +public class IdeDialog extends Alert { + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + */ + public IdeDialog(AlertType alertType) { + + super(alertType); + setupDefaultProperties(); + } + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + * @param message main message displayed in the dialoge + * @param buttonTypes defines the different buttons that the alert displays. + */ + public IdeDialog(AlertType alertType, String message, ButtonType... buttonTypes) { + + super(alertType, message, buttonTypes); + setupDefaultProperties(); + } + + private void setupDefaultProperties() { + + setTitle("IDEasy"); + + setOnShowing(event -> { + Stage stage = (Stage) getDialogPane().getScene().getWindow(); + stage.getIcons().add(new Image("com/devonfw/ide/gui/assets/devonfw.png")); + }); + } +} From 55a50cea93a4e858100ceee95e0de41d4cfb9b3e Mon Sep 17 00:00:00 2001 From: laim2003 Date: Mon, 30 Mar 2026 11:53:34 +0200 Subject: [PATCH 05/61] #1296: Added basic context state manager class - Added testing class for modals --- .../ide/commandlet/CommandletManagerImpl.java | 1 + .../ide/commandlet/TestModalsCommandlet.java | 29 ++++++++ .../devonfw/ide/gui/IdeGuiContextManager.java | 67 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java 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 c44f5b7403..ff9af5cf23 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 @@ -147,6 +147,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Corepack(context)); add(new Pip(context)); add(new Go(context)); + add(new TestModalsCommandlet(context)); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java new file mode 100644 index 0000000000..4aa3755f2b --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -0,0 +1,29 @@ +package com.devonfw.tools.ide.commandlet; + +import com.devonfw.tools.ide.context.IdeContext; + +public class TestModalsCommandlet extends Commandlet { + + IdeContext context; + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public TestModalsCommandlet(IdeContext context) { + super(context); + addKeyword("testQuestion"); + this.context = context; + } + + @Override + public String getName() { + return "testQuestion"; + } + + @Override + protected void doRun() { + context.question("Test Question", "Yes", "No", "Maybe"); + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java new file mode 100644 index 0000000000..0022de7c8b --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java @@ -0,0 +1,67 @@ +package com.devonfw.ide.gui; + +import java.io.FileNotFoundException; +import java.nio.file.Path; + +import com.devonfw.tools.ide.context.IdeStartContextImpl; + +/** + * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). + */ +public class IdeGuiContextManager { + + private String projectDirectory; + + /** + * Project context based on which project the user works in. + */ + private IdeGuiContext currentContext; + + private IdeGuiContextManager() { + } + + /** + * @return the singleton instance of the {@link IdeGuiContextManager}. + */ + public static IdeGuiContextManager getInstance() { + + return Holder.INSTANCE; + } + + /** + * @param projectName name of the project folder + * @param workspaceName name of the workspace folder + * @return the new {@link IdeGuiContext} for the selected project and workspace. + * @throws FileNotFoundException if workspace or project does not exist + */ + public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { + + Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + + if (!workspacePath.toFile().exists()) { + throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); + } + + IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); + this.currentContext = newContext; + return this.currentContext; + } + + /** + * @return the current {@link IdeGuiContext} based on the selected project. + */ + public IdeGuiContext getCurrentContext() { + + return this.currentContext; + } + + /** + * Holder class for the singleton instance. The static keyword ensures the thread-safety of the singleton. + * + * @see More info + */ + private static class Holder { + + private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + } +} From 3f1569f38aaab8d6609a40e200804243fdbe221e Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Mon, 30 Mar 2026 14:42:35 +0200 Subject: [PATCH 06/61] #1785: Added basic question/confirmation modal implementation - Added logging to IdeGuiStateManager. - Added functionality, that selecting a different project now switches the IdeContext to the new project. --- .../ide/commandlet/TestModalsCommandlet.java | 4 +- .../com/devonfw/ide/gui/IdeGuiContext.java | 41 +++++++++++++++++ ...xtManager.java => IdeGuiStateManager.java} | 31 ++++++++----- .../com/devonfw/ide/gui/MainController.java | 44 +++++++++++-------- 4 files changed, 91 insertions(+), 29 deletions(-) rename gui/src/main/java/com/devonfw/ide/gui/{IdeGuiContextManager.java => IdeGuiStateManager.java} (60%) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java index 4aa3755f2b..43fa6fd93f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -24,6 +24,8 @@ public String getName() { @Override protected void doRun() { - context.question("Test Question", "Yes", "No", "Maybe"); + //context.question("Test Question", "Yes", "No", "Maybe"); + Object result = context.question(new String[] { "Red", "Green", "Blue", "Yellow" }, "Test Checkbox Question", "Yes", "No", "Maybe"); + System.out.println(result); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index c16732d70a..dae8887154 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,7 +1,14 @@ package com.devonfw.ide.gui; import java.nio.file.Path; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.VBox; +import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -25,12 +32,46 @@ public IdeGuiContext(IdeStartContextImpl startContext, Path workingDirectory) { @Override protected String readLine() { + return ""; } @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { + return new IdeProgressBarNone(title, 0, unitName, unitSize); } + @Override + public boolean question(String question, Object... args) { + + IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); + dialog.showAndWait(); + return dialog.getResult() == ButtonType.YES; + } + + @Override + public O question(O[] options, String question, Object... args) { + + IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); + + dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); + + DialogPane pane = dialog.getDialogPane(); + ToggleGroup group = new ToggleGroup(); + + VBox vbox = new VBox(10); + for (O option : options) { + RadioButton button = new RadioButton(option.toString()); + button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); + button.setToggleGroup(group); + vbox.getChildren().add(button); + } + pane.setContent(vbox); + dialog.showAndWait(); + + RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); + + return selectedOption == null ? null : (O) selectedOption.getText(); + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java similarity index 60% rename from gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java rename to gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java index 0022de7c8b..2fabdb8b94 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java @@ -3,28 +3,35 @@ import java.io.FileNotFoundException; import java.nio.file.Path; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.devonfw.tools.ide.context.IdeStartContextImpl; +import com.devonfw.tools.ide.log.IdeLogLevel; +import com.devonfw.tools.ide.log.IdeLogListenerBuffer; /** * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). */ -public class IdeGuiContextManager { +public class IdeGuiStateManager { + + private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); - private String projectDirectory; + private final String projectDirectory; /** * Project context based on which project the user works in. */ private IdeGuiContext currentContext; - private IdeGuiContextManager() { + private IdeGuiStateManager() { + this.projectDirectory = System.getenv("IDE_ROOT"); } /** - * @return the singleton instance of the {@link IdeGuiContextManager}. + * @return the singleton instance of the {@link IdeGuiStateManager}. */ - public static IdeGuiContextManager getInstance() { - + public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } @@ -36,14 +43,18 @@ public static IdeGuiContextManager getInstance() { */ public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { - Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + LOG.debug("Switching context to project {} and workspace {}", projectName, workspaceName); + + Path workspacePath = Path.of(projectDirectory, projectName, "workspaces", workspaceName); if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } - IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); - this.currentContext = newContext; + final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); + IdeLogLevel logLevel = IdeLogLevel.DEBUG; + IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); + this.currentContext = new IdeGuiContext(startContext, workspacePath); return this.currentContext; } @@ -62,6 +73,6 @@ public IdeGuiContext getCurrentContext() { */ private static class Holder { - private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index e153149107..954a5d3cf2 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -1,5 +1,6 @@ package com.devonfw.ide.gui; +import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -8,21 +9,16 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import com.devonfw.ide.gui.modal.IdeDialog; +import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.context.IdeStartContextImpl; -import com.devonfw.tools.ide.log.IdeLogLevel; -import com.devonfw.tools.ide.log.IdeLogListenerBuffer; +import com.devonfw.tools.ide.variable.IdeVariables; /** * Controller of the main screen of the dashboard GUI. */ public class MainController { - private static Logger LOG = LoggerFactory.getLogger(MainController.class); - @FXML private ComboBox selectedProject; @@ -48,9 +44,8 @@ public class MainController { /** * Constructor */ - public MainController(String directoryPath) { - LOG.debug("IDE_ROOT path={}", directoryPath); - this.directoryPath = directoryPath; + public MainController() { + this.directoryPath = System.getenv(IdeVariables.IDE_ROOT.getName()); } @FXML @@ -86,8 +81,6 @@ private void openVsCode() { private void setProjectsComboBox() { - assert (directoryPath != null) : "directoryPath is null! Please check the setup of your environment variables (IDE_ROOT)"; - selectedProject.getItems().clear(); Path directory = Path.of(directoryPath); @@ -114,6 +107,10 @@ private void setProjectsComboBox() { vsCodeOpen.setDisable(false); selectedWorkspace.setValue("main"); this.workspaceValue = Path.of("main"); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + + //TODO: remove this before PR + IdeGuiStateManager.getInstance().getCurrentContext().getCommandletManager().getCommandlet(TestModalsCommandlet.class).run(); }); } @@ -135,14 +132,25 @@ private void setWorkspaceValue() { } } this.workspaceValue = Path.of(selectedWorkspace.getValue()); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); } private void openIDE(String inIde) { - final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); - IdeLogLevel logLevel = IdeLogLevel.INFO; - IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); - IdeGuiContext context = new IdeGuiContext(startContext, Path.of(this.directoryPath).resolve(this.projectValue).resolve(this.workspaceValue)); - context.getCommandletManager().getCommandlet(inIde).run(); + IdeGuiStateManager + .getInstance() + .getCurrentContext() + .getCommandletManager() + .getCommandlet(inIde) + .run(); + } + + private void updateContext(String selectedProjectName, String selectedWorkspaceName) { + try { + IdeGuiStateManager.getInstance().switchContext(selectedProjectName, selectedWorkspaceName); + } catch (FileNotFoundException e) { + IdeDialog errorDialog = new IdeDialog(IdeDialog.AlertType.ERROR, e.getMessage()); + errorDialog.showAndWait(); + } } } From 7ef65f35cd9ea78f8a078e54c11041cca8eac82f Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Mon, 30 Mar 2026 19:46:59 +0200 Subject: [PATCH 07/61] #1785: - Added logging to IdeGuiStateManager. - Added functionality, that selecting a different project now switches the IdeContext to the new project. --- gui/src/main/java/com/devonfw/ide/gui/App.java | 3 +++ .../java/com/devonfw/ide/gui/IdeGuiContext.java | 2 +- .../java/com/devonfw/ide/gui/MainController.java | 14 +++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 9023131653..20a50063a4 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -1,6 +1,9 @@ package com.devonfw.ide.gui; import java.io.IOException; + +import com.devonfw.tools.ide.variable.IdeVariables; + import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Rectangle2D; diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index dae8887154..2a4c96d69b 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -72,6 +72,6 @@ public O question(O[] options, String question, Object... args) { RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); - return selectedOption == null ? null : (O) selectedOption.getText(); + return selectedOption == null | dialog.getResult() == ButtonType.CANCEL ? null : (O) selectedOption.getText(); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 954a5d3cf2..1c2318d3a2 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -9,16 +9,21 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.variable.IdeVariables; /** * Controller of the main screen of the dashboard GUI. */ public class MainController { + private static Logger LOG = LoggerFactory.getLogger(MainController.class); + + @FXML private ComboBox selectedProject; @@ -44,8 +49,9 @@ public class MainController { /** * Constructor */ - public MainController() { - this.directoryPath = System.getenv(IdeVariables.IDE_ROOT.getName()); + public MainController(String directoryPath) { + LOG.debug("IDE_ROOT path={}", directoryPath); + this.directoryPath = directoryPath; } @FXML @@ -81,6 +87,8 @@ private void openVsCode() { private void setProjectsComboBox() { + assert (directoryPath != null) : "directoryPath is null! Please check the setup of your environment variables (IDE_ROOT)"; + selectedProject.getItems().clear(); Path directory = Path.of(directoryPath); From 1764b2f5b352d9f3006b7520fc6a6f28b4ddfd2c Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Tue, 7 Apr 2026 12:35:20 +0200 Subject: [PATCH 08/61] #1724: implemented basic gui state management --- .../com/devonfw/ide/gui/IdeGuiContext.java | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index 2a4c96d69b..e56218999f 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,14 +1,7 @@ package com.devonfw.ide.gui; import java.nio.file.Path; -import javafx.scene.control.Alert; -import javafx.scene.control.ButtonType; -import javafx.scene.control.DialogPane; -import javafx.scene.control.RadioButton; -import javafx.scene.control.ToggleGroup; -import javafx.scene.layout.VBox; -import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -41,37 +34,4 @@ public IdeProgressBar newProgressBar(String title, long size, String unitName, l return new IdeProgressBarNone(title, 0, unitName, unitSize); } - - @Override - public boolean question(String question, Object... args) { - - IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); - dialog.showAndWait(); - return dialog.getResult() == ButtonType.YES; - } - - @Override - public O question(O[] options, String question, Object... args) { - - IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); - - dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); - - DialogPane pane = dialog.getDialogPane(); - ToggleGroup group = new ToggleGroup(); - - VBox vbox = new VBox(10); - for (O option : options) { - RadioButton button = new RadioButton(option.toString()); - button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); - button.setToggleGroup(group); - vbox.getChildren().add(button); - } - pane.setContent(vbox); - dialog.showAndWait(); - - RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); - - return selectedOption == null | dialog.getResult() == ButtonType.CANCEL ? null : (O) selectedOption.getText(); - } } From ddd3e5fb8fe1079f74122baff2c72f1824d75750 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Tue, 7 Apr 2026 12:35:20 +0200 Subject: [PATCH 09/61] #1802: implemented basic gui state management --- .../com/devonfw/ide/gui/IdeGuiContext.java | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index 2a4c96d69b..e56218999f 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,14 +1,7 @@ package com.devonfw.ide.gui; import java.nio.file.Path; -import javafx.scene.control.Alert; -import javafx.scene.control.ButtonType; -import javafx.scene.control.DialogPane; -import javafx.scene.control.RadioButton; -import javafx.scene.control.ToggleGroup; -import javafx.scene.layout.VBox; -import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -41,37 +34,4 @@ public IdeProgressBar newProgressBar(String title, long size, String unitName, l return new IdeProgressBarNone(title, 0, unitName, unitSize); } - - @Override - public boolean question(String question, Object... args) { - - IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); - dialog.showAndWait(); - return dialog.getResult() == ButtonType.YES; - } - - @Override - public O question(O[] options, String question, Object... args) { - - IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); - - dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); - - DialogPane pane = dialog.getDialogPane(); - ToggleGroup group = new ToggleGroup(); - - VBox vbox = new VBox(10); - for (O option : options) { - RadioButton button = new RadioButton(option.toString()); - button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); - button.setToggleGroup(group); - vbox.getChildren().add(button); - } - pane.setContent(vbox); - dialog.showAndWait(); - - RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); - - return selectedOption == null | dialog.getResult() == ButtonType.CANCEL ? null : (O) selectedOption.getText(); - } } From b28e2161437b23b91d5d2aa98d41ab5d40cd40dc Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Tue, 7 Apr 2026 13:01:47 +0200 Subject: [PATCH 10/61] #1802: removed a few changes so this branch can be the base for other ui feature branches --- .../ide/commandlet/CommandletManagerImpl.java | 1 - .../ide/commandlet/TestModalsCommandlet.java | 31 ------------------- .../com/devonfw/ide/gui/MainController.java | 4 --- 3 files changed, 36 deletions(-) delete mode 100644 cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java 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 ff9af5cf23..c44f5b7403 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 @@ -147,7 +147,6 @@ public CommandletManagerImpl(IdeContext context) { add(new Corepack(context)); add(new Pip(context)); add(new Go(context)); - add(new TestModalsCommandlet(context)); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java deleted file mode 100644 index 43fa6fd93f..0000000000 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.devonfw.tools.ide.commandlet; - -import com.devonfw.tools.ide.context.IdeContext; - -public class TestModalsCommandlet extends Commandlet { - - IdeContext context; - - /** - * The constructor. - * - * @param context the {@link IdeContext}. - */ - public TestModalsCommandlet(IdeContext context) { - super(context); - addKeyword("testQuestion"); - this.context = context; - } - - @Override - public String getName() { - return "testQuestion"; - } - - @Override - protected void doRun() { - //context.question("Test Question", "Yes", "No", "Maybe"); - Object result = context.question(new String[] { "Red", "Green", "Blue", "Yellow" }, "Test Checkbox Question", "Yes", "No", "Maybe"); - System.out.println(result); - } -} diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 1c2318d3a2..4054f4966d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -13,7 +13,6 @@ import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.modal.IdeDialog; -import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; /** @@ -116,9 +115,6 @@ private void setProjectsComboBox() { selectedWorkspace.setValue("main"); this.workspaceValue = Path.of("main"); updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); - - //TODO: remove this before PR - IdeGuiStateManager.getInstance().getCurrentContext().getCommandletManager().getCommandlet(TestModalsCommandlet.class).run(); }); } From 53dd605c9b91902e73e7313bee21425e1aa4dc96 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Tue, 7 Apr 2026 18:06:50 +0200 Subject: [PATCH 11/61] #1784: Added basic progress bar structure --- .../com/devonfw/ide/gui/IdeGuiContext.java | 4 ++-- .../ide/gui/progress/GuiProgressBar.java | 22 ++++++++++++++++++ .../ide/gui/progress/ProgressTask.java | 5 ++++ .../devonfw/ide/gui/progress/TaskManager.java | 23 +++++++++++++++++++ 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index e56218999f..8d110c23e4 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -2,10 +2,10 @@ import java.nio.file.Path; +import com.devonfw.ide.gui.progress.GuiProgressBar; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; -import com.devonfw.tools.ide.io.IdeProgressBarNone; /** * Implementation of {@link AbstractIdeContext} for the IDEasy dashbaord (GUI). @@ -32,6 +32,6 @@ protected String readLine() { @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { - return new IdeProgressBarNone(title, 0, unitName, unitSize); + return new GuiProgressBar(title, 0, unitName, unitSize); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java new file mode 100644 index 0000000000..5789db6d1a --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java @@ -0,0 +1,22 @@ +package com.devonfw.ide.gui.progress; + +import com.devonfw.tools.ide.io.AbstractIdeProgressBar; + +public class GuiProgressBar extends AbstractIdeProgressBar { + + public GuiProgressBar(String title, long maxSize, String unitName, long unitSize) { + + super(title, maxSize, unitName, unitSize); + } + + + protected void doStepBy(long stepSize, long currentProgress) { + // TODO Auto-generated method stub + + } + + protected void doStepTo(long stepPosition) { + // TODO Auto-generated method stub + + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java b/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java new file mode 100644 index 0000000000..e77bb36400 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java @@ -0,0 +1,5 @@ +package com.devonfw.ide.gui.progress; + +public class ProgressTask { + +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java new file mode 100644 index 0000000000..e68db3f328 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java @@ -0,0 +1,23 @@ +package com.devonfw.ide.gui.progress; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +public class TaskManager { + + private static final TaskManager INSTANCE = new TaskManager(); + + public static TaskManager getInstance() { + return INSTANCE; + } + + private final Map tasks = new ConcurrentHashMap<>(); + + private final List listeners = new CopyOnWriteArrayList<>(); + + public interface ProgressListener { + + } +} From 5fb020143ac987f58c1baea28a8bad724ed06eee Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Wed, 8 Apr 2026 18:33:27 +0200 Subject: [PATCH 12/61] #1784: Added Task Management system - Added Task overview window - added ListView that allows to manage concurrent tasks --- .../images/gui/Task Management structure.puml | 20 +++ documentation/images/gui/gui.puml | 87 +++++++++++++ .../main/java/com/devonfw/ide/gui/App.java | 4 +- .../com/devonfw/ide/gui/IdeGuiContext.java | 4 +- .../com/devonfw/ide/gui/MainController.java | 122 +++++++++++++++++- .../ide/gui/progress/GuiProgressBar.java | 22 ---- .../gui/progress/GuiProgressBarHandling.java | 69 ++++++++++ .../ide/gui/progress/ProgressTask.java | 5 - .../devonfw/ide/gui/progress/TaskManager.java | 70 +++++++++- .../gui/progress/TaskWindowCellFactory.java | 50 +++++++ .../taskwindow/TaskOverviewWindow.java | 40 ++++++ .../TaskOverviewWindowController.java | 49 +++++++ .../com/devonfw/ide/gui/main-view.fxml | 112 +++++++++------- .../devonfw/ide/gui/task_overview_window.fxml | 10 ++ 14 files changed, 574 insertions(+), 90 deletions(-) create mode 100644 documentation/images/gui/Task Management structure.puml create mode 100644 documentation/images/gui/gui.puml delete mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java delete mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/TaskWindowCellFactory.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java create mode 100644 gui/src/main/resources/com/devonfw/ide/gui/task_overview_window.fxml diff --git a/documentation/images/gui/Task Management structure.puml b/documentation/images/gui/Task Management structure.puml new file mode 100644 index 0000000000..cee5100352 --- /dev/null +++ b/documentation/images/gui/Task Management structure.puml @@ -0,0 +1,20 @@ +@startuml +'https://plantuml.com/class-diagram + +class TaskManager +class IdeGuiContext +class MainController implements ProgressListener +interface ProgressListener { + +void onUpdateTaskProgress(Task task) + +void onTaskAdded() + +void onTaskRemoved() +} +class GuiProgressBarHandling + +IdeGuiContext ..> GuiProgressBarHandling : instantiates +IdeGuiContext ..> TaskManager : adds instantiated task to +TaskManager ..> MainController : notifies about task updates +TaskManager <.. GuiProgressBarHandling : when close() called: removes itself from TaskManager +MainController ..> TaskManager : registers itself for updates + +@enduml diff --git a/documentation/images/gui/gui.puml b/documentation/images/gui/gui.puml new file mode 100644 index 0000000000..b63d61af79 --- /dev/null +++ b/documentation/images/gui/gui.puml @@ -0,0 +1,87 @@ +@startuml +'https://plantuml.com/sequence-diagram + +title GUI Structure + + +package "cli" { +abstract class AbstractIdeContext +} +package "gui" { + class AppLauncher { + +void main(String []) + } + + class App { + +void main(String []) + +void start() + } + + class IdeGuiStateManager <> { + -String projectDirectory + -IdeGuiContext currentContext + -- + -IdeGuiStateManager() + +{static} IdeGuiStateManager getInstance() + ..GUI context handling.. + +IdeGuiContext switchContext(projectName: String, workspaceName: String) + +IdeGuiContext getCurrentContext() + +void addStateChangeListener(StateChangeListener listener) + +void removeStateChangeListener(StateChangeListener listener) + } + + -static class "IdeGuiStateManager.Holder" as Holder { + -{static} INSTANCE + } + + class MainController { + -void initialize() + .. + -void setProjectsCombobox() + -void setWorkspaceValue() + .. + -void updateContext(String projectName, String workspaceName) + } + + abstract class "IdeGuiStateManager.StateChangeListener" as StateChangeListener { + +void onStateChange(IdeGuiContext newContext) + } + + class IdeGuiContext + + + note right of IdeGuiStateManager + In the most basic sense, the GUI state depends on the current project context. + This is important to ensure that any commandlets will be executed in the correct project. + end note + note bottom of StateChangeListener + Idea: This listener is implemented by any UI component to get notified of any context changes. + Alternative: an abstract StateDependentGuiComponent class that implements the listener and provides an abstract method for handling context changes. + Or: restart the app everytime the context changes (probably not the user-friendliest idea) + end note + note right of App: FXML layout is loaded here + note bottom of Holder: simple instance wrapper class for Bill Pugh singleton + note right of IdeGuiContext: This will implement modals/progress bars + note top of AppLauncher + Current considerations regarding the UI state management: + - Darf die GUI mehr als einmal offen sein? (Fall: Fenster mit gleichem Projekt parallel offen) + - Wie Context-Handling implementieren? + - Wie werden Log messages gehandelt? + end note +} + + +'' Relations '' + +AppLauncher --> App : launches + +IdeGuiContext ..> AbstractIdeContext : extends + +IdeGuiStateManager ..> IdeGuiContext : creates/manages instances of +IdeGuiStateManager --> StateChangeListener : inner class +IdeGuiStateManager -left> Holder : inner class + +App ..> MainController : initializes when loading layout +MainController ..> IdeGuiStateManager : accesses/interacts with + +@enduml diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 20a50063a4..3094e5185c 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -1,9 +1,6 @@ package com.devonfw.ide.gui; import java.io.IOException; - -import com.devonfw.tools.ide.variable.IdeVariables; - import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Rectangle2D; @@ -13,6 +10,7 @@ import javafx.stage.Screen; import javafx.stage.Stage; +import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.version.IdeVersion; /** diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index 8d110c23e4..ec68d23c6d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -2,7 +2,7 @@ import java.nio.file.Path; -import com.devonfw.ide.gui.progress.GuiProgressBar; +import com.devonfw.ide.gui.progress.GuiProgressBarHandling; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -32,6 +32,6 @@ protected String readLine() { @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { - return new GuiProgressBar(title, 0, unitName, unitSize); + return new GuiProgressBarHandling(title, size, unitName, unitSize); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 4054f4966d..fc1014c788 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -4,21 +4,30 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import java.util.stream.Stream; +import javafx.application.Platform; +import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.ProgressBar; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.modal.IdeDialog; +import com.devonfw.ide.gui.progress.GuiProgressBarHandling; +import com.devonfw.ide.gui.progress.TaskManager; +import com.devonfw.ide.gui.progress.TaskManager.ProgressListener; +import com.devonfw.ide.gui.progress.taskwindow.TaskOverviewWindow; import com.devonfw.tools.ide.context.IdeContext; /** * Controller of the main screen of the dashboard GUI. */ -public class MainController { +public class MainController implements ProgressListener { private static Logger LOG = LoggerFactory.getLogger(MainController.class); @@ -41,6 +50,13 @@ public class MainController { @FXML private Button vsCodeOpen; + @FXML + private Label statusLabel; + + @FXML + private ProgressBar statusProgressBar; + private final double PROGRESSBAR_VISIBLE_WIDTH = 150.0; + private final String directoryPath; private Path projectValue; private Path workspaceValue; @@ -49,8 +65,11 @@ public class MainController { * Constructor */ public MainController(String directoryPath) { + LOG.debug("IDE_ROOT path={}", directoryPath); this.directoryPath = directoryPath; + + TaskManager.getInstance().addListener(this); } @FXML @@ -141,12 +160,32 @@ private void setWorkspaceValue() { private void openIDE(String inIde) { - IdeGuiStateManager - .getInstance() - .getCurrentContext() - .getCommandletManager() - .getCommandlet(inIde) - .run(); + Task downloadTask = runIdeCommandTask(inIde); + + new Thread(downloadTask).start(); + } + + private static Task runIdeCommandTask(String inIde) { + Task downloadTask = new Task() { + @Override + protected Void call() throws Exception { + IdeGuiStateManager + .getInstance() + .getCurrentContext() + .getCommandletManager() + .getCommandlet(inIde) + .run(); + return null; + } + }; + + downloadTask.setOnFailed(e -> { + Platform.runLater(() -> { + IdeDialog errorDialog = new IdeDialog(IdeDialog.AlertType.ERROR, "Error occurred while launching " + inIde); + errorDialog.showAndWait(); + }); + }); + return downloadTask; } private void updateContext(String selectedProjectName, String selectedWorkspaceName) { @@ -157,4 +196,73 @@ private void updateContext(String selectedProjectName, String selectedWorkspaceN errorDialog.showAndWait(); } } + + //TODO: remove after testing + public void addTaskTest() { + + LOG.error("Adding task"); + TaskManager.getInstance().addTask(new GuiProgressBarHandling("Test", 100, "Eggs", 10)); + } + + //TODO: remove after testing + public void removeTaskTest() { + + TaskManager.getInstance().removeLastTask(); + } + + @Override + public void onProgressTaskUpdate(GuiProgressBarHandling task, long stepPosition) { + + LOG.info("Progress update at position {}", stepPosition); + + List tasks = TaskManager.getInstance().getTasks(); + updateStatusLabel(tasks); + if (tasks.size() == 1) { + statusProgressBar.setProgress((double) task.getCurrentProgress() / task.getMaxSize()); + } + } + + @Override + public void onProgressTaskAdded(List updatedTaskList) { + + updateStatusLabel(updatedTaskList); + } + + @Override + public void onProgressTaskRemoved(List updatedTaskList) { + + updateStatusLabel(updatedTaskList); + } + + private void updateStatusLabel(List taskList) { + + statusLabel.setOnMouseClicked(e -> new TaskOverviewWindow()); + + if (taskList.size() > 1) { + statusProgressBar.setVisible(false); + statusProgressBar.setPrefWidth(0); + statusLabel.setText(taskList.size() + " tasks running..."); + + statusLabel.setUnderline(true); + statusLabel.setStyle( + "-fx-text-fill: blue;" + + "-fx-cursor: hand" + ); + } else if (taskList.size() == 1) { + GuiProgressBarHandling task = taskList.getFirst(); + statusLabel.setText(task.getTitle() + " [" + task.getCurrentProgress() + "/" + task.getMaxSize() + " " + task.getUnitName() + "]"); + statusLabel.setUnderline(false); + statusLabel.setStyle(""); + + statusProgressBar.setVisible(true); + statusProgressBar.setPrefWidth(PROGRESSBAR_VISIBLE_WIDTH); + } else { + statusLabel.setText("IDEasy is ready."); + statusProgressBar.setVisible(false); + statusProgressBar.setPrefWidth(0); + + statusLabel.setUnderline(false); + statusLabel.setStyle(""); + } + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java deleted file mode 100644 index 5789db6d1a..0000000000 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBar.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.devonfw.ide.gui.progress; - -import com.devonfw.tools.ide.io.AbstractIdeProgressBar; - -public class GuiProgressBar extends AbstractIdeProgressBar { - - public GuiProgressBar(String title, long maxSize, String unitName, long unitSize) { - - super(title, maxSize, unitName, unitSize); - } - - - protected void doStepBy(long stepSize, long currentProgress) { - // TODO Auto-generated method stub - - } - - protected void doStepTo(long stepPosition) { - // TODO Auto-generated method stub - - } -} diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java new file mode 100644 index 0000000000..d3ae3e774a --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java @@ -0,0 +1,69 @@ +package com.devonfw.ide.gui.progress; + +import java.util.logging.Logger; + +import com.devonfw.tools.ide.io.AbstractIdeProgressBar; + +/** + * This is a handler for the progress bars in the GUI + */ +public class GuiProgressBarHandling extends AbstractIdeProgressBar { + + private static final Logger LOG = Logger.getLogger(GuiProgressBarHandling.class.getName()); + + private boolean isIndeterminate = false; + + public GuiProgressBarHandling(String title, long maxSize, String unitName, long unitSize) { + + super(title, maxSize, unitName, unitSize); + TaskManager.getInstance().addTask(this); + } + + /** + * This constructor is used for indeterminate progress bars in the UI. + * + * @param title the title of the progress bar + */ + public GuiProgressBarHandling(String title) { + + super(title, 100, "%", 1); + this.isIndeterminate = true; + TaskManager.getInstance().addTask(this); + } + + + protected void doStepBy(long stepSize, long currentProgress) { + // TODO review if there is a better way to implement this + + TaskManager.getInstance().updateTask(this, currentProgress + stepSize); + } + + protected void doStepTo(long stepPosition) { + // TODO review if there is a better way to implement this + + LOG.info("Step to " + stepPosition); + TaskManager.getInstance().updateTask(this, stepPosition); + } + + @Override + public void close() { + + LOG.info("Closing progress bar"); + TaskManager.getInstance().removeTask(this); + super.close(); + } + + /** + * @return true if the progress bar is indeterminate, false otherwise + */ + public boolean isIndeterminate() { + return isIndeterminate; + } + + /** + * @param indeterminate set whether the progress bar is indeterminate or not + */ + public void setIndeterminate(boolean indeterminate) { + isIndeterminate = indeterminate; + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java b/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java deleted file mode 100644 index e77bb36400..0000000000 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressTask.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.devonfw.ide.gui.progress; - -public class ProgressTask { - -} diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java index e68db3f328..3b37bf655f 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java @@ -1,23 +1,87 @@ package com.devonfw.ide.gui.progress; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import javafx.application.Platform; public class TaskManager { private static final TaskManager INSTANCE = new TaskManager(); public static TaskManager getInstance() { + return INSTANCE; } - private final Map tasks = new ConcurrentHashMap<>(); + public void addListener(ProgressListener listener) { + + listeners.add(listener); + } + + public void removeListener(ProgressListener listener) { + + listeners.remove(listener); + } + + public void addTask(GuiProgressBarHandling task) { + + tasks.add(task); + Platform.runLater(() -> + listeners.forEach(listener -> listener.onProgressTaskAdded(tasks)) + ); + } + + public void removeTask(GuiProgressBarHandling task) { + + tasks.remove(task); + Platform.runLater(() -> + listeners.forEach(listener -> listener.onProgressTaskRemoved(tasks)) + ); + } + + public List getTasks() { + + return tasks; + } + + //TODO: remove after testing + public void removeLastTask() { + + tasks.removeLast(); + listeners.forEach(listener -> listener.onProgressTaskRemoved(tasks)); + } + + protected void updateTask(GuiProgressBarHandling task, long stepPosition) { + + Platform.runLater(() -> + listeners.forEach(listener -> listener.onProgressTaskUpdate(task, stepPosition)) + ); + } + + private final List tasks = new CopyOnWriteArrayList<>(); private final List listeners = new CopyOnWriteArrayList<>(); + /** + * Listener interface for receiving updates about progress tasks. Implement this interface and register it with the TaskManager to receive updates when tasks + * are added, removed, or updated. + */ public interface ProgressListener { + /** + * @param task the task that was updated + * @param stepPosition the current position of the task (for STEP updates) + */ + void onProgressTaskUpdate(GuiProgressBarHandling task, long stepPosition); + + /** + * @param updatedTaskList the updated list of tasks after a task was added + */ + void onProgressTaskAdded(List updatedTaskList); + + /** + * @param updatedTaskList the updated list of tasks after a task was removed + */ + void onProgressTaskRemoved(List updatedTaskList); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskWindowCellFactory.java b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskWindowCellFactory.java new file mode 100644 index 0000000000..9fd5cbeaae --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskWindowCellFactory.java @@ -0,0 +1,50 @@ +package com.devonfw.ide.gui.progress; + +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.ProgressBar; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.util.Callback; + +public class TaskWindowCellFactory implements Callback, ListCell> { + + @Override + public ListCell call(ListView param) { + return new ListCell<>() { + @Override + public void updateItem(GuiProgressBarHandling progressTask, boolean empty) { + + super.updateItem(progressTask, empty); + if (empty || progressTask == null) { + setText(null); + setGraphic(null); + return; + } + + Label titleLabel = new Label(progressTask.getTitle()); + + ProgressBar progressBar = new ProgressBar(); + progressBar.setMaxWidth(Double.MAX_VALUE); + progressBar.setProgress((double) progressTask.getCurrentProgress() / progressTask.getMaxSize()); + + Button cancelButton = new Button("x"); + cancelButton.setOnAction(event -> { + progressTask.close(); // oder deine passende Cancel-Methode + }); + + VBox contentBox = new VBox(5, titleLabel, progressBar); + HBox.setHgrow(contentBox, Priority.ALWAYS); + + HBox root = new HBox(10, contentBox, cancelButton); + root.setAlignment(Pos.CENTER_LEFT); + + setGraphic(root); + } + }; + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java new file mode 100644 index 0000000000..a3ba019400 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java @@ -0,0 +1,40 @@ +package com.devonfw.ide.gui.progress.taskwindow; + +import java.io.IOException; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; +import javafx.stage.StageStyle; + +import com.devonfw.ide.gui.App; + +/** + * This window is displayed when the user clicks on the task label in main-view.fxml. + */ +public class TaskOverviewWindow { + + private Parent root; + + /** + * + */ + public TaskOverviewWindow() { + + FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("task_overview_window.fxml")); + + try { + root = fxmlLoader.load(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + Stage stage = new Stage(); + stage.setResizable(false); + stage.setAlwaysOnTop(true); + stage.setTitle("Running tasks"); + stage.setScene(new Scene(root)); + stage.initStyle(StageStyle.UTILITY); + stage.show(); + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java new file mode 100644 index 0000000000..76740c93f0 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java @@ -0,0 +1,49 @@ +package com.devonfw.ide.gui.progress.taskwindow; + +import java.util.List; +import javafx.fxml.FXML; +import javafx.scene.control.ListView; + +import com.devonfw.ide.gui.progress.GuiProgressBarHandling; +import com.devonfw.ide.gui.progress.TaskManager; +import com.devonfw.ide.gui.progress.TaskManager.ProgressListener; +import com.devonfw.ide.gui.progress.TaskWindowCellFactory; + +/** + * Controller for the task overview window, which shows all currently running tasks and their progressbars. + */ +public class TaskOverviewWindowController implements ProgressListener { + + @FXML + public ListView taskList; + + public TaskOverviewWindowController() { + + TaskManager.getInstance().addListener(this); + } + + @FXML + private void initialize() { + + taskList.setCellFactory(new TaskWindowCellFactory()); + taskList.getItems().addAll(TaskManager.getInstance().getTasks()); + } + + @Override + public void onProgressTaskUpdate(GuiProgressBarHandling task, long stepPosition) { + + taskList.getItems().setAll(TaskManager.getInstance().getTasks()); + } + + @Override + public void onProgressTaskAdded(List updatedTaskList) { + + taskList.getItems().setAll(TaskManager.getInstance().getTasks()); + } + + @Override + public void onProgressTaskRemoved(List updatedTaskList) { + + taskList.getItems().setAll(TaskManager.getInstance().getTasks()); + } +} diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index eafdea657a..5eba232c2d 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -1,126 +1,129 @@ - - - - - - - - - - + + + + - - + - + - + - - + - - + - +
- - + + - + - + - + - - + - + - + - - + - + - + -
+ + + + + + - + - + - + - - + - + - + - diff --git a/pom.xml b/pom.xml index d4651d71a6..962dbfe68e 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 2.18.3 2.11.0 3.11.0 - 21 + 25 4.0.18 0.10.6 3.7.1 From f3eef9f5751148d08b31c1d0bf6bed0f750c0c9a Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Wed, 15 Apr 2026 15:54:09 +0200 Subject: [PATCH 20/61] #1784: - fixed main-view minimum layout bounds (for progress bar) - taskids are now strings, based on UUID.randomUUID() - The TaskOverviewWindow is now displayed directly above the layout node that opens it - progress units are now shown in TaskOverviewWindow --- .../main/java/com/devonfw/ide/gui/App.java | 7 ++----- .../com/devonfw/ide/gui/IdeGuiContext.java | 3 ++- .../com/devonfw/ide/gui/MainController.java | 18 ++++++++++++++-- .../gui/progress/GuiProgressBarHandling.java | 6 +++--- .../devonfw/ide/gui/progress/TaskManager.java | 13 ++++++++---- .../taskwindow/TaskOverviewWindow.java | 21 +++++++++++++------ .../taskwindow/TaskWindowCellFactory.java | 11 +++------- .../com/devonfw/ide/gui/main-view.fxml | 2 +- 8 files changed, 51 insertions(+), 30 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 3094e5185c..0712f74996 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -3,11 +3,10 @@ import java.io.IOException; import javafx.application.Application; import javafx.fxml.FXMLLoader; -import javafx.geometry.Rectangle2D; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.image.Image; -import javafx.stage.Screen; +import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import com.devonfw.tools.ide.variable.IdeVariables; @@ -29,9 +28,7 @@ public void start(Stage primaryStage) throws IOException { ); root = fxmlLoader.load(); - Rectangle2D bounds = Screen.getPrimary().getVisualBounds(); - Scene scene = new Scene(root, bounds.getWidth() / 2, bounds.getHeight() / 2); - + Scene scene = new Scene(root, ((BorderPane) fxmlLoader.getRoot()).getPrefWidth(), ((BorderPane) fxmlLoader.getRoot()).getPrefHeight()); Image icon = new Image("com/devonfw/ide/gui/assets/devonfw.png"); primaryStage.getIcons().add(icon); primaryStage.setTitle("IDEasy - version " + IdeVersion.getVersionString()); diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index 7bd8eeb10f..71752b0236 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,6 +1,7 @@ package com.devonfw.ide.gui; import java.nio.file.Path; +import java.util.UUID; import com.devonfw.ide.gui.progress.GuiProgressBarHandling; import com.devonfw.tools.ide.context.AbstractIdeContext; @@ -32,6 +33,6 @@ protected String readLine() { @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { - return new GuiProgressBarHandling(System.currentTimeMillis(), title, size, unitName, unitSize); + return new GuiProgressBarHandling(UUID.randomUUID().toString(), title, size, unitName, unitSize); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index f38b43b1c2..25e5ba5381 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -204,7 +204,21 @@ private void updateContext(String selectedProjectName, String selectedWorkspaceN public void addTaskTest() { LOG.error("Adding task"); - new GuiProgressBarHandling(System.currentTimeMillis(), "Test", 100, "Eggs", 10); + IdeGuiStateManager.getInstance() + .getCurrentContext() + .newProgressbarForExtracting(1024); + + IdeGuiStateManager.getInstance() + .getCurrentContext() + .newProgressbarForCopying(1024); + + IdeGuiStateManager.getInstance() + .getCurrentContext() + .newProgressBarForDownload(1024); + + IdeGuiStateManager.getInstance() + .getCurrentContext() + .newProgressBarForPlugins(3); } //TODO: remove after testing @@ -239,7 +253,7 @@ public void onProgressTaskRemoved(List updatedTaskList) private void updateStatusLabel(List taskList) { - statusLabel.setOnMouseClicked(e -> TaskOverviewWindow.getInstance(e.getSceneX(), e.getSceneY()).show()); + statusLabel.setOnMouseClicked(e -> TaskOverviewWindow.getInstance(statusLabel).show()); if (taskList.size() > 1) { statusProgressBar.setVisible(false); diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java index f93b05e87d..9e0ed52b64 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java @@ -14,11 +14,11 @@ public class GuiProgressBarHandling extends AbstractIdeProgressBar { private static final Logger LOG = Logger.getLogger(GuiProgressBarHandling.class.getName()); private boolean isIndeterminate = false; - private long taskId = 0; + private String taskId = ""; private final DoubleProperty progressProperty = new SimpleDoubleProperty(getCurrentProgress()); - public GuiProgressBarHandling(long taskId, String title, long maxSize, String unitName, long unitSize) { + public GuiProgressBarHandling(String taskId, String title, long maxSize, String unitName, long unitSize) { super(title, maxSize, unitName, unitSize); this.taskId = taskId; @@ -80,7 +80,7 @@ public void setIndeterminate(boolean indeterminate) { isIndeterminate = indeterminate; } - public long getTaskId() { + public String getTaskId() { return taskId; } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java index c7c220253d..0129ab2a95 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java @@ -33,9 +33,14 @@ public void removeListener(ProgressListener listener) { */ public void addTask(GuiProgressBarHandling task) { - tasks.stream().filter(t -> t.getTaskId() == task.getTaskId()).findFirst().ifPresent(existingTask -> { - throw new IllegalArgumentException("Task with ID " + task.getTaskId() + " already exists."); - }); + tasks.stream() + .filter(t -> + t.getTaskId() == task.getTaskId() + ) + .findFirst() + .ifPresent(existingTask -> { + throw new IllegalArgumentException("Task with ID " + task.getTaskId() + " already exists."); + }); tasks.add(task); Platform.runLater(() -> listeners.forEach(listener -> listener.onProgressTaskAdded(tasks)) @@ -45,7 +50,7 @@ public void addTask(GuiProgressBarHandling task) { /** * @param taskId the ID of the task to be removed from the list of tasks. */ - public void removeTask(long taskId) { + public void removeTask(String taskId) { tasks.stream().filter(task -> task.getTaskId() == taskId).findFirst().ifPresent(tasks::remove); Platform.runLater(() -> diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java index d8c7fcd053..052a32fa0d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindow.java @@ -2,6 +2,8 @@ import java.io.IOException; import javafx.fxml.FXMLLoader; +import javafx.geometry.Point2D; +import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; @@ -20,13 +22,17 @@ public class TaskOverviewWindow { private static TaskOverviewWindow INSTANCE; /** - * @param xPos if the window is not open yet, it will be created at the given x position. - * @param yPos if the window is not open yet, it will be created at the given y position. + * @param referenceNode reference node to determine the position of the TaskOverviewWindow. * @return instance of the TaskOverviewWindow. */ - public static TaskOverviewWindow getInstance(Double xPos, Double yPos) { + public static TaskOverviewWindow getInstance(Node referenceNode) { if (INSTANCE == null) { - INSTANCE = new TaskOverviewWindow(xPos, yPos); + Point2D point = referenceNode.localToScreen(0, 0); + + double nodeRightEdge = point.getX() + referenceNode.getBoundsInLocal().getWidth(); + double nodeTopEdge = point.getY() - referenceNode.getBoundsInLocal().getHeight(); + + INSTANCE = new TaskOverviewWindow(nodeRightEdge, nodeTopEdge); return INSTANCE; } return INSTANCE; @@ -50,8 +56,11 @@ private TaskOverviewWindow(Double x, Double y) { stage.setTitle("Running tasks"); stage.setScene(new Scene(root)); stage.initStyle(StageStyle.UTILITY); - stage.setX(x); - stage.setY(y); + + stage.setOnShown(event -> { + stage.setX(x - stage.getScene().getWidth()); + stage.setY(y - stage.getScene().getHeight()); + }); } /** diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java index 4c1a592823..152503e3b9 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java @@ -1,7 +1,6 @@ package com.devonfw.ide.gui.progress.taskwindow; import javafx.geometry.Pos; -import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; @@ -20,7 +19,6 @@ public ListCell call(ListView pa return new ListCell<>() { final ProgressBar progressBar = new ProgressBar(); - final Button cancelButton = new Button("x"); @Override public void updateItem(GuiProgressBarHandling progressTask, boolean empty) { @@ -34,19 +32,16 @@ public void updateItem(GuiProgressBarHandling progressTask, boolean empty) { setGraphic(null); } else { - Label titleLabel = new Label(progressTask.getTitle()); + Label titleLabel = new Label(String.format("%s [%d/%d %s]", progressTask.getTitle(), progressTask.getCurrentProgress(), progressTask.getMaxSize(), + progressTask.getUnitName())); progressBar.setMaxWidth(Double.MAX_VALUE); progressBar.progressProperty().bind(progressTask.progressProperty()); - cancelButton.setOnAction(event -> { - progressTask.close(); // oder deine passende Cancel-Methode - }); - VBox contentBox = new VBox(5, titleLabel, progressBar); HBox.setHgrow(contentBox, Priority.ALWAYS); - HBox root = new HBox(10, contentBox, cancelButton); + HBox root = new HBox(10, contentBox); root.setAlignment(Pos.CENTER_LEFT); setGraphic(root); diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 5eba232c2d..62b5f613dd 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -5,7 +5,7 @@ - From 48fe018d83b847f5e0bcc756ad3e6ab44076929b Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 12:46:29 +0200 Subject: [PATCH 21/61] Revert "#1802: javafx updated to java 25" This reverts commit 6f92d9390c168e4b5efb9c0c308d61632f277031. --- gui/pom.xml | 1 + .../com/devonfw/ide/gui/main-view.fxml | 100 +++++++++--------- pom.xml | 2 +- 3 files changed, 50 insertions(+), 53 deletions(-) diff --git a/gui/pom.xml b/gui/pom.xml index c581b1dd09..f78ea6e2ec 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -56,6 +56,7 @@ org.testfx openjfx-monocle + 21.0.2 test diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 0ce3546a95..6a19d8b517 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -1,129 +1,126 @@ - - - - + + + + + + + + + + - + + - + - + - - + - - + - +
- - + + - + - + - + - - + - + - + - - + - + - + - diff --git a/pom.xml b/pom.xml index 962dbfe68e..d4651d71a6 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 2.18.3 2.11.0 3.11.0 - 25 + 21 4.0.18 0.10.6 3.7.1 From e0ad0152a1d9422f942a134bd26dede8decd33c7 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 16:47:44 +0200 Subject: [PATCH 22/61] #1803: added DI for IDE_ROOT in GuiStateManager --- .../ide/gui/context/IdeGuiStateManager.java | 17 +++++++++++++-- .../java/com/devonfw/ide/gui/AppBaseTest.java | 21 +++++++------------ ...onTest.java => IdeGuiApplicationTest.java} | 17 ++++++++++++++- 3 files changed, 39 insertions(+), 16 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{HeadlessApplicationTest.java => IdeGuiApplicationTest.java} (70%) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index b0e3f05393..65fd9913ea 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -31,7 +31,7 @@ private IdeGuiStateManager() { this.projectDirectory = System.getenv("IDE_ROOT"); if (this.projectDirectory == null) { - LOG.warn("IDE_ROOT environment variable is not set! Any dependent operation will fail before switchContext is called"); + LOG.warn("IDE_ROOT environment variable is not set! This might lead to unexpected behavior!"); } this.projectManager = new ProjectManager(Path.of(projectDirectory)); @@ -44,6 +44,19 @@ public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } + /** + * This method is used in cases where the IDE_ROOT environment variable is not set, e.g. in test contexts on GitHub actions. This method will retrieve the + * current instance, set the project directory manually an then return the updated instance. USE WITH CARE. + * + * @param ideRoot root directory for the ide projects. + * @return the singleton instance of the {@link IdeGuiStateManager}. + */ + public static IdeGuiStateManager getInstance(String ideRoot) { + IdeGuiStateManager instance = Holder.INSTANCE; + instance.projectDirectory = ideRoot; + return instance; + } + /** * @param projectName name of the project folder * @param workspaceName name of the workspace folder @@ -78,7 +91,7 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr * @throws FileNotFoundException id either the specified project folder or workspace does not exist. */ public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { - + this.projectDirectory = rootDirectory.toString(); this.projectManager = new ProjectManager(rootDirectory); diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index f32f3f047a..786d2ed6e1 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -5,7 +5,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; -import java.nio.file.Path; import java.util.Arrays; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -16,8 +15,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,15 +23,13 @@ /** * Basic UI Test */ -public class AppBaseTest extends HeadlessApplicationTest { +public class AppBaseTest extends IdeGuiApplicationTest { private static Logger LOGGER = LoggerFactory.getLogger(AppBaseTest.class); private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - private static Path temporayProjectDirectoryPath; @Override public void start(Stage stage) throws IOException { @@ -43,7 +38,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(temporayProjectDirectoryPath.toString())); + fxmlLoader.setController(new MainController(getMockIdeRoot().toString())); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work @@ -64,24 +59,24 @@ public void start(Stage stage) throws IOException { @BeforeAll protected static void generateProjectFolderStructure() throws FileNotFoundException { - LOGGER.debug("tempDir: {}", temporayProjectDirectoryPath); + LOGGER.debug("tempDir: {}", getMockIdeRoot()); for (int i = 0; i <= 5; i++) { String projectFolderName = "project-" + i; - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).toFile().mkdir()) .as("Unable to create mock project directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) .as("Unable to create mock workspaces directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) .as( "Unable to create mock main workspace directory for mock project " + i) .isTrue(); } - LOGGER.info("project folders: {}", Arrays.toString(temporayProjectDirectoryPath.toFile().list())); + LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance().switchContext(temporayProjectDirectoryPath, "project-1", "main"); + IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext(getMockIdeRoot(), "project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java similarity index 70% rename from gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java rename to gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java index 3b51b66787..18802dbddb 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java @@ -1,5 +1,9 @@ package com.devonfw.ide.gui; +import java.nio.file.Path; + +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; import org.testfx.framework.junit5.ApplicationTest; /** @@ -8,7 +12,10 @@ * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class HeadlessApplicationTest extends ApplicationTest { +public abstract class IdeGuiApplicationTest extends ApplicationTest { + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + private static Path mockIdeRoot; //setting up for headless testing static { @@ -22,4 +29,12 @@ public abstract class HeadlessApplicationTest extends ApplicationTest { System.setProperty("monocle.platform", "Headless"); System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs } + + /** + * @return a mock {@link Path} to a temporary IDE_ROOT directory. + */ + public static Path getMockIdeRoot() { + + return mockIdeRoot; + } } From 2c9fc55ecf8a3ef6df7a5d17fb8d4cb1d89775ec Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 16:47:44 +0200 Subject: [PATCH 23/61] #1802: added DI for IDE_ROOT in GuiStateManager --- .../ide/gui/context/IdeGuiStateManager.java | 17 +++++++++++++-- .../java/com/devonfw/ide/gui/AppBaseTest.java | 21 +++++++------------ ...onTest.java => IdeGuiApplicationTest.java} | 17 ++++++++++++++- 3 files changed, 39 insertions(+), 16 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{HeadlessApplicationTest.java => IdeGuiApplicationTest.java} (70%) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index b0e3f05393..65fd9913ea 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -31,7 +31,7 @@ private IdeGuiStateManager() { this.projectDirectory = System.getenv("IDE_ROOT"); if (this.projectDirectory == null) { - LOG.warn("IDE_ROOT environment variable is not set! Any dependent operation will fail before switchContext is called"); + LOG.warn("IDE_ROOT environment variable is not set! This might lead to unexpected behavior!"); } this.projectManager = new ProjectManager(Path.of(projectDirectory)); @@ -44,6 +44,19 @@ public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } + /** + * This method is used in cases where the IDE_ROOT environment variable is not set, e.g. in test contexts on GitHub actions. This method will retrieve the + * current instance, set the project directory manually an then return the updated instance. USE WITH CARE. + * + * @param ideRoot root directory for the ide projects. + * @return the singleton instance of the {@link IdeGuiStateManager}. + */ + public static IdeGuiStateManager getInstance(String ideRoot) { + IdeGuiStateManager instance = Holder.INSTANCE; + instance.projectDirectory = ideRoot; + return instance; + } + /** * @param projectName name of the project folder * @param workspaceName name of the workspace folder @@ -78,7 +91,7 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr * @throws FileNotFoundException id either the specified project folder or workspace does not exist. */ public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { - + this.projectDirectory = rootDirectory.toString(); this.projectManager = new ProjectManager(rootDirectory); diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index f32f3f047a..786d2ed6e1 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -5,7 +5,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; -import java.nio.file.Path; import java.util.Arrays; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -16,8 +15,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,15 +23,13 @@ /** * Basic UI Test */ -public class AppBaseTest extends HeadlessApplicationTest { +public class AppBaseTest extends IdeGuiApplicationTest { private static Logger LOGGER = LoggerFactory.getLogger(AppBaseTest.class); private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - private static Path temporayProjectDirectoryPath; @Override public void start(Stage stage) throws IOException { @@ -43,7 +38,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(temporayProjectDirectoryPath.toString())); + fxmlLoader.setController(new MainController(getMockIdeRoot().toString())); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work @@ -64,24 +59,24 @@ public void start(Stage stage) throws IOException { @BeforeAll protected static void generateProjectFolderStructure() throws FileNotFoundException { - LOGGER.debug("tempDir: {}", temporayProjectDirectoryPath); + LOGGER.debug("tempDir: {}", getMockIdeRoot()); for (int i = 0; i <= 5; i++) { String projectFolderName = "project-" + i; - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).toFile().mkdir()) .as("Unable to create mock project directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) .as("Unable to create mock workspaces directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) .as( "Unable to create mock main workspace directory for mock project " + i) .isTrue(); } - LOGGER.info("project folders: {}", Arrays.toString(temporayProjectDirectoryPath.toFile().list())); + LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance().switchContext(temporayProjectDirectoryPath, "project-1", "main"); + IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext(getMockIdeRoot(), "project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java similarity index 70% rename from gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java rename to gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java index 3b51b66787..18802dbddb 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java @@ -1,5 +1,9 @@ package com.devonfw.ide.gui; +import java.nio.file.Path; + +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; import org.testfx.framework.junit5.ApplicationTest; /** @@ -8,7 +12,10 @@ * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class HeadlessApplicationTest extends ApplicationTest { +public abstract class IdeGuiApplicationTest extends ApplicationTest { + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + private static Path mockIdeRoot; //setting up for headless testing static { @@ -22,4 +29,12 @@ public abstract class HeadlessApplicationTest extends ApplicationTest { System.setProperty("monocle.platform", "Headless"); System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs } + + /** + * @return a mock {@link Path} to a temporary IDE_ROOT directory. + */ + public static Path getMockIdeRoot() { + + return mockIdeRoot; + } } From 40ff54e0cdbc28aae9c09617582e5966cc59d3d0 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 17:18:37 +0200 Subject: [PATCH 24/61] #1802: Workaround for IDE_ROOT=null issue. The ideRoot in GuiStateManager is now set when calling getInstance(), allowing us to provide a getInstance() method with a DI parameter --- .../ide/gui/context/IdeGuiStateManager.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 65fd9913ea..754cc4a52e 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -27,20 +27,20 @@ public class IdeGuiStateManager { private IdeGuiContext currentContext; private IdeGuiStateManager() { - - this.projectDirectory = System.getenv("IDE_ROOT"); - - if (this.projectDirectory == null) { - LOG.warn("IDE_ROOT environment variable is not set! This might lead to unexpected behavior!"); - } - - this.projectManager = new ProjectManager(Path.of(projectDirectory)); } /** * @return the singleton instance of the {@link IdeGuiStateManager}. */ public static IdeGuiStateManager getInstance() { + IdeGuiStateManager instance = Holder.INSTANCE; + if (instance.projectDirectory == null) { + String ideRoot = System.getenv("IDE_ROOT"); + if (ideRoot == null) { + throw new IllegalStateException("IDE_ROOT environment variable is not set!"); + } + instance.projectManager = new ProjectManager(Path.of(ideRoot)); + } return Holder.INSTANCE; } @@ -52,8 +52,12 @@ public static IdeGuiStateManager getInstance() { * @return the singleton instance of the {@link IdeGuiStateManager}. */ public static IdeGuiStateManager getInstance(String ideRoot) { + if (ideRoot == null) { + throw new IllegalArgumentException("ideRoot must not be null!"); + } IdeGuiStateManager instance = Holder.INSTANCE; instance.projectDirectory = ideRoot; + instance.projectManager = new ProjectManager(Path.of(ideRoot)); return instance; } @@ -107,6 +111,7 @@ public IdeGuiContext getCurrentContext() { } public ProjectManager getProjectManager() { + return projectManager; } @@ -117,6 +122,6 @@ public ProjectManager getProjectManager() { */ private static class Holder { - private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); + private static IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } From 0b67210b30c958026d37c80a51c2464163db20c2 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 17:44:21 +0200 Subject: [PATCH 25/61] #1802: removed redundant DI variant of switchContext() (DI via getInstance()) (see previous commit) --- gui/pom.xml | 1 - .../ide/gui/context/IdeGuiStateManager.java | 18 ------------------ .../java/com/devonfw/ide/gui/AppBaseTest.java | 2 +- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/gui/pom.xml b/gui/pom.xml index f78ea6e2ec..c581b1dd09 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -56,7 +56,6 @@ org.testfx openjfx-monocle - 21.0.2 test diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 754cc4a52e..551994d738 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -84,24 +84,6 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr return this.currentContext; } - /** - * This variant of the {@link #switchContext(String, String)} method is used when the IDE_ROOT environment variable has to be set manually. USE WITH CARE. - * (e.g. in tests) - * - * @param rootDirectory root directory for the ide projects. - * @param projectName 1st level folder of the project - * @param workspaceName used workspace - * @return the new {@link IdeGuiContext} for the selected project and workspace. - * @throws FileNotFoundException id either the specified project folder or workspace does not exist. - */ - public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { - - this.projectDirectory = rootDirectory.toString(); - this.projectManager = new ProjectManager(rootDirectory); - - return switchContext(projectName, workspaceName); - } - /** * @return the current {@link IdeGuiContext} based on the selected project. */ diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 786d2ed6e1..b9c10ba958 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -76,7 +76,7 @@ protected static void generateProjectFolderStructure() throws FileNotFoundExcept LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext(getMockIdeRoot(), "project-1", "main"); + IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext("project-1", "main"); } /** From 2e15d60d7fd376f03c378b4363c7cf8c372bbce9 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 18:47:10 +0200 Subject: [PATCH 26/61] #1802: Added tests for GuiStateManager --- .../ide/gui/context/IdeGuiStateManager.java | 31 +++--- .../ide/gui/context/ProjectManager.java | 4 +- .../java/com/devonfw/ide/gui/AppBaseTest.java | 18 +--- .../gui/FakeProjectFolderStructureHelper.java | 36 +++++++ .../ide/gui/IdeGuiStateManagerTest.java | 94 +++++++++++++++++++ 5 files changed, 156 insertions(+), 27 deletions(-) create mode 100644 gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java create mode 100644 gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 551994d738..266515e179 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -17,7 +17,7 @@ public class IdeGuiStateManager { private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); - private String projectDirectory; + private Path ideRootDir; private ProjectManager projectManager; @@ -33,13 +33,15 @@ private IdeGuiStateManager() { * @return the singleton instance of the {@link IdeGuiStateManager}. */ public static IdeGuiStateManager getInstance() { + IdeGuiStateManager instance = Holder.INSTANCE; - if (instance.projectDirectory == null) { + if (instance.ideRootDir == null) { String ideRoot = System.getenv("IDE_ROOT"); if (ideRoot == null) { throw new IllegalStateException("IDE_ROOT environment variable is not set!"); } - instance.projectManager = new ProjectManager(Path.of(ideRoot)); + instance.ideRootDir = Path.of(ideRoot); + instance.projectManager = new ProjectManager(instance.ideRootDir); } return Holder.INSTANCE; } @@ -51,13 +53,17 @@ public static IdeGuiStateManager getInstance() { * @param ideRoot root directory for the ide projects. * @return the singleton instance of the {@link IdeGuiStateManager}. */ - public static IdeGuiStateManager getInstance(String ideRoot) { + public static IdeGuiStateManager getInstanceOverrideRootDir(String ideRoot) { + + IdeGuiStateManager instance = Holder.INSTANCE; if (ideRoot == null) { throw new IllegalArgumentException("ideRoot must not be null!"); + } else if (instance.ideRootDir != null) { + LOG.warn("ideRootDir is already set. You are overriding it."); } - IdeGuiStateManager instance = Holder.INSTANCE; - instance.projectDirectory = ideRoot; - instance.projectManager = new ProjectManager(Path.of(ideRoot)); + + instance.ideRootDir = Path.of(ideRoot); + instance.projectManager = new ProjectManager(instance.ideRootDir); return instance; } @@ -69,11 +75,14 @@ public static IdeGuiStateManager getInstance(String ideRoot) { */ public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { - LOG.debug("Switching context to project {} and workspace {}", projectName, workspaceName); + LOG.debug("Trying to switch context to project {} and workspace {}", projectName, workspaceName); - Path workspacePath = Path.of(projectDirectory, projectName, "workspaces", workspaceName); + Path projectPath = ideRootDir.resolve(projectName); + Path workspacePath = projectPath.resolve("workspaces").resolve(workspaceName); - if (!workspacePath.toFile().exists()) { + if (!projectPath.toFile().exists()) { + throw new FileNotFoundException("Project " + workspacePath + " does not exist!"); + } else if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } @@ -85,7 +94,7 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr } /** - * @return the current {@link IdeGuiContext} based on the selected project. + * @return the current {@link IdeGuiContext} based on the selected project. is null, if no context has been set via switchContext. */ public IdeGuiContext getCurrentContext() { diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java index 87354f5186..929f39485b 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java @@ -78,7 +78,9 @@ private void readProjects() { */ protected void readWorkspaces() { - assert !projectNames.isEmpty() : "No projects initialized, cannot read workspaces!"; + if (projectNames.isEmpty()) { + Log.info("Project list is empty. Therefore no workspaces can be read."); + } for (String projectName : projectNames) { Path projectDirectory = ideRootDirectory.resolve(projectName); diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index b9c10ba958..d27eb578a3 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -60,23 +60,11 @@ public void start(Stage stage) throws IOException { protected static void generateProjectFolderStructure() throws FileNotFoundException { LOGGER.debug("tempDir: {}", getMockIdeRoot()); - for (int i = 0; i <= 5; i++) { - String projectFolderName = "project-" + i; - assertThat(getMockIdeRoot().resolve(projectFolderName).toFile().mkdir()) - .as("Unable to create mock project directory for mock project " + i) - .isTrue(); - assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) - .as("Unable to create mock workspaces directory for mock project " + i) - .isTrue(); - assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) - .as( - "Unable to create mock main workspace directory for mock project " + i) - .isTrue(); - } - LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + LOGGER.debug("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext("project-1", "main"); + IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()).switchContext("project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java new file mode 100644 index 0000000000..1842db86ea --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java @@ -0,0 +1,36 @@ +package com.devonfw.ide.gui; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.file.Path; + +/** + * This class helps to create a fake project folder structure for testing. The projects are named in the format "project-{i}" and the workspaces are named + * "main". + */ +public class FakeProjectFolderStructureHelper { + + /** + * @param rootPath root path where fake structure should be created + * @return the rootPath + */ + public static Path createFakeProjectFolderStructure(Path rootPath) { + + for (int i = 0; i <= 5; i++) { + String projectFolderName = "project-" + i; + assertThat(rootPath.resolve(projectFolderName).toFile().mkdir()) + .as("Unable to create mock project directory for mock project " + i) + .isTrue(); + assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + .as("Unable to create mock workspaces directory for mock project " + i) + .isTrue(); + assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + .as( + "Unable to create mock main workspace directory for mock project " + i) + .isTrue(); + } + + return rootPath; + } + +} diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java new file mode 100644 index 0000000000..c8f8cc8ffb --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java @@ -0,0 +1,94 @@ +package com.devonfw.ide.gui; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import com.devonfw.ide.gui.context.IdeGuiContext; +import com.devonfw.ide.gui.context.IdeGuiStateManager; + +public class IdeGuiStateManagerTest { + + @TempDir + static Path mockIdeRoot; + + private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); + + @BeforeAll + static void setup() { + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + } + + @Test + void testThrowsIfIdeRootNull() { + + try { + IdeGuiStateManager.getInstanceOverrideRootDir(null); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("ideRoot must not be null!"); + } + } + + @Test + void testThrowsIfIdeRootDoesNotExist() { + + try { + IdeGuiStateManager.getInstanceOverrideRootDir("nonExistingIdeRoot"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory does not exist"); + } + } + + @Test + void testGetContext() throws FileNotFoundException { + + IdeGuiContext context = guiStateManager.switchContext("project-0", "main"); + assertThat(context).isNotNull().as("context was null after switchContext was called"); // When switching to a project, the context should be set. + } + + @Test + void testSwitchContext() throws IOException { + + Files.list(mockIdeRoot).forEach((projectPath) -> { + try { + guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + }); + } + + @Test + void testThrowsIfNonExistantProjectSelected() throws IOException { + + Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); + + try { + guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); + } catch (FileNotFoundException e) { + assertThat(e.getMessage()).contains("Project " + fakeProject.resolve("workspaces").resolve("main") + " does not exist!") + .as("GuiStateManager.switchContext should throw an exception, if a non-existent project is selected"); + } + } + + @Test + void testThrowsIfNonExistantWorkspaceSelected() throws IOException { + + Files.list(mockIdeRoot).forEach((projectPath) -> { + try { + guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); + } catch (FileNotFoundException e) { + assertThat(e.getMessage()).contains("Workspace " + projectPath.resolve("workspaces").resolve("test") + " does not exist!") + .as("GuiStateManager.switchContext should throw an exception, if a non-existent workspace is selected"); + } + }); + } + +} From 5f0b40a90d3191396f5d316710c04f0de4fe93a5 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Thu, 23 Apr 2026 09:58:12 +0200 Subject: [PATCH 27/61] #1802: Extracted mock IDE_ROOT logic into seperate class that can be extended by tests --- .../java/com/devonfw/ide/gui/AppBaseTest.java | 2 +- ...Test.java => HeadlessApplicationTest.java} | 19 +-------------- .../devonfw/ide/gui/IdeGuiMockRootTest.java | 24 +++++++++++++++++++ .../ide/gui/IdeGuiStateManagerTest.java | 16 +++++-------- 4 files changed, 32 insertions(+), 29 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{IdeGuiApplicationTest.java => HeadlessApplicationTest.java} (66%) create mode 100644 gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index d27eb578a3..7135473869 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -23,7 +23,7 @@ /** * Basic UI Test */ -public class AppBaseTest extends IdeGuiApplicationTest { +public class AppBaseTest extends HeadlessApplicationTest { private static Logger LOGGER = LoggerFactory.getLogger(AppBaseTest.class); diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java similarity index 66% rename from gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java rename to gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java index 18802dbddb..8a21c660a6 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java @@ -1,21 +1,12 @@ package com.devonfw.ide.gui; -import java.nio.file.Path; - -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; -import org.testfx.framework.junit5.ApplicationTest; - /** * Headless testing is often required for contexts, in which the device running the test does not have access to a physical display (e.g. GitHub CI). * * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class IdeGuiApplicationTest extends ApplicationTest { - - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - private static Path mockIdeRoot; +public abstract class HeadlessApplicationTest extends IdeGuiMockRootTest { //setting up for headless testing static { @@ -29,12 +20,4 @@ public abstract class IdeGuiApplicationTest extends ApplicationTest { System.setProperty("monocle.platform", "Headless"); System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs } - - /** - * @return a mock {@link Path} to a temporary IDE_ROOT directory. - */ - public static Path getMockIdeRoot() { - - return mockIdeRoot; - } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java new file mode 100644 index 0000000000..c650f7bf39 --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java @@ -0,0 +1,24 @@ +package com.devonfw.ide.gui; + +import java.nio.file.Path; + +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; +import org.testfx.framework.junit5.ApplicationTest; + +/** + * Provides the handling of mocking the IDE_ROOT directory to subclasses. + */ +public class IdeGuiMockRootTest extends ApplicationTest { + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + private static Path mockIdeRoot; + + /** + * @return a mock {@link Path} to a temporary IDE_ROOT directory. + */ + public static Path getMockIdeRoot() { + + return mockIdeRoot; + } +} diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java index c8f8cc8ffb..57d32bb4f1 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java @@ -9,21 +9,17 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import com.devonfw.ide.gui.context.IdeGuiContext; import com.devonfw.ide.gui.context.IdeGuiStateManager; -public class IdeGuiStateManagerTest { +public class IdeGuiStateManagerTest extends IdeGuiMockRootTest { - @TempDir - static Path mockIdeRoot; - - private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); + private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()); @BeforeAll static void setup() { - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); } @Test @@ -56,7 +52,7 @@ void testGetContext() throws FileNotFoundException { @Test void testSwitchContext() throws IOException { - Files.list(mockIdeRoot).forEach((projectPath) -> { + Files.list(getMockIdeRoot()).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); } catch (FileNotFoundException e) { @@ -68,7 +64,7 @@ void testSwitchContext() throws IOException { @Test void testThrowsIfNonExistantProjectSelected() throws IOException { - Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); + Path fakeProject = getMockIdeRoot().resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); @@ -81,7 +77,7 @@ void testThrowsIfNonExistantProjectSelected() throws IOException { @Test void testThrowsIfNonExistantWorkspaceSelected() throws IOException { - Files.list(mockIdeRoot).forEach((projectPath) -> { + Files.list(getMockIdeRoot()).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); } catch (FileNotFoundException e) { From e406b659973b17f6d1c318745835f11fb5658fe0 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Thu, 23 Apr 2026 11:39:14 +0200 Subject: [PATCH 28/61] #1802: added ProjectManagerTest --- .../java/com/devonfw/ide/gui/AppBaseTest.java | 3 +- .../gui/FakeProjectFolderStructureHelper.java | 16 +- .../ide/gui/IdeGuiStateManagerTest.java | 2 +- .../ide/gui/context/ProjectManagerTest.java | 366 ++++++++++++++++++ 4 files changed, 377 insertions(+), 10 deletions(-) create mode 100644 gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 7135473869..e7177d4733 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -2,7 +2,6 @@ import static org.testfx.assertions.api.Assertions.assertThat; -import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.util.Arrays; @@ -57,7 +56,7 @@ public void start(Stage stage) throws IOException { * to work in the test context. Generates a structure like this: /project-[0..6]/workspaces/main */ @BeforeAll - protected static void generateProjectFolderStructure() throws FileNotFoundException { + protected static void generateProjectFolderStructure() throws IOException { LOGGER.debug("tempDir: {}", getMockIdeRoot()); FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); diff --git a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java index 1842db86ea..d3d115d617 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java +++ b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; /** @@ -14,20 +16,20 @@ public class FakeProjectFolderStructureHelper { * @param rootPath root path where fake structure should be created * @return the rootPath */ - public static Path createFakeProjectFolderStructure(Path rootPath) { + public static Path createFakeProjectFolderStructure(Path rootPath) throws IOException { for (int i = 0; i <= 5; i++) { String projectFolderName = "project-" + i; - assertThat(rootPath.resolve(projectFolderName).toFile().mkdir()) + assertThat(Files.createDirectory(rootPath.resolve(projectFolderName))) .as("Unable to create mock project directory for mock project " + i) - .isTrue(); - assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + .isNotNull(); + assertThat(Files.createDirectory(rootPath.resolve(projectFolderName).resolve("workspaces"))) .as("Unable to create mock workspaces directory for mock project " + i) - .isTrue(); - assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + .isNotNull(); + assertThat(Files.createDirectory(rootPath.resolve(projectFolderName).resolve("workspaces").resolve("main"))) .as( "Unable to create mock main workspace directory for mock project " + i) - .isTrue(); + .isNotNull(); } return rootPath; diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java index 57d32bb4f1..2bcc89783a 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java @@ -18,7 +18,7 @@ public class IdeGuiStateManagerTest extends IdeGuiMockRootTest { private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()); @BeforeAll - static void setup() { + static void setup() throws IOException { FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); } diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java new file mode 100644 index 0000000000..b240bd5141 --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -0,0 +1,366 @@ +package com.devonfw.ide.gui.context; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.devonfw.ide.gui.FakeProjectFolderStructureHelper; +import com.devonfw.ide.gui.IdeGuiMockRootTest; + +/** + * Tests for the ProjectManager class. + */ +public class ProjectManagerTest extends IdeGuiMockRootTest { + + private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); + + private ProjectManager projectManager; + + // Used in tests where we don't want to have any projects in the root directory + @TempDir + private Path emptyRootDir; + + @BeforeAll + static void setup() throws IOException { + + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + } + + //Before each test, we want to restore the default clean test folder structure + @BeforeEach + void resetToDefault() { + + try (var stream = Files.list(getMockIdeRoot())) { + stream.forEach(p -> { + try { + if (Files.isDirectory(p)) { + FileUtils.deleteDirectory(p.toFile()); + } else if (Files.isRegularFile(p)) { + Files.delete(p); + } + } catch (Exception e) { + LOG.error("Error deleting file while resetting project structure: {}", p, e); + } + }); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + } catch (IOException e) { + LOG.error("Error walking through files while resetting project structure", e); + } + } + + @Test + void testConstructorWithValidDirectory() { + + //No exception should be thrown + projectManager = new ProjectManager(getMockIdeRoot()); + } + + @Test + void testConstructorWithNullDirectory() { + + try { + projectManager = new ProjectManager(null); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory is null"); + } + } + + @Test + void testConstructorWithNonExistentDirectory() { + + try { + + projectManager = new ProjectManager(getMockIdeRoot().resolve("nonExistent")); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory does not exist"); + } + } + + @Test + void testConstructorWithFile() throws IOException { + + try { + + File testFile = getMockIdeRoot().resolve("testFile").toFile(); + boolean success = testFile.createNewFile(); + if (!success) { + throw new RuntimeException("Unable to create test file"); + } + + projectManager = new ProjectManager(getMockIdeRoot().resolve("testFile")); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory is not a directory"); + } + } + + // ============ readProjects() Tests ============ + + @Test + void testReadProjectsWithEmptyProjectDirectory() { + + projectManager = new ProjectManager(emptyRootDir); + projectManager.refreshProjects(); + + assertThat(projectManager.getProjectNames()).isEmpty(); + } + + @Test + void testReadProjectsWithValidProjects() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // FakeProjectFolderStructureHelper creates projects 0-5 + assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") + .containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); + } + + @Test + void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { + + // Create a project with underscore prefix + Path underscoreProject = getMockIdeRoot().resolve("_project"); + Files.createDirectories(underscoreProject.resolve("workspaces")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should not include _project, same as _ide directory should be ignored + assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); + } + + @Test + void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() throws Exception { + + // Create a project directory without workspaces folder + Path projectWithoutWorkspaces = getMockIdeRoot().resolve("projectNoWorkspaces"); + Files.createDirectory(projectWithoutWorkspaces); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should not include projectNoWorkspaces + assertThat(projectManager.getProjectNames()).doesNotContain("projectNoWorkspaces").hasSize(6); + } + + // ============ readWorkspaces() Tests ============ + + @Test + void testReadWorkspacesEmpty() { + + projectManager = new ProjectManager(emptyRootDir); + + // No projects, so no workspaces + assertThat(projectManager.getWorkspaceNames("any-project")).isNull(); + } + + @Test + void testReadWorkspacesWithMultipleWorkspaces() throws Exception { + + Path project = getMockIdeRoot().resolve("project-0"); + Path workspacesDir = project.resolve("workspaces"); + + // Create additional workspaces + Files.createDirectory(workspacesDir.resolve("dev")); + Files.createDirectory(workspacesDir.resolve("prod")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should have main, dev, prod workspaces + assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(3) + .containsExactlyInAnyOrder("main", "dev", "prod"); + } + + @Test + void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { + + // Create a project with empty workspaces directory + Path emptyWorkspacesProject = getMockIdeRoot().resolve("emptyWorkspacesProject"); + Files.createDirectories(emptyWorkspacesProject.resolve("workspaces")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should return empty list for empty workspaces directory + assertThat(projectManager.getWorkspaceNames("emptyWorkspacesProject")).isEmpty(); + } + + // ============ refreshProjects() Tests ============ + + @Test + void testRefreshProjectsClearsExistingData() throws Exception { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Get initial projects + assertThat(projectManager.getProjectNames()).hasSize(6); + + // Delete a project + try (var stream = Files.walk(getMockIdeRoot().resolve("project-0"))) { + stream.forEach(p -> { + try { + FileUtils.deleteDirectory(p.toFile()); + } catch (Exception e) { + fail("Error deleting project for test case: {}", p, e); + } + }); + } + + // Refresh should clear old data and reload + projectManager.refreshProjects(); + + assertThat(projectManager.getProjectNames()).hasSize(5).doesNotContain("project-0"); + } + + @Test + void testRefreshProjectsReloadsAll() throws Exception { + + projectManager = new ProjectManager(emptyRootDir); + + assertThat(projectManager.getProjectNames()).isEmpty(); + + Path newProject = emptyRootDir.resolve("newProject"); + Files.createDirectories(newProject.resolve("workspaces").resolve("main")); + + projectManager.refreshProjects(); + + assertThat(projectManager.getProjectNames()).hasSize(1).contains("newProject"); + } + + @Test + void testGetProjectNamesReturnsNotNull() { + + projectManager = new ProjectManager(emptyRootDir); + + assertThat(projectManager.getProjectNames()).isNotNull(); + } + + @Test + void testGetProjectNamesReturnsCorrectList() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); + } + + @Test + void testGetWorkspaceNamesReturnsCorrectList() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getWorkspaceNames("project-0")).isNotNull().containsExactly("main"); + } + + @Test + void testGetWorkspaceNamesWithInvalidProject() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should return null for unknown project + assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); + } + + //Just checks whether getting projects and workspaces works correctly in one go + @Test + void testCompleteWorkflow() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Verify projects are loaded + assertThat(projectManager.getProjectNames()).hasSize(6); + + // Verify workspaces are loaded for each project + for (String projectName : projectManager.getProjectNames()) { + assertThat(projectManager.getWorkspaceNames(projectName)).isNotNull().contains("main"); + } + } + + @Test + void testProjectWithMultipleWorkspaces() throws Exception { + + Path project = getMockIdeRoot().resolve("project-0"); + Path workspacesDir = project.resolve("workspaces"); + + // Create multiple workspaces + for (String workspace : new String[] { "dev", "test", "staging", "production" }) { + Files.createDirectory(workspacesDir.resolve(workspace)); + } + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should have all workspaces including main + assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) + .contains("main", "dev", "test", "staging", "production"); + } + + @Test + void testMultipleProjectsWithWorkspaces() throws Exception { + + // Create different workspace structures for different projects + for (int i = 0; i < 6; i++) { + Path project = getMockIdeRoot().resolve("project-" + i); + Path workspacesDir = project.resolve("workspaces"); + + // Add additional workspaces to each project + for (int j = 1; j <= i; j++) { + Files.createDirectory(workspacesDir.resolve("workspace-" + j)); + } + } + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Verify each project has correct number of workspaces + for (int i = 0; i < 6; i++) { + String projectName = "project-" + i; + // Each project has "main" + i additional workspaces + assertThat(projectManager.getWorkspaceNames(projectName)).hasSize(i + 1); + } + } + + @Test + void testConstructorCallsRefreshProjects() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // If refreshProjects is called in constructor, projects should be loaded immediately + assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); + } + + @Test + void testProjectNamesWithSpecialCharacters() throws Exception { + + Path specialProject = getMockIdeRoot().resolve("project-dash_underscore&"); + Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); + } + + @Test + void testWorkspaceNamesWithSpecialCharacters() throws Exception { + + Path project = getMockIdeRoot().resolve("project-0"); + Path workspacesDir = project.resolve("workspaces"); + + // Create workspaces with special characters + Files.createDirectory(workspacesDir.resolve("dev-environment")); + Files.createDirectory(workspacesDir.resolve("test_workspace")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getWorkspaceNames("project-0")) + .contains("dev-environment", "test_workspace", "main"); + } +} From e0e2d9daa1254f842b00880f79277e4bdfef34e3 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 24 Apr 2026 10:57:14 +0200 Subject: [PATCH 29/61] #1802: Detached startContext creation from switchContext in IdeGuiStateManager; --- .../ide/gui/context/IdeGuiStateManager.java | 19 +++-- .../java/com/devonfw/ide/gui/AppBaseTest.java | 16 +++-- .../ide/gui/HeadlessApplicationTest.java | 4 +- .../{ => context}/IdeGuiStateManagerTest.java | 29 +++++--- .../ide/gui/context/ProjectManagerTest.java | 70 ++++++++++--------- .../FakeProjectFolderStructureHelper.java | 4 +- 6 files changed, 85 insertions(+), 57 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{ => context}/IdeGuiStateManagerTest.java (78%) rename gui/src/test/java/com/devonfw/ide/gui/{ => helper}/FakeProjectFolderStructureHelper.java (89%) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 266515e179..e2d646ee17 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -26,7 +26,16 @@ public class IdeGuiStateManager { */ private IdeGuiContext currentContext; + /** + * The {@link IdeStartContextImpl} for the GUI, this stays the same for the whole GUI session, only the {@link IdeGuiContext} changes. + */ + private final IdeStartContextImpl startContext; + private IdeGuiStateManager() { + + final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); + IdeLogLevel logLevel = IdeLogLevel.DEBUG; + startContext = new IdeStartContextImpl(logLevel, buffer); } /** @@ -81,14 +90,11 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr Path workspacePath = projectPath.resolve("workspaces").resolve(workspaceName); if (!projectPath.toFile().exists()) { - throw new FileNotFoundException("Project " + workspacePath + " does not exist!"); + throw new FileNotFoundException("Project " + projectPath + " does not exist!"); } else if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } - final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); - IdeLogLevel logLevel = IdeLogLevel.DEBUG; - IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); this.currentContext = new IdeGuiContext(startContext, workspacePath); return this.currentContext; } @@ -101,6 +107,9 @@ public IdeGuiContext getCurrentContext() { return this.currentContext; } + /** + * @return instance of {@link ProjectManager} + */ public ProjectManager getProjectManager() { return projectManager; @@ -113,6 +122,6 @@ public ProjectManager getProjectManager() { */ private static class Holder { - private static IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); + private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index e7177d4733..bb2ac5a280 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.net.URL; +import java.nio.file.Path; import java.util.Arrays; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -14,10 +15,12 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.context.IdeGuiStateManager; +import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; /** * Basic UI Test @@ -29,6 +32,9 @@ public class AppBaseTest extends HeadlessApplicationTest { private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; + @TempDir + private static Path mockIdeRoot; + @Override public void start(Stage stage) throws IOException { @@ -37,7 +43,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(getMockIdeRoot().toString())); + fxmlLoader.setController(new MainController(mockIdeRoot.toString())); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work @@ -58,12 +64,12 @@ public void start(Stage stage) throws IOException { @BeforeAll protected static void generateProjectFolderStructure() throws IOException { - LOGGER.debug("tempDir: {}", getMockIdeRoot()); - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); - LOGGER.debug("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); + LOGGER.debug("tempDir: {}", mockIdeRoot); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + LOGGER.debug("project folders: {}", Arrays.toString(mockIdeRoot.toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()).switchContext("project-1", "main"); + IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()).switchContext("project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java index 8a21c660a6..3b51b66787 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java @@ -1,12 +1,14 @@ package com.devonfw.ide.gui; +import org.testfx.framework.junit5.ApplicationTest; + /** * Headless testing is often required for contexts, in which the device running the test does not have access to a physical display (e.g. GitHub CI). * * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class HeadlessApplicationTest extends IdeGuiMockRootTest { +public abstract class HeadlessApplicationTest extends ApplicationTest { //setting up for headless testing static { diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java similarity index 78% rename from gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java rename to gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index 2bcc89783a..d5e09a0dbe 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui; +package com.devonfw.ide.gui.context; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -9,17 +9,24 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; -import com.devonfw.ide.gui.context.IdeGuiContext; -import com.devonfw.ide.gui.context.IdeGuiStateManager; +import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; -public class IdeGuiStateManagerTest extends IdeGuiMockRootTest { +/** + * Tests for {@link IdeGuiStateManager}. + */ +public class IdeGuiStateManagerTest { - private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()); + @TempDir + private static Path mockIdeRoot; + + private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); @BeforeAll static void setup() throws IOException { - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); } @Test @@ -52,7 +59,7 @@ void testGetContext() throws FileNotFoundException { @Test void testSwitchContext() throws IOException { - Files.list(getMockIdeRoot()).forEach((projectPath) -> { + Files.list(mockIdeRoot).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); } catch (FileNotFoundException e) { @@ -62,9 +69,9 @@ void testSwitchContext() throws IOException { } @Test - void testThrowsIfNonExistantProjectSelected() throws IOException { + void testThrowsIfNonExistentProjectSelected() throws IOException { - Path fakeProject = getMockIdeRoot().resolve("nonExistingProject"); + Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); @@ -75,9 +82,9 @@ void testThrowsIfNonExistantProjectSelected() throws IOException { } @Test - void testThrowsIfNonExistantWorkspaceSelected() throws IOException { + void testThrowsIfNonExistentWorkspaceSelected() throws IOException { - Files.list(getMockIdeRoot()).forEach((projectPath) -> { + Files.list(mockIdeRoot).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); } catch (FileNotFoundException e) { diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index b240bd5141..e8c2eea6eb 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -16,18 +16,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.FakeProjectFolderStructureHelper; -import com.devonfw.ide.gui.IdeGuiMockRootTest; +import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; /** * Tests for the ProjectManager class. */ -public class ProjectManagerTest extends IdeGuiMockRootTest { +public class ProjectManagerTest { private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); private ProjectManager projectManager; + @TempDir + private static Path mockIdeRoot; + // Used in tests where we don't want to have any projects in the root directory @TempDir private Path emptyRootDir; @@ -35,14 +37,14 @@ public class ProjectManagerTest extends IdeGuiMockRootTest { @BeforeAll static void setup() throws IOException { - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); } //Before each test, we want to restore the default clean test folder structure @BeforeEach void resetToDefault() { - try (var stream = Files.list(getMockIdeRoot())) { + try (var stream = Files.list(mockIdeRoot)) { stream.forEach(p -> { try { if (Files.isDirectory(p)) { @@ -54,7 +56,7 @@ void resetToDefault() { LOG.error("Error deleting file while resetting project structure: {}", p, e); } }); - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); } catch (IOException e) { LOG.error("Error walking through files while resetting project structure", e); } @@ -64,7 +66,7 @@ void resetToDefault() { void testConstructorWithValidDirectory() { //No exception should be thrown - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); } @Test @@ -83,7 +85,7 @@ void testConstructorWithNonExistentDirectory() { try { - projectManager = new ProjectManager(getMockIdeRoot().resolve("nonExistent")); + projectManager = new ProjectManager(mockIdeRoot.resolve("nonExistent")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory does not exist"); @@ -95,13 +97,13 @@ void testConstructorWithFile() throws IOException { try { - File testFile = getMockIdeRoot().resolve("testFile").toFile(); + File testFile = mockIdeRoot.resolve("testFile").toFile(); boolean success = testFile.createNewFile(); if (!success) { throw new RuntimeException("Unable to create test file"); } - projectManager = new ProjectManager(getMockIdeRoot().resolve("testFile")); + projectManager = new ProjectManager(mockIdeRoot.resolve("testFile")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory is not a directory"); @@ -122,7 +124,7 @@ void testReadProjectsWithEmptyProjectDirectory() { @Test void testReadProjectsWithValidProjects() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // FakeProjectFolderStructureHelper creates projects 0-5 assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") @@ -133,10 +135,10 @@ void testReadProjectsWithValidProjects() { void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { // Create a project with underscore prefix - Path underscoreProject = getMockIdeRoot().resolve("_project"); + Path underscoreProject = mockIdeRoot.resolve("_project"); Files.createDirectories(underscoreProject.resolve("workspaces")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should not include _project, same as _ide directory should be ignored assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); @@ -146,10 +148,10 @@ void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() throws Exception { // Create a project directory without workspaces folder - Path projectWithoutWorkspaces = getMockIdeRoot().resolve("projectNoWorkspaces"); + Path projectWithoutWorkspaces = mockIdeRoot.resolve("projectNoWorkspaces"); Files.createDirectory(projectWithoutWorkspaces); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should not include projectNoWorkspaces assertThat(projectManager.getProjectNames()).doesNotContain("projectNoWorkspaces").hasSize(6); @@ -169,14 +171,14 @@ void testReadWorkspacesEmpty() { @Test void testReadWorkspacesWithMultipleWorkspaces() throws Exception { - Path project = getMockIdeRoot().resolve("project-0"); + Path project = mockIdeRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create additional workspaces Files.createDirectory(workspacesDir.resolve("dev")); Files.createDirectory(workspacesDir.resolve("prod")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should have main, dev, prod workspaces assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(3) @@ -187,10 +189,10 @@ void testReadWorkspacesWithMultipleWorkspaces() throws Exception { void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { // Create a project with empty workspaces directory - Path emptyWorkspacesProject = getMockIdeRoot().resolve("emptyWorkspacesProject"); + Path emptyWorkspacesProject = mockIdeRoot.resolve("emptyWorkspacesProject"); Files.createDirectories(emptyWorkspacesProject.resolve("workspaces")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should return empty list for empty workspaces directory assertThat(projectManager.getWorkspaceNames("emptyWorkspacesProject")).isEmpty(); @@ -201,13 +203,13 @@ void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { @Test void testRefreshProjectsClearsExistingData() throws Exception { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Get initial projects assertThat(projectManager.getProjectNames()).hasSize(6); // Delete a project - try (var stream = Files.walk(getMockIdeRoot().resolve("project-0"))) { + try (var stream = Files.walk(mockIdeRoot.resolve("project-0"))) { stream.forEach(p -> { try { FileUtils.deleteDirectory(p.toFile()); @@ -249,7 +251,7 @@ void testGetProjectNamesReturnsNotNull() { @Test void testGetProjectNamesReturnsCorrectList() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); } @@ -257,7 +259,7 @@ void testGetProjectNamesReturnsCorrectList() { @Test void testGetWorkspaceNamesReturnsCorrectList() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getWorkspaceNames("project-0")).isNotNull().containsExactly("main"); } @@ -265,7 +267,7 @@ void testGetWorkspaceNamesReturnsCorrectList() { @Test void testGetWorkspaceNamesWithInvalidProject() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should return null for unknown project assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); @@ -275,7 +277,7 @@ void testGetWorkspaceNamesWithInvalidProject() { @Test void testCompleteWorkflow() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Verify projects are loaded assertThat(projectManager.getProjectNames()).hasSize(6); @@ -289,7 +291,7 @@ void testCompleteWorkflow() { @Test void testProjectWithMultipleWorkspaces() throws Exception { - Path project = getMockIdeRoot().resolve("project-0"); + Path project = mockIdeRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create multiple workspaces @@ -297,7 +299,7 @@ void testProjectWithMultipleWorkspaces() throws Exception { Files.createDirectory(workspacesDir.resolve(workspace)); } - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should have all workspaces including main assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) @@ -309,7 +311,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { // Create different workspace structures for different projects for (int i = 0; i < 6; i++) { - Path project = getMockIdeRoot().resolve("project-" + i); + Path project = mockIdeRoot.resolve("project-" + i); Path workspacesDir = project.resolve("workspaces"); // Add additional workspaces to each project @@ -318,7 +320,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { } } - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Verify each project has correct number of workspaces for (int i = 0; i < 6; i++) { @@ -331,7 +333,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { @Test void testConstructorCallsRefreshProjects() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // If refreshProjects is called in constructor, projects should be loaded immediately assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); @@ -340,10 +342,10 @@ void testConstructorCallsRefreshProjects() { @Test void testProjectNamesWithSpecialCharacters() throws Exception { - Path specialProject = getMockIdeRoot().resolve("project-dash_underscore&"); + Path specialProject = mockIdeRoot.resolve("project-dash_underscore&"); Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); } @@ -351,14 +353,14 @@ void testProjectNamesWithSpecialCharacters() throws Exception { @Test void testWorkspaceNamesWithSpecialCharacters() throws Exception { - Path project = getMockIdeRoot().resolve("project-0"); + Path project = mockIdeRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create workspaces with special characters Files.createDirectory(workspacesDir.resolve("dev-environment")); Files.createDirectory(workspacesDir.resolve("test_workspace")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getWorkspaceNames("project-0")) .contains("dev-environment", "test_workspace", "main"); diff --git a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java similarity index 89% rename from gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java rename to gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java index d3d115d617..3b6f4a3019 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java +++ b/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui; +package com.devonfw.ide.gui.helper; import static org.assertj.core.api.Assertions.assertThat; @@ -9,6 +9,8 @@ /** * This class helps to create a fake project folder structure for testing. The projects are named in the format "project-{i}" and the workspaces are named * "main". + *

+ * This class is supposed to be replaced by enabling ide-cli test dependencies allowing to mock a IdeContext */ public class FakeProjectFolderStructureHelper { From d70f46027ef731828fb4366738d5fdf813c5deb0 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 24 Apr 2026 11:18:33 +0200 Subject: [PATCH 30/61] #1802: Fixed bug in IdeGuiStateManagerTest leading to test failure --- .../com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index d5e09a0dbe..3dbfffd0e5 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -69,14 +69,14 @@ void testSwitchContext() throws IOException { } @Test - void testThrowsIfNonExistentProjectSelected() throws IOException { + void testThrowsIfNonExistentProjectSelected() { Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); } catch (FileNotFoundException e) { - assertThat(e.getMessage()).contains("Project " + fakeProject.resolve("workspaces").resolve("main") + " does not exist!") + assertThat(e.getMessage()).contains("Project " + fakeProject + " does not exist!") .as("GuiStateManager.switchContext should throw an exception, if a non-existent project is selected"); } } From 9c78eacd1fe03acc2cd3557bafc28edbb72a927f Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 24 Apr 2026 12:53:17 +0200 Subject: [PATCH 31/61] #1802: Added ContextChangeListener; improved thread safety of IdeGuiStateManager --- .../gui/context/GuiContextChangeListener.java | 15 ++++++++ .../ide/gui/context/IdeGuiStateManager.java | 38 ++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java b/gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java new file mode 100644 index 0000000000..53972265f6 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java @@ -0,0 +1,15 @@ +package com.devonfw.ide.gui.context; + +/** + * Interface that notifies listeners of context changes. + */ +public interface GuiContextChangeListener { + + /** + * This method is called when the context changes. It can be used to update the GUI based on the new context. + * + * @param newContext the new {@link IdeGuiContext}. + */ + void onContextChange(IdeGuiContext newContext); + +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index e2d646ee17..070b0e90a0 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -1,7 +1,9 @@ package com.devonfw.ide.gui.context; import java.io.FileNotFoundException; +import java.nio.file.Files; import java.nio.file.Path; +import java.util.concurrent.CopyOnWriteArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,13 +20,14 @@ public class IdeGuiStateManager { private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); private Path ideRootDir; - private ProjectManager projectManager; + private final CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); + /** * Project context based on which project the user works in. */ - private IdeGuiContext currentContext; + private volatile IdeGuiContext currentContext; /** * The {@link IdeStartContextImpl} for the GUI, this stays the same for the whole GUI session, only the {@link IdeGuiContext} changes. @@ -56,13 +59,16 @@ public static IdeGuiStateManager getInstance() { } /** + * USE WITH CARE. * This method is used in cases where the IDE_ROOT environment variable is not set, e.g. in test contexts on GitHub actions. This method will retrieve the - * current instance, set the project directory manually an then return the updated instance. USE WITH CARE. + * current instance, set the project directory manually an then return the updated instance. * * @param ideRoot root directory for the ide projects. * @return the singleton instance of the {@link IdeGuiStateManager}. */ + //TODO: remove this method once we have a better solution for the test context, after implementing CLi's test jar. public static IdeGuiStateManager getInstanceOverrideRootDir(String ideRoot) { + LOG.warn("Using unsafe getInstanceOverrideRootDir method."); IdeGuiStateManager instance = Holder.INSTANCE; if (ideRoot == null) { @@ -82,20 +88,22 @@ public static IdeGuiStateManager getInstanceOverrideRootDir(String ideRoot) { * @return the new {@link IdeGuiContext} for the selected project and workspace. * @throws FileNotFoundException if workspace or project does not exist */ - public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { + public synchronized IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { LOG.debug("Trying to switch context to project {} and workspace {}", projectName, workspaceName); Path projectPath = ideRootDir.resolve(projectName); Path workspacePath = projectPath.resolve("workspaces").resolve(workspaceName); - if (!projectPath.toFile().exists()) { + if (!Files.exists(projectPath)) { throw new FileNotFoundException("Project " + projectPath + " does not exist!"); - } else if (!workspacePath.toFile().exists()) { + } else if (!Files.exists(workspacePath)) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } this.currentContext = new IdeGuiContext(startContext, workspacePath); + listeners.forEach(listener -> listener.onContextChange(this.currentContext)); + return this.currentContext; } @@ -115,6 +123,24 @@ public ProjectManager getProjectManager() { return projectManager; } + /** + * Add a listener to the context change events. + * + * @param listener the {@link GuiContextChangeListener} to attach to context updates. + */ + public void addGuiContextChangeListener(GuiContextChangeListener listener) { + listeners.add(listener); + } + + /** + * Remove a listener from the context change events. + * + * @param listener the {@link GuiContextChangeListener} to remove from context updates. + */ + public void removeGuiContextChangeListener(GuiContextChangeListener listener) { + listeners.remove(listener); + } + /** * Holder class for the singleton instance. The static keyword ensures the thread-safety of the singleton. * From 69055d99a6ce76ff07545e69e753e0a0492d83f6 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 11:42:10 +0200 Subject: [PATCH 32/61] #1802: tests now use AbstractIdeContextTest --- cli/pom.xml | 2 - .../tools/ide/context/IdeContextTest.java | 22 +- gui/pom.xml | 9 +- .../java/com/devonfw/ide/gui/AppBaseTest.java | 1 - .../FakeProjectFolderStructureHelper.java | 2 +- .../gui/context/IdeGuiStateManagerTest.java | 44 ++-- .../ide/gui/context/ProjectManagerTest.java | 188 ++++++------------ .../ide-projects/emptyProjects/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../emptyProjects/_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../emptyProjects/_ide/urls/readme | 1 + .../emptyWorkspaceFolders/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../emptyWorkspaceFolders/_ide/urls/readme | 1 + .../project-0/conf/ide.properties | 6 + .../project-0/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-0/home/Downloads/ide/readme | 1 + .../project-0/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-0/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../emptyWorkspaceFolders/project-0/setup | 1 + .../project-0/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-0/software/mvn/bin/mvn | 5 + .../project-0/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../project-0/software/node/npm | 6 + .../ide-projects/noWorkspaces/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../noWorkspaces/_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../noWorkspaces/_ide/urls/readme | 1 + .../conf/ide.properties | 6 + .../home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../home/Downloads/ide/readme | 1 + .../projectWithoutWorkspaces/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../projectWithoutWorkspaces/setup | 1 + .../software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../software/mvn/bin/mvn | 5 + .../software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../software/node/npm | 6 + .../ide-projects/testProject/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../testProject/_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../testProject/_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../testProject/_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../testProject/_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../ide-projects/testProject/_ide/urls/readme | 1 + .../testProject/project-0/conf/ide.properties | 6 + .../project-0/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-0/home/Downloads/ide/readme | 1 + .../testProject/project-0/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-0/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-0/setup | 1 + .../project-0/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-0/software/mvn/bin/mvn | 5 + .../project-0/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-0/software/node/npm | 6 + .../project-0/workspaces/foo-test/readme | 1 + .../project-0/workspaces/main/readme | 1 + .../testProject/project-1/conf/ide.properties | 6 + .../project-1/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-1/home/Downloads/ide/readme | 1 + .../testProject/project-1/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-1/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-1/setup | 1 + .../project-1/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-1/software/mvn/bin/mvn | 5 + .../project-1/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-1/software/node/npm | 6 + .../project-1/workspaces/foo-test/readme | 1 + .../project-1/workspaces/main/readme | 1 + .../testProject/project-2/conf/ide.properties | 6 + .../project-2/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-2/home/Downloads/ide/readme | 1 + .../testProject/project-2/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-2/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-2/setup | 1 + .../project-2/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-2/software/mvn/bin/mvn | 5 + .../project-2/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-2/software/node/npm | 6 + .../project-2/workspaces/foo-test/readme | 1 + .../project-2/workspaces/main/readme | 1 + .../testProject/project-3/conf/ide.properties | 6 + .../project-3/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-3/home/Downloads/ide/readme | 1 + .../testProject/project-3/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-3/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-3/setup | 1 + .../project-3/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-3/software/mvn/bin/mvn | 5 + .../project-3/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-3/software/node/npm | 6 + .../project-3/workspaces/foo-test/readme | 1 + .../project-3/workspaces/main/readme | 1 + .../testProject/project-4/conf/ide.properties | 6 + .../project-4/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-4/home/Downloads/ide/readme | 1 + .../testProject/project-4/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-4/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-4/setup | 1 + .../project-4/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-4/software/mvn/bin/mvn | 5 + .../project-4/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-4/software/node/npm | 6 + .../project-4/workspaces/foo-test/readme | 1 + .../project-4/workspaces/main/readme | 1 + .../testProject/project-5/conf/ide.properties | 6 + .../project-5/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-5/home/Downloads/ide/readme | 1 + .../testProject/project-5/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-5/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-5/setup | 1 + .../project-5/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-5/software/mvn/bin/mvn | 5 + .../project-5/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-5/software/node/npm | 6 + .../project-5/workspaces/foo-test/readme | 1 + .../project-5/workspaces/main/readme | 1 + 227 files changed, 786 insertions(+), 162 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{helper => }/FakeProjectFolderStructureHelper.java (97%) create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme diff --git a/cli/pom.xml b/cli/pom.xml index 80e9623ca4..d4967c49ce 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -138,8 +138,6 @@ - - test-jar diff --git a/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java b/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java index c167895a49..c1ac76e39c 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java @@ -5,13 +5,6 @@ import java.util.Properties; import org.junit.jupiter.api.Test; -import com.devonfw.tools.ide.security.ToolVersionChoice; -import com.devonfw.tools.ide.tool.ToolEditionAndVersion; -import com.devonfw.tools.ide.security.ToolVulnerabilities; -import com.devonfw.tools.ide.version.VersionIdentifier; -import com.devonfw.tools.ide.version.VersionRange; -import com.devonfw.tools.ide.url.model.file.json.Cve; -import com.devonfw.tools.ide.tool.ToolEdition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,13 +17,20 @@ import com.devonfw.tools.ide.log.IdeLogLevel; import com.devonfw.tools.ide.os.SystemInfo; import com.devonfw.tools.ide.os.SystemInfoMock; +import com.devonfw.tools.ide.security.ToolVersionChoice; +import com.devonfw.tools.ide.security.ToolVulnerabilities; +import com.devonfw.tools.ide.tool.ToolEdition; +import com.devonfw.tools.ide.tool.ToolEditionAndVersion; +import com.devonfw.tools.ide.url.model.file.json.Cve; import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.version.IdeVersion; +import com.devonfw.tools.ide.version.VersionIdentifier; +import com.devonfw.tools.ide.version.VersionRange; /** * Test of {@link IdeContext}. */ -class IdeContextTest extends AbstractIdeContextTest { +public class IdeContextTest extends AbstractIdeContextTest { private static final Logger LOG = LoggerFactory.getLogger(IdeContextTest.class); @@ -284,7 +284,7 @@ void testFindBashOnSystemPathOnWindowsWithInvalidBashPathSet() { @Test void testQuestionWithMultipleOptions() { IdeTestContext context = newContext(PROJECT_BASIC, null, false); - String[] options = {"option1", "option2"}; + String[] options = { "option1", "option2" }; context.setAnswers("option1"); String result = context.question(options, "Which option?"); assertThat(result).isEqualTo("option1"); @@ -293,7 +293,7 @@ void testQuestionWithMultipleOptions() { @Test void testQuestionWithSingleOptionAndEmptyAnswer() { IdeTestContext context = newContext(PROJECT_BASIC, null, false); - String[] options = {"onlyOption"}; + String[] options = { "onlyOption" }; context.setAnswers(""); // Empty answer (Enter) String result = context.question(options, "Which option?"); assertThat(result).isEqualTo("onlyOption"); @@ -306,7 +306,7 @@ void testQuestionWithSingleToolVersionChoiceAndEmptyAnswer() { VersionIdentifier version = VersionIdentifier.of("17"); Cve cve = new Cve("CVE-2023-XXXX", 9.8, List.of(VersionRange.of("[17,18)"))); ToolVersionChoice choice = new ToolVersionChoice(new ToolEditionAndVersion(edition, version), "current", ToolVulnerabilities.of(List.of(cve))); - ToolVersionChoice[] options = {choice}; + ToolVersionChoice[] options = { choice }; context.setAnswers(""); // Empty answer (Enter) ToolVersionChoice result = context.question(options, "Which version?"); diff --git a/gui/pom.xml b/gui/pom.xml index fe87f3969c..7f4ca2ee50 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -30,7 +30,6 @@ ${project.groupId} ide-cli - tests ${project.version} test-jar test @@ -68,6 +67,14 @@ openjfx-monocle test + + + + org.wiremock + wiremock + 3.13.2 + test + diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index bb2ac5a280..1ee15816d0 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -20,7 +20,6 @@ import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.context.IdeGuiStateManager; -import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; /** * Basic UI Test diff --git a/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java similarity index 97% rename from gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java rename to gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java index 3b6f4a3019..d6850e22c3 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java +++ b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui.helper; +package com.devonfw.ide.gui; import static org.assertj.core.api.Assertions.assertThat; diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index 3dbfffd0e5..7668971ef7 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -1,32 +1,44 @@ package com.devonfw.ide.gui.context; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; /** * Tests for {@link IdeGuiStateManager}. */ -public class IdeGuiStateManagerTest { +public class IdeGuiStateManagerTest extends AbstractIdeContextTest { + + private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManagerTest.class); - @TempDir - private static Path mockIdeRoot; + private static IdeTestContext context; - private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); + private static IdeGuiStateManager guiStateManager; + private static ProjectManager projectManager; @BeforeAll - static void setup() throws IOException { + static void setup() throws FileNotFoundException { + + context = newContext("testProject", "project"); + LOG.warn("root: {}", context.getIdeRoot()); + + guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); + projectManager = guiStateManager.getProjectManager(); + } - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + @BeforeEach + void reset() { + IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); } @Test @@ -52,16 +64,16 @@ void testThrowsIfIdeRootDoesNotExist() { @Test void testGetContext() throws FileNotFoundException { - IdeGuiContext context = guiStateManager.switchContext("project-0", "main"); + IdeGuiContext context = guiStateManager.switchContext(projectManager.getProjectNames().getFirst(), "main"); assertThat(context).isNotNull().as("context was null after switchContext was called"); // When switching to a project, the context should be set. } @Test - void testSwitchContext() throws IOException { + void testSwitchContext() { - Files.list(mockIdeRoot).forEach((projectPath) -> { + projectManager.getProjectNames().forEach((projectName) -> { try { - guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); + guiStateManager.switchContext(projectName, "main"); } catch (FileNotFoundException e) { throw new RuntimeException(e); } @@ -71,7 +83,7 @@ void testSwitchContext() throws IOException { @Test void testThrowsIfNonExistentProjectSelected() { - Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); + Path fakeProject = context.getIdeRoot().resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); @@ -84,7 +96,7 @@ void testThrowsIfNonExistentProjectSelected() { @Test void testThrowsIfNonExistentWorkspaceSelected() throws IOException { - Files.list(mockIdeRoot).forEach((projectPath) -> { + Files.list(context.getIdeRoot()).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); } catch (FileNotFoundException e) { diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index e8c2eea6eb..98056cd77f 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -1,72 +1,44 @@ package com.devonfw.ide.gui.context; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; - import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; /** * Tests for the ProjectManager class. */ -public class ProjectManagerTest { +public class ProjectManagerTest extends AbstractIdeContextTest { private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); - private ProjectManager projectManager; - - @TempDir - private static Path mockIdeRoot; - - // Used in tests where we don't want to have any projects in the root directory - @TempDir - private Path emptyRootDir; + private static ProjectManager projectManager; - @BeforeAll - static void setup() throws IOException { - - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); - } + private static IdeTestContext context; + private static Path ideRoot; - //Before each test, we want to restore the default clean test folder structure @BeforeEach - void resetToDefault() { + void resetContext() { - try (var stream = Files.list(mockIdeRoot)) { - stream.forEach(p -> { - try { - if (Files.isDirectory(p)) { - FileUtils.deleteDirectory(p.toFile()); - } else if (Files.isRegularFile(p)) { - Files.delete(p); - } - } catch (Exception e) { - LOG.error("Error deleting file while resetting project structure: {}", p, e); - } - }); - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); - } catch (IOException e) { - LOG.error("Error walking through files while resetting project structure", e); - } + context = newContext("testProject", "project-0"); + ideRoot = context.getIdeRoot(); } @Test void testConstructorWithValidDirectory() { //No exception should be thrown - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); } @Test @@ -85,7 +57,7 @@ void testConstructorWithNonExistentDirectory() { try { - projectManager = new ProjectManager(mockIdeRoot.resolve("nonExistent")); + projectManager = new ProjectManager(ideRoot.resolve("nonExistent")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory does not exist"); @@ -96,17 +68,18 @@ void testConstructorWithNonExistentDirectory() { void testConstructorWithFile() throws IOException { try { - - File testFile = mockIdeRoot.resolve("testFile").toFile(); + File testFile = ideRoot.resolve("testFile").toFile(); boolean success = testFile.createNewFile(); if (!success) { throw new RuntimeException("Unable to create test file"); } - projectManager = new ProjectManager(mockIdeRoot.resolve("testFile")); + projectManager = new ProjectManager(ideRoot.resolve("testFile")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory is not a directory"); + } finally { + Files.deleteIfExists(ideRoot.resolve("testFile")); } } @@ -115,7 +88,8 @@ void testConstructorWithFile() throws IOException { @Test void testReadProjectsWithEmptyProjectDirectory() { - projectManager = new ProjectManager(emptyRootDir); + context = newContext("emptyProjects", ""); + projectManager = new ProjectManager(ideRoot); projectManager.refreshProjects(); assertThat(projectManager.getProjectNames()).isEmpty(); @@ -124,9 +98,9 @@ void testReadProjectsWithEmptyProjectDirectory() { @Test void testReadProjectsWithValidProjects() { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); - // FakeProjectFolderStructureHelper creates projects 0-5 + //test folder contains baseProject to project-5 assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") .containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); } @@ -135,67 +109,57 @@ void testReadProjectsWithValidProjects() { void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { // Create a project with underscore prefix - Path underscoreProject = mockIdeRoot.resolve("_project"); - Files.createDirectories(underscoreProject.resolve("workspaces")); + Path underscoreProject = ideRoot.resolve("_project"); + Files.createDirectories(underscoreProject); + Files.copy(ideRoot.resolve("project-0"), underscoreProject, StandardCopyOption.REPLACE_EXISTING); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should not include _project, same as _ide directory should be ignored assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); + + //clean up + Files.delete(underscoreProject); } @Test - void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() throws Exception { + void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() { - // Create a project directory without workspaces folder - Path projectWithoutWorkspaces = mockIdeRoot.resolve("projectNoWorkspaces"); - Files.createDirectory(projectWithoutWorkspaces); - - projectManager = new ProjectManager(mockIdeRoot); + context = newContext("noWorkspaces", "projectWithoutWorkspaces"); + projectManager = new ProjectManager(ideRoot); // Should not include projectNoWorkspaces - assertThat(projectManager.getProjectNames()).doesNotContain("projectNoWorkspaces").hasSize(6); + assertThat(projectManager.getProjectNames()).doesNotContain("projectWithoutWorkspaces"); } // ============ readWorkspaces() Tests ============ - @Test - void testReadWorkspacesEmpty() { - - projectManager = new ProjectManager(emptyRootDir); - - // No projects, so no workspaces - assertThat(projectManager.getWorkspaceNames("any-project")).isNull(); - } - @Test void testReadWorkspacesWithMultipleWorkspaces() throws Exception { - Path project = mockIdeRoot.resolve("project-0"); + Path project = ideRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); - // Create additional workspaces + // Create additional workspaces besides existing Files.createDirectory(workspacesDir.resolve("dev")); Files.createDirectory(workspacesDir.resolve("prod")); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should have main, dev, prod workspaces - assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(3) - .containsExactlyInAnyOrder("main", "dev", "prod"); + assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(4) + .containsExactlyInAnyOrder("main", "foo-test", "dev", "prod"); } @Test - void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { + void testReadWorkspacesEmptyWorkspaceDirectory() { - // Create a project with empty workspaces directory - Path emptyWorkspacesProject = mockIdeRoot.resolve("emptyWorkspacesProject"); - Files.createDirectories(emptyWorkspacesProject.resolve("workspaces")); + context = newContext("emptyWorkspaceFolders", "project-0"); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should return empty list for empty workspaces directory - assertThat(projectManager.getWorkspaceNames("emptyWorkspacesProject")).isEmpty(); + assertThat(projectManager.getWorkspaceNames("project-0")).isEmpty(); } // ============ refreshProjects() Tests ============ @@ -203,13 +167,13 @@ void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { @Test void testRefreshProjectsClearsExistingData() throws Exception { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Get initial projects assertThat(projectManager.getProjectNames()).hasSize(6); // Delete a project - try (var stream = Files.walk(mockIdeRoot.resolve("project-0"))) { + try (var stream = Files.walk(ideRoot.resolve("project-0"))) { stream.forEach(p -> { try { FileUtils.deleteDirectory(p.toFile()); @@ -228,70 +192,43 @@ void testRefreshProjectsClearsExistingData() throws Exception { @Test void testRefreshProjectsReloadsAll() throws Exception { - projectManager = new ProjectManager(emptyRootDir); + projectManager = new ProjectManager(ideRoot); assertThat(projectManager.getProjectNames()).isEmpty(); - Path newProject = emptyRootDir.resolve("newProject"); + Path newProject = ideRoot.resolve("newProject"); Files.createDirectories(newProject.resolve("workspaces").resolve("main")); projectManager.refreshProjects(); assertThat(projectManager.getProjectNames()).hasSize(1).contains("newProject"); - } - @Test - void testGetProjectNamesReturnsNotNull() { - - projectManager = new ProjectManager(emptyRootDir); - - assertThat(projectManager.getProjectNames()).isNotNull(); - } - - @Test - void testGetProjectNamesReturnsCorrectList() { - - projectManager = new ProjectManager(mockIdeRoot); - - assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); + //clean up + Files.delete(newProject); } @Test - void testGetWorkspaceNamesReturnsCorrectList() { + void testGetWorkspaceNamesReturnsValidList() { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); - assertThat(projectManager.getWorkspaceNames("project-0")).isNotNull().containsExactly("main"); + assertThat(projectManager.getWorkspaceNames("project-0")).containsExactly("foo-test", "main"); } @Test void testGetWorkspaceNamesWithInvalidProject() { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should return null for unknown project assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); } - //Just checks whether getting projects and workspaces works correctly in one go - @Test - void testCompleteWorkflow() { - - projectManager = new ProjectManager(mockIdeRoot); - - // Verify projects are loaded - assertThat(projectManager.getProjectNames()).hasSize(6); - - // Verify workspaces are loaded for each project - for (String projectName : projectManager.getProjectNames()) { - assertThat(projectManager.getWorkspaceNames(projectName)).isNotNull().contains("main"); - } - } @Test void testProjectWithMultipleWorkspaces() throws Exception { - Path project = mockIdeRoot.resolve("project-0"); + Path project = ideRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create multiple workspaces @@ -299,7 +236,7 @@ void testProjectWithMultipleWorkspaces() throws Exception { Files.createDirectory(workspacesDir.resolve(workspace)); } - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should have all workspaces including main assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) @@ -311,7 +248,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { // Create different workspace structures for different projects for (int i = 0; i < 6; i++) { - Path project = mockIdeRoot.resolve("project-" + i); + Path project = ideRoot.resolve("project-" + i); Path workspacesDir = project.resolve("workspaces"); // Add additional workspaces to each project @@ -320,7 +257,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { } } - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Verify each project has correct number of workspaces for (int i = 0; i < 6; i++) { @@ -330,22 +267,13 @@ void testMultipleProjectsWithWorkspaces() throws Exception { } } - @Test - void testConstructorCallsRefreshProjects() { - - projectManager = new ProjectManager(mockIdeRoot); - - // If refreshProjects is called in constructor, projects should be loaded immediately - assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); - } - @Test void testProjectNamesWithSpecialCharacters() throws Exception { - Path specialProject = mockIdeRoot.resolve("project-dash_underscore&"); + Path specialProject = ideRoot.resolve("project-dash_underscore&"); Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); } @@ -353,14 +281,14 @@ void testProjectNamesWithSpecialCharacters() throws Exception { @Test void testWorkspaceNamesWithSpecialCharacters() throws Exception { - Path project = mockIdeRoot.resolve("project-0"); + Path project = ideRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create workspaces with special characters Files.createDirectory(workspacesDir.resolve("dev-environment")); Files.createDirectory(workspacesDir.resolve("test_workspace")); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); assertThat(projectManager.getWorkspaceNames("project-0")) .contains("dev-environment", "test_workspace", "main"); diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/bin/ide b/gui/src/test/resources/ide-projects/testProject/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/software/readme b/gui/src/test/resources/ide-projects/testProject/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/readme b/gui/src/test/resources/ide-projects/testProject/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/readme b/gui/src/test/resources/ide-projects/testProject/project-0/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-0/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/setup b/gui/src/test/resources/ide-projects/testProject/project-0/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/readme b/gui/src/test/resources/ide-projects/testProject/project-1/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-1/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/setup b/gui/src/test/resources/ide-projects/testProject/project-1/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/readme b/gui/src/test/resources/ide-projects/testProject/project-2/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-2/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/setup b/gui/src/test/resources/ide-projects/testProject/project-2/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/readme b/gui/src/test/resources/ide-projects/testProject/project-3/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-3/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/setup b/gui/src/test/resources/ide-projects/testProject/project-3/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/readme b/gui/src/test/resources/ide-projects/testProject/project-4/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-4/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/setup b/gui/src/test/resources/ide-projects/testProject/project-4/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/readme b/gui/src/test/resources/ide-projects/testProject/project-5/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-5/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/setup b/gui/src/test/resources/ide-projects/testProject/project-5/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file From 9978ce9fcea2214cd279080c83776cb9ed712e6d Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 18:04:46 +0200 Subject: [PATCH 33/61] #1802: Updated UI logic to: - not automatically select a workspace - to seperate concerns of which functions update the workspace combobox and which the project combobox --- .../main/java/com/devonfw/ide/gui/App.java | 2 +- .../com/devonfw/ide/gui/MainController.java | 25 ++++++++----------- .../com/devonfw/ide/gui/main-view.fxml | 2 +- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 4809e232c9..f6f715fe7d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -31,7 +31,7 @@ public class App extends Application { public void start(Stage primaryStage) throws IOException { Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { - LOG.info("Uncaught exception in thread {}: {}", thread.getName(), throwable.getMessage(), throwable); + LOG.error("Uncaught exception in thread {}: {}", thread.getName(), throwable.getMessage(), throwable); Platform.runLater(() -> new IdeDialog(IdeDialog.AlertType.ERROR, throwable.getMessage()).showAndWait()); } ); diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 333ae4a494..8b0d42b6d3 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -13,7 +13,6 @@ import com.devonfw.ide.gui.context.IdeGuiStateManager; import com.devonfw.ide.gui.context.ProjectManager; import com.devonfw.ide.gui.modal.IdeDialog; -import com.devonfw.tools.ide.context.IdeContext; /** * Controller of the main screen of the dashboard GUI. @@ -88,7 +87,6 @@ private void openVsCode() { openIDE("vscode"); } - private void setProjectsComboBox() { assert (directoryPath != null) : "directoryPath is null! Please check the setup of your environment variables (IDE_ROOT)"; @@ -100,28 +98,27 @@ private void setProjectsComboBox() { selectedProject.setOnAction(actionEvent -> { - projectValue = Path.of(selectedProject.getValue()).resolve(IdeContext.FOLDER_WORKSPACES); + setWorkspaceComboBox(); + selectedWorkspace.setDisable(false); - androidStudioOpen.setDisable(false); - eclipseOpen.setDisable(false); - intellijOpen.setDisable(false); - vsCodeOpen.setDisable(false); - selectedWorkspace.setValue("main"); - this.workspaceValue = Path.of("main"); - updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); }); } - @FXML - private void setWorkspaceValue() { + private void setWorkspaceComboBox() { List workspaces = projectManager.getWorkspaceNames(selectedProject.getValue()); selectedWorkspace.getItems().clear(); selectedWorkspace.getItems().addAll(workspaces); - this.workspaceValue = Path.of(selectedWorkspace.getValue()); - updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + selectedWorkspace.setOnAction(actionEvent -> { + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + + androidStudioOpen.setDisable(false); + eclipseOpen.setDisable(false); + intellijOpen.setDisable(false); + vsCodeOpen.setDisable(false); + }); } private void openIDE(String inIde) { diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 6a19d8b517..7bcb75e3fb 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -40,7 +40,7 @@ From ac3a0457e6441edee7c654b04ccb693b38597ab1 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 18:52:43 +0200 Subject: [PATCH 34/61] #1802: cleaned up ProjectManagerTest, fixed AppBaseTest to follow new Select-Project-Then-Select-Workspace UI logic (previous commit) --- .../java/com/devonfw/ide/gui/AppBaseTest.java | 17 +- .../ide/gui/context/ProjectManagerTest.java | 239 +++++------------- .../ide-projects/emptyProjects/_ide/bin/ide | 2 - .../az/az/testVersion/.ide.software.version | 1 - .../emptyProjects/_ide/software/readme | 1 - .../urls/java/java/17.0.10/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 - .../urls/java/java/17.0.10/windows_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 - .../urls/java/java/17.0.6/windows_x64.urls | 1 - .../urls/java/java/21.0.8_9/linux_x64.urls | 1 - .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 - .../urls/java/java/21.0.8_9/windows_x64.urls | 1 - .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 - .../_ide/urls/mvn/mvn/3.0.5/urls | 1 - .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 - .../_ide/urls/mvn/mvn/3.1.0/urls | 1 - .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 - .../_ide/urls/mvn/mvn/3.2.1/urls | 1 - .../mvn/secondMvnEdition/3.2.1/status.json | 10 - .../emptyProjects/_ide/urls/readme | 1 - .../emptyWorkspaceFolders/_ide/bin/ide | 2 - .../az/az/testVersion/.ide.software.version | 1 - .../_ide/software/readme | 1 - .../urls/java/java/17.0.10/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 - .../urls/java/java/17.0.10/windows_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 - .../urls/java/java/17.0.6/windows_x64.urls | 1 - .../urls/java/java/21.0.8_9/linux_x64.urls | 1 - .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 - .../urls/java/java/21.0.8_9/windows_x64.urls | 1 - .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 - .../_ide/urls/mvn/mvn/3.0.5/urls | 1 - .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 - .../_ide/urls/mvn/mvn/3.1.0/urls | 1 - .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 - .../_ide/urls/mvn/mvn/3.2.1/urls | 1 - .../mvn/secondMvnEdition/3.2.1/status.json | 10 - .../emptyWorkspaceFolders/_ide/urls/readme | 1 - .../project-0/conf/ide.properties | 6 - .../project-0/home/.ide/ide.properties | 13 - .../eclipse/plugins/anyedit.properties | 3 - .../project-0/home/Downloads/ide/readme | 1 - .../project-0/home/readme | 1 - .../eclipse/plugins/anyedit.properties | 3 - .../eclipse/plugins/checkstyle.properties | 3 - .../project-0/settings/ide.properties | 9 - .../settings/workspace/update/.editorconfig | 0 .../emptyWorkspaceFolders/project-0/setup | 1 - .../project-0/software/java/bin/readme | 1 - .../software/mvn/.devon.software.version | 1 - .../project-0/software/mvn/bin/mvn | 5 - .../project-0/software/mvn/bin/readme | 1 - .../software/node/.ide.software.version | 1 - .../project-0/software/node/npm | 6 - .../ide-projects/noWorkspaces/_ide/bin/ide | 2 - .../az/az/testVersion/.ide.software.version | 1 - .../noWorkspaces/_ide/software/readme | 1 - .../urls/java/java/17.0.10/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 - .../urls/java/java/17.0.10/windows_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 - .../urls/java/java/17.0.6/windows_x64.urls | 1 - .../urls/java/java/21.0.8_9/linux_x64.urls | 1 - .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 - .../urls/java/java/21.0.8_9/windows_x64.urls | 1 - .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 - .../noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls | 1 - .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 - .../noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls | 1 - .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 - .../noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls | 1 - .../mvn/secondMvnEdition/3.2.1/status.json | 10 - .../noWorkspaces/_ide/urls/readme | 1 - .../conf/ide.properties | 6 - .../home/.ide/ide.properties | 13 - .../eclipse/plugins/anyedit.properties | 3 - .../home/Downloads/ide/readme | 1 - .../projectWithoutWorkspaces/home/readme | 1 - .../eclipse/plugins/anyedit.properties | 3 - .../eclipse/plugins/checkstyle.properties | 3 - .../settings/ide.properties | 9 - .../settings/workspace/update/.editorconfig | 0 .../projectWithoutWorkspaces/setup | 1 - .../software/java/bin/readme | 1 - .../software/mvn/.devon.software.version | 1 - .../software/mvn/bin/mvn | 5 - .../software/mvn/bin/readme | 1 - .../software/node/.ide.software.version | 1 - .../software/node/npm | 6 - 94 files changed, 67 insertions(+), 470 deletions(-) delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 1ee15816d0..bb2f9062ac 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -75,14 +75,14 @@ protected static void generateProjectFolderStructure() throws IOException { * This test ensures that all IDE open buttons are disabled when no project is selected. */ @Test - public void testIdeOpenButtonsDisabledWhenNoProjectSelected() { + public void testIdeOpenButtonsDisabledWhenNoWorkspaceSelected() { // assert that no project is selected - assertThat(selectedProject.getValue()).isNull(); + assertThat(selectedWorkspace.getValue()).isNull(); // assert all IDE open buttons are disabled for (Button button : new Button[] { androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen }) { - assertThat(button.isDisabled()).as(button.getId() + " button should be disabled when no project has been selected").isTrue(); + assertThat(button.isDisabled()).as(button.getId() + " button should be disabled when no workspace has been selected").isTrue(); } } @@ -90,14 +90,15 @@ public void testIdeOpenButtonsDisabledWhenNoProjectSelected() { * This test ensures that all IDE open buttons are enabled when a project is selected. */ @Test - public void testIdeOpenButtonsEnabledWhenProjectSelected() { + public void testIdeOpenButtonsEnabledWhenWorkspaceSelected() { - // assert that a project is selected + // assert that a project and workspace is selected interact(() -> selectedProject.getSelectionModel().select("project-1")); + interact(() -> selectedWorkspace.getSelectionModel().select("main")); - // assert all IDE open buttons are disabled + // assert all IDE open buttons are enabled for (Button button : new Button[] { androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen }) { - assertThat(!button.isDisabled()).as(button.getId() + " button should be enabled when a project has been selected").isTrue(); + assertThat(button.isDisabled()).as(button.getId() + " button should be enabled when a workspace has been selected").isFalse(); } } @@ -118,7 +119,7 @@ public void testWorkspaceComboBoxDisabledWhenNoProjectSelected() { * Tests that the workspace {@link ComboBox} is enabled when a project is selected. */ @Test - public void testWorkspaceComboboxEnabledEnabledWhenProjectSelected() { + public void testWorkspaceComboBoxEnabledEnabledWhenProjectSelected() { // assert that a project is selected interact(() -> selectedProject.getSelectionModel().select("project-1")); diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index 98056cd77f..6dec8d8451 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -4,9 +4,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.StandardCopyOption; +import java.util.stream.Stream; -import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; @@ -35,10 +34,15 @@ void resetContext() { } @Test - void testConstructorWithValidDirectory() { + void testProjectManagerFull() { - //No exception should be thrown projectManager = new ProjectManager(ideRoot); + + assertThat(projectManager).isNotNull(); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); + for (String projectName : projectManager.getProjectNames()) { + assertThat(projectManager.getWorkspaceNames(projectName)).containsExactlyInAnyOrder("foo-test", "main"); + } } @Test @@ -83,214 +87,87 @@ void testConstructorWithFile() throws IOException { } } - // ============ readProjects() Tests ============ - @Test - void testReadProjectsWithEmptyProjectDirectory() { + void testRefreshProjects() throws IOException { - context = newContext("emptyProjects", ""); projectManager = new ProjectManager(ideRoot); - projectManager.refreshProjects(); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); - assertThat(projectManager.getProjectNames()).isEmpty(); - } + Path project0 = ideRoot.resolve("project-0"); + Path project6 = ideRoot.resolve("project-6"); + copyDirectory(project0, project6); - @Test - void testReadProjectsWithValidProjects() { + projectManager.refreshProjects(); - projectManager = new ProjectManager(ideRoot); + // Verify that project-6 is now recognized + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5", + "project-6"); + assertThat(projectManager.getWorkspaceNames("project-6")).containsExactlyInAnyOrder("foo-test", "main"); - //test folder contains baseProject to project-5 - assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") - .containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); + // Cleanup + deleteDirectory(project6); } @Test - void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { + void testReadProjectsExcludesFoldersWithoutWorkspaces() throws IOException { - // Create a project with underscore prefix - Path underscoreProject = ideRoot.resolve("_project"); - Files.createDirectories(underscoreProject); - Files.copy(ideRoot.resolve("project-0"), underscoreProject, StandardCopyOption.REPLACE_EXISTING); + // Create a project folder without a workspaces subdirectory + Path testProject = ideRoot.resolve("test-project-no-workspaces"); + Files.createDirectory(testProject); projectManager = new ProjectManager(ideRoot); - // Should not include _project, same as _ide directory should be ignored - assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); + // Verify that test-project-no-workspaces is not recognized + assertThat(projectManager.getProjectNames()).doesNotContain("test-project-no-workspaces"); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); - //clean up - Files.delete(underscoreProject); + // Cleanup + deleteDirectory(testProject); } @Test - void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() { + void testReadProjectsExcludesUnderscorePrefixedFolders() { - context = newContext("noWorkspaces", "projectWithoutWorkspaces"); projectManager = new ProjectManager(ideRoot); - // Should not include projectNoWorkspaces - assertThat(projectManager.getProjectNames()).doesNotContain("projectWithoutWorkspaces"); + // Verify that _ide folder is not in the project names + assertThat(projectManager.getProjectNames()).doesNotContain("_ide"); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); } - // ============ readWorkspaces() Tests ============ - - @Test - void testReadWorkspacesWithMultipleWorkspaces() throws Exception { - - Path project = ideRoot.resolve("project-0"); - Path workspacesDir = project.resolve("workspaces"); - - // Create additional workspaces besides existing - Files.createDirectory(workspacesDir.resolve("dev")); - Files.createDirectory(workspacesDir.resolve("prod")); - - projectManager = new ProjectManager(ideRoot); - - // Should have main, dev, prod workspaces - assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(4) - .containsExactlyInAnyOrder("main", "foo-test", "dev", "prod"); - } - - @Test - void testReadWorkspacesEmptyWorkspaceDirectory() { - - context = newContext("emptyWorkspaceFolders", "project-0"); - - projectManager = new ProjectManager(ideRoot); - - // Should return empty list for empty workspaces directory - assertThat(projectManager.getWorkspaceNames("project-0")).isEmpty(); - } + private void copyDirectory(Path source, Path destination) throws IOException { - // ============ refreshProjects() Tests ============ - - @Test - void testRefreshProjectsClearsExistingData() throws Exception { - - projectManager = new ProjectManager(ideRoot); - - // Get initial projects - assertThat(projectManager.getProjectNames()).hasSize(6); - - // Delete a project - try (var stream = Files.walk(ideRoot.resolve("project-0"))) { - stream.forEach(p -> { + Files.createDirectory(destination); + try (Stream stream = Files.list(source)) { + stream.forEach(sourcePath -> { try { - FileUtils.deleteDirectory(p.toFile()); - } catch (Exception e) { - fail("Error deleting project for test case: {}", p, e); + if (Files.isDirectory(sourcePath)) { + copyDirectory(sourcePath, destination.resolve(sourcePath.getFileName())); + } else { + Files.copy(sourcePath, destination.resolve(sourcePath.getFileName())); + } + } catch (IOException e) { + throw new RuntimeException("Failed to copy directory", e); } }); } - - // Refresh should clear old data and reload - projectManager.refreshProjects(); - - assertThat(projectManager.getProjectNames()).hasSize(5).doesNotContain("project-0"); - } - - @Test - void testRefreshProjectsReloadsAll() throws Exception { - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getProjectNames()).isEmpty(); - - Path newProject = ideRoot.resolve("newProject"); - Files.createDirectories(newProject.resolve("workspaces").resolve("main")); - - projectManager.refreshProjects(); - - assertThat(projectManager.getProjectNames()).hasSize(1).contains("newProject"); - - //clean up - Files.delete(newProject); - } - - @Test - void testGetWorkspaceNamesReturnsValidList() { - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getWorkspaceNames("project-0")).containsExactly("foo-test", "main"); - } - - @Test - void testGetWorkspaceNamesWithInvalidProject() { - - projectManager = new ProjectManager(ideRoot); - - // Should return null for unknown project - assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); - } - - - @Test - void testProjectWithMultipleWorkspaces() throws Exception { - - Path project = ideRoot.resolve("project-0"); - Path workspacesDir = project.resolve("workspaces"); - - // Create multiple workspaces - for (String workspace : new String[] { "dev", "test", "staging", "production" }) { - Files.createDirectory(workspacesDir.resolve(workspace)); - } - - projectManager = new ProjectManager(ideRoot); - - // Should have all workspaces including main - assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) - .contains("main", "dev", "test", "staging", "production"); } - @Test - void testMultipleProjectsWithWorkspaces() throws Exception { + private void deleteDirectory(Path directory) throws IOException { - // Create different workspace structures for different projects - for (int i = 0; i < 6; i++) { - Path project = ideRoot.resolve("project-" + i); - Path workspacesDir = project.resolve("workspaces"); - - // Add additional workspaces to each project - for (int j = 1; j <= i; j++) { - Files.createDirectory(workspacesDir.resolve("workspace-" + j)); - } - } - - projectManager = new ProjectManager(ideRoot); - - // Verify each project has correct number of workspaces - for (int i = 0; i < 6; i++) { - String projectName = "project-" + i; - // Each project has "main" + i additional workspaces - assertThat(projectManager.getWorkspaceNames(projectName)).hasSize(i + 1); + try (Stream stream = Files.list(directory)) { + stream.forEach(path -> { + try { + if (Files.isDirectory(path)) { + deleteDirectory(path); + } else { + Files.delete(path); + } + } catch (IOException e) { + throw new RuntimeException("Failed to delete directory", e); + } + }); } - } - - @Test - void testProjectNamesWithSpecialCharacters() throws Exception { - - Path specialProject = ideRoot.resolve("project-dash_underscore&"); - Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); - } - - @Test - void testWorkspaceNamesWithSpecialCharacters() throws Exception { - - Path project = ideRoot.resolve("project-0"); - Path workspacesDir = project.resolve("workspaces"); - - // Create workspaces with special characters - Files.createDirectory(workspacesDir.resolve("dev-environment")); - Files.createDirectory(workspacesDir.resolve("test_workspace")); - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getWorkspaceNames("project-0")) - .contains("dev-environment", "test_workspace", "main"); + Files.delete(directory); } } diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide deleted file mode 100644 index 01f20642fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version deleted file mode 100644 index 62ec2f6393..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -testVersion diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme deleted file mode 100644 index c5be1dc4fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme +++ /dev/null @@ -1 +0,0 @@ -this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls deleted file mode 100644 index 979afbc06f..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls deleted file mode 100644 index 1697e0ff2d..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls deleted file mode 100644 index e43fbf1dc6..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls deleted file mode 100644 index f500d7d6f5..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls deleted file mode 100644 index 36094258c3..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls deleted file mode 100644 index 8c9ad7e518..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls deleted file mode 100644 index 2f0e744d44..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls deleted file mode 100644 index e2c2050871..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls deleted file mode 100644 index 81e4b0c021..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls deleted file mode 100644 index 2d5a377122..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls deleted file mode 100644 index 10aea51a47..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls deleted file mode 100644 index 82d63fe842..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme deleted file mode 100644 index befcdfa755..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide deleted file mode 100644 index 01f20642fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version deleted file mode 100644 index 62ec2f6393..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -testVersion diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme deleted file mode 100644 index c5be1dc4fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme +++ /dev/null @@ -1 +0,0 @@ -this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls deleted file mode 100644 index 979afbc06f..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls deleted file mode 100644 index 1697e0ff2d..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls deleted file mode 100644 index e43fbf1dc6..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls deleted file mode 100644 index f500d7d6f5..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls deleted file mode 100644 index 36094258c3..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls deleted file mode 100644 index 8c9ad7e518..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls deleted file mode 100644 index 2f0e744d44..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls deleted file mode 100644 index e2c2050871..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls deleted file mode 100644 index 81e4b0c021..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls deleted file mode 100644 index 2d5a377122..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls deleted file mode 100644 index 10aea51a47..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls deleted file mode 100644 index 82d63fe842..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme deleted file mode 100644 index befcdfa755..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties deleted file mode 100644 index c041e43ae1..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties +++ /dev/null @@ -1,6 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables defined by the user -#******************************************************************************** -M2_REPO=~/.m2/repository -MVN_VERSION=3.9.1 -SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties deleted file mode 100644 index c532faa1aa..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties +++ /dev/null @@ -1,13 +0,0 @@ -#******************************************************************************** -# This file contains the global configuration from the user HOME directory. -#******************************************************************************** -DOCKER_EDITION=docker -FOO=foo-${BAR} -TEST_ARGS1=${TEST_ARGS1} user1 -TEST_ARGS2=${TEST_ARGS2} user2 -TEST_ARGS3=${TEST_ARGS3} user3 -TEST_ARGS7=user7 -TEST_ARGS10=user10 -TEST_ARGSb=userb -TEST_ARGSc=${TEST_ARGS1} userc -TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index eb298f3bbc..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=false diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme deleted file mode 100644 index f0dc29025a..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme deleted file mode 100644 index 5e8bc178cf..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme +++ /dev/null @@ -1 +0,0 @@ -this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index 09a94b1160..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties deleted file mode 100644 index 6e402c7c5d..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://checkstyle.org/eclipse-cs-update-site -plugin_id=net.sf.eclipsecs.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties deleted file mode 100644 index 1ccf228f98..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties +++ /dev/null @@ -1,9 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables -#******************************************************************************** -JAVA_VERSION=17* -MVN_VERSION=3.9.0 -ECLIPSE_VERSION=2023-03 -INTELLIJ_EDITION=ultimate -IDE_TOOLS=mvn,eclipse -BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup deleted file mode 100644 index 9c5d4b1be1..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup +++ /dev/null @@ -1 +0,0 @@ -just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme deleted file mode 100644 index 7146c2ad6c..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version deleted file mode 100644 index e0d61b5b06..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version +++ /dev/null @@ -1 +0,0 @@ -3.9.4 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn deleted file mode 100644 index 4a97b4f4a1..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -if [ "$1" == "-h" ]; then - echo "usage: mvn [options] [] []" -fi -echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme deleted file mode 100644 index 2d2cc36674..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version deleted file mode 100644 index 0c4da74167..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -17.0.6 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm deleted file mode 100644 index b547b61509..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -echo "npm $*" - -if [ "$*" == "list -g npm --depth=0" ]; then - echo "11.0.0" -fi diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide deleted file mode 100644 index 01f20642fd..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version deleted file mode 100644 index 62ec2f6393..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -testVersion diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme deleted file mode 100644 index c5be1dc4fd..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme +++ /dev/null @@ -1 +0,0 @@ -this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls deleted file mode 100644 index 979afbc06f..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls deleted file mode 100644 index 1697e0ff2d..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls deleted file mode 100644 index e43fbf1dc6..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls deleted file mode 100644 index f500d7d6f5..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls deleted file mode 100644 index 36094258c3..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls deleted file mode 100644 index 8c9ad7e518..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls deleted file mode 100644 index 2f0e744d44..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls deleted file mode 100644 index e2c2050871..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls deleted file mode 100644 index 81e4b0c021..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls deleted file mode 100644 index 2d5a377122..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls deleted file mode 100644 index 10aea51a47..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls deleted file mode 100644 index 82d63fe842..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme deleted file mode 100644 index befcdfa755..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties deleted file mode 100644 index c041e43ae1..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties +++ /dev/null @@ -1,6 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables defined by the user -#******************************************************************************** -M2_REPO=~/.m2/repository -MVN_VERSION=3.9.1 -SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties deleted file mode 100644 index c532faa1aa..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties +++ /dev/null @@ -1,13 +0,0 @@ -#******************************************************************************** -# This file contains the global configuration from the user HOME directory. -#******************************************************************************** -DOCKER_EDITION=docker -FOO=foo-${BAR} -TEST_ARGS1=${TEST_ARGS1} user1 -TEST_ARGS2=${TEST_ARGS2} user2 -TEST_ARGS3=${TEST_ARGS3} user3 -TEST_ARGS7=user7 -TEST_ARGS10=user10 -TEST_ARGSb=userb -TEST_ARGSc=${TEST_ARGS1} userc -TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index eb298f3bbc..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=false diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme deleted file mode 100644 index f0dc29025a..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme deleted file mode 100644 index 5e8bc178cf..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme +++ /dev/null @@ -1 +0,0 @@ -this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index 09a94b1160..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties deleted file mode 100644 index 6e402c7c5d..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://checkstyle.org/eclipse-cs-update-site -plugin_id=net.sf.eclipsecs.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties deleted file mode 100644 index 1ccf228f98..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties +++ /dev/null @@ -1,9 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables -#******************************************************************************** -JAVA_VERSION=17* -MVN_VERSION=3.9.0 -ECLIPSE_VERSION=2023-03 -INTELLIJ_EDITION=ultimate -IDE_TOOLS=mvn,eclipse -BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup deleted file mode 100644 index 9c5d4b1be1..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup +++ /dev/null @@ -1 +0,0 @@ -just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme deleted file mode 100644 index 7146c2ad6c..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version deleted file mode 100644 index e0d61b5b06..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version +++ /dev/null @@ -1 +0,0 @@ -3.9.4 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn deleted file mode 100644 index 4a97b4f4a1..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -if [ "$1" == "-h" ]; then - echo "usage: mvn [options] [] []" -fi -echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme deleted file mode 100644 index 2d2cc36674..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version deleted file mode 100644 index 0c4da74167..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -17.0.6 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm deleted file mode 100644 index b547b61509..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -echo "npm $*" - -if [ "$*" == "list -g npm --depth=0" ]; then - echo "11.0.0" -fi From 6c444329e7a2997e27b8d5dd4cf532470973c167 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 18:58:06 +0200 Subject: [PATCH 35/61] #1802: cleaned up IdeGuiStateManagerTest --- .../gui/context/IdeGuiStateManagerTest.java | 25 +++++++++++-------- .../ide/gui/context/ProjectManagerTest.java | 4 --- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index 7668971ef7..ac374dc3e7 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -29,8 +30,8 @@ public class IdeGuiStateManagerTest extends AbstractIdeContextTest { @BeforeAll static void setup() throws FileNotFoundException { - context = newContext("testProject", "project"); - LOG.warn("root: {}", context.getIdeRoot()); + context = newContext("testProject", "project-0"); + LOG.debug("root: {}", context.getIdeRoot()); guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); projectManager = guiStateManager.getProjectManager(); @@ -96,14 +97,18 @@ void testThrowsIfNonExistentProjectSelected() { @Test void testThrowsIfNonExistentWorkspaceSelected() throws IOException { - Files.list(context.getIdeRoot()).forEach((projectPath) -> { - try { - guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); - } catch (FileNotFoundException e) { - assertThat(e.getMessage()).contains("Workspace " + projectPath.resolve("workspaces").resolve("test") + " does not exist!") - .as("GuiStateManager.switchContext should throw an exception, if a non-existent workspace is selected"); - } - }); + try (Stream stream = Files.list(context.getIdeRoot())) { + stream.forEach((projectPath) -> { + Path fakeWorkspacePath = projectPath.resolve("workspaces").resolve("nonExistingWorkspace"); + + try { + guiStateManager.switchContext(projectPath.getFileName().toString(), fakeWorkspacePath.getFileName().toString()); + } catch (FileNotFoundException e) { + assertThat(e.getMessage()).contains("Workspace " + fakeWorkspacePath + " does not exist!") + .as("GuiStateManager.switchContext should throw an exception, if a non-existent workspace is selected"); + } + }); + } } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index 6dec8d8451..6ce2ce13aa 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -8,8 +8,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.devonfw.tools.ide.context.AbstractIdeContextTest; import com.devonfw.tools.ide.context.IdeTestContext; @@ -19,8 +17,6 @@ */ public class ProjectManagerTest extends AbstractIdeContextTest { - private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); - private static ProjectManager projectManager; private static IdeTestContext context; From 1e8b556ed7c05f10d17804ce026a46902be5b0fc Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 19:46:53 +0200 Subject: [PATCH 36/61] #1802: cleaned up ProjectManagerTest to use FileUtils instead of own implementation --- .../ide/gui/context/ProjectManagerTest.java | 44 ++----------------- 1 file changed, 4 insertions(+), 40 deletions(-) diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index 6ce2ce13aa..8408abe892 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -4,8 +4,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.stream.Stream; +import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -91,7 +91,7 @@ void testRefreshProjects() throws IOException { Path project0 = ideRoot.resolve("project-0"); Path project6 = ideRoot.resolve("project-6"); - copyDirectory(project0, project6); + FileUtils.copyDirectory(project0.toFile(), project6.toFile()); projectManager.refreshProjects(); @@ -101,7 +101,7 @@ void testRefreshProjects() throws IOException { assertThat(projectManager.getWorkspaceNames("project-6")).containsExactlyInAnyOrder("foo-test", "main"); // Cleanup - deleteDirectory(project6); + FileUtils.deleteDirectory(project0.toFile()); } @Test @@ -118,7 +118,7 @@ void testReadProjectsExcludesFoldersWithoutWorkspaces() throws IOException { assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); // Cleanup - deleteDirectory(testProject); + FileUtils.deleteDirectory(testProject.toFile()); } @Test @@ -130,40 +130,4 @@ void testReadProjectsExcludesUnderscorePrefixedFolders() { assertThat(projectManager.getProjectNames()).doesNotContain("_ide"); assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); } - - private void copyDirectory(Path source, Path destination) throws IOException { - - Files.createDirectory(destination); - try (Stream stream = Files.list(source)) { - stream.forEach(sourcePath -> { - try { - if (Files.isDirectory(sourcePath)) { - copyDirectory(sourcePath, destination.resolve(sourcePath.getFileName())); - } else { - Files.copy(sourcePath, destination.resolve(sourcePath.getFileName())); - } - } catch (IOException e) { - throw new RuntimeException("Failed to copy directory", e); - } - }); - } - } - - private void deleteDirectory(Path directory) throws IOException { - - try (Stream stream = Files.list(directory)) { - stream.forEach(path -> { - try { - if (Files.isDirectory(path)) { - deleteDirectory(path); - } else { - Files.delete(path); - } - } catch (IOException e) { - throw new RuntimeException("Failed to delete directory", e); - } - }); - } - Files.delete(directory); - } } From 2d293f06f92d3dc1012cebdbb1f858f1b5ec8d2e Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 8 May 2026 17:01:24 +0200 Subject: [PATCH 37/61] #1784: improved seperation of concerns in TaskOverviewWindow, added displaying of indeterminate progress bars, Progress task titles are now being updated properly. --- .../main/java/com/devonfw/ide/gui/App.java | 27 +++++++++++++- .../com/devonfw/ide/gui/MainController.java | 16 ++++---- .../ide/gui/context/IdeGuiContext.java | 9 +++++ .../gui/progress/GuiProgressBarHandling.java | 24 ++---------- .../devonfw/ide/gui/progress/TaskManager.java | 23 +++--------- .../TaskOverviewWindowController.java | 21 +++++++---- .../taskwindow/TaskWindowCellFactory.java | 37 +++++++++++++------ .../com/devonfw/ide/gui/main-view.fxml | 1 + 8 files changed, 92 insertions(+), 66 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 3b43bfffec..efd4cb07b7 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -6,6 +6,7 @@ import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; +import javafx.scene.control.ButtonType; import javafx.scene.image.Image; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; @@ -14,6 +15,7 @@ import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.modal.IdeDialog; +import com.devonfw.ide.gui.progress.TaskManager; import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.version.IdeVersion; @@ -30,7 +32,8 @@ public class App extends Application { public void start(Stage primaryStage) throws IOException { Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { - LOG.error("Uncaught exception in thread {}: {}", thread.getName(), throwable.getMessage(), throwable); + System.out.println("Uncaught exception in thread " + thread.getName() + ":" + throwable.getMessage()); + throwable.printStackTrace(); Platform.runLater(() -> new IdeDialog(IdeDialog.AlertType.ERROR, throwable.getMessage()).showAndWait()); } ); @@ -49,6 +52,28 @@ public void start(Stage primaryStage) throws IOException { primaryStage.setMinWidth(scene.getWidth()); primaryStage.setMinHeight(scene.getHeight()); primaryStage.show(); + + primaryStage.setOnCloseRequest(event -> { + LOG.info("Closing application"); + if (!TaskManager.getInstance().getTasks().isEmpty()) { + IdeDialog closeConfirm = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, "There are still running tasks. Are you sure you want to exit?", + ButtonType.CLOSE, ButtonType.CANCEL); + closeConfirm.showAndWait().ifPresent(response -> { + if (response == ButtonType.CLOSE) { + exitApplication(); + } else { + event.consume(); + } + }); + } else { + exitApplication(); + } + }); + } + + private void exitApplication() { + Platform.exit(); + System.exit(0); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index c5789880ef..d291d1ab0f 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -1,11 +1,8 @@ package com.devonfw.ide.gui; import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import java.util.stream.Stream; import javafx.application.Platform; import javafx.concurrent.Task; import javafx.fxml.FXML; @@ -24,7 +21,6 @@ import com.devonfw.ide.gui.progress.TaskManager; import com.devonfw.ide.gui.progress.TaskManager.ProgressListener; import com.devonfw.ide.gui.progress.taskwindow.TaskOverviewWindow; -import com.devonfw.tools.ide.context.IdeContext; /** * Controller of the main screen of the dashboard GUI. @@ -151,8 +147,9 @@ private void openIDE(String inIde) { } private static Task runIdeCommandTask(String inIde) { + GuiProgressBarHandling task = (GuiProgressBarHandling) IdeGuiStateManager.getInstance().getCurrentContext() - .newProgressBar("Starting " + inIde, 1, "Task", 1); + .newProgressBarIndeterminate("Starting " + inIde); Task downloadTask = new Task<>() { @Override protected Void call() { @@ -177,6 +174,7 @@ protected Void call() { } private void updateContext(String selectedProjectName, String selectedWorkspaceName) { + try { IdeGuiStateManager.getInstance().switchContext(selectedProjectName, selectedWorkspaceName); } catch (FileNotFoundException e) { @@ -225,15 +223,15 @@ public void onProgressTaskUpdated(GuiProgressBarHandling task, long stepPosition } @Override - public void onProgressTaskAdded(List updatedTaskList) { + public void onProgressTaskAdded(GuiProgressBarHandling task) { - updateStatusLabel(updatedTaskList); + updateStatusLabel(TaskManager.getInstance().getTasks()); } @Override - public void onProgressTaskRemoved(List updatedTaskList) { + public void onProgressTaskRemoved(GuiProgressBarHandling task) { - updateStatusLabel(updatedTaskList); + updateStatusLabel(TaskManager.getInstance().getTasks()); } private void updateStatusLabel(List taskList) { diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java index 806bdc68e5..5c263ac41f 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java @@ -35,4 +35,13 @@ public IdeProgressBar newProgressBar(String title, long size, String unitName, l return new GuiProgressBarHandling(UUID.randomUUID().toString(), title, size, unitName, unitSize); } + + /** + * @param title the title of the progress bar + * @return a progress bar implementation that is indeterminate + */ + public IdeProgressBar newProgressBarIndeterminate(String title) { + + return new GuiProgressBarHandling(UUID.randomUUID().toString(), title); + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java index 9e0ed52b64..84624aafdc 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java @@ -1,8 +1,6 @@ package com.devonfw.ide.gui.progress; import java.util.logging.Logger; -import javafx.beans.property.DoubleProperty; -import javafx.beans.property.SimpleDoubleProperty; import com.devonfw.tools.ide.io.AbstractIdeProgressBar; @@ -16,8 +14,6 @@ public class GuiProgressBarHandling extends AbstractIdeProgressBar { private boolean isIndeterminate = false; private String taskId = ""; - private final DoubleProperty progressProperty = new SimpleDoubleProperty(getCurrentProgress()); - public GuiProgressBarHandling(String taskId, String title, long maxSize, String unitName, long unitSize) { super(title, maxSize, unitName, unitSize); @@ -30,31 +26,23 @@ public GuiProgressBarHandling(String taskId, String title, long maxSize, String * * @param title the title of the progress bar */ - public GuiProgressBarHandling(String title) { + public GuiProgressBarHandling(String taskId, String title) { super(title, 100, "%", 1); this.isIndeterminate = true; + this.taskId = taskId; TaskManager.getInstance().addTask(this); } - @Override - public void stepBy(long stepSize) { - super.stepBy(stepSize); - } - protected void doStepBy(long stepSize, long currentProgress) { - // TODO review if there is a better way to implement this + LOG.info("Updating progress bar to " + currentProgress); - this.progressProperty.set((double) (currentProgress + stepSize) / maxSize); - LOG.info("Updating progress bar to " + this.progressProperty.get()); TaskManager.getInstance().updateTask(this, currentProgress + stepSize); } protected void doStepTo(long stepPosition) { - // TODO review if there is a better way to implement this + LOG.info("Updating progress bar to " + getCurrentProgress()); - this.progressProperty.set((double) getCurrentProgress() / maxSize); - LOG.info("Updating progress bar to " + this.progressProperty.get()); TaskManager.getInstance().updateTask(this, stepPosition); } @@ -83,8 +71,4 @@ public void setIndeterminate(boolean indeterminate) { public String getTaskId() { return taskId; } - - public DoubleProperty progressProperty() { - return progressProperty; - } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java index 0129ab2a95..37ee426485 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java @@ -43,18 +43,7 @@ public void addTask(GuiProgressBarHandling task) { }); tasks.add(task); Platform.runLater(() -> - listeners.forEach(listener -> listener.onProgressTaskAdded(tasks)) - ); - } - - /** - * @param taskId the ID of the task to be removed from the list of tasks. - */ - public void removeTask(String taskId) { - - tasks.stream().filter(task -> task.getTaskId() == taskId).findFirst().ifPresent(tasks::remove); - Platform.runLater(() -> - listeners.forEach(listener -> listener.onProgressTaskRemoved(tasks)) + listeners.forEach(listener -> listener.onProgressTaskAdded(task)) ); } @@ -62,7 +51,7 @@ public void removeTask(GuiProgressBarHandling task) { tasks.remove(task); Platform.runLater(() -> - listeners.forEach(listener -> listener.onProgressTaskRemoved(tasks)) + listeners.forEach(listener -> listener.onProgressTaskRemoved(task)) ); } @@ -94,13 +83,13 @@ public interface ProgressListener { void onProgressTaskUpdated(GuiProgressBarHandling task, long stepPosition); /** - * @param updatedTaskList the updated list of tasks after a task was added + * @param task task that was added */ - void onProgressTaskAdded(List updatedTaskList); + void onProgressTaskAdded(GuiProgressBarHandling task); /** - * @param updatedTaskList the updated list of tasks after a task was removed + * @param task task that was removed */ - void onProgressTaskRemoved(List updatedTaskList); + void onProgressTaskRemoved(GuiProgressBarHandling task); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java index eacd67d8da..05bff8ef32 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java @@ -1,6 +1,6 @@ package com.devonfw.ide.gui.progress.taskwindow; -import java.util.List; +import java.util.Objects; import javafx.fxml.FXML; import javafx.scene.control.ListView; @@ -15,10 +15,11 @@ public class TaskOverviewWindowController implements ProgressListener { @FXML public ListView taskList; + private TaskManager taskManager = TaskManager.getInstance(); public TaskOverviewWindowController() { - TaskManager.getInstance().addListener(this); + taskManager.addListener(this); } @FXML @@ -31,18 +32,24 @@ private void initialize() { @Override public void onProgressTaskUpdated(GuiProgressBarHandling updatedTask, long stepPosition) { - // No need to update the list, as the progress bars are bound to the task properties and will update automatically. + taskList.getItems().stream() + .filter(task -> Objects.equals(task.getTaskId(), updatedTask.getTaskId())) + .findFirst() + .ifPresent(task -> { + int index = taskList.getItems().indexOf(task); + taskList.getItems().set(index, updatedTask); + }); } @Override - public void onProgressTaskAdded(List updatedTaskList) { + public void onProgressTaskAdded(GuiProgressBarHandling task) { - taskList.getItems().setAll(TaskManager.getInstance().getTasks()); + taskList.getItems().setAll(taskManager.getTasks()); } @Override - public void onProgressTaskRemoved(List updatedTaskList) { + public void onProgressTaskRemoved(GuiProgressBarHandling task) { - taskList.getItems().setAll(TaskManager.getInstance().getTasks()); + taskList.getItems().setAll(taskManager.getTasks()); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java index 152503e3b9..c196348a8a 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java @@ -12,6 +12,9 @@ import com.devonfw.ide.gui.progress.GuiProgressBarHandling; +/** + * Cell factory for displaying a list of tasks in the {@link TaskOverviewWindow} + */ public class TaskWindowCellFactory implements Callback, ListCell> { @Override @@ -19,34 +22,44 @@ public ListCell call(ListView pa return new ListCell<>() { final ProgressBar progressBar = new ProgressBar(); + final Label titleLabel = new Label(); + final VBox contentBox = new VBox(5, titleLabel, progressBar); + + final HBox root = new HBox(10, contentBox); + + { + HBox.setHgrow(contentBox, Priority.ALWAYS); + root.setAlignment(Pos.CENTER_LEFT); + } @Override public void updateItem(GuiProgressBarHandling progressTask, boolean empty) { - progressBar.progressProperty().unbind(); - - super.updateItem(progressTask, empty); if (empty || progressTask == null) { setText(null); setGraphic(null); } else { + System.out.println("update cell"); - Label titleLabel = new Label(String.format("%s [%d/%d %s]", progressTask.getTitle(), progressTask.getCurrentProgress(), progressTask.getMaxSize(), - progressTask.getUnitName())); + titleLabel.setText( + getLabelValueFormatted(progressTask.getTitle(), progressTask.getCurrentProgress(), progressTask.getMaxSize(), progressTask.getUnitName())); - progressBar.setMaxWidth(Double.MAX_VALUE); - progressBar.progressProperty().bind(progressTask.progressProperty()); + if (progressTask.isIndeterminate() && !progressBar.isIndeterminate()) { + progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS); + } else if (!progressTask.isIndeterminate()) { + progressBar.setProgress((double) progressTask.getCurrentProgress() / progressTask.getMaxSize()); + } - VBox contentBox = new VBox(5, titleLabel, progressBar); - HBox.setHgrow(contentBox, Priority.ALWAYS); - - HBox root = new HBox(10, contentBox); - root.setAlignment(Pos.CENTER_LEFT); + progressBar.setMaxWidth(Double.MAX_VALUE); setGraphic(root); } } }; } + + private String getLabelValueFormatted(String title, long _currentProgress, long maxSize, String unitName) { + return String.format("%s [%d/%d %s]", title, _currentProgress, maxSize, unitName); + } } diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 8eb3c38466..225c27cf42 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -11,6 +11,7 @@ + From 860ac8565ece3cbd19bf5999d006a4adbd2b04f3 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Mon, 11 May 2026 18:42:34 +0200 Subject: [PATCH 38/61] #1784: small fixes --- cli/src/main/java/com/devonfw/tools/ide/tool/gui/Gui.java | 2 +- .../gui/progress/taskwindow/TaskWindowCellFactory.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/gui/Gui.java b/cli/src/main/java/com/devonfw/tools/ide/tool/gui/Gui.java index af207ed6d0..144f37d6a3 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/gui/Gui.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/gui/Gui.java @@ -62,7 +62,7 @@ protected void doRun() { Mvn mvn = context.getCommandletManager().getCommandlet(Mvn.class); - Path pomPath = context.getIdeInstallationPath().resolve("gui/pom.xml"); + Path pomPath = context.getIdeInstallationPath().resolve("gui").resolve("pom.xml"); if (!Files.exists(pomPath)) { LOG.error("Fatal error: The pom.xml file required for launching the IDEasy GUI could not be found in expected location: {}", pomPath); return; diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java index c196348a8a..8988fac7dc 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java @@ -10,6 +10,9 @@ import javafx.scene.layout.VBox; import javafx.util.Callback; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.devonfw.ide.gui.progress.GuiProgressBarHandling; /** @@ -17,6 +20,8 @@ */ public class TaskWindowCellFactory implements Callback, ListCell> { + private static final Logger LOG = LoggerFactory.getLogger(TaskWindowCellFactory.class); + @Override public ListCell call(ListView param) { return new ListCell<>() { @@ -36,11 +41,10 @@ public ListCell call(ListView pa public void updateItem(GuiProgressBarHandling progressTask, boolean empty) { if (empty || progressTask == null) { - setText(null); setGraphic(null); } else { - System.out.println("update cell"); + LOG.debug("update cell"); titleLabel.setText( getLabelValueFormatted(progressTask.getTitle(), progressTask.getCurrentProgress(), progressTask.getMaxSize(), progressTask.getUnitName())); From dbd7374632c5d63544a61331ebda977132b6f756 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Mon, 11 May 2026 19:58:21 +0200 Subject: [PATCH 39/61] #1784: switched listener system to javafx ObservableList --- .../com/devonfw/ide/gui/MainController.java | 120 +++++++++--------- .../ide/gui/context/IdeGuiContext.java | 6 +- ...sBarHandling.java => ProgressBarTask.java} | 26 +++- .../devonfw/ide/gui/progress/TaskManager.java | 75 ++--------- .../TaskOverviewWindowController.java | 55 +++----- .../taskwindow/TaskWindowCellFactory.java | 41 +++--- 6 files changed, 139 insertions(+), 184 deletions(-) rename gui/src/main/java/com/devonfw/ide/gui/progress/{GuiProgressBarHandling.java => ProgressBarTask.java} (63%) diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index d291d1ab0f..bb54faf2bd 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -4,6 +4,7 @@ import java.nio.file.Path; import java.util.List; import javafx.application.Platform; +import javafx.collections.ListChangeListener; import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.Button; @@ -17,15 +18,14 @@ import com.devonfw.ide.gui.context.IdeGuiStateManager; import com.devonfw.ide.gui.context.ProjectManager; import com.devonfw.ide.gui.modal.IdeDialog; -import com.devonfw.ide.gui.progress.GuiProgressBarHandling; +import com.devonfw.ide.gui.progress.ProgressBarTask; import com.devonfw.ide.gui.progress.TaskManager; -import com.devonfw.ide.gui.progress.TaskManager.ProgressListener; import com.devonfw.ide.gui.progress.taskwindow.TaskOverviewWindow; /** * Controller of the main screen of the dashboard GUI. */ -public class MainController implements ProgressListener { +public class MainController { private static Logger LOG = LoggerFactory.getLogger(MainController.class); @@ -69,7 +69,30 @@ public MainController(String directoryPath) { LOG.debug("IDE_ROOT path={}", directoryPath); this.directoryPath = directoryPath; - TaskManager.getInstance().addListener(this); + ListChangeListener taskListChangeListener = change -> { + List tasks = TaskManager.getInstance().getTasks(); + + while (change.next()) { + if (change.wasAdded()) { + LOG.debug("Added: {}", change.getAddedSubList()); + + for (ProgressBarTask product : change.getAddedSubList()) { + product.currentProgressProperty().addListener((obs, oldVal, newVal) -> + updateStatusLabel(tasks) + ); + } + updateStatusLabel(tasks); + } else if (change.wasRemoved()) { + LOG.debug("Removed: {}", change.getRemoved()); + + updateStatusLabel(tasks); + } else if (change.wasUpdated()) { + + updateStatusLabel(tasks); + } + } + }; + TaskManager.getInstance().getTasks().addListener(taskListChangeListener); this.projectManager = IdeGuiStateManager.getInstance().getProjectManager(); } @@ -148,7 +171,7 @@ private void openIDE(String inIde) { private static Task runIdeCommandTask(String inIde) { - GuiProgressBarHandling task = (GuiProgressBarHandling) IdeGuiStateManager.getInstance().getCurrentContext() + ProgressBarTask task = (ProgressBarTask) IdeGuiStateManager.getInstance().getCurrentContext() .newProgressBarIndeterminate("Starting " + inIde); Task downloadTask = new Task<>() { @Override @@ -210,59 +233,38 @@ public void removeTaskTest() { TaskManager.getInstance().removeTask(TaskManager.getInstance().getTasks().getFirst()); } - @Override - public void onProgressTaskUpdated(GuiProgressBarHandling task, long stepPosition) { - - LOG.info("Progress update at position {}", stepPosition); - - List tasks = TaskManager.getInstance().getTasks(); - updateStatusLabel(tasks); - if (tasks.size() == 1) { - statusProgressBar.setProgress((double) task.getCurrentProgress() / task.getMaxSize()); - } - } - - @Override - public void onProgressTaskAdded(GuiProgressBarHandling task) { - - updateStatusLabel(TaskManager.getInstance().getTasks()); - } - - @Override - public void onProgressTaskRemoved(GuiProgressBarHandling task) { - - updateStatusLabel(TaskManager.getInstance().getTasks()); - } - - private void updateStatusLabel(List taskList) { - - statusLabel.setOnMouseClicked(e -> TaskOverviewWindow.getInstance(statusLabel).show()); - - if (taskList.size() > 1) { - statusProgressBar.setVisible(false); - statusProgressBar.setPrefWidth(0); - statusLabel.setText(taskList.size() + " tasks running..."); - - statusLabel.setUnderline(true); - statusLabel.setStyle( - "-fx-text-fill: blue;" - + "-fx-cursor: hand" - ); - } else if (taskList.size() == 1) { - GuiProgressBarHandling task = taskList.getFirst(); - statusLabel.setText(task.getTitle() + " [" + task.getCurrentProgress() + "/" + task.getMaxSize() + " " + task.getUnitName() + "]"); - statusLabel.setUnderline(false); - statusLabel.setStyle(""); - - statusProgressBar.setVisible(true); - statusProgressBar.setPrefWidth(PROGRESSBAR_VISIBLE_WIDTH); - } else { - statusLabel.setText("IDEasy is ready."); - statusProgressBar.setVisible(false); - statusProgressBar.setPrefWidth(0); - - statusLabel.setUnderline(false); - statusLabel.setStyle(""); - } + private void updateStatusLabel(List taskList) { + + Platform.runLater(() -> { + statusLabel.setOnMouseClicked(e -> TaskOverviewWindow.getInstance(statusLabel).show()); + + if (taskList.size() > 1) { + statusProgressBar.setVisible(false); + statusProgressBar.setPrefWidth(0); + statusLabel.setText(taskList.size() + " tasks running..."); + + statusLabel.setUnderline(true); + statusLabel.setStyle( + "-fx-text-fill: blue;" + + "-fx-cursor: hand" + ); + } else if (taskList.size() == 1) { + ProgressBarTask task = taskList.getFirst(); + statusLabel.setText(task.getTitle() + " [" + task.getCurrentProgress() + "/" + task.getMaxSize() + " " + task.getUnitName() + "]"); + statusLabel.setUnderline(false); + statusLabel.setStyle(""); + + statusProgressBar.setVisible(true); + statusProgressBar.setPrefWidth(PROGRESSBAR_VISIBLE_WIDTH); + statusProgressBar.setProgress((double) (task.getCurrentProgress()) / task.getMaxSize()); + } else { + statusLabel.setText("IDEasy is ready."); + statusProgressBar.setVisible(false); + statusProgressBar.setPrefWidth(0); + + statusLabel.setUnderline(false); + statusLabel.setStyle(""); + } + }); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java index 5c263ac41f..a5d721c751 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java @@ -3,7 +3,7 @@ import java.nio.file.Path; import java.util.UUID; -import com.devonfw.ide.gui.progress.GuiProgressBarHandling; +import com.devonfw.ide.gui.progress.ProgressBarTask; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -33,7 +33,7 @@ protected String readLine() { @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { - return new GuiProgressBarHandling(UUID.randomUUID().toString(), title, size, unitName, unitSize); + return new ProgressBarTask(UUID.randomUUID().toString(), title, size, unitName, unitSize); } /** @@ -42,6 +42,6 @@ public IdeProgressBar newProgressBar(String title, long size, String unitName, l */ public IdeProgressBar newProgressBarIndeterminate(String title) { - return new GuiProgressBarHandling(UUID.randomUUID().toString(), title); + return new ProgressBarTask(UUID.randomUUID().toString(), title); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java b/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressBarTask.java similarity index 63% rename from gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java rename to gui/src/main/java/com/devonfw/ide/gui/progress/ProgressBarTask.java index 84624aafdc..a3c2674411 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/GuiProgressBarHandling.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressBarTask.java @@ -1,20 +1,24 @@ package com.devonfw.ide.gui.progress; import java.util.logging.Logger; +import javafx.beans.property.LongProperty; +import javafx.beans.property.SimpleLongProperty; import com.devonfw.tools.ide.io.AbstractIdeProgressBar; /** * This is a handler for the progress bars in the GUI */ -public class GuiProgressBarHandling extends AbstractIdeProgressBar { +public class ProgressBarTask extends AbstractIdeProgressBar { - private static final Logger LOG = Logger.getLogger(GuiProgressBarHandling.class.getName()); + private static final Logger LOG = Logger.getLogger(ProgressBarTask.class.getName()); private boolean isIndeterminate = false; private String taskId = ""; - public GuiProgressBarHandling(String taskId, String title, long maxSize, String unitName, long unitSize) { + private final LongProperty progressProperty = new SimpleLongProperty(getCurrentProgress()); + + public ProgressBarTask(String taskId, String title, long maxSize, String unitName, long unitSize) { super(title, maxSize, unitName, unitSize); this.taskId = taskId; @@ -26,7 +30,7 @@ public GuiProgressBarHandling(String taskId, String title, long maxSize, String * * @param title the title of the progress bar */ - public GuiProgressBarHandling(String taskId, String title) { + public ProgressBarTask(String taskId, String title) { super(title, 100, "%", 1); this.isIndeterminate = true; @@ -37,13 +41,13 @@ public GuiProgressBarHandling(String taskId, String title) { protected void doStepBy(long stepSize, long currentProgress) { LOG.info("Updating progress bar to " + currentProgress); - TaskManager.getInstance().updateTask(this, currentProgress + stepSize); + progressProperty.setValue(currentProgress); } protected void doStepTo(long stepPosition) { LOG.info("Updating progress bar to " + getCurrentProgress()); - TaskManager.getInstance().updateTask(this, stepPosition); + progressProperty.setValue(getCurrentProgress()); } @Override @@ -71,4 +75,14 @@ public void setIndeterminate(boolean indeterminate) { public String getTaskId() { return taskId; } + + /** + * Properties are relevant for dynamically updating the ui. + * + * @return progress property of this task. + * @see LongProperty + */ + public LongProperty currentProgressProperty() { + return progressProperty; + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java index 37ee426485..103f0fac8d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java @@ -1,95 +1,46 @@ package com.devonfw.ide.gui.progress; -import java.util.List; +import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; -import javafx.application.Platform; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; public class TaskManager { private static final TaskManager INSTANCE = new TaskManager(); - private final List tasks = new CopyOnWriteArrayList<>(); - - private final List listeners = new CopyOnWriteArrayList<>(); + private final ObservableList tasks = FXCollections.observableList(new CopyOnWriteArrayList<>()); public static TaskManager getInstance() { return INSTANCE; } - public void addListener(ProgressListener listener) { - - listeners.add(listener); - } - - public void removeListener(ProgressListener listener) { - - listeners.remove(listener); - } - /** * @param task the task to be added to the list of tasks. * @return the TaskManagers internal task ID. */ - public void addTask(GuiProgressBarHandling task) { - tasks.stream() - .filter(t -> - t.getTaskId() == task.getTaskId() - ) - .findFirst() - .ifPresent(existingTask -> { - throw new IllegalArgumentException("Task with ID " + task.getTaskId() + " already exists."); - }); + public void addTask(ProgressBarTask task) { + boolean exists = tasks.stream() + .anyMatch(t -> Objects.equals(t.getTaskId(), task.getTaskId())); + if (exists) { + throw new IllegalArgumentException("Task with ID " + task.getTaskId() + " already exists."); + } + tasks.add(task); - Platform.runLater(() -> - listeners.forEach(listener -> listener.onProgressTaskAdded(task)) - ); } - public void removeTask(GuiProgressBarHandling task) { + public void removeTask(ProgressBarTask task) { tasks.remove(task); - Platform.runLater(() -> - listeners.forEach(listener -> listener.onProgressTaskRemoved(task)) - ); } /** * @return the list of currently running tasks. */ - public List getTasks() { + public ObservableList getTasks() { return tasks; } - - protected void updateTask(GuiProgressBarHandling task, long stepPosition) { - - Platform.runLater(() -> - listeners.forEach(listener -> listener.onProgressTaskUpdated(task, stepPosition)) - ); - } - - /** - * Listener interface for receiving updates about progress tasks. Implement this interface and register it with the TaskManager to receive updates when tasks - * are added, removed, or updated. - */ - public interface ProgressListener { - - /** - * @param task updated task - * @param stepPosition the current position of the task (for STEP updates) - */ - void onProgressTaskUpdated(GuiProgressBarHandling task, long stepPosition); - - /** - * @param task task that was added - */ - void onProgressTaskAdded(GuiProgressBarHandling task); - - /** - * @param task task that was removed - */ - void onProgressTaskRemoved(GuiProgressBarHandling task); - } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java index 05bff8ef32..a71a2bb59d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskOverviewWindowController.java @@ -1,55 +1,40 @@ package com.devonfw.ide.gui.progress.taskwindow; -import java.util.Objects; +import javafx.beans.Observable; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.ListView; -import com.devonfw.ide.gui.progress.GuiProgressBarHandling; +import com.devonfw.ide.gui.progress.ProgressBarTask; import com.devonfw.ide.gui.progress.TaskManager; -import com.devonfw.ide.gui.progress.TaskManager.ProgressListener; /** * Controller for the task overview window, which shows all currently running tasks and their progressbars. */ -public class TaskOverviewWindowController implements ProgressListener { +public class TaskOverviewWindowController { @FXML - public ListView taskList; - private TaskManager taskManager = TaskManager.getInstance(); - - public TaskOverviewWindowController() { - - taskManager.addListener(this); - } + public ListView taskList; + private final TaskManager taskManager = TaskManager.getInstance(); @FXML private void initialize() { taskList.setCellFactory(new TaskWindowCellFactory()); - taskList.getItems().addAll(TaskManager.getInstance().getTasks()); - } - - @Override - public void onProgressTaskUpdated(GuiProgressBarHandling updatedTask, long stepPosition) { - - taskList.getItems().stream() - .filter(task -> Objects.equals(task.getTaskId(), updatedTask.getTaskId())) - .findFirst() - .ifPresent(task -> { - int index = taskList.getItems().indexOf(task); - taskList.getItems().set(index, updatedTask); - }); - } - - @Override - public void onProgressTaskAdded(GuiProgressBarHandling task) { - - taskList.getItems().setAll(taskManager.getTasks()); - } - - @Override - public void onProgressTaskRemoved(GuiProgressBarHandling task) { - taskList.getItems().setAll(taskManager.getTasks()); + /* This part... + 1. connects the task list to the UI, automatically reacting to additions and removals + 2. also sets an Observable on progress property, so the UI also gets updated in case it changes + */ + ObservableList tasks = taskManager.getTasks(); + FXCollections.observableList( + tasks, + task -> new Observable[] { + task.currentProgressProperty() + } + ); + + taskList.setItems(tasks); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java index 8988fac7dc..304b9c9b80 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java @@ -1,5 +1,6 @@ package com.devonfw.ide.gui.progress.taskwindow; +import javafx.application.Platform; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.control.ListCell; @@ -13,17 +14,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.progress.GuiProgressBarHandling; +import com.devonfw.ide.gui.progress.ProgressBarTask; /** * Cell factory for displaying a list of tasks in the {@link TaskOverviewWindow} */ -public class TaskWindowCellFactory implements Callback, ListCell> { +public class TaskWindowCellFactory implements Callback, ListCell> { private static final Logger LOG = LoggerFactory.getLogger(TaskWindowCellFactory.class); @Override - public ListCell call(ListView param) { + public ListCell call(ListView param) { return new ListCell<>() { final ProgressBar progressBar = new ProgressBar(); @@ -38,27 +39,29 @@ public ListCell call(ListView pa } @Override - public void updateItem(GuiProgressBarHandling progressTask, boolean empty) { + public void updateItem(ProgressBarTask progressTask, boolean empty) { - if (empty || progressTask == null) { - setText(null); - setGraphic(null); - } else { - LOG.debug("update cell"); + Platform.runLater(() -> { + if (empty || progressTask == null) { + setText(null); + setGraphic(null); + } else { + LOG.debug("update cell"); - titleLabel.setText( - getLabelValueFormatted(progressTask.getTitle(), progressTask.getCurrentProgress(), progressTask.getMaxSize(), progressTask.getUnitName())); + titleLabel.setText( + getLabelValueFormatted(progressTask.getTitle(), progressTask.getCurrentProgress(), progressTask.getMaxSize(), progressTask.getUnitName())); - if (progressTask.isIndeterminate() && !progressBar.isIndeterminate()) { - progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS); - } else if (!progressTask.isIndeterminate()) { - progressBar.setProgress((double) progressTask.getCurrentProgress() / progressTask.getMaxSize()); - } + if (progressTask.isIndeterminate() && !progressBar.isIndeterminate()) { + progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS); + } else if (!progressTask.isIndeterminate()) { + progressBar.setProgress((double) progressTask.getCurrentProgress() / progressTask.getMaxSize()); + } - progressBar.setMaxWidth(Double.MAX_VALUE); + progressBar.setMaxWidth(Double.MAX_VALUE); - setGraphic(root); - } + setGraphic(root); + } + }); } }; } From 39fa408ce900331ea952e37002d8db01b196b79c Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 12 May 2026 16:36:25 +0200 Subject: [PATCH 40/61] #1784: improved TaksManager for UI Thread safety, added documentation, upgraded UI architecture to use Binding/Observing Logic --- .../main/java/com/devonfw/ide/gui/App.java | 3 + .../java/com/devonfw/ide/gui/FxHelper.java | 24 +++++++ .../com/devonfw/ide/gui/MainController.java | 6 +- .../ide/gui/progress/ProgressBarTask.java | 62 ++++++++++++++++--- .../devonfw/ide/gui/progress/TaskManager.java | 25 +++++--- .../taskwindow/TaskWindowCellFactory.java | 40 +++++++----- 6 files changed, 128 insertions(+), 32 deletions(-) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/FxHelper.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index efd4cb07b7..a73b4c2c44 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -33,6 +33,7 @@ public void start(Stage primaryStage) throws IOException { Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { System.out.println("Uncaught exception in thread " + thread.getName() + ":" + throwable.getMessage()); + //Left this in, because of issues with printing errors when the Fx Application Thread crashes. Needs further research. throwable.printStackTrace(); Platform.runLater(() -> new IdeDialog(IdeDialog.AlertType.ERROR, throwable.getMessage()).showAndWait()); } @@ -54,6 +55,7 @@ public void start(Stage primaryStage) throws IOException { primaryStage.show(); primaryStage.setOnCloseRequest(event -> { + LOG.info("Closing application"); if (!TaskManager.getInstance().getTasks().isEmpty()) { IdeDialog closeConfirm = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, "There are still running tasks. Are you sure you want to exit?", @@ -72,6 +74,7 @@ public void start(Stage primaryStage) throws IOException { } private void exitApplication() { + Platform.exit(); System.exit(0); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/FxHelper.java b/gui/src/main/java/com/devonfw/ide/gui/FxHelper.java new file mode 100644 index 0000000000..368beec040 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/FxHelper.java @@ -0,0 +1,24 @@ +package com.devonfw.ide.gui; + +import javafx.application.Platform; + +/** + * Helper class containing tools for interacting with JavaFX + */ +public class FxHelper { + + /** + * Allows to run operations on the Fx Application Thread, but only, if the call is originating from the Fx Application Thread. Idea: Some tasks which are + * doing (potentially heavy) background work, might not originate from the Fx Application (UI) Thread. + * + * @param runnable code to execute + */ + public static void runFxSafe(Runnable runnable) { + if (Platform.isFxApplicationThread()) { + runnable.run(); + } else { + Platform.runLater(runnable); + } + } + +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index bb54faf2bd..6e8a463b89 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -209,7 +209,7 @@ private void updateContext(String selectedProjectName, String selectedWorkspaceN //TODO: remove after testing public void addTaskTest() { - LOG.error("Adding task"); + LOG.debug("Adding task"); IdeGuiStateManager.getInstance() .getCurrentContext() .newProgressbarForExtracting(1024); @@ -225,6 +225,10 @@ public void addTaskTest() { IdeGuiStateManager.getInstance() .getCurrentContext() .newProgressBarForPlugins(3); + + IdeGuiStateManager.getInstance() + .getCurrentContext() + .newProgressBarIndeterminate("Custom Task"); } //TODO: remove after testing diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressBarTask.java b/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressBarTask.java index a3c2674411..e7b6e0cdc9 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressBarTask.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/ProgressBarTask.java @@ -1,9 +1,16 @@ package com.devonfw.ide.gui.progress; -import java.util.logging.Logger; +import javafx.beans.property.BooleanProperty; import javafx.beans.property.LongProperty; +import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleLongProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.devonfw.ide.gui.FxHelper; import com.devonfw.tools.ide.io.AbstractIdeProgressBar; /** @@ -11,13 +18,23 @@ */ public class ProgressBarTask extends AbstractIdeProgressBar { - private static final Logger LOG = Logger.getLogger(ProgressBarTask.class.getName()); + private static final Logger LOG = LoggerFactory.getLogger(ProgressBarTask.class.getName()); private boolean isIndeterminate = false; - private String taskId = ""; + private final String taskId; private final LongProperty progressProperty = new SimpleLongProperty(getCurrentProgress()); + //we only set the title on this line, once. title is final in AbstractIdeContext, but we also use a property here, to be consistent and allow dynamic updates if needed in the future. + private final StringProperty titleProperty = new SimpleStringProperty(getTitle()); + private final BooleanProperty indeterminateProperty = new SimpleBooleanProperty(isIndeterminate()); + /** + * @param taskId a unique identifier for this task, used for example to prevent duplicate tasks in the TaskManager + * @param title title of the task + * @param maxSize maximum progress + * @param unitName unit of the progress (e.g. %, MB, files, etc.) + * @param unitSize unit size (e.g. 1%) + */ public ProgressBarTask(String taskId, String title, long maxSize, String unitName, long unitSize) { super(title, maxSize, unitName, unitSize); @@ -33,21 +50,31 @@ public ProgressBarTask(String taskId, String title, long maxSize, String unitNam public ProgressBarTask(String taskId, String title) { super(title, 100, "%", 1); - this.isIndeterminate = true; + setIndeterminate(true); this.taskId = taskId; TaskManager.getInstance().addTask(this); } + @Override protected void doStepBy(long stepSize, long currentProgress) { - LOG.info("Updating progress bar to " + currentProgress); - progressProperty.setValue(currentProgress); + LOG.debug("Updating progress bar to {}", currentProgress); + + FxHelper.runFxSafe(() -> progressProperty.setValue(currentProgress)); } + @Override protected void doStepTo(long stepPosition) { - LOG.info("Updating progress bar to " + getCurrentProgress()); - progressProperty.setValue(getCurrentProgress()); + LOG.debug("Updating progress bar to {}", getCurrentProgress()); + + FxHelper.runFxSafe(() -> progressProperty.setValue(getCurrentProgress())); + } + + @Override + public long getCurrentProgress() { + + return super.getCurrentProgress(); } @Override @@ -70,8 +97,12 @@ public boolean isIndeterminate() { */ public void setIndeterminate(boolean indeterminate) { isIndeterminate = indeterminate; + indeterminateProperty.set(indeterminate); } + /** + * @return id of the current task + */ public String getTaskId() { return taskId; } @@ -80,9 +111,22 @@ public String getTaskId() { * Properties are relevant for dynamically updating the ui. * * @return progress property of this task. - * @see LongProperty */ public LongProperty currentProgressProperty() { return progressProperty; } + + /** + * @return title property of this task. + */ + public StringProperty titleProperty() { + return titleProperty; + } + + /** + * @return indeterminate property of this task. + */ + public BooleanProperty indeterminateProperty() { + return indeterminateProperty; + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java index 103f0fac8d..f386e1ee22 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/TaskManager.java @@ -1,16 +1,26 @@ package com.devonfw.ide.gui.progress; import java.util.Objects; -import java.util.concurrent.CopyOnWriteArrayList; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import com.devonfw.ide.gui.FxHelper; + +/** + * Singleton class that manages all currently running tasks and their progress bars. It provides an {@link ObservableList} of tasks, which can be observed by + * components like in the UI. + * + * @see ProgressBarTask + */ public class TaskManager { private static final TaskManager INSTANCE = new TaskManager(); - private final ObservableList tasks = FXCollections.observableList(new CopyOnWriteArrayList<>()); + private final ObservableList tasks = FXCollections.observableArrayList(); + /** + * @return the singleton instance of the TaskManager. + */ public static TaskManager getInstance() { return INSTANCE; @@ -18,9 +28,7 @@ public static TaskManager getInstance() { /** * @param task the task to be added to the list of tasks. - * @return the TaskManagers internal task ID. */ - public void addTask(ProgressBarTask task) { boolean exists = tasks.stream() .anyMatch(t -> Objects.equals(t.getTaskId(), task.getTaskId())); @@ -28,16 +36,19 @@ public void addTask(ProgressBarTask task) { throw new IllegalArgumentException("Task with ID " + task.getTaskId() + " already exists."); } - tasks.add(task); + FxHelper.runFxSafe(() -> tasks.add(task)); } + /** + * @param task task to be removed + */ public void removeTask(ProgressBarTask task) { - tasks.remove(task); + FxHelper.runFxSafe(() -> tasks.remove(task)); } /** - * @return the list of currently running tasks. + * @return the {@link ObservableList} of currently running tasks. */ public ObservableList getTasks() { diff --git a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java index 304b9c9b80..23df94cd9a 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java +++ b/gui/src/main/java/com/devonfw/ide/gui/progress/taskwindow/TaskWindowCellFactory.java @@ -1,6 +1,8 @@ package com.devonfw.ide.gui.progress.taskwindow; import javafx.application.Platform; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.StringExpression; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.control.ListCell; @@ -40,23 +42,35 @@ public ListCell call(ListView param) { @Override public void updateItem(ProgressBarTask progressTask, boolean empty) { + super.updateItem(progressTask, empty); Platform.runLater(() -> { if (empty || progressTask == null) { setText(null); setGraphic(null); } else { - LOG.debug("update cell"); - - titleLabel.setText( - getLabelValueFormatted(progressTask.getTitle(), progressTask.getCurrentProgress(), progressTask.getMaxSize(), progressTask.getUnitName())); - - if (progressTask.isIndeterminate() && !progressBar.isIndeterminate()) { - progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS); - } else if (!progressTask.isIndeterminate()) { - progressBar.setProgress((double) progressTask.getCurrentProgress() / progressTask.getMaxSize()); - } - + LOG.debug("updating task {} '{}'", progressTask.getTaskId(), progressTask.getTitle()); + + StringExpression formattedLabelText = Bindings.format( + "%s [%d/%d %s]", + progressTask.titleProperty(), + progressTask.currentProgressProperty(), + progressTask.getMaxSize(), + progressTask.getUnitName() + ); + + titleLabel.textProperty().bind( + Bindings.when(progressTask.indeterminateProperty()) + .then(progressTask.titleProperty()) + .otherwise(formattedLabelText) + ); + progressBar.progressProperty().bind( + Bindings.when(progressTask.indeterminateProperty()) + .then(-1) + .otherwise(progressTask.currentProgressProperty().divide((double) progressTask.getMaxSize())) + ); + + //set the size of the progress bar to fill the window completely progressBar.setMaxWidth(Double.MAX_VALUE); setGraphic(root); @@ -65,8 +79,4 @@ public void updateItem(ProgressBarTask progressTask, boolean empty) { } }; } - - private String getLabelValueFormatted(String title, long _currentProgress, long maxSize, String unitName) { - return String.format("%s [%d/%d %s]", title, _currentProgress, maxSize, unitName); - } } From a02d248088cefd6a807fc540db7dc3712f757059 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 12 May 2026 17:37:40 +0200 Subject: [PATCH 41/61] #1784: cleanup --- .../com/devonfw/ide/gui/MainController.java | 78 ++++++------------- .../com/devonfw/ide/gui/main-view.fxml | 2 - 2 files changed, 24 insertions(+), 56 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 6e8a463b89..c9849f67c3 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -61,6 +61,30 @@ public class MainController { private Path projectValue; private Path workspaceValue; + private final ListChangeListener taskListChangeListener = change -> { + List tasks = TaskManager.getInstance().getTasks(); + + while (change.next()) { + if (change.wasAdded()) { + LOG.debug("Added: {}", change.getAddedSubList()); + + for (ProgressBarTask product : change.getAddedSubList()) { + product.currentProgressProperty().addListener((obs, oldVal, newVal) -> + updateStatusLabel(tasks) + ); + } + updateStatusLabel(tasks); + } else if (change.wasRemoved()) { + LOG.debug("Removed: {}", change.getRemoved()); + + updateStatusLabel(tasks); + } else if (change.wasUpdated()) { + + updateStatusLabel(tasks); + } + } + }; + /** * Constructor */ @@ -69,29 +93,6 @@ public MainController(String directoryPath) { LOG.debug("IDE_ROOT path={}", directoryPath); this.directoryPath = directoryPath; - ListChangeListener taskListChangeListener = change -> { - List tasks = TaskManager.getInstance().getTasks(); - - while (change.next()) { - if (change.wasAdded()) { - LOG.debug("Added: {}", change.getAddedSubList()); - - for (ProgressBarTask product : change.getAddedSubList()) { - product.currentProgressProperty().addListener((obs, oldVal, newVal) -> - updateStatusLabel(tasks) - ); - } - updateStatusLabel(tasks); - } else if (change.wasRemoved()) { - LOG.debug("Removed: {}", change.getRemoved()); - - updateStatusLabel(tasks); - } else if (change.wasUpdated()) { - - updateStatusLabel(tasks); - } - } - }; TaskManager.getInstance().getTasks().addListener(taskListChangeListener); this.projectManager = IdeGuiStateManager.getInstance().getProjectManager(); @@ -206,37 +207,6 @@ private void updateContext(String selectedProjectName, String selectedWorkspaceN } } - //TODO: remove after testing - public void addTaskTest() { - - LOG.debug("Adding task"); - IdeGuiStateManager.getInstance() - .getCurrentContext() - .newProgressbarForExtracting(1024); - - IdeGuiStateManager.getInstance() - .getCurrentContext() - .newProgressbarForCopying(1024); - - IdeGuiStateManager.getInstance() - .getCurrentContext() - .newProgressBarForDownload(1024); - - IdeGuiStateManager.getInstance() - .getCurrentContext() - .newProgressBarForPlugins(3); - - IdeGuiStateManager.getInstance() - .getCurrentContext() - .newProgressBarIndeterminate("Custom Task"); - } - - //TODO: remove after testing - public void removeTaskTest() { - - TaskManager.getInstance().removeTask(TaskManager.getInstance().getTasks().getFirst()); - } - private void updateStatusLabel(List taskList) { Platform.runLater(() -> { diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 225c27cf42..bd09c0f3c2 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -163,8 +163,6 @@ - - + - + - + - - + - + - + - @@ -164,7 +174,7 @@ -

@@ -61,111 +51,83 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 41804b27a9..5968c3c15c 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -18,14 +18,13 @@ import javafx.stage.Stage; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.context.IdeGuiStateManager; - -import com.devonfw.ide.gui.context.IdeGuiStateManager; +import com.devonfw.ide.gui.context.GuiStateManager; import com.devonfw.ide.gui.context.TaskManager; import com.devonfw.ide.gui.progress.ProgressBarTask; import com.devonfw.ide.gui.progress.taskwindow.TaskOverviewWindow; @@ -35,7 +34,7 @@ */ public class AppBaseTest extends HeadlessApplicationTest { - private static Logger LOGGER = LoggerFactory.getLogger(AppBaseTest.class); + private static final Logger LOG = LoggerFactory.getLogger(AppBaseTest.class); private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; @@ -45,6 +44,8 @@ public class AppBaseTest extends HeadlessApplicationTest { @TempDir private static Path mockIdeRoot; + private static final TaskManager taskManager = new TaskManager(); + private static GuiStateManager guiStateManager; @Override public void start(Stage stage) throws IOException { @@ -53,7 +54,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(mockIdeRoot.toString())); + fxmlLoader.setController(new MainController(mockIdeRoot.toString(), guiStateManager, taskManager)); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work @@ -70,18 +71,25 @@ public void start(Stage stage) throws IOException { } /** - * Generate a temporary project directories in order to be able to test on any device (including GitHub CI). This is required for the {@link MainController} - * to work in the test context. Generates a structure like this: /project-[0..6]/workspaces/main + * Generate temporary project directories to be able to test on any device (including GitHub CI). This is required for the {@link MainController} to work in + * the test context. Generates a structure like this: /project-[0..6]/workspaces/main */ @BeforeAll protected static void generateProjectFolderStructure() throws IOException { - LOGGER.debug("tempDir: {}", mockIdeRoot); + LOG.debug("tempDir: {}", mockIdeRoot); FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); - LOGGER.debug("project folders: {}", Arrays.toString(mockIdeRoot.toFile().list())); + LOG.debug("project folders: {}", Arrays.toString(mockIdeRoot.toFile().list())); - //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()).switchContext("project-1", "main"); + guiStateManager = new GuiStateManager(taskManager, mockIdeRoot.toString()); + //We set the project root directory to the temporary directory before all tests so that the IDE can find the projects in the test. + guiStateManager.switchContext("project-1", "main"); + } + + @BeforeEach + protected void resetTaskManager() { + + taskManager.getTasks().clear(); } /** @@ -105,7 +113,7 @@ public void testIdeOpenButtonsDisabledWhenNoProjectSelected() { @Test public void testIdeOpenButtonsEnabledWhenProjectSelected() { - // assert that a project and workspace is selected + // assert that project and workspace are selected interact(() -> selectedProject.getSelectionModel().select("project-1")); interact(() -> selectedWorkspace.getSelectionModel().select("main")); @@ -144,12 +152,10 @@ public void testWorkspaceComboboxEnabledEnabledWhenProjectSelected() { } @Test - public void testStatusLabelDisplaysCorrectMessage() { - - TaskManager taskManager = TaskManager.getInstance(); + protected void testStatusLabelDisplaysCorrectMessage() { - ProgressBarTask task1 = new ProgressBarTask("task-1", "Test Task"); - ProgressBarTask task2 = new ProgressBarTask("task-2", "Test Task"); + ProgressBarTask task1 = new ProgressBarTask(taskManager, "task-1", "Test Task"); + ProgressBarTask task2 = new ProgressBarTask(taskManager, "task-2", "Test Task"); //Case 1: No tasks added yet, check correct message assertThat(statusText.getText()).isEqualTo("IDEasy is ready."); @@ -182,12 +188,10 @@ public void testStatusLabelDisplaysCorrectMessage() { } @Test - public void testStatusTextOpensTaskOverviewWindow() { - - TaskManager taskManager = TaskManager.getInstance(); + protected void testStatusTextOpensTaskOverviewWindow() { - ProgressBarTask task1 = new ProgressBarTask("task-1", "Test Task"); - ProgressBarTask task2 = new ProgressBarTask("task-2", "Test Task"); + ProgressBarTask task1 = new ProgressBarTask(taskManager, "task-1", "Test Task"); + ProgressBarTask task2 = new ProgressBarTask(taskManager, "task-2", "Test Task"); taskManager.addTask(task1); taskManager.addTask(task2); @@ -196,7 +200,7 @@ public void testStatusTextOpensTaskOverviewWindow() { interact(() -> statusText.fireEvent( new MouseEvent(MouseEvent.MOUSE_CLICKED, 0, 0, 0, 0, null, 1, false, false, false, false, false, false, false, false, false, false, null))); - assertThat(TaskOverviewWindow.getInstance().getStage().isShowing()).as("Task overview window should be opened when clicking on status text") + assertThat(TaskOverviewWindow.getInstance(taskManager).getStage().isShowing()).as("Task overview window should be opened when clicking on status text") .isTrue(); } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java index d6850e22c3..8434e42958 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java +++ b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java @@ -10,15 +10,15 @@ * This class helps to create a fake project folder structure for testing. The projects are named in the format "project-{i}" and the workspaces are named * "main". *

- * This class is supposed to be replaced by enabling ide-cli test dependencies allowing to mock a IdeContext + * This class is supposed to be replaced by enabling ide-cli test dependencies allowing to mock an IdeContext */ public class FakeProjectFolderStructureHelper { /** - * @param rootPath root path where fake structure should be created - * @return the rootPath + * @param rootPath root path where a fake structure should be created + * @throws IOException if any of the directories cannot be created */ - public static Path createFakeProjectFolderStructure(Path rootPath) throws IOException { + public static void createFakeProjectFolderStructure(Path rootPath) throws IOException { for (int i = 0; i <= 5; i++) { String projectFolderName = "project-" + i; @@ -34,7 +34,6 @@ public static Path createFakeProjectFolderStructure(Path rootPath) throws IOExce .isNotNull(); } - return rootPath; } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/GuiStateManagerTest.java similarity index 75% rename from gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java rename to gui/src/test/java/com/devonfw/ide/gui/context/GuiStateManagerTest.java index c92f12e56f..dcfb331227 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/GuiStateManagerTest.java @@ -16,47 +16,39 @@ import com.devonfw.tools.ide.context.IdeTestContext; /** - * Tests for {@link IdeGuiStateManager}. + * Tests for {@link GuiStateManager}. */ -public class IdeGuiStateManagerTest extends AbstractIdeContextTest { +public class GuiStateManagerTest extends AbstractIdeContextTest { - private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManagerTest.class); + private static final Logger LOG = LoggerFactory.getLogger(GuiStateManagerTest.class); private static IdeTestContext context; - private static IdeGuiStateManager guiStateManager; + private static GuiStateManager guiStateManager; private static ProjectManager projectManager; + private TaskManager taskManager; @BeforeAll static void setup() { context = newContext("testProject", "project-0"); LOG.debug("root: {}", context.getIdeRoot()); - - guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); - projectManager = guiStateManager.getProjectManager(); } @BeforeEach void reset() { - IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); - } - - @Test - void testThrowsIfIdeRootNull() { - try { - IdeGuiStateManager.getInstanceOverrideRootDir(null); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage()).contains("ideRoot must not be null!"); - } + TaskManager taskManager = new TaskManager(); + guiStateManager = new GuiStateManager(taskManager, context.getIdeRoot().toString()); + projectManager = guiStateManager.getProjectManager(); } @Test void testThrowsIfIdeRootDoesNotExist() { try { - IdeGuiStateManager.getInstanceOverrideRootDir("nonExistingIdeRoot"); + new GuiStateManager(taskManager, "nonExistingIdeRoot"); + fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory does not exist"); } @@ -66,7 +58,7 @@ void testThrowsIfIdeRootDoesNotExist() { void testGetContext() throws FileNotFoundException { IdeGuiContext context = guiStateManager.switchContext(projectManager.getProjectNames().getFirst(), "main"); - assertThat(context).isNotNull().as("context was null after switchContext was called"); // When switching to a project, the context should be set. + assertThat(context).as("context was null after switchContext was called").isNotNull(); // When switching to a project, the context should be set. } @Test @@ -88,6 +80,7 @@ void testThrowsIfNonExistentProjectSelected() { try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); + fail("FileNotFoundException expected"); } catch (FileNotFoundException e) { assertThat(e.getMessage()).contains("Project " + fakeProject + " does not exist!") .as("GuiStateManager.switchContext should throw an exception, if a non-existent project is selected"); diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index 3a7ddd8b1c..58de824ec1 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -22,7 +22,6 @@ public class ProjectManagerTest extends AbstractIdeContextTest { private static ProjectManager projectManager; - private static IdeTestContext context; private static Path ideRoot; private final List VALID_PROJECT_LIST = List.of("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); @@ -30,7 +29,7 @@ public class ProjectManagerTest extends AbstractIdeContextTest { @BeforeEach void resetContext() { - context = newContext("testProject", "project-0"); + IdeTestContext context = newContext("testProject", "project-0"); ideRoot = context.getIdeRoot(); } @@ -115,7 +114,7 @@ void testRefreshProjects() throws IOException { @Test void testReadProjectsExcludesFoldersWithoutWorkspaces() throws IOException { - // Create a project folder without a workspaces subdirectory + // Create a project folder without a workspace subdirectory Path testProject = ideRoot.resolve("test-project-no-workspaces"); Files.createDirectory(testProject); diff --git a/gui/src/test/java/com/devonfw/ide/gui/progress/TaskManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/progress/TaskManagerTest.java index ae052885ed..a7a772a93f 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/progress/TaskManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/progress/TaskManagerTest.java @@ -13,7 +13,7 @@ /** * Test for the @TaskManager class. Currently, we extend HeadlessApplicationTest because we need the JavaFX Application Thread. The reason for this is, that - * TaskManager uses a method from JavaFX (currently; looking for a better impolementation in the future). + * TaskManager uses a method from JavaFX (currently; looking for a better implementation in the future). * * @see TaskManager */ @@ -24,8 +24,7 @@ class TaskManagerTest extends HeadlessApplicationTest { @BeforeEach void setUp() { - taskManager = TaskManager.getInstance(); - taskManager.getTasks().clear(); // important because TaskManager is a singleton + taskManager = new TaskManager(); waitForFxEvents(); } @@ -33,7 +32,7 @@ void setUp() { @Test void shouldAddTask() { - ProgressBarTask task = new ProgressBarTask("task-1", "Test Task"); + ProgressBarTask task = new ProgressBarTask(taskManager, "task-1", "Test Task"); taskManager.addTask(task); @@ -46,7 +45,7 @@ void shouldAddTask() { @Test void shouldRemoveTask() { - ProgressBarTask task = new ProgressBarTask("task-1", "Test Task"); + ProgressBarTask task = new ProgressBarTask(taskManager, "task-1", "Test Task"); taskManager.addTask(task); taskManager.removeTask(task); @@ -59,8 +58,8 @@ void shouldRemoveTask() { @Test void shouldThrowExceptionWhenAddingDuplicateTaskId() { - ProgressBarTask task1 = new ProgressBarTask("task-1", "Test Task 1"); - ProgressBarTask task2 = new ProgressBarTask("task-1", "Test Task 2"); + ProgressBarTask task1 = new ProgressBarTask(taskManager, "task-1", "Test Task 1"); + ProgressBarTask task2 = new ProgressBarTask(taskManager, "task-1", "Test Task 2"); taskManager.addTask(task1); diff --git a/gui/src/test/java/com/devonfw/ide/gui/progress/TaskWindowTest.java b/gui/src/test/java/com/devonfw/ide/gui/progress/TaskWindowTest.java index bbd105fcc1..a399a0ce50 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/progress/TaskWindowTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/progress/TaskWindowTest.java @@ -38,7 +38,7 @@ public void start(Stage stage) throws Exception { assertThat(taskOverviewWindowUrl).as("Cannot resolve task overview window FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(taskOverviewWindowUrl); - fxmlLoader.setController(new TaskOverviewWindowController()); + fxmlLoader.setController(new TaskOverviewWindowController(taskManager)); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.show(); @@ -47,12 +47,12 @@ public void start(Stage stage) throws Exception { } @BeforeAll - public static void setup() { - taskManager = TaskManager.getInstance(); + static void setup() { + taskManager = new TaskManager(); } @BeforeEach - public void reset() { + void reset() { taskManager.getTasks().clear(); waitForFxEvents(); } @@ -61,9 +61,9 @@ public void reset() { * We check, whether our implementation of {@link TaskOverviewWindow#show()} actually displays the window. */ @Test - public void isWindowShown() { + void isWindowShown() { FxHelper.runFxSafe(() -> { - TaskOverviewWindow testWindow = TaskOverviewWindow.getInstance(); + TaskOverviewWindow testWindow = TaskOverviewWindow.getInstance(taskManager); testWindow.show(); assertThat(testWindow.getStage().isShowing()).isTrue(); @@ -71,9 +71,9 @@ public void isWindowShown() { } @Test - public void shouldShowTaskWhenTaskAdded() { + void shouldShowTaskWhenTaskAdded() { - ProgressBarTask task = new ProgressBarTask("task-1", "Test Task"); + ProgressBarTask task = new ProgressBarTask(taskManager, "task-1", "Test Task"); taskManager.addTask(task); waitForFxEvents(); @@ -81,9 +81,9 @@ public void shouldShowTaskWhenTaskAdded() { } @Test - public void shouldNotShowTaskWhenTaskRemoved() { + void shouldNotShowTaskWhenTaskRemoved() { - ProgressBarTask task = new ProgressBarTask("task-1", "Test Task"); + ProgressBarTask task = new ProgressBarTask(taskManager, "task-1", "Test Task"); taskManager.addTask(task); waitForFxEvents(); @@ -95,12 +95,15 @@ public void shouldNotShowTaskWhenTaskRemoved() { assertThat(taskList.getItems()).isEmpty(); } + /** + * Ensures that the list of tasks stays coherent with the actual tasks. + */ @Test - public void listContentsAreCoherent() { + void listContentsAreCoherent() { - ProgressBarTask task1 = new ProgressBarTask("task-1", "Test Task"); - ProgressBarTask task2 = new ProgressBarTask("task-2", "Test Task 2"); - ProgressBarTask task3 = new ProgressBarTask("task-3", "Test Task 3"); + ProgressBarTask task1 = new ProgressBarTask(taskManager, "task-1", "Test Task"); + ProgressBarTask task2 = new ProgressBarTask(taskManager, "task-2", "Test Task 2"); + ProgressBarTask task3 = new ProgressBarTask(taskManager, "task-3", "Test Task 3"); taskManager.addTask(task1); taskManager.addTask(task2); @@ -114,14 +117,14 @@ public void listContentsAreCoherent() { * Our TaskOverViewWindow should reuse the same window instance if it is already open. Also, the existing window should be brought to the front */ @Test - public void reusesExistingWindow() { + void reusesExistingWindow() { FxHelper.runFxSafe(() -> { - TaskOverviewWindow testWindow1 = TaskOverviewWindow.getInstance(); + TaskOverviewWindow testWindow1 = TaskOverviewWindow.getInstance(taskManager); testWindow1.show(); - TaskOverviewWindow testWindow2 = TaskOverviewWindow.getInstance(); + TaskOverviewWindow testWindow2 = TaskOverviewWindow.getInstance(taskManager); testWindow2.show(); assertThat(testWindow1.equals(testWindow2)).isTrue().as("Window instances differentiate"); @@ -134,7 +137,7 @@ public void reusesExistingWindow() { * When no tasks are running, the TaskOverViewWindow should show an empty list, not a null pointer exception or similar. */ @Test - public void showsEmptyListWhenNoTasks() { + void showsEmptyListWhenNoTasks() { // In @BeforeEach tasks get cleared before each test assertThat(taskList.getItems()).isEmpty(); @@ -144,9 +147,9 @@ public void showsEmptyListWhenNoTasks() { * tests whether progress tasks are properly updated in the list when the properties update */ @Test - public void testTaskProgressUpdatesProperly() { + void testTaskProgressUpdatesProperly() { - ProgressBarTask task = new ProgressBarTask("task-1", "Test Task", 100, "Units", 1); + ProgressBarTask task = new ProgressBarTask(taskManager, "task-1", "Test Task", 100, "Units", 1); taskManager.addTask(task); waitForFxEvents(); @@ -169,10 +172,10 @@ public void testTaskProgressUpdatesProperly() { * We check here that a null node reference is handled properly and leads to the window being displayed in the center of the screen. */ @Test - public void testNullReferenceNode() { + void testNullReferenceNode() { FxHelper.runFxSafe(() -> { - TaskOverviewWindow nullRefWindow = TaskOverviewWindow.getInstance(); + TaskOverviewWindow nullRefWindow = TaskOverviewWindow.getInstance(taskManager); nullRefWindow.showRelativeToReferenceNode(null); Rectangle2D screenMeasures = Screen.getPrimary().getVisualBounds(); From afd910f1ee202b2dd39af16ab5871d59716369fb Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 16 Jun 2026 17:55:53 +0200 Subject: [PATCH 58/61] #1784: moved gui documentation UML files into seperate branch/PR #2035 --- .../images/gui/Task Management structure.puml | 20 ----- documentation/images/gui/gui.puml | 87 ------------------- 2 files changed, 107 deletions(-) delete mode 100644 documentation/images/gui/Task Management structure.puml delete mode 100644 documentation/images/gui/gui.puml diff --git a/documentation/images/gui/Task Management structure.puml b/documentation/images/gui/Task Management structure.puml deleted file mode 100644 index cee5100352..0000000000 --- a/documentation/images/gui/Task Management structure.puml +++ /dev/null @@ -1,20 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -class TaskManager -class IdeGuiContext -class MainController implements ProgressListener -interface ProgressListener { - +void onUpdateTaskProgress(Task task) - +void onTaskAdded() - +void onTaskRemoved() -} -class GuiProgressBarHandling - -IdeGuiContext ..> GuiProgressBarHandling : instantiates -IdeGuiContext ..> TaskManager : adds instantiated task to -TaskManager ..> MainController : notifies about task updates -TaskManager <.. GuiProgressBarHandling : when close() called: removes itself from TaskManager -MainController ..> TaskManager : registers itself for updates - -@enduml diff --git a/documentation/images/gui/gui.puml b/documentation/images/gui/gui.puml deleted file mode 100644 index b63d61af79..0000000000 --- a/documentation/images/gui/gui.puml +++ /dev/null @@ -1,87 +0,0 @@ -@startuml -'https://plantuml.com/sequence-diagram - -title GUI Structure - - -package "cli" { -abstract class AbstractIdeContext -} -package "gui" { - class AppLauncher { - +void main(String []) - } - - class App { - +void main(String []) - +void start() - } - - class IdeGuiStateManager <> { - -String projectDirectory - -IdeGuiContext currentContext - -- - -IdeGuiStateManager() - +{static} IdeGuiStateManager getInstance() - ..GUI context handling.. - +IdeGuiContext switchContext(projectName: String, workspaceName: String) - +IdeGuiContext getCurrentContext() - +void addStateChangeListener(StateChangeListener listener) - +void removeStateChangeListener(StateChangeListener listener) - } - - -static class "IdeGuiStateManager.Holder" as Holder { - -{static} INSTANCE - } - - class MainController { - -void initialize() - .. - -void setProjectsCombobox() - -void setWorkspaceValue() - .. - -void updateContext(String projectName, String workspaceName) - } - - abstract class "IdeGuiStateManager.StateChangeListener" as StateChangeListener { - +void onStateChange(IdeGuiContext newContext) - } - - class IdeGuiContext - - - note right of IdeGuiStateManager - In the most basic sense, the GUI state depends on the current project context. - This is important to ensure that any commandlets will be executed in the correct project. - end note - note bottom of StateChangeListener - Idea: This listener is implemented by any UI component to get notified of any context changes. - Alternative: an abstract StateDependentGuiComponent class that implements the listener and provides an abstract method for handling context changes. - Or: restart the app everytime the context changes (probably not the user-friendliest idea) - end note - note right of App: FXML layout is loaded here - note bottom of Holder: simple instance wrapper class for Bill Pugh singleton - note right of IdeGuiContext: This will implement modals/progress bars - note top of AppLauncher - Current considerations regarding the UI state management: - - Darf die GUI mehr als einmal offen sein? (Fall: Fenster mit gleichem Projekt parallel offen) - - Wie Context-Handling implementieren? - - Wie werden Log messages gehandelt? - end note -} - - -'' Relations '' - -AppLauncher --> App : launches - -IdeGuiContext ..> AbstractIdeContext : extends - -IdeGuiStateManager ..> IdeGuiContext : creates/manages instances of -IdeGuiStateManager --> StateChangeListener : inner class -IdeGuiStateManager -left> Holder : inner class - -App ..> MainController : initializes when loading layout -MainController ..> IdeGuiStateManager : accesses/interacts with - -@enduml From 1f64d4ff6ddd851c3438427b62c0f5857c664dd4 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 23 Jun 2026 17:14:26 +0200 Subject: [PATCH 59/61] #1987: Refactored use of TaskManager in App.java. --- gui/src/main/java/com/devonfw/ide/gui/App.java | 2 +- gui/src/main/java/com/devonfw/ide/gui/MainController.java | 5 ++--- .../java/com/devonfw/ide/gui/context/GuiStateManager.java | 8 ++++++++ gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 3732b17244..5a61763f8c 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -46,7 +46,7 @@ public void start(Stage primaryStage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("main-view.fxml")); fxmlLoader.setController( - new MainController(System.getenv(IdeVariables.IDE_ROOT.getName()), guiStateManager, taskManager) + new MainController(System.getenv(IdeVariables.IDE_ROOT.getName()), guiStateManager) ); root = fxmlLoader.load(); diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 1de7bebd0c..aaa5e9e955 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -70,14 +70,13 @@ public class MainController { * * @param ideRoot the IDE_ROOT path * @param guiStateManager the {@link GuiStateManager} to be used in this application instance - * @param taskManager the {@link TaskManager} to be used in this application instance */ - public MainController(String ideRoot, GuiStateManager guiStateManager, TaskManager taskManager) { + public MainController(String ideRoot, GuiStateManager guiStateManager) { LOG.debug("IDE_ROOT path={}", ideRoot); this.ideRootPath = ideRoot; - this.taskManager = taskManager; this.guiStateManager = guiStateManager; + this.taskManager = guiStateManager.getTaskManager(); this.projectManager = guiStateManager.getProjectManager(); ListChangeListener taskListChangeListener = change -> { diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/GuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/GuiStateManager.java index 5a20fbf4bf..91e5789e99 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/GuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/GuiStateManager.java @@ -93,6 +93,14 @@ public ProjectManager getProjectManager() { return projectManager; } + /** + * @return instance of {@link TaskManager} + */ + public TaskManager getTaskManager() { + + return taskManager; + } + /** * Add a listener to the context change events. * diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 5968c3c15c..d13c70665d 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -54,7 +54,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(mockIdeRoot.toString(), guiStateManager, taskManager)); + fxmlLoader.setController(new MainController(mockIdeRoot.toString(), guiStateManager)); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work From 20cd3033aea0bc7168d82e15fbbe51f346ddfdbc Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 23 Jun 2026 17:19:48 +0200 Subject: [PATCH 60/61] #1987: Refactored listener setup into separate method. --- gui/src/main/java/com/devonfw/ide/gui/MainController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index aaa5e9e955..ae30a6078e 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -79,6 +79,11 @@ public MainController(String ideRoot, GuiStateManager guiStateManager) { this.taskManager = guiStateManager.getTaskManager(); this.projectManager = guiStateManager.getProjectManager(); + setUpTaskListListener(); + } + + private void setUpTaskListListener() { + ListChangeListener taskListChangeListener = change -> { List tasks = taskManager.getTasks(); @@ -87,7 +92,7 @@ public MainController(String ideRoot, GuiStateManager guiStateManager) { LOG.debug("Added: {}", change.getAddedSubList()); for (ProgressBarTask product : change.getAddedSubList()) { - product.currentProgressProperty().addListener((obs, oldVal, newVal) -> + product.currentProgressProperty().addListener((_, _, _) -> updateStatusLabel(tasks) ); } From 6f4c54f684a14d0dfb928f3d4482f5a295f6bded Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 23 Jun 2026 17:26:59 +0200 Subject: [PATCH 61/61] #1987: updated CHANGELOG.adoc --- CHANGELOG.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 74801018e3..1f6c5b0f26 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -6,6 +6,8 @@ This file documents all notable changes to https://github.com/devonfw/IDEasy[IDE Release with new features and bugfixes: +* https://github.com/devonfw/IDEasy/issues/1784[#1784]: GUI now supports displaying progress bars + The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/46?closed=1[milestone 2026.07.001]. @@ -23,7 +25,6 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/1255[#1255]: Enhance snapshot version recognition in IDEasy * https://github.com/devonfw/IDEasy/issues/1964[#1964]: Fixed gui not launching with older project java versions * https://github.com/devonfw/IDEasy/issues/1968[#1968]: Fixed gui blocking the terminal session while running -* https://github.com/devonfw/IDEasy/issues/1784[#1784]: GUI now supports displaying progress bars * https://github.com/devonfw/IDEasy/issues/1849[#1849]: Add VSCodium support * https://github.com/devonfw/IDEasy/issues/1391[#1391]: Fix bashrc messed with terraform completions * https://github.com/devonfw/IDEasy/issues/1922[#1922]: Add Task CLI to IDEasy commandlets