diff --git a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java index e76c6b95..e534aa2a 100644 --- a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java +++ b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java @@ -95,6 +95,10 @@ public Xpp3Dom(String name) { childMap = new HashMap<>(); } + boolean isValueSet() { + return value != null; + } + /** * Create instance. * @@ -140,7 +144,7 @@ public String getName() { */ @NonNull public String getValue() { - return value; + return value != null ? value : ""; } /** diff --git a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomWriter.java b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomWriter.java index 900f03fb..f80d5bb8 100644 --- a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomWriter.java +++ b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomWriter.java @@ -72,8 +72,8 @@ public static void write(XMLWriter xmlWriter, Xpp3Dom dom, boolean escape) throw write(xmlWriter, aChildren, escape); } - String value = dom.getValue(); - if (value != null) { + if (dom.isValueSet()) { + String value = dom.getValue(); if (escape) { xmlWriter.writeText(value); } else { diff --git a/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java b/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java index d64e9c49..c2dd9f64 100644 --- a/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java +++ b/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java @@ -27,7 +27,7 @@ import static org.apache.maven.shared.utils.xml.Xpp3Dom.mergeXpp3Dom; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; /** @@ -42,6 +42,13 @@ private Xpp3Dom createElement(String element, String value) { return t1s1; } + @Test + public void defaultValueIsNotNull() { + // getValue() is annotated @NonNull but the one-arg constructor + // did not initialize value, violating the contract. + assertNotNull(new Xpp3Dom("test").getValue()); + } + @Test public void mergePrecedenceSelfClosed() throws XmlPullParserException { Xpp3Dom parentConfig = build(""); @@ -82,7 +89,7 @@ public void selfOverrideOnRootNode() { Xpp3Dom result = mergeXpp3Dom(t1, t2); assertEquals(2, result.getAttributeNames().length); - assertNull(result.getValue()); + assertEquals("", result.getValue()); } @Test