diff --git a/src/main/java/org/codehaus/plexus/util/xml/Xpp3Dom.java b/src/main/java/org/codehaus/plexus/util/xml/Xpp3Dom.java
index 7512c50..2046da3 100644
--- a/src/main/java/org/codehaus/plexus/util/xml/Xpp3Dom.java
+++ b/src/main/java/org/codehaus/plexus/util/xml/Xpp3Dom.java
@@ -35,26 +35,26 @@ public class Xpp3Dom
{
private static final String[] EMPTY_STRING_ARRAY = new String[0];
- public static final String CHILDREN_COMBINATION_MODE_ATTRIBUTE = "combine.children";
+ public static final String CHILDREN_COMBINATION_MODE_ATTRIBUTE = XmlNode.CHILDREN_COMBINATION_MODE_ATTRIBUTE;
- public static final String CHILDREN_COMBINATION_MERGE = "merge";
+ public static final String CHILDREN_COMBINATION_MERGE = XmlNode.CHILDREN_COMBINATION_MERGE;
- public static final String CHILDREN_COMBINATION_APPEND = "append";
+ public static final String CHILDREN_COMBINATION_APPEND = XmlNode.CHILDREN_COMBINATION_APPEND;
/**
* This default mode for combining children DOMs during merge means that where element names match, the process will
* try to merge the element data, rather than putting the dominant and recessive elements (which share the same
* element name) as siblings in the resulting DOM.
*/
- public static final String DEFAULT_CHILDREN_COMBINATION_MODE = CHILDREN_COMBINATION_MERGE;
+ public static final String DEFAULT_CHILDREN_COMBINATION_MODE = XmlNode.DEFAULT_CHILDREN_COMBINATION_MODE;
- public static final String SELF_COMBINATION_MODE_ATTRIBUTE = "combine.self";
+ public static final String SELF_COMBINATION_MODE_ATTRIBUTE = XmlNode.SELF_COMBINATION_MODE_ATTRIBUTE;
- public static final String SELF_COMBINATION_OVERRIDE = "override";
+ public static final String SELF_COMBINATION_OVERRIDE = XmlNode.SELF_COMBINATION_OVERRIDE;
- public static final String SELF_COMBINATION_MERGE = "merge";
+ public static final String SELF_COMBINATION_MERGE = XmlNode.SELF_COMBINATION_MERGE;
- public static final String SELF_COMBINATION_REMOVE = "remove";
+ public static final String SELF_COMBINATION_REMOVE = XmlNode.SELF_COMBINATION_REMOVE;
/**
* This default mode for combining a DOM node during merge means that where element names match, the process will
@@ -62,7 +62,11 @@ public class Xpp3Dom
* dominant one. This means that wherever the dominant element doesn't provide the value or a particular attribute,
* that value or attribute will be set from the recessive DOM node.
*/
- public static final String DEFAULT_SELF_COMBINATION_MODE = SELF_COMBINATION_MERGE;
+ public static final String DEFAULT_SELF_COMBINATION_MODE = XmlNode.DEFAULT_SELF_COMBINATION_MODE;
+
+ public static final String ID_COMBINATION_MODE_ATTRIBUTE = XmlNode.ID_COMBINATION_MODE_ATTRIBUTE;
+
+ public static final String KEYS_COMBINATION_MODE_ATTRIBUTE = XmlNode.KEYS_COMBINATION_MODE_ATTRIBUTE;
private ChildrenTracking childrenTracking;
private XmlNode dom;
diff --git a/src/main/java/org/codehaus/plexus/util/xml/Xpp3DomUtils.java b/src/main/java/org/codehaus/plexus/util/xml/Xpp3DomUtils.java
index 555f481..6fda3eb 100644
--- a/src/main/java/org/codehaus/plexus/util/xml/Xpp3DomUtils.java
+++ b/src/main/java/org/codehaus/plexus/util/xml/Xpp3DomUtils.java
@@ -23,207 +23,77 @@
import org.codehaus.plexus.util.xml.pull.XmlSerializer;
/** @author Jason van Zyl */
+@Deprecated
public class Xpp3DomUtils
{
- public static final String CHILDREN_COMBINATION_MODE_ATTRIBUTE = "combine.children";
-
- public static final String CHILDREN_COMBINATION_MERGE = "merge";
+ /**
+ * @deprecated use {@link Xpp3Dom#CHILDREN_COMBINATION_MODE_ATTRIBUTE}
+ */
+ @Deprecated
+ public static final String CHILDREN_COMBINATION_MODE_ATTRIBUTE = Xpp3Dom.CHILDREN_COMBINATION_MODE_ATTRIBUTE;
- public static final String CHILDREN_COMBINATION_APPEND = "append";
+ /**
+ * @deprecated use {@link Xpp3Dom#CHILDREN_COMBINATION_MERGE}
+ */
+ @Deprecated
+ public static final String CHILDREN_COMBINATION_MERGE = Xpp3Dom.CHILDREN_COMBINATION_MERGE;
/**
- * This default mode for combining children DOMs during merge means that where element names match, the process will
- * try to merge the element data, rather than putting the dominant and recessive elements (which share the same
- * element name) as siblings in the resulting DOM.
+ * @deprecated use {@link Xpp3Dom#CHILDREN_COMBINATION_APPEND}
*/
- public static final String DEFAULT_CHILDREN_COMBINATION_MODE = CHILDREN_COMBINATION_MERGE;
+ @Deprecated
+ public static final String CHILDREN_COMBINATION_APPEND = Xpp3Dom.CHILDREN_COMBINATION_APPEND;
- public static final String SELF_COMBINATION_MODE_ATTRIBUTE = "combine.self";
+ /**
+ * @deprecated use {@link Xpp3Dom#DEFAULT_CHILDREN_COMBINATION_MODE}
+ */
+ @Deprecated
+ public static final String DEFAULT_CHILDREN_COMBINATION_MODE = Xpp3Dom.DEFAULT_CHILDREN_COMBINATION_MODE;
- public static final String SELF_COMBINATION_OVERRIDE = "override";
+ /**
+ * @deprecated use {@link Xpp3Dom#SELF_COMBINATION_MODE_ATTRIBUTE}
+ */
+ @Deprecated
+ public static final String SELF_COMBINATION_MODE_ATTRIBUTE = Xpp3Dom.SELF_COMBINATION_MODE_ATTRIBUTE;
- public static final String SELF_COMBINATION_MERGE = "merge";
+ /**
+ * @deprecated use {@link Xpp3Dom#SELF_COMBINATION_OVERRIDE}
+ */
+ @Deprecated
+ public static final String SELF_COMBINATION_OVERRIDE = Xpp3Dom.SELF_COMBINATION_OVERRIDE;
/**
- * In case of complex XML structures, combining can be done based on id.
- *
- * @since 3.0.22
+ * @deprecated use {@link Xpp3Dom#SELF_COMBINATION_MERGE}
*/
- public static final String ID_COMBINATION_MODE_ATTRIBUTE = "combine.id";
-
+ @Deprecated
+ public static final String SELF_COMBINATION_MERGE = Xpp3Dom.SELF_COMBINATION_MERGE;
+
/**
- * In case of complex XML structures, combining can be done based on keys.
- * This is a comma separated list of attribute names.
- *
- * @since 3.4.0
+ * @deprecated use {@link Xpp3Dom#ID_COMBINATION_MODE_ATTRIBUTE}
*/
- public static final String KEYS_COMBINATION_MODE_ATTRIBUTE = "combine.keys";
+ @Deprecated
+ public static final String ID_COMBINATION_MODE_ATTRIBUTE = Xpp3Dom.ID_COMBINATION_MODE_ATTRIBUTE;
/**
- * This default mode for combining a DOM node during merge means that where element names match, the process will
- * try to merge the element attributes and values, rather than overriding the recessive element completely with the
- * dominant one. This means that wherever the dominant element doesn't provide the value or a particular attribute,
- * that value or attribute will be set from the recessive DOM node.
+ * @deprecated use {@link Xpp3Dom#KEYS_COMBINATION_MODE_ATTRIBUTE}
*/
- public static final String DEFAULT_SELF_COMBINATION_MODE = SELF_COMBINATION_MERGE;
+ @Deprecated
+ public static final String KEYS_COMBINATION_MODE_ATTRIBUTE = Xpp3Dom.KEYS_COMBINATION_MODE_ATTRIBUTE;
- public void writeToSerializer( String namespace, XmlSerializer serializer, Xpp3Dom dom )
- throws IOException
- {
- // TODO: WARNING! Later versions of plexus-utils psit out an header due to thinking this is a new
- // document - not the desired behaviour!
- SerializerXMLWriter xmlWriter = new SerializerXMLWriter( namespace, serializer );
- Xpp3DomWriter.write( xmlWriter, dom );
- if ( xmlWriter.getExceptions().size() > 0 )
- {
- throw (IOException) xmlWriter.getExceptions().get( 0 );
- }
- }
+ /**
+ * @deprecated use {@link Xpp3Dom#DEFAULT_SELF_COMBINATION_MODE}
+ */
+ @Deprecated
+ public static final String DEFAULT_SELF_COMBINATION_MODE = Xpp3Dom.DEFAULT_SELF_COMBINATION_MODE;
/**
- * Merges one DOM into another, given a specific algorithm and possible override points for that algorithm.
- * The algorithm is as follows:
- *
- * - if the recessive DOM is null, there is nothing to do... return.
- * - Determine whether the dominant node will suppress the recessive one (flag=mergeSelf).
- *
- * - retrieve the 'combine.self' attribute on the dominant node, and try to match against 'override'...
- * if it matches 'override', then set mergeSelf == false...the dominant node suppresses the recessive one
- * completely.
- * - otherwise, use the default value for mergeSelf, which is true...this is the same as specifying
- * 'combine.self' == 'merge' as an attribute of the dominant root node.
- *
- * - If mergeSelf == true
- *
- * - Determine whether children from the recessive DOM will be merged or appended to the dominant DOM as
- * siblings (flag=mergeChildren).
- *
- * - if childMergeOverride is set (non-null), use that value (true/false)
- * - retrieve the 'combine.children' attribute on the dominant node, and try to match against
- * 'append'...
- * - if it matches 'append', then set mergeChildren == false...the recessive children will be appended as
- * siblings of the dominant children.
- * - otherwise, use the default value for mergeChildren, which is true...this is the same as specifying
- * 'combine.children' == 'merge' as an attribute on the dominant root node.
- *
- * - Iterate through the recessive children, and:
- *
- * - if 'combine.id' is set and there is a corresponding dominant child (matched by value of 'combine.id'),
- * merge the two.
- * - if 'combine.keys' is set and there is a corresponding dominant child (matched by value of key elements),
- * merge the two.
- * - if mergeChildren == true and there is a corresponding dominant child (matched by element name),
- * merge the two.
- * - otherwise, add the recessive child as a new child on the dominant root node.
- *
- *
- *
+ * @deprecated use {@link Xpp3Dom#writeToSerializer(String, XmlSerializer)}
*/
- private static void mergeIntoXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
+ @Deprecated
+ public void writeToSerializer( String namespace, XmlSerializer serializer, Xpp3Dom dom )
+ throws IOException
{
- // TODO: share this as some sort of assembler, implement a walk interface?
- if ( recessive == null )
- {
- return;
- }
-
- boolean mergeSelf = true;
-
- String selfMergeMode = dominant.getAttribute( SELF_COMBINATION_MODE_ATTRIBUTE );
-
- if ( isNotEmpty( selfMergeMode ) && SELF_COMBINATION_OVERRIDE.equals( selfMergeMode ) )
- {
- mergeSelf = false;
- }
-
- if ( mergeSelf )
- {
- String[] recessiveAttrs = recessive.getAttributeNames();
- for ( String attr : recessiveAttrs )
- {
- if ( isEmpty( dominant.getAttribute( attr ) ) )
- {
- dominant.setAttribute( attr, recessive.getAttribute( attr ) );
- }
- }
-
- boolean mergeChildren = true;
-
- if ( childMergeOverride != null )
- {
- mergeChildren = childMergeOverride;
- }
- else
- {
- String childMergeMode = dominant.getAttribute( CHILDREN_COMBINATION_MODE_ATTRIBUTE );
-
- if ( isNotEmpty( childMergeMode ) && CHILDREN_COMBINATION_APPEND.equals( childMergeMode ) )
- {
- mergeChildren = false;
- }
- }
-
- final String keysValue = recessive.getAttribute( KEYS_COMBINATION_MODE_ATTRIBUTE );
-
- Xpp3Dom[] children = recessive.getChildren();
- for ( Xpp3Dom recessiveChild : children )
- {
- String idValue = recessiveChild.getAttribute( ID_COMBINATION_MODE_ATTRIBUTE );
-
- Xpp3Dom childDom = null;
- if ( isNotEmpty( idValue ) )
- {
- for ( Xpp3Dom dominantChild : dominant.getChildren() )
- {
- if ( idValue.equals( dominantChild.getAttribute( ID_COMBINATION_MODE_ATTRIBUTE ) ) )
- {
- childDom = dominantChild;
- // we have a match, so don't append but merge
- mergeChildren = true;
- }
- }
- }
- else if ( isNotEmpty( keysValue ) )
- {
- String[] keys = keysValue.split( "," );
- Map recessiveKeyValues = new HashMap<>( keys.length );
- for ( String key : keys )
- {
- recessiveKeyValues.put( key, recessiveChild.getAttribute( key ) );
- }
-
- for ( Xpp3Dom dominantChild : dominant.getChildren() )
- {
- Map dominantKeyValues = new HashMap<>( keys.length );
- for ( String key : keys )
- {
- dominantKeyValues.put( key, dominantChild.getAttribute( key ) );
- }
-
- if ( recessiveKeyValues.equals( dominantKeyValues ) )
- {
- childDom = dominantChild;
- // we have a match, so don't append but merge
- mergeChildren = true;
- }
- }
-
- }
- else
- {
- childDom = dominant.getChild( recessiveChild.getName() );
- }
-
- if ( mergeChildren && childDom != null )
- {
- mergeIntoXpp3Dom( childDom, recessiveChild, childMergeOverride );
- }
- else
- {
- dominant.addChild( new Xpp3Dom( recessiveChild ) );
- }
- }
- }
+ dom.writeToSerializer( namespace, serializer );
}
/**
@@ -236,15 +106,12 @@ else if ( isNotEmpty( keysValue ) )
* @param childMergeOverride Overrides attribute flags to force merging or appending of child elements into the
* dominant DOM
* @return merged DOM
+ * @deprecated use {@link Xpp3Dom#mergeXpp3Dom(Xpp3Dom, Xpp3Dom, Boolean)}
*/
+ @Deprecated
public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
{
- if ( dominant != null )
- {
- mergeIntoXpp3Dom( dominant, recessive, childMergeOverride );
- return dominant;
- }
- return recessive;
+ return Xpp3Dom.mergeXpp3Dom( dominant, recessive, childMergeOverride );
}
/**
@@ -256,15 +123,12 @@ public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive, Boolean
* @param dominant The dominant DOM into which the recessive value/attributes/children will be merged
* @param recessive The recessive DOM, which will be merged into the dominant DOM
* @return merged DOM
+ * @deprecated use {@link Xpp3Dom#mergeXpp3Dom(Xpp3Dom, Xpp3Dom)}
*/
+ @Deprecated
public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive )
{
- if ( dominant != null )
- {
- mergeIntoXpp3Dom( dominant, recessive, null );
- return dominant;
- }
- return recessive;
+ return Xpp3Dom.mergeXpp3Dom( dominant, recessive );
}
/**
diff --git a/src/test/java/org/codehaus/plexus/util/xml/Xpp3DomTest.java b/src/test/java/org/codehaus/plexus/util/xml/Xpp3DomTest.java
index 5dbdc2c..469bb3f 100644
--- a/src/test/java/org/codehaus/plexus/util/xml/Xpp3DomTest.java
+++ b/src/test/java/org/codehaus/plexus/util/xml/Xpp3DomTest.java
@@ -422,6 +422,113 @@ public void testShouldRemoveDoNotRemoveTagWhenSwappedInputDOMs()
assertEquals( recessiveConfig.toString(), result.toString() );
}
+ /**
+ * testCombineId.
+ *
+ * @throws java.lang.Exception if any.
+ */
+ @Test
+ public void testCombineId()
+ throws Exception
+ {
+ String lhs = "" + "LHS-ONLYLHS"
+ + "TOOVERWRITELHS" + "";
+
+ String rhs = "" + "RHS-ONLYRHS"
+ + "TOOVERWRITERHS" + "";
+
+ Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new Xpp3DomTest.FixedInputLocationBuilder( "left" ) );
+ Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new Xpp3DomTest.FixedInputLocationBuilder( "right" ) );
+
+ Xpp3Dom mergeResult = Xpp3Dom.mergeXpp3Dom( leftDom, rightDom, true );
+ assertEquals( 3, mergeResult.getChildren( "property" ).length );
+
+ Xpp3Dom p0 = mergeResult.getChildren( "property" )[0];
+ assertEquals( "LHS-ONLY", p0.getChild( "name" ).getValue() );
+ assertEquals( "left", p0.getChild( "name" ).getInputLocation() );
+ assertEquals( "LHS", p0.getChild( "value" ).getValue() );
+ assertEquals( "left", p0.getChild( "value" ).getInputLocation() );
+
+ Xpp3Dom p1 = mergeResult.getChildren( "property" )[1];
+ assertEquals( "TOOVERWRITE", mergeResult.getChildren( "property" )[1].getChild( "name" ).getValue() );
+ assertEquals( "left", p1.getChild( "name" ).getInputLocation() );
+ assertEquals( "LHS", mergeResult.getChildren( "property" )[1].getChild( "value" ).getValue() );
+ assertEquals( "left", p1.getChild( "value" ).getInputLocation() );
+
+ Xpp3Dom p2 = mergeResult.getChildren( "property" )[2];
+ assertEquals( "RHS-ONLY", mergeResult.getChildren( "property" )[2].getChild( "name" ).getValue() );
+ assertEquals( "right", p2.getChild( "name" ).getInputLocation() );
+ assertEquals( "RHS", mergeResult.getChildren( "property" )[2].getChild( "value" ).getValue() );
+ assertEquals( "right", p2.getChild( "value" ).getInputLocation() );
+ }
+
+ /**
+ * testCombineKeys.
+ *
+ * @throws java.lang.Exception if any.
+ */
+ @Test
+ public void testCombineKeys()
+ throws Exception
+ {
+ String lhs = "" + "LHS-ONLYLHS"
+ + "TOOVERWRITELHS" + "";
+
+ String rhs = "" + "RHS-ONLYRHS"
+ + "TOOVERWRITERHS" + "";
+
+ Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new Xpp3DomTest.FixedInputLocationBuilder( "left" ) );
+ Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new Xpp3DomTest.FixedInputLocationBuilder( "right" ) );
+
+ Xpp3Dom mergeResult = Xpp3Dom.mergeXpp3Dom( leftDom, rightDom, true );
+ assertEquals( 3, mergeResult.getChildren( "property" ).length );
+
+ Xpp3Dom p0 = mergeResult.getChildren( "property" )[0];
+ assertEquals( "LHS-ONLY", p0.getChild( "name" ).getValue() );
+ assertEquals( "left", p0.getChild( "name" ).getInputLocation() );
+ assertEquals( "LHS", p0.getChild( "value" ).getValue() );
+ assertEquals( "left", p0.getChild( "value" ).getInputLocation() );
+
+ Xpp3Dom p1 = mergeResult.getChildren( "property" )[1];
+ assertEquals( "TOOVERWRITE", mergeResult.getChildren( "property" )[1].getChild( "name" ).getValue() );
+ assertEquals( "left", p1.getChild( "name" ).getInputLocation() );
+ assertEquals( "LHS", mergeResult.getChildren( "property" )[1].getChild( "value" ).getValue() );
+ assertEquals( "left", p1.getChild( "value" ).getInputLocation() );
+
+ Xpp3Dom p2 = mergeResult.getChildren( "property" )[2];
+ assertEquals( "RHS-ONLY", mergeResult.getChildren( "property" )[2].getChild( "name" ).getValue() );
+ assertEquals( "right", p2.getChild( "name" ).getInputLocation() );
+ assertEquals( "RHS", mergeResult.getChildren( "property" )[2].getChild( "value" ).getValue() );
+ assertEquals( "right", p2.getChild( "value" ).getInputLocation() );
+ }
+
+ @Test
+ public void testPreserveDominantBlankValue() throws XmlPullParserException, IOException {
+ String lhs = " ";
+
+ String rhs = "recessive";
+
+ Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new Xpp3DomTest.FixedInputLocationBuilder( "left" ) );
+ Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new Xpp3DomTest.FixedInputLocationBuilder( "right" ) );
+
+ Xpp3Dom mergeResult = Xpp3Dom.mergeXpp3Dom( leftDom, rightDom, true );
+ assertEquals( " ", mergeResult.getValue() );
+ }
+
+ @Test
+ public void testPreserveDominantEmptyNode() throws XmlPullParserException, IOException
+ {
+ String lhs = "";
+
+ String rhs = "recessive";
+
+ Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new Xpp3DomTest.FixedInputLocationBuilder( "left" ) );
+ Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new Xpp3DomTest.FixedInputLocationBuilder( "right" ) );
+
+ Xpp3Dom mergeResult = Xpp3Dom.mergeXpp3Dom( leftDom, rightDom, true );
+ assertEquals( "", mergeResult.getValue() );
+ }
+
private static class FixedInputLocationBuilder
implements Xpp3DomBuilder.InputLocationBuilder
{
diff --git a/src/test/java/org/codehaus/plexus/util/xml/Xpp3DomUtilsTest.java b/src/test/java/org/codehaus/plexus/util/xml/Xpp3DomUtilsTest.java
deleted file mode 100644
index 0f700dd..0000000
--- a/src/test/java/org/codehaus/plexus/util/xml/Xpp3DomUtilsTest.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package org.codehaus.plexus.util.xml;
-
-/*
- * Copyright The Codehaus Foundation.
- *
- * Licensed 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.
- */
-
-import java.io.IOException;
-import java.io.StringReader;
-
-import org.codehaus.plexus.util.xml.pull.XmlPullParser;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * Xpp3DomUtilsTest class.
- *
- * @author herve
- * @version $Id: $Id
- * @since 3.4.0
- */
-public class Xpp3DomUtilsTest
-{
- /**
- * testCombineId.
- *
- * @throws java.lang.Exception if any.
- */
- @Test
- public void testCombineId()
- throws Exception
- {
- String lhs = "" + "LHS-ONLYLHS"
- + "TOOVERWRITELHS" + "";
-
- String rhs = "" + "RHS-ONLYRHS"
- + "TOOVERWRITERHS" + "";
-
- Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new FixedInputLocationBuilder( "left" ) );
- Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new FixedInputLocationBuilder( "right" ) );
-
- Xpp3Dom mergeResult = Xpp3DomUtils.mergeXpp3Dom( leftDom, rightDom, true );
- assertEquals( 3, mergeResult.getChildren( "property" ).length );
-
- Xpp3Dom p0 = mergeResult.getChildren( "property" )[0];
- assertEquals( "LHS-ONLY", p0.getChild( "name" ).getValue() );
- assertEquals( "left", p0.getChild( "name" ).getInputLocation() );
- assertEquals( "LHS", p0.getChild( "value" ).getValue() );
- assertEquals( "left", p0.getChild( "value" ).getInputLocation() );
-
- Xpp3Dom p1 = mergeResult.getChildren( "property" )[1];
- assertEquals( "TOOVERWRITE", mergeResult.getChildren( "property" )[1].getChild( "name" ).getValue() );
- assertEquals( "left", p1.getChild( "name" ).getInputLocation() );
- assertEquals( "LHS", mergeResult.getChildren( "property" )[1].getChild( "value" ).getValue() );
- assertEquals( "left", p1.getChild( "value" ).getInputLocation() );
-
- Xpp3Dom p2 = mergeResult.getChildren( "property" )[2];
- assertEquals( "RHS-ONLY", mergeResult.getChildren( "property" )[2].getChild( "name" ).getValue() );
- assertEquals( "right", p2.getChild( "name" ).getInputLocation() );
- assertEquals( "RHS", mergeResult.getChildren( "property" )[2].getChild( "value" ).getValue() );
- assertEquals( "right", p2.getChild( "value" ).getInputLocation() );
- }
-
- /**
- * testCombineKeys.
- *
- * @throws java.lang.Exception if any.
- */
- @Test
- public void testCombineKeys()
- throws Exception
- {
- String lhs = "" + "LHS-ONLYLHS"
- + "TOOVERWRITELHS" + "";
-
- String rhs = "" + "RHS-ONLYRHS"
- + "TOOVERWRITERHS" + "";
-
- Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new FixedInputLocationBuilder( "left" ) );
- Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new FixedInputLocationBuilder( "right" ) );
-
- Xpp3Dom mergeResult = Xpp3DomUtils.mergeXpp3Dom( leftDom, rightDom, true );
- assertEquals( 3, mergeResult.getChildren( "property" ).length );
-
- Xpp3Dom p0 = mergeResult.getChildren( "property" )[0];
- assertEquals( "LHS-ONLY", p0.getChild( "name" ).getValue() );
- assertEquals( "left", p0.getChild( "name" ).getInputLocation() );
- assertEquals( "LHS", p0.getChild( "value" ).getValue() );
- assertEquals( "left", p0.getChild( "value" ).getInputLocation() );
-
- Xpp3Dom p1 = mergeResult.getChildren( "property" )[1];
- assertEquals( "TOOVERWRITE", mergeResult.getChildren( "property" )[1].getChild( "name" ).getValue() );
- assertEquals( "left", p1.getChild( "name" ).getInputLocation() );
- assertEquals( "LHS", mergeResult.getChildren( "property" )[1].getChild( "value" ).getValue() );
- assertEquals( "left", p1.getChild( "value" ).getInputLocation() );
-
- Xpp3Dom p2 = mergeResult.getChildren( "property" )[2];
- assertEquals( "RHS-ONLY", mergeResult.getChildren( "property" )[2].getChild( "name" ).getValue() );
- assertEquals( "right", p2.getChild( "name" ).getInputLocation() );
- assertEquals( "RHS", mergeResult.getChildren( "property" )[2].getChild( "value" ).getValue() );
- assertEquals( "right", p2.getChild( "value" ).getInputLocation() );
- }
-
- @Test
- public void testPreserveDominantBlankValue() throws XmlPullParserException, IOException {
- String lhs = " ";
-
- String rhs = "recessive";
-
- Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new FixedInputLocationBuilder( "left" ) );
- Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new FixedInputLocationBuilder( "right" ) );
-
- Xpp3Dom mergeResult = Xpp3DomUtils.mergeXpp3Dom( leftDom, rightDom, true );
- assertEquals( " ", mergeResult.getValue() );
- }
-
- @Test
- public void testPreserveDominantEmptyNode() throws XmlPullParserException, IOException
- {
- String lhs = "";
-
- String rhs = "recessive";
-
- Xpp3Dom leftDom = Xpp3DomBuilder.build( new StringReader( lhs ), new FixedInputLocationBuilder( "left" ) );
- Xpp3Dom rightDom = Xpp3DomBuilder.build( new StringReader( rhs ), new FixedInputLocationBuilder( "right" ) );
-
- Xpp3Dom mergeResult = Xpp3DomUtils.mergeXpp3Dom( leftDom, rightDom, true );
- assertEquals( "", mergeResult.getValue() );
- }
-
- @Test
- public void testIsNotEmptyNegatesIsEmpty()
- {
- assertEquals( !Xpp3DomUtils.isEmpty( null ), Xpp3DomUtils.isNotEmpty( null ) );
- assertEquals( !Xpp3DomUtils.isEmpty( "" ), Xpp3DomUtils.isNotEmpty( "" ) );
- assertEquals( !Xpp3DomUtils.isEmpty( " " ), Xpp3DomUtils.isNotEmpty( " " ) );
- assertEquals( !Xpp3DomUtils.isEmpty( "someValue" ), Xpp3DomUtils.isNotEmpty( "someValue" ) );
- }
-
- /**
- * testShouldMergeValuesAtTopLevelByDefault.
- */
- @Test
- public void testShouldNotMergeValuesAtTopLevelByDefault()
- {
- // create the dominant DOM
- Xpp3Dom t1 = new Xpp3Dom( "top" );
- t1.setAttribute( "attr", "value" );
- t1.setInputLocation( "t1top" );
-
- // create the recessive DOM
- Xpp3Dom t2 = new Xpp3Dom( "top" );
- t2.setAttribute( "attr2", "value2" );
- t2.setValue( "t2Value" );
- t2.setInputLocation( "t2top" );
-
- // merge and check results.
- Xpp3Dom result = Xpp3DomUtils.mergeXpp3Dom( t1, t2 );
-
- // this is still 2, since we're not using the merge-control attribute.
- assertEquals( 2, result.getAttributeNames().length );
-
- assertEquals( result.getValue(), t1.getValue() );
- assertEquals( "t1top", result.getInputLocation() );
- }
-
- /**
- * testShouldMergeValuesAtTopLevel.
- */
- @Test
- public void testShouldNotMergeValues()
- {
- // create the dominant DOM
- Xpp3Dom t1 = new Xpp3Dom( "top" );
- t1.setAttribute( "attr", "value" );
-
- t1.setAttribute( Xpp3Dom.SELF_COMBINATION_MODE_ATTRIBUTE, Xpp3Dom.SELF_COMBINATION_MERGE );
-
- // create the recessive DOM
- Xpp3Dom t2 = new Xpp3Dom( "top" );
- t2.setAttribute( "attr2", "value2" );
- t2.setValue( "t2Value" );
-
- // merge and check results.
- Xpp3Dom result = Xpp3DomUtils.mergeXpp3Dom( t1, t2 );
-
- assertEquals( 3, result.getAttributeNames().length );
- assertNull( result.getValue(), t1.getValue() );
- }
-
- private static class FixedInputLocationBuilder
- implements Xpp3DomBuilder.InputLocationBuilder
- {
- private final Object location;
-
- public FixedInputLocationBuilder( Object location )
- {
- this.location = location;
- }
-
- public Object toInputLocation( XmlPullParser parser )
- {
- return location;
- }
- }
-}