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