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: - *

    - *
  1. if the recessive DOM is null, there is nothing to do... return.
  2. - *
  3. Determine whether the dominant node will suppress the recessive one (flag=mergeSelf). - *
      - *
    1. 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.
    2. - *
    3. 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.
    4. - *
  4. - *
  5. If mergeSelf == true - *
      - *
    1. Determine whether children from the recessive DOM will be merged or appended to the dominant DOM as - * siblings (flag=mergeChildren). - *
        - *
      1. if childMergeOverride is set (non-null), use that value (true/false)
      2. - *
      3. retrieve the 'combine.children' attribute on the dominant node, and try to match against - * 'append'...
      4. - *
      5. if it matches 'append', then set mergeChildren == false...the recessive children will be appended as - * siblings of the dominant children.
      6. - *
      7. 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.
      8. - *
    2. - *
    3. Iterate through the recessive children, and: - *
        - *
      1. if 'combine.id' is set and there is a corresponding dominant child (matched by value of 'combine.id'), - * merge the two.
      2. - *
      3. if 'combine.keys' is set and there is a corresponding dominant child (matched by value of key elements), - * merge the two.
      4. - *
      5. if mergeChildren == true and there is a corresponding dominant child (matched by element name), - * merge the two.
      6. - *
      7. otherwise, add the recessive child as a new child on the dominant root node.
      8. - *
    4. - *
  6. - *
+ * @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; - } - } -}