Adds beans and configs
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / data / Pazpar2ResponseParser.java
1 package com.indexdata.pz2utils4jsf.pazpar2.data;\r
2 \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
9 \r
10 import javax.xml.parsers.ParserConfigurationException;\r
11 import javax.xml.parsers.SAXParser;\r
12 import javax.xml.parsers.SAXParserFactory;\r
13 \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
19 \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
32 \r
33 public class Pazpar2ResponseParser extends DefaultHandler {\r
34 \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
39 \r
40   private static final List<String> docTypes = \r
41       Arrays.asList("bytarget","termlist","show","stat","record");\r
42   \r
43   public Pazpar2ResponseParser() {    \r
44     try {\r
45       initSax();\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
52     }\r
53   }\r
54   \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
61   }\r
62   \r
63   public Pazpar2ResponseData getObject (String response) {\r
64     try {\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
75     }\r
76     return result;\r
77   }\r
78 \r
79   /** \r
80    * Receive notification at the start of element \r
81    * \r
82    */\r
83   @Override\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
106       } else {\r
107         currentElement = new TermResponse();\r
108       }\r
109       ((TermListResponse)dataElements.peek()).addTerm((TermResponse)currentElement);\r
110     } else if (localName.equals("record")) {\r
111       currentElement = new RecordResponse();\r
112     } else {\r
113       currentElement = new Pazpar2ResponseData();\r
114     }\r
115     currentElement.setType(localName);\r
116     for (int i=0; i< atts.getLength(); i++) {\r
117        currentElement.setAttribute(atts.getLocalName(i), atts.getValue(i));\r
118     }\r
119     if (!docTypes.contains(localName)) {\r
120       dataElements.peek().addElement(localName, currentElement);\r
121     }\r
122     dataElements.push(currentElement);    \r
123   }\r
124  \r
125   @Override\r
126   public void characters(char[] ch, int start, int length) throws SAXException {\r
127     String data = new String(ch, start, length);        \r
128     dataElements.peek().appendContent(data);    \r
129   }\r
130   \r
131   @Override\r
132   public void endElement(String namespaceURI, String localName, String qName) throws SAXException {\r
133     if (dataElements.size()==1) {\r
134       result = dataElements.pop();\r
135     } else {\r
136       dataElements.pop();\r
137     }\r
138   }\r
139 \r
140 \r
141 }\r