diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java index b1c70d37240bc34a30a0b29e8a3dab8b13b5b396..f528129dad0a0f61957fa9ab4b72bf40c92a8f02 100644 --- a/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java +++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java @@ -19,16 +19,22 @@ import org.apache.xerces.dom.DOMInputImpl; import org.w3c.dom.ls.LSInput; import org.w3c.dom.ls.LSResourceResolver; +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Optional; import java.util.Set; public class ValidationResourceResolver implements LSResourceResolver { private final Set<ValidationSchema> namespaceSchemaMap ; - private final boolean debug; + private final ValidationResultHandle resultHandle; - public ValidationResourceResolver(Set<ValidationSchema> namespaceSchemaMap, boolean debug) { + + public ValidationResourceResolver(Set<ValidationSchema> namespaceSchemaMap, ValidationResultHandle resultHandle) { this.namespaceSchemaMap = namespaceSchemaMap; - this.debug = debug; + this.resultHandle = resultHandle; } public Optional<ValidationSchema> find_by_ns(String nameSpaceUri) { @@ -46,36 +52,89 @@ public class ValidationResourceResolver implements LSResourceResolver { .findAny(); } + private boolean checkUriStringIsLocal ( String s) { + try { + var uri = new URI(s); + return checkUriIsLocal(uri); + } + catch (Exception e ) { + return false; + } + } + private boolean checkUriIsLocal (URI uri) { + if (!uri.isAbsolute()) { return true; } + try { + return !uri.toURL().getProtocol().startsWith("http"); + } catch (Exception e) { + return false; + } + } + + private Path createCombinedSchemaFile (String systemId, String baseURIString ) { + Path basenameSystemID = Paths.get(systemId).getFileName(); + Path dirnameSchema = null; + try { + dirnameSchema = Paths.get(new URI(baseURIString).getPath()).getParent().toAbsolutePath(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); // should not occure + } + //combine together + Path combinedSchema = dirnameSchema.resolve(basenameSystemID); + //System.out.println( "COMBINED: " + combinedSchema.toString()); + return combinedSchema; + } @Override - public LSInput resolveResource(String type, String nameSpaceUri, String publicId, String systemId, String baseURI) { - if (debug) { - System.out.println( + public LSInput resolveResource(String type, String nameSpace, String publicId, String systemId, String baseURIString) { + resultHandle.debug( "RESOURCE_RESOLVER:" - // + type=" + type - + " namespaceuri=" + nameSpaceUri - + " publicId=" + publicId - + " SystemId=" + systemId - + " baseURI=" + baseURI - ); - } + // + type=" + type + + " namespace=" + nameSpace + + " publicId=" + publicId + + " SystemId=" + systemId + + " baseURI=" + baseURIString + ); if (namespaceSchemaMap.isEmpty()) { - System.out.println("RESOURCE_RESOLVER: No schemacatalog given!"); - + resultHandle.warning("RESOURCE_RESOLVER: No schemacatalog given!"); return new DOMInputImpl(null, null, null); // disabled } /* TODO: check if uri in namespaceSchemaMap */ - Optional<ValidationSchema> validationSchemaOptional = find_by_ns(nameSpaceUri); + Optional<ValidationSchema> validationSchemaOptional = find_by_ns(nameSpace); if (validationSchemaOptional.isEmpty()) { // not found - if (debug) { - System.out.println("RESOURCE_RESOLVER: --> No entry in schemacatalog found for "+ nameSpaceUri + "!"); - } + resultHandle.info("RESOURCE_RESOLVER: --> No entry in schemacatalog found for " + nameSpace + "!"); return new DOMInputImpl(null, null, null); // disabled } DOMInputImpl domInput = new DOMInputImpl(); - if (debug) { - System.out.println("RESOURCE_RESOLVER: --> Found entry in schemacatalog for " + nameSpaceUri + ", mapping to " + validationSchemaOptional.get().schemaURI + " !"); + resultHandle.debug("RESOURCE_RESOLVER: --> Found entry in schemacatalog for " + nameSpace); + /* if schemauri is local AND basename(SystemID) in dirname(schemaURI) exists + than map to this. This is needed because + a) METS by Library of congress uses own xlink implementatuin + b) MATHML3 uses includes of XSD to same namespaces + */ + URI schemaURI = validationSchemaOptional.get().schemaURI; + System.out.println("### BASEURI: " + baseURIString + " -> " + checkUriStringIsLocal( baseURIString )); + System.out.println("### SchemaURI: " + schemaURI + " -> " + checkUriIsLocal( schemaURI) ); + + if (checkUriStringIsLocal(baseURIString)) { + if (checkUriIsLocal(schemaURI)) { + Path basenameSystemID = Paths.get(systemId).getFileName(); + Path dirnameSchema = null; + try { + dirnameSchema = Paths.get(new URI(baseURIString).getPath()).getParent().toAbsolutePath(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); // should not occure + } + //combine together + Path combinedSchema = createCombinedSchemaFile(systemId, baseURIString); + String combinedSchemaStr = combinedSchema.toString(); + File combinedSchemaFile = new File( combinedSchemaStr ); + if (combinedSchemaFile.isFile()) { + resultHandle.info("RESOURCE_RESOLVER: ignoring catalog, using a combined mapping to " + schemaURI + " !"); + schemaURI = combinedSchema.toUri(); + } + } } - domInput.setSystemId( validationSchemaOptional.get().schemaURI.toString()); + resultHandle.info("RESOURCE_RESOLVER: mapping to " + schemaURI + " !"); + domInput.setSystemId(schemaURI.toString()); return domInput; } }