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 public class ImportXmlRootFilter extends XMLFilterImpl {
48
49
50 public boolean rootNodeFound = false;
51
52 private boolean isRootNode = false;
53
54 private boolean isPrimaryTypeProperty = false;
55
56 private boolean isPrimaryTypeValue = false;
57
58
59
60
61 private int inFilterElement;
62
63 public ImportXmlRootFilter(XMLReader parent) {
64 super(parent);
65 }
66
67
68
69
70 @Override
71 public void endElement(String uri, String localName, String qName) throws SAXException {
72
73 if (inFilterElement > 0) {
74 inFilterElement--;
75 return;
76 }
77
78 super.endElement(uri, localName, qName);
79 }
80
81
82
83
84 public boolean rootNodeWasFound() {
85 return rootNodeFound;
86 }
87
88
89
90
91 @Override
92 public void characters(char[] ch, int start, int length) throws SAXException {
93
94 if (inFilterElement == 0) {
95
96 if (this.isPrimaryTypeValue) {
97 this.isRootNode = false;
98 this.isPrimaryTypeProperty = false;
99 this.isPrimaryTypeValue = false;
100
101 super.characters("mgnl:content".toCharArray(), 0, "mgnl:content".length());
102 } else {
103 super.characters(ch, start, length);
104 }
105 }
106 }
107
108
109
110
111
112
113
114
115
116 @Override
117 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
118
119 if (inFilterElement > 0) {
120 inFilterElement++;
121 return;
122 }
123
124
125 if ("sv:node".equals(qName)) {
126 String attName = atts.getValue("sv:name");
127 attName = UnicodeNormalizer.normalizeNFC(attName);
128
129 if ("jcr:root".equals(attName)) {
130 this.rootNodeFound = true;
131 this.isRootNode = true;
132 }
133
134 if ("jcr:system".equals(attName)) {
135 inFilterElement++;
136 return;
137 }
138 }
139
140
141 if (this.isRootNode && "sv:property".equals(qName) && "jcr:primaryType".equals(atts.getValue("sv:name"))) {
142 this.isPrimaryTypeProperty = true;
143 }
144
145 if (this.isPrimaryTypeProperty && "sv:value".equals(qName)) {
146 this.isPrimaryTypeValue = true;
147 }
148
149 super.startElement(uri, localName, qName, atts);
150 }
151 }