From 99930a2b0ad6f9154ac00b79ae1421e9de4c0ddd Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Tue, 7 May 2019 08:46:24 +0200 Subject: [PATCH 01/25] (wip) Umsetzung OHNE Nutzung eines java.nio.Filesystem --- .../impl/ClassPathResourceResolver.java | 78 +++++++++++-------- .../impl/ContentRepository.java | 74 ++++++++++++------ .../impl/RelativeUriResolver.java | 36 +++++---- .../impl/ScenarioRepository.java | 44 ++++++----- .../impl/ContentRepositoryTest.java | 76 +++++++++++------- .../impl/ConversionServiceTest.java | 37 ++++----- .../validationtool/impl/DefaultCheckTest.java | 12 +-- .../impl/DocumentParserTest.java | 21 +++-- .../de/kosit/validationtool/impl/Helper.java | 12 +-- .../impl/RelativeUriResolverTest.java | 29 +++++-- .../impl/ScenarioRepositoryTest.java | 43 ++++++---- .../validationtool/impl/VersioningTest.java | 17 ++-- src/test/resources/simple/main.xsd | 12 +++ .../resources/simple/resources/reference.xsd | 9 +++ 14 files changed, 312 insertions(+), 188 deletions(-) create mode 100644 src/test/resources/simple/main.xsd create mode 100644 src/test/resources/simple/resources/reference.xsd diff --git a/src/main/java/de/kosit/validationtool/impl/ClassPathResourceResolver.java b/src/main/java/de/kosit/validationtool/impl/ClassPathResourceResolver.java index 1b53fe1..50d96d6 100644 --- a/src/main/java/de/kosit/validationtool/impl/ClassPathResourceResolver.java +++ b/src/main/java/de/kosit/validationtool/impl/ClassPathResourceResolver.java @@ -42,38 +42,6 @@ import lombok.extern.slf4j.Slf4j; @Slf4j class ClassPathResourceResolver implements LSResourceResolver { - private final URI base; - - /** - * Instantiiert einen neuen resolver mit angegebenen Basispfad - * - * @param basePath der Basispfad - */ - public ClassPathResourceResolver(String basePath) { - if (!StringUtils.startsWith(basePath, "/")) { - throw new IllegalArgumentException("Base path must start with a slash"); - } - base = URI.create(basePath + (basePath.endsWith("/") == basePath.length() > 1 ? "" : "/")); - } - - @Override - public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { - final URL resource = ClassPathResourceResolver.class.getResource(base.resolve(systemId).toASCIIString()); - if (resource != null) { - try { - InputStream in = resource.openStream(); - final LSInputImpl input = new LSInputImpl(publicId, systemId, baseURI); - input.setByteStream(in); - return input; - - } catch (IOException e) { - log.error("Error loading schema resource from {}", resource, e); - } - } - // not found - return null; - } - /** * Simple {@link LSInput}-Implementierung, die einen Stream liefern kann */ @@ -100,11 +68,12 @@ class ClassPathResourceResolver implements LSResourceResolver { /** * Instantiierung einer neue Instanz. + * * @param publicId die publicId * @param systemId die systemId * @param baseURI die baseURI */ - public LSInputImpl(String publicId, String systemId, String baseURI) { + public LSInputImpl(final String publicId, final String systemId, final String baseURI) { this.publicId = publicId; this.systemId = systemId; this.baseURI = baseURI; @@ -112,7 +81,48 @@ class ClassPathResourceResolver implements LSResourceResolver { @Override public boolean getCertifiedText() { - return certifiedText; + return this.certifiedText; } } + + private final URI base; + + /** + * Instantiiert einen neuen resolver mit angegebenen Basispfad + * + * @param basePath der Basispfad + */ + public ClassPathResourceResolver(final String basePath) { + if (!StringUtils.startsWith(basePath, "/")) { + throw new IllegalArgumentException("Base path must start with a slash"); + } + this.base = URI.create(basePath + (basePath.endsWith("/") == basePath.length() > 1 ? "" : "/")); + } + + public ClassPathResourceResolver(final URI jarUri) { + this.base = jarUri; + } + + @Override + public LSInput resolveResource(final String type, final String namespaceURI, final String publicId, final String systemId, + final String baseURI) { + + final URI resolved = RelativeUriResolver.resolve(URI.create(systemId), this.base); + if (resolved != null) { + try { + final URL resource = resolved.isAbsolute() ? resolved.toURL() + : ClassPathResourceResolver.class.getResource(resolved.toASCIIString()); + final InputStream in = resource.openStream(); + final LSInputImpl input = new LSInputImpl(publicId, systemId, resolved.toASCIIString()); + input.setByteStream(in); + return input; + + } catch (final IOException e) { + log.error("Error loading schema resource from {}", resolved, e); + } + } + // not found + return null; + } + } diff --git a/src/main/java/de/kosit/validationtool/impl/ContentRepository.java b/src/main/java/de/kosit/validationtool/impl/ContentRepository.java index d2a7be6..e8d5b2f 100644 --- a/src/main/java/de/kosit/validationtool/impl/ContentRepository.java +++ b/src/main/java/de/kosit/validationtool/impl/ContentRepository.java @@ -39,7 +39,12 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import net.sf.saxon.s9api.*; +import net.sf.saxon.s9api.Processor; +import net.sf.saxon.s9api.SaxonApiException; +import net.sf.saxon.s9api.XPathCompiler; +import net.sf.saxon.s9api.XPathExecutable; +import net.sf.saxon.s9api.XsltCompiler; +import net.sf.saxon.s9api.XsltExecutable; /** * Repository für verschiedene XML Artefakte zur Vearbeitung der Prüfszenarien. @@ -57,25 +62,25 @@ public class ContentRepository { private Schema reportInputSchema; - private static Source resolve(URL resource) { + private static Source resolve(final URL resource) { try { return new StreamSource(resource.openStream(), resource.toURI().getRawPath()); - } catch (IOException | URISyntaxException e) { + } catch (final IOException | URISyntaxException e) { throw new IllegalStateException("Can not load schema for resource " + resource.getPath(), e); } } - private static Schema createSchema(Source[] schemaSources, LSResourceResolver resourceResolver) { + private static Schema createSchema(final Source[] schemaSources, final LSResourceResolver resourceResolver) { try { - SchemaFactory sf = ObjectFactory.createSchemaFactory(); + final SchemaFactory sf = ObjectFactory.createSchemaFactory(); sf.setResourceResolver(resourceResolver); return sf.newSchema(schemaSources); - } catch (SAXException e) { + } catch (final SAXException e) { throw new IllegalArgumentException("Can not load schema from sources " + schemaSources[0].getSystemId(), e); } } - private static Schema createSchema(Source[] schemaSources) { + private static Schema createSchema(final Source[] schemaSources) { return createSchema(schemaSources, null); } @@ -85,16 +90,16 @@ public class ContentRepository { * @param uri die URI der XSL Definition * @return ein XSLT Executable */ - public XsltExecutable loadXsltScript(URI uri) { + public XsltExecutable loadXsltScript(final URI uri) { log.info("Loading XSLT script from {}", uri); final XsltCompiler xsltCompiler = getProcessor().newXsltCompiler(); final CollectingErrorEventHandler listener = new CollectingErrorEventHandler(); try { xsltCompiler.setErrorListener(listener); - xsltCompiler.setURIResolver(new RelativeUriResolver(repository)); + xsltCompiler.setURIResolver(new RelativeUriResolver(this.repository)); return xsltCompiler.compile(resolve(uri)); - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { listener.getErrors().forEach(event -> event.log(log)); throw new IllegalStateException("Can not compile xslt executable for uri " + uri, e); } finally { @@ -111,9 +116,13 @@ public class ContentRepository { * @param url die url * @return das erzeugte Schema */ - public Schema createSchema(URL url) { + public static Schema createSchema(final URL url) { + return createSchema(url, null); + } + + public static Schema createSchema(final URL url, final LSResourceResolver resourceResolver) { log.info("Load schema from source {}", url.getPath()); - return createSchema(new Source[] { resolve(url) }); + return createSchema(new Source[] { resolve(url) }, resourceResolver); } /** @@ -121,7 +130,7 @@ public class ContentRepository { * * @return Scenario-Schema */ - public Schema getScenarioSchema() { + public static Schema getScenarioSchema() { return createSchema(ContentRepository.class.getResource("/xsd/scenarios.xsd")); } @@ -131,11 +140,11 @@ public class ContentRepository { * @return ReportInput-Schema */ public Schema getReportInputSchema() { - if (reportInputSchema == null) { + if (this.reportInputSchema == null) { final Source source = resolve(ContentRepository.class.getResource("/xsd/createReportInput.xsd")); - reportInputSchema = createSchema(new Source[] { source }, new ClassPathResourceResolver("/xsd")); + this.reportInputSchema = createSchema(new Source[] { source }, new ClassPathResourceResolver("/xsd")); } - return reportInputSchema; + return this.reportInputSchema; } /** @@ -144,12 +153,13 @@ public class ContentRepository { * @param uris die uris in String-Repräsentation * @return das Schema */ - public Schema createSchema(Collection uris) { + public Schema createSchema(final Collection uris) { return createSchema(uris.stream().map(s -> resolve(URI.create(s))).toArray(Source[]::new)); } - private Source resolve(URI source) { - return new StreamSource(repository.resolve(source).toASCIIString()); + private Source resolve(final URI source) { + final URI resolved = RelativeUriResolver.resolve(source, this.repository); + return new StreamSource(resolved.toASCIIString()); } /** @@ -159,17 +169,37 @@ public class ContentRepository { * @param namespaces optionale Namespace-Mappings * @return ein kompiliertes Executable */ - public XPathExecutable createXPath(String expression, Map namespaces) { + public XPathExecutable createXPath(final String expression, final Map namespaces) { try { final XPathCompiler compiler = getProcessor().newXPathCompiler(); if (namespaces != null) { - namespaces.entrySet().forEach(n -> compiler.declareNamespace(n.getKey(), n.getValue())); + namespaces.forEach(compiler::declareNamespace); } return compiler.compile(expression); - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { throw new IllegalStateException(String.format("Can not compile xpath match expression '%s'", StringUtils.isNotBlank(expression) ? expression : "EMPTY EXPRESSION"), e); } } + /** + * Zeigt an, ob diese URI in ein JAR zeigt. + * + * @param uri der URI + * @return true wenn innerhalb eines JARs + */ + public static boolean isJarResource(final URI uri) { + return isJarResource(uri.toString()); + } + + /** + * Zeigt an, ob dieser Pfad in ein JAR zeigt. + * + * @param path der Pfad (URI-Format) + * @return true wenn innerhalb eines JARs + */ + public static boolean isJarResource(final String path) { + return StringUtils.startsWithIgnoreCase(path, "jar:") && path.split("!").length == 2; + } + } diff --git a/src/main/java/de/kosit/validationtool/impl/RelativeUriResolver.java b/src/main/java/de/kosit/validationtool/impl/RelativeUriResolver.java index 0ff80fd..89880fb 100644 --- a/src/main/java/de/kosit/validationtool/impl/RelativeUriResolver.java +++ b/src/main/java/de/kosit/validationtool/impl/RelativeUriResolver.java @@ -25,7 +25,6 @@ import java.io.Reader; import java.net.URI; import javax.xml.transform.Source; -import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; import javax.xml.transform.stream.StreamSource; @@ -48,38 +47,49 @@ public class RelativeUriResolver implements URIResolver, UnparsedTextURIResolver private final URI baseUri; @Override - public Source resolve(final String href, final String base) throws TransformerException { - final URI resolved = URI.create(base).resolve(href); + public Source resolve(final String href, final String base) { + final URI resolved = resolve(URI.create(href), URI.create(base)); if (isUnderBaseUri(resolved)) { try { - return new StreamSource(resolved.toURL().openStream()); + return new StreamSource(resolved.toURL().openStream(), resolved.toASCIIString()); } catch (final IOException e) { throw new IllegalStateException(String.format("Can not resolve required %s", href), e); } } else { - throw new IllegalStateException( - String.format("The resolved transformation artifact %s is not within the configured repository %s", resolved, baseUri)); + throw new IllegalStateException(String + .format("The resolved transformation artifact %s is not within the configured repository %s", resolved, this.baseUri)); } } - private boolean isUnderBaseUri(URI resolved) { - String base = baseUri.toASCIIString().replaceAll("file:/+", ""); - String r = resolved.toASCIIString().replaceAll("file:/+", ""); + static URI resolve(final URI href, final URI base) { + final boolean jarURI = isJarURI(base); + final URI tmpBase = jarURI ? URI.create(base.toASCIIString().substring(4)) : base; + final URI result = tmpBase.resolve(href); + return jarURI ? URI.create("jar:" + result.toString()) : result; + } + + static boolean isJarURI(final URI uri) { + return uri.isOpaque() && uri.getScheme().equals("jar"); + } + + private boolean isUnderBaseUri(final URI resolved) { + final String base = this.baseUri.toASCIIString().replaceAll("file:/+", ""); + final String r = resolved.toASCIIString().replaceAll("file:/+", ""); return r.startsWith(base); } @Override - public Reader resolve(URI absoluteURI, String encoding, Configuration config) throws XPathException { + public Reader resolve(final URI absoluteURI, final String encoding, final Configuration config) throws XPathException { if (isUnderBaseUri(absoluteURI)) { try { return new InputStreamReader(absoluteURI.toURL().openStream(), encoding); - } catch (IOException e) { + } catch (final IOException e) { throw new IllegalStateException(String.format("Can not resolve required %s", absoluteURI), e); } } else { - throw new IllegalStateException( - String.format("The resolved transformation artifact %s is not within the configured repository %s", absoluteURI, baseUri)); + throw new IllegalStateException(String.format( + "The resolved transformation artifact %s is not within the configured repository %s", absoluteURI, this.baseUri)); } } } \ No newline at end of file diff --git a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java index 0622e10..3fea7e4 100644 --- a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java +++ b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java @@ -73,7 +73,7 @@ public class ScenarioRepository { @Getter private Scenarios scenarios; - private static boolean isSupportedDocument(XdmNode doc) { + private static boolean isSupportedDocument(final XdmNode doc) { final XdmNode root = findRoot(doc); final String frameworkVersion = root.getAttributeValue(new QName("frameworkVersion")); return startsWith(frameworkVersion, SUPPORTED_MAJOR_VERSION) @@ -91,8 +91,8 @@ public class ScenarioRepository { throw new IllegalArgumentException("Kein root element gefunden"); } - private static void checkVersion(URI scenarioDefinition) { - DocumentParseAction p = new DocumentParseAction(); + private static void checkVersion(final URI scenarioDefinition) { + final DocumentParseAction p = new DocumentParseAction(); try { final Result result = p.parseDocument(InputFactory.read(scenarioDefinition.toURL())); if (result.isValid() && !isSupportedDocument(result.getObject())) { @@ -101,16 +101,17 @@ public class ScenarioRepository { scenarioDefinition, SUPPORTED_MAJOR_VERSION_SCHEMA)); } - } catch (MalformedURLException e) { + } catch (final MalformedURLException e) { throw new IllegalStateException("Error reading definition file"); } } public XsltExecutable getNoScenarioReport() { - if (noScenarioReport == null) { - noScenarioReport = repository.loadXsltScript(URI.create(scenarios.getNoScenarioReport().getResource().getLocation())); + if (this.noScenarioReport == null) { + this.noScenarioReport = this.repository + .loadXsltScript(URI.create(this.scenarios.getNoScenarioReport().getResource().getLocation())); } - return noScenarioReport; + return this.noScenarioReport; } /** @@ -118,18 +119,18 @@ public class ScenarioRepository { * * @param config die Konfiguration */ - public void initialize(CheckConfiguration config) { - ConversionService conversionService = new ConversionService(); + public void initialize(final CheckConfiguration config) { + final ConversionService conversionService = new ConversionService(); checkVersion(config.getScenarioDefinition()); log.info("Loading scenarios from {}", config.getScenarioDefinition()); - CollectingErrorEventHandler handler = new CollectingErrorEventHandler(); - this.scenarios = conversionService.readXml(config.getScenarioDefinition(), Scenarios.class, repository.getScenarioSchema(), + final CollectingErrorEventHandler handler = new CollectingErrorEventHandler(); + this.scenarios = conversionService.readXml(config.getScenarioDefinition(), Scenarios.class, ContentRepository.getScenarioSchema(), handler); if (!handler.hasErrors()) { - log.info("Loaded scenarios for {} by {} from {}. The following scenarios are available:\n\n{}", scenarios.getName(), - scenarios.getAuthor(), scenarios.getDate(), summarizeScenarios()); + log.info("Loaded scenarios for {} by {} from {}. The following scenarios are available:\n\n{}", this.scenarios.getName(), + this.scenarios.getAuthor(), this.scenarios.getDate(), summarizeScenarios()); log.info("Loading scenario content from {}", config.getScenarioRepository()); - getScenarios().getScenario().forEach(s -> s.initialize(repository, false)); + getScenarios().getScenario().forEach(s -> s.initialize(this.repository, false)); } else { throw new IllegalStateException(String.format("Can not load scenarios from %s due to %s", config.getScenarioDefinition(), handler.getErrorDescription())); @@ -140,8 +141,8 @@ public class ScenarioRepository { } private String summarizeScenarios() { - StringBuilder b = new StringBuilder(); - scenarios.getScenario().forEach(s -> { + final StringBuilder b = new StringBuilder(); + this.scenarios.getScenario().forEach(s -> { b.append(s.getName()); b.append("\n"); }); @@ -154,9 +155,10 @@ public class ScenarioRepository { * @param document das Eingabedokument * @return ein Ergebnis-Objekt zur weiteren Verarbeitung */ - public Result selectScenario(XdmNode document) { + public Result selectScenario(final XdmNode document) { Result result = new Result<>(); - final List collect = scenarios.getScenario().stream().filter(s -> match(document, s)).collect(Collectors.toList()); + final List collect = this.scenarios.getScenario().stream().filter(s -> match(document, s)) + .collect(Collectors.toList()); if (collect.size() == 1) { result = new Result<>(collect.get(0)); } else if (collect.isEmpty()) { @@ -168,19 +170,19 @@ public class ScenarioRepository { } - private boolean match(XdmNode document, ScenarioType scenario) { + private static boolean match(final XdmNode document, final ScenarioType scenario) { try { final XPathSelector selector = scenario.getSelector(); selector.setContextItem(document); return selector.effectiveBooleanValue(); - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { log.error("Error evaluating xpath expression", e); } return false; } - void initialize(Scenarios def) { + void initialize(final Scenarios def) { this.scenarios = def; } } diff --git a/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java b/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java index 5aebbe8..f184975 100644 --- a/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java +++ b/src/test/java/de/kosit/validationtool/impl/ContentRepositoryTest.java @@ -22,6 +22,9 @@ package de.kosit.validationtool.impl; import static org.assertj.core.api.Assertions.assertThat; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -48,64 +51,85 @@ public class ContentRepositoryTest { @Rule public ExpectedException exception = ExpectedException.none(); - @Before public void setup() { - repository = new ContentRepository(ObjectFactory.createProcessor(), Helper.REPOSITORY); + this.repository = new ContentRepository(ObjectFactory.createProcessor(), Helper.REPOSITORY); } - @Test public void testCreateSchema() throws MalformedURLException { - final Schema schema = repository.createSchema(Helper.ASSERTION_SCHEMA.toURL()); + final Schema schema = ContentRepository.createSchema(Helper.ASSERTION_SCHEMA.toURL()); assertThat(schema).isNotNull(); } @Test - public void testSchemaCaching() throws MalformedURLException { - final Schema schema = repository.getReportInputSchema(); - assertThat(repository.getReportInputSchema()).isSameAs(schema); + public void testSchemaCaching() { + final Schema schema = this.repository.getReportInputSchema(); + assertThat(this.repository.getReportInputSchema()).isSameAs(schema); } @Test - public void testCreateSchemaNotExisting()throws Exception { - exception.expect(IllegalStateException.class); - repository.createSchema(Helper.ASSERTION_SCHEMA.resolve("noexisting").toURL()); + public void testCreateSchemaNotExisting() throws Exception { + this.exception.expect(IllegalStateException.class); + ContentRepository.createSchema(Helper.ASSERTION_SCHEMA.resolve("noexisting").toURL()); } @Test - public void testLoadXSLT() throws MalformedURLException { - final XsltExecutable executable = repository.loadXsltScript(Helper.SAMPLE_XSLT); + public void testLoadXSLT() { + final XsltExecutable executable = this.repository.loadXsltScript(Helper.SAMPLE_XSLT); assertThat(executable).isNotNull(); } @Test - public void testLoadXSLTNotExisting() throws MalformedURLException { - exception.expect(IllegalStateException.class); - repository.loadXsltScript(Helper.SAMPLE_XSLT.resolve("notexisting")); + public void testLoadXSLTNotExisting() { + this.exception.expect(IllegalStateException.class); + this.repository.loadXsltScript(Helper.SAMPLE_XSLT.resolve("notexisting")); } @Test - public void testXpathCreation() throws MalformedURLException { - XPathExecutable xPath = repository.createXPath("//html", null); + public void testXpathCreation() { + XPathExecutable xPath = this.repository.createXPath("//html", null); assertThat(xPath).isNotNull(); - xPath = repository.createXPath("//html", Collections.emptyMap()); + xPath = this.repository.createXPath("//html", Collections.emptyMap()); assertThat(xPath).isNotNull(); - Map namespace = new HashMap<>(); + final Map namespace = new HashMap<>(); namespace.put("html", "http://www.w3.org/1999/xhtml"); - xPath = repository.createXPath("//html:html", namespace ); + xPath = this.repository.createXPath("//html:html", namespace); assertThat(xPath).isNotNull(); } @Test - public void testXpathCreationWithoutNamespace(){ - exception.expect(IllegalStateException.class); - repository.createXPath("//html:html", null ); + public void testXpathCreationWithoutNamespace() { + this.exception.expect(IllegalStateException.class); + this.repository.createXPath("//html:html", null); } @Test - public void testIllegalXpath(){ - exception.expect(IllegalStateException.class); - repository.createXPath("kein Xpath Ausdruck", null ); + public void testIllegalXpath() { + this.exception.expect(IllegalStateException.class); + this.repository.createXPath("kein Xpath Ausdruck", null); } + + @Test + public void loadFromJar() throws URISyntaxException { + this.repository = new ContentRepository(ObjectFactory.createProcessor(), Helper.JAR_REPOSITORY.toURI()); + final XsltExecutable xsltExecutable = this.repository.loadXsltScript(URI.create("resources/eRechnung/report.xsl")); + assertThat(xsltExecutable).isNotNull(); + } + + @Test + public void testLoadSchema() { + final URL main = RelativeUriResolverTest.class.getClassLoader().getResource("simple/main.xsd"); + final Schema schema = ContentRepository.createSchema(main, new ClassPathResourceResolver("/simple")); + assertThat(schema).isNotNull(); + } + + @Test + public void testLoadSchemaPackaged() throws URISyntaxException { + final URL main = RelativeUriResolverTest.class.getClassLoader().getResource("packaged/main.xsd"); + final Schema schema = ContentRepository.createSchema(main, + new ClassPathResourceResolver(RelativeUriResolverTest.class.getClassLoader().getResource("packaged/").toURI())); + assertThat(schema).isNotNull(); + } + } diff --git a/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java b/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java index eb4da25..a3ad35c 100644 --- a/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java +++ b/src/test/java/de/kosit/validationtool/impl/ConversionServiceTest.java @@ -57,65 +57,66 @@ public class ConversionServiceTest { @Before public void setup() { - service = new ConversionService(); - repository = new ContentRepository(ObjectFactory.createProcessor(), new File("src/test/resources/examples/repository").toURI()); + this.service = new ConversionService(); + this.repository = new ContentRepository(ObjectFactory.createProcessor(), + new File("src/test/resources/examples/repository").toURI()); } @Test public void testMarshalNull() { - exception.expect(ConversionService.ConversionExeption.class); - service.writeXml(null); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.writeXml(null); } @Test public void testMarshalUnknown() { - exception.expect(ConversionService.ConversionExeption.class); - service.writeXml(new Serializable() { + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.writeXml(new Serializable() { }); } @Test public void testUnmarshal() throws URISyntaxException { - final Scenarios s = service.readXml(VALID_XML.toURI(), Scenarios.class); + final Scenarios s = this.service.readXml(VALID_XML.toURI(), Scenarios.class); assertThat(s).isNotNull(); assertThat(s.getName()).isEqualToIgnoringCase("XInneres"); } @Test public void testUnmarshalWithSchema() throws URISyntaxException { - final Scenarios s = service.readXml(VALID_XML.toURI(), Scenarios.class, repository.createSchema(SCHEMA)); + final Scenarios s = this.service.readXml(VALID_XML.toURI(), Scenarios.class, ContentRepository.createSchema(SCHEMA)); assertThat(s).isNotNull(); assertThat(s.getName()).isEqualToIgnoringCase("XInneres"); } @Test public void testUnmarshalInvalidXml() throws URISyntaxException { - exception.expect(ConversionService.ConversionExeption.class); - service.readXml(INVALID_XML.toURI(), Scenarios.class, repository.createSchema(SCHEMA)); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.readXml(INVALID_XML.toURI(), Scenarios.class, ContentRepository.createSchema(SCHEMA)); } @Test public void testUnmarshalIllFormed() throws URISyntaxException { - exception.expect(ConversionService.ConversionExeption.class); - service.readXml(ILLFORMED_XML.toURI(), Scenarios.class, repository.createSchema(SCHEMA)); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.readXml(ILLFORMED_XML.toURI(), Scenarios.class, ContentRepository.createSchema(SCHEMA)); } @Test public void testUnmarshalEmpty() { - exception.expect(ConversionService.ConversionExeption.class); - service.readXml(null, Scenarios.class); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.readXml(null, Scenarios.class); } @Test public void testUnmarshalUnknownType() throws URISyntaxException { - exception.expect(ConversionService.ConversionExeption.class); - service.readXml(VALID_XML.toURI(), ConversionService.class); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.readXml(VALID_XML.toURI(), ConversionService.class); } @Test public void testUnmarshalWithoutType() throws URISyntaxException { - exception.expect(ConversionService.ConversionExeption.class); - service.readXml(VALID_XML.toURI(), null); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.readXml(VALID_XML.toURI(), null); } } diff --git a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java index cae8be6..7b61ebc 100644 --- a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java +++ b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java @@ -56,27 +56,27 @@ public class DefaultCheckTest { @Before public void setup() throws URISyntaxException { - CheckConfiguration d = new CheckConfiguration(SCENARIO_DEFINITION.toURI()); + final CheckConfiguration d = new CheckConfiguration(SCENARIO_DEFINITION.toURI()); d.setScenarioRepository(new File("src/test/resources/examples/repository").toURI()); - implementation = new DefaultCheck(d); + this.implementation = new DefaultCheck(d); } @Test public void testHappyCase() throws Exception { - final XdmNode doc = implementation.checkInput(read(VALID_EXAMPLE)); + final XdmNode doc = this.implementation.checkInput(read(VALID_EXAMPLE)); assertThat(doc).isNotNull(); } @Test public void testHappyCaseDocument() throws Exception { - final Document doc = implementation.check(read(VALID_EXAMPLE)); + final Document doc = this.implementation.check(read(VALID_EXAMPLE)); assertThat(doc).isNotNull(); } @Test public void testMultipleCase() throws Exception { final List input = IntStream.range(0, MULTI_COUNT).mapToObj(i -> read(VALID_EXAMPLE)).collect(Collectors.toList()); - final List docs = implementation.checkInput(input); + final List docs = this.implementation.checkInput(input); assertThat(docs).isNotNull(); assertThat(docs).hasSize(MULTI_COUNT); } @@ -84,7 +84,7 @@ public class DefaultCheckTest { @Test public void testMultipleCaseDocument() throws Exception { final List input = IntStream.range(0, MULTI_COUNT).mapToObj(i -> read(VALID_EXAMPLE)).collect(Collectors.toList()); - final List docs = implementation.check(input); + final List docs = this.implementation.check(input); assertThat(docs).isNotNull(); assertThat(docs).hasSize(MULTI_COUNT); } diff --git a/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java b/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java index 3e54ee6..c6b8fd7 100644 --- a/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java +++ b/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java @@ -22,7 +22,6 @@ package de.kosit.validationtool.impl; import static de.kosit.validationtool.api.InputFactory.read; import static org.assertj.core.api.Assertions.assertThat; -import java.io.IOException; import java.net.URL; import org.junit.Before; @@ -37,6 +36,8 @@ import de.kosit.validationtool.model.reportInput.XMLSyntaxError; import net.sf.saxon.s9api.XdmNode; /** + * Testet die Document Parsing-Funktionalitäten. + * * @author Andreas Penski */ public class DocumentParserTest { @@ -47,8 +48,6 @@ public class DocumentParserTest { private static final URL NOT_EXISTING = ConversionServiceTest.class.getResource("/does not exist.xml"); - - @Rule public ExpectedException exception = ExpectedException.none(); @@ -56,22 +55,21 @@ public class DocumentParserTest { @Before public void setup() { - parser = new DocumentParseAction(); + this.parser = new DocumentParseAction(); } @Test - public void testSimple() throws IOException { - final Result result = parser.parseDocument(read(CONTENT)); + public void testSimple() { + final Result result = this.parser.parseDocument(read(CONTENT)); assertThat(result).isNotNull(); assertThat(result.getObject()).isNotNull(); assertThat(result.getErrors()).isEmpty(); assertThat(result.isValid()).isTrue(); } - @Test - public void testIllformed() throws IOException { - final Result result = parser.parseDocument(read(ILLFORMED)); + public void testIllformed() { + final Result result = this.parser.parseDocument(read(ILLFORMED)); assertThat(result).isNotNull(); assertThat(result.getErrors()).isNotEmpty(); assertThat(result.getObject()).isNull(); @@ -80,10 +78,9 @@ public class DocumentParserTest { @Test public void testNullInput() { - exception.expect(IllegalArgumentException.class); - parser.parseDocument(null); + this.exception.expect(IllegalArgumentException.class); + this.parser.parseDocument(null); } - } diff --git a/src/test/java/de/kosit/validationtool/impl/Helper.java b/src/test/java/de/kosit/validationtool/impl/Helper.java index d717fbd..22b5925 100644 --- a/src/test/java/de/kosit/validationtool/impl/Helper.java +++ b/src/test/java/de/kosit/validationtool/impl/Helper.java @@ -57,6 +57,8 @@ public class Helper { public static final URI REPOSITORY = EXAMPLES_DIR.resolve("repository/"); + public static final URL JAR_REPOSITORY = Helper.class.getClassLoader().getResource("xrechnung/repository/"); + public static final URI NOT_EXISTING = EXAMPLES_DIR.resolve("doesnotexist"); public static final URI SAMPLE_DIR = EXAMPLES_DIR.resolve("UBLReady/"); @@ -73,18 +75,18 @@ public class Helper { * @param url die url die geladen werden soll * @return ein result objekt mit Dokument */ - public static XdmNode load(URL url) { - try ( InputStream input = url.openStream() ) { + public static XdmNode load(final URL url) { + try ( final InputStream input = url.openStream() ) { return ObjectFactory.createProcessor().newDocumentBuilder().build(new StreamSource(input)); - } catch (SaxonApiException | IOException e) { + } catch (final SaxonApiException | IOException e) { throw new IllegalStateException("Fehler beim Laden der XML-Datei", e); } } - public static T load(URL url, Class type) throws URISyntaxException { - ConversionService c = new ConversionService(); + public static T load(final URL url, final Class type) throws URISyntaxException { + final ConversionService c = new ConversionService(); c.initialize(de.kosit.validationtool.model.reportInput.ObjectFactory.class.getPackage(), de.kosit.validationtool.cmd.assertions.ObjectFactory.class.getPackage(), de.kosit.validationtool.model.scenarios.ObjectFactory.class.getPackage()); diff --git a/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java b/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java index e9202a9..8be3af1 100644 --- a/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java +++ b/src/test/java/de/kosit/validationtool/impl/RelativeUriResolverTest.java @@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; @@ -44,7 +45,7 @@ public class RelativeUriResolverTest { static { try { BASE = RelativeUriResolver.class.getResource("/examples/assertions/").toURI(); - } catch (URISyntaxException e) { + } catch (final URISyntaxException e) { throw new IllegalStateException(e); } } @@ -56,19 +57,35 @@ public class RelativeUriResolverTest { @Test public void testSucces() throws TransformerException { - final Source resource = resolver.resolve("ubl-0001.xml", BASE.toASCIIString()); + final Source resource = this.resolver.resolve("ubl-0001.xml", BASE.toASCIIString()); assertThat(resource).isNotNull(); } @Test public void testNotExisting() throws TransformerException { - exception.expect(IllegalStateException.class); - resolver.resolve("ubl-0001", BASE.toASCIIString()); + this.exception.expect(IllegalStateException.class); + this.resolver.resolve("ubl-0001", BASE.toASCIIString()); } @Test public void testOutOfPath() throws TransformerException { - exception.expect(IllegalStateException.class); - resolver.resolve("../results/report.xml", BASE.toASCIIString()); + this.exception.expect(IllegalStateException.class); + this.resolver.resolve("../results/report.xml", BASE.toASCIIString()); + } + + @Test + public void testClasspathLocal() throws URISyntaxException, TransformerException { + this.resolver = new RelativeUriResolver(RelativeUriResolver.class.getClassLoader().getResource("simple").toURI()); + final URL moz = RelativeUriResolverTest.class.getClassLoader().getResource("simple/main.xsd"); + final Source resolved = this.resolver.resolve("./resources/reference.xsd", moz.toURI().toASCIIString()); + assertThat(resolved).isNotNull(); + } + + @Test + public void testClasspathJAR() throws URISyntaxException, TransformerException { + this.resolver = new RelativeUriResolver(RelativeUriResolver.class.getClassLoader().getResource("packaged").toURI()); + final URL moz = RelativeUriResolverTest.class.getClassLoader().getResource("packaged/main.xsd"); + final Source resolved = this.resolver.resolve("./resources/reference.xsd", moz.toURI().toASCIIString()); + assertThat(resolved).isNotNull(); } } diff --git a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java index 4e1492b..0238f41 100644 --- a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java +++ b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; import java.net.URL; import org.junit.Before; @@ -31,6 +32,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import de.kosit.validationtool.api.CheckConfiguration; import de.kosit.validationtool.impl.model.Result; import de.kosit.validationtool.impl.tasks.DocumentParseAction; import de.kosit.validationtool.model.scenarios.ScenarioType; @@ -57,46 +59,57 @@ public class ScenarioRepositoryTest { @Before public void setup() { - content = new ContentRepository(ObjectFactory.createProcessor(), new File("src/test/resources/examples/repository").toURI()); - Scenarios def = new Scenarios(); - ScenarioType t = new ScenarioType(); + this.content = new ContentRepository(ObjectFactory.createProcessor(), new File("src/test/resources/examples/repository").toURI()); + final Scenarios def = new Scenarios(); + final ScenarioType t = new ScenarioType(); t.setMatch("//*:name"); t.setName("Test"); - t.initialize(content, true); + t.initialize(this.content, true); def.getScenario().add(t); - repository = new ScenarioRepository(ObjectFactory.createProcessor(), content); - repository.initialize(def); + this.repository = new ScenarioRepository(ObjectFactory.createProcessor(), this.content); + this.repository.initialize(def); } @Test public void testHappyCase() throws Exception { - final Result scenario = repository.selectScenario(load(SAMPLE)); + final Result scenario = this.repository.selectScenario(load(SAMPLE)); assertThat(scenario).isNotNull(); assertThat(scenario.isValid()).isTrue(); } @Test public void testNonMatch() throws Exception { - repository.getScenarios().getScenario().clear(); - final Result scenario = repository.selectScenario(load(SAMPLE)); + this.repository.getScenarios().getScenario().clear(); + final Result scenario = this.repository.selectScenario(load(SAMPLE)); assertThat(scenario).isNotNull(); assertThat(scenario.isValid()).isFalse(); } @Test public void testMultiMatch() throws Exception { - ScenarioType t = new ScenarioType(); + final ScenarioType t = new ScenarioType(); t.setMatch("//*:name"); t.setName("Test"); - t.initialize(content, true); - repository.getScenarios().getScenario().add(t); - final Result scenario = repository.selectScenario(load(SAMPLE)); + t.initialize(this.content, true); + this.repository.getScenarios().getScenario().add(t); + final Result scenario = this.repository.selectScenario(load(SAMPLE)); assertThat(scenario).isNotNull(); assertThat(scenario.isValid()).isFalse(); } - private XdmNode load(URL url) throws IOException { - DocumentParseAction p = new DocumentParseAction(); + private static XdmNode load(final URL url) throws IOException { + final DocumentParseAction p = new DocumentParseAction(); return p.parseDocument(read(url)).getObject(); } + + @Test + public void loadFromJar() throws URISyntaxException { + this.content = new ContentRepository(ObjectFactory.createProcessor(), Helper.JAR_REPOSITORY.toURI()); + this.repository = new ScenarioRepository(ObjectFactory.createProcessor(), this.content); + final CheckConfiguration conf = new CheckConfiguration( + ScenarioRepository.class.getClassLoader().getResource("xrechnung/scenarios.xml").toURI()); + this.repository.initialize(conf); + assertThat(this.repository.getScenarios()).isNotNull(); + } + } diff --git a/src/test/java/de/kosit/validationtool/impl/VersioningTest.java b/src/test/java/de/kosit/validationtool/impl/VersioningTest.java index 7aa765a..661db36 100644 --- a/src/test/java/de/kosit/validationtool/impl/VersioningTest.java +++ b/src/test/java/de/kosit/validationtool/impl/VersioningTest.java @@ -21,7 +21,6 @@ package de.kosit.validationtool.impl; import static org.assertj.core.api.Assertions.assertThat; -import java.io.File; import java.net.URISyntaxException; import java.net.URL; @@ -52,35 +51,33 @@ public class VersioningTest { private ConversionService service; - private ContentRepository repository; @Before public void setup() { - service = new ConversionService(); - repository = new ContentRepository(ObjectFactory.createProcessor(), new File("src/test/resources/examples/repository").toURI()); + this.service = new ConversionService(); } @Test public void testBase() throws URISyntaxException { - final Scenarios result = service.readXml(BASE.toURI(), Scenarios.class, repository.getScenarioSchema()); + final Scenarios result = this.service.readXml(BASE.toURI(), Scenarios.class, ContentRepository.getScenarioSchema()); assertThat(result).isNotNull(); } @Test public void testFrameworkIncrement() throws URISyntaxException { - final Scenarios result = service.readXml(INCREMENT.toURI(), Scenarios.class, repository.getScenarioSchema()); + final Scenarios result = this.service.readXml(INCREMENT.toURI(), Scenarios.class, ContentRepository.getScenarioSchema()); assertThat(result).isNotNull(); } @Test public void testNewFeature() throws URISyntaxException { - exception.expect(ConversionService.ConversionExeption.class); - service.readXml(NEW_FEATURE.toURI(), Scenarios.class, repository.getScenarioSchema()); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.readXml(NEW_FEATURE.toURI(), Scenarios.class, ContentRepository.getScenarioSchema()); } @Test public void testNewVersion() throws URISyntaxException { - exception.expect(ConversionService.ConversionExeption.class); - service.readXml(NEW_VERSION.toURI(), Scenarios.class, repository.getScenarioSchema()); + this.exception.expect(ConversionService.ConversionExeption.class); + this.service.readXml(NEW_VERSION.toURI(), Scenarios.class, ContentRepository.getScenarioSchema()); } } diff --git a/src/test/resources/simple/main.xsd b/src/test/resources/simple/main.xsd new file mode 100644 index 0000000..71f89b9 --- /dev/null +++ b/src/test/resources/simple/main.xsd @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/simple/resources/reference.xsd b/src/test/resources/simple/resources/reference.xsd new file mode 100644 index 0000000..4c55ec8 --- /dev/null +++ b/src/test/resources/simple/resources/reference.xsd @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file From e60da352bbcf57aaa61adcfed496cb2848b95d1a Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Tue, 7 May 2019 08:51:59 +0200 Subject: [PATCH 02/25] (wip) adding sample jar --- .../1.0.0/packaged-test-scenarios-1.0.0.jar | Bin 0 -> 120988 bytes .../1.0.0/packaged-test-scenarios-1.0.0.pom | 9 +++++++++ .../maven-metadata-local.xml | 12 ++++++++++++ pom.xml | 12 ++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 libs/de/kosit/validationtool/packaged-test-scenarios/1.0.0/packaged-test-scenarios-1.0.0.jar create mode 100644 libs/de/kosit/validationtool/packaged-test-scenarios/1.0.0/packaged-test-scenarios-1.0.0.pom create mode 100644 libs/de/kosit/validationtool/packaged-test-scenarios/maven-metadata-local.xml diff --git a/libs/de/kosit/validationtool/packaged-test-scenarios/1.0.0/packaged-test-scenarios-1.0.0.jar b/libs/de/kosit/validationtool/packaged-test-scenarios/1.0.0/packaged-test-scenarios-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..6b511a657f8efce5ba468b1a361757170a1bad85 GIT binary patch literal 120988 zcmbrl1CTCVmnK^FDciPf+qP}%lvSYUh+@IbesfuPu_xaaAxkaT2UP_Cx#& zkZC4&u9E>qQ%>oHrgW|y$953~h+yz;;IOcawjJB%&o58UoRZ$c$6v!1R*bI7dwKRG zO(CpOf5n2>uX8vQG$*=az;(UW&b3Xz%`#!^xKBtLeyD55^|X08$qsm0sgPoJCczxYDLzJcytg~Ykr$vcD^xw~pyyOS9zs8d?AOsPP?Y`^5d=o&V z`!t?Mh8)cP7#uB7+?9mfusXU^1X5scf zf)4+HO!)t-;B01Y=4@tfV)if0W8(Q7`v1Y);-02z11HSAA|53*vf^r1xuOz{o+we^ zk1tW6!AuAkG&}Fw@&mtz*OJ#?aa^Xs;SStXD+mz1Gmn@`m)8w@{cR&XQtDLiMs3DR zV|edEcQUh`7ptGtcg2YnTAlHq+L;|1$Um;-3EfRYtLMlB#GIBJ*qz59>X@E{{fGJq zQ8T@kvxP-52+yE2TUg_JvsMeLzpnEok^3Z4{3hWyRHFK=CTu=sBU${J*o0xx?q*|_ z-?|hVd}2i%eiPOO-JrH&QYL3-WQp)gCwJmZJ&jfL?1TK@V5$g~{g*g}`3DU*w$4935P&TpgT$|9_|u{J*LE&)@8S_DA*quWY9LKTaF! z-=8&_lh+=lnsL+zj+J;vj zDniK0j{<`PBNIZiF-F@~+aYNoYjep1he8^K;)F`UEA+qI0JMi_cnUI{ZLMA$ zK3cw7vb$DlO5r;W1OM{9IN7wcEEsR%d8J;(614Dhc~^coUo?Hibd|Ml{TlW&z1a}C zhOw`kHQ5Vpc;RIb)X9Qm@t_qQ#S3eg+adtw;l9WXEw#xAB-8xhyLmjV8ZfUJ0)-xR z;d%gJe*&2f&BcLuHbmbKEJ9>-!FA+6vZwUAOm>O5d>v>g;(%Wpb#DzeS`&T(<#XZ5 z&QG9Q-GrrIh02$ms2BNb#y#nNXJ|dou*R}$!a|52xX}ZDc}Hrxy%~Z@-n?TXn~1YO zOu7k1SLb&%h02gvL($DONRVLLyjCWieW~OS)-)&hY%Nx+lcQnwQt^9Am%)^!Pvte* z;8z>LAALmjC%g^UuzK%7gUFJR?(hK5pjlDxB+b6s1Z%V?rs8enep0xvZllSQhg>S? z>)(B=;lEk8!z|+z5IP9C&+a2G9Ek|4Z_M3+h!AQr&OT0!;RP#ArkR4Bi;IO3mmYfI ziI(lw^gN3k?IC!16eCuZvF#FUb^|dqA}+_Mc)0EAR`Rm(bL<;tVyCy?Zj)G^*OHQw zC`K$K!pbfOP@adwMjY^S@O(X^4IJtyMhr%4Zt(DW+NN56@d5{*L+%EJH%XOmM!Hgy z2~*4Rs`j6Vc$*^h74YO{m`o4j%MOzH-u-550{>MDl!5MQY8|Fr2lhl)zcO%O@8NG^ zawE;@i=;17j4~|(G2kLbfI!f~EW+Zi4?l5DQ`>3m(#zzog$7rL z+fT_@mL0vZ$_6HC1JO(Y*j=+{2^a{-B7&sQ2l{%lFd{2R6XG`frgik%p2d>3(&~4H z^D>|^rIASXaN|3s*MBm+2&I9Wz`@oitp6a*R=*fW+eY_J6mT*}zY+eikY5eKi@v0R zw=zHzOA8H@fCBx%x$j!kc0d;|3StJQ=CBq1P5~u5%EsnGCTdXep-b z*tHR_=}hrVOteqKRB)zIn%R>L-fq0OmAMW_XAxrdFcq|n>h^l$@4DdKFa~i5B^+XO zt|k3M6&f}Az%&izWXwji^JP1ya9)fHUrfKC1`ryYbFeq2om$=5w#{#?50kD7q^hN&XmR0Uo;U>F&gc*X(@V(s|Uz{RnjU* zF{`K5TxfOXq*Pijoh3^#U#E0R80{aL&PC zVmnXrBtK8U6~vI431?8<7K3tGLYuT|6Az$o>3rro$nVQ5mHBs+f2Qpiu^?EM*nHJV z@QTEFt)f)Vt%}G2qg!=X_vrJIQ9hw3ML8>KCR=VsB$a``uBgCl{j z4$GGc*EF?0A~P{YrV8~j=)@1*RG%~f3?TTqBy)=$aORSh-!I9DzRy&SV{qr*APi)pA4Hf_kDVqmbFw4_*h+jnC z*EELC6+7^;zL9NrgXwv zOmYXN{$qUU&80}O2PZD+7`ieK(?#1c@YKmLE{n0XalK}=L;t%bYT{8N zxsho`mpSF{XCeN?Y*a|^00rQYvnHHO4LEK7PQetD>AluOR5>|BCSPM}A!F@4|37h% zZ-}wuk2(|sU)}sRTeWhOb~0p18ifia;2xXQFTz%i_;u{vaqsCoe%cC}VIiohErPlj zE(LU$!Mk$`Ms`inUh}0ufrY|jokU&>o&X@?WO96nKn&3wSfKLY#i{A(+Z`c+Fx3IXZCcFx{>4IT?h#vA zV+W!d0&SUto_CS=^SI1DK-ZyWn@tfAX*&k^%u@hW4jG?#%v0w1u8?yD}gEe&u5xYz2_7r0QoB8J_i73*hvWnmN& z76v{+)F*dycN;nhFr@25DTK@MxXsa!W0n+2m}hC9_aZ1O_qJN&!bJiHR_h|57zcEu z6n9ZgZhgHd$zDFiDWrgr>g((KcX=ey-KjW>1z?0}?@Oxijt-fH{g`!WAc(9=`Lot1 z?cuJ!tdH4ii*~Y!=gaZsknm6b4&(jvg(x<8eqQ%}Vbx!66tAA~af5S=FVaVCqz%YY z12vJCZ@i%}yI;at(>5{>447qwgOreS%m87YR@mB&EU{v;Zu+};BD%v?#K=gLkG$4T zm<#?!kdjlwqTZ}}R7-Y?vr?+?3p7lcGJ#xnz9vLP7Ev^l)BDpU%CQ*XY*{rS!om%D z?;7sjr3)zwtG^v5vMrqbp~@`@5lt$UGD(MopZXF0?6@E!mdCC|fV&=2y6(K-d!wYW z(g@Qa(t7$p+Rz$phEl#qe+B#s3$OPzvsjjAJ{oo^XMnR}Ox54Or9NoRT!0D=Gm&n) zD{&JdB{oJi2JG@xP=ZNp3j)Z@9$v*ViE2`Iv~tVyQCj0?8};s@{-MSnTt00Ack>tM z-HALffrnNqc<4?Tca`;|_sYbh`9j-n!pg2vl}b~{x=1$aMEup%Z8)*_ka&ZT7j~fp z#5^|S_B69gjczRY?Ko_kvP&=f8A2}F941X4-$q#Y6JSLFN9Am(YXP~1HfRqY)Q`3H zydI`Dh4}K6!CP*s)3mfB8V$^YJ3dc$C)^4w7M1WyEY0?V>*5?oWFW-MyNyxeTxa41 zVC)PDgccchckYcgsSk9RN!MB7q3%kMON?5y)0COD0MxRKyWVPnL+u8-;YiFZtT zIG983hN(Zf50=S=nZvDb2)&~DRj3u1+NOe+5RB96(dF|6l}iKOgj6$ zT!1a`M)k$378baV4jc}p$Grs<&FTErxTGFdzwE`A7q*^&ohGy~WYgP@mLqB@m zSlhbFSydkK@p`$~VgPFdLSD7l`-P03w_}Kqh?z+2$IF8E*{T%0jN>`}*|AB@%*-T0 zyIF_g0>Z@*82}cXvj-m^N$WCHUD-G2Dhy-^o3%jyL0KJLoNtYX)RBYF10pQBj3uOl z`9^7g1lq_AqPa^z6Qh|FxB~u!41r6V)FJJCsrhV%;nCAUKl+g>qDF4$i6o~ERQtdM zMD<)(ZH$Dc4U9+1l79|lM@+$B4@?osc1Z%za73k*$>FjMk0!oh(ek`faU;3bYJT*1 zfmBCGrf)|xA`a9|bJo^Tkp3IdO>5fTRi;#NHgS($Cx?wk~MB2gJINeI-NlpIK zm@9^RL`*U!s%rlHIeabvLIy9vp(mD#^x5yK=e}T4`?9JDkQ`;SCH&0;-&!M#HIsbw zV#n3LT8dyG%DXig3F_wjGIDD?Z3jGV_HZz&U3@sI(QEMuth#Z^U(&TCNpA1x2keWh z!>q$3nt)M`Ng!ylQ{qe_A1t928Gk7n+CK)WDb^=}1(mLR0%?zFUAykt+cj;2^R-ad{1Q=efS8GNy0CZt z0+E)?0FmZNez&Y$r$`Mmg&L&_uvTN988HM)wKXdFkV@LG&!m|SU$w7;LM;X0ZN^JU z^qWY*zmwjkWN0GXP6%df0Y&SG)UTee9x;ly=<=G5qmC<5Em4BN8spMvjnT+{K`6kr zYORQB)k=;!PZq)>QEpveg0~2?Q7vsO%HSa#iW$|J+#7G0Y4yOeNQoksNz)6Jp9+jP zqH)S-WSu75UdI&kq`IDcbJFk?<|HWWHpb1o}houFU87S4Wbe2m7>5XYu6m5ew z9w_=yBF^j7pvj2mx$G7+i4!od*EF=KBP8Rm^6)X0$5}3eI6ZE0ep@qOVj;~wUhJ= z7nB~?Xm#)@#WNF-FoolL-6KsN2zxIPg5<(al`e_s9qQ9OE1&B?YmH(xWVd%V zIxy*IDsOkvKC>O52pRZg?PO|8ll{0>bmCFEu)jgT4io1Uo=v_6D-u%zR(X(NM6gjP zZiL7D19){mb!1W0%ThK@QDkNV#WgrX=FIm&qHM|!Jv?`iF~uc(cB^9>W%BL&p#4@K zJG!2pW_ic--s?RZ@6=F*EBWgXpe`#1na~8hyPCy|sEIE8n#QP+1v94Dz$E|b`CUnd z$HH5vkrGYB^%HsgmwozYe(lc5P#**OK`tuQhN;mEv_lXPRLrY00a`=SdO9MLf7G># z_-`OrCnhAm4?0x@BzrFY)vQ2Dv4@aqUe{sR5*>toxNe~5A}e$vV+QzG3$k_o>*|pg zI)OId4ob={F|7A?E&D5m3>*i&CatV}Lf01tvJ!9nOlIfkB>;;=j3 z_;)}Ngz6*Ay*;?sjHOx)ot}GHsv6&9s_&Z2@|(SkK5Q_hr`tx!R#I(hWhETCB}zY7 zXiNlvtRjJTb@_l!4^Gln!;Hfwr`?)vVQ? z%9epzeCwR`+50)!oUs(A26ft!M}ihNu|>W2fag&`uF6lJB~}R9G`_vMM220fP}y5N znY9doappL! zOF&82&5}C>8Z z8KDaFs(Q&)M;@>UV*EZXQrHo{VklWu76=VWJ!@=U;`xVOTy4XJk8i<)?s6a@TmR)M zs%1Q@0Vb+|eSGT|^%N;Wdz>Bev0zQ9?1bhvOJXW)Cj&j5raUw@&8EN}i8f#B*$vjK z+Weq20sW2<6oQ&lTTp^88c{W8lm+6nvT@I#S7clXQk!(uB66myKyl^J0ln2K7JYZV zvWpiegmw3cgWnd<573YA9UG7T$;I~@>Q6*%3-_!b#$ zL?B{)+vJ~%fNC@h#YZ`VgT7}V;XD<@P~6p~vcsTIsO?vVLKp8y)@(8}kN^D9Es6Uw zpdEUn%@2e*JW47!6!-iAGWpNyE zy+yh#1?|!ihyGM#Y?n-2iN&s)y0jQCjNF}1J9C_DCa`oh)TB$)QrXIW?-(3It5?5^ zQ>mprKv!j4j8ggeKM}aR*f9ic+6B`U!k6Su_5YB-m0^6Nx3zrwuGt>BnF9l zmlmep&<#nd7mIfL2+=j46-gauOE=o`yhzDiLE<*lfU|y3ps!sSeEoQvDV{!^#cNZ> zUOPu2UOixiq$L4~A-)bsK};eG8L2M6rcIm9H08ynKy0AcFn{|6b8s|=5@)K4txvgXjK);p7r4dl`$$Sz37ieycBGl~!Ozbekz&ex6W{vvUmeC4Z9^oS( zi;qKok|@M4EMGmHimhGzN)Ay!eI9&o9@&Qf`@K{8<8e+hi-kM8gYUVIyhCkNaCw-4 zJ4WuFGOJP#?*G!185G)SeYdw=`M9U9R& ze4Nc)8@q+u+=^!NZ$MGo1`=bkBDc;2RWwYg&8V6P7`T_-{WrY3rYjS%NVn=tR@>W8 z!kTq_(&>uObz^M}{aE%*QG(S|1IjA0I4tJ!N;NY6yiFW7Q?DYxwG|$g>JMar!B#>e z3}hKUe6D3(zT+kaid?l#6X|*21!{^~Bn1oB=9wp$w?g&D+TK>J(OS*>ycqmr@=;8J ztJdp16*Gs+Eu&b}<+$mW{l%kULCpR$X5`=a-#FqyZAw_7Z{wKv3n?XRk4xvrAt^b> zu(NNO&wlEB!2}HMs50wA@A(;81Ts$uKXTW8ZuKF3-nx3LhpldAF7hBda}nCeU)d^7 zGAYsNGLWN*^NMkJfPp~_X}Be?o-#F>))TU@_C|{&lC_97=GA5PLt%x;PAgK;AYTl% zUQswqzhC3UjMpN@HZ`%mz-Q6I`u9Id8YRlv_bNIA zsBU5YTSjRnC2ZesOg|JL6=o;8Go~#JoCs$P# z?qdBn~bvQH&uUlmYkVNndV(0T<;~#~9je4?yA-h5PXZx<(|v=d77^Z!vt44G-;Re)m5y9mMLh_SaNS#TjBIq4 zklf-~kt7D%^Zkl3yZAW)jcvesp?|oXbdCoDnOCxj+?P4{$^3r7PTJasY@boJPY)Mu zpKolV(=U0uXZ3-@$@Up|?YZG(9J-B!ugN%UY;3)Kq^I;NuD%WaV|U`; z>H9}R6ELoSHq~}5fPh&3SLplyOxv$HU$A0!->8HumO`^SO|TMEjN-v}yB|`3IV%d8_)U;k?-IDtBkm|&y4N5Hx2*N`m>%70n^_aTcjz5taYVacY zp>}Vs-&{3eB0wgbgcYUfl-KzY({fIKgB8#g|Jds5GjT{8uX3kv&{E;}t_C z0ya>*cT=hVEjUd1aTV(XX6+2}grb(9p@6^zeho2Scjkd? z)fx0Std-H}EG;wRHX#c!t`~2I^xKkFixrkAw2t5fQ{}L<5el3`M5by-RAnlv@M38d zZ&yH^z2j1aPX5`|A+Cu@aLPJkqk3A#`hBp=$cS`J)e$!D?gBWD>=fK6iSu^LF~1b& zn>H2yqaP@OzBuZRzV45K2p=_CQSll~zvg)B4QInz)d}?3rc5Dl41C`(EU`~HW>@j-K| z$Dz#tsLo(*)7sp+qy}{FtEGmd2EFICv9}EZALnU)@27(}13o?hE`AdNpGp0n-N%@u zha?2~y9>GJ^D_+V^A3tKhfC&bPz8{JVdz&vV_#(ImuNXH;^e+!05TK7tB5}k{J`8I zo)dfIE-}%X%w$pogJc(osn_3x2!<3R=u92++OUbO>%HaWz9y)5;cdZUlWDS`gOI|w zD25hiKn7pYV*Ss46a#l&Ue`%Bg+1k{r%u2?y_A|u?)Jup2fzPM7t5*p{_zL}Z*G<& z-d$zx2;Qg55k&V%|HCaEbhdA59!2U5Hu-gM(gfE>EYN`czC_`Wv*4#A8)Z;%M`F++ zWgyj%3YWy3n(+~uLQ+1)uRnptJ1F|QvtL|NzgTL=jR?A`1tnmOc=LX}5g%w~nw*5z(_l%H= zdjj|%+Y{9|^xD&Vsd%^@@d&U)|3tSmsopGK$?2*wJ!5H4yV2ntJA&%2tp|7Yq#I3u zzL47C2*kA^wJGZv#AhU=aF85uM0fWa{?-NWnlXq61mU97u|04%NS+8W7cTs{DO7h5 zlhV%0`SW-&DUPM#M^~%pe7(%hIewayXtyPT0ZS zH#n@A%{Xr&jQCx?K3{(5M(=H$LjTB59lS<9sz zPYTt#f&JGmf|hrOa+U#J#l)pqGm9%|pGWtZBHXWx_oZt_e8o)J(${a5*myP4(SZbl zdvs~|xJkZ9Ci-(~{T4wSQTu@pMfKR01;ehBiw55!dO_56F9kwYrOlKo`&?& zud3+|y*BAe^#FX9^Q>2`z)%W;!=ll8&Q(w!Y0hbT;WK>})9yYp^c0rZ-Xt;$y||)p zGj6te@jU;af8*KL`zxjF9uD@sjvS39Gl786rP0hX+8Uh6LL)URKRBfdi;rmI7^GV* z()=c6o%m!id_Z?liPj&$ltCs(ZkV<=%o@0;X2Ha|up?tb^g$N5k@;oW-AP6?p#Tt2 z=B0op-hy#p8pA&ZCTcY68x^+PjX-P|R&wNpR?NF4t$HdG(8_wTz|cB{6k$MII^B;(`x!NNW~E2tSUX;%5Q4sZrOC)bo9{&o@2EGz=P08ArhK(lHr&i0i+(+czrfuzBG0=B@ zEZjgnSZ|~Tx5om4qr4y6FfR%i9@^B3==2Vv9HW44BqOHK{BrKaj=!nRdol>Kn$vw} zhNNbLSri~8U)iWyxK!P+zFGE^y@U)1(_EyTvfeF|S+H3y&VHGI8~ z>c5cgW_zOyo~KDY$y~w zw?129s2YsXJ0|GWX&el2_^c8%1Ert9xWk^2(=W4}RDhabH!~s&l)A*#hLZ3Pl%|?q zyM_rv$-ZHLn@`R&rts)pu0}%PsxsSOnRDB#(I+0tMJt^@ zB0-XJ6W{|*EPV6cc=6?!*+ISFH%dTHmT{R`VA|np2eChn9==!a;sOMvWKY1Kcb?n#SPyg`p?)6mGr< zg8bec%|nM|wb=4&BOK9LTw4^|*Pk_v1PkX`FR1wj5ZDAxbeT8&z>4$8#i$P5t&It@ z2}+BVCD2Qz%oSuMVSvf$x|GE~#4QTG7wWIaKN3kpVAuF}eubP}G1|XyV=H>li$X_3NgwClE-*Srz15xD?{9HmMZ;q()Gh+YP zjtr&5KtgkD|7L8S9&_lbw_Qk#1}*GGVQPW%mc36c{c|`IAT^emj3P(A{yd7lbqG@I zY~`s*YpxSENa-7@bxSkSq{quxXrgmIY|0V3FgZkHO%_CLO(8>oiI0nGqUw_q#I$Z>2heZm@0mD9WsE?(^9KjVTf#iJ zu&446w9h^DhQu9OB}*$Ip~kaD%&e+8O1!)~zwbUAg2$6-%Ao5~M#u!}sI$P~_Xlbh z8AZo6A19Mz$zbqa1FzI#^jJCJsi7egg9sZHne>)Z!PeSweU2$Walf#DXp8#k4(dvR zg`zR#&$u*vozA4H*1_PwDnf{`+9_4qbLmI_5nnrY zh})fy&kViCeXJk`cJ(nV@klI@{FzU95z9cb2WONY*lVwn2Q15?NcNF%j{3BK>N3Xw z)K*{t&s|U!zc-$8m*i&}wZycKLhQ%onZ+}C(tUWIw1zZBGN>i>_#>HNRn$X#AP(%d z#aT;8@#W1GUmZUg-)|&WH9ZFOaB;#rtnL1cr4^_7vNj>p9pN+$=v zTAW@SK4KXC{>3?x#w}bPyQE$K%m*hDeyvzH>4Y9(4i<&5VfgT z6BEkcIG2$r+Z$G2=W_p#N78HFhSDCX+A`d;uoBivBQsP;d7?f%PSgVY{B|KRrx%>W zn*1e-O!V~m;_@*JCb9b;60s>=BYuM|*WAoX>*uT`)pA# z#4~;oc9Wn`^I3hsbeaBiy-ownuM#?fTS~IH+2|Es3SW=)*GWb(&S6Y&@Qxc2yPw5i zfd}!+zq$B1{aYS&olbHVXu_KQ~ieA16NBr1uwp@U87Li)S_cP{Uke0rIp zm;4Gq=_p$dhfHKJcjdy~$nc>tcp$VUP#Qb4-+RzYpA`ej5XkD$KGb0|ug3kmJZM4y z;yk$mEC9ZO5YfpB0C?BJ!=cMp;Uq?BWT6#sg?xmrv4A%8M=dd@2m`01SH zAU9=$)2XD`UwnCRi=%eKFUIB>>IqF5VQ4=DpU z#ZBD_8duHO-fbLmQKi@a7D=wR))QYOQtsFRaQXkC`!eNLj0l?W%EtYum=d-RL`)pl zkVyL!e~UjCzwuGw2hQnZSnxuV%N#3|G_=!mrh8v|2|1j{xozy2(O}@o@mhNZV9?zi z<7wpGjPW+lTQni$bYMIhtJKptZ?!#`id8IKwws`{Pp017aXeOjx@+`xXb&yvk>p8t z%{I@kZ2MgtDKKj*U-tDwq^xi9??&F>)1U;us24x7N};{y62BrHBAA6nFn822HSVAN z5;|cij_cvg=Fl-|6kCQ7zYM8>4og$w-Ry*>PN~K2L|7b_C>k1hy&aGg1U)#y7(&^A`|oP8Bjf zK$d+Gp3dvyyfm5BGg2y~b(uP%)e*?Ai6X9e1r_a?XE6(~freS!!mjCNZB>MbGg`a} zJE&8$frg?)lzt>+Q9=(5pO_!EwB1JoZ(F50f#;)rZy8&0SaX)MhHPdsuid&&@4=p$o19%8W7Pej zsNZGA1E>tO|FWDg(svW4g0>1pcfxRk4dK|_+>T*``NZ4#LYk}{!tRMGd2LUyo6a@f zU_lo8Uc0l7G|y%(yLPLO$CqOCm0LyTS&sYCv*y2uv7cjUbYWoAdKFG$1371xz?7@- zSe>SSEu}HTKNhhQN+1IKiIyvO$e6t*iNNicFj%;!T#i>$8h<$XqneNcpq~yUR&Y;s zI%5g^m^kR?D}?uN2lK16(y1$S{M$-Ei+u*6iye54Ch)9wsW>%j_wCvs=xm$IP8bzF z>6x1r_tZdaE3Obh%1HMyD@k%fM4iRNn20bIph1|EyPzoVf=2cjta43- zpnX02z{6>cK?%7ShrE@xMXuBUt#fPdMSSKiJwwVyY#js~&9Czw`;`}s`wjXZOyvLE zkIeMH!bGYG%hEB^GySLDX!NlE+D^^!zhmy7Hg#v$|77%k?9t}`-#2RFU}xuG|KDx@ zI}>Z|1!~_94+I3>2Lz<^e{5SsL{-J$pTR)I#L~>pNY263&DQK+F#W6j{z^~FW1k(> zZ>Co9xAlyaq~y9hx!t^o)N%4cvK8prJ*6$MeHUXYADr(g!-dX|=FO6E!*IOjD!HRM zu+BwFw}Qre*L=&4@4fDQLdYic=Y@8WpE}883&_S@*h%^pD&z5_nTrIrJd4(sj(9Qh%NUUSmY0O zSTW(i8A(KB1}LmL5CNDRKioc04RgU$M$<_Xzrl;*iS*H`hwc^ot%Se>=7i8IM=XSK z7N$w5(4ufK6oNrU=V3Qt zQ71R8R!NRA^h*9;##$IkHOJ}Nw|R+EOmAwDN!cqiqbG=hgMf;aCWdaLIX-SOKg5Le z23FsGel1&Eq2C3D+pBKn4iTpSKP!5-`!H$JQwh|5l`5D|>`_JSXry6us^~&XA2%=V z4B2y4)K>i90TsQG1#d*VGH(x%5cxvhclra|;wK_^VMJ$t=~GWQB};NJBj3#C1t*TS`tU=I1#zD8q}=EutrJU?0|!Y- zStNl(&N&kjr0Jy++SU4Ljfm28r)+@;e~G%z(i7-e8zjaQ0`WwG$edglCgxi5T78Gi z?0YHsd+Mvg4OaGNdm`@;8ZbX?>VTUHX?Xq`_ckYQEd9O;FD5|4oA0QZa$Oq>IjuRd zu!vdM@o!H<%ZkICa~v&%f5Hs=o?14SC-ExD(o6*sOOu2Lr$|aO)}bYE0cYp}6>bYb zHQ{Kl@eQwl9b@w5r;Jgp&4tDNu)4)T;N3pgtGSfZe#oyjd|@!Chu+#C1Oq znO|*WjZE9!zzM`SD4c9pMXePg;Xv#)qOD#+3_{GI6Vyg|U1%E1!jyS1p32p=Y>!f} zh;39Brv_EaDaEiWYGZbpJwC3rOIjgxSRo5MztavD41j`(##2S?k*$bA71KhdbHWL6 zr6)rF1>`Fr$;WV=*+5n}z76p2%?9qN;OoNE6ya<$avKTeJ90s9cJz z<=^C@EW7J=cEQVb@iN-d!*27<1^rMNjyQw@5i{FxjjW61rqRE8>$4v}zVjv{wds$1 z>OSMQg~R2LKe^xpX(CIZyMqxE=g^S#;F>B>mv=eP?o&Bu`gt)lM?*g|;U|RDe1Ky1 zjst&T!Xzh*Oyf;z;-`yk(vNJ8c?;I zh^_T^O+#3i_7D{?;Yz+4vHJ!Pm||OS4W7(|KxvGTc7pwu13fF&e^1hwp4HcNTv&no zeZ0$PZOEOVJ1e=lkDe@HozBQ`WN8Yn@+8v}|H`z%DK>-OtY2F!uii5@au_p_XVQqu zhOnWE{FJanylPG-N5jur0aOK8H`}tGCe6>J56qFadYLLw1#2u%!ljt82J!&WxhT^=E%zyHtay(FPh1 z(E;XeIXo1VoX;pt%sc44c0Bq$HI)-M;RMbXcPR;7tzp}&3PplncElgD6{KAD&6gENO=+!r1cMo z#p#aj^&!JTPab-FT}|p0p-zvk%PKM zREWK4Zo)%{hu7$gDH$xwx%~W3FbFz(HWoemN7WC}HE#a6*)gF=?aDlKXMSk) zajstw31a9(MfB~ytVm3>YZ&QuA0y+#IN?mbAWDbRI>wsx$GlnvkM1vg0Ycwp8 z@YJ2)NV@hh8CKYxBApg?>Awbd19TTgw+L1$IZ8Hma)9fR8xksj2(|P2Koo2GTYYXb z)}gy;I@R7wU3E$@S5^a}H^7-_MGlm>{)Pc1s!F0mEpMaU3gj{;M&*I4Q&6xHKv*Ra zE|)<~#m&B3nf3Z;Q8Vt)++pFw<&dtKN~UU^U(p#9=`=q~09ON&G0G8S?s>quPSp)1 zw3H^K2VXXn_jG8gCe%}o34eG8q`F#lh>ONLo4$hjOba@R<%>*~%+rRoxXwZ(_tZDs zc}fWBt&^lg;CI+iq_|E>HgKWFSc$M$-a13{S6n)Yr})*7V3@xqb0x5tz6PaH%H0B= z^GvY&jV$V9M3~`m1?qNi!uk+_QfU3T^{uTkaD6(5>z&nhIBe`Hz_l93%%a}cLzVD7 zVnQKhH%7%*=a1@54|UcU)ZcA0WM)0<5t6n_`jZ~lb8={cx{x}I>R;P{Z*x`2UGbb3 zh~dk|*LW25#0(B7Xqrr?b2e2W^&s) zga5c!tMjf12{-FLO_5_C@t}MAT?om4P0?*kn`l%JR3he#kWcw6-RmuJUan%!$}`^@ z=yi;UzsUpi!QoxVF;=6|#6S8@`+3`6hNJ*QvXOWBrPqJ8Z*2Ic_drcmg4HFx=SLorU(%UW-zA02&P zKMmeKLkXiKk-R|*vdGEr>Hk^5!#be9xv<CH)tV-!*9ZtK7EBuO8{aX@?>q?nrAbNe?|He|bZtmA07!aZ*<-x*KFHSfc~T3J9=RBnF04F{&yaV2GsZUyd0+~|CE-O9Pku3^rcA+2LcOW2umiwY6lDei%*hv(o7*OStj&T z+SJR3DTq>xhEK3dGZGD(O`(^Lu#^T5Sc4vdGjx4X;JqD?!0=#-cj@W~$G`bYV|Ac> zL|9yyjFaQ=4Hl|`W&2M-a&8O`@jNmA>k@ijwwl3sqe9BR5ZM7JfkMJW@4VB80lzNV zyQ{Ue5{V0?|Ha!W#p0meHOdbg8D`|z;d#+;+80`3WpET*{~O9b#l{0?&&PpxnL*~H zt{eU;#aY|HIR0|LFVKkHMUsxSZYGCYk(i7aE~r{Y zH(V;{jsYqlJ>=A&Uoe~r$VkYc-`G%(DXP(&U-2KEA+UU@kn)Z-x25|DZS2eJOQU%COglUONi zbV3l8`}ALodZzsQ9_iMT!q*9jey6-`+%JUxpbq}Mbk?WDLL1Ts0{TV*12XwPE}j3y zCy4x8g)U@a;cRAM3?tG_vxy_&gZ+7qD8r@v_3% zf4A1R>PakHWErF;0}X~_1jJL8^=-B3QUbXqqh$cKO{vl)%4Z7<`s{C)5h-XGLlzV_ zJrCPs(P$N;o^{`shkM`mS8?*)ub)i{2L2ycE9MOX<{G?aVng*>bmmVaS-v!)(7(B8 zvW)fA*d|=qb^iIulq+ker>i`PSZ2H`v+J%}bMj^p@h z-e7Bn0lgusV{L7!^5O04^BC>3Jv*oSU8>%X$KUOHIojz}9y+F-t^i+CGd5QUK@Kx6hY%M`+;rkr0s>9HZHl$IY|YN#?U%5(q_H`PLRI5Ne&!b?E%k+Etk>eQ}( z@LG-axfuy^GP*&K-D`14@DOOW3fUcec?QL4{&QK(R+=l2d~g=@vhDq|MNnIdj_itH zq8Pyo(4{!~zW_Es$-kP_uMiPNH#^p6ST3c~C5V%Awo013{_NzpCdmPrW!|mF=KZ@r{C>Rj_UtYbvpBW1H4nUv0+bX4M z7gMB3{Z3Ld~{3*#v1~1~B zvn}*yQ_@TaM7&MXUz4@%aP`xppOKZPzcyR4lKhbDwt^Qm1)$Z~q~L)cyR$s0Dl6QE zQcHhkkl$~(+3%f;w84ZswqhkHz_wxg38PKC2NLRER2H#E_XnIiCAK3lyaa_sK~Xu+ zAjLM4!LcdRn-5w06Ax*=lg$r^@^%o*R#~v} ziMtW9C(&n=phhYo+)qCyE9V`_N5rq;|I>#JFKzWCUzavIpYvQiqZV-Xn3P&r^~vKx z3v;t<(JbXY5tnMv!EM|1=%bC8*PzKmS3NOU_*DnrmaXo*Ej_x=ft<4({w{Z+3!X#5 zPHd|-_}fRXf%%&9Eowp6pr3&nyt@~5k{g%~aSUs_Ws!15BHXc*VXFkPyZ*H#udcOQ z)3E7f*+aAs%Y4VyP2L#_lHxTOEXaNGat1xR7Nu=INAhSy1H($#j{`?!gV_0g&EP)< zr9&MBt3zit}AuPp*wMnteZiG6T*ARV5c%CeI4w?#u zzVr-MENB{rMhBL`YWoXw8=DS!e1n5nxV?c9!%EXng9MKb>*wz&K*J2anvmvmjo%{r zwEmZ@U@H)oAPpx=rZ0J(->j|@{MOeZ&jN%SLfnfWHuz{)Gj()d#k8N@sS(384}IcG zQ8d+UvO`j*Lln(xE&dY5dip3C?XNMGCIc&v-a%VVM;x6poxHXU`UyS_&{UAAs=6Bv zY4)<1d(y^XcdQJuP)N>b>uzTcN0>fufXh#X)V2{$+(>}?%1+AzoTTJ{R)Ql^*k4$hod zdUD#R(g!=go843MK4YaGnzqo6G+I`d^Jb;2sHlODTE6zPdCreV zo@cPURD4~u^2sSYg8-JuBe8EWl_5-fN8W2tAC9utY;$6LGg~%k~9j-G*1h{ zr+>sopI1f~W4}c<$^eU8P0@z3L~nqtA|#RLLkg+JQBwUX+51Ef0C_+bSqyEIlB|Z{ z)e>^bGB$lFkDC7~rwGs>fK%i=!-iQrcDMA4N3V@MKuG-*n=IXkfFb zL8p|O8#K^JcH$b9y?!nIIu^58e~1vwz z29GEs+Xe|fGYg}B`z%BXf$*>%7E}-dNsWg#=z-YUR2-NGL!Jp65j4l> zdYhl))dmAT?-)D{(bM3m^1c!^p{2$`I+egt{Y(ZWd%k9yC5#@ho;ittzsAKtQOm5N$?NEV2N@WW?Z#B$8Dx_hK9^sJ=4T?SBfK4-oxc(VdXWD2H zeQX;#FU66pfqE#o0_f7l*|%_@0KcQ{y%q_rxjm?U@&wQdJWceOo&7y}YG<+qP7B2x zI4u-2p_o*FPD(nOmylFh3A$GS1y57O9xzQ6W3=ls0D&$l%NnE@orA$jfZJI6F{@TQTG!M@#dhDC^UY;Cc8S2cAN8_JCOgb{Ty82gVghL z^d4BPCMQRt!xF zA$FvT%@U4gb{9n^w45>QisUmWE;bD03J8NJ&*}?(Bn3VcsdkOLX7!`4&*2OnRov!6 z%E>F-oh#14gdFbe1E+3WQ>vU!@;G+C74)KjzSzMDX2%%r$X=#!mHP*kX6| zl0*9F;Cx9ou%{y06V{_eXf~Wo>#(o@LAA(89dLIE#J)&*3PG3@$drM zree+Rod1@ijXQ8%ykN@)ZDtiKUB_Y0fIZE{i@c4L_vV93@SYDZa4Xn?1r)*EiXW|J+%m*9Q) zD6gYOZBQ?B0efZi*asWFKYo{3d4Y zmfOn%TW1YXwGHbXd*W4FQ|PDpR|E{aWdssmIhfPRXP0pJqL^H|d? zlL|}a4V{$=1KJ7h)P!fof`?@F+C$DDCS6EQ9ilV{j=HXufwszfOLK!7iFgcDc3- zNSytNqbInQ$Bjrw^cj_%ym})Pb{YR`mSi_8V4v>Yrfyl)JF+n}hwA~TBmNG~-rzu3 zTJ>?5G_FU^H-Q_RR%ip9*)iuosM3|{<~K;pI|f=s;bL zJ+uoP%Y&6HhP4!_R-5$o^DAL%u`hAFJ}6y8uwRPi53-3`US(0YojgeLQHXjRAzC;< zaJ?;UmT2D&Gj{-t;DpPB#iDrN;k8=H;6!QvuI4a@|BX$>Sk;Leh>qql1|h4F2;ViJKe=^gnC7w2 z0Lyh!Bx@tAR$QM8?@t^(7)BoHaW(LTmsDRz_{ex$?W|vwqStygmM&g%%13m97n9p@!lbhxR& zpc2u(bC}n8+crTg7!2dEHz7uiVSOCk_?NXTo9l}~t|1Mr#^-j^x^G+W0^ z8@}f{!T9hS)(a}>5_}^|Uc-tQS z4?N0U^0eFFl52Y7-lS=RtrmK^b+f`&&xj2KL>kQvodO5?XrWyFCwmu4RW`^Xc_WXN zBQ`|}0E9yFE5o-|2sRiuc!o(f86}#va2bM!LCfar7Qv)U*|$oD{V0G^_D^;O5g>!KEUz4%H$U*-zYGE)Ur^)QiO}JP?QrGA%k}6H~5NF zbf~hM=ORFl2?~LubGew=?PGTXHAwVOT5ppaZrYPMMnMC>580CxSDqytU6>qz)1mcS z=DI3S{cvFJI0VDwZv$1cfPn;g2HSYYK4~8>IiwNz!by!T-A7``?62UzlHUbkdEpVjpY_>SFBhE84*CKV~ofd6R-ke_90hESb`A26cCM4=W4xr5$SWU0clXs z1ZM!cRDTHjK!T-tJ&&NX-Z6XyF3E!gLe!n{TLub2y$gtPsyS)CA5w8v%5!EA=$&WK zx=Efdp=k~f_@RNZ!)h>D0zK~FO+J|6=8ZwgJxmxMw=#e5t8eNpG0CKVjh-2+Oi|yP z-YHa1p51~8tf0KJsR0Qi&`3nu`h>pmbM97DGQ2L$sV1O-X)|bRd<(B! zl{YJxxS}kW8r}o)=s+(SnI#FZ7C=cuJOP1soA9uZ)tWbUK|z!<>_`H5EBF;^HU;)4 zE*d(!yaALxLhUdTlHd_GV)6@T1U^bpg@xG|tJ5izZrf}6glBWmR~6>&H%&F%H@P(b zjgxYH{nsK?3|wvZIpO*}5Jm3Nt21_c$kL}&5qw~yf*v4*PzGox`nz;5;qS5!Z`ya$ zr(C*kv2|SJBxN|HEce5dZr@Pb0=`K}Q)tt+BM zw0jgy^u6b9^G2J>0Eyzk$U6w>)%E4jL|;D+=^GksKZNsod2J+cGa;X;+|n5gHJDbs4#yqt9I63!tp}BkrJA8HKJV+HLGn+=|c_IhI`OnUJ0C_)Kg31e(Y zNP16P1skoNR4U+N;0^+fU8E+Xz?kdqVJj!BwXt}RRxeQjZjBxi0vuL(Z;d7Q~vle0{B zv5muIfco??JeIbMwy zoCm(?kF12x@hdn7lSSf0J^_L-wD$`atOyZpdVY{ZVv|@VZ{!)a#FBx4?)fGpHVT90pd?VN)*%!^v2zqTGva-qf!DL+FV|L|nMSth|D zL?t)LyHkMlY{Z%V=^@CPCBfUIfD-)}CSXK`Lj(R$-K<#>+jjwRh%<#d)hC-y4eHSS zR3V!^>NX`K|i)55$v z*pu+Wyhz@^D`DuK7bO(p#3+Wqq>k+lgb*4|m#C0K`g5di1{xElE}0rcc;_81zny_R zS_^wE+L1=DMnld>pIe2HHx-;cO?Ej3=6Mmp3@VOw+kTpUqi%4U(Dx!C=4+O@N>-E6hA-2O>|35H!i1Vm0M3^(Dj9qrmNZo-HoE$V^_dz1mUzM?S8O0#D z1iu&ZRsL}QMKa|~<(DTu4#Uy>*j?c2bC#fYX^0U}K}8(=YP(9-xf7C~OkNhLk=nWxKQ<>sW5m8ff>er`_AOG3xZkKDR zo^MfL9*oNp98wgG=@TD54i5MSYKl@nQkZ+e9{l)H2ea={N$xInJRD!-10YhrPE!3O zM8@$y4riD+dX-=D@UV9P!`~&f+XVD2twP3*0SNR7W#j$fsNaS zEd4NH^eutDXU{o9OWyX#OZ~x*{)=%gdiN-qhDrC^~Ss+c-IRJ5hh zk?hu1d3l8U@sohAoi5|P? zA9zu8VgP8GX8?d7c>RbDT#!A`vJMF7u0Or;;Ne%=h{K3@`$mqV-0<*PJl#M#Rnuh+G;wZ~+D6Z{rO^&2I~VJW6%s01f@YzaVCEj1p$^in!ws(6Gm$^dk|?PFN8NC>DqIQyuwq08G+|* zze69u9k+_b;w5&uy5jwA9an}9ftt>U?NtC8ypcG$kYvgV#Rdj2{!J~5JO94ek^@#+ zCac&Lz0$#;4F0RY~S>ESutKxo=w>2JF=lqRW8;9F6SS3q5uE{KHxbem7k1 zNiU^?Jm?|}L|lBibu3=p$Q1hOLXQ%%BA#wgz{U6emtasqEDBXgKfE9xhp&h>9vw`A zGJ?4Q4_Zm8468%S&zNXj1E@CI#VW#p)P9R$YWWDH=XMJ|3V2c;z0bA>u4M89TBjZG zn#>F(>pU;;Jp~C&WiFGrDwZUf4Gy0#onA z=)69PumDi)4|x=9>t%Nw_zQf_pcLRAf6mZ@;D6FhdRRW(&3%U_%4g7gT&Pdmi@FYFqF!W{+lf3ox)MJ&_J za+3K76DBZN0C6|aO&k(!TrGEicABpRw8rCxX7M=6m>OJ{{l6%WSK?XSGCGdR3_hN} zGs10>#5+z&m5Jvl*p~tgxXo5yhN0Xy!bTlu)J-8BmZ*S}zR0I*4uIZ&cl_U&2k{~d zgFLn#0E=7lp)GphA}3o&4kLSnq@-+b&r;b~O2@78w3wequQddJI$EX8dlN^1cD^`A z0PoMFkaKJL`Al&(?0>R)eATggbogI1@ZaoR>vrQb5PlV20p6hWvJ`qdX_w1S#a2?C zb)+20E-g>bj3nDhX&Ni~+!!c-*v+QzG z>`O!oNxukn;YQYfQe6)MidTy}{_URmcHL*920&7@K-m`zR_MBnkf%{$B@(Fe|EPi>V7V`9^sAOn6fB|h!Q(KpiZ@2KfW76}uccb|dSTV1V9^(%4 zt5yJIiMdE0Fc?T>YH4iYE_Gq~-*JfnF`Vna1xGZ+oJT-y%gAHqA69MV3B_0PNmhUx z^{HSXJmd&gr>ly(Y9dspu}S?Iwg{j2%VyV?ne1VzWiyz?3-BG4=hQbq_?V@ zp5Y78hVWq^<=fyN82AFJ^V}3l>E)*(b~xy9Z$9uWV1n$3Ge8($zarcn-b(~@T|KDb zj+6Ilqk}z&A*@Bi(1x`z$MMFKv<11t?kq9SG%gtudhH0rjS;Fk=;BS?Z!wb1a$G5n zQL+GsQrcJ+HI1{_lLKls_76}1AY}wmca-Ep)!lo(F`F`zx^WGFc7$g#B=n%(E<*3L zHc|qpj_PIYu3FmpG%7Xe4$b!n{Ie_;~| z+?Y0VhYqST<>xlAw zD~Bxhs>n__N{M^#MqzQwNjv~3ynRI57P+PVlI~45etj?OVa2d6o9rFxd6$|Ih1tMHgSL%I zX0(PRi*#VQy~qeCNz;RHls@5cD8hZq<>-mlji^qZq!mk8{<^PaVCqnS-sEeC6QV%z zn!>2L_Bc0o965VX

pyb*T`-;G_Sg^1L&ZkC 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%0A8&Bf%YPQpm3fLVA*!Hw$iz z6XAHtZe8H5uxYSVsxg}a!7T{kHm5jyG7UdmMPUqg5xYCH&9n$Zn_DJ^J*|rC8eC*6 z79oWxX@b1krJpi0ma((ZUC>()bLe!mUt~X$JBnfH%+I@`({`kNc>(PbCwjEWYqmju zRJ`b9u9!N=n|Az@5L{xV$9S5NTuvJ+QIrZCGtBHEXOo{uCc;4m(JtvUSS zJPK1`2dY^NgT7Xk1fT1=BZRgClHuRdJL9l3Sk94w=n0oOz|;l-5wi*wQQn}YmaDZb z)lcmArXvk!<_lfl2c>FPLi{WAnaOCYVny;OK{gs;!S1>(Fw)ZlTwSGdSSXJ=nZ2!V zFvRiGR_+4g_F|cxa~RR6mF(tQouRW^KWCzz%{2DL?|k(_ji`he+rSg8t<^$-i6ixW z>4k!n<=}Fv8;33yWcd0paTk5EmXV7`7FRI~-g(lkDW+>*qseeCsBRLqsQ*MEq!>2{ z3xK*n$2@p)8M6E(9I5e^O|$h12dE}1GdcxwFJWE#Y&D!Mnf2iQW`7dy&}E! zF`29`@W)Smsh+wV@?s2Q9x{PD=L{kW48u;uA*zV@ewcFi25SzjTWw-SHcK0`mdBD5 zAoT1yka(3*J#7gxYLIf#-!dS}@1pxc;-C%ca}(0odqQW4XwqZ)QXI^}fHq5WE9*BO zmY0qeC-{%nOZcN?G6rdne_T{ZC$;vEmeLRZSU!{cD#nzDMe9!>labNluYX|h1m~%- zIsM4d)hcS@P)#eg$-L+)6k4qKj#}^_rlMean{#QJba%* zVy)uL`fpcT*~p$|z6@g^<@)*J*s0)o2VZCk$uaz738h)ak?03?NG~cY%Gdb{I;6?` zM1r`dhR&BYg?^P*Bbg|f)JwVIa@cB$Od4|bn9kBaOFmu1S4~wNTz*53f1%{+cJNG& zeWB65iN(w_eg|uNGeFD1?W2#$H1M?!goZ@?YCMgs=in#Xw&??4KQpO_#YSpO{jL1? zgHT(pEV7$(GUyOmik{dwM@ND5h>UcsHd-EZQ?IR#%EQ`tH9DpN(6uX<;c856p4YT1 zVFra%CA4j9n{Eb=fMDSpPfVsP0}4&(q{u88thABmDa7K^Fm-COQOn&f-a1i|_H2&f z6SEpgqplvKby@8JvZqv-^Qc_jlB;a!DOgX>AgG_#OYU0PGi#Ny20N*qkO>DdR#kJ1 z9;4b=U?+Q$1Gu}ak~2RTfDI5b+8$#`ld`FRzv@|F`%>+u-h86@=@M@mIH#HvW1$0* zLGuUD=d*SUT1U?4U2;4UwA9{mhPySSn@*&`XoMbtn7*=-yZlL*wEUK=O7Cq4CIS_- zO_T>ev6482Rw9H2eE)Pns-ADm|2^f!7Tu-t*Tsu@%XZ&*>a`wN&tibJi9t+aoud#R zW4dA|j!I`n^F_{t+!pX>EGQdoE#X}U^qf6*Dwi7#L4wrzBwPLw^T@EfP&xK4D z#T?>fCT|U`!uE0oC&NawLyw@!J6;ori95%$qB~DN%Gvb~R_4@7BUyoxe7}TQpq!2u z%`UV4^Rucg11WME=w+xsVZb@ZG59w%n9WVzOQsX$s-|iom9wn+{OFv2n@h6 zSB$7QP52%Ax6F8CMnfrB?OTg3W0bH|7i1@xf^0Bnwt`rwaW=P%Uf8u$D=3mw`({g7 zAKSqGAnq2`!DyEXmbZECYw{5`I8)nHvh{lq^V@xF7HrX!k(w&mWIGMK1v$^o&lzvIO#XpIeRGdbkn7k;p)dtzNIbguk|;-)FYC@3f~G83tZ)ZuXX8%T^!#|<|Fz%j{JO0&P<;AV2Kof zwET2>#41PBe&&VFm#w(=(pusC(e`=MY}?AZ?_DJ7icAH-VIj1H9p-o8C)TixP2{l6 zBeAb{`4^66p+L7cI`v@kdxjtxj8>? z{21mzoN?)EWU6-M73vtHWrq07>D-Qn$Z@Bih~UmNReaA)^+w2n(@StcdXkicsqBtt zHi;aaBt&|N1!=t!j#3By_x8og5r|+sq3R?elAOCxz9bVCAl@4>cuswqaj`C(l&F($ zQv$Xhrht;<7#vF{0VfqUSEpz3>Pfz2zNaD z*u@pPW$sSdv8|Zsl060N@x0M#N0KCA9z!?EaO#$|XoNL9!(~J>fdt$M;c|dqSO;OD zT$a*&mQ4Fb+8Yu3Uti`LMiUry z=&*^5Oi{EDqblI9e>1>TScR}{Sd7i#2_K!@5AXt?4cJ<4@Py#k!NYUh=w>w*LF3(* z+1l6Gnkm*Do|-ZwKNlcBKejI__|U;RnG?AR+m4!dAguds>G=oBiXf3O`gu>nZKUA1 zZx}W&LsOZ*y65(7*!@2vuHGJ zvuf-EG_0C)F}Bu)8mwGl)?u3Wvv%sBB`*nLWnt642sxQ|g|5eSh1XgP(4KsJ#wk1* z>WzU8A6qfszC675ysas>m2$jt8M}11;XCC{#iK@vT?B=NE04ZIdqpc!@~?gw23iB; z{M4Mx!D;f!k-StgN3E5_m^@-$X`9pIof5HmC>QBql{4R)qsI@K>CK3cbQ+t*NDvjx z+dQoWpBh)isiY;Huj-T`)1gj56Zi!;Gy0E!DtN`!szjnQR$hohD|r<$2PGjDr4kjL z4LvnxBxnjS)GiJ%^oyO${nSn6+3ojHST;+udml9yg?=-KMqFJu8L#SbfYu9`Ldfck zU2%`yBuYL1Tpj!8UlJPfV!kK|^KmI)TrGfMHWn=6IEWa!0-wyIT5(1E5z+&j*JSR{6A}x7n4l=8KbPl(R)=V!p>F9=c~}l8z-!htN^_It^u3EC=Mme?^Kwh10 z*siMvoDarW@ao}b8@n^m?d?-?2~CYHm@lf|tt>01+Yw;s3n~`N>%`$s$JSK6N&%)A zT|6|OZJ3uI#rCc|>g|}5W|^b#WM?{BB%l)->@ZPRktB=tTdpEVr#w zy^kzBR10+Ak)^mYXfDrrF>TQ!Q0-MvE+)GZ3#1TVY8u;#>oyTcQ!8!ge|3O zcb?=~x8caI*!?YE;LeXlievi`{-#qwmI*etl38I=OCOu8 z`iAuBi@xUSR?~`kjUmmsOFJ-})~)6|p&B<{&4c_n&6kyz0d$5r`Y()}ngpXx3v`>p z6L=Nk0?R^wf&u(&9`W1HXV)l)O83QoVl=5~-bWD`RSm@p>^6Birc^zMnlSA%I)Ffh z$@(Ve^OXzIm(jdbxS%$;gc_1B2@%~@Z&_U8%SXfQmEu1ABu^*N2%bo(@bzkP7AZN# zlL$1Lr6o^GGoRp{xr%?{8_XQx%=)c9?25#m4zK-)jW#|bm}0#H{8WbeId$aZGqNAG zS%y2Wn!d$f6g@ru5ru~{0enUVla0Av*+gN~*0iAQG5yz7U-{4qnC@=VWl7ea@^~YG z88gKaae;{{mExFg{{7Dsk@Bm{hK44}c~R6wbkP}bUOyJItj#+lKL%?PVcULK4D`q| zCouAmoT)N;9_?zmFe&!)1T{CZb*@P>?BYv{2yS*wF+p8JakXJsF^!}Sg7e3@3;Bhp z;bLfr`OaO*HpwmQ7-3wrmXq-1j7XU>FLwUlTYxz(! zyBgW86J}TEVAQ!ATBS*RrdQq~wNo|HnkpYH#$_TE?zc6$%dipo*(I!RcYFrQah z@Nj(VkqZOY6gWa#sm$3a^?Rj^7qKh$9QMRI!7ShX1O1iTDJjg0<|$3Cw$p3l=fzK_ zyZK{F_bDl2c8*{Vg34%gp+kz8EPBD#&}SK9dsORI8u!aJ%PUqmSs!T?=tN68Z7VGE z)rXr@?FKLw)e51}DMuaZ4>u`hVxQ$hQE3uF z)1D_bI;#O&Z_0Icv7tkuo{dGi@Y3i_*ef^72?gw@e5_&2i=c8TXP<1zyKW+DCZ z19Rm{%MRSh4x|Mu-Iw{hN0&U}kL}Y%8xvO`Fq*z9*eq}pJA$U8ka$vhHL)d2Bd=5- zuXf}!EllUw;bA*n5g&1mYkQh}XY(shk|XdJIx(4$i#E%894@q6>H#k(4)Yd7@?_#szH_a=rAqkpb+lL^Cdj*e z+$5eChduZ*L(ISr{yjlwaO`gF*|fzuZGLA0eIK<}MOi%xFDkE|@{cl&VN|jXCrrtO z;Ipl=?J41Eao_T9K5WkRd`>SWtNV4t+C0ELwvE4xw$3pkduWHBZ1?lN5nOONowf#i zgVPIEE{t>hIWgAW{-Z#7(f~t_79$I3t66xVc~moQ7MuYSX56Zy9vupPcW|XI#Zj2L zs#31~B2T(~m+9nE?vvg|LgFx8JdXaJGMrB)8L z?(2DoLC--;7&DP%mpBq?9Y<`yq#M}?U~%wNqS$P|_zX^skmP3G#Q2`9 z@r<_k?~+io2wh2 z0Tmp*)G@BQHr{S97mc<3bJouyxwJ|;AOFH?dShL`eOpTl6BHtcXY^L(RMscb{**Mi zXv5mY)^DVu1me7z}jQ)H`jKdv|eM*D^-mjv1in%749!n zuR{ye9?XAkgIT$J!D`xeIY{)BrFwZ2`x|#goGpmib3bc7uhy*8P~oT1nqtwTsvT4v zkR8Mw7#)lqPdo5CP&>55--w$AbNUJR@%Rb*arp83aSKFC`btJia%F{Ohh~TChv z)qGk16dfNO6_zwo|L;_Ch;meNkaEOw7;=nqPvr>nxTT{z z5hJvSNhGDSa>e8_ia4~wJ2Rp4VIbPs9})Mt!a}P8e+}{_lg@L|Z!u;ud$DSB7^m7yS3Dz`~lSlIVo&V81lEnv(XC_Hibo0NY;u27+G*(wK!9^2opLx^2+U-yT29 zxUQ^<)qmSF@<-Q|b3ZUrx zRFu2L2L0@c5>KmqzX~i&@EbJ{6Zx)B*A{&di%~|~IF`u{`j_IE8^!E5_7RS{vCm(9 zK)=QK!&<+3^c&Q*?K*!itBOhTtADp{2><1VJEeXPl}0>JYDVy_7Q_ZL8RsqvZftei z7WJEJm)^C7-zfK&4}Vd~M7l!X1_xnEaM**Ufj+r0E3iM$+NR@uEl_Pt*+Z|lB~^z5 zi@I7=%=VcI>sTH-{#BIK1Q=F{0o!7?HujWw1N78fjbA-2&(rHjg_mx#^9Xgj_Vl(X zp6hJnU#{%MypGTK2X-M$IRNq@A1(lc10W3yTFWiOxhti|75Rd$!N5?1g+9FaOR*xg zS>5+JdM1#}!6MQ}tl2jmcHsbjIybAu0QXx@P-~zdUIvgqVkHJfqiX&88`5tp_PehoEjG6D{W#O%Kz?*#G#zzd)e+` z?-_TIgh<`DsUFr7YH6c-(q$g2FRaE8e%+o8L zfPynagS8StFJF`o6hk%Ey=??6yD*Xcyt3kxwQOxe?VI0?40uy`qe0$P=F+T3l@?>r z>PH-O74(pYO9(M$$@J744D1cddDJnoq%4{cqe+@b3&&V7GUYiQOw*r2spTxVN})2i zC<3zkmqK{aq84_sa7-fr0Hvc`w?YQGGgC`WofWa<(^oytPI$1TIh|TC2A0{lq&Rhq zfS~ojPI{reOBB|F?qR%P41UEUe`2ZNl)j9GT`gM1q2wl+1=B+-%hR`v7jIzO#6sjP zPuIIvP0_Uo8HZ8~GLBaJ0$^qO=b6lGEs(MF`{!d<;Xg9_7g-|UB!@?>^uHp0pMs55 z=L>7noP?fsr9|tS=Iq?+eee@~f`n+cKZ=$n=5!+?!C5{{#umJd+1$;!`*E$i#@n?Y zOFOb-8x`;T#z5KD4l`Mg^;CP>`ufrHlTqtnOk&K$sw)`S@VQX)eAmV z%K=JlbjaY4)Si0*IxRBY8O}fSeu&xDi^11BKLUm0;s&EvWCzsRD4D7tOg-Ld`9Nhd z$P(R?x^>}xB~qIRU~l{3J)L_-(4h>Vo+bsXYCBEK#GK0lKC_PWUcB2)Sk-EA5vSNV znND*tX4}Y#b99iG-ohD=y95vJb=h`11$7uGIN5L+XOjW2oovj<0-T*TCfO3M8lomy z&pu8&90{%GpJ~GZHe4VM7%(mX$9CmgW7{I)WvyT9= zN&@0BS_0hhaEB@z3)1FBalP}=P(fHM1VZ2ZR2urE+7M7S(2kt=kJ6bX*=SmRYk zPPZFt*%Ud9dl-^9d~yoQS<pwF?|yWtek{JR4Fhcc1z2wG+x_CXb`bGT1)hdZURPA`nhrXnM2bWyEm9 zx5kFoFL6^`OZcAO6^VHU3I!hQ>f;&kSUgJ`6zXPifY8tFqX#cL7bnl7tYFH*zuL$U zm&%cc{VciHZ=R-~qo1K)u>LZrU^sLvS!Q?-Aw1bdx&M+gw;V5tL3Fr+VTcJOIgQQqT9_21yWN^u?H zy5|+3#k^w|5QDy}>*RR{Y{x8Tl~;v;~}mnwdU8m&lxzzV;yy zDvVW0QiXU^a#oTp%Xwr#SMPT~`GL**hSNIk6?U$xs?N_Lz=wv2u@mPc-)YS9{S927 z?!FVr_uxP84ZTlHX17BgE8R8xK4aO7fhs#?S-A_e0WxNSmX8J7^yyJP__A+>ZpQ>i zmsl{FFy@N}RK2P`)8Tz-wKiFVMK1jSUQrDQ58kyKltR(>#ng8?hwpLG?t0O#Aw_dn zf)?T4{NmleEhArt!gVAJV5{BrQ&}phK}jf2JIm`M3WrgOS5jLoM*QIq*?Cu_9#t%l zs7pjpSxvIiq()e>AblR%5}_sKp{Y#PtohD(rbBsj{{Z)o(j(s*U%kWydh$igmusVO zJtd02vzV%2F6=!-5i!P{e`D_XyY5OXq1*-RKI;8eDf!_AbmhI%gwiT~qralUZ-hqS z-b#HF_XozxUC^~d-M7Jg-*VWUZ|%nK;;=^j&MGsn@7Z$7R67&#gXAenjZ3s??DLLz z3@~gyye^R+v`!u|5Zcc?viv58sR0Zd(Zasg`|j}qz4q6E6^L(g*R=kfWnNO;7mm8u zmlAVF&qsDoPj+7-2O{1-jSj|aP&=(VW=yXby<}X!IH#}~wwBJp2=)U6@Hv4*=b`k$ zAE_`9hQ2{`4c?#WyL;*peghBnAP@DZnT3Ka8G%QRkxv#H$ zqpr+s*!^J%LK?Em9%V=~ueVWW+T=2YwtDQzTFs~rnZ5ZqvL^QBt?RIiJD2i8oYcyY zofS%h9wDt8UcXd>;#4|3)Whfs8i%7qa8t+(K}%G)JX$A zGl|#Z%g(?fD_$hV3kc4LIT0L#T*^(+9iLos(TusJ`v1)N8T+&P`3|!~97*zEuC~ z9e00GOx+AS!*A*MZ$B|8(N5D$TYar!cw5*Wdr&l#)~}V;B_EY%o3pQ9vu(L7<+NqR zvcb6i!xBmzdR=;>%+OK+ftHZI%E*@kT4Xw?N({YYj@X2rMQ%D4w5O`P>Y!%o9Yy>4 z_}ci!yVZB=@75}PI0D(MtNL6_ot@&DVpn>8R2JK98~$GwuZE_^aZVAJ;OfKP0cbZj zTz-&5Ur=l=d)TmDRwn2U`|hl;=lDXljmHy?5#XBj6^^RxZom z0sE7YU2wC2)g!pN(^3_!LzlBra+hAT$@*#|K%~jnUbg&wmn*Xfz}z_E0n|?baNG+T z=Y?af_5* zcT@okbFHq6SiLXa5%UyOz>sN#Zhbo)88bI*Kv{Z0LPMs(jspJa#|B4yPzvP97Q>e@ z3Fv_7xz?W=Jyz|(2q0qt?{v%UPA{^O7&Y@I(6+k zHOaPp3-xV)j1PAUUTHGQ3$=RPyFBWF5Wu$kIS4bda?>`k$3TraFo3bpxG^HhkIASP z`mvz_4>ZqHsGu0z83N;TnkibLAro6{^k;JxfFJx(Upc@>rfn)#InN_F>Pez%mGi5< zS~zBpjLjuyRB;C4VX%-j92}ISZ*eKlx|(Ag9Ui8h>-SlJVRx-ey8Z}$@fP5r^z96b zr9K7FwzJCCw{f9{W4m|G=x%{?>g_bwVnE?iUw$A6s4T)130^j_uWuN?P}y+{!f`&{ z!!)@RAQ-w@j_aF!$9Hl>7R!`*FmK5E<#G^C#{%5SnYVXm6)?c`6V4LCrH`ZZ$H~#a z57>1$#>|nLYd4EaRY9Jx*iWEr z{z&v!&q>a5;6EopmqhE8PB_``Yzag&vwQ+mOc_x0v)CbJI0E6ul_1}@*wH^|blGHy z3&KBfba}Fij>^oD^cL)O!zR2ke->d>N;Y?XX+tu5d!3UMywSxNWhhmIeg#0Fwg1PX zAzbcd*HrcpNP#SPM52I&$qCU!U09Gvl4it@{g0Y`whNc_kyv8iw?bJyCmI#P+8ehh zPI;5BMllTD{>(3pi2jW~$~Q1D0d1LlakZXL!+bh2^nNQ$pym|qURVW>L3qm-ld+6l zawD8yZ}9jp(&or=y2zUd&k1P|FhdK^v*J|{7fc^xGn*~rRX=(KGlT)|`0c%W#H%{4 z++4^Wu7yqorzWCDH6|QOBb1#w(vW#Y_&LS>WBT5O)ae-B^Un2fpI^V=i|~$XHRTu~ zU#t{KJr5%hOB`7mX^SDDvU32<&Cc{R@-=8U9^xD&qKA(>QZ{>E7GGgbMqR7}X+ob} zZZy|^1P2jT;?r6r2Q9YQ&_WutfMknlq@15mw`*Od+#4CIi`}FT(<|Mz(vL4srg!vM zyXz$XP^!ey`EmQ&3+{AjKTFx7sTe;!CJ9godP=1n%a0Jfww#dM%Ed2UMOkut#zjF& zb(9(v;KvYk^K}Gbk{THVFM}Z;U#{uW^p|M+3Bp*ec(R@tTP?lZW8{0A+Dl7f+qp{a z8Lf^tVFugVSU2XudZArWcDNzL%g%7Fi~@MGxUNvN}MBu)(+gM`pSuqeNLmSI2ab_a8HPk?dRzxkd@{AW}`7II@+j+W5K!;vglRblICI|^> zCVJ0Y$)~lDTq}v8H4*2D)gwaFo}0@9IzJZY2bl>_l=E0mIE#xRKMs zd~9TDVT~cWyE6>8epTuymsIgZML8c8(DZS5*>OA(z>98`AzA9@bdV8@vSkx>$WiNDP}=ICv2ekB4{gga1pKs%aRg>1b(EK!UvdwdoPaa}ZdAG3PbV z;YYXfRe+4e_4<9&&p=ST(}i_)h7Q0Ufq)DHKL~eCU$;X5{MfxHqYg{(OY@jpWpkzAeAl* z&l8h818mX+*yPJQB`<+n0{&i!xt6w;xt6hp)}P(#%ZTt>`Ay@k=6j7GAQJ2u51ayd zr}4U5nU8;;DgO7~yi|d*jRBhMPx*V>e@-xk@}TX$2W|g03;pkED)B#kTU{7>bSsMi z;lI}Zof@16YCwUfsQ)n8{l8OqtN7n3BzmBb{XZ+z64%nuHMTO=c@XHK?Ww=|b}Ro? z^|N1db|vE*)@uXLxKj2YAWV0vuLH#U|3|f^mbRLep(WY1<;^XxC)oPk4%SIGFkD~{ z<-HwlU=CF^p1cDd-*Y-3Ak+_FcrgE?;qUG6_YiabX%8%NYngk9f1Snb?H$B*0QXV+ ze?VN%HAY4L_JLED`VxO3+{z}Qn}GZs0oD8AL~8U85O65}2Lxb(GPisHLTjMzW{~bib#K_3R_yG@Qe*7=P+{z)#KMiveAo}*8#*MHbAYcu^EP2Os z9j$%;XP)=(B_&jVUn&wBx>`nRLMED4hIexd{~paG3=zLzXJT(4Z{@ugZ(x-P(NS9D zK|rn$o`7gPfQ4fJpS}2(@vfum{VzLm=;)Yh>8M$10ar~;jJ1p{Ew1D4&-7hv8u<&F zS>*=)R{jZXYUrLg!2<%q=?n^@@&H;a_Me01RI||2`1imVSy8`$>!NPJZ{?rBJy5w( zg}`~Gg-JpFuyW?YKL^ZhYpG>yp=VO1#QZYzsnZSft^AWY+iSHP9T*!Mz}QfHz#R7E(SI6!+@Az*&p$WGU*jg{ zUT+k$QZv-k*3;6wh5cI#JD1(i-csMnKWX(j&Vt_pE$oc~0;2tZ77zNLpuLOX|1!_j z+Qt5|viI!n*(C2O$=ydS%g0$V*>df<^C^H9R$mlU(Dl)H|)3aPv+Szy^uWM z!8c|B0;2rD);TZ!31%r{v;QhKR6*i?@!oRZ%0GGa+_jG2U_d~6)Pa`<4|s=2{|R1M z4oz+e>$lWYe|N$wY`THGg}s%3LQ3|f4naHt0jUB8@k2;S#(xl!=I!4>LVDkfdv0NG z<)4tDuwU0PfhV~Q;0RRdfhBub{|QLotu;*xJsmO)6LT#xi(liPzr)oLNciRW+hN+R zyvGFr`E&frc83ehXCRt<|1<9OwYH{-#)EO=?fCUp-U8kO-3-N0k%tX5f%ZEC-XxH^ z1G*kJHvHd#evQSHBm&2H>>EC0k)s=}eO0Ah~ffq;lV!2B%! zf418-Ccm+@iJr#aGTvU3+_K)vd&YmgJfgj0y!NdF@B#S$aB=*1rzgV)9{qul@+-t{ z*y)WoZ{?q84_^rIJDOS4|7fAV ze?7qOaHKO2?RIOwKj9wUX#X9q?Az~f4{p2vu1IY^ + + 4.0.0 + de.kosit.validationtool + packaged-test-scenarios + 1.0.0 + POM was created from install:install-file + diff --git a/libs/de/kosit/validationtool/packaged-test-scenarios/maven-metadata-local.xml b/libs/de/kosit/validationtool/packaged-test-scenarios/maven-metadata-local.xml new file mode 100644 index 0000000..617d5cb --- /dev/null +++ b/libs/de/kosit/validationtool/packaged-test-scenarios/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + de.kosit.validationtool + packaged-test-scenarios + + 1.0.0 + + 1.0.0 + + 20190507064929 + + diff --git a/pom.xml b/pom.xml index 7e9cd9c..a271e30 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,13 @@ 1.7.25 localhost + + + project.local + project + file:${project.basedir}/libs + + @@ -121,6 +128,11 @@ 3.2.0 test + + de.kosit.validationtool + packaged-test-scenarios + 1.0.0 + From a424fbbcfefd3e1594d76c2f1987becdeeee1e54 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Tue, 7 May 2019 11:59:07 +0200 Subject: [PATCH 03/25] #15 adding simple changelog --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b2eada5 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,25 @@ +# Changelog + +All notable changes to the Schematron Rules and this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] +### Added +- Support loading scenarios and content from a JAR-File +- Simple Daemon-Mode exposing validation functionality via http + +### Changed +- Use s9api (e.g. XdmNode) internally for loading and holding xml objects (further memory optimization) + +## 1.0.2 +### Fixed +- Memory issues when validating multiple targets + +## 1.0.1 +### Changed +- Removed XRechnung configuration from release artifacts and source (moved to [own repository](https://github.com/itplr-kosit/validator-configuration-xrechnung) ) + +## 1.0.0 +- Initial Release \ No newline at end of file From ab31ed71b184414c393a0cfdcfcaa2ef3832db04 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 17 May 2019 11:21:22 +0200 Subject: [PATCH 04/25] =?UTF-8?q?#21=20Umsetzung=20der=20API=20R=C3=BCckga?= =?UTF-8?q?be,=20erste=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../api/AcceptRecommendation.java | 21 ++++ .../de/kosit/validationtool/api/Check.java | 16 ++- .../de/kosit/validationtool/api/Result.java | 44 ++++++++ .../cmd/CommandLineApplication.java | 101 +++++++++--------- .../validationtool/cmd/InternalCheck.java | 28 ++--- .../validationtool/impl/DefaultCheck.java | 14 +-- .../impl/model/BaseScenario.java | 96 ++++++++++------- .../impl/tasks/CheckAction.java | 49 +++++---- .../impl/tasks/ComputeAcceptanceAction.java | 42 ++++++++ src/main/model/xsd/scenarios.xsd | 5 +- .../validationtool/impl/DefaultCheckTest.java | 21 ++-- .../de/kosit/validationtool/impl/Helper.java | 17 +++ .../impl/SimpleScenarioCheck.java | 60 +++++++++++ .../resources/examples/simple/input/foo.xml | 5 + .../examples/simple/input/simple-invalid.xml | 6 ++ .../examples/simple/input/simple.xml | 5 + .../examples/simple/input/unknown.xml | 5 + .../examples/simple/repository/report.xsl | 44 ++++++++ .../examples/simple/repository/simple.xsd | 14 +++ .../resources/examples/simple/scenarios.xml | 84 +++++++++++++++ 21 files changed, 532 insertions(+), 147 deletions(-) create mode 100644 src/main/java/de/kosit/validationtool/api/AcceptRecommendation.java create mode 100644 src/main/java/de/kosit/validationtool/api/Result.java create mode 100644 src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java create mode 100644 src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java create mode 100644 src/test/resources/examples/simple/input/foo.xml create mode 100644 src/test/resources/examples/simple/input/simple-invalid.xml create mode 100644 src/test/resources/examples/simple/input/simple.xml create mode 100644 src/test/resources/examples/simple/input/unknown.xml create mode 100644 src/test/resources/examples/simple/repository/report.xsl create mode 100644 src/test/resources/examples/simple/repository/simple.xsd create mode 100644 src/test/resources/examples/simple/scenarios.xml diff --git a/pom.xml b/pom.xml index a271e30..a007283 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ UTF-8 0.8.3 1.18.6 - 9.9.1-1 + 9.9.1-3 1.7.25 localhost diff --git a/src/main/java/de/kosit/validationtool/api/AcceptRecommendation.java b/src/main/java/de/kosit/validationtool/api/AcceptRecommendation.java new file mode 100644 index 0000000..3d07933 --- /dev/null +++ b/src/main/java/de/kosit/validationtool/api/AcceptRecommendation.java @@ -0,0 +1,21 @@ +package de.kosit.validationtool.api; + +/** + * Status der Empfehlung. + */ +public enum AcceptRecommendation { + /** + * Nicht definiert, weil eine Evaluierung nicht durchgeführt wurde, oder nicht durchgeführt werden konnte. + */ + UNDEFINED, + + /** + * Das Dokument ist gemäß Konfiguration valide und kann akzeptiert werden. + */ + ACCEPTABLE, + + /** + * Das Dokuemnt ist gemäß Konfiguration invalide und sollte NICHT akzeptiert werden. + */ + REJECT +} \ No newline at end of file diff --git a/src/main/java/de/kosit/validationtool/api/Check.java b/src/main/java/de/kosit/validationtool/api/Check.java index c2d8629..17053a2 100644 --- a/src/main/java/de/kosit/validationtool/api/Check.java +++ b/src/main/java/de/kosit/validationtool/api/Check.java @@ -24,9 +24,6 @@ import java.util.stream.Collectors; import org.w3c.dom.Document; -import net.sf.saxon.dom.NodeOverNodeInfo; -import net.sf.saxon.s9api.XdmNode; - /** * Zentrale Schnittstellendefinition für das Prüf-Tool. @@ -42,10 +39,10 @@ public interface Check { * @param input die Resource / XML-Datei, die geprüft werden soll. * @return ein Ergebnis-{@link Document} (readonly) */ - default Document check(Input input) { - final XdmNode node = checkInput(input); + default Document check(final Input input) { + final Result result = checkInput(input); // readonly view of the document!!! - return (Document) NodeOverNodeInfo.wrap(node.getUnderlyingNode()); + return result.getReportDocument(); } /** @@ -54,7 +51,7 @@ public interface Check { * @param input die Resource / XML-Datei, die geprüft werden soll. * @return ein Ergebnis-{@link Document} */ - XdmNode checkInput(Input input); + Result checkInput(Input input); /** * Führt eine Prüfung im Batch-Mode durch. Die Default-Implementierung führt die Prüfung sequentiell aus. Die Ergebnis @@ -63,7 +60,7 @@ public interface Check { * @param input die Eingabe * @return Liste mit Ergebnis-Dokumenten (readonly) */ - default List check(List input) { + default List check(final List input) { return input.stream().map(this::check).collect(Collectors.toList()); } @@ -73,8 +70,9 @@ public interface Check { * @param input die Eingabe * @return Liste mit Ergebnis-Dokumenten */ - default List checkInput(List input) { + default List checkInput(final List input) { return input.stream().map(this::checkInput).collect(Collectors.toList()); } + } diff --git a/src/main/java/de/kosit/validationtool/api/Result.java b/src/main/java/de/kosit/validationtool/api/Result.java new file mode 100644 index 0000000..6d9eef7 --- /dev/null +++ b/src/main/java/de/kosit/validationtool/api/Result.java @@ -0,0 +1,44 @@ +package de.kosit.validationtool.api; + +import org.w3c.dom.Document; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import net.sf.saxon.dom.NodeOverNodeInfo; +import net.sf.saxon.s9api.XdmNode; + +/** + * API Rückgabe Objekt des Ergebnisses des Validierungsprozesses. + * + * @author Andreas Penski + */ +@Getter +@RequiredArgsConstructor +public class Result { + + /** Der generierte Report. */ + private final XdmNode report; + + /** Das evaluierte Ergebnis. */ + private final AcceptRecommendation acceptRecommendation; + + /** + * Gibt den Report als W3C-{@link Document} zurück. + * + * @return der Report + */ + public Document getReportDocument() { + return (Document) NodeOverNodeInfo.wrap(getReport().getUnderlyingNode()); + } + + /** + * Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments. + * + * @return true wenn {@link AcceptRecommendation#ACCEPTABLE} + */ + public boolean isAcceptable() { + return AcceptRecommendation.ACCEPTABLE.equals(acceptRecommendation); + } + +} diff --git a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java index 91cb851..41b3c5e 100644 --- a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java +++ b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.stream.Collectors; import org.apache.commons.cli.CommandLine; @@ -45,6 +46,7 @@ import lombok.extern.slf4j.Slf4j; import de.kosit.validationtool.api.CheckConfiguration; import de.kosit.validationtool.api.Input; import de.kosit.validationtool.api.InputFactory; +import de.kosit.validationtool.api.Result; import de.kosit.validationtool.cmd.assertions.Assertions; import de.kosit.validationtool.impl.ConversionService; import de.kosit.validationtool.impl.ObjectFactory; @@ -101,7 +103,7 @@ public class CommandLineApplication { * * @param args die Eingabe-Argumente */ - public static void main(String[] args) { + public static void main(final String[] args) { final int resultStatus = mainProgram(args); if (DAEMON_SIGNAL != resultStatus) { System.exit(resultStatus); @@ -114,14 +116,14 @@ public class CommandLineApplication { * * @param args die Eingabe-Argumente */ - static int mainProgram(String[] args) { + static int mainProgram(final String[] args) { int returnValue = 0; - Options options = createOptions(); + final Options options = createOptions(); if (isHelpRequested(args)) { printHelp(options); } else { try { - CommandLineParser parser = new DefaultParser(); + final CommandLineParser parser = new DefaultParser(); final CommandLine cmd = parser.parse(options, args); if (cmd.hasOption(SERVER.getOpt())) { returnValue = startDaemonMode(cmd); @@ -130,7 +132,7 @@ public class CommandLineApplication { } else { returnValue = processActions(cmd); } - } catch (ParseException e) { + } catch (final ParseException e) { log.error("Error processing command line arguments: " + e.getMessage()); printHelp(options); } @@ -138,7 +140,7 @@ public class CommandLineApplication { return returnValue; } - private static int determinePort(CommandLine cmd) { + private static int determinePort(final CommandLine cmd) { int port = 8080; if (checkOptionWithValue(PORT, cmd)) { port = Integer.parseInt(cmd.getOptionValue(PORT.getOpt())); @@ -146,7 +148,7 @@ public class CommandLineApplication { return port; } - private static int determineThreads(CommandLine cmd) { + private static int determineThreads(final CommandLine cmd) { int threads = Runtime.getRuntime().availableProcessors(); if (checkOptionWithValue(WORKER_COUNT, cmd)) { threads = Integer.parseInt(cmd.getOptionValue(WORKER_COUNT.getOpt())); @@ -154,7 +156,7 @@ public class CommandLineApplication { return threads; } - private static String determineHost(CommandLine cmd) { + private static String determineHost(final CommandLine cmd) { String host = "localhost"; if (checkOptionWithValue(HOST, cmd)) { host = cmd.getOptionValue(HOST.getOpt()); @@ -162,15 +164,15 @@ public class CommandLineApplication { return host; } - private static int startDaemonMode(CommandLine cmd) { - Option[] unavailable = new Option[]{PRINT, CHECK_ASSERTIONS, DEBUG, OUTPUT, EXTRACT_HTML}; + private static int startDaemonMode(final CommandLine cmd) { + final Option[] unavailable = new Option[]{PRINT, CHECK_ASSERTIONS, DEBUG, OUTPUT, EXTRACT_HTML}; warnUnusedOptions(cmd, unavailable, true); - Daemon validDaemon = new Daemon(determineDefinition(cmd), determineRepository(cmd), determineHost(cmd), determinePort(cmd), determineThreads(cmd)); + final Daemon validDaemon = new Daemon(determineDefinition(cmd), determineRepository(cmd), determineHost(cmd), determinePort(cmd), determineThreads(cmd)); validDaemon.startServer(); return DAEMON_SIGNAL; } - private static void warnUnusedOptions(CommandLine cmd, Option[] unavailable, boolean daemon) { + private static void warnUnusedOptions(final CommandLine cmd, final Option[] unavailable, final boolean daemon) { Arrays.stream(cmd.getOptions()).filter(o -> ArrayUtils.contains(unavailable, o)).map(o -> "The option " + o.getLongOpt() + " is not available in daemon mode").forEach(log::error); if (daemon && !cmd.getArgList().isEmpty()) { log.info("Ignoring test targets in daemon mode"); @@ -178,30 +180,30 @@ public class CommandLineApplication { } - private static boolean isHelpRequested(String[] args) { - Options helpOptions = createHelpOptions(); + private static boolean isHelpRequested(final String[] args) { + final Options helpOptions = createHelpOptions(); try { - CommandLineParser parser = new DefaultParser(); - CommandLine cmd = parser.parse(helpOptions, args, true); + final CommandLineParser parser = new DefaultParser(); + final CommandLine cmd = parser.parse(helpOptions, args, true); if (cmd.hasOption(HELP.getOpt()) || args.length == 0) { return true; } - } catch (ParseException e) { + } catch (final ParseException e) { // we can ignore that, we just look for the help parameters } return false; } - private static int processActions(CommandLine cmd) { + private static int processActions(final CommandLine cmd) { try { long start = System.currentTimeMillis(); - Option[] unavailable = new Option[]{HOST, PORT, WORKER_COUNT}; + final Option[] unavailable = new Option[]{HOST, PORT, WORKER_COUNT}; warnUnusedOptions(cmd, unavailable, false); - CheckConfiguration d = new CheckConfiguration(determineDefinition(cmd)); + final CheckConfiguration d = new CheckConfiguration(determineDefinition(cmd)); d.setScenarioRepository(determineRepository(cmd)); - InternalCheck check = new InternalCheck(d); - Path outputDirectory = determineOutputDirectory(cmd); + final InternalCheck check = new InternalCheck(d); + final Path outputDirectory = determineOutputDirectory(cmd); if (cmd.hasOption(EXTRACT_HTML.getOpt())) { check.getCheckSteps().add(new ExtractHtmlContentAction(check.getContentRepository(), outputDirectory)); @@ -212,7 +214,7 @@ public class CommandLineApplication { } if (cmd.hasOption(CHECK_ASSERTIONS.getOpt())) { - Assertions assertions = loadAssertions(cmd.getOptionValue(CHECK_ASSERTIONS.getOpt())); + final Assertions assertions = loadAssertions(cmd.getOptionValue(CHECK_ASSERTIONS.getOpt())); check.getCheckSteps().add(new CheckAssertionAction(assertions, ObjectFactory.createProcessor())); } if (cmd.hasOption(PRINT_MEM_STATS.getOpt())) { @@ -222,16 +224,17 @@ public class CommandLineApplication { log.info("Setup completed in {}ms\n", System.currentTimeMillis() - start); final Collection targets = determineTestTargets(cmd); + final List results = new ArrayList<>(); start = System.currentTimeMillis(); - for (Path p : targets) { + for (final Path p : targets) { final Input input = InputFactory.read(p); - check.checkInput(input); + results.add(check.checkInput(input)); } - boolean result = check.printAndEvaluate(); + final boolean result = check.printAndEvaluate(); log.info("Processing {} object(s) completed in {}ms", targets.size(), System.currentTimeMillis() - start); return result ? 0 : 1; - } catch (Exception e) { + } catch (final Exception e) { if (cmd.hasOption(DEBUG.getOpt())) { log.error(e.getMessage(), e); } else { @@ -241,20 +244,20 @@ public class CommandLineApplication { } } - private static Assertions loadAssertions(String optionValue) { - Path p = Paths.get(optionValue); + private static Assertions loadAssertions(final String optionValue) { + final Path p = Paths.get(optionValue); Assertions a = null; if (Files.exists(p)) { - ConversionService c = new ConversionService(); + final ConversionService c = new ConversionService(); c.initialize(de.kosit.validationtool.cmd.assertions.ObjectFactory.class.getPackage()); a = c.readXml(p.toUri(), Assertions.class); } return a; } - private static Path determineOutputDirectory(CommandLine cmd) { + private static Path determineOutputDirectory(final CommandLine cmd) { final String value = cmd.getOptionValue(OUTPUT.getOpt()); - Path fir; + final Path fir; if (StringUtils.isNotBlank(value)) { fir = Paths.get(value); if ((!Files.exists(fir) && !fir.toFile().mkdirs()) || !Files.isDirectory(fir)) { @@ -266,8 +269,8 @@ public class CommandLineApplication { return fir; } - private static Collection determineTestTargets(CommandLine cmd) { - Collection targets = new ArrayList<>(); + private static Collection determineTestTargets(final CommandLine cmd) { + final Collection targets = new ArrayList<>(); if (!cmd.getArgList().isEmpty()) { cmd.getArgList().forEach(e -> targets.addAll(determineTestTarget(e))); } @@ -277,8 +280,8 @@ public class CommandLineApplication { return targets; } - private static Collection determineTestTarget(String s) { - Path d = Paths.get(s); + private static Collection determineTestTarget(final String s) { + final Path d = Paths.get(s); if (Files.isDirectory(d)) { return listDirectoryTargets(d); } else if (Files.exists(d)) { @@ -289,18 +292,18 @@ public class CommandLineApplication { } - private static Collection listDirectoryTargets(Path d) { + private static Collection listDirectoryTargets(final Path d) { try { return Files.list(d).filter(path -> path.toString().endsWith(".xml")).collect(Collectors.toList()); - } catch (IOException e) { + } catch (final IOException e) { throw new IllegalStateException("IOException while list directory content. Can not determine test targets.", e); } } - private static URI determineRepository(CommandLine cmd) { + private static URI determineRepository(final CommandLine cmd) { if (checkOptionWithValue(REPOSITORY, cmd)) { - Path d = Paths.get(cmd.getOptionValue(REPOSITORY.getOpt())); + final Path d = Paths.get(cmd.getOptionValue(REPOSITORY.getOpt())); if (Files.isDirectory(d)) { return d.toUri(); } else { @@ -311,9 +314,9 @@ public class CommandLineApplication { return null; } - private static URI determineDefinition(CommandLine cmd) { + private static URI determineDefinition(final CommandLine cmd) { checkOptionWithValue(SCENARIOS, cmd); - Path f = Paths.get(cmd.getOptionValue(SCENARIOS.getOpt())); + final Path f = Paths.get(cmd.getOptionValue(SCENARIOS.getOpt())); if (Files.isRegularFile(f)) { return f.toAbsolutePath().toUri(); } else { @@ -322,10 +325,10 @@ public class CommandLineApplication { } } - private static boolean checkOptionWithValue(Option option, CommandLine cmd) { - String opt = option.getOpt(); + private static boolean checkOptionWithValue(final Option option, final CommandLine cmd) { + final String opt = option.getOpt(); if (cmd.hasOption(opt)) { - String value = cmd.getOptionValue(opt); + final String value = cmd.getOptionValue(opt); if (StringUtils.isNoneBlank(value)) { return true; } else { @@ -338,20 +341,20 @@ public class CommandLineApplication { return false; } - private static void printHelp(Options options) { + private static void printHelp(final Options options) { // automatically generate the help statement - HelpFormatter formatter = new HelpFormatter(); + final HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("check-tool -s [OPTIONS] [FILE]... ", options, false); } private static Options createHelpOptions() { - Options options = new Options(); + final Options options = new Options(); options.addOption(HELP); return options; } private static Options createOptions() { - Options options = new Options(); + final Options options = new Options(); options.addOption(HELP); options.addOption(SERVER); options.addOption(HOST); diff --git a/src/main/java/de/kosit/validationtool/cmd/InternalCheck.java b/src/main/java/de/kosit/validationtool/cmd/InternalCheck.java index fc835dc..db9a7b1 100644 --- a/src/main/java/de/kosit/validationtool/cmd/InternalCheck.java +++ b/src/main/java/de/kosit/validationtool/cmd/InternalCheck.java @@ -23,11 +23,10 @@ import lombok.extern.slf4j.Slf4j; import de.kosit.validationtool.api.CheckConfiguration; import de.kosit.validationtool.api.Input; +import de.kosit.validationtool.api.Result; import de.kosit.validationtool.impl.DefaultCheck; import de.kosit.validationtool.impl.tasks.CheckAction; -import net.sf.saxon.s9api.XdmNode; - /** * Simple Erweiterung der Klasse {@link DefaultCheck} um das Ergebnis der Assertion-Prüfung auszwerten und auszugeben. * Diese Klasse stellt keine fachlicher Erweiterung des eigentlichen Prüfvorganges dar! @@ -46,7 +45,7 @@ class InternalCheck extends DefaultCheck { * * @param configuration die Konfiguration */ - InternalCheck(CheckConfiguration configuration) { + InternalCheck(final CheckConfiguration configuration) { super(configuration); } @@ -56,23 +55,26 @@ class InternalCheck extends DefaultCheck { * @param input die Prüflinge * @return false wenn es Assertion-Fehler gibt, sonst true */ - public XdmNode checkInput(Input input) { - CheckAction.Bag bag = new CheckAction.Bag(input, createReport()); - XdmNode result = runCheckInternal(bag); + @Override + public Result checkInput(final Input input) { + final CheckAction.Bag bag = new CheckAction.Bag(input, createReport()); + final Result result = runCheckInternal(bag); if (bag.getAssertionResult() != null) { - checkAssertions += bag.getAssertionResult().getObject(); - failedAssertions += bag.getAssertionResult().getErrors().size(); + this.checkAssertions += bag.getAssertionResult().getObject(); + this.failedAssertions += bag.getAssertionResult().getErrors().size(); } return result; } boolean printAndEvaluate() { - if (failedAssertions > 0) { - log.error("Assertion check failed.\n\nAssertions run: {}, Assertions failed: {}\n", checkAssertions, failedAssertions); - } else if (checkAssertions > 0) { - log.info("Assertion check successful.\n\nAssertions run: {}, Assertions failed: {}\n", checkAssertions, failedAssertions); + if (this.failedAssertions > 0) { + log.error("Assertion check failed.\n\nAssertions run: {}, Assertions failed: {}\n", this.checkAssertions, + this.failedAssertions); + } else if (this.checkAssertions > 0) { + log.info("Assertion check successful.\n\nAssertions run: {}, Assertions failed: {}\n", this.checkAssertions, + this.failedAssertions); } - return failedAssertions == 0; + return this.failedAssertions == 0; } } diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java index 4c0aeb6..e540b92 100644 --- a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java +++ b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java @@ -28,7 +28,9 @@ import lombok.extern.slf4j.Slf4j; import de.kosit.validationtool.api.Check; import de.kosit.validationtool.api.CheckConfiguration; import de.kosit.validationtool.api.Input; +import de.kosit.validationtool.api.Result; import de.kosit.validationtool.impl.tasks.CheckAction; +import de.kosit.validationtool.impl.tasks.ComputeAcceptanceAction; import de.kosit.validationtool.impl.tasks.CreateReportAction; import de.kosit.validationtool.impl.tasks.DocumentParseAction; import de.kosit.validationtool.impl.tasks.ScenarioSelectionAction; @@ -41,7 +43,6 @@ import de.kosit.validationtool.model.reportInput.EngineType; import de.kosit.validationtool.model.reportInput.ProcessingError; import net.sf.saxon.s9api.Processor; -import net.sf.saxon.s9api.XdmNode; /** * Die Referenz-Implementierung für den Prüfprozess. Nach initialer Konfiguration ist diese Klasse threadsafe und kann @@ -64,7 +65,6 @@ public class DefaultCheck implements Check { private final ConversionService conversionService; - @Getter private final List checkSteps; @@ -88,6 +88,7 @@ public class DefaultCheck implements Check { this.checkSteps.add(new ValidateReportInputAction(this.conversionService, this.contentRepository.getReportInputSchema())); this.checkSteps .add(new CreateReportAction(processor, this.conversionService, this.repository, configuration.getScenarioRepository())); + this.checkSteps.add(new ComputeAcceptanceAction()); } protected static CreateReportInput createReport() { @@ -101,12 +102,12 @@ public class DefaultCheck implements Check { } @Override - public XdmNode checkInput(final Input input) { + public Result checkInput(final Input input) { final CheckAction.Bag t = new CheckAction.Bag(input, createReport()); return runCheckInternal(t); } - protected XdmNode runCheckInternal(final CheckAction.Bag t) { + protected Result runCheckInternal(final CheckAction.Bag t) { final long started = System.currentTimeMillis(); log.info("Checking content of {}", t.getInput().getName()); for (final CheckAction action : this.checkSteps) { @@ -124,10 +125,10 @@ public class DefaultCheck implements Check { } t.setFinished(true); log.info("Finished check of {} in {}ms\n", t.getInput().getName(), System.currentTimeMillis() - started); - return t.getReport(); + return new Result(t.getReport(), t.getAcceptStatus()); } - private static boolean createDocumentIdentification(final CheckAction.Bag transporter) { + private static void createDocumentIdentification(final CheckAction.Bag transporter) { final DocumentIdentificationType i = new DocumentIdentificationType(); final DocumentIdentificationType.DocumentHash h = new DocumentIdentificationType.DocumentHash(); h.setHashAlgorithm(transporter.getInput().getDigestAlgorithm()); @@ -135,6 +136,5 @@ public class DefaultCheck implements Check { i.setDocumentHash(h); i.setDocumentReference(transporter.getInput().getName()); transporter.getReportInput().setDocumentIdentification(i); - return true; } } diff --git a/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java b/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java index 7eabdb4..9bf9ec2 100644 --- a/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java +++ b/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java @@ -36,7 +36,11 @@ import lombok.Setter; import de.kosit.validationtool.impl.ContentRepository; import de.kosit.validationtool.impl.ScenarioRepository; -import de.kosit.validationtool.model.scenarios.*; +import de.kosit.validationtool.model.scenarios.CreateReportType; +import de.kosit.validationtool.model.scenarios.NamespaceType; +import de.kosit.validationtool.model.scenarios.ResourceType; +import de.kosit.validationtool.model.scenarios.ValidateWithSchematron; +import de.kosit.validationtool.model.scenarios.ValidateWithXmlSchema; import net.sf.saxon.s9api.XPathExecutable; import net.sf.saxon.s9api.XPathSelector; @@ -50,50 +54,63 @@ import net.sf.saxon.s9api.XsltExecutable; */ public abstract class BaseScenario { - private XPathExecutable xPathExecutable; + /** + * Laufzeitinformationen über eine Transformation. + */ + @Getter + @Setter + @AllArgsConstructor + public class Transformation { + private XsltExecutable executable; + + private ResourceType resourceType; + } + + private XPathExecutable matchExecutable; + + private XPathExecutable acceptExecutable; private Schema schema; - private List schematronValidations; - private ContentRepository repository; - private Transformation reportTransformation; /** * Gibt eine Transformation zurück. + * * @return initialisierte Transformation */ public Transformation getReportTransformation() { - if (reportTransformation == null) { + if (this.reportTransformation == null) { final ResourceType resource = getCreateReport().getResource(); - final XsltExecutable executable = repository.loadXsltScript(URI.create(resource.getLocation())); - reportTransformation = new Transformation(executable, resource); + final XsltExecutable executable = this.repository.loadXsltScript(URI.create(resource.getLocation())); + this.reportTransformation = new Transformation(executable, resource); } - return reportTransformation; + return this.reportTransformation; } /** * Lieferrt das Schema zu diesem Szenario. + * * @return das passende Schema */ public Schema getSchema() { - if (schema == null) { + if (this.schema == null) { final List schemaResources = getValidateWithXmlSchema().getResource().stream().map(ResourceType::getLocation) .collect(Collectors.toList()); - schema = repository.createSchema(schemaResources); + this.schema = this.repository.createSchema(schemaResources); } - return schema; + return this.schema; } - /** * Initialisiert das Szenario auf Basis eines [@link ContentRepository} + * * @param repository das Repository mit den Szenario-Artefakten * @param lazy optionales lazy loading der XML-Artefakte * @return true wenn erfolgreich */ - public boolean initialize(ContentRepository repository, boolean lazy) { + public boolean initialize(final ContentRepository repository, final boolean lazy) { this.repository = repository; if (!lazy) { getSchema(); @@ -106,20 +123,21 @@ public abstract class BaseScenario { /** * Liefer eine Liste mit Schematron Validierungs-Transformationen + * * @return liste mit initialisierten Transformationsinformationen */ public List getSchematronValidations() { - if (schematronValidations == null) { - schematronValidations = new ArrayList<>(); + if (this.schematronValidations == null) { + this.schematronValidations = new ArrayList<>(); getValidateWithSchematron().forEach(v -> { if (v.isPsvi()) { throw new NotImplementedException("This implemenation does not support PSVI usage"); } - final XsltExecutable xsltExecutable = repository.loadXsltScript(URI.create(v.getResource().getLocation())); - schematronValidations.add(new Transformation(xsltExecutable, v.getResource())); + final XsltExecutable xsltExecutable = this.repository.loadXsltScript(URI.create(v.getResource().getLocation())); + this.schematronValidations.add(new Transformation(xsltExecutable, v.getResource())); }); } - return schematronValidations; + return this.schematronValidations; } /** @@ -129,11 +147,28 @@ public abstract class BaseScenario { * @see {@link ScenarioRepository#selectScenario(Document)}. */ public XPathSelector getSelector() { - if (xPathExecutable == null) { - final Map namespaces = getNamespace().stream().collect(Collectors.toMap(NamespaceType::getPrefix, NamespaceType::getValue)); - xPathExecutable = repository.createXPath(getMatch(), namespaces); + if (this.matchExecutable == null) { + this.matchExecutable = this.repository.createXPath(getMatch(), prepareNamespaces()); } - return xPathExecutable.load(); + return this.matchExecutable.load(); + } + + /** + * Liefert einen neuen XPath-Selector zur Evaluierung der {@link de.kosit.validationtool.api.AcceptRecommendation}. + * + * @return neuer Selector + */ + public XPathSelector getAcceptSelector() { + if (this.acceptExecutable == null) { + System.out.println(getAcceptMatch()); + System.out.println(prepareNamespaces()); + this.acceptExecutable = this.repository.createXPath(getAcceptMatch(), prepareNamespaces()); + } + return this.acceptExecutable.load(); + } + + private Map prepareNamespaces() { + return getNamespace().stream().collect(Collectors.toMap(NamespaceType::getPrefix, NamespaceType::getValue)); } /** @@ -143,6 +178,8 @@ public abstract class BaseScenario { */ public abstract String getMatch(); + public abstract String getAcceptMatch(); + /** * Getter aus dem schema. * @@ -171,17 +208,4 @@ public abstract class BaseScenario { */ public abstract CreateReportType getCreateReport(); - /** - * Laufzeitinformationen über eine Transformation. - */ - @Getter - @Setter - @AllArgsConstructor - public class Transformation { - - private XsltExecutable executable; - - private ResourceType resourceType; - } - } diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java index c569663..2063cd7 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java @@ -25,6 +25,7 @@ import java.util.regex.Pattern; import lombok.Getter; import lombok.Setter; +import de.kosit.validationtool.api.AcceptRecommendation; import de.kosit.validationtool.api.Input; import de.kosit.validationtool.impl.model.Result; import de.kosit.validationtool.model.reportInput.CreateReportInput; @@ -43,25 +44,6 @@ import net.sf.saxon.s9api.XdmNode; @FunctionalInterface public interface CheckAction { - /** - * Ausfürhung des Prüfschrittes und Erweiterung der gesammelten Informationen. - * - * @param results die Informationssammlung - */ - void check(Bag results); - - /** - * Ermittlung, ob ein Schritt u.U. ausgelassen werden kann. Die Funktion wird vor der eigentlichen Prüfaktion aufgerufen - * und kann somit eine Ausführung des Prüfschrittes verhindern. Entwickler können diese Funktion überschreiben, um den - * Prüfschritt bedingt auszuführen. - * - * @param results die bisher gesammelten Information - * @return true wenn der Schritt ausgelassen werden soll - */ - default boolean isSkipped(Bag results) { - return false; - } - /** * Transport-Klasse für Eingabe und Ausgabe-Objekte für die einzelnen Prüfschritte. */ @@ -80,6 +62,8 @@ public interface CheckAction { private boolean stopped; + private AcceptRecommendation acceptStatus = AcceptRecommendation.UNDEFINED; + /** Das zu prüfende Dokument */ private Input input; @@ -89,15 +73,16 @@ public interface CheckAction { private Result schemaValidationResult; - public Bag(Input input) { + public Bag(final Input input) { this(input, new CreateReportInput()); } - public Bag(Input input, CreateReportInput reportInput) { + public Bag(final Input input, final CreateReportInput reportInput) { this.input = input; this.reportInput = reportInput; } + /** * Signalisiert einen vorzeitigen Stop der Vearbeitung. */ @@ -107,7 +92,7 @@ public interface CheckAction { /** * Gibt den Namen des Prüflings zurück, dabei werden etwaige Pfadinformationen abgeschnitten. - * + * * @return der Name des Prüflings */ public String getName() { @@ -119,4 +104,24 @@ public interface CheckAction { return fileName; } } + + /** + * Ausfürhung des Prüfschrittes und Erweiterung der gesammelten Informationen. + * + * @param results die Informationssammlung + */ + void check(Bag results); + + /** + * Ermittlung, ob ein Schritt u.U. ausgelassen werden kann. Die Funktion wird vor der eigentlichen Prüfaktion aufgerufen + * und kann somit eine Ausführung des Prüfschrittes verhindern. Entwickler können diese Funktion überschreiben, um den + * Prüfschritt bedingt auszuführen. + * + * @param results die bisher gesammelten Information + * @return true wenn der Schritt ausgelassen werden soll + */ + default boolean isSkipped(final Bag results) { + return false; + } + } diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java new file mode 100644 index 0000000..67d4ae4 --- /dev/null +++ b/src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java @@ -0,0 +1,42 @@ +package de.kosit.validationtool.impl.tasks; + +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import de.kosit.validationtool.api.AcceptRecommendation; + +import net.sf.saxon.s9api.XPathSelector; + +/** + * Berechnet die Akzeptanz-Empfehlung gemäß konfigurierten 'acceptMatch' des aktuellen Szenarios. + * + * @author Andreas Penski + */ +@RequiredArgsConstructor +@Slf4j +public class ComputeAcceptanceAction implements CheckAction { + + @Override + public void check(final Bag results) { + final String acceptMatch = results.getScenarioSelectionResult().getObject().getAcceptMatch(); + if (isNotBlank(acceptMatch)) { + + try { + + final XPathSelector selector = results.getScenarioSelectionResult().getObject().getAcceptSelector(); + selector.setContextItem(results.getReport()); + results.setAcceptStatus(selector.effectiveBooleanValue() ? AcceptRecommendation.ACCEPTABLE : AcceptRecommendation.REJECT); + } catch (final Exception e) { + log.error("Fehler bei Evaluierung des Accept-Status: {}", e.getMessage(), e); + } + } + } + + @Override + public boolean isSkipped(final Bag results) { + return results.getScenarioSelectionResult().isInvalid(); + } + +} diff --git a/src/main/model/xsd/scenarios.xsd b/src/main/model/xsd/scenarios.xsd index 9570334..1b2f9d9 100644 --- a/src/main/model/xsd/scenarios.xsd +++ b/src/main/model/xsd/scenarios.xsd @@ -20,7 +20,8 @@ + targetNamespace="http://www.xoev.de/de/validator/framework/1/scenarios" version="1.1.0" elementFormDefault="qualified" + attributeFormDefault="unqualified"> @@ -86,6 +87,8 @@ + + diff --git a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java index 7b61ebc..1e0f69a 100644 --- a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java +++ b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java @@ -33,17 +33,17 @@ import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; +import de.kosit.validationtool.api.AcceptRecommendation; import de.kosit.validationtool.api.CheckConfiguration; import de.kosit.validationtool.api.Input; - -import net.sf.saxon.s9api.XdmNode; +import de.kosit.validationtool.api.Result; /** * Test das Check-Interface * * @author Andreas Penski */ -public class DefaultCheckTest { +public class DefaultCheckTest extends CheckTest { private static final URL SCENARIO_DEFINITION = ScenarioRepositoryTest.class.getResource("/examples/UBLReady/scenarios-2.xml"); @@ -62,27 +62,30 @@ public class DefaultCheckTest { } @Test - public void testHappyCase() throws Exception { - final XdmNode doc = this.implementation.checkInput(read(VALID_EXAMPLE)); + public void testHappyCase() { + final Result doc = this.implementation.checkInput(read(VALID_EXAMPLE)); assertThat(doc).isNotNull(); + assertThat(doc.getReport()).isNotNull(); + assertThat(doc.isAcceptable()).isFalse(); + assertThat(doc.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.UNDEFINED); } @Test - public void testHappyCaseDocument() throws Exception { + public void testHappyCaseDocument() { final Document doc = this.implementation.check(read(VALID_EXAMPLE)); assertThat(doc).isNotNull(); } @Test - public void testMultipleCase() throws Exception { + public void testMultipleCase() { final List input = IntStream.range(0, MULTI_COUNT).mapToObj(i -> read(VALID_EXAMPLE)).collect(Collectors.toList()); - final List docs = this.implementation.checkInput(input); + final List docs = this.implementation.checkInput(input); assertThat(docs).isNotNull(); assertThat(docs).hasSize(MULTI_COUNT); } @Test - public void testMultipleCaseDocument() throws Exception { + public void testMultipleCaseDocument() { final List input = IntStream.range(0, MULTI_COUNT).mapToObj(i -> read(VALID_EXAMPLE)).collect(Collectors.toList()); final List docs = this.implementation.check(input); assertThat(docs).isNotNull(); diff --git a/src/test/java/de/kosit/validationtool/impl/Helper.java b/src/test/java/de/kosit/validationtool/impl/Helper.java index 22b5925..b5d313a 100644 --- a/src/test/java/de/kosit/validationtool/impl/Helper.java +++ b/src/test/java/de/kosit/validationtool/impl/Helper.java @@ -39,6 +39,23 @@ import net.sf.saxon.s9api.XdmNode; */ public class Helper { + public static class Simple { + + public static final URI ROOT = EXAMPLES_DIR.resolve("simple/"); + + public static final URI SIMPLE_VALID = Simple.ROOT.resolve("input/simple.xml"); + + public static final URI FOO = Simple.ROOT.resolve("input/foo.xml"); + + public static final URI SCENARIOS = ROOT.resolve("scenarios.xml"); + + public static final URI REPOSITORY = ROOT.resolve("repository/"); + + public static final URI INVALID = ROOT.resolve("input/simple-invalid.xml"); + + public static final URI UNKNOWN = ROOT.resolve("input/unknown.xml"); + } + public static final URI SOURCE_ROOT = Paths.get("src/main/resources").toUri(); public static final URI MODEL_ROOT = Paths.get("src/main/model").toUri(); diff --git a/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java new file mode 100644 index 0000000..7f42f2c --- /dev/null +++ b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java @@ -0,0 +1,60 @@ +package de.kosit.validationtool.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; + +import org.junit.Before; +import org.junit.Test; + +import de.kosit.validationtool.api.AcceptRecommendation; +import de.kosit.validationtool.api.CheckConfiguration; +import de.kosit.validationtool.api.InputFactory; +import de.kosit.validationtool.api.Result; +import de.kosit.validationtool.impl.Helper.Simple; + +/** + * Prüft die Funktionen des Validator auf Basis eines reduzierten Szenarios. + * + * @author Andreas Penski + */ +public class SimpleScenarioCheck { + + private DefaultCheck implementation; + + @Before + public void setup() throws URISyntaxException { + final CheckConfiguration d = new CheckConfiguration(Simple.SCENARIOS); + d.setScenarioRepository(Simple.REPOSITORY); + this.implementation = new DefaultCheck(d); + } + + @Test + public void testSimple() throws MalformedURLException { + final Result result = this.implementation.checkInput(InputFactory.read(Simple.SIMPLE_VALID.toURL())); + assertThat(result).isNotNull(); + assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.ACCEPTABLE); + } + + @Test + public void testInvalid() throws MalformedURLException { + final Result result = this.implementation.checkInput(InputFactory.read(Simple.INVALID.toURL())); + assertThat(result).isNotNull(); + assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.REJECT); + } + + @Test + public void testUnknown() throws MalformedURLException { + final Result result = this.implementation.checkInput(InputFactory.read(Simple.UNKNOWN.toURL())); + assertThat(result).isNotNull(); + assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.UNDEFINED); + } + + @Test + public void testWithoutAcceptMatch() throws MalformedURLException { + final Result result = this.implementation.checkInput(InputFactory.read(Simple.FOO.toURL())); + assertThat(result).isNotNull(); + assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.UNDEFINED); + } +} diff --git a/src/test/resources/examples/simple/input/foo.xml b/src/test/resources/examples/simple/input/foo.xml new file mode 100644 index 0000000..b84fe4f --- /dev/null +++ b/src/test/resources/examples/simple/input/foo.xml @@ -0,0 +1,5 @@ + + + + asldkfj + \ No newline at end of file diff --git a/src/test/resources/examples/simple/input/simple-invalid.xml b/src/test/resources/examples/simple/input/simple-invalid.xml new file mode 100644 index 0000000..4844ae9 --- /dev/null +++ b/src/test/resources/examples/simple/input/simple-invalid.xml @@ -0,0 +1,6 @@ + + + + asldkfj + + \ No newline at end of file diff --git a/src/test/resources/examples/simple/input/simple.xml b/src/test/resources/examples/simple/input/simple.xml new file mode 100644 index 0000000..63032b1 --- /dev/null +++ b/src/test/resources/examples/simple/input/simple.xml @@ -0,0 +1,5 @@ + + + + asldkfj + \ No newline at end of file diff --git a/src/test/resources/examples/simple/input/unknown.xml b/src/test/resources/examples/simple/input/unknown.xml new file mode 100644 index 0000000..3cfc388 --- /dev/null +++ b/src/test/resources/examples/simple/input/unknown.xml @@ -0,0 +1,5 @@ + + + + asldkfj + \ No newline at end of file diff --git a/src/test/resources/examples/simple/repository/report.xsl b/src/test/resources/examples/simple/repository/report.xsl new file mode 100644 index 0000000..a402938 --- /dev/null +++ b/src/test/resources/examples/simple/repository/report.xsl @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/examples/simple/repository/simple.xsd b/src/test/resources/examples/simple/repository/simple.xsd new file mode 100644 index 0000000..b7f2b68 --- /dev/null +++ b/src/test/resources/examples/simple/repository/simple.xsd @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/examples/simple/scenarios.xml b/src/test/resources/examples/simple/scenarios.xml new file mode 100644 index 0000000..47e5ec8 --- /dev/null +++ b/src/test/resources/examples/simple/scenarios.xml @@ -0,0 +1,84 @@ + + + + + HTML-TestSuite + 2017-08-08 + +

Szenario für Tests

+ + + + Simple + +

Nur Schemaprüfung.

+
+ http://www.xoev.de/de/validator/framework/1/createreportinput + http://validator.kosit.de/test-sample + http://validator.kosit.de/test-report + /test:simple + + + + Sample Schema + simple.xsd + + + + + Report für eRechnung + report.xsl + + + count(//cri:xmlSyntaxError) = 0 +
+ + + NoAcceptMatch + +

Nur Schemaprüfung. Keine AcceptMatch deklaration

+

Testen, ob auch alte Konfiguration funktionioeren

+
+ http://validator.kosit.de/test-sample + /test:foo + + + + Sample Schema + simple.xsd + + + + + Report für eRechnung + report.xsl + + +
+ + + + + default + report.xsl + + + + From 8d49b0fea37d00090e7311d46cc6bd8765775b15 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 17 May 2019 12:09:08 +0200 Subject: [PATCH 05/25] (fix) compile --- .../java/de/kosit/validationtool/impl/DefaultCheckTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java index 1e0f69a..25b17c3 100644 --- a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java +++ b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java @@ -43,7 +43,7 @@ import de.kosit.validationtool.api.Result; * * @author Andreas Penski */ -public class DefaultCheckTest extends CheckTest { +public class DefaultCheckTest { private static final URL SCENARIO_DEFINITION = ScenarioRepositoryTest.class.getResource("/examples/UBLReady/scenarios-2.xml"); From 3d777fa8e5e67ebf7a6926c2e9afdb16e40dae27 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 17 May 2019 14:00:59 +0200 Subject: [PATCH 06/25] =?UTF-8?q?#21=20=C3=9Cbergabe=20von=20Fehlerinforma?= =?UTF-8?q?tion=20in=20der=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/kosit/validationtool/api/Result.java | 29 +++--- .../de/kosit/validationtool/api/XmlError.java | 43 ++++++++ .../cmd/ExtractHtmlContentAction.java | 50 ++++------ .../impl/CollectingErrorEventHandler.java | 63 ++++++------ .../validationtool/impl/DefaultCheck.java | 19 +++- .../validationtool/impl/DefaultResult.java | 97 +++++++++++++++++++ .../validationtool/impl/HtmlExtraction.java | 49 ++++++++++ .../impl/model/BaseXMLSyntaxError.java | 22 +++-- src/main/model/xsd/createReportInput.xsd | 2 +- .../impl/SimpleScenarioCheck.java | 1 + 10 files changed, 289 insertions(+), 86 deletions(-) create mode 100644 src/main/java/de/kosit/validationtool/api/XmlError.java create mode 100644 src/main/java/de/kosit/validationtool/impl/DefaultResult.java create mode 100644 src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java diff --git a/src/main/java/de/kosit/validationtool/api/Result.java b/src/main/java/de/kosit/validationtool/api/Result.java index 6d9eef7..5eca1f2 100644 --- a/src/main/java/de/kosit/validationtool/api/Result.java +++ b/src/main/java/de/kosit/validationtool/api/Result.java @@ -1,11 +1,9 @@ package de.kosit.validationtool.api; +import java.util.List; + import org.w3c.dom.Document; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import net.sf.saxon.dom.NodeOverNodeInfo; import net.sf.saxon.s9api.XdmNode; /** @@ -13,32 +11,33 @@ import net.sf.saxon.s9api.XdmNode; * * @author Andreas Penski */ -@Getter -@RequiredArgsConstructor -public class Result { + +public interface Result { /** Der generierte Report. */ - private final XdmNode report; + XdmNode getReport(); /** Das evaluierte Ergebnis. */ - private final AcceptRecommendation acceptRecommendation; + AcceptRecommendation getAcceptRecommendation(); /** * Gibt den Report als W3C-{@link Document} zurück. * * @return der Report */ - public Document getReportDocument() { - return (Document) NodeOverNodeInfo.wrap(getReport().getUnderlyingNode()); - } + Document getReportDocument(); /** * Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments. * * @return true wenn {@link AcceptRecommendation#ACCEPTABLE} */ - public boolean isAcceptable() { - return AcceptRecommendation.ACCEPTABLE.equals(acceptRecommendation); - } + boolean isAcceptable(); + + /** + * Gibt eine Liste mit gefundenen Schema-Validation-Fehler zurück. Diese Liste ist leer, wenn keine Fehler gefunden + * wurden. + */ + List getSchemaViolations(); } diff --git a/src/main/java/de/kosit/validationtool/api/XmlError.java b/src/main/java/de/kosit/validationtool/api/XmlError.java new file mode 100644 index 0000000..962b61e --- /dev/null +++ b/src/main/java/de/kosit/validationtool/api/XmlError.java @@ -0,0 +1,43 @@ +package de.kosit.validationtool.api; + +/** + * Fehlerobjekt für die Bereitstellung von Fehlern aus der internen Verarbeitung, bspw. Schema-Validation-Fehler. + * + * @author Andreas Penski + */ +public interface XmlError { + + /** + * Gibt die Fehlermeldung zurück. + * + * @return die Fehlermeldung + */ + String getMessage(); + + /** + * Zeigt den Schweregrad der Fehlermeldung an + * + * @return der Schweregrad + * @see Severity + */ + Severity getSeverity(); + + /** + * Gibt optional eine Zeilennummer an, aus der der Fehler resultiert. + * + * @return die Zeitelnnummer + */ + Integer getRowNumber(); + + /** + * Gibt optional eine Spaltennummer an, aus der der Fehler resultiert. + * + * @return die Spaltennummer + */ + Integer getColumnNumber(); + + enum Severity { + SEVERITY_WARNING, SEVERITY_ERROR, SEVERITY_FATAL_ERROR; + } + +} diff --git a/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java b/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java index 9124649..41f4f49 100644 --- a/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java +++ b/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java @@ -20,20 +20,17 @@ package de.kosit.validationtool.cmd; import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import de.kosit.validationtool.impl.ContentRepository; +import de.kosit.validationtool.impl.HtmlExtraction; import de.kosit.validationtool.impl.tasks.CheckAction; import net.sf.saxon.s9api.QName; import net.sf.saxon.s9api.SaxonApiException; import net.sf.saxon.s9api.Serializer; -import net.sf.saxon.s9api.XPathExecutable; -import net.sf.saxon.s9api.XPathSelector; import net.sf.saxon.s9api.XdmItem; import net.sf.saxon.s9api.XdmNode; @@ -48,49 +45,38 @@ class ExtractHtmlContentAction implements CheckAction { private static final QName NAME_ATTRIBUTE = new QName("data-report-type"); - private final ContentRepository repository; - private final Path outputDirectory; - private XPathExecutable executable; + private HtmlExtraction htmlExtraction; - @Override - public void check(Bag results) { - try { - final XPathSelector selector = getSelector(); - final XdmNode xdmSource = results.getReport(); - selector.setContextItem(xdmSource); - selector.forEach(m -> print(results.getName(), m)); + private ContentRepository repository; - } catch (SaxonApiException e) { - throw new IllegalStateException("Can not extract html content", e); - } + public ExtractHtmlContentAction(final ContentRepository repository, final Path outputDirectory) { + this.outputDirectory = outputDirectory; + this.htmlExtraction = new HtmlExtraction(repository); + this.repository = repository; } - private void print(String origName, XdmItem xdmItem) { - XdmNode node = (XdmNode) xdmItem; + @Override + public void check(final Bag results) { + this.htmlExtraction.extract(results.getReport()).forEach(i -> print(results.getName(), i)); + } + + private void print(final String origName, final XdmItem xdmItem) { + final XdmNode node = (XdmNode) xdmItem; final String name = origName + "-" + node.getAttributeValue(NAME_ATTRIBUTE); - final Path file = outputDirectory.resolve(name + ".html"); - final Serializer serializer = repository.getProcessor().newSerializer(file.toFile()); + final Path file = this.outputDirectory.resolve(name + ".html"); + final Serializer serializer = this.repository.getProcessor().newSerializer(file.toFile()); try { log.info("Writing report html '{}' to {}", name, file.toAbsolutePath()); serializer.serializeNode(node); - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { log.info("Error extracting html content to {}", file.toAbsolutePath(), e); } } - private XPathSelector getSelector() { - if (executable == null) { - Map ns = new HashMap<>(); - ns.put("html", "http://www.w3.org/1999/xhtml"); - executable = repository.createXPath("//html:html", ns); - } - return executable.load(); - } - @Override - public boolean isSkipped(Bag results) { + public boolean isSkipped(final Bag results) { if (results.getReport() == null) { log.warn("Can not extract html content. No report document found"); return true; diff --git a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java index 580ffb1..d88c940 100644 --- a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java +++ b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java @@ -51,26 +51,26 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro private static final int DEFAULT_ABORT_COUNT = 50; - private Collection errors = new ArrayList<>(); + private final Collection errors = new ArrayList<>(); - private int stopProcessCount = DEFAULT_ABORT_COUNT; + private final int stopProcessCount = DEFAULT_ABORT_COUNT; - private static XMLSyntaxError createError(XMLSyntaxErrorSeverity severity, String message) { - XMLSyntaxError e = new XMLSyntaxError(); + private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final String message) { + final XMLSyntaxError e = new XMLSyntaxError(); e.setSeverity(severity); e.setMessage(message); return e; } - private static XMLSyntaxError createError(XMLSyntaxErrorSeverity severity, SAXParseException exception) { - XMLSyntaxError e = createError(severity, exception.getMessage()); + private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final SAXParseException exception) { + final XMLSyntaxError e = createError(severity, exception.getMessage()); e.setRowNumber(exception.getLineNumber()); e.setColumnNumber(exception.getColumnNumber()); return e; } - private static XMLSyntaxError createError(XMLSyntaxErrorSeverity severity, TransformerException exception) { - XMLSyntaxError e = createError(severity, exception.getMessage()); + private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final TransformerException exception) { + final XMLSyntaxError e = createError(severity, exception.getMessage()); if (exception.getLocator() != null) { e.setRowNumber(exception.getLocator().getLineNumber()); e.setColumnNumber(exception.getLocator().getColumnNumber()); @@ -78,7 +78,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro return e; } - private static XMLSyntaxErrorSeverity translateSeverity(int severity) { + private static XMLSyntaxErrorSeverity translateSeverity(final int severity) { switch (severity) { case ValidationEvent.WARNING: return XMLSyntaxErrorSeverity.SEVERITY_WARNING; @@ -92,12 +92,12 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro } @Override - public boolean handleEvent(ValidationEvent event) { - XMLSyntaxError e = createError(translateSeverity(event.getSeverity()), event.getMessage()); + public boolean handleEvent(final ValidationEvent event) { + final XMLSyntaxError e = createError(translateSeverity(event.getSeverity()), event.getMessage()); e.setColumnNumber(event.getLocator().getColumnNumber()); e.setRowNumber(event.getLocator().getLineNumber()); - errors.add(e); - return stopProcessCount != errors.size(); + this.errors.add(e); + return this.stopProcessCount != this.errors.size(); } /** @@ -106,7 +106,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro * @return true wenn mindestens ein Fehler vorhanden ist. */ public boolean hasErrors() { - return hasEvents() && errors.stream().anyMatch(e -> e.getSeverity() != XMLSyntaxErrorSeverity.SEVERITY_WARNING); + return hasEvents() && this.errors.stream().anyMatch(e -> e.getSeverityCode() != XMLSyntaxErrorSeverity.SEVERITY_WARNING); } /** @@ -115,27 +115,27 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro * @return true wenn mindestens ein Validierungsereignis aufgetreten ist */ public boolean hasEvents() { - return !errors.isEmpty(); + return !this.errors.isEmpty(); } @Override - public void warning(SAXParseException exception) throws SAXException { - errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception)); + public void warning(final SAXParseException exception) throws SAXException { + this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception)); } @Override - public void error(SAXParseException exception) throws SAXException { - errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception)); + public void error(final SAXParseException exception) throws SAXException { + this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception)); } @Override - public void fatalError(SAXParseException exception) throws SAXException { - errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception)); + public void fatalError(final SAXParseException exception) throws SAXException { + this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception)); } @Override - public void message(XdmNode content, boolean terminate, SourceLocator locator) { - XMLSyntaxError e = new XMLSyntaxError(); + public void message(final XdmNode content, final boolean terminate, final SourceLocator locator) { + final XMLSyntaxError e = new XMLSyntaxError(); if (locator != null) { e.setColumnNumber(locator.getColumnNumber()); e.setRowNumber(locator.getLineNumber()); @@ -145,24 +145,25 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro } @Override - public void warning(TransformerException exception) throws TransformerException { - errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception)); + public void warning(final TransformerException exception) throws TransformerException { + this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_WARNING, exception)); } @Override - public void error(TransformerException exception) throws TransformerException { - errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception)); + public void error(final TransformerException exception) throws TransformerException { + this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_ERROR, exception)); } @Override - public void fatalError(TransformerException exception) throws TransformerException { - errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception)); + public void fatalError(final TransformerException exception) throws TransformerException { + this.errors.add(createError(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR, exception)); } public String getErrorDescription() { final StringJoiner joiner = new StringJoiner("\n"); - errors.forEach(e -> joiner - .add(e.getSeverity().value() + " " + e.getMessage() + " At row " + e.getRowNumber() + " at pos " + e.getColumnNumber())); + this.errors.forEach(e -> joiner + .add(e.getSeverityCode().value() + " " + e.getMessage() + " At row " + e.getRowNumber() + " at pos " + + e.getColumnNumber())); return joiner.toString(); } } \ No newline at end of file diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java index e540b92..52afd11 100644 --- a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java +++ b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java @@ -20,6 +20,7 @@ package de.kosit.validationtool.impl; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import lombok.Getter; @@ -29,7 +30,9 @@ import de.kosit.validationtool.api.Check; import de.kosit.validationtool.api.CheckConfiguration; import de.kosit.validationtool.api.Input; import de.kosit.validationtool.api.Result; +import de.kosit.validationtool.api.XmlError; import de.kosit.validationtool.impl.tasks.CheckAction; +import de.kosit.validationtool.impl.tasks.CheckAction.Bag; import de.kosit.validationtool.impl.tasks.ComputeAcceptanceAction; import de.kosit.validationtool.impl.tasks.CreateReportAction; import de.kosit.validationtool.impl.tasks.DocumentParseAction; @@ -41,6 +44,7 @@ import de.kosit.validationtool.model.reportInput.CreateReportInput; import de.kosit.validationtool.model.reportInput.DocumentIdentificationType; import de.kosit.validationtool.model.reportInput.EngineType; import de.kosit.validationtool.model.reportInput.ProcessingError; +import de.kosit.validationtool.model.reportInput.XMLSyntaxError; import net.sf.saxon.s9api.Processor; @@ -125,7 +129,20 @@ public class DefaultCheck implements Check { } t.setFinished(true); log.info("Finished check of {} in {}ms\n", t.getInput().getName(), System.currentTimeMillis() - started); - return new Result(t.getReport(), t.getAcceptStatus()); + return createResult(t); + } + + private Result createResult(final Bag t) { + final DefaultResult result = new DefaultResult(t.getReport(), t.getAcceptStatus(), this.contentRepository); + if (t.getSchemaValidationResult() != null) { + result.setSchemaViolations(convertErrors(t.getSchemaValidationResult().getErrors())); + } + return result; + } + + private static List convertErrors(final Collection errors) { + // noinspection unchecked + return (List) (List) errors; } private static void createDocumentIdentification(final CheckAction.Bag transporter) { diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultResult.java b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java new file mode 100644 index 0000000..aaa2712 --- /dev/null +++ b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java @@ -0,0 +1,97 @@ +package de.kosit.validationtool.impl; + +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +import de.kosit.validationtool.api.AcceptRecommendation; +import de.kosit.validationtool.api.Result; +import de.kosit.validationtool.api.XmlError; + +import net.sf.saxon.dom.NodeOverNodeInfo; +import net.sf.saxon.s9api.SaxonApiException; +import net.sf.saxon.s9api.Serializer; +import net.sf.saxon.s9api.XdmNode; + +/** + * @author Andreas Penski + */ + +public class DefaultResult implements Result { + + /** Der generierte Report. */ + @Getter + private final XdmNode report; + + /** Das evaluierte Ergebnis. */ + @Getter + private final AcceptRecommendation acceptRecommendation; + + private final HtmlExtraction htmlExtraction; + + @Setter(AccessLevel.PACKAGE) + @Getter + private List schemaViolations = new ArrayList<>(); + + public DefaultResult(final XdmNode report, final AcceptRecommendation recommendation, final ContentRepository repository) { + this.report = report; + this.acceptRecommendation = recommendation; + this.htmlExtraction = new HtmlExtraction(repository); + } + + /** + * Gibt den Report als W3C-{@link Document} zurück. + * + * @return der Report + */ + @Override + public Document getReportDocument() { + return (Document) NodeOverNodeInfo.wrap(getReport().getUnderlyingNode()); + } + + /** + * Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments. + * + * @return true wenn {@link AcceptRecommendation#ACCEPTABLE} + */ + @Override + public boolean isAcceptable() { + return AcceptRecommendation.ACCEPTABLE.equals(this.acceptRecommendation); + } + + public List extractHtmlAsString() { + return extractHtml().stream().map(this::convertToString).collect(Collectors.toList()); + } + + private String convertToString(final XdmNode element) { + try { + final StringWriter writer = new StringWriter(); + final Serializer serializer = ObjectFactory.createProcessor().newSerializer(writer); + serializer.serializeNode(element); + return writer.toString(); + } catch (SaxonApiException e) { + throw new IllegalStateException("Can not convert to string", e); + } + } + + public List extractHtmlAsElement() { + return extractHtml().stream().map(DefaultResult::convertToElement).collect(Collectors.toList()); + } + + private static Element convertToElement(final XdmNode xdmItem) { + return (Element) NodeOverNodeInfo.wrap(xdmItem.getUnderlyingNode()); + } + + public List extractHtml() { + return this.htmlExtraction.extract(getReport()); + } + +} diff --git a/src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java b/src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java new file mode 100644 index 0000000..3506976 --- /dev/null +++ b/src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java @@ -0,0 +1,49 @@ +package de.kosit.validationtool.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; + +import net.sf.saxon.s9api.SaxonApiException; +import net.sf.saxon.s9api.XPathExecutable; +import net.sf.saxon.s9api.XPathSelector; +import net.sf.saxon.s9api.XdmItem; +import net.sf.saxon.s9api.XdmNode; + +/** + * @author Andreas Penski + */ +@RequiredArgsConstructor +public class HtmlExtraction { + + private final ContentRepository repository; + + private XPathExecutable executable; + + public List extract(XdmNode xdmSource) { + try { + final XPathSelector selector = getSelector(); + selector.setContextItem(xdmSource); + return selector.stream().map(this::castToNode).collect(Collectors.toList()); + + } catch (SaxonApiException e) { + throw new IllegalStateException("Can not extract html content", e); + } + } + + private XdmNode castToNode(final XdmItem xdmItem) { + return (XdmNode) xdmItem; + } + + private XPathSelector getSelector() { + if (executable == null) { + Map ns = new HashMap<>(); + ns.put("html", "http://www.w3.org/1999/xhtml"); + executable = repository.createXPath("//html:html", ns); + } + return executable.load(); + } +} diff --git a/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java b/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java index d248332..fd83d67 100644 --- a/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java +++ b/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java @@ -21,6 +21,7 @@ package de.kosit.validationtool.impl.model; import org.slf4j.Logger; +import de.kosit.validationtool.api.XmlError; import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity; /** @@ -29,17 +30,17 @@ import de.kosit.validationtool.model.reportInput.XMLSyntaxErrorSeverity; * * @author Andreas Penski */ -public abstract class BaseXMLSyntaxError { +public abstract class BaseXMLSyntaxError implements XmlError { /** * Logged den Syntax-Fehler über einen definierten Logger. * * @param logger der Logger */ - public void log(Logger logger) { - String msgTemplate = "{} At row {} at pos {}"; - Object[] params = { getMessage(), getRowNumber(), getColumnNumber() }; - if (getSeverity() == XMLSyntaxErrorSeverity.SEVERITY_WARNING) { + public void log(final Logger logger) { + final String msgTemplate = "{} At row {} at pos {}"; + final Object[] params = { getMessage(), getRowNumber(), getColumnNumber() }; + if (getSeverityCode() == XMLSyntaxErrorSeverity.SEVERITY_WARNING) { logger.warn(msgTemplate, params); } else { logger.error(msgTemplate, params); @@ -57,6 +58,7 @@ public abstract class BaseXMLSyntaxError { * * @return Spalte des Fehlers */ + @Override public abstract Integer getColumnNumber(); /** @@ -64,6 +66,7 @@ public abstract class BaseXMLSyntaxError { * * @return Zeile des Fehlers */ + @Override public abstract Integer getRowNumber(); /** @@ -71,6 +74,7 @@ public abstract class BaseXMLSyntaxError { * * @return Fehlermeldung */ + @Override public abstract String getMessage(); /** @@ -78,5 +82,11 @@ public abstract class BaseXMLSyntaxError { * * @return severity */ - public abstract XMLSyntaxErrorSeverity getSeverity(); + public abstract XMLSyntaxErrorSeverity getSeverityCode(); + + @Override + public Severity getSeverity() { + final XMLSyntaxErrorSeverity code = getSeverityCode(); + return code != null ? Severity.valueOf(code.name()) : null; + } } diff --git a/src/main/model/xsd/createReportInput.xsd b/src/main/model/xsd/createReportInput.xsd index 0323008..07bf634 100644 --- a/src/main/model/xsd/createReportInput.xsd +++ b/src/main/model/xsd/createReportInput.xsd @@ -68,7 +68,7 @@ - + diff --git a/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java index 7f42f2c..8310c22 100644 --- a/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java +++ b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java @@ -42,6 +42,7 @@ public class SimpleScenarioCheck { final Result result = this.implementation.checkInput(InputFactory.read(Simple.INVALID.toURL())); assertThat(result).isNotNull(); assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.REJECT); + assertThat(result.getSchemaViolations()).isNotEmpty(); } @Test From 7ba7c84533121bee9705b99b2a4999dbc7ad8857 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 17 May 2019 14:05:48 +0200 Subject: [PATCH 07/25] (fix) names --- .../impl/CollectingErrorEventHandler.java | 4 ++-- .../impl/ScenarioRepository.java | 2 +- .../impl/tasks/DocumentParseAction.java | 18 +++++++++--------- src/main/model/xsd/createReportInput.xsd | 2 +- .../impl/DocumentParserTest.java | 6 +++--- .../impl/ScenarioRepositoryTest.java | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java index d88c940..b1daca8 100644 --- a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java +++ b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java @@ -57,7 +57,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro private static XMLSyntaxError createError(final XMLSyntaxErrorSeverity severity, final String message) { final XMLSyntaxError e = new XMLSyntaxError(); - e.setSeverity(severity); + e.setSeverityCode(severity); e.setMessage(message); return e; } @@ -141,7 +141,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro e.setRowNumber(locator.getLineNumber()); } e.setMessage("Error procesing" + content.getStringValue()); - e.setSeverity(terminate ? XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR : XMLSyntaxErrorSeverity.SEVERITY_WARNING); + e.setSeverityCode(terminate ? XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR : XMLSyntaxErrorSeverity.SEVERITY_WARNING); } @Override diff --git a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java index 3fea7e4..575cf42 100644 --- a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java +++ b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java @@ -94,7 +94,7 @@ public class ScenarioRepository { private static void checkVersion(final URI scenarioDefinition) { final DocumentParseAction p = new DocumentParseAction(); try { - final Result result = p.parseDocument(InputFactory.read(scenarioDefinition.toURL())); + final Result result = DocumentParseAction.parseDocument(InputFactory.read(scenarioDefinition.toURL())); if (result.isValid() && !isSupportedDocument(result.getObject())) { throw new IllegalStateException(String.format( "Specified scenario configuration %s is not supported.%nThis version only supports definitions of '%s'", diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java index 97f99f6..c141413 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java @@ -56,20 +56,20 @@ public class DocumentParseAction implements CheckAction { * @param content ein Dokument * @return Ergebnis des Parsings inklusive etwaiger Fehler */ - public Result parseDocument(Input content) { + public static Result parseDocument(final Input content) { if (content == null) { throw new IllegalArgumentException("Input may not be null"); } Result result; - try ( InputStream input = new ByteArrayInputStream(content.getContent()) ) { + try ( final InputStream input = new ByteArrayInputStream(content.getContent()) ) { final DocumentBuilder builder = ObjectFactory.createProcessor().newDocumentBuilder(); builder.setLineNumbering(true); - XdmNode doc = builder.build(new StreamSource(input)); + final XdmNode doc = builder.build(new StreamSource(input)); result = new Result<>(doc, Collections.emptyList()); - } catch (SaxonApiException | IOException e) { + } catch (final SaxonApiException | IOException e) { log.debug("Exception while parsing {}", content.getName(), e); - XMLSyntaxError error = new XMLSyntaxError(); - error.setSeverity(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR); + final XMLSyntaxError error = new XMLSyntaxError(); + error.setSeverityCode(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR); error.setMessage(String.format("IOException while reading resource %s: %s", content.getName(), e.getMessage())); result = new Result<>(Collections.singleton(error)); } @@ -78,9 +78,9 @@ public class DocumentParseAction implements CheckAction { } @Override - public void check(Bag results) { - Result parserResult = parseDocument(results.getInput()); - ValidationResultsWellformedness v = new ValidationResultsWellformedness(); + public void check(final Bag results) { + final Result parserResult = parseDocument(results.getInput()); + final ValidationResultsWellformedness v = new ValidationResultsWellformedness(); results.setParserResult(parserResult); v.getXmlSyntaxError().addAll(parserResult.getErrors()); results.getReportInput().setValidationResultsWellformedness(v); diff --git a/src/main/model/xsd/createReportInput.xsd b/src/main/model/xsd/createReportInput.xsd index 07bf634..9cc0390 100644 --- a/src/main/model/xsd/createReportInput.xsd +++ b/src/main/model/xsd/createReportInput.xsd @@ -68,7 +68,7 @@ - + diff --git a/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java b/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java index c6b8fd7..6f4e01c 100644 --- a/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java +++ b/src/test/java/de/kosit/validationtool/impl/DocumentParserTest.java @@ -60,7 +60,7 @@ public class DocumentParserTest { @Test public void testSimple() { - final Result result = this.parser.parseDocument(read(CONTENT)); + final Result result = DocumentParseAction.parseDocument(read(CONTENT)); assertThat(result).isNotNull(); assertThat(result.getObject()).isNotNull(); assertThat(result.getErrors()).isEmpty(); @@ -69,7 +69,7 @@ public class DocumentParserTest { @Test public void testIllformed() { - final Result result = this.parser.parseDocument(read(ILLFORMED)); + final Result result = DocumentParseAction.parseDocument(read(ILLFORMED)); assertThat(result).isNotNull(); assertThat(result.getErrors()).isNotEmpty(); assertThat(result.getObject()).isNull(); @@ -79,7 +79,7 @@ public class DocumentParserTest { @Test public void testNullInput() { this.exception.expect(IllegalArgumentException.class); - this.parser.parseDocument(null); + DocumentParseAction.parseDocument(null); } diff --git a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java index 0238f41..a261f43 100644 --- a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java +++ b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java @@ -99,7 +99,7 @@ public class ScenarioRepositoryTest { private static XdmNode load(final URL url) throws IOException { final DocumentParseAction p = new DocumentParseAction(); - return p.parseDocument(read(url)).getObject(); + return DocumentParseAction.parseDocument(read(url)).getObject(); } @Test From 65f4dfad68fb4c07518b0d90eb00f8f1e49bc7c4 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 17 May 2019 14:25:45 +0200 Subject: [PATCH 08/25] #21 HTML Extraktion mit in der API angebunden --- .../de/kosit/validationtool/api/Result.java | 24 +++++++++++++++++++ .../impl/model/BaseXMLSyntaxError.java | 5 ++++ .../validationtool/impl/DefaultCheckTest.java | 11 +++++++++ 3 files changed, 40 insertions(+) diff --git a/src/main/java/de/kosit/validationtool/api/Result.java b/src/main/java/de/kosit/validationtool/api/Result.java index 5eca1f2..34c6b1e 100644 --- a/src/main/java/de/kosit/validationtool/api/Result.java +++ b/src/main/java/de/kosit/validationtool/api/Result.java @@ -3,6 +3,7 @@ package de.kosit.validationtool.api; import java.util.List; import org.w3c.dom.Document; +import org.w3c.dom.Element; import net.sf.saxon.s9api.XdmNode; @@ -40,4 +41,27 @@ public interface Result { */ List getSchemaViolations(); + // TODO scheitert momentan daran, das intern kein svlr o.ä. zur Verfügung steht + // List getSchematronResult(); + /** + * Extrahiert evtl. vorhandenes HTML aus dem Report und stellt diese als {@link XdmNode}-Objekt zur Verfügung. + * + * @return HTML-Nodes + */ + List extractHtml(); + + /** + * Extrahiert evtl. vorhandenes HTML aus dem Report und stellt diese als {@link String} zur Verfügung. + * + * @return HTML-Nodes + */ + List extractHtmlAsString(); + + /** + * Extrahiert evtl. vorhandenes HTML aus dem Report und stellt diese im als {@link Element}-Objekt zur Verfügung. + * + * @return HTML-Nodes + */ + List extractHtmlAsElement(); + } diff --git a/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java b/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java index fd83d67..ed4e188 100644 --- a/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java +++ b/src/main/java/de/kosit/validationtool/impl/model/BaseXMLSyntaxError.java @@ -84,6 +84,11 @@ public abstract class BaseXMLSyntaxError implements XmlError { */ public abstract XMLSyntaxErrorSeverity getSeverityCode(); + /** + * Dies ist der API-Zugriff. Es gibt zwei Methoden, weil es für die API einen abweichenden Typ gibt. + * + * @return der Schweregrad + */ @Override public Severity getSeverity() { final XMLSyntaxErrorSeverity code = getSeverityCode(); diff --git a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java index 25b17c3..ae69497 100644 --- a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java +++ b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java @@ -92,4 +92,15 @@ public class DefaultCheckTest { assertThat(docs).hasSize(MULTI_COUNT); } + @Test + public void testExtractHtml() { + final DefaultResult doc = (DefaultResult) this.implementation.checkInput(read(VALID_EXAMPLE)); + assertThat(doc).isNotNull(); + assertThat(doc.getReport()).isNotNull(); + assertThat(doc.isAcceptable()).isFalse(); + assertThat(doc.extractHtmlAsString()).isNotEmpty(); + assertThat(doc.extractHtmlAsElement()).isNotEmpty(); + assertThat(doc.extractHtml()).isNotEmpty(); + } + } From b350334a045e0daebc0e0bc12a37e7d2f3e1bc80 Mon Sep 17 00:00:00 2001 From: Andreas Penski Date: Fri, 17 May 2019 14:30:31 +0200 Subject: [PATCH 09/25] Update Result.java --- src/main/java/de/kosit/validationtool/api/Result.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/de/kosit/validationtool/api/Result.java b/src/main/java/de/kosit/validationtool/api/Result.java index 34c6b1e..0aba434 100644 --- a/src/main/java/de/kosit/validationtool/api/Result.java +++ b/src/main/java/de/kosit/validationtool/api/Result.java @@ -40,9 +40,12 @@ public interface Result { * wurden. */ List getSchemaViolations(); + // TODO scheitert momentan daran, das intern kein svlr o.ä. zur Verfügung steht // List getSchematronResult(); + + /** * Extrahiert evtl. vorhandenes HTML aus dem Report und stellt diese als {@link XdmNode}-Objekt zur Verfügung. * From cadedaf062f06a3b53aa4b8b2bde5f49c7d49c16 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 17 May 2019 16:11:02 +0200 Subject: [PATCH 10/25] #21 Umbau NoScenarioMatch, als Fallback match --- .../validationtool/impl/DefaultCheck.java | 2 +- .../validationtool/impl/HtmlExtraction.java | 2 + .../impl/ScenarioRepository.java | 54 ++++++++++--------- .../impl/model/BaseScenario.java | 2 - .../impl/tasks/ComputeAcceptanceAction.java | 2 +- .../impl/tasks/CreateReportAction.java | 22 ++++---- .../impl/ScenarioRepositoryTest.java | 13 ++++- .../impl/SimpleScenarioCheck.java | 3 +- 8 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java index 52afd11..7ecb1aa 100644 --- a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java +++ b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java @@ -81,7 +81,7 @@ public class DefaultCheck implements Check { final Processor processor = ObjectFactory.createProcessor(); this.conversionService = new ConversionService(); this.contentRepository = new ContentRepository(processor, configuration.getScenarioRepository()); - this.repository = new ScenarioRepository(processor, this.contentRepository); + this.repository = new ScenarioRepository(this.contentRepository); this.repository.initialize(configuration); this.checkSteps = new ArrayList<>(); this.checkSteps.add(DefaultCheck::createDocumentIdentification); diff --git a/src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java b/src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java index 3506976..2e1210d 100644 --- a/src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java +++ b/src/main/java/de/kosit/validationtool/impl/HtmlExtraction.java @@ -14,6 +14,8 @@ import net.sf.saxon.s9api.XdmItem; import net.sf.saxon.s9api.XdmNode; /** + * Funktion zum Extrahieren von HTML-Artefakten / Knoten aus einem XML-Dokument. + * * @author Andreas Penski */ @RequiredArgsConstructor diff --git a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java index 575cf42..294500c 100644 --- a/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java +++ b/src/main/java/de/kosit/validationtool/impl/ScenarioRepository.java @@ -23,13 +23,14 @@ import static org.apache.commons.lang3.StringUtils.startsWith; import java.net.MalformedURLException; import java.net.URI; -import java.util.Iterator; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import de.kosit.validationtool.api.CheckConfiguration; @@ -37,16 +38,15 @@ import de.kosit.validationtool.api.InputFactory; import de.kosit.validationtool.impl.model.Result; import de.kosit.validationtool.impl.tasks.DocumentParseAction; import de.kosit.validationtool.model.reportInput.XMLSyntaxError; +import de.kosit.validationtool.model.scenarios.CreateReportType; import de.kosit.validationtool.model.scenarios.ScenarioType; import de.kosit.validationtool.model.scenarios.Scenarios; -import net.sf.saxon.s9api.Processor; import net.sf.saxon.s9api.QName; import net.sf.saxon.s9api.SaxonApiException; import net.sf.saxon.s9api.XPathSelector; import net.sf.saxon.s9api.XdmNode; import net.sf.saxon.s9api.XdmNodeKind; -import net.sf.saxon.s9api.XsltExecutable; /** * Repository for die aktiven Szenario einer Prüfinstanz. @@ -61,18 +61,17 @@ public class ScenarioRepository { private static final String SUPPORTED_MAJOR_VERSION_SCHEMA = "http://www.xoev.de/de/validator/framework/1/scenarios"; - @Getter(value = AccessLevel.PRIVATE) - - private final Processor processor; @Getter(value = AccessLevel.PRIVATE) private final ContentRepository repository; - private XsltExecutable noScenarioReport; - @Getter private Scenarios scenarios; + @Setter(AccessLevel.PACKAGE) + @Getter + private ScenarioType fallbackScenario; + private static boolean isSupportedDocument(final XdmNode doc) { final XdmNode root = findRoot(doc); final String frameworkVersion = root.getAttributeValue(new QName("frameworkVersion")); @@ -81,9 +80,7 @@ public class ScenarioRepository { } private static XdmNode findRoot(final XdmNode doc) { - final Iterator it = doc.children().iterator(); - while (it.hasNext()) { - final XdmNode node = it.next(); + for (final XdmNode node : doc.children()) { if (node.getNodeKind() == XdmNodeKind.ELEMENT) { return node; } @@ -92,7 +89,6 @@ public class ScenarioRepository { } private static void checkVersion(final URI scenarioDefinition) { - final DocumentParseAction p = new DocumentParseAction(); try { final Result result = DocumentParseAction.parseDocument(InputFactory.read(scenarioDefinition.toURL())); if (result.isValid() && !isSupportedDocument(result.getObject())) { @@ -106,13 +102,7 @@ public class ScenarioRepository { } } - public XsltExecutable getNoScenarioReport() { - if (this.noScenarioReport == null) { - this.noScenarioReport = this.repository - .loadXsltScript(URI.create(this.scenarios.getNoScenarioReport().getResource().getLocation())); - } - return this.noScenarioReport; - } + /** * Initialisiert das Repository mit der angegebenen Konfiguration. @@ -136,7 +126,7 @@ public class ScenarioRepository { handler.getErrorDescription())); } // initialize fallback report eager - getNoScenarioReport(); + this.fallbackScenario = createFallback(); } @@ -150,26 +140,39 @@ public class ScenarioRepository { } /** - * Ermittelt für das angegebene Dokument das passende Szenario. - * + * Ermittelt für das gegebene Dokument das passende Szenario. + * * @param document das Eingabedokument * @return ein Ergebnis-Objekt zur weiteren Verarbeitung */ public Result selectScenario(final XdmNode document) { - Result result = new Result<>(); + final Result result; final List collect = this.scenarios.getScenario().stream().filter(s -> match(document, s)) .collect(Collectors.toList()); if (collect.size() == 1) { result = new Result<>(collect.get(0)); } else if (collect.isEmpty()) { - result.getErrors().add("None of the loaded scenarios matches the specified document"); + result = new Result<>(getFallbackScenario(), + Collections.singleton("None of the loaded scenarios matches the specified document")); } else { - result.getErrors().add("More than on scenario matches the specified document"); + result = new Result<>(getFallbackScenario(), Collections.singleton("More than on scenario matches the specified document")); } return result; } + private ScenarioType createFallback() { + final ScenarioType t = new ScenarioType(); + t.setName("Fallback-Scenario"); + final CreateReportType reportType = new CreateReportType(); + reportType.setResource(this.scenarios.getNoScenarioReport().getResource()); + t.initialize(this.repository, true); + // always reject + t.setAcceptMatch("count(/)<0"); + t.setCreateReport(reportType); + return t; + } + private static boolean match(final XdmNode document, final ScenarioType scenario) { try { final XPathSelector selector = scenario.getSelector(); @@ -179,7 +182,6 @@ public class ScenarioRepository { log.error("Error evaluating xpath expression", e); } return false; - } void initialize(final Scenarios def) { diff --git a/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java b/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java index 9bf9ec2..b90f7e1 100644 --- a/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java +++ b/src/main/java/de/kosit/validationtool/impl/model/BaseScenario.java @@ -160,8 +160,6 @@ public abstract class BaseScenario { */ public XPathSelector getAcceptSelector() { if (this.acceptExecutable == null) { - System.out.println(getAcceptMatch()); - System.out.println(prepareNamespaces()); this.acceptExecutable = this.repository.createXPath(getAcceptMatch(), prepareNamespaces()); } return this.acceptExecutable.load(); diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java index 67d4ae4..e24ba4c 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/ComputeAcceptanceAction.java @@ -36,7 +36,7 @@ public class ComputeAcceptanceAction implements CheckAction { @Override public boolean isSkipped(final Bag results) { - return results.getScenarioSelectionResult().isInvalid(); + return results.getReport() == null; } } diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java index 966859a..3cb3a1f 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/CreateReportAction.java @@ -61,24 +61,24 @@ public class CreateReportAction implements CheckAction { private final URI contentRepository; - private static XsltExecutable loadFromScenario(ScenarioType object) { + private static XsltExecutable loadFromScenario(final ScenarioType object) { return object.getReportTransformation().getExecutable(); } @Override - public void check(Bag results) { - final DocumentBuilder documentBuilder = processor.newDocumentBuilder(); + public void check(final Bag results) { + final DocumentBuilder documentBuilder = this.processor.newDocumentBuilder(); try { final XdmNode parsedDocument = results.getParserResult().isValid() ? results.getParserResult().getObject() : ObjectFactory.createProcessor().newDocumentBuilder().newBuildingContentHandler().getDocumentNode(); - final Document reportInput = conversionService.writeDocument(results.getReportInput()); + final Document reportInput = this.conversionService.writeDocument(results.getReportInput()); final XdmNode root = documentBuilder.build(new DOMSource(reportInput)); final XsltTransformer transformer = getTransformation(results).load(); transformer.setInitialContextNode(root); - CollectingErrorEventHandler e = new CollectingErrorEventHandler(); - RelativeUriResolver resolver = new RelativeUriResolver(contentRepository); + final CollectingErrorEventHandler e = new CollectingErrorEventHandler(); + final RelativeUriResolver resolver = new RelativeUriResolver(this.contentRepository); transformer.setMessageListener(e); transformer.setURIResolver(resolver); transformer.getUnderlyingController().setUnparsedTextURIResolver(resolver); @@ -88,17 +88,15 @@ public class CreateReportAction implements CheckAction { transformer.transform(); results.setReport(destination.getXdmNode()); - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { throw new IllegalStateException("Can not create final report", e); } } - private XsltExecutable getTransformation(Bag results) { + private static XsltExecutable getTransformation(final Bag results) { final Result scenario = results.getScenarioSelectionResult(); - return scenario != null && scenario.isValid() ? loadFromScenario(scenario.getObject()) : loadFallback(); + return loadFromScenario(scenario.getObject()); } - private XsltExecutable loadFallback() { - return repository.getNoScenarioReport(); - } + } diff --git a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java index a261f43..dbaa52b 100644 --- a/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java +++ b/src/test/java/de/kosit/validationtool/impl/ScenarioRepositoryTest.java @@ -66,7 +66,7 @@ public class ScenarioRepositoryTest { t.setName("Test"); t.initialize(this.content, true); def.getScenario().add(t); - this.repository = new ScenarioRepository(ObjectFactory.createProcessor(), this.content); + this.repository = new ScenarioRepository(this.content); this.repository.initialize(def); } @@ -80,9 +80,14 @@ public class ScenarioRepositoryTest { @Test public void testNonMatch() throws Exception { this.repository.getScenarios().getScenario().clear(); + final ScenarioType fallback = new ScenarioType(); + fallback.setName("fallback"); + this.repository.setFallbackScenario(fallback); final Result scenario = this.repository.selectScenario(load(SAMPLE)); assertThat(scenario).isNotNull(); assertThat(scenario.isValid()).isFalse(); + assertThat(scenario.getObject().getName()).isEqualTo("fallback"); + } @Test @@ -92,9 +97,13 @@ public class ScenarioRepositoryTest { t.setName("Test"); t.initialize(this.content, true); this.repository.getScenarios().getScenario().add(t); + final ScenarioType fallback = new ScenarioType(); + fallback.setName("fallback"); + this.repository.setFallbackScenario(fallback); final Result scenario = this.repository.selectScenario(load(SAMPLE)); assertThat(scenario).isNotNull(); assertThat(scenario.isValid()).isFalse(); + assertThat(scenario.getObject().getName()).isEqualTo("fallback"); } private static XdmNode load(final URL url) throws IOException { @@ -105,7 +114,7 @@ public class ScenarioRepositoryTest { @Test public void loadFromJar() throws URISyntaxException { this.content = new ContentRepository(ObjectFactory.createProcessor(), Helper.JAR_REPOSITORY.toURI()); - this.repository = new ScenarioRepository(ObjectFactory.createProcessor(), this.content); + this.repository = new ScenarioRepository(this.content); final CheckConfiguration conf = new CheckConfiguration( ScenarioRepository.class.getClassLoader().getResource("xrechnung/scenarios.xml").toURI()); this.repository.initialize(conf); diff --git a/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java index 8310c22..1444646 100644 --- a/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java +++ b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheck.java @@ -49,7 +49,7 @@ public class SimpleScenarioCheck { public void testUnknown() throws MalformedURLException { final Result result = this.implementation.checkInput(InputFactory.read(Simple.UNKNOWN.toURL())); assertThat(result).isNotNull(); - assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.UNDEFINED); + assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.REJECT); } @Test @@ -58,4 +58,5 @@ public class SimpleScenarioCheck { assertThat(result).isNotNull(); assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.UNDEFINED); } + } From 293a6f0847b3b6a6a5b07717d8cbe53a50362e69 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 17 May 2019 16:49:33 +0200 Subject: [PATCH 11/25] (chore) changelog erweitert --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2eada5..464c38b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Enhanced API-Usage e.g. return Result object with processing information - Support loading scenarios and content from a JAR-File - Simple Daemon-Mode exposing validation functionality via http From b3e9d3a244195624ab39be7d557cbec4323da6a9 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 24 May 2019 10:12:04 +0200 Subject: [PATCH 12/25] =?UTF-8?q?(chore)=20HTML-Extraktions-Funktionen=20a?= =?UTF-8?q?us=20dem=20Interface=20entfernt.=20Bleibt=20in=20der=20Default-?= =?UTF-8?q?Implementierung=20vorhanden.=20Entwickler=20m=C3=BCssen=20dann?= =?UTF-8?q?=20aber=20casten.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/kosit/validationtool/api/Result.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/src/main/java/de/kosit/validationtool/api/Result.java b/src/main/java/de/kosit/validationtool/api/Result.java index 0aba434..b4b9dcb 100644 --- a/src/main/java/de/kosit/validationtool/api/Result.java +++ b/src/main/java/de/kosit/validationtool/api/Result.java @@ -3,7 +3,6 @@ package de.kosit.validationtool.api; import java.util.List; import org.w3c.dom.Document; -import org.w3c.dom.Element; import net.sf.saxon.s9api.XdmNode; @@ -44,27 +43,5 @@ public interface Result { // TODO scheitert momentan daran, das intern kein svlr o.ä. zur Verfügung steht // List getSchematronResult(); - - - /** - * Extrahiert evtl. vorhandenes HTML aus dem Report und stellt diese als {@link XdmNode}-Objekt zur Verfügung. - * - * @return HTML-Nodes - */ - List extractHtml(); - - /** - * Extrahiert evtl. vorhandenes HTML aus dem Report und stellt diese als {@link String} zur Verfügung. - * - * @return HTML-Nodes - */ - List extractHtmlAsString(); - - /** - * Extrahiert evtl. vorhandenes HTML aus dem Report und stellt diese im als {@link Element}-Objekt zur Verfügung. - * - * @return HTML-Nodes - */ - List extractHtmlAsElement(); } From 2069c0d04eb0594f0aefe47ddf2d86b5791e4855 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Fri, 24 May 2019 11:32:08 +0200 Subject: [PATCH 13/25] =?UTF-8?q?(chore)=20R=C3=BCckgabe=20der=20Schematro?= =?UTF-8?q?n-Ergebnisse=20als=20komplexes=20Objekt=20in=20der=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/kosit/validationtool/api/Result.java | 10 +- .../impl/ConversionService.java | 93 ++++++---- .../validationtool/impl/DefaultCheck.java | 5 +- .../validationtool/impl/DefaultResult.java | 12 +- .../validationtool/impl/model/BaseOutput.java | 72 ++++++++ .../tasks/SchematronValidationAction.java | 28 +-- .../impl/tasks/ValidateReportInputAction.java | 8 +- src/main/model/binding/global.xjb | 7 + src/main/model/xsd/createReportInput.xsd | 7 +- src/main/model/xsd/svrl-kosit.xsd | 161 ++++++++++++++++++ src/main/model/xsd/xml.xsd | 10 ++ 11 files changed, 354 insertions(+), 59 deletions(-) create mode 100644 src/main/java/de/kosit/validationtool/impl/model/BaseOutput.java create mode 100644 src/main/model/xsd/svrl-kosit.xsd create mode 100644 src/main/model/xsd/xml.xsd diff --git a/src/main/java/de/kosit/validationtool/api/Result.java b/src/main/java/de/kosit/validationtool/api/Result.java index b4b9dcb..27d4adc 100644 --- a/src/main/java/de/kosit/validationtool/api/Result.java +++ b/src/main/java/de/kosit/validationtool/api/Result.java @@ -2,6 +2,7 @@ package de.kosit.validationtool.api; import java.util.List; +import org.oclc.purl.dsdl.svrl.SchematronOutput; import org.w3c.dom.Document; import net.sf.saxon.s9api.XdmNode; @@ -39,9 +40,12 @@ public interface Result { * wurden. */ List getSchemaViolations(); - - // TODO scheitert momentan daran, das intern kein svlr o.ä. zur Verfügung steht - // List getSchematronResult(); + /** + * Liefert die Ergebnisse der Schematron-Prüfungen, in der Reihenfolge der Szenario-Konfiguration. + * + * @return Liste mit Schematron-Ergebnissen + */ + List getSchematronResult(); } diff --git a/src/main/java/de/kosit/validationtool/impl/ConversionService.java b/src/main/java/de/kosit/validationtool/impl/ConversionService.java index eea4acc..2bc4185 100644 --- a/src/main/java/de/kosit/validationtool/impl/ConversionService.java +++ b/src/main/java/de/kosit/validationtool/impl/ConversionService.java @@ -27,14 +27,26 @@ import java.util.Arrays; import java.util.Collection; import java.util.StringJoiner; -import javax.xml.bind.*; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.JAXBIntrospector; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.ValidationEventHandler; import javax.xml.bind.annotation.XmlRegistry; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; -import javax.xml.stream.*; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; +import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; +import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Document; import lombok.extern.slf4j.Slf4j; @@ -45,6 +57,32 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class ConversionService { + /** + * Exception while serializing/deserializing with jaxb. + */ + public class ConversionExeption extends RuntimeException { + + /** + * Constructor. + * + * @param message the message. + * @param cause the cause + */ + public ConversionExeption(final String message, final Exception cause) { + super(message, cause); + } + + /** + * Constructor. + * + * @param message the message. + */ + public ConversionExeption(final String message) { + super(message); + } + } + + private static final int MAX_LOG_CONTENT = 50; // context setup private JAXBContext jaxbContext; @@ -68,7 +106,7 @@ public class ConversionService { * Initialisiert den default context; Alle Packages mit {@link XmlRegistry XmlRegistries}. */ public void initialize() { - Collection p = new ArrayList<>(); + final Collection p = new ArrayList<>(); p.add(de.kosit.validationtool.model.reportInput.ObjectFactory.class.getPackage()); p.add(de.kosit.validationtool.model.scenarios.ObjectFactory.class.getPackage()); initialize(p); @@ -77,6 +115,7 @@ public class ConversionService { public void initialize(final Package... context) { initialize(Arrays.asList(context)); } + /** * Initialisiert den conversion service mit den angegegebenen Packages. * @@ -84,7 +123,7 @@ public class ConversionService { */ public void initialize(final Collection context) { final String[] packages = context != null ? context.stream().map(Package::getName).toArray(String[]::new) : new String[0]; - StringJoiner joiner = new StringJoiner(":"); + final StringJoiner joiner = new StringJoiner(":"); Arrays.stream(packages).forEach(p -> joiner.add(p)); initialize(joiner.toString()); } @@ -121,11 +160,11 @@ public class ConversionService { return readXml(xml, type, null, null); } - public T readXml(final URI xml, final Class type, Schema schema) { + public T readXml(final URI xml, final Class type, final Schema schema) { return readXml(xml, type, schema, null); } - public T readXml(final URI xml, final Class type, Schema schema, ValidationEventHandler handler) { + public T readXml(final URI xml, final Class type, final Schema schema, final ValidationEventHandler handler) { checkInputEmpty(xml); checkTypeEmpty(type); CollectingErrorEventHandler defaultHandler = null; @@ -167,11 +206,11 @@ public class ConversionService { return writeXml(model, null, null); } - public String writeXml(final T model, Schema schema, ValidationEventHandler handler) { + public String writeXml(final T model, final Schema schema, final ValidationEventHandler handler) { if (model == null) { throw new ConversionExeption("Can not serialize null"); } - try ( StringWriter w = new StringWriter() ) { + try ( final StringWriter w = new StringWriter() ) { final JAXBIntrospector introspector = getJaxbContext().createJAXBIntrospector(); final Marshaller marshaller = getJaxbContext().createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); @@ -189,17 +228,17 @@ public class ConversionService { } xmlStreamWriter.flush(); return w.toString(); - } catch (JAXBException | IOException | XMLStreamException e) { + } catch (final JAXBException | IOException | XMLStreamException e) { throw new ConversionExeption(String.format("Error serializing Object %s", model.getClass().getName()), e); } } - public Document writeDocument(T input) { + public Document writeDocument(final T input) { if (input == null) { throw new ConversionExeption("Can not serialize null"); } - DocumentBuilder builder = ObjectFactory.createDocumentBuilder(false); - Document document = builder.newDocument(); + final DocumentBuilder builder = ObjectFactory.createDocumentBuilder(false); + final Document document = builder.newDocument(); // Marshal the Object to a Document Marshaller marshaller = null; @@ -208,34 +247,20 @@ public class ConversionService { marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(input, document); return document; - } catch (JAXBException e) { + } catch (final JAXBException e) { throw new ConversionExeption(String.format("Error serializing Object %s to document", input.getClass().getName()), e); } } - /** - * Exception while serializing/deserializing with jaxb. - */ - public class ConversionExeption extends RuntimeException { + public T readDocument(final Source source, final Class type) { + try { + final Unmarshaller u = getJaxbContext().createUnmarshaller(); - /** - * Constructor. - * - * @param message the message. - * @param cause the cause - */ - public ConversionExeption(final String message, final Exception cause) { - super(message, cause); - } + return u.unmarshal(source, type).getValue(); - /** - * Constructor. - * - * @param message the message. - */ - public ConversionExeption(final String message) { - super(message); + } catch (final JAXBException e) { + throw new ConversionExeption(String.format("Can not unmarshal to type %s: %s", type.getSimpleName(), + StringUtils.abbreviate(source.getSystemId(), MAX_LOG_CONTENT)), e); } } - } diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java index 7ecb1aa..a411a99 100644 --- a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java +++ b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java @@ -22,6 +22,7 @@ package de.kosit.validationtool.impl; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -88,7 +89,7 @@ public class DefaultCheck implements Check { this.checkSteps.add(new DocumentParseAction()); this.checkSteps.add(new ScenarioSelectionAction(this.repository)); this.checkSteps.add(new SchemaValidationAction()); - this.checkSteps.add(new SchematronValidationAction(configuration.getScenarioRepository())); + this.checkSteps.add(new SchematronValidationAction(configuration.getScenarioRepository(), this.conversionService)); this.checkSteps.add(new ValidateReportInputAction(this.conversionService, this.contentRepository.getReportInputSchema())); this.checkSteps .add(new CreateReportAction(processor, this.conversionService, this.repository, configuration.getScenarioRepository())); @@ -137,6 +138,8 @@ public class DefaultCheck implements Check { if (t.getSchemaValidationResult() != null) { result.setSchemaViolations(convertErrors(t.getSchemaValidationResult().getErrors())); } + result.setSchematronResult(t.getReportInput().getValidationResultsSchematron().stream() + .map(e -> e.getResults().getSchematronOutput()).collect(Collectors.toList())); return result; } diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultResult.java b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java index aaa2712..192008d 100644 --- a/src/main/java/de/kosit/validationtool/impl/DefaultResult.java +++ b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import org.oclc.purl.dsdl.svrl.SchematronOutput; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -41,6 +42,10 @@ public class DefaultResult implements Result { @Getter private List schemaViolations = new ArrayList<>(); + @Getter + @Setter(AccessLevel.PACKAGE) + private List schematronResult; + public DefaultResult(final XdmNode report, final AcceptRecommendation recommendation, final ContentRepository repository) { this.report = report; this.acceptRecommendation = recommendation; @@ -67,17 +72,18 @@ public class DefaultResult implements Result { return AcceptRecommendation.ACCEPTABLE.equals(this.acceptRecommendation); } + public List extractHtmlAsString() { - return extractHtml().stream().map(this::convertToString).collect(Collectors.toList()); + return extractHtml().stream().map(DefaultResult::convertToString).collect(Collectors.toList()); } - private String convertToString(final XdmNode element) { + private static String convertToString(final XdmNode element) { try { final StringWriter writer = new StringWriter(); final Serializer serializer = ObjectFactory.createProcessor().newSerializer(writer); serializer.serializeNode(element); return writer.toString(); - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { throw new IllegalStateException("Can not convert to string", e); } } diff --git a/src/main/java/de/kosit/validationtool/impl/model/BaseOutput.java b/src/main/java/de/kosit/validationtool/impl/model/BaseOutput.java new file mode 100644 index 0000000..b6a670b --- /dev/null +++ b/src/main/java/de/kosit/validationtool/impl/model/BaseOutput.java @@ -0,0 +1,72 @@ +package de.kosit.validationtool.impl.model; + +import java.io.Serializable; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.oclc.purl.dsdl.svrl.ActivePattern; +import org.oclc.purl.dsdl.svrl.FailedAssert; +import org.oclc.purl.dsdl.svrl.FiredRule; + +/** + * Basis-Klasse um spezifische Erweiterungen an der generierten Klasse {@link org.oclc.purl.dsdl.svrl.SchematronOutput} + * umzusetzen. + * + * @author Andreas Penski + */ +public abstract class BaseOutput { + + public abstract List getActivePatternAndFiredRuleAndFailedAssert(); + + /** + * Gibt die Liste der {@link FailedAssert} zurück + * + * @return Liste mit {@link FailedAssert} + */ + public List getFailedAsserts() { + return filter(FailedAssert.class); + } + + /** + * Gibt die Liste der {@link FailedAssert} zurück + * + * @return Liste mit {@link FailedAssert} + */ + public List getFiredRules() { + return filter(FiredRule.class); + } + + /** + * Ermittelt, ob es bei der Validierung {@link FailedAssert}s gab. + * + * @return true wenn mindestens ein {@link FailedAssert} vorhanden ist + */ + public boolean hasFailedAsserts() { + return getFailedAsserts().size() > 0; + } + + /** + * Gibt die Liste der {@link ActivePattern} zurück + * + * @return Liste mit {@link ActivePattern} + */ + public List getActivePatterns() { + return filter(ActivePattern.class); + } + + private List filter(final Class type) { + return getActivePatternAndFiredRuleAndFailedAssert().stream().filter(type::isInstance).map(type::cast).collect(Collectors.toList()); + } + + /** + * Sucht nach einem {@link FailedAssert} mit einem definierten Namen. + * + * @param name der Name + * @return Optional mit dem {@link FailedAssert} + */ + public Optional findFailedAssert(final String name) { + return getFailedAsserts().stream().filter(e -> e.getId().equals(name)).findAny(); + } + +} diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java index e27a660..f2e544d 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java @@ -23,11 +23,15 @@ import java.net.URI; import java.util.List; import java.util.stream.Collectors; +import javax.xml.transform.dom.DOMSource; + +import org.oclc.purl.dsdl.svrl.SchematronOutput; import org.w3c.dom.Document; import lombok.RequiredArgsConstructor; import de.kosit.validationtool.impl.CollectingErrorEventHandler; +import de.kosit.validationtool.impl.ConversionService; import de.kosit.validationtool.impl.ObjectFactory; import de.kosit.validationtool.impl.RelativeUriResolver; import de.kosit.validationtool.impl.model.BaseScenario; @@ -50,37 +54,39 @@ public class SchematronValidationAction implements CheckAction { private final URI repository; - private List validate(XdmNode document, ScenarioType scenario) { + private final ConversionService conversionService; + + private List validate(final XdmNode document, final ScenarioType scenario) { return scenario.getSchematronValidations().stream().map(v -> validate(document, v)).collect(Collectors.toList()); } - private ValidationResultsSchematron validate(XdmNode document, BaseScenario.Transformation validation) { + private ValidationResultsSchematron validate(final XdmNode document, final BaseScenario.Transformation validation) { try { final XsltTransformer transformer = validation.getExecutable().load(); // resolving nur relative zum Repository - final RelativeUriResolver resolver = new RelativeUriResolver(repository); + final RelativeUriResolver resolver = new RelativeUriResolver(this.repository); transformer.setURIResolver(resolver); - CollectingErrorEventHandler e = new CollectingErrorEventHandler(); + final CollectingErrorEventHandler e = new CollectingErrorEventHandler(); transformer.setMessageListener(e); - Document result = ObjectFactory.createDocumentBuilder(false).newDocument(); + final Document result = ObjectFactory.createDocumentBuilder(false).newDocument(); transformer.setDestination(new DOMDestination(result)); transformer.setInitialContextNode(document); transformer.transform(); - ValidationResultsSchematron s = new ValidationResultsSchematron(); + final ValidationResultsSchematron s = new ValidationResultsSchematron(); s.setResource(validation.getResourceType()); - ValidationResultsSchematron.Results r = new ValidationResultsSchematron.Results(); - r.setAny(result.getDocumentElement()); + final ValidationResultsSchematron.Results r = new ValidationResultsSchematron.Results(); + r.setSchematronOutput(this.conversionService.readDocument(new DOMSource(result), SchematronOutput.class)); s.setResults(r); return s; - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { throw new IllegalStateException("Can not run schematron validation", e); } } @Override - public void check(Bag results) { + public void check(final Bag results) { final CreateReportInput report = results.getReportInput(); final List validationResult = validate(results.getParserResult().getObject(), results.getScenarioSelectionResult().getObject()); @@ -88,7 +94,7 @@ public class SchematronValidationAction implements CheckAction { } @Override - public boolean isSkipped(Bag results) { + public boolean isSkipped(final Bag results) { return results.getSchemaValidationResult() == null || results.getSchemaValidationResult().isInvalid(); } } diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/ValidateReportInputAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/ValidateReportInputAction.java index 57747d8..1cb0fb1 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/ValidateReportInputAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/ValidateReportInputAction.java @@ -45,7 +45,7 @@ public class ValidateReportInputAction implements CheckAction { private final Schema schema; @Override - public void check(Bag bag) { + public void check(final Bag bag) { final Result results = validate(bag.getReportInput()); if (!results.isValid()) { log.error("Report input has errors {}", results.getErrors()); @@ -60,9 +60,9 @@ public class ValidateReportInputAction implements CheckAction { * @param der Typ des Objekts * @return ein Validierungsergebnis */ - private Result validate(T object) { - CollectingErrorEventHandler h = new CollectingErrorEventHandler(); - final String result = conversionService.writeXml(object, schema, h); + private Result validate(final T object) { + final CollectingErrorEventHandler h = new CollectingErrorEventHandler(); + final String result = this.conversionService.writeXml(object, this.schema, h); return new Result<>(StringUtils.isNotBlank(result), h.getErrors()); } } diff --git a/src/main/model/binding/global.xjb b/src/main/model/binding/global.xjb index 1391881..b8e336f 100644 --- a/src/main/model/binding/global.xjb +++ b/src/main/model/binding/global.xjb @@ -52,4 +52,11 @@ + + + + de.kosit.validationtool.impl.model.BaseOutput + + + \ No newline at end of file diff --git a/src/main/model/xsd/createReportInput.xsd b/src/main/model/xsd/createReportInput.xsd index 9cc0390..e44c841 100644 --- a/src/main/model/xsd/createReportInput.xsd +++ b/src/main/model/xsd/createReportInput.xsd @@ -20,8 +20,9 @@ + xmlns:s="http://www.xoev.de/de/validator/framework/1/scenarios" xmlns:svrl="http://purl.oclc.org/dsdl/svrl" + targetNamespace="http://www.xoev.de/de/validator/framework/1/createreportinput" version="1.0.0" + elementFormDefault="qualified" attributeFormDefault="unqualified"> @@ -88,7 +89,7 @@ - + diff --git a/src/main/model/xsd/svrl-kosit.xsd b/src/main/model/xsd/svrl-kosit.xsd new file mode 100644 index 0000000..2fd478a --- /dev/null +++ b/src/main/model/xsd/svrl-kosit.xsd @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/model/xsd/xml.xsd b/src/main/model/xsd/xml.xsd new file mode 100644 index 0000000..d3847fc --- /dev/null +++ b/src/main/model/xsd/xml.xsd @@ -0,0 +1,10 @@ + + + + + + + + + From 3ac764b33c5888b164527588099f350cae0bf730 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Wed, 29 May 2019 12:37:58 +0200 Subject: [PATCH 14/25] (fix) add missing import --- src/main/model/xsd/createReportInput.xsd | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/model/xsd/createReportInput.xsd b/src/main/model/xsd/createReportInput.xsd index e44c841..feb9443 100644 --- a/src/main/model/xsd/createReportInput.xsd +++ b/src/main/model/xsd/createReportInput.xsd @@ -25,6 +25,7 @@ elementFormDefault="qualified" attributeFormDefault="unqualified"> + From 528e47b5cf39167e8404e33dc9f2f53e7dcbae1f Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Mon, 3 Jun 2019 15:47:54 +0200 Subject: [PATCH 15/25] (WIP) build ohne docker --- .gitlab-ci.yml | 26 +- pom.xml | 311 ++++-------------- .../de/kosit/validationtool/cmd/DaemonIT.java | 8 +- 3 files changed, 83 insertions(+), 262 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index da97003..b51d655 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,13 +7,12 @@ cache: paths: - repository -build-validator: +build-java-latest: stage: build script: - - mvn $MAVEN_CLI_OPTS -Pjava-11,java-8,gitlab verify - + - mvn $MAVEN_CLI_OPTS verify artifacts: - name: build-results + name: java-latest paths: - target/*.jar reports: @@ -21,9 +20,16 @@ build-validator: - target/surefire-reports/*.xml - target/failsafe-reports/*.xml -#deploy: -# stage: deploy -# script: -# - mvn $MAVEN_CLI_OPTS deploy -# only: -# - master +build-java8: + stage: build + image: maven:3-jdk-8-alpine + script: + - mvn $MAVEN_CLI_OPTS verify + artifacts: + name: java8 + paths: + - target/*.jar + reports: + junit: + - target/surefire-reports/*.xml + - target/failsafe-reports/*.xml diff --git a/pom.xml b/pom.xml index a007283..3a87f72 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,6 @@ 1.18.6 9.9.1-3 1.7.25 - localhost @@ -365,256 +364,72 @@ + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + run + pre-integration-test + + exec + + + + + java + true + true + true + + -classpath + + de.kosit.validationtool.cmd.CommandLineApplication + -s + src/main/docker/daemon/config/scenarios.xml + -D + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + + + + sleep-for-a-while + pre-integration-test + + run + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.22.1 + + + test-java8 + + integration-test + verify + + + + + + - - - java-8 - - - - org.apache.maven.plugins - maven-failsafe-plugin - 2.22.1 - - - test-java8 - - integration-test - verify - - - - - -Ddaemon.port=8081 - -Ddaemon.host=http://${docker.host} - - ${project.build.directory}/failsafe-reports/failsafe-summary-java8.xml - - - - test-java-8-jdk-jaxb - - integration-test - verify - - - - - -Ddaemon.port=8082 - -Ddaemon.host=http://${docker.host} - - ${project.build.directory}/failsafe-reports/failsafe-summary-java8-jdk-jaxb.xml - - - - - - - - io.fabric8 - docker-maven-plugin - 0.28.0 - - tcp://${docker.host}:2375 - true - true - false - validator-%n-%t-%i-java8 - - - - - up8 - pre-integration-test - - build - start - - - - - daemon8 - daemon8 - - daemon - Dockerfile-java8 - - - - - - ${project.build.directory}/validationtool-${project.version}-standalone.jar - - validationtool-standalone.jar - - - - - - - - bridge - - - 8081:8080 - - - - - - - - daemon8-jdk-jaxb - daemon8-jdk-jaxb - - daemon - Dockerfile-java8-jdk-jaxb - - - - - - ${project.build.directory}/validationtool-${project.version}-java8-standalone.jar - - validationtool-standalone.jar - - - - - - - - bridge - - - 8082:8080 - - - - - - - - - - - down8 - post-integration-test - - stop - - - - - - - - - - java-11 - - true - - - - - org.apache.maven.plugins - maven-failsafe-plugin - 2.22.1 - - - test-jdk11 - - integration-test - verify - - - - - -Ddaemon.port=8080 - -Ddaemon.host=http://${docker.host} - - - - - - - - io.fabric8 - docker-maven-plugin - 0.28.0 - - tcp://${docker.host}:2375 - true - true - false - validator-%n-%t-%i-java8 - - - - up11 - pre-integration-test - - build - start - - - - - daemon11 - daemon11 - - daemon - - - - - - ${project.build.directory}/validationtool-${project.version}-standalone.jar - - validationtool-standalone.jar - - - - - - - - bridge - - - 8080:8080 - - - - - - - - - - - down11 - post-integration-test - - stop - - - - - - - - - - gitlab - - host.docker.internal - - - https://github.com/itplr-kosit/validationtool.git scm:git:https://github.com/itplr-kosit/validationtool.git diff --git a/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java b/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java index 52b521f..a2311bc 100644 --- a/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java +++ b/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java @@ -41,7 +41,7 @@ public class DaemonIT { @Test public void makeSureThatSuccessTest() throws IOException { - try ( InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(EXAMPLE_FILE) ) { + try ( final InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(EXAMPLE_FILE) ) { given().contentType(ContentType.XML).body(toContent(io)).when().post("/").then().statusCode(200); } } @@ -54,12 +54,12 @@ public class DaemonIT { @Test @Ignore // no default error report yet public void internalServerErrorTest() throws IOException { - try ( InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(INVALID_XML) ) { + try ( final InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(INVALID_XML) ) { given().contentType(APPLICATION_XML).body(toContent(io)).when().post("/").then().statusCode(200); } } - private byte[] toContent(final InputStream io) throws IOException { + private static byte[] toContent(final InputStream io) throws IOException { return IOUtils.toByteArray(io); } @@ -75,7 +75,7 @@ public class DaemonIT { @Test public void xmlResultTest() throws IOException { - try ( InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(EXAMPLE_FILE) ) { + try ( final InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(EXAMPLE_FILE) ) { given().body(toContent(io)).when().post("/").then().contentType(APPLICATION_XML).and().statusCode(200); } } From 68af2dc034cb64243c5cecf6a908b97d45c89d2d Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Mon, 3 Jun 2019 15:57:12 +0200 Subject: [PATCH 16/25] (WIP) testing mit div. java versionen --- .gitlab-ci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b51d655..92d0e27 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,6 +9,7 @@ cache: build-java-latest: stage: build + image: maven:3-jdk-13 script: - mvn $MAVEN_CLI_OPTS verify artifacts: @@ -20,6 +21,35 @@ build-java-latest: - target/surefire-reports/*.xml - target/failsafe-reports/*.xml +build-java-12: + stage: build + image: maven:3-jdk-12 + script: + - mvn $MAVEN_CLI_OPTS verify + artifacts: + name: java-12 + paths: + - target/*.jar + reports: + junit: + - target/surefire-reports/*.xml + - target/failsafe-reports/*.xml + + +build-java-11: + stage: build + image: maven:3-jdk-11 + script: + - mvn $MAVEN_CLI_OPTS verify + artifacts: + name: java-11 + paths: + - target/*.jar + reports: + junit: + - target/surefire-reports/*.xml + - target/failsafe-reports/*.xml + build-java8: stage: build image: maven:3-jdk-8-alpine From 01a0d3332e3893b15dcd2610cb4ef67f3b200421 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Mon, 3 Jun 2019 16:08:43 +0200 Subject: [PATCH 17/25] (chore) Dependency Updates --- pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 3a87f72..c8fd50d 100644 --- a/pom.xml +++ b/pom.xml @@ -48,8 +48,8 @@ UTF-8 - 0.8.3 - 1.18.6 + 0.8.4 + 1.18.8 9.9.1-3 1.7.25 @@ -95,7 +95,7 @@ org.apache.commons commons-lang3 - 3.5 + 3.9 org.glassfish.jaxb @@ -106,7 +106,7 @@ org.assertj assertj-core - 3.8.0 + 3.12.2 test @@ -124,7 +124,7 @@ io.rest-assured rest-assured - 3.2.0 + 3.3.0 test @@ -146,7 +146,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.8.1 1.8 1.8 @@ -254,7 +254,7 @@ org.codehaus.mojo build-helper-maven-plugin - 1.1 + 3.0.0 add-source From 0c3f65b53f5e558639b3cc9463c7cf50e0801ffb Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Tue, 4 Jun 2019 08:23:01 +0200 Subject: [PATCH 18/25] (chore) Nachnutzen der Artefakte aus dem Tests; Entfernen der Docker-Konfiguration --- pom.xml | 6 +- src/main/docker/daemon/Dockerfile | 8 - src/main/docker/daemon/Dockerfile-java8 | 8 - .../docker/daemon/Dockerfile-java8-jdk-jaxb | 8 - .../common/CCTS_CCT_SchemaModule-2.1.xsd | 769 --- .../UBL-CommonAggregateComponents-2.1.xsd | 4166 ------------- .../common/UBL-CommonBasicComponents-2.1.xsd | 5394 ----------------- .../UBL-CommonExtensionComponents-2.1.xsd | 235 - .../UBL-CommonSignatureComponents-2.1.xsd | 81 - .../UBL-CoreComponentParameters-2.1.xsd | 73 - .../UBL-ExtensionContentDataType-2.1.xsd | 99 - .../common/UBL-QualifiedDataTypes-2.1.xsd | 78 - .../UBL-SignatureAggregateComponents-2.1.xsd | 102 - .../UBL-SignatureBasicComponents-2.1.xsd | 83 - .../common/UBL-UnqualifiedDataTypes-2.1.xsd | 554 -- .../xsdrt/common/UBL-XAdESv132-2.1.xsd | 499 -- .../xsdrt/common/UBL-XAdESv141-2.1.xsd | 46 - .../common/UBL-xmldsig-core-schema-2.1.xsd | 332 - .../xsdrt/maindoc/UBL-CreditNote-2.1.xsd | 153 - .../UBL-2.1/xsdrt/maindoc/UBL-Invoice-2.1.xsd | 156 - .../UBL-2.1/xsl/BIIRULES-UBL-T10.xsl | 1383 ----- .../UBL-2.1/xsl/OPENPEPPOL-UBL-T10.xsl | 1243 ---- .../resources/eRechnung/default-report.xsl | 756 --- .../config/resources/eRechnung/report.xsl | 631 -- src/main/docker/daemon/config/scenarios.xml | 68 - src/main/docker/daemon/run.sh | 3 - .../cmd/CommandLineApplication.java | 2 +- src/test/resources/data.zip | Bin 1937332 -> 0 bytes 28 files changed, 6 insertions(+), 16930 deletions(-) delete mode 100644 src/main/docker/daemon/Dockerfile delete mode 100644 src/main/docker/daemon/Dockerfile-java8 delete mode 100644 src/main/docker/daemon/Dockerfile-java8-jdk-jaxb delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/CCTS_CCT_SchemaModule-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonAggregateComponents-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonBasicComponents-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonExtensionComponents-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonSignatureComponents-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CoreComponentParameters-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-ExtensionContentDataType-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-QualifiedDataTypes-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureAggregateComponents-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureBasicComponents-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-UnqualifiedDataTypes-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv132-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv141-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-xmldsig-core-schema-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-CreditNote-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-Invoice-2.1.xsd delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/BIIRULES-UBL-T10.xsl delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/OPENPEPPOL-UBL-T10.xsl delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/default-report.xsl delete mode 100644 src/main/docker/daemon/config/resources/eRechnung/report.xsl delete mode 100644 src/main/docker/daemon/config/scenarios.xml delete mode 100644 src/main/docker/daemon/run.sh delete mode 100644 src/test/resources/data.zip diff --git a/pom.xml b/pom.xml index c8fd50d..87e5910 100644 --- a/pom.xml +++ b/pom.xml @@ -387,8 +387,11 @@ de.kosit.validationtool.cmd.CommandLineApplication -s - src/main/docker/daemon/config/scenarios.xml + ${project.build.testOutputDirectory}/examples/UBLReady/scenarios-2.xml + -r + ${project.build.testOutputDirectory}/examples/repository -D + @@ -398,6 +401,7 @@ maven-antrun-plugin + diff --git a/src/main/docker/daemon/Dockerfile b/src/main/docker/daemon/Dockerfile deleted file mode 100644 index fc4bcec..0000000 --- a/src/main/docker/daemon/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM openjdk:11 - -RUN mkdir /opt/validationtool -ADD maven/validationtool-standalone.jar /opt/validationtool -ADD run.sh /opt/validationtool/ -ADD config/ /opt/validationtool/ -EXPOSE 8080 -ENTRYPOINT ["bash", "/opt/validationtool/run.sh" ] \ No newline at end of file diff --git a/src/main/docker/daemon/Dockerfile-java8 b/src/main/docker/daemon/Dockerfile-java8 deleted file mode 100644 index c95f712..0000000 --- a/src/main/docker/daemon/Dockerfile-java8 +++ /dev/null @@ -1,8 +0,0 @@ -FROM openjdk:8 - -RUN mkdir /opt/validationtool -ADD maven/validationtool-standalone.jar /opt/validationtool -ADD run.sh /opt/validationtool/ -ADD config/ /opt/validationtool/ -EXPOSE 8080 -ENTRYPOINT ["bash", "/opt/validationtool/run.sh" ] \ No newline at end of file diff --git a/src/main/docker/daemon/Dockerfile-java8-jdk-jaxb b/src/main/docker/daemon/Dockerfile-java8-jdk-jaxb deleted file mode 100644 index c95f712..0000000 --- a/src/main/docker/daemon/Dockerfile-java8-jdk-jaxb +++ /dev/null @@ -1,8 +0,0 @@ -FROM openjdk:8 - -RUN mkdir /opt/validationtool -ADD maven/validationtool-standalone.jar /opt/validationtool -ADD run.sh /opt/validationtool/ -ADD config/ /opt/validationtool/ -EXPOSE 8080 -ENTRYPOINT ["bash", "/opt/validationtool/run.sh" ] \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/CCTS_CCT_SchemaModule-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/CCTS_CCT_SchemaModule-2.1.xsd deleted file mode 100644 index 2bc034a..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/CCTS_CCT_SchemaModule-2.1.xsd +++ /dev/null @@ -1,769 +0,0 @@ - - - - - - - - - - - - - - - - UNDT000001 - CCT - Amount. Type - 1.0 - A number of monetary units specified in a currency where the unit of the currency is - explicit or implied. - - Amount - decimal - - - - - - - - UNDT000001-SC2 - SC - Amount Currency. Identifier - The currency of the amount. - Amount Currency - Identification - Identifier - string - Reference UNECE Rec 9, using 3-letter alphabetic codes. - - - - - - - UNDT000001-SC3 - SC - Amount Currency. Code List Version. Identifier - - The VersionID of the UN/ECE Rec9 code list. - Amount Currency - Code List Version - Identifier - string - - - - - - - - - - - - UNDT000002 - CCT - Binary Object. Type - 1.0 - A set of finite-length sequences of binary octets. - Binary Object - binary - - - - - - - - UNDT000002-SC2 - SC - Binary Object. Format. Text - The format of the binary content. - Binary Object - Format - Text - string - - - - - - - UNDT000002-SC3 - SC - Binary Object. Mime. Code - The mime type of the binary object. - Binary Object - Mime - Code - string - - - - - - - UNDT000002-SC4 - SC - Binary Object. Encoding. Code - Specifies the decoding algorithm of the binary object. - Binary Object - Encoding - Code - string - - - - - - - UNDT000002-SC5 - SC - Binary Object. Character Set. Code - The character set of the binary object if the mime type is text. - - Binary Object - Character Set - Code - string - - - - - - - UNDT000002-SC6 - SC - Binary Object. Uniform Resource. Identifier - - The Uniform Resource Identifier that identifies where the binary object is - located. - - Binary Object - Uniform Resource Identifier - Identifier - string - - - - - - - UNDT000002-SC7 - SC - Binary Object. Filename.Text - The filename of the binary object. - Binary Object - Filename - Text - string - - - - - - - - - - - - UNDT000007 - CCT - Code. Type - 1.0 - A character string (letters, figures, or symbols) that for brevity and/or languange - independence may be used to represent or replace a definitive value or text of an attribute together - with relevant supplementary information. - - Code - string - Should not be used if the character string identifies an instance of an object class or - an object in the real world, in which case the Identifier. Type should be used. - - - - - - - - - UNDT000007-SC2 - SC - Code List. Identifier - The identification of a list of codes. - Code List - Identification - Identifier - string - - - - - - - UNDT000007-SC3 - SC - Code List. Agency. Identifier - An agency that maintains one or more lists of codes. - Code List - Agency - Identifier - string - Defaults to the UN/EDIFACT data element 3055 code list. - - - - - - - UNDT000007-SC4 - SC - Code List. Agency Name. Text - The name of the agency that maintains the list of codes. - Code List - Agency Name - Text - string - - - - - - - UNDT000007-SC5 - SC - Code List. Name. Text - The name of a list of codes. - Code List - Name - Text - string - - - - - - - UNDT000007-SC6 - SC - Code List. Version. Identifier - The version of the list of codes. - Code List - Version - Identifier - string - - - - - - - UNDT000007-SC7 - SC - Code. Name. Text - The textual equivalent of the code content component. - Code - Name - Text - string - - - - - - - UNDT000007-SC8 - SC - Language. Identifier - The identifier of the language used in the code name. - Language - Identification - Identifier - string - - - - - - - UNDT000007-SC9 - SC - Code List. Uniform Resource. Identifier - The Uniform Resource Identifier that identifies where the code list is - located. - - Code List - Uniform Resource Identifier - Identifier - string - - - - - - - UNDT000007-SC10 - SC - Code List Scheme. Uniform Resource. Identifier - - The Uniform Resource Identifier that identifies where the code list scheme - is located. - - Code List Scheme - Uniform Resource Identifier - Identifier - string - - - - - - - - - - - - UNDT000008 - CCT - Date Time. Type - 1.0 - A particular point in the progression of time together with the relevant supplementary - information. - - Date Time - string - Can be used for a date and/or time. - - - - - - - - UNDT000008-SC1 - SC - Date Time. Format. Text - The format of the date time content - Date Time - Format - Text - string - - - - - - - - - - - - UNDT000011 - CCT - Identifier. Type - 1.0 - A character string to identify and distinguish uniquely, one instance of an object in - an identification scheme from all other objects in the same scheme together with relevant - supplementary information. - - Identifier - string - - - - - - - - UNDT000011-SC2 - SC - Identification Scheme. Identifier - The identification of the identification scheme. - Identification Scheme - Identification - Identifier - string - - - - - - - UNDT000011-SC3 - SC - Identification Scheme. Name. Text - The name of the identification scheme. - Identification Scheme - Name - Text - string - - - - - - - UNDT000011-SC4 - SC - Identification Scheme Agency. Identifier - - The identification of the agency that maintains the identification - scheme. - - Identification Scheme Agency - Identification - Identifier - string - Defaults to the UN/EDIFACT data element 3055 code list. - - - - - - - UNDT000011-SC5 - SC - Identification Scheme Agency. Name. Text - - The name of the agency that maintains the identification scheme. - - Identification Scheme Agency - Agency Name - Text - string - - - - - - - UNDT000011-SC6 - SC - Identification Scheme. Version. Identifier - - The version of the identification scheme. - Identification Scheme - Version - Identifier - string - - - - - - - UNDT000011-SC7 - SC - Identification Scheme Data. Uniform Resource. Identifier - - The Uniform Resource Identifier that identifies where the identification - scheme data is located. - - Identification Scheme Data - Uniform Resource Identifier - Identifier - string - - - - - - - UNDT000011-SC8 - SC - Identification Scheme. Uniform Resource. Identifier - - The Uniform Resource Identifier that identifies where the identification - scheme is located. - - Identification Scheme - Uniform Resource Identifier - Identifier - string - - - - - - - - - - - - UNDT000012 - CCT - Indicator. Type - 1.0 - A list of two mutually exclusive Boolean values that express the only possible states - of a Property. - - Indicator - string - - - - - - - - UNDT000012-SC2 - SC - Indicator. Format. Text - Whether the indicator is numeric, textual or binary. - Indicator - Format - Text - string - - - - - - - - - - - - UNDT000013 - CCT - Measure. Type - 1.0 - A numeric value determined by measuring an object along with the specified unit of - measure. - - Measure - decimal - - - - - - - - UNDT000013-SC2 - SC - Measure Unit. Code - The type of unit of measure. - Measure Unit - Code - Code - string - Reference UNECE Rec. 20 and X12 355 - - - - - - - UNDT000013-SC3 - SC - Measure Unit. Code List Version. Identifier - - The version of the measure unit code list. - Measure Unit - Code List Version - Identifier - string - - - - - - - - - - - - UNDT000014 - CCT - Numeric. Type - 1.0 - Numeric information that is assigned or is determined by calculation, counting, or - sequencing. It does not require a unit of quantity or unit of measure. - - Numeric - string - - - - - - - - UNDT000014-SC2 - SC - Numeric. Format. Text - Whether the number is an integer, decimal, real number or percentage. - - Numeric - Format - Text - string - - - - - - - - - - - - UNDT000018 - CCT - Quantity. Type - 1.0 - A counted number of non-monetary units possibly including fractions. - Quantity - decimal - - - - - - - - UNDT000018-SC2 - SC - Quantity. Unit. Code - The unit of the quantity - Quantity - Unit Code - Code - string - - - - - - - UNDT000018-SC3 - SC - Quantity Unit. Code List. Identifier - The quantity unit code list. - Quantity Unit - Code List - Identifier - string - - - - - - - UNDT000018-SC4 - SC - Quantity Unit. Code List Agency. Identifier - - The identification of the agency that maintains the quantity unit code - list - - Quantity Unit - Code List Agency - Identifier - string - Defaults to the UN/EDIFACT data element 3055 code list. - - - - - - - UNDT000018-SC5 - SC - Quantity Unit. Code List Agency Name. Text - - The name of the agency which maintains the quantity unit code list. - - Quantity Unit - Code List Agency Name - Text - string - - - - - - - - - - - - UNDT000019 - CCT - Text. Type - 1.0 - A character string (i.e. a finite set of characters) generally in the form of words of - a language. - - Text - string - - - - - - - - UNDT000019-SC2 - SC - Language. Identifier - The identifier of the language used in the content component. - - Language - Identification - Identifier - string - - - - - - - UNDT000019-SC3 - SC - Language. Locale. Identifier - The identification of the locale of the language. - Language - Locale - Identifier - string - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonAggregateComponents-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonAggregateComponents-2.1.xsd deleted file mode 100644 index 59b826d..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonAggregateComponents-2.1.xsd +++ /dev/null @@ -1,4166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonBasicComponents-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonBasicComponents-2.1.xsd deleted file mode 100644 index 6a00c5d..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonBasicComponents-2.1.xsd +++ /dev/null @@ -1,5394 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonExtensionComponents-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonExtensionComponents-2.1.xsd deleted file mode 100644 index 2a9fc38..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonExtensionComponents-2.1.xsd +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - A container for all extensions present in the document. - - - - - - - A container for all extensions present in the document. - - - - - - - A single extension for private use. - - - - - - - - - A single extension for private use. - - - - - - - A single extension for private use. - - - - - - - An identifier for the Extension assigned by the creator of the extension. - - - - - - - A name for the Extension assigned by the creator of the extension. - - - - - - - An agency that maintains one or more Extensions. - - - - - - - The name of the agency that maintains the Extension. - - - - - - - The version of the Extension. - - - - - - - A URI for the Agency that maintains the Extension. - - - - - - - A URI for the Extension. - - - - - - - A code for reason the Extension is being included. - - - - - - - A description of the reason for the Extension. - - - - - - - The definition of the extension content. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonSignatureComponents-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonSignatureComponents-2.1.xsd deleted file mode 100644 index fa0f481..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CommonSignatureComponents-2.1.xsd +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CoreComponentParameters-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CoreComponentParameters-2.1.xsd deleted file mode 100644 index fbda5b8..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-CoreComponentParameters-2.1.xsd +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-ExtensionContentDataType-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-ExtensionContentDataType-2.1.xsd deleted file mode 100644 index 3a8235b..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-ExtensionContentDataType-2.1.xsd +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - Any element in any namespace other than the UBL extension - namespace is allowed to be the apex element of an extension. - Only those elements found in the UBL schemas and in the - trees of schemas imported in this module are validated. - Any element for which there is no schema declaration in any - of the trees of schemas passes validation and is not - treated as a schema constraint violation. - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-QualifiedDataTypes-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-QualifiedDataTypes-2.1.xsd deleted file mode 100644 index 9f22f94..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-QualifiedDataTypes-2.1.xsd +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureAggregateComponents-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureAggregateComponents-2.1.xsd deleted file mode 100644 index e58388c..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureAggregateComponents-2.1.xsd +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - This is a single digital signature as defined by the W3C specification. - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureBasicComponents-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureBasicComponents-2.1.xsd deleted file mode 100644 index 76d1881..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-SignatureBasicComponents-2.1.xsd +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-UnqualifiedDataTypes-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-UnqualifiedDataTypes-2.1.xsd deleted file mode 100644 index 2480083..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-UnqualifiedDataTypes-2.1.xsd +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - - - - - UBLUDT000001 - UDT - Amount. Type - 1.0 - A number of monetary units specified using a given unit of currency. - Amount - - - - - - - - UNDT000001-SC2 - SC - Amount. Currency. Identifier - The currency of the amount. - Amount Currency - Identification - Identifier - string - Reference UNECE Rec 9, using 3-letter alphabetic codes. - - - - - - - - - - - UBLUDT000002 - UDT - Binary Object. Type - 1.0 - A set of finite-length sequences of binary octets. - Binary Object - binary - - - - - - - - UNDT000002-SC3 - SC - Binary Object. Mime. Code - The mime type of the binary object. - Binary Object - Mime - Code - string - - - - - - - - - - - UBLUDT000003 - UDT - Graphic. Type - 1.0 - A diagram, graph, mathematical curve, or similar representation. - Graphic - binary - - - - - - - - UNDT000003-SC3 - SC - Graphic. Mime. Code - The mime type of the graphic object. - Graphic - Mime - Code - normalizedString - - - - - - - - - - - UBLUDT000004 - UDT - Picture. Type - 1.0 - A diagram, graph, mathematical curve, or similar representation. - Picture - binary - - - - - - - - UNDT000004-SC3 - SC - Picture. Mime. Code - The mime type of the picture object. - Picture - Mime - Code - normalizedString - - - - - - - - - - - UBLUDT000005 - UDT - Sound. Type - 1.0 - An audio representation. - Sound - binary - - - - - - - - UNDT000005-SC3 - SC - Sound. Mime. Code - The mime type of the sound object. - Sound - Mime - Code - normalizedString - - - - - - - - - - - UBLUDT000006 - UDT - Video. Type - 1.0 - A video representation. - Video - binary - - - - - - - - UNDT000006-SC3 - SC - Video. Mime. Code - The mime type of the video object. - Video - Mime - Code - normalizedString - - - - - - - - - - - UBLUDT000007 - UDT - Code. Type - 1.0 - A character string (letters, figures, or symbols) that for brevity and/or language - independence may be used to represent or replace a definitive value or text of an attribute, - together with relevant supplementary information. - - Code - string - Other supplementary components in the CCT are captured as part of the token and name for - the schema module containing the code list and thus, are not declared as attributes. - - - - - - - - - - - - UBLUDT000008 - UDT - Date Time. Type - 1.0 - A particular point in the progression of time, together with relevant supplementary - information. - - Date Time - string - Can be used for a date and/or time. - - - - - - - - - - - UBLUDT000009 - UDT - Date. Type - 1.0 - One calendar day according the Gregorian calendar. - Date - string - - - - - - - - - - - UBLUDT0000010 - UDT - Time. Type - 1.0 - An instance of time that occurs every day. - Time - string - - - - - - - - - - - UBLUDT0000011 - UDT - Identifier. Type - 1.0 - A character string to identify and uniquely distinguish one instance of an object in an - identification scheme from all other objects in the same scheme, together with relevant - supplementary information. - - Identifier - string - Other supplementary components in the CCT are captured as part of the token and name for - the schema module containing the identifier list and thus, are not declared as attributes. - - - - - - - - - - - - UBLUDT0000012 - UDT - Indicator. Type - 1.0 - A list of two mutually exclusive Boolean values that express the only possible states - of a property. - - Indicator - string - - - - - - - - - - - UBLUDT0000013 - UDT - Measure. Type - 1.0 - A numeric value determined by measuring an object using a specified unit of measure. - - Measure - Type - decimal - - - - - - - - UNDT000013-SC2 - SC - Measure. Unit. Code - The type of unit of measure. - Measure Unit - Code - Code - normalizedString - Reference UNECE Rec. 20 and X12 355 - - - - - - - - - - - UBLUDT0000014 - UDT - Numeric. Type - 1.0 - Numeric information that is assigned or is determined by calculation, counting, or - sequencing. It does not require a unit of quantity or unit of measure. - - Numeric - string - - - - - - - - - - - UBLUDT0000015 - UDT - 1.0 - Value. Type - Numeric information that is assigned or is determined by calculation, counting, or - sequencing. It does not require a unit of quantity or unit of measure. - - Value - string - - - - - - - - - - - UBLUDT0000016 - UDT - 1.0 - Percent. Type - Numeric information that is assigned or is determined by calculation, counting, or - sequencing and is expressed as a percentage. It does not require a unit of quantity or unit of - measure. - - Percent - string - - - - - - - - - - - UBLUDT0000017 - UDT - 1.0 - Rate. Type - A numeric expression of a rate that is assigned or is determined by calculation, - counting, or sequencing. It does not require a unit of quantity or unit of measure. - - Rate - string - - - - - - - - - - - UBLUDT0000018 - UDT - Quantity. Type - 1.0 - A counted number of non-monetary units, possibly including a fractional part. - - Quantity - decimal - - - - - - - - - - - UBLUDT0000019 - UDT - Text. Type - 1.0 - A character string (i.e. a finite set of characters), generally in the form of words of - a language. - - Text - string - - - - - - - - - - - UBLUDT0000020 - UDT - Name. Type - 1.0 - A character string that constitutes the distinctive designation of a person, place, - thing or concept. - - Name - string - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv132-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv132-2.1.xsd deleted file mode 100644 index f08c7ba..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv132-2.1.xsd +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv141-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv141-2.1.xsd deleted file mode 100644 index 801bae9..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-XAdESv141-2.1.xsd +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-xmldsig-core-schema-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-xmldsig-core-schema-2.1.xsd deleted file mode 100644 index b30b1d4..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/common/UBL-xmldsig-core-schema-2.1.xsd +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - ]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-CreditNote-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-CreditNote-2.1.xsd deleted file mode 100644 index 91d48d9..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-CreditNote-2.1.xsd +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-Invoice-2.1.xsd b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-Invoice-2.1.xsd deleted file mode 100644 index 94ad2cc..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-Invoice-2.1.xsd +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/BIIRULES-UBL-T10.xsl b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/BIIRULES-UBL-T10.xsl deleted file mode 100644 index b89fbc5..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/BIIRULES-UBL-T10.xsl +++ /dev/null @@ -1,1383 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / - - - - - - *: - - [namespace-uri()=' - - '] - - - - [ - - ] - - - - / - - @ - - - @*[local-name()=' - - ' and namespace-uri()=' - - '] - - - - - - - - - / - - - [ - - ] - - - - /@ - - - - - - - / - - - [ - - ] - - - - /@ - - - - - - - - - - - - - - - - - - - - - - - - . - - - - - U - - U - - - - U. - - n - - - - U. - - _ - - _ - - - - - - - - - - - - - - - - - - - - - - - UBL-T10 - UBL-T10 - - - - - - - - CodesT10 - CodesT10 - - - - - - - - BIIRULES T10 bound to UBL - - - - - - - - - - - - - - BII2-T10-R025 - fatal - - - - [BII2-T10-R025]-Each document level allowance or charge details MUST have an allowance - and charge reason text - - - - - - - - - - - BII2-T10-R043 - fatal - - - - [BII2-T10-R043]-Document level allowances and charges details MUST have allowance and - charge VAT category if the invoice has a VAT total amount - - - - - - - - - - - - - - - - - BII2-T10-R001 - fatal - - - - [BII2-T10-R001]-An invoice MUST have a customization identifier - - - - - - - - - - BII2-T10-R002 - fatal - - - - [BII2-T10-R002]-An invoice MUST have a business profile identifier - - - - - - - - - - BII2-T10-R003 - fatal - - - - [BII2-T10-R003]-An invoice MUST have an invoice identifier - - - - - - - - - - BII2-T10-R004 - fatal - - - - [BII2-T10-R004]-An invoice MUST have an invoice issue date - - - - - - - - - - BII2-T10-R005 - fatal - - - - [BII2-T10-R005]-An invoice MUST specify the currency code for the document - - - - - - - - - - BII2-T10-R006 - fatal - - - - [BII2-T10-R006]-An invoice MUST have a seller name and/or a seller identifier - - - - - - - - - - BII2-T10-R008 - fatal - - - - [BII2-T10-R008]-An invoice MUST have a buyer name and/or a buyer identifier - - - - - - - - - - BII2-T10-R010 - fatal - - - - [BII2-T10-R010]-An invoice MUST have the sum of line amounts - - - - - - - - - - BII2-T10-R011 - fatal - - - - [BII2-T10-R011]-An invoice MUST have the invoice total without VAT - - - - - - - - - - BII2-T10-R012 - fatal - - - - [BII2-T10-R012]-An invoice MUST have the invoice total with VAT (value of purchase) - - - - - - - - - - - BII2-T10-R013 - fatal - - - - [BII2-T10-R013]-An invoice MUST have the amount due for payment - - - - - - - - - - BII2-T10-R014 - fatal - - - - [BII2-T10-R014]-An invoice MUST have at least one invoice line - - - - - - - - - - BII2-T10-R015 - fatal - - - - [BII2-T10-R015]-An invoice MUST specify the VAT total amount, if there are VAT line - amounts - - - - - - - - - - - BII2-T10-R026 - fatal - - - - [BII2-T10-R026]-An invoice MUST contain VAT category details unless VAT total amount is - omitted. - - - - - - - - - - - BII2-T10-R035 - fatal - - - - [BII2-T10-R035]-Invoice total with VAT MUST NOT be negative - - - - - - - - - - BII2-T10-R037 - fatal - - - - [BII2-T10-R037]-Amount due for payment in an invoice MUST NOT be negative - - - - - - - - - - BII2-T10-R044 - fatal - - - - [BII2-T10-R044]-A seller VAT identifier MUST be provided if the invoice has a VAT total - amount - - - - - - - - - - - BII2-T10-R047 - fatal - - - - [BII2-T10-R047]-A buyer VAT identifier MUST be present if the VAT category code is - reverse VAT - - - - - - - - - - - BII2-T10-R048 - fatal - - - - [BII2-T10-R048]-An invoice with a VAT category code of reverse charge MUST NOT contain - other VAT categories. - - - - - - - - - - - BII2-T10-R058 - fatal - - - - [BII2-T10-R058]-Invoice total without VAT MUST be equal to the sum of VAT category - taxable amounts - - - - - - - - - - - - - - - - - BII2-T10-R017 - fatal - - - - [BII2-T10-R017]-Each invoice line MUST have an invoice line identifier - - - - - - - - - - BII2-T10-R018 - fatal - - - - [BII2-T10-R018]-Each invoice line MUST have an invoiced quantity - - - - - - - - - - BII2-T10-R019 - fatal - - - - [BII2-T10-R019]-Each invoice line MUST have a quantity unit of measure - - - - - - - - - - BII2-T10-R020 - fatal - - - - [BII2-T10-R020]-Each invoice line MUST have an invoice line net amount - - - - - - - - - - BII2-T10-R021 - fatal - - - - [BII2-T10-R021]-Each invoice line MUST have an invoice line item name and/or the invoice - line item identifier - - - - - - - - - - - BII2-T10-R032 - fatal - - - - [BII2-T10-R032]-A scheme identifier for the invoice line item registered identifier MUST - be provided if invoice line item registered identifiers are used to identify a product.(e.g. - GTIN) - - - - - - - - - - - BII2-T10-R033 - fatal - - - - [BII2-T10-R033]-A scheme identifier for a invoice line item commodity classification MUST - be provided if invoice line item commodity classification are used to classify an invoice line - item (e.g. CPV or UNSPSC) - - - - - - - - - - - BII2-T10-R034 - fatal - - - - [BII2-T10-R034]-Invoice line item net price MUST NOT be negative - - - - - - - - - - BII2-T10-R046 - fatal - - - - [BII2-T10-R046]-Each invoice line MUST be categorized with the invoice line VAT category - if the invoice has a VAT total amount - - - - - - - - - - - - - - - - - BII2-T10-R023 - fatal - - - - [BII2-T10-R023]-Each invoice period information MUST have an invoice period start date - - - - - - - - - - - BII2-T10-R024 - fatal - - - - [BII2-T10-R024]-Each invoice period information MUST have an invoice period end date - - - - - - - - - - - BII2-T10-R031 - fatal - - - - [BII2-T10-R031]-An invoice period end date MUST be later or equal to an invoice period - start date - - - - - - - - - - - - - - - - - BII2-T10-R039 - fatal - - - - [BII2-T10-R039]-An account identifier MUST be present if payment means type is funds - transfer - - - - - - - - - - - BII2-T10-R040 - fatal - - - - [BII2-T10-R040]-A sellers financial institution identifier MUST be provided if the scheme - of the account identifier is IBAN and the payment means is international bank transfer - - - - - - - - - - - BII2-T10-R041 - fatal - - - - [BII2-T10-R041]-A payment means MUST specify the payment means type - - - - - - - - - - BII2-T10-R042 - fatal - - - - [BII2-T10-R042]-A sellers financial institution identifier scheme MUST be BIC if the - scheme of the account identifier is IBAN and the payment means type is international account - transfer - - - - - - - - - - - - - - - - - BII2-T10-R051 - fatal - - - - [BII2-T10-R051]-Sum of line amounts MUST equal the invoice line net amounts - - - - - - - - - - BII2-T10-R052 - fatal - - - - [BII2-T10-R052]-An invoice total without VAT MUST equal the sum of line amounts plus the - sum of charges on document level minus the sum of allowances on document level - - - - - - - - - - - BII2-T10-R053 - fatal - - - - [BII2-T10-R053]-An invoice total with VAT MUST equal the invoice total without VAT plus - the VAT total amount and the rounding of invoice total - - - - - - - - - - - BII2-T10-R054 - fatal - - - - [BII2-T10-R054]-The sum of allowances at document level MUST be equal to the sum of - document level allowance amounts - - - - - - - - - - - BII2-T10-R055 - fatal - - - - [BII2-T10-R055]-The sum of charges at document level MUST be equal to the sum of document - level charge amounts - - - - - - - - - - - BII2-T10-R056 - fatal - - - - [BII2-T10-R056]-Amount due for payment MUST be equal to the invoice total amount with VAT - minus the paid amounts - - - - - - - - - - - - - - - - - BII2-T10-R027 - fatal - - - - [BII2-T10-R027]-Each VAT category details MUST have a VAT category taxable amount - - - - - - - - - - - BII2-T10-R028 - fatal - - - - [BII2-T10-R028]-Each VAT category details MUST have a VAT category tax amount - - - - - - - - - - BII2-T10-R029 - fatal - - - - [BII2-T10-R029]-Every VAT category details MUST be defined through a VAT category code - - - - - - - - - - - BII2-T10-R030 - fatal - - - - [BII2-T10-R030]-The VAT category percentage MUST be provided if the VAT category code is - standard. - - - - - - - - - - - BII2-T10-R045 - fatal - - - - [BII2-T10-R045]-A VAT exemption reason MUST be provided if the VAT category code is - exempt or reverse charge. - - - - - - - - - - - - - - - - - BII2-T10-R049 - fatal - - - - [BII2-T10-R049]-The invoice total without VAT MUST be equal to the VAT category taxable - amount if the VAT category code is reverse charge - - - - - - - - - - - BII2-T10-R050 - fatal - - - - [BII2-T10-R050]-The VAT category tax amount MUST be zero if the VAT category code is - reverse charge (since there is only one VAT category allowed it follows that the invoice tax - total for reverse charge invoices is zero) - - - - - - - - - - - - - - - - - - - - - - - - CL-T10-R001 - fatal - - - - [CL-T10-R001]-An Invoice MUST be coded with the InvoiceTypeCode code list UNCL D1001 BII2 - subset - - - - - - - - - - - - - - - - - CL-T10-R002 - fatal - - - - [CL-T10-R002]-DocumentCurrencyCode MUST be coded using ISO code list 4217 - - - - - - - - - - - - - - - - CL-T10-R003 - fatal - - - - [CL-T10-R003]-currencyID MUST be coded using ISO code list 4217 - - - - - - - - - - - - - - - - CL-T10-R004 - fatal - - - - [CL-T10-R004]-Country codes in an invoice MUST be coded using ISO code list 3166-1 - - - - - - - - - - - - - - - - - CL-T10-R006 - fatal - - - - [CL-T10-R006]-Payment means in an invoice MUST be coded using UNCL 4461 BII2 subset - - - - - - - - - - - - - - - - - CL-T10-R007 - fatal - - - - [CL-T10-R007]-Invoice tax categories MUST be coded using UNCL 5305 code list BII2 - subset - - - - - - - - - - - - - - - - - CL-T10-R008 - fatal - - - - [CL-T10-R008]-For Mime code in attribute use MIMEMediaType. - - - - - - - - - - - - - - - - CL-T10-R010 - warning - - - - [CL-T10-R010]-Coded allowance and charge reasons SHOULD belong to the UNCL 4465 code list - BII2 subset - - - - - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/OPENPEPPOL-UBL-T10.xsl b/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/OPENPEPPOL-UBL-T10.xsl deleted file mode 100644 index 65ca96d..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/UBL-2.1/xsl/OPENPEPPOL-UBL-T10.xsl +++ /dev/null @@ -1,1243 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / - - - - - - *: - - [namespace-uri()=' - - '] - - - - [ - - ] - - - - / - - @ - - - @*[local-name()=' - - ' and namespace-uri()=' - - '] - - - - - - - - - / - - - [ - - ] - - - - /@ - - - - - - - / - - - [ - - ] - - - - /@ - - - - - - - - - - - - - - - - - - - - - - - - . - - - - - U - - U - - - - U. - - n - - - - U. - - _ - - _ - - - - - - - - - - - - - - - - - - - - - - - UBL-T10 - UBL-T10 - - - - - - - - CodesT10 - CodesT10 - - - - - - - - OPENPEPPOL T10 bound to UBL - - - - - - - - - - - - - - EUGEN-T10-R012 - fatal - - - - [EUGEN-T10-R012]-An allowance percentage MUST NOT be negative. - - - - - - - - - - EUGEN-T10-R022 - fatal - - - - [EUGEN-T10-R022]-An allowance or charge amount MUST NOT be negative. - - - - - - - - - - EUGEN-T10-R052 - fatal - - - - [EUGEN-T10-R052]-Document level amounts cannot have more than 2 decimals - - - - - - - - - - - - - - - - EUGEN-T10-R029 - fatal - - - - [EUGEN-T10-R029]-An allowance charge reason code MUST have a list identifier attribute - 'UNCL4465'. - - - - - - - - - - - - - - - - - EUGEN-T10-R027 - fatal - - - - [EUGEN-T10-R027]-A country identification code MUST have a list identifier attribute - 'ISO3166-1:Alpha2'. - - - - - - - - - - - - - - - - - EUGEN-T10-R026 - fatal - - - - [EUGEN-T10-R026]-A currency code element MUST have a list identifier attribute - 'ISO4217'. - - - - - - - - - - - - - - - - - EUGEN-T10-R036 - fatal - - - - [EUGEN-T10-R036]-An invoice MUST have a buyer name - - - - - - - - - - EUGEN-T10-R038 - fatal - - - - [EUGEN-T10-R038]-An invoice MUST have a buyer postal address - - - - - - - - - - EUGEN-T10-R040 - warning - - - - [EUGEN-T10-R040]-A customer SHOULD provide information about its legal entity - information - - - - - - - - - - - - - - - - - EUGEN-T10-R034 - fatal - - - - [EUGEN-T10-R034]-An delivery location identifier MUST have a scheme identifier - attribute. - - - - - - - - - - - - - - - - - EUGEN-T10-R033 - fatal - - - - [EUGEN-T10-R033]-A document type code MUST have a list identifier attribute 'UNCL1001'. - - - - - - - - - - - - - - - - - EUGEN-T10-R023 - fatal - - - - [EUGEN-T10-R023]-An endpoint identifier MUST have a scheme identifier attribute. - - - - - - - - - - - - - - - - - EUGEN-T10-R031 - fatal - - - - [EUGEN-T10-R031]-A financial account identifier MUST have a scheme identifier - attribute. - - - - - - - - - - - - - - - - - EUGEN-T10-R044 - fatal - - - - [EUGEN-T10-R044]-If the tax currency code is different from the document currency code, - the tax exchange rate MUST be provided - - - - - - - - - - - EUGEN-T10-R047 - warning - - - - [EUGEN-T10-R047]- An invoice should not contain empty elements - - - - - - - - - - EUGEN-T10-R053 - fatal - - - - [EUGEN-T10-R053]- An invoice must have an Invoice type code - - - - - - - - - - - - - - - - EUGEN-T10-R025 - fatal - - - - [EUGEN-T10-R025]-An invoice type code MUST have a list identifier attribute 'UNCL1001'. - - - - - - - - - - - - - - - - - EUGEN-T10-R054 - warning - - - - [EUGEN-T10-R054]-A party legal entity company identifier SHOULD have a scheme identifier - attribute. - - - - - - - - - - - - - - - - - EUGEN-T10-R024 - fatal - - - - [EUGEN-T10-R024]-A party identifier MUST have a scheme identifier attribute. - - - - - - - - - - - - - - - - EUGEN-T10-R004 - warning - - - - [EUGEN-T10-R004]-If the payment means are international account transfer and the account - id is IBAN then the financial institution should be identified by using the BIC id. - - - - - - - - - - - - - - - - - EUGEN-T10-R028 - fatal - - - - [EUGEN-T10-R028]-A payment means code MUST have a list identifier attribute 'UNCL4461'. - - - - - - - - - - - - - - - - - EUGEN-T10-R035 - fatal - - - - [EUGEN-T10-R035]-An invoice MUST have a seller name - - - - - - - - - - EUGEN-T10-R037 - fatal - - - - [EUGEN-T10-R037]-An invoice MUST have a seller postal address - - - - - - - - - - EUGEN-T10-R039 - warning - - - - [EUGEN-T10-R039]-A supplier SHOULD provide information about its legal entity - information - - - - - - - - - - - EUGEN-T10-R041 - warning - - - - [EUGEN-T10-R041]-The VAT identifier for the supplier SHOULD be prefixed with country code - for companies with VAT registration in EU countries - - - - - - - - - - - - - - - - - EUGEN-T10-R008 - fatal - - - - [EUGEN-T10-R008]-For each tax subcategory the category ID and the applicable tax - percentage MUST be provided. - - - - - - - - - - - - - - - - - EUGEN-T10-R032 - fatal - - - - [EUGEN-T10-R032]-A tax category identifier MUST have a scheme identifier attribute - 'UNCL5305'. - - - - - - - - - - - - - - - - - EUGEN-T10-R045 - fatal - - - - [EUGEN-T10-R045]-Tax exchange rate MUST specify the calculation rate and the operator - code. - - - - - - - - - - - - - - - - - EUGEN-T10-R043 - fatal - - - - [EUGEN-T10-R043]-The total tax amount MUST equal the sum of tax amounts per category. - - - - - - - - - - - EUGEN-T10-R049 - fatal - - - - [EUGEN-T10-R049]- Total tax amount cannot have more than 2 decimals. - - - - - - - - - - - - - - - - EUGEN-T10-R050 - fatal - - - - [EUGEN-T10-R050]- Tax subtotal amounts cannot have more than 2 decimals. - - - - - - - - - - EUGEN-T10-R051 - fatal - - - - [EUGEN-T10-R051]-Document level amounts cannot have more than 2 decimals - - - - - - - - - - EUGEN-T10-R042 - fatal - - - - [EUGEN-T10-R042]-The tax amount per category MUST be the taxable amount multiplied by the - category percentage. - - - - - - - - - - - EUGEN-T10-R046 - fatal - - - - [EUGEN-T10-R046]-If the tax currency code is different from the document currency code, - each tax subtotal has to include the tax amount in both currencies - - - - - - - - - - - - - - - - - EUGEN-T10-R030 - fatal - - - - [EUGEN-T10-R030]-A unit code attribute MUST have a unit code list identifier attribute - 'UNECERec20'. - - - - - - - - - - - - - - - - - EUGEN-T10-R048 - fatal - - - - [EUGEN-T10-R048]-Document level amounts cannot have more than 2 decimals - - - - - - - - - - - - - - - - - - - - - - - OP-T10-R001 - fatal - - - - [OP-T10-R001]-Contract document type code MUST be coded using UNCL 1001 list BII2 - subset. - - - - - - - - - - - - - - - - - OP-T10-R002 - fatal - - - - [OP-T10-R002]-An Endpoint Identifier Scheme MUST be from the list of PEPPOL Party - Identifiers described in the "PEPPOL Policy for using Identifiers". - - - - - - - - - - - - - - - - - OP-T10-R003 - fatal - - - - [OP-T10-R003]-An Party Identifier Scheme MUST be from the list of PEPPOL Party - Identifiers described in the "PEPPOL Policy for using Identifiers". - - - - - - - - - - - - - - - - - OP-T10-R004 - fatal - - - - [OP-T10-R004]-A payee account identifier scheme MUST be from the Account ID PEPPOL code - list - - - - - - - - - - - - - - - - - OP-T10-R006 - fatal - - - - [OP-T10-R006]-Unit code MUST be coded according to the UN/ECE Recommendation 20 - - - - - - - - - - - - - - - - - OP-T10-R008 - fatal - - - - [OP-T10-R008]-A Party Company Identifier Scheme MUST be from the list of PEPPOL Party - Identifiers described in the "PEPPOL Policy for using Identifiers". - - - - - - - - - - - - - - - - - OP-T10-R009 - fatal - - - - [OP-T10-R009]-TaxCurrencyCode MUST be coded using ISO code list 4217 - - - - - - - - - - - - - - - - OP-T10-R010 - fatal - - - - [OP-T10-R010]-SourceCurrencyCode MUST be coded using ISO code list 4217 - - - - - - - - - - - - - - - - OP-T10-R011 - fatal - - - - [OP-T10-R011]-TargetCurrencyCode MUST be coded using ISO code list 4217 - - - - - - - - - - diff --git a/src/main/docker/daemon/config/resources/eRechnung/default-report.xsl b/src/main/docker/daemon/config/resources/eRechnung/default-report.xsl deleted file mode 100644 index 5b03f79..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/default-report.xsl +++ /dev/null @@ -1,756 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - false - false - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unexpected result from schematron validation - there is no - svrl:schematron-output element! - - - - - - - - - - - - - - - - - - - - - - - error - warning - information - warning - error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dies ist das zentrale Template des Skripts. Angewandt auf ein - report-Dokument ergänzt es dieses um eine Handlungsempfehlung in Form eines - accept - oder reject Elements. - - - - - - - - reject - reject - accept - - - - - - - - - - - Ermittelt für eine während der Validierung ausgegebene Fehlernachricht deren - Fehlerlevel (error, warning, information) gemäß der - benutzerspezifischen Qualifizierung. - - Jede Fehlernachricht hat im Rahmen der Validierung ein solches Fehlerlevel - erhalten (siehe Attribut @level). Im Regelfall entspricht die - benutzerspezifische Qualifizierung unverändert diesem Level. Nutzer können jedoch im - Rahmen der Bewertung eigene Qualifizierungen vereinbaren und in dem als Parameter - - übergebenen - assessment - Element für bestimmte, anhand des Fehlercodes identifizierten Fehlermeldungen eine - eigene Qualifizierung als customLevel festlegen. - - Dies kann z. B. genutzt werden, um einen error, der ansonsten zur - Rückweisung der Nachricht führen würde, zumindest zeitweilig als - warning - zu qualifizieren, so dass eine entsprechende - Dokumenteninstanz trotz einer Warnung angenommen und verarbeitet würde. - - Die Funktion prüft für eine Fehlernachricht, ob deren @code Attribut - Bestandteil der für ein bestimmtes customLevel des - - Parameters angegebenen Fehlercodes ist. - Falls ja, dann gilt das jeweilige customLevel. Andernfalls wird der im - Rahmen der Validierung ermittelte Fehlerlevel unverändert übernommen. - - - Eine im Rahmen der Validierung ausgegebene - Fehlernachricht - - - - - - - - - - - - - - - - - - - - - - - - - - - Generiert das head Element eines eingebetteten HTML Dokuments, - welches den Prüf- und Bewertungsbericht visualisiert und die Handlungsempfehlung - begründet - - - - - - Prüfbericht - - - - - -

Prüfbericht

- - - - - - - - - - - - - - - - - - -
- - - - - Generiert am Beginn eines eingebetteten HTML Dokuments, welches den Prüf- und - Bewertungsbericht visualisiert und die Handlungsempfehlung begründet, eine Übersicht - mit Metadaten des geprüften Dokuments. - - - - - - - - - - - - Generiert am Ende eines eingebetteten HTML Dokuments, welches den Prüf- und - Bewertungsbericht visualisiert und die Handlungsempfehlung begründet, eine Übersicht - mit Metadaten zum Prüfmodul. - - - - -

- Dieser Prüfbericht wurde erstellt mit - - . -

-
- - - - Generiert in dem eingebetetteten HTML Dokument eine Tabelle mit den während der - Validierung ausgegebenen Daten. - - - - -

Übersicht der Validierungsergebnisse:

- - - - - - - - - - - - - - - - - - - - -
PrüfschrittFehlerWarnungenInformationen
- - ( - - ) - - - - - - -
- -

Validierungsergebnisse im Detail:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PosCodeAdj. Grad (Grad)Text
- - - - - - - - - - -
- - Pfad: - - - Zeile: - - - Spalte: - -
-
- - - - Generiert in dem eingebetteten HTML Dokument eine Aussage zur Konformität des - geprüften Dokuments zu den formalen Vorgaben. - - - - - - - - -

- Konformitätsprüfung: - Das geprüfte Dokument enthält - - - weder Fehler noch Warnungen. Es ist konform zu den formalen Vorgaben. - - - - nicht konform - zu den formalen Vorgaben. - - -

-
- -

- Konformitätsprüfung: - Das geprüfte Dokument entspricht keinen zulässigen Dokumenttyp und ist damit - nicht konform - zu den formalen Vorgaben. -

-
-
- -
- - - - Generiert in dem eingebetteten HTML Dokument die Aussage zur - Handlungsempfehlung. - - - - - - - - -

Bewertung: Es wird empfohlen das Dokument zurückzuweisen.

-
- -

Bewertung: Es wird empfohlen das Dokument anzunehmen und weiter zu verarbeiten.

-
- -

Bewertung: Es wird empfohlen das Dokument anzunehmen und zu verarbeiten, da die - vorhandenen Fehler derzeit toleriert werden. -

-
- -

Bewertung: Es wird empfohlen das Dokument zurückzuweisen.

-
-
-
- - - - -

- Inhalt des Rechnungsdokuments: -

- - -
-
- - - - Eine Element wird als eine Zeile in einer Tabelle visualisiert. Die erste Spalte - enthält die Zeilennummer, die zweite Attribute und Text des Elements - - - - - - - - - - - - - - - - - - - - - - Ein Textbereich (in der Zeile des Elements) - - - -
- -
-
- - -
- [ … ] -
-
- - - - - - Ein Attributbereich (in der Zeile des Elements) - - - -
- -
-
- - -
\ No newline at end of file diff --git a/src/main/docker/daemon/config/resources/eRechnung/report.xsl b/src/main/docker/daemon/config/resources/eRechnung/report.xsl deleted file mode 100644 index 7e3555c..0000000 --- a/src/main/docker/daemon/config/resources/eRechnung/report.xsl +++ /dev/null @@ -1,631 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Unexpected result from schematron validation - there is no svrl:schematron-output element! - - - - - - - - - - - - - - - - - - error - warning - information - warning - error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - step_ - - - - - - - - - - message_ - - - - - - - - - - - - - - - Dies ist das zentrale Template des Skripts. Angewandt auf ein - validationReport-Dokument, und unter Nutzung des - - Parameters wird eine Handlungsempfehlung in Form eines - accept - oder reject Elements erstellt, welches eine - Begründung der jeweiligen Empfehlung enthalten kann. - - Das Template realisiert eine Funktion f:validationReport, assessment → - suggestion - - - - - - - - - - - - - - - - - - - - - - Ermittelt für eine während der Validierung ausgegebene Fehlernachricht deren - Fehlerlevel (error, warning, information) gemäß der - benutzerspezifischen Qualifizierung. - - Jede Fehlernachricht hat im Rahmen der Validierung ein solches Fehlerlevel - erhalten (siehe Attribut @level). Im Regelfall entspricht die - benutzerspezifische Qualifizierung unverändert diesem Level. Nutzer können jedoch im - Rahmen der Bewertung eigene Qualifizierungen vereinbaren und in dem als Parameter - - übergebenen - assessment - Element für bestimmte, anhand des Fehlercodes identifizierten Fehlermeldungen eine - eigene Qualifizierung als customLevel festlegen. - - Dies kann z. B. genutzt werden, um einen error, der ansonsten zur - Rückweisung der Nachricht führen würde, zumindest zeitweilig als - warning - zu qualifizieren, so dass eine entsprechende - Dokumenteninstanz trotz einer Warnung angenommen und verarbeitet würde. - - Die Funktion prüft für eine Fehlernachricht, ob deren @code Attribut - Bestandteil der für ein bestimmtes customLevel des - - Parameters angegebenen Fehlercodes ist. - Falls ja, dann gilt das jeweilige customLevel. Andernfalls wird der im - Rahmen der Validierung ermittelte Fehlerlevel unverändert übernommen. - - - Eine im Rahmen der Validierung ausgegebene - Fehlernachricht - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Generiert das head Element eines eingebetteten HTML Dokuments, - welches den Prüf- und Bewertungsbericht visualisiert und die Handlungsempfehlung - begründet - - - - - - Pruefbericht der KoSIT - - - - - - - Generiert die Überschrift des eines eingebetteten HTML Dokuments, welches den - Prüf- und Bewertungsbericht visualisiert und die Handlungsempfehlung - begründet - - - - -

Prüfbericht der KoSIT

-
- - - - Generiert am Beginn eines eingebetteten HTML Dokuments, welches den Prüf- und - Bewertungsbericht visualisiert und die Handlungsempfehlung begründet, eine Übersicht - mit Metadaten des geprüften Dokuments. - - - - -

- Angaben zum geprüften Dokument -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Prüfbericht Nr. - -
Dokument: - -
Szenario: - -
Zeitpunkt: - -
Validierungsschritte:FehlerWarnungInformation
- - - - - - - - - -
-
- - - - Generiert am Ende eines eingebetteten HTML Dokuments, welches den Prüf- und - Bewertungsbericht visualisiert und die Handlungsempfehlung begründet, eine Übersicht - mit Metadaten zum Prüfmodul. - - - - -

- Erstellt mit: - - für das InstructionSet - - - - vom - - . -

-
- - - - Generiert in dem eingebetetteten HTML Dokument eine Tabelle mit den während der - Validierung ausgegebenen Daten. - - - - - - - - - - - -
-
- - - - Generiert in der HTML-Tabelle der Validierungsnachtichten in dem eingebetteten - HTML Dokument dn Tabellenkopf - - - - - - - Pos - Code - CustomLevel (Level) - Step - Text - - - - - - - Generiert in der HTML-Tabelle der Validierungsnachtichten in dem eingebetteten - HTML Dokument eine oder mehrere Zeilen pro Validierungsnachricht - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Generiert in dem eingebetteten HTML Dokument eine Aussage zur Konformität des - geprüften Dokuments zu den formalen Vorgaben. - - - - - - -

- Konformitätsprüfung: - Das geprüfte Dokument enthält - - - weder Fehler noch Warnungen. Es ist konform zu den formalen Vorgaben. - - - - nicht konform - zu den formalen Vorgaben. - - -

-
- - - - Generiert in dem eingebetteten HTML Dokument die Aussage zur - Handlungsempfehlung. - - - - - - -

- Bewertung: - - - Es wird empfohlen das Dokument anzunehmen un weiter zu verarbeiten. - - - Es wird empfohlen das Dokument anzunehmen und zu verarbeiten, da die vorhandenen Fehler derzeit toleriert werden. - - - Es wird empfohlen das Dokument zurückzuweisen. - - -

-
- - -
\ No newline at end of file diff --git a/src/main/docker/daemon/config/scenarios.xml b/src/main/docker/daemon/config/scenarios.xml deleted file mode 100644 index 086a093..0000000 --- a/src/main/docker/daemon/config/scenarios.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - XInneres - 2017-08-08 - -

Prüft XInneres Nachrichten anhand der von uns offiziell herausgegebenen XML Schemata und Beispielen für mögliche weitergehende - Prüfungen mit Schematron. -

-

Prüft elektronische Rechnungen im Format UBL 2.1

-
- - - UBL 2.1 Invoice - urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 - /invoice:Invoice - - - - UBL 2.1 Invoice - resources/eRechnung/UBL-2.1/xsdrt/maindoc/UBL-Invoice-2.1.xsd - - - - - BII Rules for Invoice - resources/eRechnung/UBL-2.1/xsl/BIIRULES-UBL-T10.xsl - - - - - openPEPPOL Rules for Invoice - resources/eRechnung/UBL-2.1/xsl/OPENPEPPOL-UBL-T10.xsl - - - - - Report für eRechnung - resources/eRechnung/report.xsl - - - - - - default - resources/eRechnung/default-report.xsl - - - -
diff --git a/src/main/docker/daemon/run.sh b/src/main/docker/daemon/run.sh deleted file mode 100644 index 3726133..0000000 --- a/src/main/docker/daemon/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -cd /opt/validationtool && java -jar validationtool-standalone.jar -s scenarios.xml -D -H 0.0.0.0 \ No newline at end of file diff --git a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java index 41b3c5e..4cea454 100644 --- a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java +++ b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java @@ -308,7 +308,7 @@ public class CommandLineApplication { return d.toUri(); } else { throw new IllegalArgumentException( - String.format("Not a valid path for scenario definition specified: '%s'", d.toAbsolutePath())); + String.format("Not a valid path for repository definition specified: '%s'", d.toAbsolutePath())); } } return null; diff --git a/src/test/resources/data.zip b/src/test/resources/data.zip deleted file mode 100644 index a7b6efe8a553226750e4958d5be7205c2bd0fdc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1937332 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

k3{%||v`i;#_$%aqnQAIBI!`r||5 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 IL?rBly99+s=018E5U?WyQ)icS+xy6Ouo}FMRN_ zrzc);mYnoDX2ok7IX-;wc<0~xygQlFCN}QbBZb7#|BrsXgwjL#&UZQou1|BEC11ps zJiA{oLos(*)53?fEv_z)9@M7r$laL_uHVf&>(J=t_SE}rH<;FKJb2ylHPdZ-_u%;{ zOr&~TJ@#^zt2x^^sb3^ZJPQ4v`CvWvxrQrPFHBv{1=OWB@ZV57^dbSZB&wdc)%I1( zS@%x4^8JM4mk4Sn?TtLS=9RU3-*BF?{#VOcGtFPF9i0ZnBJ-2cD_Ranl0Za3a{4FHb!zs23rIBDrJD=$!&N6aK%UXR{>Rqy6#6txnn2MV~q&FIb|d zFa0)fkjLhZHuy`b_wv}%mEX&JXp2ep@Xr!wwV*FSx0n^IDHTlIXPKi`~OEXWijxpS*ua>p5f zQZ|A6d)KFnAaq8pB+kixhWJTe$T4JJJWfu;VkaU=!Kf@ml}fcJ886aR@cLhuvj%=8 z2>r$bpOg4#HA>psn-rzYnNFY4x>1y>;*V58Wq$;xDdghxQ1DQ)Zh%{Wpb=YK`MItF zYX1Usi#^Z%lQrtx5V#|MqK&bDya9eIsdu;eB2Cb0!JgWBrfxM&Ft^ zvA-2sRu{9{oL!4F4B?+ zH3kO0!@e*z=3@+j2&LJn;fCyx14ENIQ%$&XpZSP3a|!9n7c|MEhseHWcoKbJ4x$zX z+Q0O%6FW3BV2|jD`7?;@am$q-On6~5ukq73c_jG1Wbn%mKu`ws*%Z>$h-Mw0%?2kB zo`=AFEDNY&`Le_d44qeTw8#nM9{L{7lAJ)gYI6d)_;Io&xv^jJ#$pZ≀Bdq%&u{ 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 From 13bc14b95931e177cd20e54bae1013c2389086f7 Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Tue, 4 Jun 2019 08:23:55 +0200 Subject: [PATCH 19/25] (chore) xml nicht formatieren --- .idea/eclipseCodeFormatter.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/.idea/eclipseCodeFormatter.xml b/.idea/eclipseCodeFormatter.xml index fa47614..680c7c6 100644 --- a/.idea/eclipseCodeFormatter.xml +++ b/.idea/eclipseCodeFormatter.xml @@ -3,6 +3,7 @@