diff --git a/maven-release-manager/pom.xml b/maven-release-manager/pom.xml index d1252e7ce..7b58f7e20 100644 --- a/maven-release-manager/pom.xml +++ b/maven-release-manager/pom.xml @@ -149,8 +149,8 @@ under the License. - org.jdom - jdom2 + eu.maveniverse.maven.domtrip + domtrip-core diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java index 8311a1361..4ded83f73 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java @@ -62,7 +62,7 @@ import org.apache.maven.shared.release.transform.ModelETL; import org.apache.maven.shared.release.transform.ModelETLFactory; import org.apache.maven.shared.release.transform.ModelETLRequest; -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.CiFriendlyVersion; import org.apache.maven.shared.release.util.MavenExpression; import org.apache.maven.shared.release.util.ReleaseUtil; @@ -90,9 +90,9 @@ public abstract class AbstractRewritePomsPhase extends AbstractReleasePhase impl private Map scmTranslators; /** - * Use jdom2-sax as default. + * Use domtrip as default. */ - private String modelETL = JDomModelETLFactory.NAME; + private String modelETL = DomTripModelETLFactory.NAME; private long startTime = -1 * 1000; diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomBuild.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripBuild.java similarity index 77% rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomBuild.java rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripBuild.java index 74ed10c22..7e904fa74 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomBuild.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripBuild.java @@ -16,36 +16,33 @@ * 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.Build; import org.apache.maven.model.Extension; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginManagement; import org.apache.maven.model.Resource; -import org.jdom2.Element; /** - * JDOM2 implementation of poms BUILD element. + * DomTrip implementation of poms BUILD element. * - * @author Robert Scholte - * @since 3.0 + * @since 3.4 */ -public class JDomBuild extends Build { +public class DomTripBuild extends Build { private final Element build; + private final Editor editor; - /** - *

Constructor for JDomBuild.

- * - * @param build a {@link org.jdom2.Element} object - */ - public JDomBuild(Element build) { + public DomTripBuild(Element build, Editor editor) { this.build = build; + this.editor = editor; } @Override @@ -55,18 +52,11 @@ public void addExtension(Extension extension) { @Override public List getExtensions() { - Element extensionsElm = build.getChild("extensions", build.getNamespace()); - if (extensionsElm == null) { - return Collections.emptyList(); - } else { - List extensionElms = extensionsElm.getChildren("extension", build.getNamespace()); - - List extensions = new ArrayList<>(extensionElms.size()); - for (Element extensionElm : extensionElms) { - extensions.add(new JDomExtension(extensionElm)); - } - return extensions; - } + return build.childElement("extensions") + .map(exts -> exts.childElements("extension") + .map(ext -> (Extension) new DomTripExtension(ext, editor)) + .collect(Collectors.toList())) + .orElse(Collections.emptyList()); } @Override @@ -221,12 +211,9 @@ public void setTestResources(List testResources) { @Override public PluginManagement getPluginManagement() { - Element pluginManagementElm = build.getChild("pluginManagement", build.getNamespace()); - if (pluginManagementElm == null) { - return null; - } else { - return new JDomPluginManagement(pluginManagementElm); - } + return build.childElement("pluginManagement") + .map(elm -> (PluginManagement) new DomTripPluginManagement(elm, editor)) + .orElse(null); } @Override @@ -241,20 +228,11 @@ public void addPlugin(Plugin plugin) { @Override public List getPlugins() { - Element pluginsElm = build.getChild("plugins", build.getNamespace()); - if (pluginsElm == null) { - return Collections.emptyList(); - } else { - List pluginElms = pluginsElm.getChildren("plugin", build.getNamespace()); - - List plugins = new ArrayList<>(pluginElms.size()); - - for (Element pluginElm : pluginElms) { - plugins.add(new JDomPlugin(pluginElm)); - } - - return plugins; - } + return build.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/JDomDependency.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependency.java similarity index 87% rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomDependency.java rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependency.java index 9bc7b6e96..1d819763c 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomDependency.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependency.java @@ -16,31 +16,26 @@ * 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.Dependency; import org.apache.maven.model.Exclusion; import org.apache.maven.shared.release.transform.MavenCoordinate; -import org.jdom2.Element; /** - * JDOM2 implementation of poms DEPENDENCY element. + * DomTrip implementation of poms DEPENDENCY element. * - * @author Robert Scholte - * @since 3.0 + * @since 3.4 */ -public class JDomDependency extends Dependency implements MavenCoordinate { +public class DomTripDependency extends Dependency implements MavenCoordinate { private final MavenCoordinate coordinate; - /** - *

Constructor for JDomDependency.

- * - * @param dependency a {@link org.jdom2.Element} object - */ - public JDomDependency(Element dependency) { - this.coordinate = new JDomMavenCoordinate(dependency); + public DomTripDependency(Element dependency, Editor editor) { + this.coordinate = new DomTripMavenCoordinate(dependency, editor); } @Override diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyManagement.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyManagement.java similarity index 57% rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyManagement.java rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyManagement.java index cfe6e9216..bece5bc6b 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyManagement.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyManagement.java @@ -16,32 +16,29 @@ * 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.stream.Collectors; +import eu.maveniverse.domtrip.Editor; +import eu.maveniverse.domtrip.Element; import org.apache.maven.model.Dependency; import org.apache.maven.model.DependencyManagement; -import org.jdom2.Element; /** - * JDOM2 implementation of poms DEPENDENCYMANAGEMENT element. + * DomTrip implementation of poms DEPENDENCYMANAGEMENT element. * - * @author Robert Scholte - * @since 3.0 + * @since 3.4 */ -public class JDomDependencyManagement extends DependencyManagement { +public class DomTripDependencyManagement extends DependencyManagement { private final Element dependencyManagement; + private final Editor editor; - /** - *

Constructor for JDomDependencyManagement.

- * - * @param dependencyManagement a {@link org.jdom2.Element} object - */ - public JDomDependencyManagement(Element dependencyManagement) { + public DomTripDependencyManagement(Element dependencyManagement, Editor editor) { this.dependencyManagement = dependencyManagement; + this.editor = editor; } @Override @@ -51,21 +48,12 @@ public void addDependency(Dependency dependency) { @Override public List getDependencies() { - Element dependenciesElm = dependencyManagement.getChild("dependencies", dependencyManagement.getNamespace()); - if (dependenciesElm == null) { - return Collections.emptyList(); - } else { - List dependencyElms = - dependenciesElm.getChildren("dependency", dependencyManagement.getNamespace()); - - List dependencies = new ArrayList<>(dependencyElms.size()); - - for (Element dependencyElm : dependencyElms) { - dependencies.add(new JDomDependency(dependencyElm)); - } - - return dependencies; - } + return dependencyManagement + .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/JDomExtension.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripExtension.java similarity index 77% rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomExtension.java rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripExtension.java index 2a08c35ca..e93f51d8d 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomExtension.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripExtension.java @@ -16,28 +16,23 @@ * 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.Extension; import org.apache.maven.shared.release.transform.MavenCoordinate; -import org.jdom2.Element; /** - * JDOM2 implementation of poms EXTENSION element. + * DomTrip implementation of poms EXTENSION element. * - * @author Robert Scholte - * @since 3.0 + * @since 3.4 */ -public class JDomExtension extends Extension implements MavenCoordinate { +public class DomTripExtension extends Extension implements MavenCoordinate { private final MavenCoordinate coordinate; - /** - *

Constructor for JDomExtension.

- * - * @param extension a {@link org.jdom2.Element} object - */ - public JDomExtension(Element extension) { - this.coordinate = new JDomMavenCoordinate(extension); + public DomTripExtension(Element extension, Editor editor) { + this.coordinate = new DomTripMavenCoordinate(extension, editor); } @Override diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomMavenCoordinate.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripMavenCoordinate.java similarity index 55% rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomMavenCoordinate.java rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripMavenCoordinate.java index 7f431d816..b1ec8fcd8 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomMavenCoordinate.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripMavenCoordinate.java @@ -16,60 +16,48 @@ * 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.shared.release.transform.MavenCoordinate; -import org.jdom2.Element; /** - *

JDomMavenCoordinate class.

+ * DomTrip implementation of {@link MavenCoordinate}. * - * @author Robert Scholte - * @since 3.0 + * @since 3.4 */ -public class JDomMavenCoordinate implements MavenCoordinate { +public class DomTripMavenCoordinate implements MavenCoordinate { private final Element element; + private final Editor editor; - /** - *

Constructor for JDomMavenCoordinate.

- * - * @param elm a {@link org.jdom2.Element} object - */ - public JDomMavenCoordinate(Element elm) { - this.element = elm; + public DomTripMavenCoordinate(Element element, Editor editor) { + this.element = element; + this.editor = editor; } @Override public String getGroupId() { - return element.getChildTextTrim("groupId", element.getNamespace()); + return element.childTextTrimmed("groupId"); } @Override public String getArtifactId() { - return element.getChildTextTrim("artifactId", element.getNamespace()); + return element.childTextTrimmed("artifactId"); } @Override public String getVersion() { - Element version = getVersionElement(); - if (version == null) { - return null; - } else { - return version.getTextTrim(); - } - } - - private Element getVersionElement() { - return element.getChild("version", element.getNamespace()); + return element.childElement("version").map(e -> e.textContentTrimmed()).orElse(null); } @Override public void setVersion(String version) { - JDomUtils.rewriteValue(getVersionElement(), version); + element.childElement("version").ifPresent(e -> DomTripUtils.rewriteValue(editor, e, version)); } @Override public String getName() { - return element.getName(); + return element.name(); } } diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModel.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModel.java new file mode 100644 index 000000000..c04f001aa --- /dev/null +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModel.java @@ -0,0 +1,165 @@ +/* + * 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.Collections; +import java.util.List; +import java.util.Properties; +import java.util.stream.Collectors; + +import eu.maveniverse.domtrip.Document; +import eu.maveniverse.domtrip.Editor; +import eu.maveniverse.domtrip.Element; +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; + +/** + * DomTrip implementation of poms PROJECT element. + * + * @since 3.4 + */ +public class DomTripModel extends Model { + private final Element project; + private final Editor editor; + private final DomTripModelBase modelBase; + private final ReleaseDescriptor releaseDescriptor; + + public DomTripModel(Document document, Editor editor, ReleaseDescriptor releaseDescriptor) { + this(document.root(), editor, releaseDescriptor); + } + + public DomTripModel(Element project, Editor editor, ReleaseDescriptor releaseDescriptor) { + this.project = project; + this.editor = editor; + this.releaseDescriptor = releaseDescriptor; + this.modelBase = new DomTripModelBase(project, editor); + } + + @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() { + return project.childElement("parent") + .map(elm -> (Parent) new DomTripParent(elm, editor)) + .orElse(null); + } + + @Override + public List getProfiles() { + return project.childElement("profiles") + .map(profilesElm -> profilesElm + .childElements("profile") + .map(profileElm -> (Profile) new DomTripProfile(profileElm, editor)) + .collect(Collectors.toList())) + .orElse(Collections.emptyList()); + } + + @Override + public Properties getProperties() { + return project.childElement("properties") + .map(elm -> (Properties) new DomTripProperties(elm, editor)) + .orElse(null); + } + + @Override + public Reporting getReporting() { + return project.childElement("reporting") + .map(elm -> (Reporting) new DomTripReporting(elm, editor)) + .orElse(null); + } + + @Override + public void setScm(Scm scm) { + if (scm == null) { + project.childElement("scm").ifPresent(editor::removeElement); + } else { + Element scmRoot = editor.addElement(project, "scm"); + + // Write current values to DomTrip tree + Scm domTripScm = new DomTripScm(scmRoot, editor); + domTripScm.setConnection(scm.getConnection()); + domTripScm.setDeveloperConnection(scm.getDeveloperConnection()); + domTripScm.setTag(scm.getTag()); + domTripScm.setUrl(scm.getUrl()); + } + } + + @Override + public Scm getScm() { + return project.childElement("scm") + .map(elm -> (Scm) new DomTripScm(elm, editor)) + .orElse(null); + } + + @Override + public void setVersion(String version) { + Element versionElement = project.childElement("version").orElse(null); + + String parentVersion; + Element parent = project.childElement("parent").orElse(null); + if (parent != null) { + parentVersion = parent.childTextTrimmed("version"); + } 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.childElement("artifactId").orElse(null); + if (artifactIdElement != null) { + versionElement = editor.insertElementAfter(artifactIdElement, "version", version); + } else { + editor.addElement(project, "version", version); + } + } + } else { + String versionText = versionElement.textContentTrimmed(); + if (versionText != null && CiFriendlyVersion.isCiFriendlyVersion(versionText)) { + // try to rewrite property if CI friendly expression is used + CiFriendlyVersion.rewriteCiFriendlyProperties(version, getProperties(), releaseDescriptor); + } else { + DomTripUtils.rewriteValue(editor, versionElement, version); + } + } + } +} diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelBase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelBase.java new file mode 100644 index 000000000..363823e06 --- /dev/null +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripModelBase.java @@ -0,0 +1,67 @@ +/* + * 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.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import eu.maveniverse.domtrip.Editor; +import eu.maveniverse.domtrip.Element; +import org.apache.maven.model.Build; +import org.apache.maven.model.Dependency; +import org.apache.maven.model.DependencyManagement; + +/** + * DomTrip shared model base logic. + * + * @since 3.4 + */ +public class DomTripModelBase { + private final Element modelBase; + private final Editor editor; + + public DomTripModelBase(Element modelBase, Editor editor) { + this.modelBase = modelBase; + this.editor = editor; + } + + public Build getBuild() { + return modelBase + .childElement("build") + .map(elm -> (Build) new DomTripBuild(elm, editor)) + .orElse(null); + } + + public List 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