mirror of
https://github.com/itplr-kosit/validator.git
synced 2026-05-25 16:55:39 +00:00
Merge branch 'master' into 48-documentation-and-semantic-defintion-of-accpetmatch-functionality
This commit is contained in:
commit
a670b227ed
24 changed files with 381 additions and 421 deletions
|
|
@ -2,6 +2,7 @@ package de.kosit.validationtool.api;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import org.oclc.purl.dsdl.svrl.FailedAssert;
|
||||
import org.oclc.purl.dsdl.svrl.SchematronOutput;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
|
|
@ -69,6 +70,13 @@ public interface Result {
|
|||
*/
|
||||
List<SchematronOutput> getSchematronResult();
|
||||
|
||||
/**
|
||||
* Returns {@link org.oclc.purl.dsdl.svrl.FailedAssert FailedAsserts} of a schematron evaluation.
|
||||
*
|
||||
* @return list of {@link org.oclc.purl.dsdl.svrl.FailedAssert FailedAsserts}, if any, empty list otherwise
|
||||
*/
|
||||
List<FailedAssert> getFailedAsserts();
|
||||
|
||||
/**
|
||||
* Liefert ein true, wenn keine Schema-Violations vorhanden sind.
|
||||
*
|
||||
|
|
@ -82,4 +90,11 @@ public interface Result {
|
|||
* @return true wenn well-formed
|
||||
*/
|
||||
boolean isWellformed();
|
||||
|
||||
/**
|
||||
* Returns true, if schematron has been checked and the result does not contain any {@link FailedAssert FailedAsserts}.
|
||||
*
|
||||
* @return true, if valid
|
||||
*/
|
||||
boolean isSchematronValid();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,12 +127,19 @@ public class DefaultResult implements Result {
|
|||
*
|
||||
* @return die {@link FailedAssert}
|
||||
*/
|
||||
@Override
|
||||
public List<FailedAssert> getFailedAsserts() {
|
||||
return filterSchematronResult(FailedAssert.class);
|
||||
}
|
||||
|
||||
private <T> List<T> filterSchematronResult(final Class<T> type) {
|
||||
return getSchematronResult().stream().filter(type::isInstance).map(type::cast).collect(Collectors.toList());
|
||||
return getSchematronResult() != null
|
||||
? getSchematronResult().stream().filter(type::isInstance).map(type::cast).collect(Collectors.toList())
|
||||
: Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSchematronValid() {
|
||||
return getSchematronResult() != null && getFailedAsserts().isEmpty();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,6 +164,7 @@ public class ScenarioRepository {
|
|||
|
||||
private ScenarioType createFallback() {
|
||||
final ScenarioType t = new ScenarioType();
|
||||
t.setFallback(true);
|
||||
t.setName("Fallback-Scenario");
|
||||
t.setMatch("count(/)<0");
|
||||
final CreateReportType reportType = new CreateReportType();
|
||||
|
|
|
|||
|
|
@ -70,6 +70,11 @@ public abstract class BaseScenario {
|
|||
private ResourceType resourceType;
|
||||
}
|
||||
|
||||
@XmlTransient
|
||||
@Getter
|
||||
@Setter
|
||||
private boolean fallback;
|
||||
|
||||
private XPathExecutable matchExecutable;
|
||||
|
||||
private XPathExecutable acceptExecutable;
|
||||
|
|
|
|||
|
|
@ -2,15 +2,19 @@ package de.kosit.validationtool.impl.tasks;
|
|||
|
||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||
|
||||
import org.oclc.purl.dsdl.svrl.FailedAssert;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import de.kosit.validationtool.api.AcceptRecommendation;
|
||||
|
||||
import net.sf.saxon.s9api.SaxonApiException;
|
||||
import net.sf.saxon.s9api.XPathSelector;
|
||||
|
||||
/**
|
||||
* Berechnet die Akzeptanz-Empfehlung gemäß konfigurierten 'acceptMatch' des aktuellen Szenarios.
|
||||
* Computes a {@link AcceptRecommendation} for this instance. This is either based on an 'acceptMatch'-configuration of
|
||||
* the active scenario or based on overall evaluation about schema and semantic (schematron) correctness of the
|
||||
*
|
||||
* @author Andreas Penski
|
||||
*/
|
||||
|
|
@ -20,23 +24,49 @@ 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);
|
||||
if (preCondtionsMatch(results)) {
|
||||
final String acceptMatch = results.getScenarioSelectionResult().getObject().getAcceptMatch();
|
||||
if (results.getSchemaValidationResult().isValid() && isNotBlank(acceptMatch)) {
|
||||
evaluateAcceptanceMatch(results);
|
||||
} else {
|
||||
evaluateSchemaAndSchematron(results);
|
||||
}
|
||||
} else {
|
||||
results.setAcceptStatus(AcceptRecommendation.REJECT);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipped(final Bag results) {
|
||||
return results.getReport() == null;
|
||||
private void evaluateSchemaAndSchematron(final Bag results) {
|
||||
if (results.getSchemaValidationResult().isValid() && isSchematronValid(results)) {
|
||||
results.setAcceptStatus(AcceptRecommendation.ACCEPTABLE);
|
||||
} else {
|
||||
results.setAcceptStatus(AcceptRecommendation.REJECT);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSchematronValid(final Bag results) {
|
||||
return !hasSchematronErrors(results);
|
||||
}
|
||||
|
||||
private boolean hasSchematronErrors(final Bag results) {
|
||||
return results.getReportInput().getValidationResultsSchematron().stream().map(e -> e.getResults().getSchematronOutput())
|
||||
.flatMap(e -> e.getActivePatternAndFiredRuleAndFailedAssert().stream()).anyMatch(FailedAssert.class::isInstance);
|
||||
}
|
||||
|
||||
private static void evaluateAcceptanceMatch(final Bag results) {
|
||||
try {
|
||||
final XPathSelector selector = results.getScenarioSelectionResult().getObject().getAcceptSelector();
|
||||
selector.setContextItem(results.getReport());
|
||||
results.setAcceptStatus(selector.effectiveBooleanValue() ? AcceptRecommendation.ACCEPTABLE : AcceptRecommendation.REJECT);
|
||||
} catch (final SaxonApiException e) {
|
||||
final String msg = "Error evaluating accept recommendation: %s";
|
||||
log.error(msg);
|
||||
results.addProcessingError(msg);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean preCondtionsMatch(final Bag results) {
|
||||
return results.getReport() != null && results.getSchemaValidationResult() != null && results.getScenarioSelectionResult() != null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
package de.kosit.validationtool.impl.tasks;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import de.kosit.validationtool.impl.ScenarioRepository;
|
||||
import de.kosit.validationtool.impl.model.Result;
|
||||
|
|
@ -35,6 +36,7 @@ import net.sf.saxon.s9api.XdmNode;
|
|||
* @author Andreas Penski
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class ScenarioSelectionAction implements CheckAction {
|
||||
|
||||
private final ScenarioRepository repository;
|
||||
|
|
@ -47,16 +49,21 @@ public class ScenarioSelectionAction implements CheckAction {
|
|||
if (results.getParserResult().isValid()) {
|
||||
scenarioTypeResult = determineScenario(results.getParserResult().getObject());
|
||||
} else {
|
||||
scenarioTypeResult = new Result<>(repository.getFallbackScenario());
|
||||
scenarioTypeResult = new Result<>(this.repository.getFallbackScenario());
|
||||
}
|
||||
results.setScenarioSelectionResult(scenarioTypeResult);
|
||||
report.setScenario(scenarioTypeResult.getObject());
|
||||
if (!scenarioTypeResult.getObject().isFallback()) {
|
||||
report.setScenario(scenarioTypeResult.getObject());
|
||||
log.info("Schenario {} identified for {}", scenarioTypeResult.getObject().getName(), results.getInput().getName());
|
||||
} else {
|
||||
log.error("No valid schenario configuration found for {}", results.getInput().getName());
|
||||
}
|
||||
}
|
||||
|
||||
private Result<ScenarioType, String> determineScenario(final XdmNode document) {
|
||||
final Result<ScenarioType, String> result = this.repository.selectScenario(document);
|
||||
if (result.isInvalid()) {
|
||||
return new Result<>(repository.getFallbackScenario());
|
||||
return new Result<>(this.repository.getFallbackScenario());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue