diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 268d6d14e8..ca1ac85ec7 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -10,6 +10,7 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/1006[#1006]: Eclipse automation opens UI that blocks further processing until closed * https://github.com/devonfw/IDEasy/issues/1110[#1110]: ide status fails with IllegalStateException when offline * https://github.com/devonfw/IDEasy/issues/1039[#1039]: Update Jasypt commandlet implementation to run Java version from dependencies.json +* https://github.com/devonfw/IDEasy/issues/1138[#1138]: Duplicated variables in configuration logs a clear warning and do not prevent merge anymore The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/24?closed=1[milestone 2025.03.002]. 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 3a878e1316..bc00646a7e 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 @@ -60,7 +60,6 @@ protected void doMerge(Element templateElement, Element resultElement, ElementMa * @param matcher the {@link ElementMatcher}. */ public void merge(Element templateElement, Element resultElement, ElementMatcher matcher) { - try { doMerge(templateElement, resultElement, matcher); } catch (XmlMergeException 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 1e069f4fb6..d39d09abc6 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 d4c9ee7586..13d89f1798 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,17 +20,23 @@ 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(); + private final boolean throwExceptionOnMultipleMatches = Boolean.parseBoolean(System.getProperty("throwExceptionOnMultipleMatches", "false")); + + /** * The constructor. * * @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 +68,14 @@ 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)); + if (throwExceptionOnMultipleMatches) { + throw new IllegalStateException( + length + " matches found for XPath " + xpathExpr + " in workspace XML at " + XmlMergeSupport.getXPath(workspaceElement, true)); + } else { + this.context.warning("Matches found: {} matches for XPath {} in workspace XML at {}", + length, xpathExpr, XmlMergeSupport.getXPath(workspaceElement, true)); + } + return (Element) nodeList.item(0); } } catch (XPathExpressionException e) { throw new IllegalStateException("Failed to compile XPath expression " + xpath, e);