+++ /dev/null
-package com.indexdata.pz2utils4jsf.pazpar2.data;\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.IOException;\r
-import java.io.UnsupportedEncodingException;\r
-import java.util.Arrays;\r
-import java.util.List;\r
-import java.util.Stack;\r
-\r
-import javax.xml.parsers.ParserConfigurationException;\r
-import javax.xml.parsers.SAXParser;\r
-import javax.xml.parsers.SAXParserFactory;\r
-\r
-import org.xml.sax.Attributes;\r
-import org.xml.sax.InputSource;\r
-import org.xml.sax.SAXException;\r
-import org.xml.sax.XMLReader;\r
-import org.xml.sax.helpers.DefaultHandler;\r
-\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.ByTarget;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Hit;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Location;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Pazpar2ResponseData;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.RecordResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.ShowResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.StatResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.Target;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermListResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermListsResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermResponse;\r
-import com.indexdata.pz2utils4jsf.pazpar2.data.TermXTargetResponse;\r
-\r
-public class Pazpar2ResponseParser extends DefaultHandler {\r
-\r
- private XMLReader xmlReader = null;\r
- private Pazpar2ResponseData currentElement = null;\r
- private Stack<Pazpar2ResponseData> dataElements = new Stack<Pazpar2ResponseData>();\r
- private Pazpar2ResponseData result = null;\r
-\r
- private static final List<String> docTypes = \r
- Arrays.asList("bytarget","termlist","show","stat","record","search");\r
- \r
- public Pazpar2ResponseParser() { \r
- try {\r
- initSax();\r
- } catch (ParserConfigurationException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- } catch (SAXException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- }\r
- \r
- public static Pazpar2ResponseParser getParser() {\r
- return new Pazpar2ResponseParser();\r
- }\r
- \r
- private void initSax() throws ParserConfigurationException, SAXException {\r
- SAXParserFactory spf = SAXParserFactory.newInstance();\r
- spf.setNamespaceAware(true);\r
- SAXParser saxParser = spf.newSAXParser();\r
- xmlReader = saxParser.getXMLReader();\r
- xmlReader.setContentHandler(this); \r
- }\r
- \r
- /**\r
- * Parses a Pazpar2 XML response -- or an error response as XML -- and produces a \r
- * Pazpar2ResponseData object, i.e. a 'show' object\r
- * \r
- * @param response XML response string from Pazpar2\r
- * @return Response data object\r
- */\r
- public Pazpar2ResponseData getDataObject (String response) {\r
- try { \r
- xmlReader.parse(new InputSource(new ByteArrayInputStream(response.getBytes("UTF-8"))));\r
- } catch (UnsupportedEncodingException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace(); \r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- } catch (SAXException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace(); \r
- }\r
- return result;\r
- }\r
-\r
- /** \r
- * Receive notification at the start of element \r
- * \r
- */\r
- @Override\r
- public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {\r
- if (localName.equals("show")) {\r
- currentElement = new ShowResponse();\r
- } else if (localName.equals("hit")) {\r
- currentElement = new Hit();\r
- } else if (localName.equals("location")) {\r
- currentElement = new Location();\r
- } else if (localName.equals("bytarget")) {\r
- currentElement = new ByTarget();\r
- } else if (localName.equals("target")) {\r
- currentElement = new Target();\r
- } else if (localName.equals("stat")) {\r
- currentElement = new StatResponse();\r
- } else if (localName.equals("termlist")) {\r
- currentElement = new TermListsResponse();\r
- } else if (localName.equals("list")) {\r
- currentElement = new TermListResponse();\r
- ((TermListResponse)currentElement).setName(atts.getValue("name"));\r
- ((TermListsResponse)dataElements.peek()).addTermList((TermListResponse)currentElement);\r
- } else if (localName.equals("term")) {\r
- if (dataElements.peek().getAttribute("name").equals("xtargets")) {\r
- currentElement = new TermXTargetResponse(); \r
- } else {\r
- currentElement = new TermResponse();\r
- }\r
- ((TermListResponse)dataElements.peek()).addTerm((TermResponse)currentElement);\r
- } else if (localName.equals("record")) {\r
- currentElement = new RecordResponse();\r
- } else if (localName.equals("search")) {\r
- currentElement = new SearchResponse();\r
- } else if (localName.equals("applicationerror")) {\r
- currentElement = new CommandError();\r
- } else if (localName.equals("error") && dataElements.peek().getType().equals("applicationerror")) {\r
- currentElement = new Pazpar2Error(); \r
- } else {\r
- currentElement = new Pazpar2ResponseData();\r
- }\r
- currentElement.setType(localName);\r
- for (int i=0; i< atts.getLength(); i++) {\r
- currentElement.setAttribute(atts.getLocalName(i), atts.getValue(i));\r
- }\r
- if (!docTypes.contains(localName)) {\r
- dataElements.peek().addElement(localName, currentElement);\r
- }\r
- dataElements.push(currentElement); \r
- }\r
- \r
- @Override\r
- public void characters(char[] ch, int start, int length) throws SAXException {\r
- String data = new String(ch, start, length); \r
- dataElements.peek().appendContent(data); \r
- }\r
- \r
- @Override\r
- public void endElement(String namespaceURI, String localName, String qName) throws SAXException {\r
- if (dataElements.size()==1) {\r
- result = dataElements.pop();\r
- } else {\r
- dataElements.pop();\r
- }\r
- }\r
-}\r