From 4e97995c4569d30542b43c4ae500d7dc2141e6b0 Mon Sep 17 00:00:00 2001
From: Jens Steidl <Jens.Steidl@slub-dresden.de>
Date: Tue, 12 Dec 2023 18:19:42 +0100
Subject: [PATCH] - added cli options

---
 .../plugin/XmlFormatValidationPlugin.java     | 87 ++++++++++++++++++-
 1 file changed, 83 insertions(+), 4 deletions(-)

diff --git a/java/org/slub/rosetta/dps/repository/plugin/XmlFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/XmlFormatValidationPlugin.java
index 05919d9..8fe36c5 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
-- 
GitLab