| package com.android.server.wifi.hotspot2.omadm; |
| |
| import org.xml.sax.Attributes; |
| import org.xml.sax.InputSource; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.helpers.DefaultHandler; |
| |
| import java.io.IOException; |
| import java.io.StringReader; |
| |
| import javax.xml.parsers.ParserConfigurationException; |
| import javax.xml.parsers.SAXParser; |
| import javax.xml.parsers.SAXParserFactory; |
| |
| /** |
| * Parses an OMA-DM XML tree. |
| * OMA-DM = Open Mobile Association Device Management |
| */ |
| public class OMAParser extends DefaultHandler { |
| private XMLNode mRoot; |
| private XMLNode mCurrent; |
| |
| public OMAParser() { |
| mRoot = null; |
| mCurrent = null; |
| } |
| |
| public MOTree parse(String text, String urn) throws IOException, SAXException { |
| if (text == null) { |
| throw new IOException("Missing text string"); |
| } |
| try { |
| SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); |
| parser.parse(new InputSource(new StringReader(text)), this); |
| return new MOTree(mRoot, urn); |
| } catch (ParserConfigurationException pce) { |
| throw new SAXException(pce); |
| } |
| } |
| |
| public XMLNode getRoot() { |
| return mRoot; |
| } |
| |
| @Override |
| public void startElement(String uri, String localName, String qName, Attributes attributes) |
| throws SAXException { |
| XMLNode parent = mCurrent; |
| |
| mCurrent = new XMLNode(mCurrent, qName, attributes); |
| |
| if (mRoot == null) |
| mRoot = mCurrent; |
| else |
| parent.addChild(mCurrent); |
| } |
| |
| @Override |
| public void endElement(String uri, String localName, String qName) throws SAXException { |
| if (!qName.equals(mCurrent.getTag())) |
| throw new SAXException("End tag '" + qName + "' doesn't match current node: " + |
| mCurrent); |
| |
| try { |
| mCurrent.close(); |
| } catch (IOException ioe) { |
| throw new SAXException("Failed to close element", ioe); |
| } |
| |
| mCurrent = mCurrent.getParent(); |
| } |
| |
| @Override |
| public void characters(char[] ch, int start, int length) throws SAXException { |
| mCurrent.addText(ch, start, length); |
| } |
| } |