diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java index 9f037c014a67db763acd76d9ddc67e583558b8dd..819906330a715b5aa9e62afebcf793ebd3b7138a 100644 --- a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java +++ b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -62,6 +63,8 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { private static final Set<ValidationSchema> namespaceSchemaMap = new HashSet<>(); private ValidationCatalogResolver validationCatalogResolver; /* for DTDs */ private ValidationResourceResolver validationResourceResolver; /* for schema/relaxNG/... */ + + private SLUBXmlErrorHandler validationErrorHandler; public Set<ValidationSchema> getNamespaceSchemaMap() { return namespaceSchemaMap; } @@ -91,7 +94,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { } } } catch (ParserConfigurationException | SAXException | IOException | URISyntaxException e) { - System.out.println(" ERROR in loadnamespaceSchemaMap " + e.getStackTrace() ); + System.out.println(" ERROR in loadnamespaceSchemaMap " + Arrays.toString(e.getStackTrace())); log.error("parsing expection parsing namespace schema map file " + namespaceSchemaMapFile + " ," + e.getMessage()); } } @@ -114,7 +117,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { uri = new URI(sUri); } else { uri = remapUri(namespaceSchemaMapFile, sUri); - if (debug) System.out.println( "================ URI: " + uri); + if (debug) System.out.println( "SCHEMACATALOG, remap to URI: " + uri); } ValidationSchema v = new ValidationSchema(namespace, schematype, uri); namespaceSchemaMap.add(v); @@ -124,9 +127,6 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { private URI remapUri(String namespaceSchemaMapFile, String sUri) throws URISyntaxException { URI partUri = new URI(sUri); String baseStr = "file://" + new File(namespaceSchemaMapFile).getAbsoluteFile().getParent() + "/"; - if (debug) { - System.out.println("BASE =" + baseStr); - } URI baseUri = new URI( baseStr); return baseUri.resolve(partUri); } @@ -137,8 +137,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { assert ("namespace".equals(attr_strings.get(1))); assert ("schemauri".equals(attr_strings.get(2))); NamedNodeMap attributes = node.getAttributes(); - List<String> attr_list = attr_strings.stream().map(s -> attributes.getNamedItem(s).getTextContent()).toList(); - return attr_list; + return attr_strings.stream().map(s -> attributes.getNamedItem(s).getTextContent()).toList(); } private static boolean checkAttributesOfNamespaceSchemaMapFile(String attr_type) { @@ -149,6 +148,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { dbf.setNamespaceAware(true); dbf.setValidating(false); dbf.setExpandEntityReferences(false); + validationErrorHandler = new SLUBXmlErrorHandler(); } /** init params to configure the plugin via xml forms @@ -165,7 +165,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { }; validationCatalogResolver = new ValidationCatalogResolver(catalogs, errors, debug); loadNamespaceSchemaMap( initp.get("schemacatalog").trim() ); - validationResourceResolver = new ValidationResourceResolver(namespaceSchemaMap, errors, debug); + validationResourceResolver = new ValidationResourceResolver(namespaceSchemaMap, debug); } private XmlInfoRecord getXMLinfo(Document doc) { @@ -269,6 +269,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { //System.out.println("## is wellformed"); wellformed = true; errors.clear(); + validationErrorHandler = new SLUBXmlErrorHandler(); // reset errorhandler Optional<ValidationSchema> optSchema = assignSchema(doc); //System.out.println("## schema assigned..."); if (optSchema.isEmpty()) { @@ -308,14 +309,16 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { for (int i=0; i<childNodes.getLength(); i++) { var child = childNodes.item(i); var child_ns = child.getNamespaceURI(); - if (child_ns != null && child_ns != root_ns) { - System.out.println( "root ns = " + root_ns + " child ns = " + child_ns); + if (child_ns != null && !child_ns.equals(root_ns)) { + if (debug) { + System.out.println("RECURSIVE SCHEMA VALIDATOR: root ns = " + root_ns + " child ns = " + child_ns); + } var res = validationResourceResolver.find_by_ns( child_ns); if (res.isEmpty()) { this.valid=false; - throw new SAXException("No entry for child namespace found: " + child_ns); + throw new SAXException("RECURSIVE SCHEMA VALIDATOR: No entry for child namespace found: " + child_ns); } else { - assert(! res.get().schemaType.equals("dtd")); + assert(res.get().schemaType == ValidationSchemaType.schema); var schema = res.get(); validateFormatAgainstSchemaRecursively(childNodes.item(i), schema); } @@ -330,18 +333,12 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { var schemaType = validationSchema.schemaType; if (schemaType == ValidationSchemaType.schema) { SLUBValidateSchema validator = new SLUBValidateSchema( validationResourceResolver ); - // Slect validation roots from DOM - + // Select validation roots from DOM check_ns_of_childs(root); - valid = validator.validateAgainst(root, validationSchema.schemaURI); - /* - valid = validator.validateAgainst(doc, validationSchema.schemaURI); - */ - errors.addAll( validator.get_errors() ); } else { - reportError("unsupported schema uri="+ validationSchema.schemaURI + " of type: " + validationSchema.schemaType); + reportError("RECURSIVE SCHEMA VALIDATOR: unsupported schema uri="+ validationSchema.schemaURI + " of type: " + validationSchema.schemaType); valid = false; } } @@ -352,18 +349,16 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { var schemaType = validationSchema.schemaType; Document doc = getDocument(filePath); if (schemaType == ValidationSchemaType.dtd) { - SLUBValidateDTD validator = new SLUBValidateDTD( validationCatalogResolver ); + SLUBValidateDTD validator = new SLUBValidateDTD( validationCatalogResolver, validationErrorHandler ); valid = validator.validateAgainst(filePath); - errors.addAll( validator.get_errors() ); } else if (schemaType == ValidationSchemaType.relaxng) { SLUBValidateRelaxNG validator = new SLUBValidateRelaxNG( ); valid = validator.validateAgainst(doc, validationSchema.schemaURI); - errors.addAll( validator.get_errors() ); + } else if (schemaType == ValidationSchemaType.schematron) { SLUBValidateSchematron validator = new SLUBValidateSchematron( ); valid = validator.validateAgainst(doc, validationSchema.schemaURI); - errors.addAll( validator.get_errors() ); reportError("unsupported schematron schema uri="+ validationSchema.schemaURI + " of type: " + validationSchema.schemaType); valid = false; /* */ @@ -413,12 +408,13 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { dbf.setSchema(null); //dbf.setXIncludeAware(true); dbf.setNamespaceAware(true); - DocumentBuilder db = dbf.newDocumentBuilder(); + + db.setErrorHandler( validationErrorHandler ); //db.setEntityResolver(validationCatalogResolver); - //db.setErrorHandler(validationErrorHandler); + if (debug) System.out.println( - "# ns aware=" + db.isNamespaceAware() + "DOCUMENT LOADER: ns aware=" + db.isNamespaceAware() + " include aware=" + db.isXIncludeAware() + " is validating=" + db.isValidating() ); diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java index 49d5f97f3b71de1f7eca205f65a22a08bb39c98d..3ed47bdb42874ce9bea97f136cf2d422942dc904 100644 --- a/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java +++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java @@ -26,12 +26,12 @@ public class ValidationCatalogResolver implements CatalogResolver { @Override public InputSource resolveEntity(String publicId, String systemId) { if (debug) { - System.out.println("======"); - System.out.println("resolveEntity publicId=" + publicId + " systemId=" + systemId); - System.out.println("catalogs:" + Arrays.stream(catalogs).toList()); + System.out.println("CATALOG RESOLVER: ======"); + System.out.println("CATALOG RESOLVER: resolveEntity publicId=" + publicId + " systemId=" + systemId); + System.out.println("CATALOG RESOLVER: catalogs:" + Arrays.stream(catalogs).toList()); } if (catalogs.length == 0) { - System.out.println("No catalog given!"); + System.out.println("CATALOG RESOLVER: No catalog given!"); errors.add("No catalog given!"); return new InputSource(Reader.nullReader() ); // disabled further catalog checking to enable whitelist behaviour, see https://docs.oracle.com/en/java/javase/17/docs/api/java.xml/javax/xml/catalog/CatalogResolver.html } @@ -42,13 +42,13 @@ public class ValidationCatalogResolver implements CatalogResolver { cr.setCatalogList(catalogs); cr.setUseLiteralSystemId(true); // TODO: Prüfen, ob wenn auf false, sytemid analog zu dem in Datei aussieht (file:/// statt file:/) if (debug) { - System.out.println("try to resolve for publicId=" + publicId + ", systemId=" + systemId + ", "); + System.out.println("CATALOG RESOLVER: try to resolve for publicId=" + publicId + ", systemId=" + systemId + ", "); } result = cr.resolveEntity(publicId, systemId); } catch (IOException | CatalogException | SAXException e) { if (debug) { - System.out.println("No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage()); + System.out.println("CATALOG RESOLVER: No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage()); } errors.add("No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage()); return new InputSource(Reader.nullReader() ); // disabled further catalog checking to enable whitelist behaviour, see https://docs.oracle.com/en/java/javase/17/docs/api/java.xml/javax/xml/catalog/CatalogResolver.html @@ -61,7 +61,7 @@ public class ValidationCatalogResolver implements CatalogResolver { return new InputSource(Reader.nullReader() ); // disabled further catalog checking to enable whitelist behaviour, see https://docs.oracle.com/en/java/javase/17/docs/api/java.xml/javax/xml/catalog/CatalogResolver.html } else { if (debug) { - System.out.println(" ---> result: systemid=" + result.getSystemId() + " publicid=" + result.getPublicId() ); + System.out.println("CATALOG RESOLVER: ---> result: systemid=" + result.getSystemId() + " publicid=" + result.getPublicId() ); } } return result; @@ -70,8 +70,8 @@ public class ValidationCatalogResolver implements CatalogResolver { @Override public Source resolve(String href, String base) { if (debug) { - System.out.println("======"); - System.out.println("resolve href=" + href + " base=" + base); + System.out.println("CATALOG RESOLVER: ======"); + System.out.println("CATALOG RESOLVER: resolve href=" + href + " base=" + base); } return null; } @@ -79,8 +79,8 @@ public class ValidationCatalogResolver implements CatalogResolver { @Override public InputStream resolveEntity(String publicId, String systemId, String baseUri, String nameSpace) { if (debug) { - System.out.println("======"); - System.out.println("resolveEntity2 publicId=" + publicId + " systemId=" + systemId); + System.out.println("CATALOG RESOLVER: ======"); + System.out.println("CATALOG RESOLVER: resolveEntity2 publicId=" + publicId + " systemId=" + systemId); } return null; } @@ -88,8 +88,8 @@ public class ValidationCatalogResolver implements CatalogResolver { @Override public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseUri) { if (debug) { - System.out.println("======"); - System.out.println("resolveResource publicId=" + publicId + " systemId=" + systemId); + System.out.println("CATALOG RESOLVER: ======"); + System.out.println("CATALOG RESOLVER: resolveResource publicId=" + publicId + " systemId=" + systemId); } return null; } diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java index 20ba65fe6f09853353003db995ce70b4c549c17c..ca111f9f5507c9098032ed6568e8c3b4bb418899 100644 --- a/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java +++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java @@ -4,18 +4,15 @@ import org.apache.xerces.dom.DOMInputImpl; import org.w3c.dom.ls.LSInput; import org.w3c.dom.ls.LSResourceResolver; -import java.util.List; import java.util.Optional; import java.util.Set; public class ValidationResourceResolver implements LSResourceResolver { - private Set<ValidationSchema> namespaceSchemaMap ; - private List<String> errors; - private boolean debug; + private final Set<ValidationSchema> namespaceSchemaMap ; + private final boolean debug; - public ValidationResourceResolver(Set<ValidationSchema> namespaceSchemaMap, List<String> errors, boolean debug) { + public ValidationResourceResolver(Set<ValidationSchema> namespaceSchemaMap, boolean debug) { this.namespaceSchemaMap = namespaceSchemaMap; - this.errors = errors; this.debug = debug; } @@ -29,7 +26,7 @@ public class ValidationResourceResolver implements LSResourceResolver { public Optional<ValidationSchema> find_by_systemid(String SystemId) { return namespaceSchemaMap.stream() .filter( - entry -> (entry.schemaURI.equals(SystemId)) + entry -> (entry.schemaURI.toString().equals(SystemId)) ) .findAny(); } @@ -38,7 +35,8 @@ public class ValidationResourceResolver implements LSResourceResolver { public LSInput resolveResource(String type, String nameSpaceUri, String publicId, String systemId, String baseURI) { if (debug) { System.out.println( - "RESOURCE_RESOLVER: type=" + type + "RESOURCE_RESOLVER:" + // + type=" + type + " namespaceuri=" + nameSpaceUri + " publicId=" + publicId + " SystemId=" + systemId @@ -46,22 +44,21 @@ public class ValidationResourceResolver implements LSResourceResolver { ); } if (namespaceSchemaMap.isEmpty()) { - System.out.println("No schemacatalog given!"); - errors.add("No schemacatalog given!"); + System.out.println("RESOURCE_RESOLVER: No schemacatalog given!"); + return new DOMInputImpl(null, null, null); // disabled } - LSInput result; /* TODO: check if uri in namespaceSchemaMap */ Optional<ValidationSchema> validationSchemaOptional = find_by_ns(nameSpaceUri); if (validationSchemaOptional.isEmpty()) { // not found if (debug) { - System.out.println("--> No entry in schemacatalog found for "+ nameSpaceUri + "!"); + System.out.println("RESOURCE_RESOLVER: --> No entry in schemacatalog found for "+ nameSpaceUri + "!"); } return new DOMInputImpl(null, null, null); // disabled } DOMInputImpl domInput = new DOMInputImpl(); if (debug) { - System.out.println("--> Found entry in schemacatalog for " + nameSpaceUri + ", mapping to " + validationSchemaOptional.get().schemaURI + " !"); + System.out.println("RESOURCE_RESOLVER: --> Found entry in schemacatalog for " + nameSpaceUri + ", mapping to " + validationSchemaOptional.get().schemaURI + " !"); } domInput.setSystemId( validationSchemaOptional.get().schemaURI.toString()); return domInput;