Skip to content

Commit 566e048

Browse files
gnodetclaude
andcommitted
Replace JDOM2 with DomTrip for lossless POM XML editing
DomTrip provides lossless XML round-tripping, preserving comments, whitespace, attribute order, quote styles, CDATA sections, and entity encoding. This eliminates the intro/outtro hacks required by JDOM2. - Replace `org.jdom:jdom2` with `eu.maveniverse.maven.domtrip:domtrip-core:1.1.0` - Implement 16 DomTrip wrapper classes mirroring the previous JDOM2 wrappers - Delete all JDOM2 source (18 files) and test (8 files) classes - Switch default ModelETL from `jdom2` to `domtrip` - Add 8 new unit test classes (147 tests) covering all DomTrip wrappers - Add formatting preservation IT with byte-for-byte comparison - Fix `DomTripProperties.put()` to return previous value per `Hashtable.put` contract Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0ef3690 commit 566e048

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2026
-1770
lines changed

maven-release-manager/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ under the License.
149149
</dependency>
150150

151151
<dependency>
152-
<groupId>org.jdom</groupId>
153-
<artifactId>jdom2</artifactId>
152+
<groupId>eu.maveniverse.maven.domtrip</groupId>
153+
<artifactId>domtrip-core</artifactId>
154154
</dependency>
155155

156156
<dependency>

maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
import org.apache.maven.shared.release.transform.ModelETL;
6363
import org.apache.maven.shared.release.transform.ModelETLFactory;
6464
import org.apache.maven.shared.release.transform.ModelETLRequest;
65-
import org.apache.maven.shared.release.transform.jdom2.JDomModelETLFactory;
65+
import org.apache.maven.shared.release.transform.domtrip.DomTripModelETLFactory;
6666
import org.apache.maven.shared.release.util.CiFriendlyVersion;
6767
import org.apache.maven.shared.release.util.MavenExpression;
6868
import org.apache.maven.shared.release.util.ReleaseUtil;
@@ -90,9 +90,9 @@ public abstract class AbstractRewritePomsPhase extends AbstractReleasePhase impl
9090
private Map<String, ScmTranslator> scmTranslators;
9191

9292
/**
93-
* Use jdom2-sax as default.
93+
* Use domtrip as default.
9494
*/
95-
private String modelETL = JDomModelETLFactory.NAME;
95+
private String modelETL = DomTripModelETLFactory.NAME;
9696

9797
private long startTime = -1 * 1000;
9898

maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomBuild.java renamed to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripBuild.java

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,36 +16,33 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.maven.shared.release.transform.jdom2;
19+
package org.apache.maven.shared.release.transform.domtrip;
2020

21-
import java.util.ArrayList;
2221
import java.util.Collections;
2322
import java.util.List;
2423
import java.util.Map;
24+
import java.util.stream.Collectors;
2525

26+
import eu.maveniverse.domtrip.Editor;
27+
import eu.maveniverse.domtrip.Element;
2628
import org.apache.maven.model.Build;
2729
import org.apache.maven.model.Extension;
2830
import org.apache.maven.model.Plugin;
2931
import org.apache.maven.model.PluginManagement;
3032
import org.apache.maven.model.Resource;
31-
import org.jdom2.Element;
3233

