/* 
 * My own XML parser.
 */

package mystuff;

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.apache.xerces.parsers.*;

public class myParser extends DOMParser implements ErrorHandler
{

    private int status;

    public myParser() {
	status = 0;
	this.setErrorHandler(this);
    }

    public int get_status() {
	return status;
    }

    public void set_validation(boolean b) {
	try {
            this.setFeature( "http://xml.org/sax/features/validation", b);
        } catch (SAXException e) {
            System.out.println("error in setting up validation feature");
        }
    }
    
    public void set_schemasupport(boolean b) {
	try {
            this.setFeature( "http://apache.org/xml/features/validation/schema", b);
        } catch (SAXException e) {
            System.out.println("error in setting up schema_support feature");
        }
    }

    public void set_namespace(boolean b) {
	try {
            this.setFeature( "http://xml.org/sax/features/namespaces", b);
        } catch (SAXException e) {
            System.out.println("error in setting up namespace feature");
        }
    }
    
    //
    // ErrorHandler methods
    //

    /** Warning. */
    public void warning(SAXParseException ex) throws SAXException {
        System.err.println("[Warning] "+
                           getLocationString(ex)+": "+
                           ex.getMessage());
	status = 1;
	throw ex;
    }

    /** Error. */
    public void error(SAXParseException ex) throws SAXException {
        System.err.println("[Error] "+
                           getLocationString(ex)+": "+
                           ex.getMessage());
	status = 2;
	throw ex;
    }

    /** Fatal error. */
    public void fatalError(SAXParseException ex) throws SAXException {
        System.err.println("[Fatal Error] "+
                           getLocationString(ex)+": "+
                           ex.getMessage());
	status = 3;
        throw ex;
    }

    //
    // Private methods
    //

    /** Returns a string of the location. */
    public String getLocationString(SAXParseException ex) {
        StringBuffer str = new StringBuffer();

        String systemId = ex.getSystemId();
        if (systemId != null) {
            int index = systemId.lastIndexOf('/');
            if (index != -1) 
                systemId = systemId.substring(index + 1);
            str.append(systemId);
        }
        str.append(':');
        str.append(ex.getLineNumber());
        str.append(':');
        str.append(ex.getColumnNumber());

        return str.toString();

    }

}
    
