blob: 4c91a1da8dbd6fb57656dbee47db7203f1c7f7a9 [file] [log] [blame]
//------------------------------------------------------------------------------
// 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;
}
}