1 package nl.geozet.openls.parser;
2
3 import java.io.IOException;
4 import java.io.StringReader;
5 import java.util.Stack;
6
7 import javax.xml.parsers.ParserConfigurationException;
8 import javax.xml.parsers.SAXParser;
9 import javax.xml.parsers.SAXParserFactory;
10
11 import nl.geozet.openls.databinding.openls.Address;
12 import nl.geozet.openls.databinding.openls.Building;
13 import nl.geozet.openls.databinding.openls.GeocodeRequest;
14 import nl.geozet.openls.databinding.openls.Place;
15 import nl.geozet.openls.databinding.openls.PostalCode;
16 import nl.geozet.openls.databinding.openls.Street;
17 import nl.geozet.openls.databinding.openls.StreetAddress;
18
19 import org.apache.log4j.Logger;
20 import org.xml.sax.Attributes;
21 import org.xml.sax.InputSource;
22 import org.xml.sax.SAXException;
23 import org.xml.sax.helpers.DefaultHandler;
24
25
26
27
28 public class OpenLSRequestParser extends DefaultHandler {
29
30
31 private static final Logger LOGGER = Logger
32 .getLogger(OpenLSRequestParser.class);
33
34
35 private SAXParser parser;
36
37
38 private final Stack objStack = new Stack();
39
40
41 private StringBuffer eValBuf;
42
43
44
45
46 public OpenLSRequestParser() {
47 SAXParserFactory factory = SAXParserFactory.newInstance();
48 factory.setValidating(false);
49 try {
50 parser = factory.newSAXParser();
51 } catch (ParserConfigurationException e) {
52 LOGGER.fatal("Configureren van de saxparser is mislukt: ", e);
53 } catch (SAXException e) {
54 LOGGER.error("Maken van de saxparser is mislukt: ", e);
55 }
56 }
57
58
59
60
61
62
63
64
65 public GeocodeRequest parseOpenLSRequest(String data) {
66 objStack.clear();
67 try {
68 parser.parse(new InputSource(new StringReader(data)), this);
69 } catch (SAXException e) {
70 LOGGER.error("OpenLS response XML verwerken is mislukt: " + data
71 + ": ", e);
72 } catch (IOException e) {
73 LOGGER.error("OpenLS response XML lezen is mislukt: ", e);
74 }
75 return getGeocodeRequest();
76 }
77
78
79
80
81
82
83
84 @Override
85 public void startElement(String uri, String localName, String qName,
86 Attributes attributes) {
87 eValBuf = new StringBuffer();
88 String[] nsName = qName.split(":");
89 String eName;
90 if (nsName.length > 1) {
91 eName = nsName[1];
92 } else {
93 eName = nsName[0];
94 }
95 if (eName.equalsIgnoreCase("GeocodeRequest")) {
96 GeocodeRequestls/GeocodeRequest.html#GeocodeRequest">GeocodeRequest obj = new GeocodeRequest();
97 objStack.push(obj);
98 } else if (eName.equalsIgnoreCase("Address")) {
99 Addressng/openls/Address.html#Address">Address obj = new Address();
100 objStack.push(obj);
101 for (int i = 0; i < attributes.getLength(); i++) {
102 String key = attributes.getQName(i);
103 String value = attributes.getValue(i);
104 if (key.equalsIgnoreCase("countryCode")) {
105 obj.setCountryCode(value);
106 }
107 }
108 } else if (eName.equalsIgnoreCase("StreetAddress")) {
109 StreetAddressnls/StreetAddress.html#StreetAddress">StreetAddress obj = new StreetAddress();
110 objStack.push(obj);
111 } else if (eName.equalsIgnoreCase("Building")) {
112 Buildingg/openls/Building.html#Building">Building obj = new Building();
113 objStack.push(obj);
114 for (int i = 0; i < attributes.getLength(); i++) {
115 String key = attributes.getQName(i);
116 String value = attributes.getValue(i);
117 if (key.equalsIgnoreCase("number")) {
118 obj.setNumber(value);
119 }
120 }
121 } else if (eName.equalsIgnoreCase("Street")) {
122 Streeting/openls/Street.html#Street">Street obj = new Street();
123 objStack.push(obj);
124 } else if (eName.equalsIgnoreCase("Place")) {
125 Placeding/openls/Place.html#Place">Place obj = new Place();
126 objStack.push(obj);
127 for (int i = 0; i < attributes.getLength(); i++) {
128 String key = attributes.getQName(i);
129 String value = attributes.getValue(i);
130 if (key.equalsIgnoreCase("type")) {
131 obj.setType(value);
132 }
133 }
134 } else if (eName.equalsIgnoreCase("PostalCode")) {
135 PostalCodeopenls/PostalCode.html#PostalCode">PostalCode obj = new PostalCode();
136 objStack.push(obj);
137 }
138 }
139
140
141
142
143
144
145
146 @Override
147 public void endElement(String uri, String localName, String qName) {
148 String[] nsName = qName.split(":");
149 String eName;
150 if (nsName.length > 1) {
151 eName = nsName[1];
152 } else {
153 eName = nsName[0];
154 }
155 if (eName.equalsIgnoreCase("Address")) {
156 Address="../../../../nl/geozet/openls/databinding/openls/Address.html#Address">Address obj = (Address) (objStack.pop());
157 if (objStack.peek().getClass() == GeocodeRequest.class) {
158 ((GeocodeRequest) (objStack.peek())).addAddress(obj);
159 }
160 } else if (eName.equalsIgnoreCase("StreetAddress")) {
161 StreetAddress./../../nl/geozet/openls/databinding/openls/StreetAddress.html#StreetAddress">StreetAddress obj = (StreetAddress) (objStack.pop());
162 if (objStack.peek().getClass() == Address.class) {
163 ((Address) (objStack.peek())).setStreetAddress(obj);
164 }
165 } else if (eName.equalsIgnoreCase("Building")) {
166 Building"../../../../nl/geozet/openls/databinding/openls/Building.html#Building">Building obj = (Building) (objStack.pop());
167 if (objStack.peek().getClass() == StreetAddress.class) {
168 ((StreetAddress) (objStack.peek())).setBuilding(obj);
169 }
170 } else if (eName.equalsIgnoreCase("Street")) {
171 Streetf="../../../../nl/geozet/openls/databinding/openls/Street.html#Street">Street obj = (Street) (objStack.pop());
172 obj.setStreet(eValBuf.toString());
173 if (objStack.peek().getClass() == StreetAddress.class) {
174 ((StreetAddress) (objStack.peek())).setStreet(obj);
175 }
176 } else if (eName.equalsIgnoreCase("Place")) {
177 Placeef="../../../../nl/geozet/openls/databinding/openls/Place.html#Place">Place obj = (Place) (objStack.pop());
178 obj.setPlace(eValBuf.toString());
179 if (objStack.peek().getClass() == Address.class) {
180 ((Address) (objStack.peek())).addPlace(obj);
181 }
182 } else if (eName.equalsIgnoreCase("PostalCode")) {
183 PostalCode./../../../nl/geozet/openls/databinding/openls/PostalCode.html#PostalCode">PostalCode obj = (PostalCode) (objStack.pop());
184 obj.setPostalCode(eValBuf.toString());
185 if (objStack.peek().getClass() == Address.class) {
186 ((Address) (objStack.peek())).setPostalCode(obj);
187 }
188 }
189 }
190
191
192
193
194
195
196 public void characters(char[] ch, int start, int length) {
197 eValBuf.append(ch, start, length);
198 }
199
200
201
202
203
204
205 public GeocodeRequest getGeocodeRequest() {
206 GeocodeRequest geocodeRequest = null;
207 if (objStack.firstElement() != null) {
208 if (objStack.firstElement().getClass() == GeocodeRequest.class) {
209 geocodeRequest = (GeocodeRequest) objStack.firstElement();
210 }
211 }
212 return geocodeRequest;
213 }
214 }