package edu.sc.seis.sod.validator;
import java.io.IOException;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import com.thaiopensource.util.PropertyMap;
import com.thaiopensource.util.SinglePropertyMap;
import com.thaiopensource.validate.ValidateProperty;
import com.thaiopensource.validate.ValidationDriver;
import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler;
public class Validator {
public Validator(String schemaLoc) {
this.schemaLoc = schemaLoc;
}
public Validator() {
this(SOD_SCHEMA_LOC);
}
public String getErrorMessage() {
return errorMessage;
}
public boolean validate(InputSource in) throws IOException, SAXException {
return validate(in, true);
}
public boolean validate(InputSource in, boolean verbose)
throws IOException, SAXException {
if(verbose) {
if(verboseDriver == null) {
verboseDriver = createDriver(true);
}
synchronized(verboseDriver) {
return verboseDriver.validate(in);
}
} else {
if(driver == null) {
driver = createDriver(false);
}
synchronized(driver) {
return driver.validate(in);
}
}
}
private ValidationDriver createDriver(boolean verbose) {
PropertyMap pm;
if(!verbose) {
pm = SinglePropertyMap.newInstance(ValidateProperty.ERROR_HANDLER, quietEH);
} else {
pm = SinglePropertyMap.newInstance(ValidateProperty.ERROR_HANDLER,
verboseEH);
}
ValidationDriver newDriver = new ValidationDriver(pm);
try {
newDriver.loadSchema(getSchemaSource());
} catch(IOException e) {
GlobalExceptionHandler.handle("Trouble loading the schema for validation. Exiting.",
e);
System.exit(1);
} catch(SAXException e) {
GlobalExceptionHandler.handle("The loaded schema is not well formed. Exiting.",
e);
System.exit(1);
}
return newDriver;
}
private InputSource getSchemaSource() {
ClassLoader loader = (Validator.class).getClassLoader();
InputSource inSource = new InputSource(loader.getResourceAsStream(schemaLoc));
inSource.setSystemId(loader.getResource(schemaLoc).toString());
return inSource;
}
private ErrorHandler quietEH = new ErrorHandler() {
public void warning(SAXParseException exception) {}
public void error(SAXParseException exception) {}
public void fatalError(SAXParseException exception) {}
};
private ErrorHandler verboseEH = new ErrorHandler() {
public void warning(SAXParseException exception) {
handle(exception);
}
public void error(SAXParseException exception) {
handle(exception);
}
public void fatalError(SAXParseException exception) {
handle(exception);
}
private void handle(SAXParseException ex) {
errorMessage = "The strategy file is invalid. SOD requires strategy files that conform to a set structure. See the ingredient reference in the docs that came with SOD for help with this.\n\n";
errorMessage += "There appears to be something wrong on line "
+ ex.getLineNumber() + ". ";
errorMessage += "The validator says '"
+ ex.getLocalizedMessage() + "'\n\n";
}
};
private String errorMessage;
private String schemaLoc = "edu/sc/seis/sod/data/sod.rng";
public static final String SOD_SCHEMA_LOC = "edu/sc/seis/sod/data/sod.rng";
private ValidationDriver verboseDriver, driver;
}