Skip to content
This repository has been archived by the owner on Oct 12, 2021. It is now read-only.

Commit

Permalink
Refactored ValidatorImpl and made changes based on the updated shaclex
Browse files Browse the repository at this point in the history
library. Changed return type of the validator method.

Change-Id: Icdd686ef2c85d5f2215707ea5a3a0da1c27b9bd1
Signed-off-by: Yash Khatri <yash.khatri@scania.com>
  • Loading branch information
yashkhatri committed Oct 11, 2018
1 parent 4aec3ea commit 8b12a24
Show file tree
Hide file tree
Showing 23 changed files with 407 additions and 1,042 deletions.
8 changes: 4 additions & 4 deletions src/main/java/org/eclipse/lyo/validation/Validator.java
Expand Up @@ -22,8 +22,8 @@
import org.apache.jena.rdf.model.Model;
import org.eclipse.lyo.oslc4j.core.exception.OslcCoreApplicationException;
import org.eclipse.lyo.oslc4j.core.model.AbstractResource;
import org.eclipse.lyo.validation.model.ValidationResultModel;
import org.eclipse.lyo.validation.shacl.ShaclShape;
import org.eclipse.lyo.validation.shacl.ValidationResult;

/**
* @author Yash Khatri
Expand All @@ -41,7 +41,7 @@ public interface Validator {
*
* @see org.eclipse.lyo.validation.shacl.ShaclShapeFactory#createShaclShape(Class)
*/
ValidationResultModel validate(AbstractResource resource)
ValidationResult validate(AbstractResource resource)
throws OslcCoreApplicationException, URISyntaxException, ParseException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException,
DatatypeConfigurationException;
Expand All @@ -66,7 +66,7 @@ ValidationResultModel validate(AbstractResource resource)
* @throws DatatypeConfigurationException the datatype configuration exception
* @throws OslcCoreApplicationException the oslc core application exception
*/
ValidationResultModel validate(Model dataModel, Model shapeModel)
ValidationResult validate(Model dataModel, Model shapeModel)
throws IllegalAccessException, InvocationTargetException,
DatatypeConfigurationException, OslcCoreApplicationException;

Expand All @@ -83,7 +83,7 @@ ValidationResultModel validate(Model dataModel, Model shapeModel)
*
* @return Model with the validation results
*/
ValidationResultModel validate(Model dataModel, Class<? extends AbstractResource> clazz)
ValidationResult validate(Model dataModel, Class<? extends AbstractResource> clazz)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException,
DatatypeConfigurationException, OslcCoreApplicationException, URISyntaxException,
ParseException;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/org/eclipse/lyo/validation/ValidatorFactory.java
@@ -0,0 +1,10 @@
package org.eclipse.lyo.validation;

import org.eclipse.lyo.validation.impl.ShaclExValidatorImpl;

public final class ValidatorFactory {

public static final Validator createShaclExValidator() {
return new ShaclExValidatorImpl();
}
}
Expand Up @@ -24,47 +24,45 @@
import es.weso.schema.Result;
import es.weso.schema.Schema;
import es.weso.schema.Schemas;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.datatype.DatatypeConfigurationException;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.ResIterator;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;
import org.apache.jena.shared.PropertyNotFoundException;
import org.apache.jena.riot.RDFLanguages;
import org.eclipse.lyo.oslc4j.core.exception.OslcCoreApplicationException;
import org.eclipse.lyo.oslc4j.core.model.AbstractResource;
import org.eclipse.lyo.oslc4j.provider.jena.JenaModelHelper;
import org.eclipse.lyo.validation.Validator;
import org.eclipse.lyo.validation.model.ResourceModel;
import org.eclipse.lyo.validation.model.ValidationResultModel;
import org.eclipse.lyo.validation.shacl.ShaclResult;
import org.eclipse.lyo.validation.shacl.ShaclShape;
import org.eclipse.lyo.validation.shacl.ShaclShapeFactory;
import org.eclipse.lyo.validation.shacl.ValidationResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import scala.Option;
import scala.util.Either;

import static scala.collection.JavaConversions.*;

