1package com.android.hotspot2.omadm;
2
3import org.xml.sax.Attributes;
4import org.xml.sax.InputSource;
5import org.xml.sax.SAXException;
6import org.xml.sax.helpers.DefaultHandler;
7
8import java.io.IOException;
9import java.io.StringReader;
10
11import javax.xml.parsers.ParserConfigurationException;
12import javax.xml.parsers.SAXParser;
13import javax.xml.parsers.SAXParserFactory;
14
15/**
16 * Parses an OMA-DM XML tree.
17 */
18public class OMAParser extends DefaultHandler {
19    private XMLNode mRoot;
20    private XMLNode mCurrent;
21
22    public OMAParser() {
23        mRoot = null;
24        mCurrent = null;
25    }
26
27    public MOTree parse(String text, String urn) throws IOException, SAXException {
28        try {
29            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
30            parser.parse(new InputSource(new StringReader(text)), this);
31            return new MOTree(mRoot, urn);
32        } catch (ParserConfigurationException pce) {
33            throw new SAXException(pce);
34        }
35    }
36
37    @Override
38    public void startElement(String uri, String localName, String qName, Attributes attributes)
39            throws SAXException {
40        XMLNode parent = mCurrent;
41
42        mCurrent = new XMLNode(mCurrent, qName, attributes);
43
44        if (mRoot == null)
45            mRoot = mCurrent;
46        else
47            parent.addChild(mCurrent);
48    }
49
50    @Override
51    public void endElement(String uri, String localName, String qName) throws SAXException {
52        if (!qName.equals(mCurrent.getTag()))
53            throw new SAXException("End tag '" + qName + "' doesn't match current node: " +
54                    mCurrent);
55
56        try {
57            mCurrent.close();
58        } catch (IOException ioe) {
59            throw new SAXException("Failed to close element", ioe);
60        }
61
62        mCurrent = mCurrent.getParent();
63    }
64
65    @Override
66    public void characters(char[] ch, int start, int length) throws SAXException {
67        mCurrent.addText(ch, start, length);
68    }
69}
70