// ValidatingXMLDotReader.java
// Uses the SAX interface
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class ValidatingXMLDotReader extends DefaultHandler {

    static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";

    public static void main(String argv[]) {
        if (argv.length != 1) {
            System.err.println("Usage: cmd filename");
            System.exit(1);
        }
        try {
            DefaultHandler handler = new ValidatingXMLDotReader();

            SAXParserFactory factory = SAXParserFactory.newInstance();

            factory.setValidating(true);

            factory.setNamespaceAware(true);

            SAXParser saxParser = factory.newSAXParser();

            saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);

            saxParser.parse(new File(argv[0]), handler);

        } catch (SAXParseException spe) {
            // Error generated by the parser
            System.out.println("\n** Parsing error" + ", line " +
                    spe.getLineNumber() + ", uri " + spe.getSystemId());
            System.out.println("   " + spe.getMessage());

            // Use the contained exception, if any
            Exception x = spe;

            if (spe.getException() != null) {
                x = spe.getException();
            }

            x.printStackTrace();
        } catch (SAXException sxe) {
            // Error generated by this application
            // (or a parser-initialization error)
            Exception x = sxe;

            if (sxe.getException() != null) {
                x = sxe.getException();
            }

            x.printStackTrace();
        } catch (ParserConfigurationException pce) {
            // Parser with specified options can't be built
            pce.printStackTrace();
        } catch (IOException ioe) {
            // I/O error
            ioe.printStackTrace();
        } catch (Throwable t) {
            t.printStackTrace();
        }

        System.exit(0);
    }
//===========================================================
// state variables
//===========================================================
    private int x;
    private int y;


//===========================================================
// SAX DocumentHandler methods
//===========================================================
    public void startDocument()
            throws SAXException {
        System.out.println("startDocument");
    }

    public void endDocument()
            throws SAXException {
        System.out.println("endDocument");
    }

    public void startElement(String namespaceURI, String localName,
            String qName, Attributes atts)
            throws SAXException {
        System.out.println("start element:" + qName);
        if (qName.equals("dot")) {
            x = Integer.parseInt(atts.getValue("x"));
            y = Integer.parseInt(atts.getValue("y"));

            System.out.println(x + ", " + y);
        }
    }

    public void endElement(java.lang.String uri,
            java.lang.String localName,
            java.lang.String qName)
            throws SAXException {
        System.out.println("end element:" + qName);
    }

    public void characters(char buf[], int offset, int len)
            throws SAXException {
        String s = new String(buf, offset, len);
        s = s.trim();
        if (!s.equals("")) {
            System.out.println("characters:" + s);
        }
    }

    //===========================================================
    // SAX ErrorHandler methods
    //===========================================================
    public void error(SAXParseException e) throws SAXParseException {
        throw e;
    }

    // dump warnings too
    public void warning(SAXParseException err) throws SAXParseException {
        System.out.println("** Warning" + ", line " + err.getLineNumber() +
            ", uri " + err.getSystemId());
        System.out.println("   " + err.getMessage());
    }

}