/**
* @since 2.3.0
*/
public class ValidatorImpl implements Validator {
public class ShaclExValidatorImpl implements Validator {

private static final Option<String> OPTION_NONE = Option.apply(null);
private static final String TRIGGER_MODE_TARGET_DECLS = "TargetDecls";
private static final String SHACLEX = "SHACLex";
private static final Logger log = LoggerFactory.getLogger(ValidatorImpl.class);
private static final Logger log = LoggerFactory.getLogger(ShaclExValidatorImpl.class);
private static final String EMPTY_MAP = "";

@Override
public ValidationResultModel validate(AbstractResource resource)
public ValidationResult validate(AbstractResource resource)
throws OslcCoreApplicationException, URISyntaxException, ParseException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException,
DatatypeConfigurationException {
Expand All @@ -75,12 +73,12 @@ public ValidationResultModel validate(AbstractResource resource)
}

@Override
public ValidationResultModel validate(Model dataModel, Model shapeModel) {
public ValidationResult validate(Model dataModel, Model shapeModel) {
return getValidationResults(dataModel, shapeModel);
}

@Override
public ValidationResultModel validate(Model dataModel, Class<? extends AbstractResource> clazz)
public ValidationResult validate(Model dataModel, Class<? extends AbstractResource> clazz)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException,
DatatypeConfigurationException, OslcCoreApplicationException, URISyntaxException,
ParseException {
Expand All @@ -89,63 +87,29 @@ public ValidationResultModel validate(Model dataModel, Class<? extends AbstractR
return getValidationResults(dataModel, shapeModel);
}

private ValidationResultModel getValidationResults(Model dataModel, Model shapeModel) {
if(log.isDebugEnabled()) {
private ValidationResult getValidationResults(Model dataModel, Model shapeModel) {
Model valResultJenaModel = ModelFactory.createDefaultModel();
if (log.isDebugEnabled()) {
log.debug("Data model: \n{}", modelToTurtle(dataModel));
log.debug("Shape model: \n{}", modelToTurtle(shapeModel));
}
ResIterator iterator = dataModel.listSubjects();
Model model = ModelFactory.createDefaultModel();
List<ResourceModel> validResources = new ArrayList<>();
List<ResourceModel> invalidResources = new ArrayList<>();
while (iterator.hasNext()) {
// Iterating over each resource in the model

ResourceModel resourceModel = new ResourceModel();

final Resource resource = iterator.next();
model.add(resource.listProperties());

Result validationResult = validateInternal(model, shapeModel);

if(log.isDebugEnabled()) {
final RDFReader valReport = validationResult.validationReport().right().get();
log.debug("Validation report: \n{}", valReport.serialize("TURTLE"));
}
Result result = validateInternal(dataModel, shapeModel);

populateResourceModel(resourceModel, model, resource, validationResult);
final RDFReader valReport = result.validationReport().right().get();
Either<String, String> valReportAsTurtle = valReport.serialize(RDFLanguages.strLangTurtle);

populateCounts(resourceModel, validationResult.isValid(), validResources, invalidResources);

model.remove(resource.listProperties());

log.info(
"Total Number Of Resources " + (validResources.size() + invalidResources.size
()));
if (log.isDebugEnabled()) {
log.debug("Validation report: \n{}", valReportAsTurtle.right().get());
}

log.info("Validations Completed; Returning ValidationResultModel");
return populateValidationModel(validResources, invalidResources);

}

private void populateCounts(ResourceModel resourceModel, boolean isValid,
List<ResourceModel> validResources, List<ResourceModel> invalidResources) {
if (isValid) {
validResources.add(resourceModel);
log.info("Datamodel valid.");
} else {
invalidResources.add(resourceModel);
log.info("Datamodel Invalid");
try {
final InputStream in = new ByteArrayInputStream(valReportAsTurtle.right().get().getBytes("UTF-8"));
valResultJenaModel.read(in, null, RDFLanguages.strLangTurtle);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
log.debug("Valid Count:" + validResources.size());
log.debug("InValid Count:" + invalidResources.size());
}

private ValidationResultModel populateValidationModel(List<ResourceModel> validResources,
List<ResourceModel> invalidResources) {
log.debug("Populating ValidationResultModel");
return new ValidationResultModel(validResources, invalidResources);
return populateValidationResult(result);
}

private Result validateInternal(Model resourceAsModel, Model shapeAsModel)
Expand Down Expand Up @@ -192,51 +156,21 @@ public static String modelToTurtle(final Model jenaModel) {
return out.toString();
}

private static void populateResourceModel(ResourceModel resourceModel, Model model,
final Resource resource, Result validationResult) {
try {
log.debug("setting title");
resourceModel.setTitle(resource.getRequiredProperty(
model.getProperty("http://purl.org/dc/terms/title")).getObject().toString());
} catch (PropertyNotFoundException e) {
try {
log.debug("setting title");
resourceModel.setTitle(resource.getRequiredProperty(
model.getProperty("http://purl.org/dc/terms#title"))
.getObject()
.toString());
} catch (PropertyNotFoundException ex) {
log.debug("title doesn't exist");
resourceModel.setTitle("No title exists");
}
}
ValidationResult populateValidationResult(Result result){
Model valReportJenaModel = ModelFactory.createDefaultModel();
final RDFReader valReport = result.validationReport().right().get();
Either<String, String> valReportAsTurtle = valReport.serialize(RDFLanguages.strLangTurtle);

try {
log.debug("setting description");
resourceModel.setDescription(resource.getRequiredProperty(
model.getProperty("http://purl.org/dc/terms/description"))
.getObject()
.toString());
} catch (PropertyNotFoundException e) {
try {
log.debug("setting description");
resourceModel.setDescription(resource.getRequiredProperty(
model.getProperty("http://purl.org/dc/terms#description"))
.getObject()
.toString());
} catch (PropertyNotFoundException ex) {
log.debug("description doesn't exist");
resourceModel.setDescription("No desciption exists");
}
if (log.isDebugEnabled()) {
log.debug("Validation report: \n{}", valReportAsTurtle.right().get());
}

try {
log.debug("setting uri");
resourceModel.setURI(model.getSeq(resource).toString());
} catch (Exception e) {
log.debug("uri doesn't exist");
resourceModel.setURI("No uri exists");
final InputStream in = new ByteArrayInputStream(valReportAsTurtle.right().get().getBytes("UTF-8"));
valReportJenaModel.read(in, null, RDFLanguages.strLangTurtle);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

resourceModel.setResult(validationResult);
return new ShaclResult(result, result.isValid(), result.message() ,valReportJenaModel, seqAsJavaList(result.errors()));
}
}

0 comments on commit 8b12a24

Please sign in to comment.