Skip to content

Commit

Permalink
Migrate to SHACLex 0.1.93
Browse files Browse the repository at this point in the history
  • Loading branch information
berezovskyi committed Jun 5, 2021
1 parent 0716225 commit c90abe8
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 31 deletions.
45 changes: 42 additions & 3 deletions validation/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<maven.compiler.target>1.8</maven.compiler.target>

<v.jetty>9.4.0.v20161208</v.jetty>
<v.shaclex>0.0.87</v.shaclex>
<v.shaclex>0.1.93</v.shaclex>
</properties>

<dependencies>
Expand All @@ -40,7 +40,20 @@
<artifactId>shaclex_2.12</artifactId>
<version>${v.shaclex}</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.eclipse.rdf4j</groupId>
<artifactId>rdf4j-runtime</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- <dependency>
<groupId>org.eclipse.rdf4j</groupId>
<artifactId>rdf4j-runtime</artifactId>
&lt;!&ndash; <version>3.4.2</version> &ndash;&gt;
<version>3.4.4</version>
<type>pom</type>
</dependency>-->

<!-- Guava Library -->
<dependency>
Expand Down Expand Up @@ -125,13 +138,39 @@
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<!-- due to shaclex internal mess with dep versions -->
<id>enforce</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>

<!-- <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.eclipse.rdf4j</groupId>
<artifactId>rdf4j-runtime</artifactId>
<version>3.4.2</version>
&lt;!&ndash; <scope>compile</scope>&ndash;&gt;
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>-->

<repositories>
<repository>
<id>labra</id>
<url>https://dl.bintray.com/labra/maven</url>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
</repository>
<repository>
<id>github</id>
<url>https://maven.pkg.github.com/weso/shaclex</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,24 @@
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;

import javax.xml.datatype.DatatypeConfigurationException;

import cats.effect.IO;
import cats.effect.IO$;
import cats.effect.kernel.Resource;
import cats.effect.kernel.Resource$;
import cats.effect.unsafe.IORuntime;
import cats.effect.unsafe.IORuntime$;
import es.weso.rdf.RDFBuilder;
import es.weso.rdf.jena.RDFAsJenaModel$;
import es.weso.schema.RDFReport;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.riot.RDFLanguages;
import org.checkerframework.checker.units.qual.A;
import org.eclipse.lyo.oslc4j.core.exception.OslcCoreApplicationException;
import org.eclipse.lyo.oslc4j.core.model.AbstractResource;
import org.eclipse.lyo.oslc4j.provider.jena.JenaModelHelper;
Expand All @@ -43,6 +54,7 @@
import es.weso.schema.Schema;
import es.weso.schema.Schemas;
import scala.Option;
import scala.collection.immutable.HashMap;
import scala.util.Either;

