/** * ExampleValidator.java * * @author Created by Omnicore CodeGuide */ package edu.sc.seis.sod.validator.example; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; import javax.xml.stream.XMLStreamException; import org.xml.sax.InputSource; import edu.sc.seis.sod.validator.Validator; import edu.sc.seis.sod.validator.model.Annotation; import edu.sc.seis.sod.validator.model.Form; import edu.sc.seis.sod.validator.model.GenitorForm; import edu.sc.seis.sod.validator.model.MultigenitorForm; import edu.sc.seis.sod.validator.model.StAXModelBuilder; public class ExampleValidator { public static void validate(String exampleContainingSchemaLoc) throws IOException, XMLStreamException { System.out.println("validating " + exampleContainingSchemaLoc); StAXModelBuilder modelBuilder = new StAXModelBuilder(exampleContainingSchemaLoc); Form root = modelBuilder.getRoot().getForm(); Annotation[] anns = findUniqueAnnotations(root); System.out.println(anns.length + " examples to be validated"); validate(anns, root, 0, anns.length); } private static Annotation[] findUniqueAnnotations(Form root) { List l = new ArrayList(); findUniqueAnnotations(root, l, new HashSet()); return (Annotation[])l.toArray(new Annotation[l.size()]); } private static void findUniqueAnnotations(Form root, List annotations, Set visitedDefs) { if(root.isFromDef()) { if(visitedDefs.contains(root.getDef().toString())) { return; } visitedDefs.add(root.getDef().toString()); } if(root.getAnnotation().hasExampleFromAnnotation()) { annotations.add(root.getAnnotation()); } if(root instanceof GenitorForm) { findUniqueAnnotations(((GenitorForm)root).getChild(), annotations, visitedDefs); } else if(root instanceof MultigenitorForm) { Form[] kids = ((MultigenitorForm)root).getChildren(); for(int i = 0; i < kids.length; i++) { findUniqueAnnotations(kids[i], annotations, visitedDefs); } } } private static void validate(Annotation[] anns, Form root, int start, int end) { Validator validator = new Validator(Validator.SOD_SCHEMA_LOC); int totalInserted = 0; int totalValid = 0; File file = new File("tempEx"); for(int i = start; i < end || i == anns.length - 1; i++) { try { ExampleBuilder eBuild = new ExampleBuilder(false); eBuild.setRequiredExample(anns[i]); eBuild.write(root); if(eBuild.isExampleInserted()) { totalInserted++; } String example = eBuild.toString(); FileWriter fw = new FileWriter(file); fw.write(example); fw.close(); InputSource in = new InputSource(new FileInputStream(file)); String[] examples = new String[] {anns[i].getExample(false), example}; if(!validator.validate(in, true)) { printExamples("NOT VALID", examples); } else { totalValid++; } file.delete(); } catch(Exception e) { e.printStackTrace(); } } int numAnns = end - start; System.out.println(getPercentage(numAnns, totalInserted) + "% inserted"); System.out.println(getPercentage(numAnns, totalValid) + "% valid"); } public static String getPercentage(double total, double actual) { if(actual == total) { return "" + 100; } double percentage = actual / total * 100; return new DecimalFormat("0.00").format(percentage); } public static void printExamples(String prefix, String[] examples) { StringBuffer buf = new StringBuffer(); buf.append(prefix + ": inserted example: \n"); for(int i = 0; i < examples.length; i++) { buf.append(insertLineNumbers(examples[i]) + "\n---------------\n"); } System.out.println(buf.toString()); } public static String insertLineNumbers(String input) { StringBuffer buf = new StringBuffer(); StringTokenizer tok = new StringTokenizer(input, "\n"); for(int i = 1; tok.hasMoreTokens(); i++) { buf.append(i + ": " + tok.nextToken() + '\n'); } return buf.toString(); } public static void main(String[] args) throws IOException, XMLStreamException { if(args.length >= 1) { validate(args[0]); } else { validate("sod.rng"); } } }