OSDN Git Service

imported from subversion repository
[xerial/xerial-core.git] / src / main / java / org / xerial / util / xml / pullparser / ProgressiveSAXParser.java
1 /*--------------------------------------------------------------------------\r
2  *  Copyright 2004 Taro L. Saito\r
3  *\r
4  *  Licensed under the Apache License, Version 2.0 (the "License");\r
5  *  you may not use this file except in compliance with the License.\r
6  *  You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  *  Unless required by applicable law or agreed to in writing, software\r
11  *  distributed under the License is distributed on an "AS IS" BASIS,\r
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  *  See the License for the specific language governing permissions and\r
14  *  limitations under the License.\r
15  *--------------------------------------------------------------------------*/\r
16 //--------------------------------------\r
17 // XerialJ Project\r
18 //\r
19 // ProgressiveSAXParser.java\r
20 // Since: 2005/06/03\r
21 //\r
22 // $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/xml/pullparser/ProgressiveSAXParser.java $ \r
23 // $Author: leo $\r
24 //--------------------------------------\r
25 package org.xerial.util.xml.pullparser;\r
26 \r
27 import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;\r
28 import static org.xmlpull.v1.XmlPullParser.END_TAG;\r
29 import static org.xmlpull.v1.XmlPullParser.START_DOCUMENT;\r
30 import static org.xmlpull.v1.XmlPullParser.START_TAG;\r
31 import static org.xmlpull.v1.XmlPullParser.TEXT;\r
32 \r
33 import java.io.IOException;\r
34 import java.util.List;\r
35 import java.util.Vector;\r
36 \r
37 import org.xerial.util.xml.XMLErrorCode;\r
38 import org.xerial.util.xml.XMLException;\r
39 import org.xerial.util.xml.XMLInputSource;\r
40 import org.xmlpull.v1.XmlPullParser;\r
41 import org.xmlpull.v1.XmlPullParserException;\r
42 \r
43 /**\r
44  * SAX Parser that can control parsing steps by its own\r
45  * \r
46  * <pre>\r
47  * XMLInputSource xmlSource = new XMLInputSource(&quot;booklist.xml&quot;);\r
48  * ProgressiveSAXParser parser = new ProgressiveSAXParser(handler, xmlSource);\r
49  * \r
50  * int state;\r
51  * while ((state = parser.parseStep()) != XmlPullParser.END_DOCUMENT)\r
52  * {}\r
53  * \r
54  * </pre>\r
55  * \r
56  * @author leo\r
57  * \r
58  */\r
59 public class ProgressiveSAXParser\r
60 {\r
61     private Vector<SAXEventHandler> _handlerList = new Vector<SAXEventHandler>();\r
62     private boolean _keepParserStatusWhileHandlingSAXEvents = true;\r
63 \r
64     private XMLInputSource _inputSource = null;\r
65 \r
66     private XmlPullParser _parser = null;\r
67 \r
68     /**\r
69      * @throws XMLParserException\r
70      * \r
71      */\r
72     public ProgressiveSAXParser(SAXEventHandler handler, XMLInputSource inputSource) throws XMLException\r
73     {\r
74         _handlerList.add(handler);\r
75         setXMLInputSource(inputSource);\r
76     }\r
77 \r
78     public ProgressiveSAXParser(List<SAXEventHandler> handlerList, XMLInputSource inputSource) throws XMLException\r
79     {\r
80         for (SAXEventHandler handler : handlerList)\r
81             _handlerList.add(handler);\r
82 \r
83         setXMLInputSource(inputSource);\r
84     }\r
85 \r
86     private void enablePullParsingWhileHandlingEvents()\r
87     {\r
88         _keepParserStatusWhileHandlingSAXEvents = false;\r
89     }\r
90 \r
91     private void setXMLInputSource(XMLInputSource inputSource) throws XMLException\r
92     {\r
93         _inputSource = inputSource;\r
94         _parser = PullParserUtil.newParser(_inputSource.getReader());\r
95         _parser = _keepParserStatusWhileHandlingSAXEvents ? new ParseContext(_parser) : _parser;\r
96     }\r
97 \r
98     public int parseStep() throws Exception, IOException\r
99     {\r
100         assert _parser != null;\r
101         try\r
102         {\r
103             int state = _parser.next();\r
104             switch (state)\r
105             {\r
106             case START_TAG:\r
107                 for (SAXEventHandler handler : _handlerList)\r
108                     handler.startTag(_parser);\r
109                 break;\r
110             case END_TAG:\r
111                 break;\r
112             case TEXT:\r
113                 for (SAXEventHandler handler : _handlerList)\r
114                     handler.text(_parser);\r
115                 break;\r
116             case END_DOCUMENT:\r
117                 for (SAXEventHandler handler : _handlerList)\r
118                     handler.endDocument(_parser);\r
119                 break;\r
120             case START_DOCUMENT:\r
121                 for (SAXEventHandler handler : _handlerList)\r
122                     handler.startDocument(_parser);\r
123                 break;\r
124             }\r
125 \r
126             return state;\r
127         }\r
128         catch (XmlPullParserException e)\r
129         {\r
130             throw new XMLException(XMLErrorCode.PARSE_ERROR, e);\r
131         }\r
132     }\r
133 \r
134 }\r