1   package org.apache.maven.shared.utils.xml;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import java.util.HashMap;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.Map;
26  
27  
28  
29  
30  public class Xpp3DomUtils
31  {
32      
33  
34  
35  
36  
37  
38      public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
39      {
40          return dominant != null ? merge( dominant, recessive, childMergeOverride ) : recessive;
41      }
42  
43      
44  
45  
46  
47  
48      public static Xpp3Dom mergeXpp3Dom( Xpp3Dom dominant, Xpp3Dom recessive )
49      {
50          return dominant != null ? merge( dominant, recessive, null ) : recessive;
51      }
52  
53      
54  
55  
56  
57  
58  
59      public static Xpp3Dom merge( Xpp3Dom dominant, Xpp3Dom recessive, Boolean childMergeOverride )
60      {
61          if ( recessive == null || isCombineSelfOverride( dominant ) )
62          {
63              return dominant;
64          }
65  
66          if ( isEmpty( dominant.getValue() ) )
67          {
68              dominant.setValue( recessive.getValue() );
69          }
70  
71          for ( String attr : recessive.getAttributeNames() )
72          {
73              if ( isEmpty( dominant.getAttribute( attr ) ) )
74              {
75                  dominant.setAttribute( attr, recessive.getAttribute( attr ) );
76              }
77          }
78  
79          if ( recessive.getChildCount() > 0 )
80          {
81              boolean mergeChildren = isMergeChildren( dominant, childMergeOverride );
82  
83              if ( mergeChildren )
84              {
85                  Map<String, Iterator<Xpp3Dom>> commonChildren = getCommonChildren( dominant, recessive );
86                  for ( Xpp3Dom recessiveChild : recessive )
87                  {
88                      Iterator<Xpp3Dom> it = commonChildren.get( recessiveChild.getName() );
89                      if ( it == null )
90                      {
91                          dominant.addChild( new Xpp3Dom( recessiveChild ) );
92                      }
93                      else if ( it.hasNext() )
94                      {
95                          Xpp3Dom dominantChild = it.next();
96                          merge( dominantChild, recessiveChild, childMergeOverride );
97                      }
98                  }
99              }
100             else
101             {
102                 Xpp3Dom[] dominantChildren = dominant.getChildren();
103                 dominant.childList.clear();
104                 for ( Xpp3Dom child : recessive )
105                 {
106                     dominant.addChild( new Xpp3Dom( child ) );
107                 }
108 
109                 for ( Xpp3Dom aDominantChildren : dominantChildren )
110                 {
111                     dominant.addChild( aDominantChildren );
112                 }
113             }
114         }
115         return dominant;
116     }
117 
118     private static Map<String, Iterator<Xpp3Dom>> getCommonChildren( Xpp3Dom dominant, Xpp3Dom recessive )
119     {
120         Map<String, Iterator<Xpp3Dom>> commonChildren = new HashMap<String, Iterator<Xpp3Dom>>();
121 
122         for ( String childName : recessive.childMap.keySet() )
123         {
124             List<Xpp3Dom> dominantChildren = dominant.getChildrenList( childName );
125             if ( dominantChildren.size() > 0 )
126             {
127                 commonChildren.put( childName, dominantChildren.iterator() );
128             }
129         }
130         return commonChildren;
131     }
132 
133     private static boolean isCombineSelfOverride( Xpp3Dom xpp3Dom )
134     {
135         String selfMergeMode = xpp3Dom.getAttribute( Xpp3Dom.SELF_COMBINATION_MODE_ATTRIBUTE );
136         return Xpp3Dom.SELF_COMBINATION_OVERRIDE.equals( selfMergeMode );
137     }
138 
139     private static boolean isMergeChildren( Xpp3Dom dominant, Boolean override )
140     {
141         return override != null ? override : !isMergeChildren( dominant );
142     }
143 
144     private static boolean isMergeChildren( Xpp3Dom dominant )
145     {
146         return Xpp3Dom.CHILDREN_COMBINATION_APPEND.equals(
147             dominant.getAttribute( Xpp3Dom.CHILDREN_COMBINATION_MODE_ATTRIBUTE ) );
148     }
149 
150     
151 
152 
153 
154     public static boolean isEmpty( String str )
155     {
156         return str == null || str.trim().length() == 0;
157     }
158 
159 
160 
161 
162 }