/**
Expand All @@ -55,6 +67,7 @@ public class ShaclExValidatorImpl implements Validator {
private static final String SHACLEX = "SHACLex";
private static final Logger log = LoggerFactory.getLogger(ShaclExValidatorImpl.class);
private static final String EMPTY_MAP = "";
private static final IORuntime IO_RUNTIME = IORuntime$.MODULE$.global();

@Override
public ValidationReport validate(AbstractResource resource) throws OslcCoreApplicationException, URISyntaxException,
Expand Down Expand Up @@ -94,57 +107,69 @@ private ValidationReport getValidationResults(Model dataModel, Model shapeModel)

Result result = validateInternal(dataModel, shapeModel);

final RDFReader valReport = result.validationReport().right().get();
Either<String, String> valReportAsTurtle = valReport.serialize(RDFLanguages.strLangTurtle);
final RDFReport validationReport = result.validationReport();

if (log.isDebugEnabled()) {
log.debug("Validation report: \n{}", valReportAsTurtle.right().get());
log.debug("Validation report: \n{}", validationReport);
}

try {
final InputStream in = new ByteArrayInputStream(valReportAsTurtle.right().get().getBytes("UTF-8"));
valResultJenaModel.read(in, null, RDFLanguages.strLangTurtle);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
final String turtleReport = reportToTurtle(validationReport);

final InputStream in = new ByteArrayInputStream(turtleReport.getBytes(StandardCharsets.UTF_8));
valResultJenaModel.read(in, null, RDFLanguages.strLangTurtle);
return populateValidationReport(result);
}

private String reportToTurtle(RDFReport validationReport) {
final Model model = ModelFactory.createDefaultModel();
final RDFAsJenaModel rdfAsJenaModel = getRdfAsJenaModel(model);
final IO<RDFBuilder> builderIO = validationReport.toRDF(rdfAsJenaModel);
final RDFBuilder rdfBuilder = builderIO.unsafeRunSync(IO_RUNTIME);
final IO<String> stringIO = rdfBuilder.serialize(RDFLanguages.strLangNTriples, Option.apply(null));
final String turtleReport = stringIO.unsafeRunSync(IO_RUNTIME);
return turtleReport;
}

private RDFAsJenaModel getRdfAsJenaModel(Model model) {
final IO<RDFAsJenaModel> modelIO = RDFAsJenaModel.fromModel(model, Option.apply(null),
Option.apply(null), new HashMap<>(), new HashMap<>());
final RDFAsJenaModel rdfAsJenaModel = modelIO.unsafeRunSync(IO_RUNTIME);
return rdfAsJenaModel;
}

private Result validateInternal(Model resourceAsModel, Model shapeAsModel) throws IllegalArgumentException {
RDFAsJenaModel resourceAsRDFReader = new RDFAsJenaModel(resourceAsModel);
RDFAsJenaModel shapeAsRDFReader = new RDFAsJenaModel(shapeAsModel);
RDFAsJenaModel resourceAsRDFReader = getRdfAsJenaModel(resourceAsModel);
RDFAsJenaModel shapeAsRDFReader = getRdfAsJenaModel(shapeAsModel);
return validate(resourceAsRDFReader, shapeAsRDFReader);
}

private Result validate(final RDFAsJenaModel rdf, final Schema schema) {
PrefixMap nodeMap = rdf.getPrefixMap();
PrefixMap nodeMap = rdf.getPrefixMap().unsafeRunSync(IO_RUNTIME);
PrefixMap shapesMap = schema.pm();
return schema.validate(rdf, TRIGGER_MODE_TARGET_DECLS, EMPTY_MAP, OPTION_NONE, OPTION_NONE, nodeMap, shapesMap);
return schema.validate(rdf, TRIGGER_MODE_TARGET_DECLS, EMPTY_MAP, OPTION_NONE, OPTION_NONE, nodeMap, shapesMap, rdf)
.unsafeRunSync(IO_RUNTIME);
}

private Result validate(RDFAsJenaModel resourceAsRDFReader, RDFAsJenaModel shapeAsRDFReader) {
final Either<String, Schema> schemaTry = Schemas.fromRDF(shapeAsRDFReader, SHACLEX);
if (schemaTry.isRight()) {
Schema schema = schemaTry.right().get();
return validate(resourceAsRDFReader, schema);
} else {
throw new IllegalArgumentException("A given Shape cannot be used to create a correct " + "Schema");
}
final Schema schema = Schemas.fromRDF(shapeAsRDFReader, SHACLEX)
.onError(throwable -> {throw new IllegalArgumentException("A given Shape cannot be used to create a correct " + "Schema");})
.unsafeRunSync(IO_RUNTIME);
return validate(resourceAsRDFReader, schema);
}

ValidationReport populateValidationReport(Result result) throws IllegalAccessException, IllegalArgumentException,
InstantiationException, InvocationTargetException, SecurityException, NoSuchMethodException,
DatatypeConfigurationException, OslcCoreApplicationException, URISyntaxException {
Model valReportJenaModel = ModelFactory.createDefaultModel();
final RDFReader valReport = result.validationReport().right().get();
Either<String, String> valReportAsTurtle = valReport.serialize(RDFLanguages.strLangTurtle);
final RDFReport valReport = result.validationReport();
String valReportAsTurtle = reportToTurtle(valReport);

if (log.isDebugEnabled()) {
log.debug("Validation report: \n{}", valReportAsTurtle.right().get());
log.debug("Validation report: \n{}", valReportAsTurtle);
}

try {
final InputStream in = new ByteArrayInputStream(valReportAsTurtle.right().get().getBytes("UTF-8"));
final InputStream in = new ByteArrayInputStream(valReportAsTurtle.getBytes("UTF-8"));
valReportJenaModel.read(in, null, RDFLanguages.strLangTurtle);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.Iterator;

import javax.xml.datatype.DatatypeConfigurationException;

Expand All @@ -13,6 +14,7 @@
import org.eclipse.lyo.shacl.ShaclShapeFactory;
import org.eclipse.lyo.shacl.Shape;
import org.eclipse.lyo.shacl.ValidationReport;
import org.eclipse.lyo.shacl.ValidationResult;
import org.junit.Assert;

public class TestHelper {
Expand All @@ -31,12 +33,19 @@ public static ValidationReport performTest(AbstractResource resource)

}

/**
* At least one result message must start with a given string and the whole report must signal non-conformity.
* @param vr report
* @param errorMessage a substring that will be checked
*/
public static void assertNegative(ValidationReport vr, String errorMessage) {
if (vr.getResult().iterator().hasNext()) {
Assert.assertTrue(vr.getResult().iterator().next().getMessage().startsWith(errorMessage));
} else {
Assert.fail("Validation Error should exist.");
Assert.assertFalse(vr.isConforms());
for (ValidationResult result : vr.getResult()) {
if (result.getMessage().startsWith(errorMessage)) {
return;
}
}
Assert.fail("Validation Error should exist.");
}

public static void assertPositive(ValidationReport vr) {
Expand Down

0 comments on commit c90abe8

Please sign in to comment.