001 package com.thaiopensource.relaxng.util; 002 003 import com.oxygenxml.validate.nvdl.util.Log4jChecker; 004 import com.thaiopensource.util.OptionParser; 005 import com.thaiopensource.util.PropertyMapBuilder; 006 import com.thaiopensource.util.Version; 007 import com.thaiopensource.util.Localizer; 008 import com.thaiopensource.validate.Flag; 009 import com.thaiopensource.validate.Option; 010 import com.thaiopensource.validate.OptionArgumentException; 011 import com.thaiopensource.validate.SchemaReader; 012 import com.thaiopensource.validate.ValidateProperty; 013 import com.thaiopensource.validate.ValidationDriver; 014 import com.thaiopensource.validate.auto.AutoSchemaReader; 015 import com.thaiopensource.validate.rng.CompactSchemaReader; 016 import com.thaiopensource.validate.rng.RngProperty; 017 import com.thaiopensource.xml.sax.ErrorHandlerImpl; 018 import org.xml.sax.InputSource; 019 import org.xml.sax.SAXException; 020 021 import java.io.IOException; 022 023 public class Driver { 024 static private String usageKey = "usage"; 025 026 static public void setUsageKey(String key) { 027 usageKey = key; 028 } 029 030 static public void main(String[] args) { 031 System.exit(new Driver().doMain(args)); 032 } 033 034 private boolean timing = false; 035 private String encoding = null; 036 private Localizer localizer = new Localizer(Driver.class); 037 038 public int doMain(String[] args) { 039 Log4jChecker.checkLog4j(); 040 ErrorHandlerImpl eh = new ErrorHandlerImpl(System.out); 041 OptionParser op = new OptionParser("itcdfe:p:", args); 042 PropertyMapBuilder properties = new PropertyMapBuilder(); 043 ValidateProperty.ERROR_HANDLER.put(properties, eh); 044 RngProperty.CHECK_ID_IDREF.add(properties); 045 SchemaReader sr = null; 046 boolean compact = false; 047 048 try { 049 while (op.moveToNextOption()) { 050 switch (op.getOptionChar()) { 051 case 'i': 052 properties.put(RngProperty.CHECK_ID_IDREF, null); 053 break; 054 case 'c': 055 compact = true; 056 break; 057 case 'd': 058 { 059 if (sr == null) 060 sr = new AutoSchemaReader(); 061 Option option = sr.getOption(SchemaReader.BASE_URI + "diagnose"); 062 if (option == null) { 063 eh.print(localizer.message("no_schematron", op.getOptionCharString())); 064 return 2; 065 } 066 properties.put(option.getPropertyId(), Flag.PRESENT); 067 } 068 break; 069 case 't': 070 timing = true; 071 break; 072 case 'e': 073 encoding = op.getOptionArg(); 074 break; 075 case 'f': 076 RngProperty.FEASIBLE.add(properties); 077 break; 078 case 'p': 079 { 080 if (sr == null) 081 sr = new AutoSchemaReader(); 082 Option option = sr.getOption(SchemaReader.BASE_URI + "phase"); 083 if (option == null) { 084 eh.print(localizer.message("no_schematron", op.getOptionCharString())); 085 return 2; 086 } 087 try { 088 properties.put(option.getPropertyId(), option.valueOf(op.getOptionArg())); 089 } 090 catch (OptionArgumentException e) { 091 eh.print(localizer.message("invalid_phase", op.getOptionArg())); 092 return 2; 093 } 094 } 095 break; 096 } 097 } 098 } 099 catch (OptionParser.InvalidOptionException e) { 100 eh.print(localizer.message("invalid_option", op.getOptionCharString())); 101 return 2; 102 } 103 catch (OptionParser.MissingArgumentException e) { 104 eh.print(localizer.message("option_missing_argument",op.getOptionCharString())); 105 return 2; 106 } 107 if (compact) 108 sr = CompactSchemaReader.getInstance(); 109 args = op.getRemainingArgs(); 110 if (args.length < 1) { 111 eh.print(localizer.message(usageKey, Version.getVersion(Driver.class))); 112 return 2; 113 } 114 long startTime = System.currentTimeMillis(); 115 long loadedPatternTime = -1; 116 boolean hadError = false; 117 try { 118 ValidationDriver driver = new ValidationDriver(properties.toPropertyMap(), sr); 119 InputSource in = ValidationDriver.uriOrFileInputSource(args[0]); 120 if (encoding != null) 121 in.setEncoding(encoding); 122 if (driver.loadSchema(in)) { 123 loadedPatternTime = System.currentTimeMillis(); 124 for (int i = 1; i < args.length; i++) { 125 if (!driver.validate(ValidationDriver.uriOrFileInputSource(args[i]))) 126 hadError = true; 127 } 128 } 129 else 130 hadError = true; 131 } 132 catch (SAXException e) { 133 hadError = true; 134 eh.printException(e); 135 } 136 catch (IOException e) { 137 hadError = true; 138 eh.printException(e); 139 } 140 if (timing) { 141 long endTime = System.currentTimeMillis(); 142 if (loadedPatternTime < 0) 143 loadedPatternTime = endTime; 144 eh.print(localizer.message("elapsed_time", 145 new Object[] { 146 new Long(loadedPatternTime - startTime), 147 new Long(endTime - loadedPatternTime), 148 new Long(endTime - startTime) 149 })); 150 } 151 if (hadError) 152 return 1; 153 return 0; 154 } 155 156 }