Skip to content

Commit 8aeaf6c

Browse files
author
Mohamed Maza
committed
#79 Actions generate XVRL output (WiP)
1 parent 8e5f4c8 commit 8aeaf6c

21 files changed

+774
-81
lines changed

Diff for: src/main/java/de/kosit/validationtool/cmd/InternalCheck.java

+9-12
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,6 @@
1616

1717
package de.kosit.validationtool.cmd;
1818

19-
import java.io.PrintWriter;
20-
import java.text.MessageFormat;
21-
import java.util.Map;
22-
import java.util.Map.Entry;
23-
import java.util.stream.Collectors;
24-
25-
import org.fusesource.jansi.AnsiRenderer.Code;
26-
27-
import lombok.extern.slf4j.Slf4j;
28-
2919
import de.kosit.validationtool.api.Configuration;
3020
import de.kosit.validationtool.api.Input;
3121
import de.kosit.validationtool.api.Result;
@@ -36,8 +26,15 @@
3626
import de.kosit.validationtool.cmd.report.Line;
3727
import de.kosit.validationtool.impl.DefaultCheck;
3828
import de.kosit.validationtool.impl.tasks.CheckAction;
39-
29+
import lombok.extern.slf4j.Slf4j;
4030
import net.sf.saxon.s9api.Processor;
31+
import org.fusesource.jansi.AnsiRenderer.Code;
32+
33+
import java.io.PrintWriter;
34+
import java.text.MessageFormat;
35+
import java.util.Map;
36+
import java.util.Map.Entry;
37+
import java.util.stream.Collectors;
4138

