Adds backend validation on Dataset finalization. (Issue #131)
This commit is contained in:
parent
df50a4ee60
commit
281080e8e2
|
@ -41,11 +41,19 @@ import org.springframework.stereotype.Component;
|
|||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import javax.activation.MimetypesFileTypeMap;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.xpath.XPath;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
import java.io.*;
|
||||
import java.math.BigInteger;
|
||||
import java.net.URL;
|
||||
|
@ -322,6 +330,8 @@ public class DatasetManager {
|
|||
eu.eudat.data.entities.Dataset dataset = datasetWizardModel.toDataModel();
|
||||
dataset.setDmp(dmp);
|
||||
propertiesModelToString(datasetWizardModel, dataset);
|
||||
if (datasetWizardModel.getStatus() == (int) Dataset.Status.FINALISED.getValue())
|
||||
checkDatasetValidation(dataset);
|
||||
UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build();
|
||||
dataset.setCreator(userInfo);
|
||||
updateTags(apiContext.getOperationsContext().getDatasetRepository(), datasetWizardModel);
|
||||
|
@ -332,6 +342,30 @@ public class DatasetManager {
|
|||
return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset);
|
||||
}
|
||||
|
||||
private void checkDatasetValidation(Dataset dataset) throws Exception {
|
||||
List<String> datasetProfileValidators = new LinkedList<>();
|
||||
DatasetProfile profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(dataset.getProfile().getId());
|
||||
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder = builderFactory.newDocumentBuilder();
|
||||
Document xmlDocument = builder.parse(new ByteArrayInputStream(profile.getDefinition().getBytes()));
|
||||
|
||||
XPath xPath = XPathFactory.newInstance().newXPath();
|
||||
String expression = "//validation/@type[.=1]/ancestor::field/@id";
|
||||
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
|
||||
|
||||
for (int i = 0; i < nodeList.getLength(); i++) {
|
||||
Node node = nodeList.item(i);
|
||||
datasetProfileValidators.add(node.getNodeValue());
|
||||
}
|
||||
|
||||
JSONObject obj = new JSONObject(dataset.getProperties());
|
||||
for (String validator : datasetProfileValidators) {
|
||||
if (obj.getString(validator) == null || obj.getString(validator).trim().isEmpty()) {
|
||||
throw new Exception("Field value of " + validator + " must be filled.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void propertiesModelToString(DatasetWizardModel datasetWizardModel, eu.eudat.data.entities.Dataset dataset) {
|
||||
Map<String, Object> values = new HashMap();
|
||||
PagedDatasetProfile properties = datasetWizardModel.getDatasetProfileDefinition();
|
||||
|
|
Loading…
Reference in New Issue