1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.datamodel.common;
20
21 import org.mycore.common.content.MCRJDOMContent;
22 import org.mycore.common.xml.MCRXMLParserFactory;
23 import org.mycore.datamodel.metadata.MCRMetaElement;
24 import org.mycore.datamodel.metadata.MCRMetaInterface;
25 import org.mycore.datamodel.metadata.MCRObject;
26 import org.mycore.datamodel.metadata.MCRObjectMetadata;
27
28
29
30
31
32
33
34 public class MCRObjectMerger {
35
36 protected MCRObject target;
37
38
39
40
41
42
43
44 public MCRObjectMerger(MCRObject target) {
45 this.target = new MCRObject(target.createXML());
46 }
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public boolean mergeMetadata(MCRObject source, boolean validate) {
63 MCRObjectMetadata targetMetadata = this.target.getMetadata();
64 boolean merged = false;
65 for (MCRMetaElement metaElementSource : source.getMetadata()) {
66 MCRMetaElement metaElementTarget = targetMetadata.getMetadataElement(metaElementSource.getTag());
67 if (metaElementTarget == null) {
68 targetMetadata.setMetadataElement(metaElementSource.clone());
69 if (validate && !validate(this.target)) {
70 targetMetadata.removeMetadataElement(metaElementSource.getTag());
71 } else {
72 merged = true;
73 }
74 } else {
75 for (MCRMetaInterface metaInterfaceSource : metaElementSource) {
76 boolean equal = false;
77 for (MCRMetaInterface metaInterfaceTarget : metaElementTarget) {
78 if (metaInterfaceSource.equals(metaInterfaceTarget)) {
79 equal = true;
80 break;
81 }
82 }
83 if (!equal) {
84 metaElementTarget.addMetaObject(metaInterfaceSource.clone());
85 if (validate && !validate(this.target)) {
86 metaElementTarget.removeMetaObject(metaInterfaceSource);
87 } else {
88 merged = true;
89 }
90 }
91 }
92 }
93 }
94 return merged;
95 }
96
97
98
99
100
101
102
103 protected boolean validate(MCRObject mcrobj) {
104 try {
105 MCRXMLParserFactory.getParser(true, true).parseXML(new MCRJDOMContent(mcrobj.createXML()));
106 return true;
107 } catch (Exception exc) {
108 return false;
109 }
110 }
111
112
113
114
115
116 public MCRObject get() {
117 return this.target;
118 }
119
120 }