diff --git a/java/org/slub/rosetta/dps/repository/plugin/XmlFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/XmlFormatValidationPlugin.java index 05919d99174f0578cf43cf8f93d842444bac3e3e..8fe36c5a04c96fb87e3b4bc4f48977c9bccd6af5 100644 --- a/java/org/slub/rosetta/dps/repository/plugin/XmlFormatValidationPlugin.java +++ b/java/org/slub/rosetta/dps/repository/plugin/XmlFormatValidationPlugin.java @@ -43,6 +43,15 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + + /** * XmlFormatValidationPlugin * @@ -341,6 +350,15 @@ public class XmlFormatValidationPlugin implements FormatValidationPlugin { return result; } + private static void addFileOptionToMapOrFail(Map<String, String> initp, String key, String path) throws ParseException { + File file = new File(path); + if (file.isFile()) { + initp.put(key, path); + } else { + throw new ParseException("File '" + path + "' does not exist!"); + } + } + private boolean checkIfWellformed(Document doc) { /* detect XML type via NS */ boolean isWellformedXml = false; @@ -408,11 +426,72 @@ public class XmlFormatValidationPlugin implements FormatValidationPlugin { * @param args list of files which should be scanned */ public static void main(String[] args) { - var plugin = new XmlFormatValidationPlugin(); + // create the command line options + Options options = new Options(); + options.addOption(Option.builder("cd") + .longOpt("dtd-catalog") + .hasArg(true) + .argName("file") + .numberOfArgs(1) + .desc("path to DTD catalog file") + .required(false) + .build() + ); + options.addOption(Option.builder("cs") + .longOpt("schema-catalog") + .hasArg(true) + .argName("file") + .numberOfArgs(1) + .desc("path to schema catalog file") + .required(false) + .build() + ); + options.addOption(Option.builder("d") + .longOpt("debug") + .hasArg(false) + .desc("enable debug output") + .required(false) + .build() + ); + + // parse command line + CommandLineParser parser = new DefaultParser(); + CommandLine line = null; Map<String, String> initp = new HashMap<>(); - initp.put("catalog", "/etc/xml/catalog"); - initp.put("schemacatalog", "example_catalog/schema_catalog.xml"); - //initp.put("debug", "true"); + try { + line = parser.parse(options, args); + // DTD catalog + if (line.hasOption("cd")) { + addFileOptionToMapOrFail(initp, "catalog", line.getOptionValue("cd")); + } else { + addFileOptionToMapOrFail(initp, "catalog", "/etc/xml/catalog"); + } + // schema catalog + if (line.hasOption("cs")) { + addFileOptionToMapOrFail(initp, "schemacatalog", line.getOptionValue("cs")); + } else { + addFileOptionToMapOrFail(initp, "schemacatalog", "example_catalog/schema_catalog.xml"); + } + // debug log + if (line.hasOption("d")) { + initp.put("debug", "true"); + } + args = line.getArgs(); // retrieve any left-over non-recognized options and arguments + // no validation targets + if (args.length == 0) { + throw new ParseException("No file(s) given to validate!"); + } + } + catch (ParseException exp) { + System.out.println("\ninvalid usage: " + exp.getMessage()); + System.out.println("---"); + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( "XmlFormatValidationPlugin.jar [options] file [file ...]" , options ); + System.exit(1); + } + + // run format validation + var plugin = new XmlFormatValidationPlugin(); plugin.initParams(initp); // output result