1 package com.indexdata.pz2utils4jsf.pazpar2.data;
\r
3 import java.io.ByteArrayInputStream;
\r
4 import java.io.IOException;
\r
5 import java.io.UnsupportedEncodingException;
\r
6 import java.util.Arrays;
\r
7 import java.util.List;
\r
8 import java.util.Stack;
\r
10 import javax.xml.parsers.ParserConfigurationException;
\r
11 import javax.xml.parsers.SAXParser;
\r
12 import javax.xml.parsers.SAXParserFactory;
\r
14 import org.xml.sax.Attributes;
\r
15 import org.xml.sax.InputSource;
\r
16 import org.xml.sax.SAXException;
\r
17 import org.xml.sax.XMLReader;
\r
18 import org.xml.sax.helpers.DefaultHandler;
\r
20 import com.indexdata.pz2utils4jsf.pazpar2.data.ByTarget;
\r
21 import com.indexdata.pz2utils4jsf.pazpar2.data.Hit;
\r
22 import com.indexdata.pz2utils4jsf.pazpar2.data.Location;
\r
23 import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;
\r
24 import com.indexdata.pz2utils4jsf.pazpar2.data.RecordResponse;
\r
25 import com.indexdata.pz2utils4jsf.pazpar2.data.ShowResponse;
\r
26 import com.indexdata.pz2utils4jsf.pazpar2.data.StatResponse;
\r
27 import com.indexdata.pz2utils4jsf.pazpar2.data.Target;
\r
28 import com.indexdata.pz2utils4jsf.pazpar2.data.TermListResponse;
\r
29 import com.indexdata.pz2utils4jsf.pazpar2.data.TermListsResponse;
\r
30 import com.indexdata.pz2utils4jsf.pazpar2.data.TermResponse;
\r
31 import com.indexdata.pz2utils4jsf.pazpar2.data.TermXTargetResponse;
\r
33 public class Pazpar2ResponseParser extends DefaultHandler {
\r
35 private XMLReader xmlReader = null;
\r
36 private Pazpar2ResponseData currentElement = null;
\r
37 private Stack<Pazpar2ResponseData> dataElements = new Stack<Pazpar2ResponseData>();
\r
38 private Pazpar2ResponseData result = null;
\r
40 private static final List<String> docTypes =
\r
41 Arrays.asList("bytarget","termlist","show","stat","record","search");
\r
43 public Pazpar2ResponseParser() {
\r
46 } catch (ParserConfigurationException e) {
\r
47 // TODO Auto-generated catch block
\r
48 e.printStackTrace();
\r
49 } catch (SAXException e) {
\r
50 // TODO Auto-generated catch block
\r
51 e.printStackTrace();
\r
55 private void initSax() throws ParserConfigurationException, SAXException {
\r
56 SAXParserFactory spf = SAXParserFactory.newInstance();
\r
57 spf.setNamespaceAware(true);
\r
58 SAXParser saxParser = spf.newSAXParser();
\r
59 xmlReader = saxParser.getXMLReader();
\r
60 xmlReader.setContentHandler(this);
\r
63 public Pazpar2ResponseData getObject (String response) {
\r
65 xmlReader.parse(new InputSource(new ByteArrayInputStream(response.getBytes("UTF-8"))));
\r
66 } catch (UnsupportedEncodingException e) {
\r
67 // TODO Auto-generated catch block
\r
68 e.printStackTrace();
\r
69 } catch (IOException e) {
\r
70 // TODO Auto-generated catch block
\r
71 e.printStackTrace();
\r
72 } catch (SAXException e) {
\r
73 // TODO Auto-generated catch block
\r
74 e.printStackTrace();
\r
80 * Receive notification at the start of element
\r
84 public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
\r
85 if (localName.equals("show")) {
\r
86 currentElement = new ShowResponse();
\r
87 } else if (localName.equals("hit")) {
\r
88 currentElement = new Hit();
\r
89 } else if (localName.equals("location")) {
\r
90 currentElement = new Location();
\r
91 } else if (localName.equals("bytarget")) {
\r
92 currentElement = new ByTarget();
\r
93 } else if (localName.equals("target")) {
\r
94 currentElement = new Target();
\r
95 } else if (localName.equals("stat")) {
\r
96 currentElement = new StatResponse();
\r
97 } else if (localName.equals("termlist")) {
\r
98 currentElement = new TermListsResponse();
\r
99 } else if (localName.equals("list")) {
\r
100 currentElement = new TermListResponse();
\r
101 ((TermListResponse)currentElement).setName(atts.getValue("name"));
\r
102 ((TermListsResponse)dataElements.peek()).addTermList((TermListResponse)currentElement);
\r
103 } else if (localName.equals("term")) {
\r
104 if (dataElements.peek().getAttribute("name").equals("xtargets")) {
\r
105 currentElement = new TermXTargetResponse();
\r
107 currentElement = new TermResponse();
\r
109 ((TermListResponse)dataElements.peek()).addTerm((TermResponse)currentElement);
\r
110 } else if (localName.equals("record")) {
\r
111 currentElement = new RecordResponse();
\r
112 } else if (localName.equals("search")) {
\r
113 currentElement = new SearchResponse();
\r
115 currentElement = new Pazpar2ResponseData();
\r
117 currentElement.setType(localName);
\r
118 for (int i=0; i< atts.getLength(); i++) {
\r
119 currentElement.setAttribute(atts.getLocalName(i), atts.getValue(i));
\r
121 if (!docTypes.contains(localName)) {
\r
122 dataElements.peek().addElement(localName, currentElement);
\r
124 dataElements.push(currentElement);
\r
128 public void characters(char[] ch, int start, int length) throws SAXException {
\r
129 String data = new String(ch, start, length);
\r
130 dataElements.peek().appendContent(data);
\r
134 public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
\r
135 if (dataElements.size()==1) {
\r
136 result = dataElements.pop();
\r
138 dataElements.pop();
\r