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
43
44
45 public class MagnoliaV2Filter extends XMLFilterImpl {
46
47
48
49
50 private int inMetadataElement;
51
52 private boolean skipNode;
53
54 private boolean skipProperty;
55
56 private boolean skipWs;
57
58
59
60
61
62
63 public MagnoliaV2Filter(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 (inMetadataElement > 0) {
74 inMetadataElement--;
75 }
76
77 if (skipNode && "sv:node".equals(qName)) {
78 skipNode = false;
79 skipWs = true;
80 return;
81 }
82
83 if (skipProperty) {
84 if ("sv:property".equals(qName)) {
85 skipProperty = false;
86 skipWs = true;
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
100 if (!(skipNode || skipProperty)) {
101 while (skipWs && length > 0
102 && Character.isWhitespace(ch[start])) {
103 start++;
104 length--;
105 }
106 if (length > 0) {
107 super.characters(ch, start, length);
108 }
109 }
110 skipWs = false;
111 }
112
113
114
115
116 @Override
117 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
118
119 if (inMetadataElement > 0) {
120 inMetadataElement++;
121 }
122
123 String svname = atts.getValue("sv:name");
124
125 if ("sv:node".equals(qName) && "MetaData".equals(svname)) {
126 inMetadataElement++;
127 }
128
129 if (inMetadataElement > 0) {
130
131 if (skipProperty) {
132 return;
133 }
134
135
136 if ("sv:node".equals(qName) && "jcr:content".equals(svname)) {
137 skipNode = true;
138 return;
139 }
140 if ("sv:property".equals(qName)
141 && ("sequenceposition".equals(svname) || "jcr:primaryType".equals(svname) || "jcr:isCheckedOut"
142 .equals(svname))) {
143 skipProperty = true;
144 return;
145 }
146 if ("sv:property".equals(qName)
147 && ("Data".equals(svname) || "template".equals(svname) || "authorid".equals(svname) || "title"
148 .equals(svname))) {
149 atts = new AttributesImpl();
150 ((AttributesImpl) atts).addAttribute(uri, "name", "sv:name", uri, "mgnl:" + svname);
151 ((AttributesImpl) atts).addAttribute(uri, "type", "sv:type", uri, "String");
152 } else if ("sv:property".equals(qName) && ("creationdate".equals(svname) || "lastmodified".equals(svname))) {
153 atts = new AttributesImpl();
154 ((AttributesImpl) atts).addAttribute(uri, "name", "sv:name", uri, "mgnl:" + svname);
155 ((AttributesImpl) atts).addAttribute(uri, "type", "sv:type", uri, "Date");
156 }
157
158 }
159
160 super.startElement(uri, localName, qName, atts);
161
162 if ("sv:node".equals(qName) && "MetaData".equals(svname)) {
163
164
165
166
167
168
169 String atturi = atts.getURI(0);
170 AttributesImpl atts2 = new AttributesImpl();
171 atts2.addAttribute(uri, "name", "sv:name", atturi, "jcr:primaryType");
172 atts2.addAttribute(uri, "type", "sv:type", atturi, "Name");
173
174 super.startElement(uri, "property", "sv:property", atts2);
175 super.startElement(uri, "value", "sv:value", new AttributesImpl());
176 super.characters(new char[]{'m', 'g', 'n', 'l', ':', 'm', 'e', 't', 'a', 'D', 'a', 't', 'a'}, 0, 13);
177 super.endElement(uri, "value", "sv:value");
178 super.endElement(uri, "property", "sv:property");
179 }
180 }
181 }