itplr-kosit / validator

Validates XML documents with XML Schema and Schematron
Apache License 2.0
80 stars 42 forks source link

Kein Zugriff auf externes Schema aus jar #49

Closed VoidTenshi closed 4 years ago

VoidTenshi commented 4 years ago

Hallo zusammen,

ähnlich wie in Issue #45 verwende ich den Validator in einer andere Applikation. Jedoch basiert diese nicht auf Spring Boot, wie in Issue #45.

Dabei rufe ich die scenarios.xml wie folgt auf:

 // Load scenarios.xml from classpath
URL scenarios = this.getClass().getClassLoader().getResource("validator/scenarios.xml");
// Load the rest of the specific Validator configuration from classpath
 ConfigurationLoader config = Configuration.load(scenarios.toURI());
// Use the default validation procedure
 Check validator = new DefaultCheck(config.build());
 // Validate a single document
 Input document = InputFactory.read(Paths.get(inputXML));
 // Get Result including information about the whole validation
Result report = validator.checkInput(document);

Allerdings bekomme ich anschließend diese Fehlermeldung:

Caused by: org.xml.sax.SAXParseException: Externes Schemadokument "jar:file:/Testprogram/LIB/test.jar!/validator/resources/ubl/2.1/xsd/common/UBL-CommonAggregateComponents-2.1.xsd" konnte nicht gelesen werden, weil der Zugriff ("jar") nicht zulässig ist. at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLEntityManager$2.reportError(Unknown Source) at com.ibm.xml.jaxp.util.ExternalResourceHelper$ProtocolValidator.validate(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.resolveEntity(Unknown Source) at org.apache.xerces.impl.xs.XMLSchemaLoader.resolveDocument(Unknown Source) at org.apache.xerces.impl.xs.traversers.XSDHandler.resolveSchema(Unknown Source) at org.apache.xerces.impl.xs.traversers.XSDHandler.constructTrees(Unknown Source) at org.apache.xerces.impl.xs.traversers.XSDHandler.parseSchema(Unknown Source) at org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source) at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source) at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source) at org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source) at de.kosit.validationtool.impl.ContentRepository.createSchema(ContentRepository.java:77) ... 29 common frames omitted

apenski commented 4 years ago

Das liegt an der strikten Default-Konfiguration in Sachen XML-Security, siehe Security configuration. Möglich wäre die Nutzung einer anderen ResolvingConfigurationStrategy.

Eigentlich sollte die vorhandene Strategie "STRICT_LOCAL" XML-Daten aus einem lokalen JAR laden können. Diese kann folgendermaßen aktiviert werden

Configuration config = Configuration.load(scenarioFile).resolvingMode(ResolvingMode.STRICT_LOCAL).build();
...

Falls das nicht hilft, wäre ein Beispielprojekt nützlich. Kurzfristig würde dann nur eine eigene ResolvingConfigurationStrategy helfen.

apenski commented 4 years ago

Ich hab mal einen Test eingebaut, der Daten aus nem jar lädt. Siehe DefaultCheckTest.java. Das Laden funktioniert auch mit der Default-Strategy "STRICT_RELATIVE", weil jar-URIs auch mit file-access gleichgesetzt werden im JDK.

Grundsätzlich ist zu beachten: Laden aus einem jar ist nicht identisch mit dem Laden aus dem Classpath. Classpath-URIs sind nicht opaque, haben also keine Hierarchie. Beim relativen Resolving braucht es aber sowas, weshalb für jar-URIs da ein kleiner Hack eingebaut ist. Der funktioniert aber nur, solange die aufzulösenden Pfade alle im selben jar sind. Man kann das "Repository" also nicht über mehrere jars verstreuen.

@VoidTenshi Es funktioniert alse grundsätzlich. Ich werde das Ticket daher schließen. Sollte dennoch ein Problem in diesem Kontext bestehen, bräuchte ich ein Minimal-Beispiel im Stile des oben genannten Tests mit genauer Struktur des jars um das nachvollziehen zu können.