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 org.xml.sax.Attributes;
37 import org.xml.sax.SAXException;
38 import org.xml.sax.XMLReader;
39 import org.xml.sax.helpers.AttributesImpl;
40 import org.xml.sax.helpers.XMLFilterImpl;
41
42 import java.util.ArrayList;
43 import java.util.Iterator;
44 import java.util.List;
45
46
47
48
49
50
51
52
53
54 public class RemoveMixversionableFilter extends XMLFilterImpl {
55
56 private boolean inMixinTypes = false;
57
58 private boolean inValue = false;
59
60 private List values = new ArrayList();
61
62 private String value;
63
64 private Attributes atts;
65
66
67
68
69
70 public RemoveMixversionableFilter(XMLReader parent) {
71 super(parent);
72 }
73
74 @Override
75 public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
76 if (name.equals("sv:property") && atts.getValue("sv:name").equals("jcr:mixinTypes")) {
77 this.atts = new AttributesImpl(atts);
78 inMixinTypes = true;
79 values.clear();
80 }
81 else if (inMixinTypes && name.equals("sv:value")) {
82 inValue = true;
83 }
84 else {
85 super.startElement(uri, localName, name, atts);
86 }
87 }
88
89 @Override
90 public void characters(char[] ch, int start, int length) throws SAXException {
91 if (inValue) {
92 if(value == null){
93 value = new String(ch, start, length);
94 }
95 else{
96 value += new String(ch, start, length);
97 }
98 }
99 else {
100 super.characters(ch, start, length);
101 }
102 }
103
104 @Override
105 public void endElement(String uri, String localName, String name) throws SAXException {
106 if (inValue && name.equals("sv:value")) {
107 inValue = false;
108 if (!value.equals("mix:versionable")) {
109 values.add(value);
110 }
111 value = null;
112 }
113 else if (inMixinTypes && name.equals("sv:property")) {
114 inMixinTypes = false;
115
116 if (values.size() > 0) {
117 super.startElement(uri, "property", "sv:property", this.atts);
118 for (Iterator iterator = values.iterator(); iterator.hasNext();) {
119 String value = (String) iterator.next();
120 super.startElement(uri, "value", "sv:value", new AttributesImpl());
121 super.characters(value.toCharArray(), 0, value.length());
122 super.endElement(uri, "value", "sv:value");
123 }
124 super.endElement(uri, "property", "sv:property");
125 }
126 }
127 else {
128 super.endElement(uri, localName, name);
129 }
130 }
131 }