com.thaiopensource.relaxng.util.TestDriver Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of wicketstuff-jing Show documentation
Show all versions of wicketstuff-jing Show documentation
Jing is a validator for RELAX NG and other schema languages. This
project was taken from http://code.google.com/p/jing-trang and
mavenized for inclusion in the Wicket Stuff HTML Validator.
The code was taken from the 20091111 release.
package com.thaiopensource.relaxng.util;
import com.thaiopensource.util.OptionParser;
import com.thaiopensource.util.PropertyMapBuilder;
import com.thaiopensource.util.Localizer;
import com.thaiopensource.validate.ValidateProperty;
import com.thaiopensource.validate.ValidationDriver;
import com.thaiopensource.validate.prop.rng.RngProperty;
import com.thaiopensource.xml.sax.ErrorHandlerImpl;
import com.thaiopensource.datatype.DatatypeLibraryLoader;
import org.xml.sax.SAXException;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
class TestDriver {
static public void main(String[] args) throws IOException {
System.exit(new TestDriver().doMain(args));
}
private ValidationDriver driver;
private ErrorHandlerImpl eh;
private Localizer localizer = new Localizer(TestDriver.class);
private int nTests = 0;
public int doMain(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
eh = new ErrorHandlerImpl(System.out);
OptionParser op = new OptionParser("i", args);
PropertyMapBuilder properties = new PropertyMapBuilder();
// This is an optimization. It ensures that all SchemaReaders share a
// single DatatypeLibraryLoader.
properties.put(RngProperty.DATATYPE_LIBRARY_FACTORY, new DatatypeLibraryLoader());
try {
while (op.moveToNextOption()) {
switch (op.getOptionChar()) {
case 'i':
RngProperty.CHECK_ID_IDREF.add(properties);
break;
}
}
}
catch (OptionParser.InvalidOptionException e) {
eh.print(localizer.message("invalid_option", op.getOptionCharString()));
return 2;
}
catch (OptionParser.MissingArgumentException e) {
eh.print(localizer.message("option_missing_argument", op.getOptionCharString()));
return 2;
}
args = op.getRemainingArgs();
eh = new ErrorHandlerImpl(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(args[0]))));
properties.put(ValidateProperty.ERROR_HANDLER, eh);
driver = new ValidationDriver(properties.toPropertyMap());
int result = 0;
for (int i = 1; i < args.length; i++) {
int n = runTestSuite(new File(args[i]));
if (n > result)
result = n;
}
System.err.println("Number of tests: " + nTests);
System.err.println("Elapsed time: " + (System.currentTimeMillis() - startTime));
eh.close();
return result;
}
private static final String CORRECT_SCHEMA_NAME = "c.rng";
private static final String INCORRECT_SCHEMA_NAME = "i.rng";
private static final String VALID_INSTANCE_SUFFIX = ".v.xml";
private static final String INVALID_INSTANCE_SUFFIX = ".i.xml";
public int runTestSuite(File dir) throws IOException {
int result = 0;
String[] subdirs = dir.list();
for (int i = 0; i < subdirs.length; i++) {
File subdir = new File(dir, subdirs[i]);
if (subdir.isDirectory()) {
int n = runTestCase(subdir);
if (n > result)
result = n;
}
}
return result;
}
private int runTestCase(File dir) throws IOException {
File f = new File(dir, INCORRECT_SCHEMA_NAME);
if (f.exists()) {
if (loadSchema(f)) {
failed(f);
return 1;
}
return 0;
}
f = new File(dir, CORRECT_SCHEMA_NAME);
if (!f.exists())
return 0;
if (!loadSchema(f)) {
failed(f);
return 1;
}
String[] files = dir.list();
int result = 0;
for (int i = 0; i < files.length; i++) {
if (files[i].endsWith(VALID_INSTANCE_SUFFIX)) {
f = new File(dir, files[i]);
if (!validateInstance(f)) {
failed(f);
result = 1;
}
}
else if (files[i].endsWith(INVALID_INSTANCE_SUFFIX)) {
f = new File(dir, files[i]);
if (validateInstance(f)) {
failed(f);
result = 1;
}
}
}
return result;
}
private static void failed(File f) {
System.err.println("Failed: " + f.toString());
}
private boolean loadSchema(File schema) throws IOException {
nTests++;
try {
if (driver.loadSchema(ValidationDriver.fileInputSource(schema)))
return true;
}
catch (SAXException e) {
eh.printException(e);
}
return false;
}
private boolean validateInstance(File instance) throws IOException {
nTests++;
try {
if (driver.validate(ValidationDriver.fileInputSource(instance)))
return true;
}
catch (SAXException e) {
eh.printException(e);
}
return false;
}
}