/*
 * SAXErrorHandler.java
 *
 * Created on February 14, 2001, 4:38 PM
 */

package org.freehep.xml.util;
import org.xml.sax.*;

/**
 * A simple SAXErrorHandler. Reports errors to System.err and keeps track
 * of the most severe error. Can be configured to throw exceptions when errors
 * more severe than a certain LEVEL are encountered
 * @author  tonyj
 * @version $Id: SAXErrorHandler.java 8584 2006-08-10 23:06:37Z duns $
 */
public class SAXErrorHandler implements ErrorHandler
{
    public final static int LEVEL_SUCCESS = 0;
    public final static int LEVEL_WARNING = 1;
    public final static int LEVEL_ERROR = 2;
    public final static int LEVEL_FATAL = 3;
    
    /**
     * Create a SAXErrorHandler which will throw exceptions for all errors (but not warnings)
     */
    public SAXErrorHandler()
    {
        this(LEVEL_ERROR);
    }
    /**
     * Create a SAXErrorHandler
     * @param minLevelForException The minimum error level for which exceptions will be thrown 
     */
    public SAXErrorHandler(int minLevelForException)
    {
        this.minLevel = minLevelForException;
    }
    public void warning(SAXParseException exception) throws org.xml.sax.SAXException
    {
        handle(exception,LEVEL_WARNING,"Warning");
    }
    public void error(SAXParseException exception) throws org.xml.sax.SAXException
    {
        handle(exception,LEVEL_ERROR,"Error");
    }
    public void fatalError(SAXParseException exception) throws SAXException
    {
        handle(exception,LEVEL_FATAL,"Fatal");
    }
    private void handle(SAXParseException exception, int level, String levelName) throws SAXException
    {
        StringBuffer message = new StringBuffer(levelName);
        String fileName = exception.getPublicId();
        if (fileName == null) fileName = exception.getSystemId();
        if (fileName != null) message.append(" at "+fileName);
        message.append(" line "+exception.getLineNumber());
        if (level > maxLevel) maxLevel = level;
        if (level >= minLevel) throw new BadXMLException(message.toString(),exception);
        else 
        {
            message.append(": "+exception);
            System.err.println(message); 
        }
        
    }
    /**
     * Get the level of the most severe error.
     * @return one of LEVEL_SUCCESS, LEVEL_WARNING, LEVEL_ERROR, LEVEL_FATAL
     */
    public int getErrorLevel()
    {
        return maxLevel;
    }
    private int maxLevel = 0;
    private int minLevel;
}

