From 68623eb06d82d976624ca176580bc51acf971363 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Thu, 13 Mar 2025 13:46:13 +0100 Subject: [PATCH 01/12] #999: More flexible IDELogEntry comparison --- .../tools/ide/log/IdeTestLoggerAssertion.java | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java index 4efac8e01..7a165b889 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java +++ b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java @@ -1,5 +1,7 @@ package com.devonfw.tools.ide.log; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @@ -93,46 +95,27 @@ public IdeTestLoggerAssertion hasEntriesWithNothingElseInBetween(IdeLogEntry... } private IdeTestLoggerAssertion hasEntries(boolean nothingElseInBetween, IdeLogEntry... expectedEntries) { - assert (expectedEntries.length > 0); - int i = 0; - int max = 0; + + List remainingEntries = new ArrayList<>(Arrays.asList(expectedEntries)); + for (IdeLogEntry entry : this.entries) { - if (expectedEntries[i].matches(entry)) { - i++; - } else { - if (nothingElseInBetween) { - i = 0; - } else if (expectedEntries[0].matches(entry)) { - i = 1; - } - } - if (i == expectedEntries.length) { + remainingEntries.removeIf(expectedEntry -> expectedEntry.matches(entry)); + if (remainingEntries.isEmpty()) { return this; } - if (i > max) { - max = i; - } } + StringBuilder error = new StringBuilder(4096); - if (max > 0) { - error.append("Found expected log entries:\n"); - for (i = 0; i < max; i++) { - appendEntry(error, expectedEntries[i]); - } - } - error.append("\nThe first entry that was not matching from a block of "); - error.append(expectedEntries.length); - error.append(" expected log-entries "); - if (nothingElseInBetween) { - error.append("with nothing else logged in between "); + error.append("The following expected log entries were not found:\n"); + for (IdeLogEntry entry : remainingEntries) { + appendEntry(error, entry); } - error.append("was:\n"); - appendEntry(error, expectedEntries[max]); - error.append("\nIn the logs of this test:\n"); + error.append("\nActual logs:\n"); for (IdeLogEntry entry : this.entries) { appendEntry(error, entry); } + Assertions.fail(error.toString()); return this; } From 9dcfdc1d50c8de4eca2f5d233a5e3c775c5105b7 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Mon, 17 Mar 2025 16:19:22 +0100 Subject: [PATCH 02/12] #1130: Improve behaviour on ambigous xpath match --- .../devonfw/tools/ide/merge/FileMerger.java | 3 +- .../tools/ide/merge/xmlmerger/XmlMerger.java | 32 ++++++++++++++----- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java b/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java index 0eba942bb..7bfbb9336 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java @@ -49,8 +49,7 @@ public final int merge(Path setup, Path update, EnvironmentVariables variables, try { doMerge(setup, update, variables, workspace); } catch (Exception e) { - this.context.error(e, "Failed to merge workspace file {} with update template {} and setup file {}!", workspace, update, setup); - return 1; + this.context.warning("Failed to merge workspace file {} with update template {} and setup file {}!", workspace, update, setup); } return 0; } diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java index 3e827f99b..3dea44e51 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java @@ -4,7 +4,8 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; -import javax.xml.namespace.QName; +import java.util.HashSet; +import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; @@ -111,22 +112,37 @@ public Document merge(XmlMergeDocument templateDocument, XmlMergeDocument worksp Path template = workspaceDocument.getPath(); this.context.debug("Merging {} into {} ...", template, source); Element templateRoot = templateDocument.getRoot(); - QName templateQName = XmlMergeSupport.getQualifiedName(templateRoot); Element workspaceRoot = workspaceDocument.getRoot(); - QName workspaceQName = XmlMergeSupport.getQualifiedName(workspaceRoot); - if (templateQName.equals(workspaceQName)) { + + if (templateRoot.getNodeName().equals(workspaceRoot.getNodeName())) { XmlMergeStrategy strategy = XmlMergeSupport.getMergeStrategy(templateRoot); if (strategy == null) { strategy = XmlMergeStrategy.COMBINE; // default strategy used as fallback } - ElementMatcher elementMatcher = new ElementMatcher(this.context); - strategy.merge(templateRoot, workspaceRoot, elementMatcher); + + Set seenElements = new HashSet<>(); + + NodeList templateChildren = templateRoot.getChildNodes(); + for (int i = 0; i < templateChildren.getLength(); i++) { + Node templateNode = templateChildren.item(i); + if (templateNode.getNodeType() == Node.ELEMENT_NODE) { + Element templateElement = (Element) templateNode; + String elementQName = templateElement.getNodeName(); + + if (!seenElements.contains(elementQName)) { + strategy.merge(templateElement, workspaceRoot, new ElementMatcher(this.context)); + seenElements.add(elementQName); + } + } + } + resultDocument = workspaceDocument.getDocument(); } else { - this.context.error("Cannot merge XML template {} with root {} into XML file {} with root {} as roots do not match.", templateDocument.getPath(), - templateQName, workspaceDocument.getPath(), workspaceQName); + this.context.error("Cannot merge XML template {} with root {} into XML file {} with root {} as roots do not match.", + templateDocument.getPath(), templateRoot.getNodeName(), workspaceDocument.getPath(), workspaceRoot.getNodeName()); return null; } + return resultDocument; } From f832220d1072e4c3d29def9a0c0c8710e4b6df40 Mon Sep 17 00:00:00 2001 From: KianRolf Date: Mon, 17 Mar 2025 16:28:22 +0100 Subject: [PATCH 03/12] fix --- .../tools/ide/log/IdeTestLoggerAssertion.java | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java index 99c997310..4efac8e01 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java +++ b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java @@ -1,7 +1,5 @@ package com.devonfw.tools.ide.log; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.function.Predicate; @@ -60,16 +58,6 @@ public IdeTestLoggerAssertion hasNoMessageContaining(String message) { return fulfillsPredicate(e -> !e.message().contains(message), PredicateMode.MATCH_ALL, "No log message should contain '" + message + "'"); } - /** - * Asserts that no {@link IdeLogEntry} has an {@link IdeLogEntry#error() error} containing a {@link Throwable} (exception). - * - * @return this assertion itself for fluent API calls. - */ - public IdeTestLoggerAssertion hasNoEntryWithException() { - - return fulfillsPredicate(e -> e.error() == null, PredicateMode.MATCH_ALL, "No log message should have an exception"); - } - /** * @param messages the expected {@link com.devonfw.tools.ide.log.IdeSubLogger#log(String) log message}s in order. * @return this assertion itself for fluent API calls. @@ -105,27 +93,46 @@ public IdeTestLoggerAssertion hasEntriesWithNothingElseInBetween(IdeLogEntry... } private IdeTestLoggerAssertion hasEntries(boolean nothingElseInBetween, IdeLogEntry... expectedEntries) { - assert (expectedEntries.length > 0); - - List remainingEntries = new ArrayList<>(Arrays.asList(expectedEntries)); + assert (expectedEntries.length > 0); + int i = 0; + int max = 0; for (IdeLogEntry entry : this.entries) { - remainingEntries.removeIf(expectedEntry -> expectedEntry.matches(entry)); - if (remainingEntries.isEmpty()) { + if (expectedEntries[i].matches(entry)) { + i++; + } else { + if (nothingElseInBetween) { + i = 0; + } else if (expectedEntries[0].matches(entry)) { + i = 1; + } + } + if (i == expectedEntries.length) { return this; } + if (i > max) { + max = i; + } } - StringBuilder error = new StringBuilder(4096); - error.append("The following expected log entries were not found:\n"); - for (IdeLogEntry entry : remainingEntries) { - appendEntry(error, entry); + if (max > 0) { + error.append("Found expected log entries:\n"); + for (i = 0; i < max; i++) { + appendEntry(error, expectedEntries[i]); + } } - error.append("\nActual logs:\n"); + error.append("\nThe first entry that was not matching from a block of "); + error.append(expectedEntries.length); + error.append(" expected log-entries "); + if (nothingElseInBetween) { + error.append("with nothing else logged in between "); + } + error.append("was:\n"); + appendEntry(error, expectedEntries[max]); + error.append("\nIn the logs of this test:\n"); for (IdeLogEntry entry : this.entries) { appendEntry(error, entry); } - Assertions.fail(error.toString()); return this; } From 49ef8ef3ab2480a2c258482dd88e9df0c73070f7 Mon Sep 17 00:00:00 2001 From: KianRolf Date: Mon, 17 Mar 2025 16:32:36 +0100 Subject: [PATCH 04/12] Update IdeTestLoggerAssertion.java --- .../devonfw/tools/ide/log/IdeTestLoggerAssertion.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java index 4efac8e01..e6d5a9d69 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java +++ b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java @@ -58,6 +58,16 @@ public IdeTestLoggerAssertion hasNoMessageContaining(String message) { return fulfillsPredicate(e -> !e.message().contains(message), PredicateMode.MATCH_ALL, "No log message should contain '" + message + "'"); } + /** + * Asserts that no {@link IdeLogEntry} has an {@link IdeLogEntry#error() error} containing a {@link Throwable} (exception). + * + * @return this assertion itself for fluent API calls. + */ + public IdeTestLoggerAssertion hasNoEntryWithException() { + + return fulfillsPredicate(e -> e.error() == null, PredicateMode.MATCH_ALL, "No log message should have an exception"); + } + /** * @param messages the expected {@link com.devonfw.tools.ide.log.IdeSubLogger#log(String) log message}s in order. * @return this assertion itself for fluent API calls. From 0dcb66192c06f83134728a70ad50839dc2f53c45 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Mon, 17 Mar 2025 16:33:24 +0100 Subject: [PATCH 05/12] Update IdeTestLoggerAssertion.java --- .../java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java index e6d5a9d69..e67bc6c5b 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java +++ b/cli/src/test/java/com/devonfw/tools/ide/log/IdeTestLoggerAssertion.java @@ -58,7 +58,7 @@ public IdeTestLoggerAssertion hasNoMessageContaining(String message) { return fulfillsPredicate(e -> !e.message().contains(message), PredicateMode.MATCH_ALL, "No log message should contain '" + message + "'"); } - /** + /** * Asserts that no {@link IdeLogEntry} has an {@link IdeLogEntry#error() error} containing a {@link Throwable} (exception). * * @return this assertion itself for fluent API calls. From c359522162e39c5ea2227dabb6a4267d1aadc092 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Tue, 18 Mar 2025 09:47:51 +0100 Subject: [PATCH 06/12] # --- .../devonfw/tools/ide/merge/FileMerger.java | 3 +- .../tools/ide/merge/xmlmerger/XmlMerger.java | 32 +++++-------------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java b/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java index 7bfbb9336..0eba942bb 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/FileMerger.java @@ -49,7 +49,8 @@ public final int merge(Path setup, Path update, EnvironmentVariables variables, try { doMerge(setup, update, variables, workspace); } catch (Exception e) { - this.context.warning("Failed to merge workspace file {} with update template {} and setup file {}!", workspace, update, setup); + this.context.error(e, "Failed to merge workspace file {} with update template {} and setup file {}!", workspace, update, setup); + return 1; } return 0; } diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java index 3dea44e51..3e827f99b 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMerger.java @@ -4,8 +4,7 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashSet; -import java.util.Set; +import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; @@ -112,37 +111,22 @@ public Document merge(XmlMergeDocument templateDocument, XmlMergeDocument worksp Path template = workspaceDocument.getPath(); this.context.debug("Merging {} into {} ...", template, source); Element templateRoot = templateDocument.getRoot(); + QName templateQName = XmlMergeSupport.getQualifiedName(templateRoot); Element workspaceRoot = workspaceDocument.getRoot(); - - if (templateRoot.getNodeName().equals(workspaceRoot.getNodeName())) { + QName workspaceQName = XmlMergeSupport.getQualifiedName(workspaceRoot); + if (templateQName.equals(workspaceQName)) { XmlMergeStrategy strategy = XmlMergeSupport.getMergeStrategy(templateRoot); if (strategy == null) { strategy = XmlMergeStrategy.COMBINE; // default strategy used as fallback } - - Set seenElements = new HashSet<>(); - - NodeList templateChildren = templateRoot.getChildNodes(); - for (int i = 0; i < templateChildren.getLength(); i++) { - Node templateNode = templateChildren.item(i); - if (templateNode.getNodeType() == Node.ELEMENT_NODE) { - Element templateElement = (Element) templateNode; - String elementQName = templateElement.getNodeName(); - - if (!seenElements.contains(elementQName)) { - strategy.merge(templateElement, workspaceRoot, new ElementMatcher(this.context)); - seenElements.add(elementQName); - } - } - } - + ElementMatcher elementMatcher = new ElementMatcher(this.context); + strategy.merge(templateRoot, workspaceRoot, elementMatcher); resultDocument = workspaceDocument.getDocument(); } else { - this.context.error("Cannot merge XML template {} with root {} into XML file {} with root {} as roots do not match.", - templateDocument.getPath(), templateRoot.getNodeName(), workspaceDocument.getPath(), workspaceRoot.getNodeName()); + this.context.error("Cannot merge XML template {} with root {} into XML file {} with root {} as roots do not match.", templateDocument.getPath(), + templateQName, workspaceDocument.getPath(), workspaceQName); return null; } - return resultDocument; } From e8a9fc0a25a2f9e079288e8152fc3448083613ed Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Tue, 18 Mar 2025 10:57:20 +0100 Subject: [PATCH 07/12] # --- .../tools/ide/merge/xmlmerger/XmlMergeStrategy.java | 7 ++++--- .../ide/merge/xmlmerger/matcher/ElementMatcher.java | 2 +- .../tools/ide/merge/xmlmerger/matcher/IdComputer.java | 10 +++++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java index 3a878e131..000be915f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java @@ -2,6 +2,7 @@ import java.util.Locale; import java.util.function.BiFunction; +import java.util.logging.Logger; import org.w3c.dom.Attr; import org.w3c.dom.DOMException; @@ -60,13 +61,13 @@ protected void doMerge(Element templateElement, Element resultElement, ElementMa * @param matcher the {@link ElementMatcher}. */ public void merge(Element templateElement, Element resultElement, ElementMatcher matcher) { - + Logger logger = Logger.getLogger(XmlMergeStrategy.class.getName()); try { doMerge(templateElement, resultElement, matcher); } catch (XmlMergeException e) { - throw e; + logger.warning("XML Merge Exception: " + e.getMessage()); } catch (RuntimeException e) { - throw new XmlMergeException("Merge strategy " + this + " failed on " + XmlMergeSupport.getXPath(templateElement, true), e); + logger.warning("Merge strategy " + this + " failed on " + XmlMergeSupport.getXPath(templateElement, true) + ": " + e.getMessage()); } } diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java index 1e069f4fb..d39d09abc 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java @@ -45,7 +45,7 @@ private IdComputer getIdComputer(Element element) { } else { this.qName2IdMap.putIfAbsent(qName, id); } - return this.id2ComputerMap.computeIfAbsent(id, IdComputer::new); + return this.id2ComputerMap.computeIfAbsent(id, i -> new IdComputer(i, context)); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java index d4c9ee758..15a8c71a3 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java @@ -9,6 +9,7 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; +import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.merge.xmlmerger.XmlMergeSupport; /** @@ -19,6 +20,8 @@ public class IdComputer { /** The value of merge:id that is used to evaluate the xpath expression. */ private final String id; + private final IdeContext context; + private static final XPathFactory xPathFactory = XPathFactory.newInstance(); /** @@ -26,10 +29,11 @@ public class IdComputer { * * @param id the {@link #getId() merge ID}. */ - public IdComputer(String id) { + public IdComputer(String id, IdeContext context) { super(); this.id = id; + this.context = context; } /** @@ -61,8 +65,8 @@ public Element evaluateExpression(Element templateElement, Element workspaceElem } else if (length == 0) { return null; } else { - throw new IllegalStateException( - length + " matches found for XPath " + xpathExpr + " in workspace XML at " + XmlMergeSupport.getXPath(workspaceElement, true)); + this.context.warning(length + " matches found for XPath " + xpathExpr + " in workspace XML at " + XmlMergeSupport.getXPath(workspaceElement, true)); + return (Element) nodeList.item(0); } } catch (XPathExpressionException e) { throw new IllegalStateException("Failed to compile XPath expression " + xpath, e); From 255542aee8f3d049b7ed5087cc73431b60418ef0 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Wed, 19 Mar 2025 11:45:28 +0100 Subject: [PATCH 08/12] #1008: improve upgrade-settings commandlet --- .../commandlet/UpgradeSettingsCommandlet.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java index 930dedc1b..bac0f6e0d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java @@ -1,8 +1,13 @@ package com.devonfw.tools.ide.commandlet; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.List; import java.util.function.Function; import com.devonfw.tools.ide.context.IdeContext; @@ -139,6 +144,7 @@ private void updateProperties(EnvironmentVariablesPropertiesFile environmentVari } updatePropertiesLegacyEdition(environmentVariables, "INTELLIJ_EDITION_TYPE", "INTELLIJ_EDITION", this::mapLegacyIntellijEdition); updatePropertiesLegacyEdition(environmentVariables, "ECLIPSE_EDITION_TYPE", "ECLIPSE_EDITION", this::mapLegacyEclipseEdition); + cleanupLegacyProperties(); environmentVariables.save(); this.context.getFileAccess().backup(environmentVariables.getLegacyPropertiesFilePath()); } @@ -181,4 +187,43 @@ private static void updatePropertiesLegacyEdition(EnvironmentVariablesProperties environmentVariables.remove(legacyEditionVariable); } } + + private void cleanupLegacyProperties() { + this.context.info("Cleaning up legacy properties..."); + + Path rootDirectory = Paths.get(System.getProperty("user.dir")); + try { + Files.walk(rootDirectory) + .filter(path -> path.getFileName().toString().equals("IDEasy.properties")) + .forEach(filePath -> { + try { + updateProperties(filePath); + } catch (IOException e) { + this.context.warning("Error processing IDEasy.properties at " + filePath); + } + }); + } catch (IOException e) { + this.context.warning("Error walking the file tree to find IDEasy.properties."); + } + } + + private void updateProperties(Path filePath) throws IOException { + List lines = Files.readAllLines(filePath); + List updatedLines = new ArrayList<>(); + + for (String line : lines) { + if (line.startsWith("git.url=") || line.startsWith("git-url")) { + String gitUrl = line.substring("git.url=".length()); + updatedLines.add("git_url=" + gitUrl); + continue; + } + if (line.startsWith("eclipse=import")) { + updatedLines.add("import=eclipse"); + continue; + } + updatedLines.add(line); + } + Files.write(filePath, updatedLines, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); + this.context.success("Successfully updated IDEasy.properties at " + filePath); + } } From 9610ea93e9d8c10d97eda3ed7dde89147165a01c Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Wed, 19 Mar 2025 11:51:33 +0100 Subject: [PATCH 09/12] #fixed branch issues --- .../tools/ide/merge/xmlmerger/XmlMergeStrategy.java | 7 +++---- .../ide/merge/xmlmerger/matcher/ElementMatcher.java | 2 +- .../tools/ide/merge/xmlmerger/matcher/IdComputer.java | 10 +++------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java index 000be915f..3a878e131 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/XmlMergeStrategy.java @@ -2,7 +2,6 @@ import java.util.Locale; import java.util.function.BiFunction; -import java.util.logging.Logger; import org.w3c.dom.Attr; import org.w3c.dom.DOMException; @@ -61,13 +60,13 @@ protected void doMerge(Element templateElement, Element resultElement, ElementMa * @param matcher the {@link ElementMatcher}. */ public void merge(Element templateElement, Element resultElement, ElementMatcher matcher) { - Logger logger = Logger.getLogger(XmlMergeStrategy.class.getName()); + try { doMerge(templateElement, resultElement, matcher); } catch (XmlMergeException e) { - logger.warning("XML Merge Exception: " + e.getMessage()); + throw e; } catch (RuntimeException e) { - logger.warning("Merge strategy " + this + " failed on " + XmlMergeSupport.getXPath(templateElement, true) + ": " + e.getMessage()); + throw new XmlMergeException("Merge strategy " + this + " failed on " + XmlMergeSupport.getXPath(templateElement, true), e); } } diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java index d39d09abc..1e069f4fb 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/ElementMatcher.java @@ -45,7 +45,7 @@ private IdComputer getIdComputer(Element element) { } else { this.qName2IdMap.putIfAbsent(qName, id); } - return this.id2ComputerMap.computeIfAbsent(id, i -> new IdComputer(i, context)); + return this.id2ComputerMap.computeIfAbsent(id, IdComputer::new); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java index 15a8c71a3..d4c9ee758 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java +++ b/cli/src/main/java/com/devonfw/tools/ide/merge/xmlmerger/matcher/IdComputer.java @@ -9,7 +9,6 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; -import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.merge.xmlmerger.XmlMergeSupport; /** @@ -20,8 +19,6 @@ public class IdComputer { /** The value of merge:id that is used to evaluate the xpath expression. */ private final String id; - private final IdeContext context; - private static final XPathFactory xPathFactory = XPathFactory.newInstance(); /** @@ -29,11 +26,10 @@ public class IdComputer { * * @param id the {@link #getId() merge ID}. */ - public IdComputer(String id, IdeContext context) { + public IdComputer(String id) { super(); this.id = id; - this.context = context; } /** @@ -65,8 +61,8 @@ public Element evaluateExpression(Element templateElement, Element workspaceElem } else if (length == 0) { return null; } else { - this.context.warning(length + " matches found for XPath " + xpathExpr + " in workspace XML at " + XmlMergeSupport.getXPath(workspaceElement, true)); - return (Element) nodeList.item(0); + throw new IllegalStateException( + length + " matches found for XPath " + xpathExpr + " in workspace XML at " + XmlMergeSupport.getXPath(workspaceElement, true)); } } catch (XPathExpressionException e) { throw new IllegalStateException("Failed to compile XPath expression " + xpath, e); From ad548406ca0fd7a1f91f129641c3139b125273f8 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Fri, 21 Mar 2025 14:52:13 +0100 Subject: [PATCH 10/12] Update cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jörg Hohwiller --- .../devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java index bac0f6e0d..32d3e086e 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java @@ -191,7 +191,7 @@ private static void updatePropertiesLegacyEdition(EnvironmentVariablesProperties private void cleanupLegacyProperties() { this.context.info("Cleaning up legacy properties..."); - Path rootDirectory = Paths.get(System.getProperty("user.dir")); + Path homeDirectory = this.config.getgetUserHome(); try { Files.walk(rootDirectory) .filter(path -> path.getFileName().toString().equals("IDEasy.properties")) From f89048903da9bf15ebfb46e3370794d1d4ed49c7 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Fri, 21 Mar 2025 14:52:24 +0100 Subject: [PATCH 11/12] Update cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jörg Hohwiller --- .../devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java index 32d3e086e..15f91740f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java @@ -207,7 +207,7 @@ private void cleanupLegacyProperties() { } } - private void updateProperties(Path filePath) throws IOException { + private void updateRepositoryPropertiesFile(Path filePath) throws IOException { List lines = Files.readAllLines(filePath); List updatedLines = new ArrayList<>(); From e17e2b50192d082a1ecb0db06b601f8e8d3a0966 Mon Sep 17 00:00:00 2001 From: leonrohne27 Date: Fri, 21 Mar 2025 14:53:25 +0100 Subject: [PATCH 12/12] Update cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jörg Hohwiller --- .../devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java index 15f91740f..cb0334086 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/UpgradeSettingsCommandlet.java @@ -224,6 +224,6 @@ private void updateRepositoryPropertiesFile(Path filePath) throws IOException { updatedLines.add(line); } Files.write(filePath, updatedLines, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); - this.context.success("Successfully updated IDEasy.properties at " + filePath); + this.context.success("Successfully updated repository configuration file {}", filePath); } }