- XML parser framework rewrite
[mir.git] / source / mir / util / xml / XMLSAXParserProvider.java
1 package mir.util.xml;\r
2 \r
3 import java.util.*;\r
4 \r
5 import org.xml.sax.InputSource;\r
6 import org.xml.sax.SAXException;\r
7 import org.xml.sax.Locator;\r
8 import mir.util.ExceptionFunctions;\r
9 \r
10 /**\r
11  *\r
12  * <p>Title: </p>\r
13  * <p>Description: </p>\r
14  * <p>Copyright: Copyright (c) 2003</p>\r
15  * <p>Company: </p>\r
16  * @author not attributable\r
17  * @version 1.0\r
18  */\r
19 class XMLSAXParserProvider implements XMLParserEngine.XMLParserProvider {\r
20   private boolean nameSpaceAware;\r
21 \r
22   public XMLSAXParserProvider(boolean aNameSpaceAware) {\r
23     nameSpaceAware = aNameSpaceAware;\r
24   }\r
25 \r
26   public void parse(java.io.Reader aReader, XMLParserEngine.XMLParserReceiver aReceiver) throws XMLParserExc, XMLParserFailure {\r
27     try {\r
28       javax.xml.parsers.SAXParserFactory parserFactory = javax.xml.parsers.SAXParserFactory.newInstance();\r
29 \r
30       parserFactory.setNamespaceAware(true);\r
31       parserFactory.setValidating(true);\r
32       javax.xml.parsers.SAXParser parser = parserFactory.newSAXParser();\r
33 \r
34       parser.parse(new InputSource(aReader), new SAXHandler(aReceiver));\r
35     }\r
36     catch (org.xml.sax.SAXException e) {\r
37       Throwable t = ExceptionFunctions.traceCauseException(e);\r
38 \r
39       if (t instanceof XMLParserExc) {\r
40         throw (XMLParserExc) t;\r
41       }\r
42 \r
43       if (t instanceof XMLParserFailure) {\r
44         throw (XMLParserFailure) t;\r
45       }\r
46 \r
47       throw new XMLParserFailure(t);\r
48     }\r
49     catch (Throwable t) {\r
50       throw new XMLParserFailure(t);\r
51     }\r
52   }\r
53 \r
54   private class SAXHandler extends org.xml.sax.helpers.DefaultHandler {\r
55     private XMLParserEngine.XMLParserReceiver receiver;\r
56 \r
57     public SAXHandler(XMLParserEngine.XMLParserReceiver aReceiver) throws XMLParserExc, XMLParserFailure {\r
58       super();\r
59 \r
60       receiver = aReceiver;\r
61       receiver.startDocument();\r
62    }\r
63 \r
64     public void setDocumentLocator(final Locator aLocator) {\r
65       receiver.setLocator(\r
66           new XMLParserEngine.XMLLocator() {\r
67             public int getLineNr() {\r
68               return aLocator.getLineNumber();\r
69             }\r
70 \r
71             public int getColumnNr() {\r
72               return aLocator.getColumnNumber();\r
73             }\r
74           }\r
75       );\r
76     }\r
77 \r
78     public void startElement(String aUri, String aLocalName, String aQualifiedName, org.xml.sax.Attributes anAttributes) throws org.xml.sax.SAXException {\r
79       try {\r
80         Map attributes = new java.util.HashMap();\r
81 \r
82         XMLName tag;\r
83         if (nameSpaceAware) {\r
84           tag = new XMLName(aUri, XMLReaderTool.getPrefixFromQualifiedName(aQualifiedName), aLocalName);\r
85           for (int i=0; i<anAttributes.getLength(); i++)\r
86             attributes.put(\r
87                 new XMLName(anAttributes.getURI(i),\r
88                             XMLReaderTool.getPrefixFromQualifiedName(anAttributes.getQName(i)),\r
89                             anAttributes.getLocalName(i)),\r
90                 anAttributes.getValue(i));\r
91         }\r
92         else {\r
93           tag = new XMLName(aUri, XMLReaderTool.getPrefixFromQualifiedName(aQualifiedName),\r
94                       XMLReaderTool.getLocalNameFromQualifiedName(aQualifiedName));\r
95           for (int i=0; i<anAttributes.getLength(); i++)\r
96             attributes.put(\r
97                 new XMLName(anAttributes.getURI(i),\r
98                            XMLReaderTool.getPrefixFromQualifiedName(anAttributes.getQName(i)),\r
99                            XMLReaderTool.getLocalNameFromQualifiedName(anAttributes.getQName(i))),\r
100                 anAttributes.getValue(i));\r
101         }\r
102 \r
103         receiver.startElement(tag, attributes);\r
104       }\r
105       catch (XMLParserExc e) {\r
106         throw new org.xml.sax.SAXParseException(e.getMessage(), null, e);\r
107       }\r
108       catch (Exception e) {\r
109         throw new SAXException(e);\r
110       }\r
111     }\r
112 \r
113     public void endElement(String aUri, String aLocalName, String aQualifiedName) throws org.xml.sax.SAXException {\r
114       try\r
115       {\r
116         XMLName element = new XMLName(aUri, XMLReaderTool.getPrefixFromQualifiedName(aQualifiedName), aLocalName);\r
117 \r
118         receiver.endElement(element);\r
119       }\r
120       catch (XMLParserExc e) {\r
121         throw new org.xml.sax.SAXParseException(e.getMessage(), null, e);\r
122       }\r
123       catch (Exception e) {\r
124         throw new org.xml.sax.SAXException(e);\r
125       }\r
126     }\r
127 \r
128     public void endDocument() throws org.xml.sax.SAXException {\r
129       try\r
130       {\r
131         receiver.endDocument();\r
132       }\r
133       catch (XMLParserExc e) {\r
134         throw new org.xml.sax.SAXParseException(e.getMessage(), null, e);\r
135       }\r
136       catch (Exception e) {\r
137         throw new org.xml.sax.SAXException(e);\r
138       }\r
139     }\r
140 \r
141     public void characters(char[] aBuffer, int aStart, int anEnd) throws org.xml.sax.SAXException {\r
142       try {\r
143         String text = new String(aBuffer, aStart, anEnd);\r
144 \r
145         receiver.text(text);\r
146       }\r
147       catch (XMLParserExc e) {\r
148         throw new org.xml.sax.SAXParseException(e.getMessage(), null, e);\r
149       }\r
150       catch (Exception e) {\r
151         throw new org.xml.sax.SAXException(e);\r
152       }\r
153     }\r
154   }\r
155 }\r