diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java index 6b10fe158ce780138f793f816621e183f13332d9..ba266597c9be09b4d40fd4390d700b356e8c8659 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:");