4239
/**
4340
* Simple Erweiterung der Klasse {@link DefaultCheck} um das Ergebnis der Assertion-Prüfung auszuwerten und auszugeben.
@@ -69,7 +66,7 @@ class InternalCheck extends DefaultCheck {
6966
*/
7067
@Override
7168
public Result checkInput(final Input input) {
72-
final CheckAction.Process process = new CheckAction.Process(input, createReport());
69+
final CheckAction.Process process = new CheckAction.Process(input, createReport(), createXVRLXvrlReportSummary());
7370
final Result result = runCheckInternal(process);
7471
if (process.getAssertionResult() != null) {
7572
this.checkAssertions += process.getAssertionResult().getObject();

Diff for: src/main/java/de/kosit/validationtool/impl/DefaultCheck.java

+47-14
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@
2525
import java.util.Map;
2626
import java.util.stream.Collectors;
2727

28-
import de.kosit.validationtool.model.xvrl.Timestamp;
29-
import de.kosit.validationtool.model.xvrl.XVRLMetadata;
30-
import de.kosit.validationtool.model.xvrl.XVRLReportSummary;
28+
import de.kosit.validationtool.impl.tasks.*;
29+
import de.kosit.validationtool.impl.xvrl.XVRLUtil;
30+
import de.kosit.validationtool.impl.xvrl.XmlErrorImpl;
31+
import de.kosit.validationtool.model.xvrl.*;
3132
import lombok.Getter;
3233
import lombok.extern.slf4j.Slf4j;
3334

@@ -36,16 +37,7 @@
3637
import de.kosit.validationtool.api.Input;
3738
import de.kosit.validationtool.api.Result;
3839
import de.kosit.validationtool.api.XmlError;
39-
import de.kosit.validationtool.impl.tasks.CheckAction;
4040
import de.kosit.validationtool.impl.tasks.CheckAction.Process;
41-
import de.kosit.validationtool.impl.tasks.ComputeAcceptanceAction;
42-
import de.kosit.validationtool.impl.tasks.CreateDocumentIdentificationAction;
43-
import de.kosit.validationtool.impl.tasks.CreateReportAction;
44-
import de.kosit.validationtool.impl.tasks.DocumentParseAction;
45-
import de.kosit.validationtool.impl.tasks.ScenarioSelectionAction;
46-
import de.kosit.validationtool.impl.tasks.SchemaValidationAction;
47-
import de.kosit.validationtool.impl.tasks.SchematronValidationAction;
48-
import de.kosit.validationtool.impl.tasks.ValidateReportInputAction;
4941
import de.kosit.validationtool.impl.xml.ProcessorProvider;
5042
import de.kosit.validationtool.model.reportInput.CreateReportInput;
5143
import de.kosit.validationtool.model.reportInput.EngineType;
@@ -95,6 +87,7 @@ public DefaultCheck(final Processor processor, final Configuration... configurat
9587
this.checkSteps.add(new SchemaValidationAction(processor));
9688
this.checkSteps.add(new SchematronValidationAction(this.conversionService));
9789
this.checkSteps.add(new ValidateReportInputAction(this.conversionService, SchemaProvider.getReportInputSchema()));
90+
this.checkSteps.add(new ValidateXVRLReportSummaryAction(this.conversionService, SchemaProvider.getXVRLSchema()));
9891
this.checkSteps.add(new CreateReportAction(processor, this.conversionService));
9992
this.checkSteps.add(new ComputeAcceptanceAction());
10093
}
@@ -112,9 +105,16 @@ protected static CreateReportInput createReport() {
112105
protected static XVRLReportSummary createXVRLXvrlReportSummary() {
113106
final XVRLReportSummary xvrlReportSummary = new XVRLReportSummary();
114107
XVRLMetadata metadata = new XVRLMetadata();
108+
115109
Timestamp timestamp = new Timestamp();
116110
timestamp.setValue(createTimestamp());
117111
metadata.getTimestamps().add(timestamp);
112+
113+
Validator validator = new Validator();
114+
validator.setName(EngineInformation.getName());
115+
validator.setVersion(EngineInformation.getVersion());
116+
metadata.getValidators().add(validator);
117+
118118
xvrlReportSummary.setMetadata(metadata);
119119
return xvrlReportSummary;
120120
}
@@ -125,7 +125,7 @@ protected boolean isSuccessful(final Map<String, Result> results) {
125125

126126
@Override
127127
public Result checkInput(final Input input) {
128-
final Process checkProcess = new Process(input, createReport());
128+
final Process checkProcess = new Process(input, createReport(), createXVRLXvrlReportSummary());
129129
return runCheckInternal(checkProcess);
130130
}
131131

@@ -141,7 +141,9 @@ protected Result runCheckInternal(final Process checkProcess) {
141141
}
142142
checkProcess.setFinished(true);
143143
log.info("Finished check of {} in {}ms\n", checkProcess.getInput().getName(), System.currentTimeMillis() - started);
144-
return createResult(checkProcess);
144+
Result result = createResult(checkProcess);
145+
Result xvrlResult = createXVRLResult(checkProcess);
146+
return result;
145147
}
146148

147149
private Result createResult(final Process t) {
@@ -157,9 +159,40 @@ private Result createResult(final Process t) {
157159
return result;
158160
}
159161

162+
private Result createXVRLResult(final Process process) {
163+
164+
final XVRLResult xvrlResult = new XVRLResult(process.getXvrlFinalReport(), process.getAcceptStatus(),
165+
new HtmlExtractor(this.processor));
166+
167+
XVRLReport parserReport = process.getReport(DocumentParseAction.class);
168+
xvrlResult.setWellformed("true".equals(parserReport.getDigest().getValid()));
169+
170+
xvrlResult.setReportSummary(process.getXvrlReportSummary());
171+
xvrlResult.setSchemaViolations(convertErrorsFromXVRLDetections(XVRLUtil.getAllErrorDetections(process.getXvrlReportSummary())));
172+
173+
xvrlResult.setProcessingSuccessful(!process.isStopped() && process.isFinished());
174+
175+
// TODO MM add SchematronResult
176+
// XVRLReport schematronValidationReport = process.getReport(SchematronValidationAction.class);
177+
// xvrlResult.setSchematronResult(t.getReportInput().getValidationResultsSchematron().stream()
178+
// .filter(e -> e.getResults() != null).map(e ->
179+
// e.getResults().getSchematronOutput()).collect(Collectors.toList()));
180+
181+
return xvrlResult;
182+
}
183+
160184
private static List<XmlError> convertErrors(final Collection<XMLSyntaxError> errors) {
161185
// noinspection unchecked
162186
return (List<XmlError>) (List<?>) errors;
163187
}
164188

189+
private static List<XmlError> convertErrorsFromXVRLDetections(final Collection<XVRLDetection> errors) {
190+
List<XmlError> xmlErrorList = new ArrayList<>();
191+
errors.forEach(xvrlDetection -> {
192+
XmlError xmlError = new XmlErrorImpl(xvrlDetection);
193+
xmlErrorList.add(xmlError);
194+
});
195+
return xmlErrorList;
196+
}
197+
165198
}

Diff for: src/main/java/de/kosit/validationtool/impl/SchemaProvider.java

+16
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public class SchemaProvider {
3737

3838
private static Schema reportInputSchema;
3939

40+
private static Schema xvrlSchema;
41+
4042
/**
4143
* Liefert das definierte Schema für die Validierung des [@link CreateReportInput}
4244
*
@@ -51,6 +53,20 @@ public static Schema getReportInputSchema() {
5153
return reportInputSchema;
5254
}
5355

56+
/**
57+
* Liefert das definierte Schema für die Validierung des [@link CreateReportInput}
58+
*
59+
* @return ReportInput-Schema
60+
*/
61+
public static Schema getXVRLSchema() {
62+
if (xvrlSchema == null) {
63+
final SchemaFactory sf = ResolvingMode.STRICT_RELATIVE.getStrategy().createSchemaFactory();
64+
final Source source = resolve(SchemaProvider.class.getResource("/xsd/xvrl.xsd"));
65+
xvrlSchema = createSchema(sf, new Source[] { source }, new ClassPathResourceResolver("/xsd"));
66+
}
67+
return xvrlSchema;
68+
}
69+
5470
private static Schema createSchema(final SchemaFactory sf, final Source[] schemaSources, final LSResourceResolver resourceResolver) {
5571
try {
5672
sf.setResourceResolver(resourceResolver);
+158
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
* Copyright 2017-2021 Koordinierungsstelle für IT-Standards (KoSIT)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package de.kosit.validationtool.impl;
18+
19+
import de.kosit.validationtool.api.AcceptRecommendation;
20+
import de.kosit.validationtool.api.Result;
21+
import de.kosit.validationtool.api.XmlError;
22+
import de.kosit.validationtool.impl.HtmlExtractor;
23+
import de.kosit.validationtool.impl.xvrl.XVRLUtil;
24+
import de.kosit.validationtool.model.reportInput.CreateReportInput;
25+
import de.kosit.validationtool.model.xvrl.XVRLReportSummary;
26+
import lombok.AccessLevel;
27+
import lombok.Getter;
28+
import lombok.Setter;
29+
import net.sf.saxon.dom.NodeOverNodeInfo;
30+
import net.sf.saxon.s9api.XdmNode;
31+
import org.oclc.purl.dsdl.svrl.FailedAssert;
32+
import org.oclc.purl.dsdl.svrl.SchematronOutput;
33+
import org.w3c.dom.Document;
34+
import org.w3c.dom.Element;
35+
36+
import java.util.Collections;
37+
import java.util.List;
38+
import java.util.stream.Collectors;
39+
40+
public class XVRLResult implements Result {
41+
42+
/** Der generierte Report. */
43+
@Getter
44+
private final XdmNode report;
45+
46+
/** Die vom Validator erstelle interne Berichts-'Vorstufe' */
47+
@Getter
48+
@Setter(AccessLevel.PACKAGE)
49+
private XVRLReportSummary reportSummary;
50+
51+
/** Das evaluierte Ergebnis. */
52+
@Getter
53+
private final AcceptRecommendation acceptRecommendation;
54+
55+
private final HtmlExtractor htmlExtraction;
56+
57+
@Setter(AccessLevel.PACKAGE)
58+
@Getter
59+
private List<XmlError> schemaViolations;
60+
61+
@Getter
62+
@Setter(AccessLevel.PACKAGE)
63+
private List<SchematronOutput> schematronResult;
64+
65+
@Getter
66+
@Setter
67+
private boolean processingSuccessful;
68+
69+
@Getter
70+
@Setter
71+
private boolean wellformed;
72+
73+
public XVRLResult(final XdmNode report, final AcceptRecommendation recommendation, final HtmlExtractor htmlExtractor) {
74+
this.report = report;
75+
this.acceptRecommendation = recommendation;
76+
this.htmlExtraction = htmlExtractor;
77+
}
78+
79+
@Override
80+
public List<String> getProcessingErrors() {
81+
return XVRLUtil.getAllErrors(reportSummary);
82+
}
83+
84+
/**
85+
* Gibt den Report als W3C-{@link Document} zurück.
86+
*
87+
* @return der Report
88+
*/
89+
@Override
90+
public Document getReportDocument() {
91+
return (Document) NodeOverNodeInfo.wrap(getReport().getUnderlyingNode());
92+
}
93+
94+
/**
95+
* Schnellzugriff auf die Empfehlung zur Weiterverarbeitung des Dokuments.
96+
*
97+
* @return true wenn {@link AcceptRecommendation#ACCEPTABLE}
98+
*/
99+
@Override
100+
public boolean isAcceptable() {
101+
return isProcessingSuccessful() && AcceptRecommendation.ACCEPTABLE.equals(this.acceptRecommendation);
102+
}
103+
104+
@Override
105+
public boolean isSchemaValid() {
106+
return getSchemaViolations() != null && getSchemaViolations().isEmpty();
107+
}
108+
109+
/**
110+
* Extrahiert evtl. im Report vorhandene HTML-Fragmente als String.
111+
*
112+
* @return Liste mit HTML Strings.
113+
*/
114+
public List<String> extractHtmlAsString() {
115+
return this.htmlExtraction.extractAsString(getReport());
116+
}
117+
118+
/**
119+
* Extrahiert evtl. im Report vorhandene HTML-Fragmente.
120+
*
121+
* @return Liste mit HTML Nodes.
122+
*/
123+
public List<XdmNode> extractHtml() {
124+
return this.htmlExtraction.extract(getReport());
125+
}
126+
127+
/**
128+
* Extrahiert evtl. im Report vorhandene HTML-Fragmente als {@link Element}.
129+
*
130+
* @return Liste mit HTML Elementen.
131+
*/
132+
public List<Element> extractHtmlAsElement() {
133+
return this.htmlExtraction.extractAsElement(getReport());
134+
}
135+
136+
/**
137+
* Gibt alle Schematron-Ergebnisse vom Typ {@link FailedAssert} zurück.
138+
*
139+
* @return die {@link FailedAssert}
140+
*/
141+
@Override
142+
public List<FailedAssert> getFailedAsserts() {
143+
return getSchematronResult() != null
144+
? getSchematronResult().stream().flatMap(e -> e.getActivePatternAndFiredRuleAndFailedAssert().stream())
145+
.filter(FailedAssert.class::isInstance).map(FailedAssert.class::cast).collect(Collectors.toList())
146+
: Collections.emptyList();
147+
}
148+
149+
private boolean isSchematronEvaluated() {
150+
return getSchematronResult() != null
151+
&& getSchematronResult().stream().noneMatch(e -> e.getActivePatternAndFiredRuleAndFailedAssert().isEmpty());
152+
}
153+
154+
@Override
155+
public boolean isSchematronValid() {
156+
return isSchematronEvaluated() && getFailedAsserts().isEmpty();
157+
}
158+
}

0 commit comments

Comments
 (0)