1 package org.codehaus.plexus.metadata.merge.support;
2
3 /*
4 * The MIT License
5 *
6 * Copyright (c) 2006, The Codehaus
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy of
9 * this software and associated documentation files (the "Software"), to deal in
10 * the Software without restriction, including without limitation the rights to
11 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12 * of the Software, and to permit persons to whom the Software is furnished to do
13 * so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in all
16 * copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 * SOFTWARE.
25 */
26
27 import java.util.Collection;
28 import java.util.Iterator;
29 import java.util.List;
30
31 import org.codehaus.plexus.metadata.merge.MergeException;
32 import org.codehaus.plexus.metadata.merge.MergeStrategy;
33 import org.jdom2.Attribute;
34 import org.jdom2.Content;
35 import org.jdom2.Document;
36 import org.jdom2.Element;
37 import org.jdom2.Namespace;
38 import org.jdom2.Parent;
39 import org.jdom2.filter.Filter;
40
41 /**
42 * @author <a href='mailto:rahul.thakur.xdev@gmail.com'>Rahul Thakur</a>
43 */
44 /**
45 * @author khmarbaise
46 *
47 */
48 public abstract class AbstractMergeableSupport implements Mergeable {
49 /**
50 * Wrapped JDOM element.
51 */
52 protected Element element;
53
54 /**
55 * The default merging strategy used.
56 */
57 private static final MergeStrategy DEFAULT_MERGE_STRATEGY = MergeStrategies.DEEP;
58
59 /**
60 * @param element {@link Element}
61 */
62 public AbstractMergeableSupport(Element element) {
63 this.element = element;
64 }
65
66 /** {@inheritDoc} */
67 public abstract void merge(Mergeable me) throws MergeException;
68
69 /**
70 * Determines if the passed in {@link Mergeable} was of same type as this
71 * class.
72 *
73 * @param me {@link Mergeable} instance to test.
74 * @return <code>true</code> if the passed in Mergeable can be merged with
75 * the current Mergeable.
76 */
77 protected abstract boolean isExpectedElementType(Mergeable me);
78
79 // ----------------------------------------------------------------------
80 // Methods delegated on wrapped JDOM element.
81 // ----------------------------------------------------------------------
82
83 /**
84 * @param collection {@link Collection}
85 * @return {@link Element}.
86 */
87 public Element addContent(Collection collection) {
88 return element.addContent(collection);
89 }
90
91 /**
92 * @param child {@link Content}
93 * @return {@link Element}.
94 */
95 public Element addContent(Content child) {
96 return element.addContent(child);
97 }
98
99 /**
100 * @param index The index.
101 * @param c {@link Collection}
102 * @return {@link Element}.
103 */
104 public Element addContent(int index, Collection c) {
105 return element.addContent(index, c);
106 }
107
108 /**
109 * @param index The index.
110 * @param child {@link Content}
111 * @return {@link Element}.
112 */
113 public Element addContent(int index, Content child) {
114 return element.addContent(index, child);
115 }
116
117 /**
118 * @param str The content to be added.
119 * @return {@link Element}.
120 */
121 public Element addContent(String str) {
122 return element.addContent(str);
123 }
124
125 /**
126 * @param additional {@link Namespace}
127 */
128 public void addNamespaceDeclaration(Namespace additional) {
129 element.addNamespaceDeclaration(additional);
130 }
131
132 public Object clone() {
133 return element.clone();
134 }
135
136 public List cloneContent() {
137 return element.cloneContent();
138 }
139
140 public Content detach() {
141 return element.detach();
142 }
143
144 /** {@inheritDoc} */
145 public boolean equals(Object obj) {
146 return element.equals(obj);
147 }
148
149 /**
150 * @return list of Namespaces.
151 */
152 public List getAdditionalNamespaces() {
153 return element.getAdditionalNamespaces();
154 }
155
156 /**
157 * @param name The name.
158 * @param ns {@link Namespace}
159 * @return {@link Attribute}
160 */
161 public Attribute getAttribute(String name, Namespace ns) {
162 return element.getAttribute(name, ns);
163 }
164
165 /**
166 * @param name The name of the attribute.
167 * @return {@link Attribute}
168 */
169 public Attribute getAttribute(String name) {
170 return element.getAttribute(name);
171 }
172
173 /**
174 * @return list {@link Attribute}
175 */
176 public List getAttributes() {
177 return element.getAttributes();
178 }
179
180 /**
181 * @see org.jdom2.Element#getAttributeValue(java.lang.String,org.jdom2.Namespace,java.lang.String)
182 * @param name The name of the attribute.
183 * @param ns The {@link Namespace}
184 * @param def the default value.
185 * @return The value of the attribute.
186 */
187 public String getAttributeValue(String name, Namespace ns, String def) {
188 return element.getAttributeValue(name, ns, def);
189 }
190
191 /**
192 * @see org.jdom2.Element#getAttributeValue(java.lang.String,org.jdom2.Namespace)
193 * @param name The name of the attribute.
194 * @param ns The {@link Namespace}
195 * @return The value of the attribute.
196 */
197 public String getAttributeValue(String name, Namespace ns) {
198 return element.getAttributeValue(name, ns);
199 }
200
201 /**
202 * @see org.jdom2.Element#getAttributeValue(java.lang.String,java.lang.String)
203 * @param name The name of the attribute.
204 * @param def the default value.
205 * @return The value of the attribute.
206 */
207 public String getAttributeValue(String name, String def) {
208 return element.getAttributeValue(name, def);
209 }
210
211 /**
212 * @see org.jdom2.Element#getAttributeValue(java.lang.String)
213 * @param name The name of the attribute.
214 * @return The value of the attribute.
215 */
216 public String getAttributeValue(String name) {
217 return element.getAttributeValue(name);
218 }
219
220 /**
221 * @param name The name of the child.
222 * @param ns {@link Namespace}
223 * @return {@link Element}
224 * @see org.jdom2.Element#getChild(java.lang.String,org.jdom2.Namespace)
225 */
226 public Element getChild(String name, Namespace ns) {
227 return element.getChild(name, ns);
228 }
229
230 /**
231 * @param name The name of the child.
232 * @return {@link Element}
233 * @see org.jdom2.Element#getChild(java.lang.String)
234 */
235 public Element getChild(String name) {
236 return element.getChild(name);
237 }
238
239 /**
240 * @return list of {@link Element}
241 * @see org.jdom2.Element#getChildren()
242 */
243 public List getChildren() {
244 return element.getChildren();
245 }
246
247 /**
248 * @param name The name of the child.
249 * @param ns {@link Namespace}
250 * @return list {@link Element}
251 * @see org.jdom2.Element#getChildren(java.lang.String,org.jdom2.Namespace)
252 */
253 public List getChildren(String name, Namespace ns) {
254 return element.getChildren(name, ns);
255 }
256
257 /**
258 * @param name The name.
259 * @return list {@link Element}
260 * @see org.jdom2.Element#getChildren(java.lang.String)
261 */
262 public List getChildren(String name) {
263 return element.getChildren(name);
264 }
265
266 /**
267 * @param name The name of the child.
268 * @param ns {@link Namespace}
269 * @return the child text.
270 * @see org.jdom2.Element#getChildText(java.lang.String,org.jdom2.Namespace)
271 */
272 public String getChildText(String name, Namespace ns) {
273 return element.getChildText(name, ns);
274 }
275
276 /**
277 * @param name The name of the child.
278 * @return the child text.
279 * @see org.jdom2.Element#getChildText(java.lang.String)
280 */
281 public String getChildText(String name) {
282 return element.getChildText(name);
283 }
284
285 /**
286 * @param name The name of the child.
287 * @param ns {@link Namespace}
288 * @return the child text.
289 * @see org.jdom2.Element#getChildTextNormalize(java.lang.String,org.jdom2.Namespace)
290 */
291 public String getChildTextNormalize(String name, Namespace ns) {
292 return element.getChildTextNormalize(name, ns);
293 }
294
295 /**
296 * @param name The name of the child.
297 * @return the child text.
298 * @see org.jdom2.Element#getChildTextNormalize(java.lang.String)
299 */
300 public String getChildTextNormalize(String name) {
301 return element.getChildTextNormalize(name);
302 }
303
304 /**
305 * @param name The name of the child.
306 * @param ns {@link Namespace}
307 * @return the child text.
308 * @see org.jdom2.Element#getChildTextTrim(java.lang.String,org.jdom2.Namespace)
309 */
310 public String getChildTextTrim(String name, Namespace ns) {
311 return element.getChildTextTrim(name, ns);
312 }
313
314 /**
315 * @param name The name of the child.
316 * @return the child text.
317 * @see org.jdom2.Element#getChildTextTrim(java.lang.String)
318 */
319 public String getChildTextTrim(String name) {
320 return element.getChildTextTrim(name);
321 }
322
323 /**
324 * @see org.jdom2.Element#getContent()
325 * @return list of content.
326 */
327 public List getContent() {
328 return element.getContent();
329 }
330
331 /**
332 * @param filter {@link Filter}
333 * @return list of content.
334 * @see org.jdom2.Element#getContent(org.jdom2.filter.Filter)
335 */
336 public List getContent(Filter filter) {
337 return element.getContent(filter);
338 }
339
340 /**
341 * @param index The index.
342 * @return the content.
343 * @see org.jdom2.Element#getContent(int)
344 */
345 public Content getContent(int index) {
346 return element.getContent(index);
347 }
348
349 /**
350 * @return The content size.
351 * @see org.jdom2.Element#getContentSize()
352 */
353 public int getContentSize() {
354 return element.getContentSize();
355 }
356
357 /**
358 * @return {@link Iterator} of descendants.
359 * @see org.jdom2.Element#getDescendants()
360 */
361 public Iterator getDescendants() {
362 return element.getDescendants();
363 }
364
365 /**
366 * @param filter {@link Filter}
367 * @return {@link Iterator} of descendants.
368 * @see org.jdom2.Element#getDescendants(org.jdom2.filter.Filter)
369 */
370 public Iterator getDescendants(Filter filter) {
371 return element.getDescendants(filter);
372 }
373
374 /**
375 * @return the document.
376 * @see org.jdom2.Content#getDocument()
377 */
378 public Document getDocument() {
379 return element.getDocument();
380 }
381
382 /**
383 * @return The name of the element.
384 * @see org.jdom2.Element#getName()
385 */
386 public String getName() {
387 return element.getName();
388 }
389
390 /**
391 * @return {@link Namespace}
392 * @see org.jdom2.Element#getNamespace()
393 */
394 public Namespace getNamespace() {
395 return element.getNamespace();
396 }
397
398 /**
399 * @param prefix The prefix.
400 * @return {@link Namespace}
401 * @see org.jdom2.Element#getNamespace(java.lang.String)
402 */
403 public Namespace getNamespace(String prefix) {
404 return element.getNamespace(prefix);
405 }
406
407 /**
408 * @return the namespace prefix.
409 * @see org.jdom2.Element#getNamespacePrefix()
410 */
411 public String getNamespacePrefix() {
412 return element.getNamespacePrefix();
413 }
414
415 /**
416 * @return the namespace URI.
417 * @see org.jdom2.Element#getNamespaceURI()
418 */
419 public String getNamespaceURI() {
420 return element.getNamespaceURI();
421 }
422
423 /**
424 * @return The parent.
425 * @see org.jdom2.Content#getParent()
426 */
427 public Parent getParent() {
428 return element.getParent();
429 }
430
431 /**
432 * @return the parent {@link Element}
433 * @see org.jdom2.Content#getParentElement()
434 */
435 public Element getParentElement() {
436 return element.getParentElement();
437 }
438
439 /**
440 * @return The qualified name.
441 * @see org.jdom2.Element#getQualifiedName()
442 */
443 public String getQualifiedName() {
444 return element.getQualifiedName();
445 }
446
447 /**
448 * @return The text.
449 * @see org.jdom2.Element#getText()
450 */
451 public String getText() {
452 return element.getText();
453 }
454
455 /**
456 * @return the normalized text.
457 * @see org.jdom2.Element#getTextNormalize()
458 */
459 public String getTextNormalize() {
460 return element.getTextNormalize();
461 }
462
463 /**
464 * @return the trimmed text.
465 * @see org.jdom2.Element#getTextTrim()
466 */
467 public String getTextTrim() {
468 return element.getTextTrim();
469 }
470
471 /**
472 * @return the element value.
473 * @see org.jdom2.Element#getValue()
474 */
475 public String getValue() {
476 return element.getValue();
477 }
478
479 /**
480 * @see java.lang.Object#hashCode()
481 */
482 public int hashCode() {
483 return element.hashCode();
484 }
485
486 /**
487 * @param child The child.
488 * @return the index.
489 * @see org.jdom2.Element#indexOf(org.jdom2.Content)
490 */
491 public int indexOf(Content child) {
492 return element.indexOf(child);
493 }
494
495 /**
496 * @see org.jdom2.Element#isAncestor(org.jdom2.Element)
497 * @param element {@link Element}.
498 * @return true/false.
499 */
500 public boolean isAncestor(Element element) {
501 return element.isAncestor(element);
502 }
503
504 /**
505 * @see org.jdom2.Element#isRootElement()
506 * @return true/false.
507 */
508 public boolean isRootElement() {
509 return element.isRootElement();
510 }
511
512 /**
513 * @see org.jdom2.Element#removeAttribute(org.jdom2.Attribute)
514 * @param attribute {@link Attribute}
515 * @return true/false.
516 */
517 public boolean removeAttribute(Attribute attribute) {
518 return element.removeAttribute(attribute);
519 }
520
521 /**
522 * @see org.jdom2.Element#removeAttribute(java.lang.String,org.jdom2.Namespace)
523 * @param name The name of the attribute.
524 * @param ns The {@link Namespace}
525 * @return true/false.
526 */
527 public boolean removeAttribute(String name, Namespace ns) {
528 return element.removeAttribute(name, ns);
529 }
530
531 /**
532 * @see org.jdom2.Element#removeAttribute(java.lang.String)
533 * @param name The mame of the attribute.
534 * @return true/false.
535 */
536 public boolean removeAttribute(String name) {
537 return element.removeAttribute(name);
538 }
539
540 /**
541 * @see org.jdom2.Element#removeChild(java.lang.String,org.jdom2.Namespace)
542 * @param name The name of the child.
543 * @param ns {@link Namespace}
544 * @return true/false.
545 */
546 public boolean removeChild(String name, Namespace ns) {
547 return element.removeChild(name, ns);
548 }
549
550 /**
551 * @see org.jdom2.Element#removeChild(java.lang.String)
552 * @param name The name of the child.
553 * @return true/false.
554 */
555 public boolean removeChild(String name) {
556 return element.removeChild(name);
557 }
558
559 /**
560 * @see org.jdom2.Element#removeChildren(java.lang.String,org.jdom2.Namespace)
561 * @param name The name of the child.
562 * @param ns {@link Namespace}
563 * @return true/false.
564 */
565 public boolean removeChildren(String name, Namespace ns) {
566 return element.removeChildren(name, ns);
567 }
568
569 /**
570 * @see org.jdom2.Element#removeChildren(java.lang.String)
571 * @param name name of the child.
572 * @return true/false.
573 */
574 public boolean removeChildren(String name) {
575 return element.removeChildren(name);
576 }
577
578 /**
579 * @see org.jdom2.Element#removeContent()
580 * @return list of elements.
581 */
582 public List removeContent() {
583 return element.removeContent();
584 }
585
586 /**
587 * @see org.jdom2.Element#removeContent(org.jdom2.Content)
588 * @param child {@link Content}
589 * @return true/false.
590 */
591 public boolean removeContent(Content child) {
592 return element.removeContent(child);
593 }
594
595 /**
596 * @see org.jdom2.Element#removeContent(org.jdom2.filter.Filter)
597 * @param filter {@link Filter}.
598 * @return list of elements.
599 */
600 public List removeContent(Filter filter) {
601 return element.removeContent(filter);
602 }
603
604 /**
605 * @see org.jdom2.Element#removeContent(int)
606 * @param index The index.
607 * @return {@link Content}
608 */
609 public Content removeContent(int index) {
610 return element.removeContent(index);
611 }
612
613 /**
614 * @see org.jdom2.Element#removeNamespaceDeclaration(org.jdom2.Namespace)
615 * @param additionalNamespace {@link Namespace}.
616 */
617 public void removeNamespaceDeclaration(Namespace additionalNamespace) {
618 element.removeNamespaceDeclaration(additionalNamespace);
619 }
620
621 /**
622 * @param attribute {@link Attribute}
623 * @return {@link Element}.
624 * @see org.jdom2.Element#setAttribute(org.jdom2.Attribute)
625 */
626 public Element setAttribute(Attribute attribute) {
627 return element.setAttribute(attribute);
628 }
629
630 /**
631 * @see org.jdom2.Element#setAttribute(java.lang.String,java.lang.String,org.jdom2.Namespace)
632 * @param name name of the attribute.
633 * @param value The value of the attribute.
634 * @param ns {@link Namespace}.
635 * @return {@link Element}
636 */
637 public Element setAttribute(String name, String value, Namespace ns) {
638 return element.setAttribute(name, value, ns);
639 }
640
641 /**
642 * @param name name of the attribute.
643 * @param value The value of the attribute.
644 * @return {@link Element}
645 * @see org.jdom2.Element#setAttribute(java.lang.String,java.lang.String)
646 */
647 public Element setAttribute(String name, String value) {
648 return element.setAttribute(name, value);
649 }
650
651 /**
652 * @param newAttributes list of new attributes.
653 * @return {@link Element}
654 */
655 public Element setAttributes(List newAttributes) {
656 return element.setAttributes(newAttributes);
657 }
658
659 /**
660 * @param newContent {@link Collection}
661 * @return {@link Element}
662 * @see org.jdom2.Element#setContent(java.util.Collection)
663 */
664 public Element setContent(Collection newContent) {
665 return element.setContent(newContent);
666 }
667
668 /**
669 * @param child {@link Content}
670 * @return {@link Element}
671 * @see org.jdom2.Element#setContent(org.jdom2.Content)
672 */
673 public Element setContent(Content child) {
674 return element.setContent(child);
675 }
676
677 /**
678 * @param index The index.
679 * @param collection {@link Collection}
680 * @return {@link Parent}
681 * @see org.jdom2.Element#setContent(int,java.util.Collection)
682 */
683 public Parent setContent(int index, Collection collection) {
684 return element.setContent(index, collection);
685 }
686
687 /**
688 * @param index index.
689 * @param child {@link Content}
690 * @return {@link Element}
691 * @see org.jdom2.Element#setContent(int,org.jdom2.Content)
692 */
693 public Element setContent(int index, Content child) {
694 return element.setContent(index, child);
695 }
696
697 /**
698 * @param name The name of the element.
699 * @return {@link Element}
700 * @see org.jdom2.Element#setName(java.lang.String)
701 */
702 public Element setName(String name) {
703 return element.setName(name);
704 }
705
706 /**
707 * @param namespace {@link Namespace}
708 * @see org.jdom2.Element#setNamespace(org.jdom2.Namespace)
709 * @return {@link Element}
710 */
711 public Element setNamespace(Namespace namespace) {
712 return element.setNamespace(namespace);
713 }
714
715 /**
716 * @see org.jdom2.Element#setText(java.lang.String)
717 * @param text The text to be set.
718 * @return {@link Element}
719 */
720 public Element setText(String text) {
721 return element.setText(text);
722 }
723
724 /**
725 * {@link org.jdom2.Element#toString()}
726 * {@inheritDoc}
727 */
728 public String toString() {
729 return element.toString();
730 }
731
732 /**
733 * Returns the wrapped up JDom {@link Element} instance.
734 * {@inheritDoc}
735 */
736 public Element getElement() {
737 return this.element;
738 }
739
740 /**
741 * Sub classes should override if they wish to provide a different
742 * combination of composite keys for determining conflicts.
743 * @param defaultList the default list.
744 * @return the default list.
745 */
746 protected List getElementNamesForConflictResolution(List defaultList) {
747 return defaultList;
748 }
749
750 /**
751 * Returns the default {@link MergeStrategy} instance.
752 * @return {@link MergeStrategy}
753 */
754 protected MergeStrategy getDefaultMergeStrategy() {
755 return DEFAULT_MERGE_STRATEGY;
756 }
757 }