import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;

import org.xml.sax.helpers.DefaultHandler;


/**
 * Lecture 9's demonstration of validation
 * by XML DTD or XML Schema.
 *
 * @author  Computer Science E-259
 **/

public class SAXValidator2 extends DefaultHandler
{
    /**
     * Main driver.  Expects one command-line argument: 
     * the name of the XML file to validate
     *
     * @param argv [0] - filename
     */
    public static void main(String [] argv)
    {
        if (argv.length == 0)
        {
            System.out.println("Usage: SAXValidator2 file [dtd|xsd]");
            System.exit(1);
        }

        // grab filename
        String input = argv[0];

        // grab validation mechanism, if any
        String validator = (argv.length > 1) ? argv[1] : null;

        // process input as requested
        try 
        {
            // instantiate a reference to a SAX parser
            SAXParser parser = null;

            // instantiate a SAX parser factory
            SAXParserFactory factory = SAXParserFactory.newInstance();

            // instantiate a SAX parser, enabling validation as requested
            if (validator != null && validator.equals("dtd"))
            {
                factory.setValidating(true);
                parser = factory.newSAXParser();
                System.out.println("Validation by DTD on.");
            }
            else if (validator != null && validator.equals("xsd"))
            {
                factory.setNamespaceAware(true);
                factory.setValidating(true);
                parser = factory.newSAXParser();
                parser.setProperty
                 (
                  "http://java.sun.com/xml/jaxp/properties/schemaLanguage", 
                  "http://www.w3.org/2001/XMLSchema"
                 );
                System.out.println("Validation by XML Schema on.");
            }
            else
            {
                factory.setValidating(false);
                parser = factory.newSAXParser();
                System.out.println("Validation off.");
            }

            // instantiate our little handler
            SAXValidator2 handler = new SAXValidator2();

            // parse the file
            parser.parse(input, handler);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * Receive notification of a recoverable parser error. 
     *
     * @param e  the exception thrown
     */
    public void error (SAXParseException e) 
    {
        System.out.println("Parsing error:  " + e.getMessage());
    }


    /**
     * Receive notification of a parser warning.
     *
     * @param e  the exception thrown
     */
    public void warning (SAXParseException e) 
    {
        System.out.println("Parsing warning:  " + e.getMessage());
    }


    /**
     * Report a fatal XML parsing error. 
     *
     * @param e  the exception thrown
     */
    public void fatalError (SAXParseException e) 
    {
        System.out.println("Fatal parsing error:  " + e.getMessage());
        System.exit(1);
    }
}
