View Javadoc
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   * The Class OpenLSRequestParser.
27   */
28  public class OpenLSRequestParser extends DefaultHandler {
29  
30      /** The Constant LOGGER. */
31      private static final Logger LOGGER = Logger
32              .getLogger(OpenLSRequestParser.class);
33  
34      /** The parser. */
35      private SAXParser parser;
36  
37      /** The obj stack. */
38      private final Stack objStack = new Stack();
39  
40      /** The e val buf. */
41      private StringBuffer eValBuf;
42  
43      /**
44       * Instantiates a new open ls request parser.
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       * Parses the open ls request.
60       * 
61       * @param data
62       *            the data
63       * @return the geocode request
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       * (non-Javadoc)
80       * 
81       * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
82       * java.lang.String, java.lang.String, org.xml.sax.Attributes)
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      * (non-Javadoc)
142      * 
143      * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
144      * java.lang.String, java.lang.String)
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      * (non-Javadoc)
193      * 
194      * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
195      */
196     public void characters(char[] ch, int start, int length) {
197         eValBuf.append(ch, start, length);
198     }
199 
200     /**
201      * Gets the geocode request.
202      * 
203      * @return the geocode request
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 }