1
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
28
29
30
31
32
33
34 package info.magnolia.importexport.filters;
35
36 import info.magnolia.cms.util.UnicodeNormalizer;
37
38 import org.xml.sax.Attributes;
39 import org.xml.sax.SAXException;
40 import org.xml.sax.XMLReader;
41 import org.xml.sax.helpers.XMLFilterImpl;
42
43
44
45
46
47
48
49 public class ImportXmlRootFilter extends XMLFilterImpl {
50
51
52 public boolean rootNodeFound = false;
53
54 private boolean isRootNode = false;
55
56 private boolean isPrimaryTypeProperty = false;
57
58 private boolean isPrimaryTypeValue = false;
59
60
61
62
63 private int inFilterElement;
64
65 private String importedRootNodeName;
66
67 public ImportXmlRootFilter(XMLReader parent) {
68 super(parent);
69 }
70
71 public String getImportedRootNodeName() {
72 return importedRootNodeName;
73 }
74
75
76
77
78 @Override
79 public void endElement(String uri, String localName, String qName) throws SAXException {
80
81 if (inFilterElement > 0) {
82 inFilterElement--;
83 return;
84 }
85
86 super.endElement(uri, localName, qName);
87 }
88
89
90
91
92 public boolean rootNodeWasFound() {
93 return rootNodeFound;
94 }
95
96
97
98
99 @Override
100 public void characters(char[] ch, int start, int length) throws SAXException {
101
102 if (inFilterElement == 0) {
103
104 if (this.isPrimaryTypeValue) {
105 this.isRootNode = false;
106 this.isPrimaryTypeProperty = false;
107 this.isPrimaryTypeValue = false;
108
109 super.characters("mgnl:content".toCharArray(), 0, "mgnl:content".length());
110 }
111 else {
112 super.characters(ch, start, length);
113 }
114 }
115 }
116
117
118
119
120
121
122
123
124
125 @Override
126 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
127
128 if (inFilterElement > 0) {
129 inFilterElement++;
130 return;
131 }
132
133
134 if ("sv:node".equals(qName)) {
135 String attName = atts.getValue("sv:name");
136 attName = UnicodeNormalizer.normalizeNFC(attName);
137 if (inFilterElement == 0 && importedRootNodeName == null) {
138 this.importedRootNodeName = attName;
139 }
140
141 if ("jcr:root".equals(attName)) {
142 this.rootNodeFound = true;
143 this.isRootNode = true;
144 }
145
146 if ("jcr:system".equals(attName)) {
147 inFilterElement++;
148 return;
149 }
150 }
151
152
153 if (this.isRootNode && "sv:property".equals(qName) && "jcr:primaryType".equals(atts.getValue("sv:name"))) {
154 this.isPrimaryTypeProperty = true;
155 }
156
157 if (this.isPrimaryTypeProperty && "sv:value".equals(qName)) {
158 this.isPrimaryTypeValue = true;
159 }
160
161 super.startElement(uri, localName, qName, atts);
162 }
163 }