Skip to content

Commit

Permalink
Add SHACL validation using SHACL-SHACL
Browse files Browse the repository at this point in the history
  • Loading branch information
MarekSuchanek committed Sep 19, 2022
1 parent 502a190 commit 3b881d1
Show file tree
Hide file tree
Showing 4 changed files with 449 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
- Application title and subtitle in config and settings
- Possibility to configure ping endpoints in config file
- SHACL preview for metadata schemas
- SHACL validation using [SHACL-SHACL](https://www.w3.org/ns/shacl-shacl)
- (Index) Cleanup of harvested records before next harvesting

### Fixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ public void validate(Model shacl, Model data, String baseUri) {
}
throw new ValidationException("Validation failed (unsupported exception)");
}
finally {
sailRepository.shutDown();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,23 @@
*/
package nl.dtls.fairdatapoint.service.schema;

import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import nl.dtls.fairdatapoint.api.dto.schema.MetadataSchemaChangeDTO;
import nl.dtls.fairdatapoint.api.dto.schema.MetadataSchemaVersionDTO;
import nl.dtls.fairdatapoint.database.mongo.repository.MetadataSchemaDraftRepository;
import nl.dtls.fairdatapoint.database.mongo.repository.MetadataSchemaRepository;
import nl.dtls.fairdatapoint.database.mongo.repository.ResourceDefinitionRepository;
import nl.dtls.fairdatapoint.entity.exception.ValidationException;
import nl.dtls.fairdatapoint.entity.resource.ResourceDefinition;
import nl.dtls.fairdatapoint.entity.schema.MetadataSchema;
import nl.dtls.fairdatapoint.service.rdf.ShaclValidator;
import nl.dtls.fairdatapoint.util.RdfIOUtil;
import org.eclipse.rdf4j.model.Model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Optional;
import java.util.Set;
Expand All @@ -44,22 +49,32 @@
@Component
public class MetadataSchemaValidator {

@Autowired
private MetadataSchemaDraftRepository metadataSchemaDraftRepository;
private static final String SHACL_SHACL_FILENAME = "shacl-shacl.ttl";

private static final Model SHACL_SHACL_DEF = loadShaclShaclDefinition();

@Autowired
private MetadataSchemaRepository metadataSchemaRepository;

@Autowired
private ResourceDefinitionRepository resourceDefinitionRepository;

@Autowired
private ShaclValidator shaclValidator;

@Autowired
private String persistentUrl;

private void validateShacl(String shaclDefinition) {
final Model data;
try {
RdfIOUtil.read(shaclDefinition, "");
data = RdfIOUtil.read(shaclDefinition, "");
}
catch (ValidationException exception) {
throw new ValidationException("Unable to read SHACL definition");
}

shaclValidator.validate(SHACL_SHACL_DEF, data, persistentUrl);
}

public void validateNotUsed(String uuid) {
Expand Down Expand Up @@ -137,4 +152,20 @@ public void validateAllExist(List<String> schemasUuids) {
throw new ValidationException(format("Metadata schemas not found: %s", missing));
}
}

private static Model loadShaclShaclDefinition() {
try {
final URL fileURL = MetadataSchemaValidator.class.getResource(SHACL_SHACL_FILENAME);
return RdfIOUtil.read(
Resources.toString(fileURL, Charsets.UTF_8),
"http://www.w3.org/ns/shacl-shacl#"
);
}
catch (IOException exception) {
throw new RuntimeException(
format("Cannot load SHACL-SHACL definition: %s",
exception.getMessage())
);
}
}
}
Loading

0 comments on commit 3b881d1

Please sign in to comment.