From 189f5cb83f016b2f0945d4d13ae205bdceb8c309 Mon Sep 17 00:00:00 2001
From: Andreas Romeyke <andreas.romeyke@slub-dresden.de>
Date: Mon, 20 Feb 2023 15:26:20 +0100
Subject: [PATCH] - use anonymous error handler class - refactoring, extracted
 checkIfWellformed() - refactoring, extracted validateAgainstSchema() - fix
 getErrors() - fixed main

---
 .../plugin/SLUBXmlFormatValidationPlugin.java | 114 ++++++++++++------
 1 file changed, 77 insertions(+), 37 deletions(-)

diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
index 6b10fe1..ba26659 100644
--- a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
+++ b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
@@ -19,7 +19,9 @@ package org.slub.rosetta.dps.repository.plugin;
 import com.exlibris.core.infra.common.exceptions.logging.ExLogger;
 import com.exlibris.dps.sdk.techmd.FormatValidationPlugin;
 import org.w3c.dom.Document;
+import org.xml.sax.ErrorHandler;
 import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
@@ -28,6 +30,7 @@ import javax.xml.parsers.ParserConfigurationException;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -50,7 +53,22 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
     private final List<String> errors = new ArrayList<>();
     private final List<String> details = new ArrayList<>();
     private ValidationCatalogResolver validationCatalogResolver = null;
-    private final ValidationErrorHandler validationErrorHandler = new ValidationErrorHandler();
+    private final ErrorHandler validationErrorHandler = new ErrorHandler() {
+        @Override
+        public void warning(SAXParseException e) {
+
+        }
+
+        @Override
+        public void error(SAXParseException e) {
+            errors.add( e.getMessage());
+        }
+
+        @Override
+        public void fatalError(SAXParseException e) {
+            errors.add( e.getMessage());
+        }
+    };
     public SLUBXmlFormatValidationPlugin () {
         dbf.setNamespaceAware(true);
         dbf.setValidating(false);
@@ -100,52 +118,64 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
     @Override
     public boolean validateFormat(String filePath) {
         try {
-            /* detect XML type via NS */
-            dbf.setFeature(XMLConstants.USE_CATALOG, true);
-            dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
-            DocumentBuilder db = dbf.newDocumentBuilder();
-            Document doc = db.parse(new File(filePath));
-            xmlInfoRecord info = getXMLinfo(doc);
-            reportDetail("detect XML type via NS:" + info.nameSpaceUri);
-            printXMLinfo(doc);
-            if (!info.xmlVersion.equals("1.0")) {
-                reportError("not an expected XML 1.0 document, found " + info.xmlVersion, filePath);
-                wellformed = false;
-                valid = false;
-                return false;
+            if (checkIfWellformed(filePath)) {
+                wellformed = true;
+                errors.clear();
+                valid = validateAgainstSchema(filePath);
             }
-            wellformed=true;
-            reportDetail("checked XML is wellformed");
-            /* TODO: validate against schema */
-            dbf.setFeature(XMLConstants.USE_CATALOG, true);
-            dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
-            dbf.setValidating(true);
-            DocumentBuilder dbValidate = dbf.newDocumentBuilder();
-            Document docValidate;
-            dbValidate.setEntityResolver(validationCatalogResolver);
-            dbValidate.setErrorHandler(validationErrorHandler);
-            reportDetail("align entitity resolver");
-            docValidate = dbValidate.parse(new File(filePath));
-            assert(dbValidate.isValidating());
-            var version = docValidate.getXmlVersion();
-            reportDetail("reparse using own catalog");
-            valid = true;
-            wellformed = true;
         } catch (ParserConfigurationException e) {
             reportError("ParserconfExc file=" + filePath + " Exc:" + e.getMessage());
         } catch (IOException e) {
             reportError("IOExc  file=" + filePath + " Exc:"+ e.getMessage());
         } catch (SAXException e) {
-            wellformed = false;
             reportError("not a XML file, "  + e.getMessage(), filePath);
             e.getStackTrace();
         }
         return valid;
     }
 
+    private boolean checkIfWellformed(String filePath) throws ParserConfigurationException, IOException, SAXException {
+        /* detect XML type via NS */
+        boolean isWellformedXml = false;
+        dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        Document doc = db.parse(new File(filePath));
+        xmlInfoRecord info = getXMLinfo(doc);
+        reportDetail("detect XML type via NS:" + info.nameSpaceUri);
+        //printXMLinfo(doc);
+        if (!info.xmlVersion.equals("1.0")) {
+            reportError("not an expected XML 1.0 document, found " + info.xmlVersion, filePath);
+        } else {
+            isWellformedXml = true;
+            reportDetail("checked XML is wellformed");
+        }
+        return isWellformedXml;
+    }
+
+    private boolean validateAgainstSchema(String filePath) throws ParserConfigurationException, SAXException, IOException {
+        boolean isValidXml = false;
+        dbf.setFeature(XMLConstants.USE_CATALOG, true);
+        dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+        dbf.setValidating(true);
+        DocumentBuilder dbValidate = dbf.newDocumentBuilder();
+        Document docValidate;
+        dbValidate.setEntityResolver(validationCatalogResolver);
+        dbValidate.setErrorHandler(validationErrorHandler);
+        reportDetail("align entitity resolver");
+        docValidate = dbValidate.parse(new File(filePath));
+        if (dbValidate.isValidating()) {
+            docValidate.getXmlVersion();
+            reportDetail("reparse using own catalog");
+            if (errors.isEmpty()) {
+                isValidXml = true;
+            }
+        }
+        return isValidXml;
+    }
+
     private void reportError(String msg) {
         errors.add(msg);
-        System.out.println(msg);
+//        System.out.println(msg);
         // TODO: log.warn(msg);
     }
     private void reportError(String msg, String filepath) {
@@ -154,7 +184,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
 
     private void reportDetail(String msg) {
         details.add(msg);
-        System.out.println(msg);
+//        System.out.println(msg);
     }
 
     @Override
@@ -164,7 +194,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
 
     @Override
     public boolean isValid() {
-        return false;
+        return valid;
     }
 
     @Override
@@ -174,7 +204,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
 
     @Override
     public List<String> getErrors() {
-        return null;
+        return Collections.unmodifiableList(errors);
     }
 
     @Override
@@ -191,7 +221,17 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         System.out.println("Agent: '" + plugin.getAgent() + "'");
         System.out.println();
         for (String file : args) {
-            System.out.println("Validation RESULT: " + plugin.isValid());
+            System.out.println("validation of file " + file);
+            plugin.validateFormat( file );
+            System.out.println("\tisValid: " + plugin.isValid());
+            System.out.println("\tgetValidationDetails: ");
+            System.out.println("\t..........");
+            System.out.println(plugin.getValidationDetails());
+            System.out.println("\t..........");
+            System.out.println("\tgetErrors : ");
+            System.out.println("\t..........");
+            System.out.println(plugin.getErrors());
+            System.out.println("\t..........");
         }
         System.out.println("----------------------------------");
         System.out.println("getAgent:");
-- 
GitLab