1 package org.codehaus.plexus.metadata.merge;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import java.io.File;
28 import java.io.StringReader;
29 import java.util.List;
30
31 import org.codehaus.plexus.PlexusTestCase;
32 import org.codehaus.plexus.metadata.merge.support.AbstractMergeableElement;
33 import org.codehaus.plexus.metadata.merge.support.AbstractMergeableElementList;
34 import org.codehaus.plexus.metadata.merge.support.ComponentElement;
35 import org.codehaus.plexus.metadata.merge.support.ComponentsElement;
36 import org.codehaus.plexus.metadata.merge.support.RequirementsElement;
37 import org.codehaus.plexus.util.FileUtils;
38 import org.jdom2.Document;
39 import org.jdom2.Element;
40 import org.jdom2.input.SAXBuilder;
41
42
43
44
45
46
47 public class ComponentsXmlMergerTest extends PlexusTestCase {
48 public void testBasic() throws Exception {
49 ComponentsXmlMerger merger = (ComponentsXmlMerger) lookup(Merger.class, "componentsXml");
50 assertNotNull(merger);
51 }
52
53 public void testComponentsXmlFileMerge() throws Exception {
54 File dominantXml = getTestFile("src/test/resources/org/codehaus/plexus/metadata/merge/dominant.xml");
55 File recessiveXml = getTestFile("src/test/resources/org/codehaus/plexus/metadata/merge/recessive.xml");
56 Document dDoc = new SAXBuilder().build(dominantXml);
57 Document rDoc = new SAXBuilder().build(recessiveXml);
58
59 Merger merger = lookup(Merger.class, "componentsXml");
60 assertNotNull(merger);
61 merger.merge(dDoc, rDoc);
62
63 File merged_xml = getTestFile("target/merged.xml");
64 if (merged_xml.exists()) {
65 FileUtils.forceDelete(merged_xml);
66 }
67 merger.writeMergedDocument(dDoc, merged_xml);
68 assertTrue(merged_xml.exists());
69
70 Document mDoc = new SAXBuilder().build(merged_xml);
71 Element mRootElt = mDoc.getRootElement();
72 assertTrue(mRootElt.getName().equals("component-set"));
73 assertEquals(1, mRootElt.getChildren("components").size());
74 List componentEltList = mRootElt.getChild("components").getChildren("component");
75 assertEquals(2, componentEltList.size());
76 Element cElt = (Element) componentEltList.get(0);
77
78 assertEquals("org.codehaus.plexus.metadata.component.IComponent", cElt.getChildTextTrim("role"));
79 assertEquals(
80 "org.codehaus.plexus.metadata.component.DominantComponent", cElt.getChildTextTrim("implementation"));
81
82 assertEquals(
83 "Should only have 1 description element.",
84 1,
85 cElt.getChildren("description").size());
86 assertEquals("Description for Dominant component", cElt.getChildTextTrim("description"));
87
88 assertEquals(
89 "Should only have 1 configuration element.",
90 1,
91 cElt.getChildren("configuration").size());
92
93 Element configurationElt = cElt.getChild("configuration");
94 assertNotNull(configurationElt);
95 assertEquals(1, configurationElt.getChildren("prop1").size());
96 assertEquals("Dominant Property1 value", configurationElt.getChildTextTrim("prop1"));
97 assertEquals(1, configurationElt.getChildren("prop2").size());
98 assertEquals(0, configurationElt.getChildren("prop3").size());
99
100
101 cElt = (Element) componentEltList.get(1);
102 assertEquals("org.codehaus.plexus.metadata.component.INonConflictingComponent", cElt.getChildTextTrim("role"));
103 assertEquals(
104 "org.codehaus.plexus.metadata.component.RecessiveComponent", cElt.getChildTextTrim("implementation"));
105
106 assertEquals(1, mRootElt.getChildren("lifecycle-handler-manager").size());
107 assertEquals(
108 "org.codehaus.plexus.lifecycle.DefaultLifecycleHandlerManager",
109 mRootElt.getChild("lifecycle-handler-manager").getAttributeValue("implementation"));
110 }
111
112 public void testInvalidMergeableElements() throws Exception {
113
114 AbstractMergeableElement dCE = new ComponentElement(new Element("component"));
115 Element roleElt = new Element("role");
116 roleElt.setText("org.codehaus.plexus.ISampleRole");
117 dCE.addContent(roleElt);
118
119 AbstractMergeableElementList reqElt = new RequirementsElement(new Element("requirement"));
120
121 try {
122 dCE.merge(reqElt);
123 fail("Expected MergeException!");
124 } catch (MergeException e) {
125
126 }
127 }
128
129
130
131
132
133
134 public void testComponentsMerge() throws Exception {
135
136 AbstractMergeableElement dParent = new ComponentsElement(new Element("components"));
137 Element dCE = new Element("component");
138 dParent.addContent(dCE);
139 Element roleElt = new Element("role");
140 roleElt.setText("org.codehaus.plexus.ISampleRole");
141 dCE.addContent(roleElt);
142 Element roleHintElt = new Element("role-hint");
143 roleHintElt.setText("sample-role-hint");
144 dCE.addContent(roleHintElt);
145 Element implElt = new Element("implementation");
146 implElt.setText("org.codehaus.plexus.DominantImplementation");
147 dCE.addContent(implElt);
148 Element requirementsElt = new Element("requirements");
149 Element reqElt = new Element("requirement");
150 Element reqRoleElt = new Element("role");
151 reqRoleElt.setText("org.codehaus.plexus.IRequiredRole");
152 reqElt.addContent(reqRoleElt);
153 requirementsElt.addContent(reqElt);
154 dCE.addContent(requirementsElt);
155
156
157 AbstractMergeableElement rParent = new ComponentsElement(new Element("components"));
158 Element rCE = new Element("component");
159 rParent.addContent(rCE);
160 roleElt = new Element("role");
161 roleElt.setText("org.codehaus.plexus.ISampleRole");
162 rCE.addContent(roleElt);
163 roleHintElt = new Element("role-hint");
164 roleHintElt.setText("sample-role-hint");
165 rCE.addContent(roleHintElt);
166 implElt = new Element("implementation");
167 implElt.setText("org.codehaus.plexus.RecessiveImplementation");
168 rCE.addContent(implElt);
169 Element lifecycleHandlerElt = new Element("lifecycle-handler");
170 rCE.addContent(lifecycleHandlerElt);
171 lifecycleHandlerElt.setText("plexus-configurable");
172 requirementsElt = new Element("requirements");
173 reqElt = new Element("requirement");
174 reqRoleElt = new Element("role");
175 reqRoleElt.setText("org.codehaus.plexus.IRequiredRole");
176 reqElt.addContent(reqRoleElt);
177 requirementsElt.addContent(reqElt);
178 Element reqRoleHintElt = new Element("role-hint");
179 reqRoleHintElt.setText("recessive-required-role-hint");
180 reqElt.addContent(reqRoleHintElt);
181 rCE.addContent(requirementsElt);
182
183
184 dParent.merge(rParent);
185 assertEquals(1, dParent.getChildren("component").size());
186 assertEquals(
187 "org.codehaus.plexus.DominantImplementation",
188 dParent.getChild("component").getChildText("implementation"));
189 assertEquals(
190 1,
191 dParent.getChild("component")
192 .getChild("requirements")
193 .getChildren("requirement")
194 .size());
195 }
196
197
198
199
200
201
202
203
204 public void testDeepComponentsMerge() throws Exception {
205
206 if (true) {
207 return;
208 }
209
210
211 AbstractMergeableElement dCE = new ComponentElement(new Element("component"));
212 Element roleElt = new Element("role");
213 roleElt.setText("org.codehaus.plexus.ISampleRole");
214 dCE.addContent(roleElt);
215 Element roleHintElt;
216
217
218
219 Element implElt = new Element("implementation");
220 implElt.setText("org.codehaus.plexus.DominantImplementation");
221 dCE.addContent(implElt);
222 Element requirementsElt = new Element("requirements");
223 Element reqElt = new Element("requirement");
224 Element reqRoleElt = new Element("role");
225 reqRoleElt.setText("org.codehaus.plexus.IRequiredRole");
226 reqElt.addContent(reqRoleElt);
227 requirementsElt.addContent(reqElt);
228 dCE.addContent(requirementsElt);
229
230
231 AbstractMergeableElement rCE = new ComponentElement(new Element("component"));
232 roleElt = new Element("role");
233 roleElt.setText("org.codehaus.plexus.ISampleRole");
234 rCE.addContent(roleElt);
235 roleHintElt = new Element("role-hint");
236 roleHintElt.setText("recessive-hint");
237 rCE.addContent(roleHintElt);
238 implElt = new Element("implementation");
239 implElt.setText("org.codehaus.plexus.RecessiveImplementation");
240 rCE.addContent(implElt);
241 Element lifecycleHandlerElt = new Element("lifecycle-handler");
242 rCE.addContent(lifecycleHandlerElt);
243 lifecycleHandlerElt.setText("plexus-configurable");
244 requirementsElt = new Element("requirements");
245 reqElt = new Element("requirement");
246 reqRoleElt = new Element("role");
247 reqRoleElt.setText("org.codehaus.plexus.IRequiredRole");
248 reqElt.addContent(reqRoleElt);
249 requirementsElt.addContent(reqElt);
250 Element reqRoleHintElt = new Element("role-hint");
251 reqRoleHintElt.setText("recessive-required-role-hint");
252 reqElt.addContent(reqRoleHintElt);
253 rCE.addContent(requirementsElt);
254
255
256 dCE.merge(rCE);
257
258
259 assertTrue(null != dCE.getChild("role"));
260 assertEquals("org.codehaus.plexus.ISampleRole", dCE.getChildText("role"));
261 assertTrue(null != dCE.getChild("role-hint"));
262 assertEquals("recessive-hint", dCE.getChildText("role-hint"));
263 assertTrue(null != dCE.getChild("lifecycle-handler"));
264 assertEquals("plexus-configurable", dCE.getChildText("lifecycle-handler"));
265 assertTrue(null != dCE.getChild("requirements"));
266 assertEquals(1, dCE.getChild("requirements").getChildren("requirement").size());
267 assertEquals(
268 "recessive-required-role-hint",
269 ((Element) dCE.getChild("requirements")
270 .getChildren("requirement")
271 .get(0))
272 .getChildText("role-hint"));
273 }
274
275 public void testMergeRoleComponents() throws Exception {
276 SAXBuilder saxBuilder = new SAXBuilder();
277
278 String source1 = "<component-set>\n" + " <components>\n"
279 + " <component>\n"
280 + " <role>org.codehaus.plexus.metadata.component.DockerComposeConfigHandler</role>\n"
281 + " <implementation>org.codehaus.plexus.metadata.component.DominantComponent</implementation>\n"
282 + " </component>\n"
283 + " <component>\n"
284 + " <role>org.codehaus.plexus.metadata.component.PropertyConfigHandler</role>\n"
285 + " <implementation>org.codehaus.plexus.metadata.component.DominantComponent</implementation>\n"
286 + " </component>\n"
287 + " </components>\n"
288 + "</component-set>";
289 Document doc1 = saxBuilder.build(new StringReader(source1));
290
291 String source2 = "<component-set>\n" + " <components>\n"
292 + " <component>\n"
293 + " <role>org.codehaus.plexus.metadata.component.ExternalConfigHandler</role>\n"
294 + " <implementation>org.codehaus.plexus.metadata.component.DominantComponent</implementation>\n"
295 + " </component>\n"
296 + " </components>\n"
297 + "</component-set>";
298 Document doc2 = saxBuilder.build(new StringReader(source2));
299
300 PlexusXmlMerger merger = new PlexusXmlMerger();
301 Document mergedDoc = merger.merge(doc1, doc2);
302
303 List<Element> components =
304 mergedDoc.detachRootElement().getChild("components").getChildren();
305 assertEquals(3, components.size());
306 }
307 }