+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2004 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ Project\r
-//\r
-// SAXParser.java\r
-// Since: 2005/06/03\r
-//\r
-// $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/xml/pullparser/SAXParser.java $ \r
-// $Author: leo $\r
-//--------------------------------------\r
-package org.xerial.util.xml.pullparser;\r
-\r
-import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;\r
-import static org.xmlpull.v1.XmlPullParser.END_TAG;\r
-import static org.xmlpull.v1.XmlPullParser.START_DOCUMENT;\r
-import static org.xmlpull.v1.XmlPullParser.START_TAG;\r
-import static org.xmlpull.v1.XmlPullParser.TEXT;\r
-\r
-import java.io.BufferedReader;\r
-import java.io.FileReader;\r
-import java.io.IOException;\r
-import java.io.Reader;\r
-import java.util.List;\r
-import java.util.Vector;\r
-\r
-import org.xerial.util.xml.XMLErrorCode;\r
-import org.xerial.util.xml.XMLException;\r
-import org.xmlpull.v1.XmlPullParser;\r
-import org.xmlpull.v1.XmlPullParserException;\r
-\r
-/**\r
- * Imitate the behaviour of the SAX handler using XML pull parser.\r
- * \r
- * To change the parser state (e.g. by using next(), etc.), you have to set\r
- * keepParserStatusStableWhileHandlingSAXEvents\81@to false (the default is true,\r
- * i.e. users cannot change the parser state. No next() invocation is allowed. )\r
- * \r
- * @author leo\r
- * \r
- */\r
-public class SAXParser\r
-{\r
- private Vector<SAXEventHandler> _handlerList = new Vector<SAXEventHandler>();\r
- private boolean _keepParserStatusStableWhileHandlingSAXEvents = true;\r
-\r
- /**\r
- * \r
- */\r
- public SAXParser(SAXEventHandler handler)\r
- {\r
- this(handler, true);\r
- }\r
-\r
- public SAXParser(SAXEventHandler handler, boolean keepParserStatusStableWhileHandlingSAXEvents)\r
- {\r
- _handlerList.add(handler);\r
- _keepParserStatusStableWhileHandlingSAXEvents = keepParserStatusStableWhileHandlingSAXEvents;\r
- }\r
-\r
- /**\r
- * Creates SAX parser with multiple event handlers\r
- * \r
- * @param handlerList\r
- * a list of SAX handlers\r
- */\r
- public SAXParser(List<SAXEventHandler> handlerList, boolean keepParserStatusStableWhileHandlingSaxEvents)\r
- {\r
- for (SAXEventHandler handler : handlerList)\r
- {\r
- _handlerList.add(handler);\r
- }\r
- _keepParserStatusStableWhileHandlingSAXEvents = keepParserStatusStableWhileHandlingSaxEvents;\r
- }\r
-\r
- public SAXParser(List<SAXEventHandler> handlerList)\r
- {\r
- this(handlerList, true);\r
- }\r
-\r
- public void addHandler(SAXEventHandler handler)\r
- {\r
- this.addHandler(handler);\r
- }\r
-\r
- public void removeHandler(SAXEventHandler handler)\r
- {\r
- int handlerIndex = _handlerList.indexOf(handler);\r
- this.removeHandler(handlerIndex);\r
- }\r
-\r
- public void removeHandler(int handlerIndex)\r
- {\r
- if (handlerIndex != -1 && handlerIndex < _handlerList.size())\r
- _handlerList.remove(handlerIndex);\r
- }\r
-\r
- /**\r
- * Parse the given XML file\r
- * \r
- * @param xmlFileName\r
- * @throws IOException\r
- * when failed to read a file\r
- * @throws XMLException\r
- * @throws XMLParserException\r
- * when failed to produce XML parser instance\r
- * @throws XMLException\r
- * when reading invalid XML data\r
- */\r
- public void parse(String xmlFileName) throws IOException, XMLException\r
- {\r
- Reader reader = new BufferedReader(new FileReader(xmlFileName));\r
- parse(reader);\r
- reader.close();\r
- }\r
-\r
- /**\r
- * Read the input XML data, and produce SAX events, which will be caught by\r
- * SAX event Handlers\r
- * \r
- * @param xmlInputSource\r
- * @throws IOException\r
- * file I/O errro\r
- * \r
- * @throws XMLParserException\r
- * when failed to produce PullParser Instance\r
- * \r
- * @throws XMLException\r
- * invalid XML data format\r
- * \r
- */\r
- public void parse(Reader xmlInputSource) throws IOException, XMLException\r
- {\r
- XmlPullParser parser = PullParserUtil.newParser(xmlInputSource);\r
- this.parse(parser);\r
- }\r
-\r
- /**\r
- * resume parsing\r
- * \r
- * @param xmlInputSource\r
- * @throws IOException\r
- * \r
- * @throws XMLException\r
- * when invalid XML data is given\r
- * \r
- */\r
- public void parse(XmlPullParser p) throws IOException, XMLException\r
- {\r
- XmlPullParser parser = _keepParserStatusStableWhileHandlingSAXEvents ? new ParseContext(p) : p;\r
-\r
- try\r
- {\r
- if (p.getEventType() == START_DOCUMENT)\r
- {\r
- for (SAXEventHandler handler : _handlerList)\r
- handler.startDocument(parser);\r
- }\r
-\r
- int state;\r
- while ((state = p.next()) != END_DOCUMENT)\r
- {\r
- //int handlerIndex = 0;\r
- switch (state)\r
- {\r
- case START_TAG:\r
- for (SAXEventHandler handler : _handlerList)\r
- handler.startTag(parser);\r
- break;\r
- case END_TAG:\r
- for (SAXEventHandler handler : _handlerList)\r
- handler.endTag(parser);\r
- break;\r
- case TEXT:\r
- for (SAXEventHandler handler : _handlerList)\r
- handler.text(parser);\r
- break;\r
- }\r
- }\r
- for (SAXEventHandler handler : _handlerList)\r
- handler.endDocument(parser);\r
- }\r
- catch (XmlPullParserException e)\r
- {\r
- throw new XMLException(XMLErrorCode.PARSE_ERROR, e);\r
- }\r
-\r
- }\r
-\r
-}\r