import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;

public class Test32 {

    private final File schemaFile;
    private final File xmlFile;
    public Test32(File schema, File xml) {
        this.schemaFile = schema;
        this.xmlFile = xml;
    }

    protected boolean runPositiveTest() throws IOException, SAXException, ParserConfigurationException {
        boolean result = true;
        SAXErrorHandler eh = new SAXErrorHandler();

        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false);

        spf.setNamespaceAware(true);
        spf.setValidating(true);

        SAXParser parser = spf.newSAXParser();
        parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
        parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaFile);

        parser.parse(xmlFile, eh);

        if (eh.errorCounter != 0) {
            result = false;//(errorHandler.errorCounter + " errors, " + errorHandler.warningCounter + " warnings.");
        }

        return result;
    }

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        File schema = new File(args[0]);
        File xml = new File(args[1]);
        if (new Test32(schema, xml).runPositiveTest()) {
            System.out.println("Failed:" + xml.getName());
        }
    }

    public class SAXErrorHandler extends DefaultHandler {

        public int warningCounter = 0;
        public int errorCounter = 0;
        protected final PrintStream err;

        public SAXErrorHandler() {
            this.err = System.err;
        }

        public void warning(SAXParseException e) throws SAXException {
            warningCounter++;
            err.println("Warning: " + strException(e));
            err.flush();
        }

        public void error(SAXParseException e) throws SAXException {
            errorCounter++;
            err.println("Error: " + strException(e));
            err.flush();
        }

        public void fatalError(SAXParseException e) throws SAXException {
            err.println("Fatal Error: " + strException(e));
            err.flush();
            throw e;
        }

        public String strException(Exception ex) {
            StringBuilder sb = new StringBuilder();
            while (ex != null) {
                if (ex instanceof SAXParseException) {
                    SAXParseException e = (SAXParseException) ex;
                    sb.append(e.getSystemId()).append("(").append(e.getLineNumber()).append(",");
                    sb.append(e.getColumnNumber()).append("): ").append(e.getMessage());
                    ex = e.getException();
                } else {
                    sb.append(ex);
                    ex = null;
                }
            }
            return sb.toString();
        }
    }

}
