[MSHARED-257] Extracted Xpp3DomUtils
git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@1631512 13f79535-47bb-0310-9956-ffa450edef68
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 a3f4d85..aef182b 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
@@ -46,9 +46,9 @@
private Map<String, String> attributes; // plexus: protected
- private final List<Xpp3Dom> childList; // plexus: protected
+ final List<Xpp3Dom> childList; // plexus: protected
- private final Map<String, Xpp3Dom> childMap; // plexus: protected
+ final Map<String, Xpp3Dom> childMap; // plexus: protected
private Xpp3Dom parent; // plexus: protected
@@ -188,7 +188,7 @@
return children.toArray( new Xpp3Dom[children.size()] );
}
- private List<Xpp3Dom> getChildrenList( String name )
+ List<Xpp3Dom> getChildrenList( String name )
{
if ( childList == null )
{
@@ -241,102 +241,17 @@
private static Xpp3Dom merge( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
{
- if ( recessive == null || isCombineSelfOverride( dominant ) )
- {
- return dominant;
- }
-
- if ( isEmpty( dominant.getValue() ) )
- {
- dominant.setValue( recessive.getValue() );
- }
-
- for ( String attr : recessive.getAttributeNames() )
- {
- if ( isEmpty( dominant.getAttribute( attr ) ) )
- {
- dominant.setAttribute( attr, recessive.getAttribute( attr ) );
- }
- }
-
- if ( recessive.getChildCount() > 0 )
- {
- boolean mergeChildren = isMergeChildren( dominant, childMergeOverride );
-
- if ( mergeChildren )
- {
- Map<String, Iterator<Xpp3Dom>> commonChildren = getCommonChildren( dominant, recessive );
- for ( Xpp3Dom recessiveChild : recessive )
- {
- Iterator<Xpp3Dom> it = commonChildren.get( recessiveChild.getName() );
- if ( it == null )
- {
- dominant.addChild( new Xpp3Dom( recessiveChild ) );
- }
- else if ( it.hasNext() )
- {
- Xpp3Dom dominantChild = it.next();
- merge( dominantChild, recessiveChild, childMergeOverride );
- }
- }
- }
- else
- {
- Xpp3Dom[] dominantChildren = dominant.getChildren();
- dominant.childList.clear();
- for ( Xpp3Dom child : recessive )
- {
- dominant.addChild( new Xpp3Dom( child ) );
- }
-
- for ( Xpp3Dom aDominantChildren : dominantChildren )
- {
- dominant.addChild( aDominantChildren );
- }
- }
- }
- return dominant;
- }
-
- private static Map<String, Iterator<Xpp3Dom>> getCommonChildren( Xpp3Dom dominant, Xpp3Dom recessive )
- {
- Map<String, Iterator<Xpp3Dom>> commonChildren = new HashMap<String, Iterator<Xpp3Dom>>();
-
- for ( String childName : recessive.childMap.keySet() )
- {
- List<Xpp3Dom> dominantChildren = dominant.getChildrenList( childName );
- if ( dominantChildren.size() > 0 )
- {
- commonChildren.put( childName, dominantChildren.iterator() );
- }
- }
- return commonChildren;
- }
-
- private static boolean isMergeChildren( Xpp3Dom dominant, Boolean override )
- {
- return override != null ? override : !isMergeChildren( dominant );
- }
-
- private static boolean isMergeChildren( Xpp3Dom dominant )
- {
- return CHILDREN_COMBINATION_APPEND.equals( dominant.getAttribute( CHILDREN_COMBINATION_MODE_ATTRIBUTE ) );
- }
-
- private static boolean isCombineSelfOverride( Xpp3Dom xpp3Dom )
- {
- String selfMergeMode = xpp3Dom.getAttribute( SELF_COMBINATION_MODE_ATTRIBUTE );
- return SELF_COMBINATION_OVERRIDE.equals( selfMergeMode );
+ return Xpp3DomUtils.merge( dominant, recessive, childMergeOverride );
}
public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
{
- return dominant != null ? merge( dominant, recessive, childMergeOverride ) : recessive;
+ return Xpp3DomUtils.mergeXpp3Dom( dominant, recessive, childMergeOverride );
}
public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive )
{
- return dominant != null ? merge( dominant, recessive, null ) : recessive;
+ return Xpp3DomUtils.mergeXpp3Dom( dominant, recessive );
}
public boolean equals( Object obj )
diff --git a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomUtils.java b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomUtils.java
new file mode 100644
index 0000000..90195d4
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomUtils.java
@@ -0,0 +1,138 @@
+package org.apache.maven.shared.utils.xml;
+
+/*
+ * 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.
+ */
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class Xpp3DomUtils
+{
+ public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
+ {
+ return dominant != null ? merge( dominant, recessive, childMergeOverride ) : recessive;
+ }
+
+ public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive )
+ {
+ return dominant != null ? merge( dominant, recessive, null ) : recessive;
+ }
+
+ public static Xpp3Dom merge( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
+ {
+ if ( recessive == null || isCombineSelfOverride( dominant ) )
+ {
+ return dominant;
+ }
+
+ if ( isEmpty( dominant.getValue() ) )
+ {
+ dominant.setValue( recessive.getValue() );
+ }
+
+ for ( String attr : recessive.getAttributeNames() )
+ {
+ if ( isEmpty( dominant.getAttribute( attr ) ) )
+ {
+ dominant.setAttribute( attr, recessive.getAttribute( attr ) );
+ }
+ }
+
+ if ( recessive.getChildCount() > 0 )
+ {
+ boolean mergeChildren = isMergeChildren( dominant, childMergeOverride );
+
+ if ( mergeChildren )
+ {
+ Map<String, Iterator<Xpp3Dom>> commonChildren = getCommonChildren( dominant, recessive );
+ for ( Xpp3Dom recessiveChild : recessive )
+ {
+ Iterator<Xpp3Dom> it = commonChildren.get( recessiveChild.getName() );
+ if ( it == null )
+ {
+ dominant.addChild( new Xpp3Dom( recessiveChild ) );
+ }
+ else if ( it.hasNext() )
+ {
+ Xpp3Dom dominantChild = it.next();
+ merge( dominantChild, recessiveChild, childMergeOverride );
+ }
+ }
+ }
+ else
+ {
+ Xpp3Dom[] dominantChildren = dominant.getChildren();
+ dominant.childList.clear();
+ for ( Xpp3Dom child : recessive )
+ {
+ dominant.addChild( new Xpp3Dom( child ) );
+ }
+
+ for ( Xpp3Dom aDominantChildren : dominantChildren )
+ {
+ dominant.addChild( aDominantChildren );
+ }
+ }
+ }
+ return dominant;
+ }
+
+ private static Map<String, Iterator<Xpp3Dom>> getCommonChildren( Xpp3Dom dominant, Xpp3Dom recessive )
+ {
+ Map<String, Iterator<Xpp3Dom>> commonChildren = new HashMap<String, Iterator<Xpp3Dom>>();
+
+ for ( String childName : recessive.childMap.keySet() )
+ {
+ List<Xpp3Dom> dominantChildren = dominant.getChildrenList( childName );
+ if ( dominantChildren.size() > 0 )
+ {
+ commonChildren.put( childName, dominantChildren.iterator() );
+ }
+ }
+ return commonChildren;
+ }
+
+ private static boolean isCombineSelfOverride( Xpp3Dom xpp3Dom )
+ {
+ String selfMergeMode = xpp3Dom.getAttribute( Xpp3Dom.SELF_COMBINATION_MODE_ATTRIBUTE );
+ return Xpp3Dom.SELF_COMBINATION_OVERRIDE.equals( selfMergeMode );
+ }
+
+ private static boolean isMergeChildren( Xpp3Dom dominant, Boolean override )
+ {
+ return override != null ? override : !isMergeChildren( dominant );
+ }
+
+ private static boolean isMergeChildren( Xpp3Dom dominant )
+ {
+ return Xpp3Dom.CHILDREN_COMBINATION_APPEND.equals(
+ dominant.getAttribute( Xpp3Dom.CHILDREN_COMBINATION_MODE_ATTRIBUTE ) );
+ }
+
+ public static boolean isEmpty( String str )
+ {
+ return str == null || str.trim().length() == 0;
+ }
+
+
+
+
+}