Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

prov schema validation #4378 #4810

Merged
merged 12 commits into from
Jul 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,13 @@
<version>1.1</version>
</dependency>
<!-- END Data Deposit API v1 (SWORD v2) -->
<dependency>
<!-- There are later versions of this lib available at jitpack.io,
but it seemed better to not add another repo. -->
<groupId>org.everit.json</groupId>
<artifactId>org.everit.json.schema</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
Expand Down Expand Up @@ -452,6 +459,22 @@
</dependencies>

<build>
<!-- <testResources>
<testResource>
<directory>${project.basedir}/src/main/resources</directory>
</testResource>
</testResources>-->
<!-- <testResources>
<testResource>
<directory>${project.basedir}/src/test/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</testResource>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>-->
<resources>
<resource>
<directory>src/main/java</directory>
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/Bundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1796,8 +1796,9 @@ file.editProvenanceDialog.tip=Provenance is a record of the origin of your data
file.editProvenanceDialog.uploadSuccess=Upload complete
file.editProvenanceDialog.uploadError=An error occurred during upload and parsing of your provenance file.
file.editProvenanceDialog.noEntitiesError=The uploaded provenance file does not contain any entities that can be related to your Data File.
file.editProvenanceDialog.invalidSchemaError=The uploaded provenance file does not comply with the W3C Provenance standard.
file.editProvenanceDialog.bundleFile=Provenance File
file.editProvenanceDialog.bundleFile.instructions=File must be JSON format and follow W3C standards.
file.editProvenanceDialog.bundleFile.instructions=File must be JSON format and follow the <a href="https://www.w3.org/Submission/2013/SUBM-prov-json-20130424/" target="_blank">W3C standard</a>.
file.editProvenanceDialog.bundleFile.alreadyPublished=This Provenance File has been published and cannot be replaced or removed.
file.editProvenanceDialog.bundleEntity=Data File Entity
file.editProvenanceDialog.bundleEntity.placeholder=Connect entity...
Expand Down
1 change: 1 addition & 0 deletions src/main/java/edu/harvard/iq/dataverse/DatasetPage.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.provenance.ProvPopupFragmentBean;
import edu.harvard.iq.dataverse.api.AbstractApiBean;
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
import edu.harvard.iq.dataverse.authorization.Permission;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.ProvPopupFragmentBean.UpdatesEntry;
import edu.harvard.iq.dataverse.provenance.ProvPopupFragmentBean;
import edu.harvard.iq.dataverse.api.AbstractApiBean;
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
import edu.harvard.iq.dataverse.authorization.Permission;
Expand Down Expand Up @@ -1162,7 +1162,7 @@ public String save() {
if(systemConfig.isProvCollectionEnabled() && provJsonChanges) {
HashMap<String,ProvPopupFragmentBean.UpdatesEntry> provenanceUpdates = provPopupFragmentBean.getProvenanceUpdates();
for (int i = 0; i < dataset.getFiles().size(); i++) {
for (UpdatesEntry ue : provenanceUpdates.values()) {
for (ProvPopupFragmentBean.UpdatesEntry ue : provenanceUpdates.values()) {
if (ue.dataFile.getStorageIdentifier() != null ) {
if (ue.dataFile.getStorageIdentifier().equals(dataset.getFiles().get(i).getStorageIdentifier())) {
dataset.getFiles().set(i, ue.dataFile);
Expand Down
99 changes: 0 additions & 99 deletions src/main/java/edu/harvard/iq/dataverse/ProvUtilFragmentBean.java

This file was deleted.

12 changes: 7 additions & 5 deletions src/main/java/edu/harvard/iq/dataverse/api/Prov.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package edu.harvard.iq.dataverse.api;

import edu.harvard.iq.dataverse.DataFile;
import edu.harvard.iq.dataverse.ProvEntityFileData;
import edu.harvard.iq.dataverse.ProvUtilFragmentBean;
import edu.harvard.iq.dataverse.provenance.ProvEntityFileData;
import edu.harvard.iq.dataverse.provenance.ProvInvestigator;
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
import edu.harvard.iq.dataverse.engine.command.impl.DeleteProvJsonCommand;
import edu.harvard.iq.dataverse.engine.command.impl.GetProvFreeFormCommand;
Expand Down Expand Up @@ -35,14 +35,12 @@ public class Prov extends AbstractApiBean {

private static final Logger logger = Logger.getLogger(Prov.class.getCanonicalName());

@Inject
ProvUtilFragmentBean provUtil;
ProvInvestigator provUtil = ProvInvestigator.getInstance();

/** Provenance JSON methods **/
@POST
@Path("{id}/prov-json")
@Consumes("application/json")
//MAD: SHOULD NOT WORK ON PUBLISHED
public Response addProvJson(String body, @PathParam("id") String idSupplied, @QueryParam("entityName") String entityName) {
if(!systemConfig.isProvCollectionEnabled()) {
return error(FORBIDDEN, BundleUtil.getStringFromBundle("api.prov.error.provDisabled"));
Expand All @@ -56,6 +54,10 @@ public Response addProvJson(String body, @PathParam("id") String idSupplied, @Qu
return error(FORBIDDEN, BundleUtil.getStringFromBundle("api.prov.error.jsonUpdateNotAllowed"));
}

if(!provUtil.isProvValid(body)) {
return error(BAD_REQUEST, BundleUtil.getStringFromBundle("file.editProvenanceDialog.invalidSchemaError"));
}

/*Add when we actually integrate provCpl*/
//else if (dataFile.getProvCplId() != 0) {
// return error(METHOD_NOT_ALLOWED, "File provenance has already exists in the CPL system and cannot be uploaded.");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package edu.harvard.iq.dataverse.engine.command.impl;

import edu.harvard.iq.dataverse.DataFile;
import edu.harvard.iq.dataverse.FileMetadata;
import edu.harvard.iq.dataverse.authorization.Permission;
import edu.harvard.iq.dataverse.dataaccess.StorageIO;
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
Expand All @@ -13,12 +12,8 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.util.logging.Logger;
import javax.json.Json;
import javax.json.JsonException;
import javax.json.JsonObject;


@RequiredPermissions(Permission.EditDataset)
Expand Down Expand Up @@ -46,32 +41,9 @@ public DataFile execute(CommandContext ctxt) throws CommandException {
String error = "A valid entityName must be provided to connect the DataFile to the provenance data.";
throw new IllegalCommandException(error, this);
}

/**
* TODO: We are not yet validating the JSON received as PROV-JSON, but
* we could some day.
*
* Section "2.3 Validating PROV-JSON Documents" of the spec says, "A
* schema for PROV-JSON is provided, which defines all the valid
* PROV-JSON constructs described in this document. The schema was
* written using the schema language specified in [JSON-SCHEMA] (Version
* 4). It can be used for the purpose of validating PROV-JSON documents.
* A number of libraries for JSON schema validation are available at
* json-schema.org/implementations.html." It links to
* https://www.w3.org/Submission/prov-json/schema
*
* The below chunk just validates that the input is basic json.
*/
StringReader rdr = new StringReader(jsonInput);
try {
JsonObject jsonObj = Json.createReader(rdr).readObject();
} catch (JsonException ex) {
String error = "A valid JSON object could not be found. PROV-JSON format is expected.";
throw new IllegalCommandException(error, this);
}

// Write to StorageIO.
// "json.json" looks a little redundand but the standard is called PROV-JSON and it's nice to see .json on disk.
// "prov-json.json" looks a little redundand but the standard is called PROV-JSON and it's nice to see .json on disk.
final String provJsonExtension = "prov-json.json";
try {
StorageIO<DataFile> storageIO = dataFile.getStorageIO();
Expand All @@ -82,7 +54,6 @@ public DataFile execute(CommandContext ctxt) throws CommandException {
throw new IllegalCommandException(error, this);
}


dataFile.setProvEntityName(entityName);
if(saveContext) {
dataFile = ctxt.files().save(dataFile);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package edu.harvard.iq.dataverse;
package edu.harvard.iq.dataverse.provenance;
/**
*
* @author madunlap
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package edu.harvard.iq.dataverse;
package edu.harvard.iq.dataverse.provenance;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
Expand Down