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