/*
Copyright 2014 BarD Software s.r.o
Copyright 2003-2013 GanttProject Team
This file is part of GanttProject, an opensource project management tool.
GanttProject is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GanttProject is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GanttProject. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.ganttproject.io;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Stack;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import net.sourceforge.ganttproject.GPLogger;
import net.sourceforge.ganttproject.parser.FileFormatException;
import net.sourceforge.ganttproject.parser.ParsingListener;
import net.sourceforge.ganttproject.parser.TagHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* SAX parser which delegates parsing semantics to TagHandler instances.
*
* @author dbarashev (Dmitry Barashev)
*/
public class XmlParser extends DefaultHandler {
private StringBuffer myCharacterBuffer = new StringBuffer();
private final Stack<String> myTagStack = new Stack<String>();
private final List<TagHandler> myTagHandlers;
private final List<ParsingListener> myListeners;
public XmlParser(List<TagHandler> tagHandlers, List<ParsingListener> listeners) {
myTagHandlers = tagHandlers;
myListeners = listeners;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
myTagStack.clear();
}
@Override
public void endDocument() throws SAXException {
for (ParsingListener l : myListeners) {
l.parsingFinished();
}
}
@Override
public void startElement(String namespaceURI, String sName, // simple
// name
String qName, // qualified name
Attributes attrs) throws SAXException {
myCharacterBuffer = new StringBuffer();
myTagStack.push(qName);
for (TagHandler next : myTagHandlers) {
try {
next.startElement(namespaceURI, sName, qName, attrs);
} catch (FileFormatException e) {
System.err.println(e.getMessage());
}
}
}
@Override
public void endElement(String namespaceURI, String sName, String qName) throws SAXException {
for (TagHandler next : myTagHandlers) {
next.endElement(namespaceURI, sName, qName);
}
myTagStack.pop();
}
@Override
public void characters(char buf[], int offset, int len) throws SAXException {
String s = new String(buf, offset, len);
for (TagHandler tagHandler : myTagHandlers) {
if (tagHandler.hasCdata()) {
tagHandler.appendCdata(s);
}
}
}
public void parse(InputStream inStream) throws IOException {
// Use the default (non-validating) parser
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
// Parse the input
SAXParser saxParser;
saxParser = factory.newSAXParser();
saxParser.parse(inStream, this);
} catch (ParserConfigurationException e) {
if (!GPLogger.log(e)) {
e.printStackTrace(System.err);
}
throw new IOException(e.getMessage());
} catch (SAXException e) {
if (!GPLogger.log(e)) {
e.printStackTrace(System.err);
}
throw new IOException(e.getMessage());
} catch (RuntimeException e) {
if (!GPLogger.logToLogger(e)) {
e.printStackTrace(System.err);
}
throw new IOException(e.getMessage());
}
}
}