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 }