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 java.util.ArrayList;
37 import java.util.List;
38
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41 import org.xml.sax.Attributes;
42 import org.xml.sax.SAXException;
43 import org.xml.sax.XMLReader;
44 import org.xml.sax.helpers.AttributesImpl;
45 import org.xml.sax.helpers.XMLFilterImpl;
46
47
48
49
50
51
52
53
54 public abstract class SkipNodePropertyFilter extends XMLFilterImpl {
55
56
57
58
59 protected Logger log = LoggerFactory.getLogger(getClass());
60
61 protected String lastNodeName;
62
63 protected boolean skipProperty;
64
65 protected boolean invalue;
66
67 private List<BufferedElement> elementBuffer = new ArrayList<BufferedElement>();
68
69
70
71
72
73 public SkipNodePropertyFilter(XMLReader parent) {
74 super(parent);
75 }
76
77
78
79
80 @Override
81 public void endElement(String uri, String localName, String qName) throws SAXException {
82
83 if (skipProperty) {
84 if ("sv:property".equals(qName)) {
85 skipProperty = false;
86 invalue = false;
87 elementBuffer.clear();
88 }
89 return;
90 }
91
92 super.endElement(uri, localName, qName);
93 }
94
95
96
97
98 @Override
99 public void characters(char[] ch, int start, int length) throws SAXException {
100 if (!skipProperty) {
101 super.characters(ch, start, length);
102 }
103 else {
104 if (invalue) {
105 invalue = false;
106
107 char[] range = new char[length];
108 System.arraycopy(ch, start, range, 0, length);
109 String textContent = new String(range);
110
111
112 boolean skip = filter(textContent, lastNodeName);
113
114 if (!skip) {
115 while (!elementBuffer.isEmpty()) {
116 BufferedElement be = elementBuffer.remove(0);
117 super.startElement(be.getUri(), be.getLocalName(), be.getQName(), be.getAtts());
118 }
119 super.characters(ch, start, length);
120 skipProperty = false;
121 }
122 }
123
124 }
125 }
126
127
128
129
130 @Override
131 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
132
133 String svname = atts.getValue("sv:name");
134 if ("sv:node".equals(qName)) {
135 lastNodeName = svname;
136 }
137 else if ("sv:property".equals(qName) && (getFilteredPropertyName().equals(svname))) {
138 elementBuffer.add(new BufferedElement(uri, localName, qName, new AttributesImpl(atts)));
139
140 skipProperty = true;
141 invalue = false;
142 }
143 else if (skipProperty && "sv:value".equals(qName)) {
144 elementBuffer.add(new BufferedElement(uri, localName, qName, new AttributesImpl(atts)));
145 invalue = true;
146 }
147
148 if (skipProperty) {
149 return;
150 }
151 super.startElement(uri, localName, qName, atts);
152
153 }
154
155
156
157
158
159 protected abstract String getFilteredPropertyName();
160
161
162
163
164
165
166
167
168 protected abstract boolean filter(String propertyValue, String parentNodeName);
169
170
171
172
173 public static class BufferedElement {
174
175 private String uri;
176
177 private String localName;
178
179 private String qName;
180
181 private Attributes atts;
182
183
184
185
186
187
188
189 public BufferedElement(String uri, String localName, String qName, Attributes atts) {
190 this.atts = atts;
191 this.localName = localName;
192 this.qName = qName;
193 this.uri = uri;
194 }
195
196
197
198
199
200 public String getUri() {
201 return uri;
202 }
203
204
205
206
207
208 public void setUri(String uri) {
209 this.uri = uri;
210 }
211
212
213
214
215
216 public String getLocalName() {
217 return localName;
218 }
219
220
221
222
223
224 public void setLocalName(String localName) {
225 this.localName = localName;
226 }
227
228
229
230
231
232 public String getQName() {
233 return qName;
234 }
235
236
237
238
239
240 public void setQName(String name) {
241 qName = name;
242 }
243
244
245
246
247
248 public Attributes getAtts() {
249 return atts;
250 }
251
252
253
254
255
256 public void setAtts(Attributes atts) {
257 this.atts = atts;
258 }
259 }
260 }