package org.softlang.company.features.sax;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.text.*;
/**
* A SAX-based handler that print XSD-based validation errors
*/
public class Validator extends DefaultHandler {
private boolean error = false;
private static MessageFormat message = new MessageFormat("({0}: {1}, {2}): {3}");
private void print(SAXParseException x) {
error = true;
String msg = message.format(new Object[] {
x.getSystemId(),
new Integer(x.getLineNumber()),
new Integer(x.getColumnNumber()),
x.getMessage() });
System.out.println(msg);
}
public void warning(SAXParseException x) {
print(x);
}
public void error(SAXParseException x) {
print(x);
}
public void fatalError(SAXParseException x) throws SAXParseException {
print(x);
throw x;
}
// Required constants
private static final String SCHEMA_LANGUAGE =
"http://java.sun.com/xml/jaxp/properties/schemaLanguage";
private static final String XML_SCHEMA =
"http://www.w3.org/2001/XMLSchema";
private static final String SCHEMA_SOURCE =
"http://java.sun.com/xml/jaxp/properties/schemaSource";
public static void printFailure(String xmlFile) {
System.out.println("Validation failed for " + xmlFile);
}
public static void printSuccess(String xmlFile) {
System.out.println("Validation succeeded for " + xmlFile);
}
public static boolean validate(String xmlFile, String xsdFile) {
try {
// Create a parser factory
SAXParserFactory sf = SAXParserFactory.newInstance();
sf.setNamespaceAware(true);
sf.setValidating(true);
// Create parser and let it do XSD-based validation
SAXParser sp = sf.newSAXParser();
sp.setProperty(SCHEMA_LANGUAGE, XML_SCHEMA);
sp.setProperty(SCHEMA_SOURCE, xsdFile);
// Validate by parsing
Validator v = new Validator();
sp.parse(new File(xmlFile), v);
// Done
if (v.error) {
printFailure(xmlFile);
return false;
} else {
printSuccess(xmlFile);
return true;
}
}
catch (ParserConfigurationException e) {
printFailure(xmlFile);
}
catch (SAXException e) {
printFailure(xmlFile);
}
catch (Exception e) {
printFailure(xmlFile);
}
return false;
}
}