3334
/**
34-
* JDOM2 implementation of poms BUILD element.
35+
* DomTrip implementation of poms BUILD element.
3536
*
36-
* @author Robert Scholte
37-
* @since 3.0
37+
* @since 3.4
3838
*/
39-
public class JDomBuild extends Build {
39+
public class DomTripBuild extends Build {
4040
private final Element build;
41+
private final Editor editor;
4142

42-
/**
43-
* <p>Constructor for JDomBuild.</p>
44-
*
45-
* @param build a {@link org.jdom2.Element} object
46-
*/
47-
public JDomBuild(Element build) {
43+
public DomTripBuild(Element build, Editor editor) {
4844
this.build = build;
45+
this.editor = editor;
4946
}
5047

5148
@Override
@@ -55,18 +52,11 @@ public void addExtension(Extension extension) {
5552

5653
@Override
5754
public List<Extension> getExtensions() {
58-
Element extensionsElm = build.getChild("extensions", build.getNamespace());
59-
if (extensionsElm == null) {
60-
return Collections.emptyList();
61-
} else {
62-
List<Element> extensionElms = extensionsElm.getChildren("extension", build.getNamespace());
63-
64-
List<Extension> extensions = new ArrayList<>(extensionElms.size());
65-
for (Element extensionElm : extensionElms) {
66-
extensions.add(new JDomExtension(extensionElm));
67-
}
68-
return extensions;
69-
}
55+
return build.childElement("extensions")
56+
.map(exts -> exts.childElements("extension")
57+
.map(ext -> (Extension) new DomTripExtension(ext, editor))
58+
.collect(Collectors.toList()))
59+
.orElse(Collections.emptyList());
7060
}
7161

7262
@Override
@@ -221,12 +211,9 @@ public void setTestResources(List<Resource> testResources) {
221211

222212
@Override
223213
public PluginManagement getPluginManagement() {
224-
Element pluginManagementElm = build.getChild("pluginManagement", build.getNamespace());
225-
if (pluginManagementElm == null) {
226-
return null;
227-
} else {
228-
return new JDomPluginManagement(pluginManagementElm);
229-
}
214+
return build.childElement("pluginManagement")
215+
.map(elm -> (PluginManagement) new DomTripPluginManagement(elm, editor))
216+
.orElse(null);
230217
}
231218

232219
@Override
@@ -241,20 +228,11 @@ public void addPlugin(Plugin plugin) {
241228

242229
@Override
243230
public List<Plugin> getPlugins() {
244-
Element pluginsElm = build.getChild("plugins", build.getNamespace());
245-
if (pluginsElm == null) {
246-
return Collections.emptyList();
247-
} else {
248-
List<Element> pluginElms = pluginsElm.getChildren("plugin", build.getNamespace());
249-
250-
List<Plugin> plugins = new ArrayList<>(pluginElms.size());
251-
252-
for (Element pluginElm : pluginElms) {
253-
plugins.add(new JDomPlugin(pluginElm));
254-
}
255-
256-
return plugins;
257-
}
231+
return build.childElement("plugins")
232+
.map(plugins -> plugins.childElements("plugin")
233+
.map(plugin -> (Plugin) new DomTripPlugin(plugin, editor))
234+
.collect(Collectors.toList()))
235+
.orElse(Collections.emptyList());
258236
}
259237

260238
@Override

maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomDependency.java renamed to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependency.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,26 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.maven.shared.release.transform.jdom2;
19+
package org.apache.maven.shared.release.transform.domtrip;
2020

2121
import java.util.List;
2222

23+
import eu.maveniverse.domtrip.Editor;
24+
import eu.maveniverse.domtrip.Element;
2325
import org.apache.maven.model.Dependency;
2426
import org.apache.maven.model.Exclusion;
2527
import org.apache.maven.shared.release.transform.MavenCoordinate;
26-
import org.jdom2.Element;
2728

2829
/**
29-
* JDOM2 implementation of poms DEPENDENCY element.
30+
* DomTrip implementation of poms DEPENDENCY element.
3031
*
31-
* @author Robert Scholte
32-
* @since 3.0
32+
* @since 3.4
3333
*/
34-
public class JDomDependency extends Dependency implements MavenCoordinate {
34+
public class DomTripDependency extends Dependency implements MavenCoordinate {
3535
private final MavenCoordinate coordinate;
3636

37-
/**
38-
* <p>Constructor for JDomDependency.</p>
39-
*
40-
* @param dependency a {@link org.jdom2.Element} object
41-
*/
42-
public JDomDependency(Element dependency) {
43-
this.coordinate = new JDomMavenCoordinate(dependency);
37+
public DomTripDependency(Element dependency, Editor editor) {
38+
this.coordinate = new DomTripMavenCoordinate(dependency, editor);
4439
}
4540

4641
@Override

maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomDependencyManagement.java renamed to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripDependencyManagement.java

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,29 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.maven.shared.release.transform.jdom2;
19+
package org.apache.maven.shared.release.transform.domtrip;
2020

21-
import java.util.ArrayList;
2221
import java.util.Collections;
2322
import java.util.List;
23+
import java.util.stream.Collectors;
2424

25+
import eu.maveniverse.domtrip.Editor;
26+
import eu.maveniverse.domtrip.Element;
2527
import org.apache.maven.model.Dependency;
2628
import org.apache.maven.model.DependencyManagement;
27-
import org.jdom2.Element;
2829

2930
/**
30-
* JDOM2 implementation of poms DEPENDENCYMANAGEMENT element.
31+
* DomTrip implementation of poms DEPENDENCYMANAGEMENT element.
3132
*
32-
* @author Robert Scholte
33-
* @since 3.0
33+
* @since 3.4
3434
*/
35-
public class JDomDependencyManagement extends DependencyManagement {
35+
public class DomTripDependencyManagement extends DependencyManagement {
3636
private final Element dependencyManagement;
37+
private final Editor editor;
3738

38-
/**
39-
* <p>Constructor for JDomDependencyManagement.</p>
40-
*
41-
* @param dependencyManagement a {@link org.jdom2.Element} object
42-
*/
43-
public JDomDependencyManagement(Element dependencyManagement) {
39+
public DomTripDependencyManagement(Element dependencyManagement, Editor editor) {
4440
this.dependencyManagement = dependencyManagement;
41+
this.editor = editor;
4542
}
4643

4744
@Override
@@ -51,21 +48,12 @@ public void addDependency(Dependency dependency) {
5148

5249
@Override
5350
public List<Dependency> getDependencies() {
54-
Element dependenciesElm = dependencyManagement.getChild("dependencies", dependencyManagement.getNamespace());
55-
if (dependenciesElm == null) {
56-
return Collections.emptyList();
57-
} else {
58-
List<Element> dependencyElms =
59-
dependenciesElm.getChildren("dependency", dependencyManagement.getNamespace());
60-
61-
List<Dependency> dependencies = new ArrayList<>(dependencyElms.size());
62-
63-
for (Element dependencyElm : dependencyElms) {
64-
dependencies.add(new JDomDependency(dependencyElm));
65-
}
66-
67-
return dependencies;
68-
}
51+
return dependencyManagement
52+
.childElement("dependencies")
53+
.map(deps -> deps.childElements("dependency")
54+
.map(dep -> (Dependency) new DomTripDependency(dep, editor))
55+
.collect(Collectors.toList()))
56+
.orElse(Collections.emptyList());
6957
}
7058

7159
@Override

maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomExtension.java renamed to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripExtension.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,23 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.maven.shared.release.transform.jdom2;
19+
package org.apache.maven.shared.release.transform.domtrip;
2020

21+
import eu.maveniverse.domtrip.Editor;
22+
import eu.maveniverse.domtrip.Element;
2123
import org.apache.maven.model.Extension;
2224
import org.apache.maven.shared.release.transform.MavenCoordinate;
23-
import org.jdom2.Element;
2425

2526
/**
26-
* JDOM2 implementation of poms EXTENSION element.
27+
* DomTrip implementation of poms EXTENSION element.
2728
*
28-
* @author Robert Scholte
29-
* @since 3.0
29+
* @since 3.4
3030
*/
31-
public class JDomExtension extends Extension implements MavenCoordinate {
31+
public class DomTripExtension extends Extension implements MavenCoordinate {
3232
private final MavenCoordinate coordinate;
3333

34-
/**
35-
* <p>Constructor for JDomExtension.</p>
36-
*
37-
* @param extension a {@link org.jdom2.Element} object
38-
*/
39-
public JDomExtension(Element extension) {
40-
this.coordinate = new JDomMavenCoordinate(extension);
34+
public DomTripExtension(Element extension, Editor editor) {
35+
this.coordinate = new DomTripMavenCoordinate(extension, editor);
4136
}
4237

4338
@Override

maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomMavenCoordinate.java renamed to maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/domtrip/DomTripMavenCoordinate.java

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,60 +16,48 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.maven.shared.release.transform.jdom2;
19+
package org.apache.maven.shared.release.transform.domtrip;
2020

21+
import eu.maveniverse.domtrip.Editor;
22+
import eu.maveniverse.domtrip.Element;
2123
import org.apache.maven.shared.release.transform.MavenCoordinate;
22-
import org.jdom2.Element;
2324

2425
/**
25-
* <p>JDomMavenCoordinate class.</p>
26+
* DomTrip implementation of {@link MavenCoordinate}.
2627
*
27-
* @author Robert Scholte
28-
* @since 3.0
28+
* @since 3.4
2929
*/
30-
public class JDomMavenCoordinate implements MavenCoordinate {
30+
public class DomTripMavenCoordinate implements MavenCoordinate {
3131
private final Element element;
32+
private final Editor editor;
3233

33-
/**
34-
* <p>Constructor for JDomMavenCoordinate.</p>
35-
*
36-
* @param elm a {@link org.jdom2.Element} object
37-
*/
38-
public JDomMavenCoordinate(Element elm) {
39-
this.element = elm;
34+
public DomTripMavenCoordinate(Element element, Editor editor) {
35+
this.element = element;
36+
this.editor = editor;
4037
}
4138

4239
@Override
4340
public String getGroupId() {
44-
return element.getChildTextTrim("groupId", element.getNamespace());
41+
return element.childTextTrimmed("groupId");
4542
}
4643

4744
@Override
4845
public String getArtifactId() {
49-
return element.getChildTextTrim("artifactId", element.getNamespace());
46+
return element.childTextTrimmed("artifactId");
5047
}
5148

5249
@Override
5350
public String getVersion() {
54-
Element version = getVersionElement();
55-
if (version == null) {
56-
return null;
57-
} else {
58-
return version.getTextTrim();
59-
}
60-
}
61-
62-
private Element getVersionElement() {
63-
return element.getChild("version", element.getNamespace());
51+
return element.childElement("version").map(e -> e.textContentTrimmed()).orElse(null);
6452
}
6553

6654
@Override
6755
public void setVersion(String version) {
68-
JDomUtils.rewriteValue(getVersionElement(), version);
56+
element.childElement("version").ifPresent(e -> DomTripUtils.rewriteValue(editor, e, version));
6957
}
7058

7159
@Override
7260
public String getName() {
73-
return element.getName();
61+
return element.name();
7462
}
7563
}

0 commit comments

Comments
 (0)