getDependencies() {
+ return modelBase
+ .childElement("dependencies")
+ .map(deps -> deps.childElements("dependency")
+ .map(dep -> (Dependency) new DomTripDependency(dep, editor))
+ .collect(Collectors.toList()))
+ .orElse(Collections.emptyList());
+ }
+
+ public DependencyManagement getDependencyManagement() {
+ return modelBase
+ .childElement("dependencyManagement")
+ .map(elm -> (DependencyManagement) new DomTripDependencyManagement(elm, editor))
+ .orElse(null);
+ }
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelETL.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelETL.java
new file mode 100644
index 000000000..d3a16f6fb
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelETL.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+import org.apache.maven.model.Model;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.transform.ModelETL;
+import org.codehaus.plexus.util.xml.XmlStreamWriter;
+
+/**
+ * DomTrip implementation for extracting, transforming and loading the Model (pom.xml).
+ *
+ * DomTrip provides lossless XML round-tripping, preserving all formatting details
+ * including comments, whitespace, attribute order, quote styles, and entity encoding.
+ * This eliminates the need for the intro/outtro hacks required by the JDOM2 implementation.
+ *
+ * @since 3.4
+ */
+public class DomTripModelETL implements ModelETL {
+ private ReleaseDescriptor releaseDescriptor;
+
+ private MavenProject project;
+
+ private Document document;
+
+ private Editor editor;
+
+ public void setReleaseDescriptor(ReleaseDescriptor releaseDescriptor) {
+ this.releaseDescriptor = releaseDescriptor;
+ }
+
+ public void setProject(MavenProject project) {
+ this.project = project;
+ }
+
+ @Override
+ public void extract(File pomFile) throws ReleaseExecutionException {
+ try {
+ document = Document.of(pomFile.toPath());
+ editor = new Editor(document);
+ } catch (Exception e) {
+ throw new ReleaseExecutionException("Error reading POM: " + e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public void transform() {}
+
+ @Override
+ public void load(File targetFile) throws ReleaseExecutionException {
+ writePom(targetFile);
+ }
+
+ @Override
+ public Model getModel() {
+ return new DomTripModel(document, editor, releaseDescriptor);
+ }
+
+ private void writePom(File pomFile) throws ReleaseExecutionException {
+ if (releaseDescriptor.isAddSchema()) {
+ Element rootElement = document.root();
+
+ String modelVersion = project.getModelVersion();
+ String pomNamespaceUri = "http://maven.apache.org/POM/" + modelVersion;
+ String xsiNamespaceUri = "http://www.w3.org/2001/XMLSchema-instance";
+
+ rootElement.namespaceDeclaration("", pomNamespaceUri);
+ rootElement.namespaceDeclaration("xsi", xsiNamespaceUri);
+
+ if (rootElement.attribute("xsi:schemaLocation") == null) {
+ rootElement.attribute(
+ "xsi:schemaLocation",
+ pomNamespaceUri + " https://maven.apache.org/xsd/maven-" + modelVersion + ".xsd");
+ }
+ }
+
+ try (Writer writer = new XmlStreamWriter(pomFile)) {
+ writer.write(document.toXml());
+ } catch (IOException e) {
+ throw new ReleaseExecutionException("Error writing POM: " + e.getMessage(), e);
+ }
+ }
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETLFactory.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelETLFactory.java
similarity index 72%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETLFactory.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelETLFactory.java
index cb9045551..01790adbd 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETLFactory.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelETLFactory.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
import javax.inject.Named;
import javax.inject.Singleton;
@@ -25,21 +25,19 @@
import org.apache.maven.shared.release.transform.ModelETLRequest;
/**
- *
JDomModelETLFactory class.
+ * Factory for creating {@link DomTripModelETL} instances.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
@Singleton
-@Named(JDomModelETLFactory.NAME)
-public class JDomModelETLFactory implements ModelETLFactory {
- public static final String NAME = "jdom2-sax";
+@Named(DomTripModelETLFactory.NAME)
+public class DomTripModelETLFactory implements ModelETLFactory {
+ public static final String NAME = "domtrip";
@Override
- public JDomModelETL newInstance(ModelETLRequest request) {
- JDomModelETL result = new JDomModelETL();
+ public DomTripModelETL newInstance(ModelETLRequest request) {
+ DomTripModelETL result = new DomTripModelETL();
- result.setLs(request.getLineSeparator());
result.setProject(request.getProject());
result.setReleaseDescriptor(request.getReleaseDescriptor());
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomParent.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripParent.java
similarity index 76%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomParent.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripParent.java
index bb078be81..80756f368 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomParent.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripParent.java
@@ -16,37 +16,34 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
import org.apache.maven.model.Parent;
-import org.jdom2.Element;
/**
- * JDOM2 implementation of poms PARENT element.
+ * DomTrip implementation of poms PARENT element.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomParent extends Parent {
- private Element parent;
+public class DomTripParent extends Parent {
+ private final Element parent;
+ private final Editor editor;
- /**
- * Constructor for JDomParent.
- *
- * @param parent a {@link org.jdom2.Element} object
- */
- public JDomParent(Element parent) {
+ public DomTripParent(Element parent, Editor editor) {
this.parent = parent;
+ this.editor = editor;
}
@Override
public String getVersion() {
- return parent.getChildText("version", parent.getNamespace());
+ return parent.childText("version");
}
@Override
public void setVersion(String version) {
- JDomUtils.rewriteElement("version", version, parent, parent.getNamespace());
+ DomTripUtils.rewriteElement(editor, "version", version, parent);
}
@Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomPlugin.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripPlugin.java
similarity index 76%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomPlugin.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripPlugin.java
index 60b65252c..e8479af40 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomPlugin.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripPlugin.java
@@ -16,37 +16,34 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.shared.release.transform.MavenCoordinate;
-import org.jdom2.Element;
/**
- * JDOM2 implementation of poms PLUGIN element.
+ * DomTrip implementation of poms PLUGIN element.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomPlugin extends Plugin implements MavenCoordinate {
- private Element plugin;
+public class DomTripPlugin extends Plugin implements MavenCoordinate {
+ private final Element plugin;
+ private final Editor editor;
private final MavenCoordinate coordinate;
- /**
- * Constructor for JDomPlugin.
- *
- * @param plugin a {@link org.jdom2.Element} object
- */
- public JDomPlugin(Element plugin) {
+ public DomTripPlugin(Element plugin, Editor editor) {
this.plugin = plugin;
- this.coordinate = new JDomMavenCoordinate(plugin);
+ this.editor = editor;
+ this.coordinate = new DomTripMavenCoordinate(plugin, editor);
}
@Override
@@ -66,20 +63,11 @@ public String getArtifactId() {
@Override
public List getDependencies() {
- Element dependenciesElm = plugin.getChild("dependencies", plugin.getNamespace());
- if (dependenciesElm == null) {
- return Collections.emptyList();
- } else {
- List dependencyElms = dependenciesElm.getChildren("dependency", plugin.getNamespace());
-
- List dependencies = new ArrayList<>(dependencyElms.size());
-
- for (Element dependencyElm : dependencyElms) {
- dependencies.add(new JDomDependency(dependencyElm));
- }
-
- return dependencies;
- }
+ return plugin.childElement("dependencies")
+ .map(deps -> deps.childElements("dependency")
+ .map(dep -> (Dependency) new DomTripDependency(dep, editor))
+ .collect(Collectors.toList()))
+ .orElse(Collections.emptyList());
}
@Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomPluginManagement.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripPluginManagement.java
similarity index 63%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomPluginManagement.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripPluginManagement.java
index 00e331832..49214cae5 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomPluginManagement.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripPluginManagement.java
@@ -16,33 +16,30 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginManagement;
-import org.jdom2.Element;
/**
- * JDOM2 implementation of poms PLUGINMANAGEMENT element.
+ * DomTrip implementation of poms PLUGINMANAGEMENT element.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomPluginManagement extends PluginManagement {
+public class DomTripPluginManagement extends PluginManagement {
private final Element pluginManagement;
+ private final Editor editor;
- /**
- * Constructor for JDomPluginManagement.
- *
- * @param pluginManagement a {@link org.jdom2.Element} object
- */
- public JDomPluginManagement(Element pluginManagement) {
+ public DomTripPluginManagement(Element pluginManagement, Editor editor) {
this.pluginManagement = pluginManagement;
+ this.editor = editor;
}
@Override
@@ -52,20 +49,12 @@ public void addPlugin(Plugin plugin) {
@Override
public List getPlugins() {
- Element pluginsElm = pluginManagement.getChild("plugins", pluginManagement.getNamespace());
- if (pluginsElm == null) {
- return Collections.emptyList();
- } else {
- List pluginElms = pluginsElm.getChildren("plugin", pluginManagement.getNamespace());
-
- List plugins = new ArrayList<>(pluginElms.size());
-
- for (Element pluginElm : pluginElms) {
- plugins.add(new JDomPlugin(pluginElm));
- }
-
- return plugins;
- }
+ return pluginManagement
+ .childElement("plugins")
+ .map(plugins -> plugins.childElements("plugin")
+ .map(plugin -> (Plugin) new DomTripPlugin(plugin, editor))
+ .collect(Collectors.toList()))
+ .orElse(Collections.emptyList());
}
@Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomProfile.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripProfile.java
similarity index 74%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomProfile.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripProfile.java
index 343f0678b..5ffc55253 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomProfile.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripProfile.java
@@ -16,32 +16,27 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
import java.util.List;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
import org.apache.maven.model.BuildBase;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.Profile;
-import org.jdom2.Element;
/**
- * JDOM2 implementation of poms PROFILE element.
+ * DomTrip implementation of poms PROFILE element.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomProfile extends Profile {
- private final JDomModelBase modelBase;
+public class DomTripProfile extends Profile {
+ private final DomTripModelBase modelBase;
- /**
- * Constructor for JDomProfile.
- *
- * @param profile a {@link org.jdom2.Element} object
- */
- public JDomProfile(Element profile) {
- this.modelBase = new JDomModelBase(profile);
+ public DomTripProfile(Element profile, Editor editor) {
+ this.modelBase = new DomTripModelBase(profile, editor);
}
@Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomProperties.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripProperties.java
similarity index 75%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomProperties.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripProperties.java
index bb6f59087..367f08740 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomProperties.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripProperties.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
import java.io.IOException;
import java.io.InputStream;
@@ -30,38 +30,37 @@
import java.util.Properties;
import java.util.Set;
-import org.jdom2.Element;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
/**
- * JDOM2 implementation of poms PROPERTIES element
- * Only few methods are properly implemented as the underlying data structure of {@link java.util.Hashtable} is never populated.
+ * DomTrip implementation of poms PROPERTIES element.
+ * Only few methods are properly implemented as the underlying data structure of
+ * {@link java.util.Hashtable} is never populated.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomProperties extends Properties {
+public class DomTripProperties extends Properties {
private final Element properties;
+ private final Editor editor;
- /**
- * Constructor for JDomProperties.
- *
- * @param properties a {@link org.jdom2.Element} object
- */
- public JDomProperties(Element properties) {
+ public DomTripProperties(Element properties, Editor editor) {
this.properties = properties;
+ this.editor = editor;
}
@Override
public synchronized Object put(Object key, Object value) {
- Element property = properties.getChild((String) key, properties.getNamespace());
-
- if (property == null) {
- property = new Element((String) key, properties.getNamespace());
+ Element property = properties.childElement((String) key).orElse(null);
+ String oldValue;
+ if (property != null) {
+ oldValue = property.textContentTrimmed();
+ DomTripUtils.rewriteValue(editor, property, (String) value);
+ } else {
+ oldValue = null;
+ editor.addElement(properties, (String) key, (String) value);
}
- JDomUtils.rewriteValue(property, (String) value);
-
- // todo follow specs of Hashtable.put
- return null;
+ return oldValue;
}
@Override
@@ -107,20 +106,13 @@ public void storeToXML(OutputStream os, String comment, String encoding) throws
@Override
public String getProperty(String key) {
- Element property = properties.getChild(key, properties.getNamespace());
-
- if (property == null) {
- return null;
- } else {
- return property.getTextTrim();
- }
+ return properties.childElement(key).map(Element::textContentTrimmed).orElse(null);
}
@Override
public boolean containsKey(Object key) {
if (key instanceof String) {
- Element property = properties.getChild((String) key, properties.getNamespace());
- return property != null;
+ return properties.childElement((String) key).isPresent();
}
return false;
}
@@ -128,7 +120,6 @@ public boolean containsKey(Object key) {
@Override
public String getProperty(String key, String defaultValue) {
String property = getProperty(key);
-
return property == null ? defaultValue : property;
}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomReportPlugin.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripReportPlugin.java
similarity index 86%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomReportPlugin.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripReportPlugin.java
index da418b56c..90863af4b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomReportPlugin.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripReportPlugin.java
@@ -16,32 +16,27 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
import java.util.List;
import java.util.Map;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
import org.apache.maven.model.ReportPlugin;
import org.apache.maven.model.ReportSet;
import org.apache.maven.shared.release.transform.MavenCoordinate;
-import org.jdom2.Element;
/**
- * JDOM2 implementation of poms reports PLUGIN element.
+ * DomTrip implementation of poms reports PLUGIN element.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomReportPlugin extends ReportPlugin implements MavenCoordinate {
+public class DomTripReportPlugin extends ReportPlugin implements MavenCoordinate {
private final MavenCoordinate coordinate;
- /**
- * Constructor for JDomReportPlugin.
- *
- * @param reportPlugin a {@link org.jdom2.Element} object
- */
- public JDomReportPlugin(Element reportPlugin) {
- this.coordinate = new JDomMavenCoordinate(reportPlugin);
+ public DomTripReportPlugin(Element reportPlugin, Editor editor) {
+ this.coordinate = new DomTripMavenCoordinate(reportPlugin, editor);
}
@Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomReporting.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripReporting.java
similarity index 70%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomReporting.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripReporting.java
index bef77f514..64523d007 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomReporting.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripReporting.java
@@ -16,34 +16,31 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
import org.apache.maven.model.ReportPlugin;
import org.apache.maven.model.Reporting;
-import org.jdom2.Element;
/**
- * JDOM2 implementation of poms REPORTING element.
+ * DomTrip implementation of poms REPORTING element.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomReporting extends Reporting {
+public class DomTripReporting extends Reporting {
private final Element reporting;
+ private final Editor editor;
- /**
- * Constructor for JDomReporting.
- *
- * @param reporting a {@link org.jdom2.Element} object
- */
- public JDomReporting(Element reporting) {
+ public DomTripReporting(Element reporting, Editor editor) {
this.reporting = reporting;
+ this.editor = editor;
}
@Override
@@ -58,20 +55,12 @@ public String getOutputDirectory() {
@Override
public List getPlugins() {
- Element pluginsElm = reporting.getChild("plugins", reporting.getNamespace());
- if (pluginsElm == null) {
- return Collections.emptyList();
- } else {
- List pluginElms = pluginsElm.getChildren("plugin", reporting.getNamespace());
-
- List plugins = new ArrayList<>(pluginElms.size());
-
- for (Element pluginElm : pluginElms) {
- plugins.add(new JDomReportPlugin(pluginElm));
- }
-
- return plugins;
- }
+ return reporting
+ .childElement("plugins")
+ .map(plugins -> plugins.childElements("plugin")
+ .map(plugin -> (ReportPlugin) new DomTripReportPlugin(plugin, editor))
+ .collect(Collectors.toList()))
+ .orElse(Collections.emptyList());
}
@Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomScm.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripScm.java
similarity index 70%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomScm.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripScm.java
index f15fa8469..82232bc92 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomScm.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripScm.java
@@ -16,22 +16,24 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
import org.apache.maven.model.Scm;
-import org.jdom2.Element;
/**
- * JDOM2 implementation of poms SCM element.
+ * DomTrip implementation of poms SCM element.
*
- * @author Robert Scholte
- * @since 3.0
+ * @since 3.4
*/
-public class JDomScm extends Scm {
- private Element scm;
+public class DomTripScm extends Scm {
+ private final Element scm;
+ private final Editor editor;
- JDomScm(Element scm) {
+ DomTripScm(Element scm, Editor editor) {
this.scm = scm;
+ this.editor = editor;
}
@Override
@@ -41,7 +43,7 @@ public String getConnection() {
@Override
public void setConnection(String connection) {
- JDomUtils.rewriteElement("connection", connection, scm, scm.getNamespace());
+ DomTripUtils.rewriteElement(editor, "connection", connection, scm);
}
@Override
@@ -51,7 +53,7 @@ public String getDeveloperConnection() {
@Override
public void setDeveloperConnection(String developerConnection) {
- JDomUtils.rewriteElement("developerConnection", developerConnection, scm, scm.getNamespace());
+ DomTripUtils.rewriteElement(editor, "developerConnection", developerConnection, scm);
}
@Override
@@ -61,7 +63,7 @@ public String getTag() {
@Override
public void setTag(String tag) {
- JDomUtils.rewriteElement("tag", tag, scm, scm.getNamespace());
+ DomTripUtils.rewriteElement(editor, "tag", tag, scm);
}
@Override
@@ -71,6 +73,6 @@ public String getUrl() {
@Override
public void setUrl(String url) {
- JDomUtils.rewriteElement("url", url, scm, scm.getNamespace());
+ DomTripUtils.rewriteElement(editor, "url", url, scm);
}
}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripUtils.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripUtils.java
new file mode 100644
index 000000000..c5c9d28e3
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripUtils.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import java.util.Optional;
+
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+
+/**
+ * Common DomTrip functions.
+ *
+ * @since 3.4
+ */
+public final class DomTripUtils {
+
+ private DomTripUtils() {
+ // noop
+ }
+
+ /**
+ * Updates the text value of the given element. Preserves surrounding whitespace
+ * and CDATA sections when present.
+ *
+ * @param editor the editor for formatting-aware modifications
+ * @param element the element to update, must not be {@code null}
+ * @param value the text string to set, must not be {@code null}
+ */
+ public static void rewriteValue(Editor editor, Element element, String value) {
+ editor.setTextContent(element, value);
+ }
+
+ /**
+ * Creates, updates or removes a child element.
+ *
+ * @param editor the editor for formatting-aware modifications
+ * @param name the child element name
+ * @param value the text value to set, or {@code null} to remove the element
+ * @param root the parent element
+ * @return the created/updated element, or {@code null} if removed
+ */
+ public static Element rewriteElement(Editor editor, String name, String value, Element root) {
+ Optional tagElement = root.childElement(name);
+ if (tagElement.isPresent()) {
+ if (value != null) {
+ rewriteValue(editor, tagElement.get(), value);
+ return tagElement.get();
+ } else {
+ editor.removeElement(tagElement.get());
+ return null;
+ }
+ } else {
+ if (value != null) {
+ return editor.addElement(root, name, value);
+ }
+ }
+ return null;
+ }
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModel.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModel.java
deleted file mode 100644
index d5811b5f1..000000000
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModel.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.maven.model.Build;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.DependencyManagement;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.apache.maven.model.Profile;
-import org.apache.maven.model.Reporting;
-import org.apache.maven.model.Scm;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
-import org.apache.maven.shared.release.util.CiFriendlyVersion;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Text;
-
-/**
- * JDOM2 implementation of poms PROJECT element.
- *
- * @author Robert Scholte
- * @since 3.0
- */
-public class JDomModel extends Model {
- private final Element project;
-
- private final JDomModelBase modelBase;
-
- /**
- * The ReleaseDescriptor after a commit performed.
- */
- private final ReleaseDescriptor releaseDescriptor;
-
- /**
- * Constructor for JDomModel.
- *
- * @param document a {@link org.jdom2.Document} object
- */
- public JDomModel(Document document, ReleaseDescriptor releaseDescriptor) {
- this(document.getRootElement(), releaseDescriptor);
- }
-
- /**
- * Constructor for JDomModel.
- *
- * @param project a {@link org.jdom2.Element} object
- */
- public JDomModel(Element project, ReleaseDescriptor releaseDescriptor) {
- this.project = project;
- this.releaseDescriptor = releaseDescriptor;
- this.modelBase = new JDomModelBase(project);
- }
-
- @Override
- public Build getBuild() {
- return modelBase.getBuild();
- }
-
- @Override
- public List getDependencies() {
- return modelBase.getDependencies();
- }
-
- @Override
- public DependencyManagement getDependencyManagement() {
- return modelBase.getDependencyManagement();
- }
-
- @Override
- public Parent getParent() {
- Element elm = getParentElement();
- if (elm == null) {
- return null;
- } else {
- // this way scm setters change DOM tree immediately
- return new JDomParent(elm);
- }
- }
-
- private Element getParentElement() {
- return project.getChild("parent", project.getNamespace());
- }
-
- @Override
- public List getProfiles() {
- Element profilesElm = project.getChild("profiles", project.getNamespace());
- if (profilesElm == null) {
- return Collections.emptyList();
- } else {
- List profileElms = profilesElm.getChildren("profile", project.getNamespace());
-
- List profiles = new ArrayList<>(profileElms.size());
-
- for (Element profileElm : profileElms) {
- profiles.add(new JDomProfile(profileElm));
- }
-
- return profiles;
- }
- }
-
- @Override
- public Properties getProperties() {
- Element properties = project.getChild("properties", project.getNamespace());
-
- if (properties == null) {
- return null;
- } else {
- return new JDomProperties(properties);
- }
- }
-
- @Override
- public Reporting getReporting() {
- Element reporting = project.getChild("reporting", project.getNamespace());
-
- if (reporting == null) {
- return null;
- } else {
- return new JDomReporting(reporting);
- }
- }
-
- @Override
- public void setScm(Scm scm) {
- if (scm == null) {
- JDomUtils.rewriteElement("scm", null, project, project.getNamespace());
- } else {
- Element scmRoot = new Element("scm");
- scmRoot.addContent("\n ");
-
- // Write current values to JDOM2 tree
- Scm jdomScm = new JDomScm(scmRoot);
- jdomScm.setConnection(scm.getConnection());
- jdomScm.setDeveloperConnection(scm.getDeveloperConnection());
- jdomScm.setTag(scm.getTag());
- jdomScm.setUrl(scm.getUrl());
-
- project.addContent("\n ").addContent(scmRoot).addContent("\n");
- }
- }
-
- @Override
- public Scm getScm() {
- Element elm = project.getChild("scm", project.getNamespace());
- if (elm == null) {
- return null;
- } else {
- // this way scm setters change DOM tree immediately
- return new JDomScm(elm);
- }
- }
-
- @Override
- public void setVersion(String version) {
- Element versionElement = project.getChild("version", project.getNamespace());
-
- String parentVersion;
- Element parent = getParentElement();
- if (parent != null) {
- parentVersion = parent.getChildTextTrim("version", project.getNamespace());
- } else {
- parentVersion = null;
- }
-
- if (versionElement == null) {
- // never add version when parent references CI friendly property
- if (!(parentVersion != null && CiFriendlyVersion.isCiFriendlyVersion(parentVersion))
- && !version.equals(parentVersion)) {
- // we will add this after artifactId, since it was missing but different from the inherited version
- Element artifactIdElement = project.getChild("artifactId", project.getNamespace());
- int index = project.indexOf(artifactIdElement);
-
- versionElement = new Element("version", project.getNamespace());
- versionElement.setText(version);
- project.addContent(index + 1, new Text("\n "));
- project.addContent(index + 2, versionElement);
- }
- } else {
- if (CiFriendlyVersion.isCiFriendlyVersion(versionElement.getTextNormalize())) {
- // try to rewrite property if CI friendly expression is used
- CiFriendlyVersion.rewriteCiFriendlyProperties(version, getProperties(), releaseDescriptor);
- } else {
- JDomUtils.rewriteValue(versionElement, version);
- }
- }
- }
-}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelBase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelBase.java
deleted file mode 100644
index 209af354c..000000000
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelBase.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.maven.model.Build;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.DependencyManagement;
-import org.jdom2.Element;
-
-/**
- * JDomModelBase class.
- *
- * @author Robert Scholte
- * @since 3.0
- */
-public class JDomModelBase {
- private final Element modelBase;
-
- /**
- * Constructor for JDomModelBase.
- *
- * @param modelBase a {@link org.jdom2.Element} object
- */
- public JDomModelBase(Element modelBase) {
- this.modelBase = modelBase;
- }
-
- /**
- * getBuild.
- *
- * @return a {@link org.apache.maven.model.Build} object
- */
- public Build getBuild() {
- Element elm = modelBase.getChild("build", modelBase.getNamespace());
- if (elm == null) {
- return null;
- } else {
- // this way build setters change DOM tree immediately
- return new JDomBuild(elm);
- }
- }
-
- /**
- * getDependencies.
- *
- * @return a {@link java.util.List} object
- */
- public List getDependencies() {
- Element dependenciesElm = modelBase.getChild("dependencies", modelBase.getNamespace());
- if (dependenciesElm == null) {
- return Collections.emptyList();
- } else {
- List dependencyElms = dependenciesElm.getChildren("dependency", modelBase.getNamespace());
-
- List dependencies = new ArrayList<>(dependencyElms.size());
-
- for (Element dependencyElm : dependencyElms) {
- dependencies.add(new JDomDependency(dependencyElm));
- }
-
- return dependencies;
- }
- }
-
- /**
- * getDependencyManagement.
- *
- * @return a {@link org.apache.maven.model.DependencyManagement} object
- */
- public DependencyManagement getDependencyManagement() {
- Element elm = modelBase.getChild("dependencyManagement", modelBase.getNamespace());
- if (elm == null) {
- return null;
- } else {
- // this way build setters change DOM tree immediately
- return new JDomDependencyManagement(elm);
- }
- }
-}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETL.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETL.java
deleted file mode 100644
index 10e2a11ed..000000000
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETL.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.Iterator;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.maven.model.Model;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.release.ReleaseExecutionException;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
-import org.apache.maven.shared.release.transform.ModelETL;
-import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.util.xml.XmlStreamWriter;
-import org.jdom2.CDATA;
-import org.jdom2.Comment;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.JDOMException;
-import org.jdom2.Namespace;
-import org.jdom2.filter.ContentFilter;
-import org.jdom2.filter.ElementFilter;
-import org.jdom2.input.SAXBuilder;
-import org.jdom2.output.Format;
-import org.jdom2.output.XMLOutputter;
-
-/**
- * JDOM2 implementation for extracting, transform, loading the Model (pom.xml)
- *
- * @author Robert Scholte
- * @since 3.0
- */
-public class JDomModelETL implements ModelETL {
- private ReleaseDescriptor releaseDescriptor;
-
- private MavenProject project;
-
- private Document document;
-
- private String intro = null;
- private String outtro = null;
-
- private String ls = ReleaseUtil.LS;
-
- /**
- * Setter for the field ls.
- *
- * @param ls a {@link java.lang.String} object
- */
- public void setLs(String ls) {
- this.ls = ls;
- }
-
- /**
- * Setter for the field releaseDescriptor.
- *
- * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
- */
- public void setReleaseDescriptor(ReleaseDescriptor releaseDescriptor) {
- this.releaseDescriptor = releaseDescriptor;
- }
-
- /**
- * Setter for the field project.
- *
- * @param project a {@link org.apache.maven.project.MavenProject} object
- */
- public void setProject(MavenProject project) {
- this.project = project;
- }
-
- @Override
- public void extract(File pomFile) throws ReleaseExecutionException {
- try {
- String content = ReleaseUtil.readXmlFile(pomFile, ls);
- // we need to eliminate any extra whitespace inside elements, as JDOM2 will nuke it
- content = content.replaceAll("<([^!][^>]*?)\\s{2,}([^>]*?)>", "<$1 $2>");
- content = content.replaceAll("(\\s{2,})/>", "$1 />");
-
- SAXBuilder builder = new SAXBuilder();
- document = builder.build(new StringReader(content));
-
- // Normalize line endings to platform's style (XML processors like JDOM2 normalize line endings to "\n" as
- // per section 2.11 of the XML spec)
- normaliseLineEndings(document);
-
- // rewrite DOM as a string to find differences, since text outside the root element is not tracked
- StringWriter w = new StringWriter();
- Format format = Format.getRawFormat();
- format.setLineSeparator(ls);
- XMLOutputter out = new XMLOutputter(format);
- out.output(document.getRootElement(), w);
-
- int index = content.indexOf(w.toString());
- if (index >= 0) {
- intro = content.substring(0, index);
- outtro = content.substring(index + w.toString().length());
- } else {
- /*
- * NOTE: Due to whitespace, attribute reordering or entity expansion the above indexOf test can easily
- * fail. So let's try harder. Maybe some day, when JDOM2 offers a StaxBuilder and this builder employes
- * XMLInputFactory2.P_REPORT_PROLOG_WHITESPACE, this whole mess can be avoided.
- */
- // CHECKSTYLE_OFF: LocalFinalVariableName
- final String SPACE = "\\s++";
- final String XML = "<\\?(?:(?:[^\"'>]++)|(?:\"[^\"]*+\")|(?:'[^']*+'))*+>";
- final String INTSUB = "\\[(?:(?:[^\"'\\]]++)|(?:\"[^\"]*+\")|(?:'[^']*+'))*+\\]";
- final String DOCTYPE =
- "]++)|(?:\"[^\"]*+\")|(?:'[^']*+')|(?:" + INTSUB + "))*+>";
- final String PI = XML;
- final String COMMENT = "";
-
- final String INTRO =
- "(?:(?:" + SPACE + ")|(?:" + XML + ")|(?:" + DOCTYPE + ")|(?:" + COMMENT + ")|(?:" + PI + "))*";
- final String OUTRO = "(?:(?:" + SPACE + ")|(?:" + COMMENT + ")|(?:" + PI + "))*";
- final String POM = "(?s)(" + INTRO + ")(.*?)(" + OUTRO + ")";
- // CHECKSTYLE_ON: LocalFinalVariableName
-
- Matcher matcher = Pattern.compile(POM).matcher(content);
- if (matcher.matches()) {
- intro = matcher.group(1);
- outtro = matcher.group(matcher.groupCount());
- }
- }
- } catch (JDOMException | IOException e) {
- throw new ReleaseExecutionException("Error reading POM: " + e.getMessage(), e);
- }
- }
-
- @Override
- public void transform() {}
-
- @Override
- public void load(File targetFile) throws ReleaseExecutionException {
- writePom(targetFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro);
- }
-
- @Override
- public Model getModel() {
- return new JDomModel(document, releaseDescriptor);
- }
-
- private void normaliseLineEndings(Document document) {
- for (Iterator> i = document.getDescendants(new ContentFilter(ContentFilter.COMMENT)); i.hasNext(); ) {
- Comment c = (Comment) i.next();
- c.setText(ReleaseUtil.normalizeLineEndings(c.getText(), ls));
- }
- for (Iterator> i = document.getDescendants(new ContentFilter(ContentFilter.CDATA)); i.hasNext(); ) {
- CDATA c = (CDATA) i.next();
- c.setText(ReleaseUtil.normalizeLineEndings(c.getText(), ls));
- }
- }
-
- private void writePom(
- File pomFile,
- Document document,
- ReleaseDescriptor releaseDescriptor,
- String modelVersion,
- String intro,
- String outtro)
- throws ReleaseExecutionException {
- Element rootElement = document.getRootElement();
-
- if (releaseDescriptor.isAddSchema()) {
- Namespace pomNamespace = Namespace.getNamespace("", "http://maven.apache.org/POM/" + modelVersion);
- rootElement.setNamespace(pomNamespace);
- Namespace xsiNamespace = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
- rootElement.addNamespaceDeclaration(xsiNamespace);
-
- if (rootElement.getAttribute("schemaLocation", xsiNamespace) == null) {
- rootElement.setAttribute(
- "schemaLocation",
- "http://maven.apache.org/POM/" + modelVersion + " https://maven.apache.org/xsd/maven-"
- + modelVersion + ".xsd",
- xsiNamespace);
- }
-
- // the empty namespace is considered equal to the POM namespace, so match them up to avoid extra xmlns=""
- ElementFilter elementFilter = new ElementFilter(Namespace.getNamespace(""));
- for (Iterator> i = rootElement.getDescendants(elementFilter); i.hasNext(); ) {
- Element e = (Element) i.next();
- e.setNamespace(pomNamespace);
- }
- }
-
- try (Writer writer = new XmlStreamWriter(pomFile)) {
- if (intro != null) {
- writer.write(intro);
- }
-
- Format format = Format.getRawFormat();
- format.setLineSeparator(ls);
- XMLOutputter out = new XMLOutputter(format);
- out.output(document.getRootElement(), writer);
-
- if (outtro != null) {
- writer.write(outtro);
- }
- } catch (IOException e) {
- throw new ReleaseExecutionException("Error writing POM: " + e.getMessage(), e);
- }
- }
-}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomUtils.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomUtils.java
deleted file mode 100644
index e29b2c8c9..000000000
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomUtils.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.util.Iterator;
-
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.jdom2.Text;
-
-/**
- * Common JDOM2 functions.
- *
- * @author Robert Scholte
- * @since 3.0
- */
-public final class JDomUtils {
-
- private JDomUtils() {
- // noop
- }
-
- /**
- * Updates the text value of the given element. The primary purpose of this method is to preserve any whitespace and
- * comments around the original text value.
- *
- * @param element the element to update, must not be null
- * @param value the text string to set, must not be null
- */
- public static void rewriteValue(Element element, String value) {
- Text text = null;
- if (element.getContent() != null) {
- for (Iterator> it = element.getContent().iterator(); it.hasNext(); ) {
- Object content = it.next();
- if ((content instanceof Text) && ((Text) content).getTextTrim().length() > 0) {
- text = (Text) content;
- while (it.hasNext()) {
- content = it.next();
- if (content instanceof Text) {
- text.append((Text) content);
- it.remove();
- } else {
- break;
- }
- }
- break;
- }
- }
- }
- if (text == null) {
- element.addContent(value);
- } else {
- String chars = text.getText();
- String trimmed = text.getTextTrim();
- int idx = chars.indexOf(trimmed);
- String leadingWhitespace = chars.substring(0, idx);
- String trailingWhitespace = chars.substring(idx + trimmed.length());
- text.setText(leadingWhitespace + value + trailingWhitespace);
- }
- }
-
- /**
- * rewriteElement.
- *
- * @param name a {@link java.lang.String} object
- * @param value a {@link java.lang.String} object
- * @param root a {@link org.jdom2.Element} object
- * @param namespace a {@link org.jdom2.Namespace} object
- * @return a {@link org.jdom2.Element} object
- */
- public static Element rewriteElement(String name, String value, Element root, Namespace namespace) {
- Element tagElement = root.getChild(name, namespace);
- if (tagElement != null) {
- if (value != null) {
- rewriteValue(tagElement, value);
- } else {
- int index = root.indexOf(tagElement);
- root.removeContent(index);
- for (int i = index - 1; i >= 0; i--) {
- if (root.getContent(i) instanceof Text) {
- root.removeContent(i);
- } else {
- break;
- }
- }
- }
- } else {
- if (value != null) {
- Element element = new Element(name, namespace);
- element.setText(value);
- root.addContent(" ").addContent(element).addContent("\n ");
- tagElement = element;
- }
- }
- return tagElement;
- }
-}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
index efa316db4..cd66471cd 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
@@ -33,7 +33,7 @@
import org.apache.maven.shared.release.config.ReleaseUtils;
import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
-import org.apache.maven.shared.release.transform.jdom2.JDomModelETLFactory;
+import org.apache.maven.shared.release.transform.domtrip.DomTripModelETLFactory;
import org.apache.maven.shared.release.util.ReleaseUtil;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
@@ -58,7 +58,7 @@ abstract class AbstractRewritingReleasePhaseTestCase extends AbstractReleaseTest
@BeforeEach
public void setUpAbstractRewritingReleasePhaseTestCase() throws Exception {
if (getTestedPhase() instanceof AbstractRewritePomsPhase) {
- ((AbstractRewritePomsPhase) getTestedPhase()).setModelETL(JDomModelETLFactory.NAME);
+ ((AbstractRewritePomsPhase) getTestedPhase()).setModelETL(DomTripModelETLFactory.NAME);
((AbstractRewritePomsPhase) getTestedPhase()).setStartTime(0);
}
}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
index aa386c6bc..af0efe72f 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
@@ -23,6 +23,7 @@
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.Iterator;
@@ -501,4 +502,27 @@ void testRewritePomWithCheckModificationExcludes() throws Exception {
comparePomFiles(reactorProjects);
}
+
+ @Test
+ void testRewriteFormattingPreservation() throws Exception {
+ List reactorProjects = createReactorProjects("formatting-preservation");
+ ReleaseDescriptorBuilder builder =
+ createConfigurationForPomWithParentAlternateNextVersion(reactorProjects, "formatting-preservation");
+ builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
+
+ phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
+
+ comparePomFiles(reactorProjects);
+
+ // Verify exact formatting preservation (byte-for-byte), which the XMLUnit comparison above does not check.
+ // The old JDOM2 implementation would collapse multi-line attributes, alter self-closing tag spacing,
+ // and reorder attributes — DomTrip preserves all of these exactly.
+ for (MavenProject project : reactorProjects) {
+ File actualFile = project.getFile();
+ File expectedFile = new File(actualFile.getParentFile(), "expected-pom.xml");
+ String expected = new String(Files.readAllBytes(expectedFile.toPath()));
+ String actual = new String(Files.readAllBytes(actualFile.toPath()));
+ assertEquals(expected, actual, "Exact formatting not preserved for " + actualFile.getName());
+ }
+ }
}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomBuildTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripBuildTest.java
similarity index 56%
rename from maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomBuildTest.java
rename to maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripBuildTest.java
index b8255d12b..73d0c80ec 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomBuildTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripBuildTest.java
@@ -16,12 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
-import java.io.StringReader;
-
-import org.jdom2.Document;
-import org.jdom2.input.SAXBuilder;
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -29,236 +27,284 @@
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
-class JDomBuildTest {
- private SAXBuilder builder = new SAXBuilder();
+class DomTripBuildTest {
- @Test
- void testGetExtensions() throws Exception {
- String content = "";
- Document document = builder.build(new StringReader(content));
- assertNotNull(new JDomBuild(document.getRootElement()).getExtensions());
- assertEquals(0, new JDomBuild(document.getRootElement()).getExtensions().size());
+ private DomTripBuild createBuild(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripBuild(document.root(), editor);
+ }
- content = "";
- document = builder.build(new StringReader(content));
- assertEquals(0, new JDomBuild(document.getRootElement()).getExtensions().size());
+ @Test
+ void testGetExtensionsEmpty() {
+ assertNotNull(createBuild("").getExtensions());
+ assertEquals(0, createBuild("").getExtensions().size());
+ }
- content = "";
- document = builder.build(new StringReader(content));
- assertEquals(1, new JDomBuild(document.getRootElement()).getExtensions().size());
+ @Test
+ void testGetExtensionsEmptyContainer() {
+ assertEquals(
+ 0, createBuild("").getExtensions().size());
}
@Test
- void testGetPluginManagement() throws Exception {
- String content = "";
- Document document = builder.build(new StringReader(content));
- assertNull(new JDomBuild(document.getRootElement()).getPluginManagement());
+ void testGetExtensionsOne() {
+ assertEquals(
+ 1,
+ createBuild("")
+ .getExtensions()
+ .size());
+ }
- content = "";
- document = builder.build(new StringReader(content));
- assertNotNull(new JDomBuild(document.getRootElement()).getPluginManagement());
+ @Test
+ void testGetPluginManagementMissing() {
+ assertNull(createBuild("").getPluginManagement());
}
@Test
- void testGetPlugins() throws Exception {
- String content = "";
- Document document = builder.build(new StringReader(content));
- assertNotNull(new JDomBuild(document.getRootElement()).getPlugins());
- assertEquals(0, new JDomBuild(document.getRootElement()).getPlugins().size());
+ void testGetPluginManagementPresent() {
+ assertNotNull(createBuild("").getPluginManagement());
+ }
- content = "";
- document = builder.build(new StringReader(content));
- assertEquals(0, new JDomBuild(document.getRootElement()).getPlugins().size());
+ @Test
+ void testGetPluginsEmpty() {
+ assertNotNull(createBuild("").getPlugins());
+ assertEquals(0, createBuild("").getPlugins().size());
+ }
- content = "";
- document = builder.build(new StringReader(content));
- assertEquals(1, new JDomBuild(document.getRootElement()).getPlugins().size());
+ @Test
+ void testGetPluginsEmptyContainer() {
+ assertEquals(0, createBuild("").getPlugins().size());
}
- // All other methods throw UnsupportedOperationException
+ @Test
+ void testGetPluginsOne() {
+ assertEquals(
+ 1,
+ createBuild("")
+ .getPlugins()
+ .size());
+ }
@Test
void testFlushPluginMap() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).flushPluginMap());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .flushPluginMap());
}
@Test
void testAddExtension() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).addExtension(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .addExtension(null));
}
@Test
void testGetOutputDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getOutputDirectory());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getOutputDirectory());
}
@Test
void testGetScriptSourceDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getScriptSourceDirectory());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getScriptSourceDirectory());
}
@Test
void testGetSourceDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getSourceDirectory());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getSourceDirectory());
}
@Test
void testGetTestOutputDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getTestOutputDirectory());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getTestOutputDirectory());
}
@Test
void testGetTestSourceDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getTestSourceDirectory());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getTestSourceDirectory());
}
@Test
void testRemoveExtension() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).removeExtension(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .removeExtension(null));
}
@Test
void testSetExtensions() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setExtensions(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setExtensions(null));
}
@Test
void testSetOutputDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setOutputDirectory(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setOutputDirectory(null));
}
@Test
void testSetScriptSourceDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setScriptSourceDirectory(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setScriptSourceDirectory(null));
}
@Test
void testSetSourceDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setSourceDirectory(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setSourceDirectory(null));
}
@Test
- void testSetTestOutputDirectoryString() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setTestOutputDirectory(null));
+ void testSetTestOutputDirectory() {
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setTestOutputDirectory(null));
}
@Test
void testSetTestSourceDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setTestSourceDirectory(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setTestSourceDirectory(null));
}
@Test
void testAddFilter() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).addFilter(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .addFilter(null));
}
@Test
void testAddResource() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).addResource(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .addResource(null));
}
@Test
void testAddTestResource() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).addTestResource(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .addTestResource(null));
}
@Test
void testGetDefaultGoal() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getDefaultGoal());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getDefaultGoal());
}
@Test
void testGetDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getDirectory());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getDirectory());
}
@Test
void testGetFilters() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getFilters());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getFilters());
}
@Test
void testGetFinalName() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getFinalName());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getFinalName());
}
@Test
void testGetResources() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getResources());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getResources());
}
@Test
void testGetTestResources() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getTestResources());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getTestResources());
}
@Test
void testRemoveFilter() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).removeFilter(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .removeFilter(null));
}
@Test
void testRemoveResource() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).removeResource(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .removeResource(null));
}
@Test
void testRemoveTestResource() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).removeTestResource(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .removeTestResource(null));
}
@Test
void testSetDefaultGoal() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setDefaultGoal(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setDefaultGoal(null));
}
@Test
void testSetDirectory() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setDirectory(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setDirectory(null));
}
@Test
void testSetFilters() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setFilters(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setFilters(null));
}
@Test
void testSetFinalName() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setFinalName(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setFinalName(null));
}
@Test
void testSetResources() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setResources(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setResources(null));
}
@Test
void testSetTestResources() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setTestResources(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setTestResources(null));
}
@Test
void testSetPluginManagement() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setPluginManagement(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setPluginManagement(null));
}
@Test
void testAddPlugin() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).addPlugin(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .addPlugin(null));
}
@Test
void testRemovePlugin() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).removePlugin(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .removePlugin(null));
}
@Test
void testSetPlugins() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).setPlugins(null));
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .setPlugins(null));
}
@Test
void testGetPluginsAsMap() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomBuild(null).getPluginsAsMap());
+ assertThrows(UnsupportedOperationException.class, () -> createBuild("")
+ .getPluginsAsMap());
}
}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyManagementTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyManagementTest.java
similarity index 50%
rename from maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyManagementTest.java
rename to maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyManagementTest.java
index b5c101bc1..8f1ef5841 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyManagementTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyManagementTest.java
@@ -16,65 +16,69 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.shared.release.transform.jdom2;
+package org.apache.maven.shared.release.transform.domtrip;
-import java.io.StringReader;
-
-import org.jdom2.Document;
-import org.jdom2.input.SAXBuilder;
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
-class JDomDependencyManagementTest {
- private SAXBuilder builder = new SAXBuilder();
+class DomTripDependencyManagementTest {
+
+ private DomTripDependencyManagement createDependencyManagement(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripDependencyManagement(document.root(), editor);
+ }
@Test
- void testGetDependencies() throws Exception {
- String content = "";
- Document document = builder.build(new StringReader(content));
- assertNotNull(new JDomDependencyManagement(document.getRootElement()).getDependencies());
+ void testGetDependenciesEmpty() {
+ assertNotNull(createDependencyManagement("")
+ .getDependencies());
assertEquals(
0,
- new JDomDependencyManagement(document.getRootElement())
+ createDependencyManagement("")
.getDependencies()
.size());
+ }
- content = "";
- document = builder.build(new StringReader(content));
+ @Test
+ void testGetDependenciesEmptyContainer() {
assertEquals(
0,
- new JDomDependencyManagement(document.getRootElement())
+ createDependencyManagement("")
.getDependencies()
.size());
+ }
- content = "";
- document = builder.build(new StringReader(content));
+ @Test
+ void testGetDependenciesOne() {
assertEquals(
1,
- new JDomDependencyManagement(document.getRootElement())
+ createDependencyManagement(
+ "")
.getDependencies()
.size());
}
- // All other methods throw UnsupportedOperationException
-
@Test
void testAddDependency() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependencyManagement(null).addDependency(null));
+ assertThrows(UnsupportedOperationException.class, () -> createDependencyManagement("")
+ .addDependency(null));
}
@Test
void testRemoveDependency() {
- assertThrows(
- UnsupportedOperationException.class, () -> new JDomDependencyManagement(null).removeDependency(null));
+ assertThrows(UnsupportedOperationException.class, () -> createDependencyManagement("")
+ .removeDependency(null));
}
@Test
- void testSetDependenciesListOfDependency() {
- assertThrows(
- UnsupportedOperationException.class, () -> new JDomDependencyManagement(null).setDependencies(null));
+ void testSetDependencies() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependencyManagement("")
+ .setDependencies(null));
}
}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyTest.java
new file mode 100644
index 000000000..7dd782b73
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyTest.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class DomTripDependencyTest {
+
+ private DomTripDependency createDependency(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripDependency(document.root(), editor);
+ }
+
+ @Test
+ void testGetArtifactIdMissing() {
+ assertNull(createDependency("").getArtifactId());
+ }
+
+ @Test
+ void testGetArtifactIdPresent() {
+ assertEquals(
+ "ARTIFACTID",
+ createDependency("ARTIFACTID")
+ .getArtifactId());
+ }
+
+ @Test
+ void testGetGroupIdMissing() {
+ assertNull(createDependency("").getGroupId());
+ }
+
+ @Test
+ void testGetGroupIdPresent() {
+ assertEquals(
+ "GROUPID",
+ createDependency("GROUPID")
+ .getGroupId());
+ }
+
+ @Test
+ void testGetVersionMissing() {
+ assertNull(createDependency("").getVersion());
+ }
+
+ @Test
+ void testGetVersionPresent() {
+ assertEquals(
+ "VERSION",
+ createDependency("VERSION")
+ .getVersion());
+ }
+
+ @Test
+ void testSetVersion() {
+ String xml = "OLD_VERSION";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+ new DomTripDependency(root, editor).setVersion("NEW_VERSION");
+ assertEquals("NEW_VERSION", root.childTextTrimmed("version"));
+ }
+
+ @Test
+ void testGetName() {
+ assertEquals("dependency", createDependency("").getName());
+ }
+
+ @Test
+ void testIsOptional() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .isOptional());
+ }
+
+ @Test
+ void testSetOptional() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setOptional(true));
+ }
+
+ @Test
+ void testAddExclusion() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .addExclusion(null));
+ }
+
+ @Test
+ void testGetClassifier() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .getClassifier());
+ }
+
+ @Test
+ void testGetExclusions() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .getExclusions());
+ }
+
+ @Test
+ void testGetScope() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .getScope());
+ }
+
+ @Test
+ void testGetSystemPath() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .getSystemPath());
+ }
+
+ @Test
+ void testGetType() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .getType());
+ }
+
+ @Test
+ void testRemoveExclusion() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .removeExclusion(null));
+ }
+
+ @Test
+ void testSetArtifactId() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setArtifactId(null));
+ }
+
+ @Test
+ void testSetClassifier() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setClassifier(null));
+ }
+
+ @Test
+ void testSetExclusions() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setExclusions(null));
+ }
+
+ @Test
+ void testSetGroupId() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setGroupId(null));
+ }
+
+ @Test
+ void testSetScope() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setScope(null));
+ }
+
+ @Test
+ void testSetSystemPath() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setSystemPath(null));
+ }
+
+ @Test
+ void testSetType() {
+ assertThrows(UnsupportedOperationException.class, () -> createDependency("")
+ .setType(null));
+ }
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripExtensionTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripExtensionTest.java
new file mode 100644
index 000000000..50ea74668
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripExtensionTest.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class DomTripExtensionTest {
+
+ private DomTripExtension createExtension(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripExtension(document.root(), editor);
+ }
+
+ @Test
+ void testGetArtifactIdMissing() {
+ assertNull(createExtension("").getArtifactId());
+ }
+
+ @Test
+ void testGetArtifactIdPresent() {
+ assertEquals(
+ "ARTIFACTID",
+ createExtension("ARTIFACTID")
+ .getArtifactId());
+ }
+
+ @Test
+ void testGetGroupIdMissing() {
+ assertNull(createExtension("").getGroupId());
+ }
+
+ @Test
+ void testGetGroupIdPresent() {
+ assertEquals(
+ "GROUPID",
+ createExtension("GROUPID")
+ .getGroupId());
+ }
+
+ @Test
+ void testGetVersionMissing() {
+ assertNull(createExtension("").getVersion());
+ }
+
+ @Test
+ void testGetVersionPresent() {
+ assertEquals(
+ "VERSION",
+ createExtension("VERSION")
+ .getVersion());
+ }
+
+ @Test
+ void testSetVersion() {
+ String xml = "OLD_VERSION";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+ new DomTripExtension(root, editor).setVersion("NEW_VERSION");
+ assertEquals("NEW_VERSION", root.childTextTrimmed("version"));
+ }
+
+ @Test
+ void testGetName() {
+ assertEquals("extension", createExtension("").getName());
+ }
+
+ @Test
+ void testSetArtifactId() {
+ assertThrows(UnsupportedOperationException.class, () -> createExtension("")
+ .setArtifactId(null));
+ }
+
+ @Test
+ void testSetGroupId() {
+ assertThrows(UnsupportedOperationException.class, () -> createExtension("")
+ .setGroupId(null));
+ }
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelTest.java
new file mode 100644
index 000000000..faf74b46c
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelTest.java
@@ -0,0 +1,202 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Scm;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+class DomTripModelTest {
+ private final ReleaseDescriptor releaseDescriptor = new ReleaseDescriptorBuilder().build();
+
+ private DomTripModel createModel(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripModel(document.root(), editor, releaseDescriptor);
+ }
+
+ @Test
+ void testGetScmMissing() {
+ assertNull(createModel("").getScm());
+ }
+
+ @Test
+ void testGetScmPresent() {
+ assertNotNull(createModel("").getScm());
+ }
+
+ @Test
+ void testSetScm() {
+ String xml = "";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Model model = new DomTripModel(document.root(), editor, releaseDescriptor);
+ assertNull(model.getScm());
+
+ model.setScm(new Scm());
+ assertNotNull(model.getScm());
+
+ model.setScm(null);
+ assertNull(model.getScm());
+ }
+
+ @Test
+ void testSetVersionNoExistingVersion() {
+ String xml = "test";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+ Model model = new DomTripModel(root, editor, releaseDescriptor);
+ assertNull(root.childTextTrimmed("version"));
+
+ model.setVersion("VERSION");
+ assertEquals("VERSION", root.childTextTrimmed("version"));
+ }
+
+ @Test
+ void testSetVersionExisting() {
+ String xml = "OLD";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+ Model model = new DomTripModel(root, editor, releaseDescriptor);
+
+ model.setVersion("NEW");
+ assertEquals("NEW", root.childTextTrimmed("version"));
+ }
+
+ @Test
+ void testSetVersionInheritedFromParentCiFriendly() {
+ String xml = "${revision}${changelist}";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+ Model model = new DomTripModel(root, editor, releaseDescriptor);
+ assertNull(root.childElement("version").orElse(null));
+
+ model.setVersion("PARENT_VERSION");
+ // should not add version element when parent uses CI friendly property
+ assertNull(root.childElement("version").orElse(null));
+ }
+
+ @Test
+ void testSetVersionSameAsParent() {
+ String xml = "PARENT_VERSION";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+ Model model = new DomTripModel(root, editor, releaseDescriptor);
+
+ model.setVersion("PARENT_VERSION");
+ // should not add version element when version equals parent version
+ assertNull(root.childElement("version").orElse(null));
+
+ model.setVersion("DIFFERENT_VERSION");
+ assertEquals("DIFFERENT_VERSION", root.childTextTrimmed("version"));
+ }
+
+ @Test
+ void testGetParentMissing() {
+ assertNull(createModel("").getParent());
+ }
+
+ @Test
+ void testGetParentPresent() {
+ assertNotNull(createModel("1.0")
+ .getParent());
+ }
+
+ @Test
+ void testGetProfilesEmpty() {
+ assertEquals(0, createModel("").getProfiles().size());
+ }
+
+ @Test
+ void testGetProfilesPresent() {
+ assertEquals(
+ 1,
+ createModel("")
+ .getProfiles()
+ .size());
+ }
+
+ @Test
+ void testGetPropertiesMissing() {
+ assertNull(createModel("").getProperties());
+ }
+
+ @Test
+ void testGetPropertiesPresent() {
+ assertNotNull(createModel("value")
+ .getProperties());
+ }
+
+ @Test
+ void testGetReportingMissing() {
+ assertNull(createModel("").getReporting());
+ }
+
+ @Test
+ void testGetReportingPresent() {
+ assertNotNull(createModel("").getReporting());
+ }
+
+ @Test
+ void testGetBuildMissing() {
+ assertNull(createModel("").getBuild());
+ }
+
+ @Test
+ void testGetBuildPresent() {
+ assertNotNull(createModel("").getBuild());
+ }
+
+ @Test
+ void testGetDependenciesEmpty() {
+ assertEquals(0, createModel("").getDependencies().size());
+ }
+
+ @Test
+ void testGetDependenciesPresent() {
+ assertEquals(
+ 1,
+ createModel("")
+ .getDependencies()
+ .size());
+ }
+
+ @Test
+ void testGetDependencyManagementMissing() {
+ assertNull(createModel("").getDependencyManagement());
+ }
+
+ @Test
+ void testGetDependencyManagementPresent() {
+ assertNotNull(createModel("").getDependencyManagement());
+ }
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripParentTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripParentTest.java
new file mode 100644
index 000000000..d58457058
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripParentTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class DomTripParentTest {
+
+ private DomTripParent createParent(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripParent(document.root(), editor);
+ }
+
+ @Test
+ void testGetVersion() {
+ assertEquals(
+ "1.0", createParent("1.0").getVersion());
+ }
+
+ @Test
+ void testGetVersionMissing() {
+ assertNull(createParent("").getVersion());
+ }
+
+ @Test
+ void testSetVersion() {
+ String xml = "";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+ assertNull(root.childText("version"));
+
+ new DomTripParent(root, editor).setVersion("VERSION");
+ assertEquals("VERSION", root.childTextTrimmed("version"));
+
+ new DomTripParent(root, editor).setVersion(null);
+ assertNull(root.childElement("version").orElse(null));
+ }
+
+ @Test
+ void testSetVersionUpdate() {
+ String xml = "OLD";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ new DomTripParent(root, editor).setVersion("NEW");
+ assertEquals("NEW", root.childTextTrimmed("version"));
+ }
+
+ @Test
+ void testGetArtifactId() {
+ assertThrows(UnsupportedOperationException.class, () -> createParent("")
+ .getArtifactId());
+ }
+
+ @Test
+ void testGetGroupId() {
+ assertThrows(UnsupportedOperationException.class, () -> createParent("")
+ .getGroupId());
+ }
+
+ @Test
+ void testGetRelativePath() {
+ assertThrows(UnsupportedOperationException.class, () -> createParent("")
+ .getRelativePath());
+ }
+
+ @Test
+ void testSetArtifactId() {
+ assertThrows(UnsupportedOperationException.class, () -> createParent("")
+ .setArtifactId(null));
+ }
+
+ @Test
+ void testSetGroupId() {
+ assertThrows(UnsupportedOperationException.class, () -> createParent("")
+ .setGroupId(null));
+ }
+
+ @Test
+ void testSetRelativePath() {
+ assertThrows(UnsupportedOperationException.class, () -> createParent("")
+ .setRelativePath(null));
+ }
+
+ @Test
+ void testGetId() {
+ assertThrows(UnsupportedOperationException.class, () -> createParent("")
+ .getId());
+ }
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripPropertiesTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripPropertiesTest.java
new file mode 100644
index 000000000..7e369447d
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripPropertiesTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.Writer;
+
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class DomTripPropertiesTest {
+
+ private DomTripProperties createProperties(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripProperties(document.root(), editor);
+ }
+
+ @Test
+ void testSetPropertyExisting() {
+ String xml = "OLD_VALUE";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ assertEquals("OLD_VALUE", root.childTextTrimmed("KEY"));
+ new DomTripProperties(root, editor).setProperty("KEY", "NEW_VALUE");
+ assertEquals("NEW_VALUE", root.childTextTrimmed("KEY"));
+ }
+
+ @Test
+ void testSetPropertyNew() {
+ String xml = "";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ assertNull(root.childTextTrimmed("KEY"));
+ new DomTripProperties(root, editor).setProperty("KEY", "VALUE");
+ assertEquals("VALUE", root.childTextTrimmed("KEY"));
+ }
+
+ @Test
+ void testGetPropertyMissing() {
+ assertNull(createProperties("").getProperty("KEY"));
+ }
+
+ @Test
+ void testGetPropertyPresent() {
+ assertEquals(
+ "VALUE",
+ createProperties("VALUE").getProperty("KEY"));
+ }
+
+ @Test
+ void testGetPropertyDefault() {
+ DomTripProperties props = createProperties("");
+ assertNull(props.getProperty("KEY", null));
+ assertEquals("", props.getProperty("KEY", ""));
+ assertEquals("DEFAULT", props.getProperty("KEY", "DEFAULT"));
+ }
+
+ @Test
+ void testGetPropertyDefaultWithExisting() {
+ DomTripProperties props = createProperties("VALUE");
+ assertEquals("VALUE", props.getProperty("KEY", "DEFAULT"));
+ }
+
+ @Test
+ void testContainsKeyPresent() {
+ assertTrue(createProperties("VALUE").containsKey("KEY"));
+ }
+
+ @Test
+ void testContainsKeyMissing() {
+ assertFalse(createProperties("").containsKey("KEY"));
+ }
+
+ @Test
+ void testContainsKeyNonString() {
+ assertFalse(createProperties("").containsKey(42));
+ }
+
+ @Test
+ void testLoadReader() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .load((Reader) null));
+ }
+
+ @Test
+ void testLoadInputStream() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .load((InputStream) null));
+ }
+
+ @Test
+ void testSave() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .save(null, null));
+ }
+
+ @Test
+ void testStoreWriter() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .store((Writer) null, null));
+ }
+
+ @Test
+ void testStoreOutputStream() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .store((OutputStream) null, null));
+ }
+
+ @Test
+ void testLoadFromXML() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .loadFromXML(null));
+ }
+
+ @Test
+ void testStoreToXML() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .storeToXML(null, null));
+ }
+
+ @Test
+ void testStoreToXMLEncoded() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .storeToXML(null, null, (String) null));
+ }
+
+ @Test
+ void testPropertyNames() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .propertyNames());
+ }
+
+ @Test
+ void testStringPropertyNames() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .stringPropertyNames());
+ }
+
+ @Test
+ void testListPrintStream() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .list((PrintStream) null));
+ }
+
+ @Test
+ void testListPrintWriter() {
+ assertThrows(UnsupportedOperationException.class, () -> createProperties("")
+ .list((PrintWriter) null));
+ }
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripScmTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripScmTest.java
new file mode 100644
index 000000000..436299243
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/domtrip/DomTripScmTest.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.release.transform.domtrip;
+
+import eu.maveniverse.domtrip.Document;
+import eu.maveniverse.domtrip.Editor;
+import eu.maveniverse.domtrip.Element;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class DomTripScmTest {
+
+ private DomTripScm createScm(String xml) {
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ return new DomTripScm(document.root(), editor);
+ }
+
+ @Test
+ void testGetConnection() {
+ assertThrows(
+ UnsupportedOperationException.class, () -> createScm("").getConnection());
+ }
+
+ @Test
+ void testGetDeveloperConnection() {
+ assertThrows(
+ UnsupportedOperationException.class, () -> createScm("").getDeveloperConnection());
+ }
+
+ @Test
+ void testGetTag() {
+ assertThrows(
+ UnsupportedOperationException.class, () -> createScm("").getTag());
+ }
+
+ @Test
+ void testGetUrl() {
+ assertThrows(
+ UnsupportedOperationException.class, () -> createScm("").getUrl());
+ }
+
+ @Test
+ void testSetConnection() {
+ String xml = "";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ assertNull(root.childText("connection"));
+
+ new DomTripScm(root, editor).setConnection("CONNECTION");
+ assertEquals("CONNECTION", root.childTextTrimmed("connection"));
+
+ new DomTripScm(root, editor).setConnection(null);
+ assertNull(root.childElement("connection").orElse(null));
+ }
+
+ @Test
+ void testSetDeveloperConnection() {
+ String xml = "";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ assertNull(root.childText("developerConnection"));
+
+ new DomTripScm(root, editor).setDeveloperConnection("DEVELOPERCONNECTION");
+ assertEquals("DEVELOPERCONNECTION", root.childTextTrimmed("developerConnection"));
+
+ new DomTripScm(root, editor).setDeveloperConnection(null);
+ assertNull(root.childElement("developerConnection").orElse(null));
+ }
+
+ @Test
+ void testSetTag() {
+ String xml = "";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ assertNull(root.childText("tag"));
+
+ new DomTripScm(root, editor).setTag("TAG");
+ assertEquals("TAG", root.childTextTrimmed("tag"));
+
+ new DomTripScm(root, editor).setTag(null);
+ assertNull(root.childElement("tag").orElse(null));
+ }
+
+ @Test
+ void testSetUrl() {
+ String xml = "";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ assertNull(root.childText("url"));
+
+ new DomTripScm(root, editor).setUrl("URL");
+ assertEquals("URL", root.childTextTrimmed("url"));
+
+ new DomTripScm(root, editor).setUrl(null);
+ assertNull(root.childElement("url").orElse(null));
+ }
+
+ @Test
+ void testSetConnectionUpdate() {
+ String xml = "OLD";
+ Document document = Document.of(xml);
+ Editor editor = new Editor(document);
+ Element root = document.root();
+
+ new DomTripScm(root, editor).setConnection("NEW");
+ assertEquals("NEW", root.childTextTrimmed("connection"));
+ }
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyTest.java
deleted file mode 100644
index 008744a6c..000000000
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.io.StringReader;
-
-import org.jdom2.Element;
-import org.jdom2.input.SAXBuilder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class JDomDependencyTest {
- private SAXBuilder builder = new SAXBuilder();
-
- @Test
- void testIsOptional() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).isOptional());
- }
-
- @Test
- void testSetOptional() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setOptional(true));
- }
-
- @Test
- void testAddExclusion() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).addExclusion(null));
- }
-
- @Test
- void testGetArtifactId() throws Exception {
- String content = "";
- Element dependencyElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomDependency(dependencyElm).getArtifactId());
- content = "ARTIFACTID";
- dependencyElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("ARTIFACTID", new JDomDependency(dependencyElm).getArtifactId());
- }
-
- @Test
- void testGetClassifier() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).getClassifier());
- }
-
- @Test
- void testGetExclusions() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).getExclusions());
- }
-
- @Test
- void testGetGroupId() throws Exception {
- String content = "";
- Element dependencyElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomDependency(dependencyElm).getGroupId());
- content = "GROUPID";
- dependencyElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("GROUPID", new JDomDependency(dependencyElm).getGroupId());
- }
-
- @Test
- void testGetScope() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).getScope());
- }
-
- @Test
- void testGetSystemPath() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).getSystemPath());
- }
-
- @Test
- void testGetType() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).getType());
- }
-
- @Test
- void testGetVersion() throws Exception {
- String content = "";
- Element dependencyElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomDependency(dependencyElm).getVersion());
- content = "VERSION";
- dependencyElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("VERSION", new JDomDependency(dependencyElm).getVersion());
- }
-
- @Test
- void testRemoveExclusion() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).removeExclusion(null));
- }
-
- @Test
- void testSetArtifactIdString() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setArtifactId(null));
- }
-
- @Test
- void testSetClassifierString() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setClassifier(null));
- }
-
- @Test
- void testSetExclusions() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setExclusions(null));
- }
-
- @Test
- void testSetGroupIdString() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setGroupId(null));
- }
-
- @Test
- void testSetScopeString() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setScope(null));
- }
-
- @Test
- void testSetSystemPathString() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setSystemPath(null));
- }
-
- @Test
- void testSetTypeString() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomDependency(null).setType(null));
- }
-
- @Test
- void testSetVersionString() throws Exception {
- String content = "OLD_VERSION";
- Element dependencyElm = builder.build(new StringReader(content)).getRootElement();
- new JDomDependency(dependencyElm).setVersion("NEW_VERSION");
- assertEquals("NEW_VERSION", getVersion(dependencyElm));
- }
-
- @Test
- void testGetName() {
- assertEquals("dependency", new JDomDependency(null).getName());
- }
-
- private String getVersion(Element dependencyElm) {
- return dependencyElm.getChildTextTrim("version", dependencyElm.getNamespace());
- }
-}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomExtensionTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomExtensionTest.java
deleted file mode 100644
index c3db301fb..000000000
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomExtensionTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.io.StringReader;
-
-import org.jdom2.Element;
-import org.jdom2.input.SAXBuilder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.AssertionsKt.assertNull;
-
-class JDomExtensionTest {
- private SAXBuilder builder = new SAXBuilder();
-
- @Test
- void testGetArtifactId() throws Exception {
- String content = "";
- Element extensionElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomExtension(extensionElm).getArtifactId());
-
- content = "ARTIFACTID";
- extensionElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("ARTIFACTID", new JDomExtension(extensionElm).getArtifactId());
- }
-
- @Test
- void testGetGroupId() throws Exception {
- String content = "";
- Element extensionElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomExtension(extensionElm).getGroupId());
-
- content = "GROUPID";
- extensionElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("GROUPID", new JDomExtension(extensionElm).getGroupId());
- }
-
- @Test
- void testGetVersion() throws Exception {
- String content = "";
- Element extensionElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomExtension(extensionElm).getVersion());
-
- content = "VERSION";
- extensionElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("VERSION", new JDomExtension(extensionElm).getVersion());
- }
-
- @Test
- void testSetArtifactId() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomExtension(null).setArtifactId(null));
- }
-
- @Test
- void testSetGroupId() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomExtension(null).setGroupId(null));
- }
-
- @Test
- void testSetVersion() throws Exception {
- String content = "OLD_VERSION";
- Element extensionElm = builder.build(new StringReader(content)).getRootElement();
- new JDomExtension(extensionElm).setVersion("NEW_VERSION");
- assertEquals("NEW_VERSION", getVersion(extensionElm));
- }
-
- @Test
- void testGetName() {
- assertEquals("extension", new JDomExtension(null).getName());
- }
-
- private String getVersion(Element extensionElm) {
- return extensionElm.getChildTextTrim("version", extensionElm.getNamespace());
- }
-}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomModelTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomModelTest.java
deleted file mode 100644
index 242008de1..000000000
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomModelTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.io.StringReader;
-
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Scm;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
-import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.input.SAXBuilder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-class JDomModelTest {
- private SAXBuilder builder = new SAXBuilder();
- private ReleaseDescriptor releaseDescriptor = new ReleaseDescriptorBuilder().build();
-
- @Test
- void testGetScm() throws Exception {
- String content = "";
- Document document = builder.build(new StringReader(content));
- assertNull(new JDomModel(document, releaseDescriptor).getScm());
- }
-
- @Test
- void testSetScm() throws Exception {
- String content = "";
- Document document = builder.build(new StringReader(content));
- Model model = new JDomModel(document, releaseDescriptor);
- assertNull(model.getScm());
-
- model.setScm(new Scm());
- assertNotNull(model.getScm());
-
- model.setScm(null);
- assertNull(model.getScm());
- }
-
- @Test
- void testSetVersion() throws Exception {
- String content = "";
- Element projectElm = builder.build(new StringReader(content)).getRootElement();
- Model model = new JDomModel(projectElm, releaseDescriptor);
- assertNull(model.getVersion());
-
- model.setVersion("VERSION");
- assertEquals("VERSION", getVersion(projectElm));
-
- model.setVersion(null);
- assertNull(model.getVersion());
-
- // inherit from parent via CI friendly
- content = "${revision}${changelist}";
- projectElm = builder.build(new StringReader(content)).getRootElement();
- model = new JDomModel(projectElm, releaseDescriptor);
- assertNull(model.getVersion());
- model.setVersion("PARENT_VERSION");
- assertNull(getVersion(projectElm));
-
- // this business logic might need to moved.
- content = "PARENT_VERSION";
- projectElm = builder.build(new StringReader(content)).getRootElement();
- model = new JDomModel(projectElm, releaseDescriptor);
- assertNull(model.getVersion());
-
- model.setVersion("PARENT_VERSION");
- assertNull(getVersion(projectElm));
-
- model.setVersion("VERSION");
- assertEquals("VERSION", getVersion(projectElm));
-
- model.setVersion(null);
- assertNull(model.getVersion());
- }
-
- private String getVersion(Element projectElm) {
- return projectElm.getChildText("version", projectElm.getNamespace());
- }
-}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomParentTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomParentTest.java
deleted file mode 100644
index 856ff8480..000000000
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomParentTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.io.StringReader;
-
-import org.jdom2.Element;
-import org.jdom2.input.SAXBuilder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class JDomParentTest {
- private SAXBuilder builder = new SAXBuilder();
-
- @Test
- void testGetArtifactId() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomParent(null).getArtifactId());
- }
-
- @Test
- void testGetGroupId() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomParent(null).getGroupId());
- }
-
- @Test
- void testGetRelativePath() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomParent(null).getRelativePath());
- }
-
- @Test
- void testGetVersion() throws Exception {
- String content = "1.0";
- Element parentElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("1.0", new JDomParent(parentElm).getVersion());
- }
-
- @Test
- void testSetArtifactId() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomParent(null).setArtifactId(null));
- }
-
- @Test
- void testSetGroupId() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomParent(null).setGroupId(null));
- }
-
- @Test
- void testSetRelativePath() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomParent(null).setRelativePath(null));
- }
-
- @Test
- void testSetVersionString() throws Exception {
- String content = "";
- Element parentElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(getVersion(parentElm));
- new JDomParent(parentElm).setVersion("VERSION");
- assertEquals("VERSION", getVersion(parentElm));
- new JDomParent(parentElm).setVersion(null);
- assertNull(getVersion(parentElm));
- }
-
- @Test
- void testGetId() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomParent(null).getId());
- }
-
- private String getVersion(Element parentElm) {
- return parentElm.getChildText("version", parentElm.getNamespace());
- }
-}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomPropertiesTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomPropertiesTest.java
deleted file mode 100644
index 6e3792107..000000000
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomPropertiesTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.Writer;
-
-import org.jdom2.Element;
-import org.jdom2.input.SAXBuilder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class JDomPropertiesTest {
- private SAXBuilder builder = new SAXBuilder();
-
- @Test
- void testSetProperty() throws Exception {
- String content = "";
- Element propertiesElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(getProperty(propertiesElm, "KEY"));
-
- // Adding not allowed, prepare properties
- content = "OLD_VALUE";
- propertiesElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("OLD_VALUE", getProperty(propertiesElm, "KEY"));
- new JDomProperties(propertiesElm).setProperty("KEY", "NEW_VALUE");
- assertEquals("NEW_VALUE", getProperty(propertiesElm, "KEY"));
- }
-
- @Test
- void testLoadReader() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).load((Reader) null));
- }
-
- @Test
- void testLoadInputStream() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).load((InputStream) null));
- }
-
- @Test
- void testSave() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).save(null, null));
- }
-
- @Test
- void testStoreWriter() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).store((Writer) null, null));
- }
-
- @Test
- void testStoreOutputStream() {
- assertThrows(
- UnsupportedOperationException.class, () -> new JDomProperties(null).store((OutputStream) null, null));
- }
-
- @Test
- void testLoadFromXML() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).loadFromXML(null));
- }
-
- @Test
- void testStoreToXML() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).storeToXML(null, null));
- }
-
- @Test
- void testStoreToXMLEncoded() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null)
- .storeToXML(null, null, (String) null));
- }
-
- @Test
- void testGetProperty() throws Exception {
- String content = "";
- Element propertiesElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomProperties(propertiesElm).getProperty("KEY"));
-
- content = "VALUE";
- propertiesElm = builder.build(new StringReader(content)).getRootElement();
- assertEquals("VALUE", new JDomProperties(propertiesElm).getProperty("KEY"));
- }
-
- @Test
- void testGetPropertyDefault() throws Exception {
- String content = "";
- Element propertiesElm = builder.build(new StringReader(content)).getRootElement();
- assertNull(new JDomProperties(propertiesElm).getProperty("KEY", null));
- assertEquals("", new JDomProperties(propertiesElm).getProperty("KEY", ""));
- }
-
- @Test
- void testPropertyNames() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).propertyNames());
- }
-
- @Test
- void testStringPropertyNames() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).stringPropertyNames());
- }
-
- @Test
- void testListPrintStream() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).list((PrintStream) null));
- }
-
- @Test
- void testListPrintWriter() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomProperties(null).list((PrintWriter) null));
- }
-
- private String getProperty(Element propertiesElm, String key) {
- return propertiesElm.getChildText(key, propertiesElm.getNamespace());
- }
-}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomScmTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomScmTest.java
deleted file mode 100644
index e6a94530b..000000000
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/transform/jdom2/JDomScmTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.shared.release.transform.jdom2;
-
-import java.io.StringReader;
-
-import org.jdom2.Element;
-import org.jdom2.input.SAXBuilder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class JDomScmTest {
- private SAXBuilder builder = new SAXBuilder();
-
- @Test
- void testGetConnection() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomScm(null).getConnection());
- }
-
- @Test
- void testGetDeveloperConnection() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomScm(null).getDeveloperConnection());
- }
-
- @Test
- void testGetTag() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomScm(null).getTag());
- }
-
- @Test
- void testGetUrl() {
- assertThrows(UnsupportedOperationException.class, () -> new JDomScm(null).getUrl());
- }
-
- @Test
- void testSetConnectionString() throws Exception {
- String content = "";
- Element scmElm = builder.build(new StringReader(content)).getRootElement();
-
- assertNull(getConnection(scmElm));
-
- new JDomScm(scmElm).setConnection("CONNECTION");
- assertEquals("CONNECTION", getConnection(scmElm));
-
- new JDomScm(scmElm).setConnection(null);
- assertNull(getConnection(scmElm));
- }
-
- @Test
- void testSetDeveloperConnectionString() throws Exception {
- String content = "";
- Element scmElm = builder.build(new StringReader(content)).getRootElement();
-
- assertNull(getDeveloperConnection(scmElm));
-
- new JDomScm(scmElm).setDeveloperConnection("DEVELOPERCONNECTION");
- assertEquals("DEVELOPERCONNECTION", getDeveloperConnection(scmElm));
-
- new JDomScm(scmElm).setDeveloperConnection(null);
- assertNull(getDeveloperConnection(scmElm));
- }
-
- @Test
- void testSetTagString() throws Exception {
- String content = "";
- Element scmElm = builder.build(new StringReader(content)).getRootElement();
-
- assertNull(getUrl(scmElm));
-
- new JDomScm(scmElm).setUrl("URL");
- assertEquals("URL", getUrl(scmElm));
-
- new JDomScm(scmElm).setUrl(null);
- assertNull(getUrl(scmElm));
- }
-
- @Test
- void testSetUrlString() throws Exception {
- String content = "";
- Element scmElm = builder.build(new StringReader(content)).getRootElement();
-
- assertNull(getTag(scmElm));
-
- new JDomScm(scmElm).setTag("TAG");
- assertEquals("TAG", getTag(scmElm));
-
- new JDomScm(scmElm).setTag(null);
- assertNull(getTag(scmElm));
- }
-
- private String getConnection(Element scmElm) {
- return scmElm.getChildText("connection", scmElm.getNamespace());
- }
-
- private String getDeveloperConnection(Element scmElm) {
- return scmElm.getChildText("developerConnection", scmElm.getNamespace());
- }
-
- private String getTag(Element scmElm) {
- return scmElm.getChildText("tag", scmElm.getNamespace());
- }
-
- private String getUrl(Element scmElm) {
- return scmElm.getChildText("url", scmElm.getNamespace());
- }
-}
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/expected-pom.xml
new file mode 100644
index 000000000..0686f23a2
--- /dev/null
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/expected-pom.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ 4.0.0
+
+
+ groupId
+ artifactId
+ 1.0
+ pom
+
+
+
+ scm:svn:file://localhost/tmp/scm-repo/tags/release-label
+ scm:svn:file://localhost/tmp/scm-repo/tags/release-label
+ file://localhost/tmp/scm-repo/tags/release-label
+
+
+
+
+
+
+
+ groupId
+ subproject1
+ 2.0
+
+
+
+
+
+
+
+
+ groupId
+ subproject1
+ 2.0
+
+
+
+
+
+
+ subproject1
+ subproject2
+
+
+
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/pom.xml
new file mode 100644
index 000000000..b4e66319e
--- /dev/null
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/pom.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ 4.0.0
+
+
+ groupId
+ artifactId
+ 1.0-SNAPSHOT
+ pom
+
+
+
+ scm:svn:file://localhost/tmp/scm-repo/trunk
+ scm:svn:file://localhost/tmp/scm-repo/trunk
+ file://localhost/tmp/scm-repo/trunk
+
+
+
+
+
+
+
+ groupId
+ subproject1
+ 2.0-SNAPSHOT
+
+
+
+
+
+
+
+
+ groupId
+ subproject1
+ 2.0-SNAPSHOT
+
+
+
+
+
+
+ subproject1
+ subproject2
+
+
+
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject1/expected-pom.xml
new file mode 100644
index 000000000..4ba1988b3
--- /dev/null
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject1/expected-pom.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ 4.0.0
+
+
+
+ groupId
+ artifactId
+ 1.0
+
+
+ subproject1
+ 2.0
+
+
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject1/pom.xml
new file mode 100644
index 000000000..a3905249c
--- /dev/null
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject1/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ 4.0.0
+
+
+
+ groupId
+ artifactId
+ 1.0-SNAPSHOT
+
+
+ subproject1
+ 2.0-SNAPSHOT
+
+
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject2/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject2/expected-pom.xml
new file mode 100644
index 000000000..79c67f878
--- /dev/null
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject2/expected-pom.xml
@@ -0,0 +1,43 @@
+
+
+
+
+ 4.0.0
+
+
+ groupId
+ artifactId
+ 1.0
+
+
+ subproject2
+ 2.0
+
+
+
+ groupId
+ subproject1
+ 2.0
+
+
+
+
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject2/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject2/pom.xml
new file mode 100644
index 000000000..5859e7657
--- /dev/null
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/formatting-preservation/subproject2/pom.xml
@@ -0,0 +1,43 @@
+
+
+
+
+ 4.0.0
+
+
+ groupId
+ artifactId
+ 1.0-SNAPSHOT
+
+
+ subproject2
+ 2.0-SNAPSHOT
+
+
+
+ groupId
+ subproject1
+ 2.0-SNAPSHOT
+
+
+
+
diff --git a/pom.xml b/pom.xml
index c5f46271f..1331938c7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -263,9 +263,9 @@ under the License.
- org.jdom
- jdom2
- 2.0.6.1
+ eu.maveniverse.maven.domtrip
+ domtrip-core
+ 1.4.0
org.mockito