| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2006 IBM Corporation and others. |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // which accompanies this distribution, and is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // Contributors: |
| // IBM Corporation - initial implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.common.xml; |
| |
| import java.io.File; |
| import java.io.IOException; |
| |
| import javax.xml.parsers.ParserConfigurationException; |
| import javax.xml.parsers.SAXParser; |
| import javax.xml.parsers.SAXParserFactory; |
| |
| import org.eclipse.epf.common.serviceability.Logger; |
| import org.eclipse.epf.common.utils.NetUtil; |
| import org.eclipse.epf.common.utils.StrUtil; |
| import org.eclipse.epf.common.utils.XMLUtil; |
| import org.xml.sax.Attributes; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.SAXParseException; |
| import org.xml.sax.XMLReader; |
| import org.xml.sax.helpers.DefaultHandler; |
| |
| /** |
| * An abstract SAX parser that can be used to parse a single XML file or a |
| * directory of XML files. |
| * |
| * @author Kelvin Low |
| * @since 1.0 |
| */ |
| public abstract class AbstractSAXParser extends DefaultHandler { |
| |
| /** |
| * The logger used for logging warnings, errors and exceptions. |
| */ |
| protected Logger logger; |
| |
| /** |
| * The name of the current XML file being parsed. |
| */ |
| protected String xmlFile; |
| |
| /** |
| * The String buffer for accumulating text. |
| */ |
| protected StringBuffer strBuf; |
| |
| /** |
| * The XML validating flag. |
| */ |
| private boolean validating; |
| |
| /** |
| * Creates a new <code>AbstractSaxParser</code> given the validating flag. |
| * |
| * @param logger |
| * The logger for logging warnings and errors. |
| * @param validating |
| * If true, validate the XML document. |
| */ |
| public AbstractSAXParser(Logger logger, boolean validating) { |
| this.logger = logger; |
| this.validating = validating; |
| } |
| |
| /** |
| * Parses the given XML directory or file. |
| * |
| * @param xmlPath |
| * The XML directory or file. |
| */ |
| public void parse(String xmlPath) { |
| String pathName = StrUtil.replace(xmlPath, "%20", " "); //$NON-NLS-1$ //$NON-NLS-2$ |
| File path = new File(pathName); |
| File[] files = path.isFile() ? new File[] { path } : path.listFiles(); |
| if (files != null) { |
| for (int i = 0; i < files.length; i++) { |
| if (!files[i].isDirectory()) { |
| try { |
| parseFile(files[i].getAbsoluteFile()); |
| } catch (Exception e) { |
| if (logger != null) { |
| logger |
| .logError( |
| "Failed to parse \"" + files[i].getAbsolutePath() + '"', e); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * Parses the given XML file. |
| * |
| * @param xmlFile |
| * The XML file. |
| */ |
| protected void parseFile(File xmlFile) throws ParserConfigurationException, |
| IOException, SAXException { |
| // Create the SAX parser factory. |
| SAXParserFactory spf = SAXParserFactory.newInstance(); |
| |
| // Set the XML validating flag. |
| spf.setValidating(validating); |
| |
| // Create the SAX parser. |
| SAXParser saxParser = spf.newSAXParser(); |
| |
| // Get the SAX XML reader. |
| XMLReader xmlReader = saxParser.getXMLReader(); |
| |
| // Set the SAX parser handlers to this class. |
| xmlReader.setContentHandler(this); |
| xmlReader.setErrorHandler(this); |
| |
| // Instruct the SAX parser to parse the given XML file. |
| this.xmlFile = xmlFile.getAbsolutePath(); |
| xmlReader.parse(NetUtil.getUri(xmlFile)); |
| } |
| |
| /** |
| * Called when the XML parser starts to parse the document. |
| */ |
| public void startDocument() { |
| strBuf = new StringBuffer(); |
| } |
| |
| /** |
| * Called when the the XML parser encounters the chararacter data within a |
| * text element. |
| */ |
| public void characters(char[] buffer, int start, int length) { |
| strBuf.append(buffer, start, length); |
| } |
| |
| /** |
| * Called when the parser starts to parse each new element. |
| */ |
| public abstract void startElement(String namespaceURL, String localName, |
| String qname, Attributes attributes); |
| |
| /** |
| * Called when the XML parser reaches the end of the an element. |
| */ |
| public abstract void endElement(String namespaceURL, String localName, |
| String qname); |
| |
| /** |
| * Called when the XML parser reaches the end of the document. |
| */ |
| public void endDocument() { |
| } |
| |
| /** |
| * Logs the SAX parsing warning. |
| * |
| * @param e |
| * The SAX parse exception. |
| */ |
| public void warning(SAXParseException e) { |
| if (logger != null) { |
| logger |
| .logWarning("SAX parsing warning encountered at " //$NON-NLS-1$ |
| + XMLUtil.getLocationOfException(e) |
| + ": " + e.getMessage()); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * Logs the SAX parsing error. |
| * |
| * @param e |
| * The SAX parse exception. |
| */ |
| public void error(SAXParseException e) { |
| if (logger != null) { |
| logger |
| .logError("SAX parsing error encountered at " //$NON-NLS-1$ |
| + XMLUtil.getLocationOfException(e) |
| + ": " + e.getMessage()); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * Logs the SAX non-recoverable error and exits. |
| * |
| * @param e |
| * The SAX parse exception. |
| */ |
| public void fatalError(SAXParseException e) throws SAXException { |
| if (logger != null) { |
| logger |
| .logError("SAX parsing fatal error encountered at " //$NON-NLS-1$ |
| + XMLUtil.getLocationOfException(e) |
| + ": " + e.getMessage()); //$NON-NLS-1$ |
| logger.logError(e); |
| } |
| } |
| |
| /** |
| * Returns the current XML file that is being parsed. |
| * |
| * @return The name of the XML file. |
| */ |
| public String getXMLFile() { |
| return xmlFile; |
| } |
| |
| } |