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