166 lines
5.8 KiB
Java
166 lines
5.8 KiB
Java
package eu.eudat.models.data.rda;
|
|
|
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import eu.eudat.data.entities.Dataset;
|
|
import eu.eudat.logic.utilities.builders.XmlBuilder;
|
|
import org.apache.commons.collections4.MultiValuedMap;
|
|
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
|
|
import org.json.JSONObject;
|
|
import org.w3c.dom.Document;
|
|
import org.w3c.dom.Node;
|
|
import org.w3c.dom.NodeList;
|
|
|
|
import javax.xml.xpath.*;
|
|
import java.util.*;
|
|
|
|
public class DatasetRDAExportModel {
|
|
|
|
private static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
|
|
|
private DatasetIdRDAExportModel dataset_id;
|
|
private String description;
|
|
private Date issued; // Created Date, could also use finalized one.
|
|
private String language;
|
|
private String title;
|
|
private String sensitive_data;
|
|
private String data_quality_assurance;
|
|
private List<DatasetMetadataRDAExportModel> metadata;
|
|
|
|
public DatasetIdRDAExportModel getDataset_id() {
|
|
return dataset_id;
|
|
}
|
|
public void setDataset_id(DatasetIdRDAExportModel dataset_id) {
|
|
this.dataset_id = dataset_id;
|
|
}
|
|
|
|
public String getDescription() {
|
|
return description;
|
|
}
|
|
public void setDescription(String description) {
|
|
this.description = description;
|
|
}
|
|
|
|
public Date getIssued() {
|
|
return issued;
|
|
}
|
|
public void setIssued(Date issued) {
|
|
this.issued = issued;
|
|
}
|
|
|
|
public String getLanguage() {
|
|
return language;
|
|
}
|
|
public void setLanguage(String language) {
|
|
this.language = language;
|
|
}
|
|
|
|
public String getTitle() {
|
|
return title;
|
|
}
|
|
public void setTitle(String title) {
|
|
this.title = title;
|
|
}
|
|
|
|
public String getSensitive_data() {
|
|
return sensitive_data;
|
|
}
|
|
public void setSensitive_data(String sensitive_data) {
|
|
this.sensitive_data = sensitive_data;
|
|
}
|
|
|
|
public String getData_quality_assurance() {
|
|
return data_quality_assurance;
|
|
}
|
|
public void setData_quality_assurance(String data_quality_assurance) {
|
|
this.data_quality_assurance = data_quality_assurance;
|
|
}
|
|
|
|
public List<DatasetMetadataRDAExportModel> getMetadata() {
|
|
return metadata;
|
|
}
|
|
public void setMetadata(List<DatasetMetadataRDAExportModel> metadata) {
|
|
this.metadata = metadata;
|
|
}
|
|
|
|
|
|
public DatasetRDAExportModel fromDataModel(Dataset dataset) {
|
|
// Parsing dataset template definition to create a map of which question of the template corresponds to the RDA common standard. Map: TemplateId -> rdaProperty
|
|
List<String> rdaPropertiesThatExistOnDatasetTemplate = xmlNodeListFromExpression(dataset.getProfile().getDefinition(), "//rdaCommonStandard/text()");
|
|
List<String> rdaProperties = new LinkedList<>();
|
|
for (String item : rdaPropertiesThatExistOnDatasetTemplate) {
|
|
item = item.replace("dataset.", "");
|
|
rdaProperties.add(item);
|
|
}
|
|
List<String> datasetTemplateIdsWithRdaProperties = xmlNodeListFromExpression(dataset.getProfile().getDefinition(), "//rdaCommonStandard/text()/ancestor::field/@id");
|
|
Map<String, String> templateIdsToRDAProperties = combineListsIntoOrderedMap(datasetTemplateIdsWithRdaProperties, rdaProperties);
|
|
|
|
// Parsing dataset answers from json to map. Map: TemplateId -> datasetValue
|
|
JSONObject jObject = new JSONObject(dataset.getProperties());
|
|
Map<String, Object> templateIdsToValues = jObject.toMap();
|
|
|
|
// Map: rdaProperty -> datasetValue
|
|
MultiValuedMap<String, String> rdaToValueMap = new ArrayListValuedHashMap<>();
|
|
for (String templateId : templateIdsToRDAProperties.keySet()) {
|
|
if (templateIdsToValues.containsKey(templateId)) {
|
|
rdaToValueMap.put(templateIdsToRDAProperties.get(templateId), templateIdsToValues.get(templateId).toString());
|
|
}
|
|
}
|
|
|
|
// Creates and fills a map to include metadata keys and values.
|
|
MultiValuedMap<String, String> metadataJsonMap = new ArrayListValuedHashMap<>();
|
|
for (String key : rdaToValueMap.keySet()) {
|
|
if (key.startsWith("metadata.")) {
|
|
metadataJsonMap.putAll(key.replace("metadata.", ""), rdaToValueMap.get(key));
|
|
}
|
|
}
|
|
// Removes metadata keys from rdaToValueMap.
|
|
for (String metadataKey : metadataJsonMap.keySet()) rdaToValueMap.remove(metadataKey);
|
|
|
|
DatasetRDAExportModel datasetRDAExportModel = mapper.convertValue(rdaToValueMap, DatasetRDAExportModel.class);
|
|
datasetRDAExportModel.setTitle(dataset.getLabel());
|
|
datasetRDAExportModel.setIssued(dataset.getCreated());
|
|
datasetRDAExportModel.setLanguage("en"); // mock data;
|
|
datasetRDAExportModel.setDataset_id(new DatasetIdRDAExportModel(dataset.getId().toString(), "argos_internal"));
|
|
|
|
List<DatasetMetadataRDAExportModel> datasetMetadataRDAExportModels = new LinkedList<>();
|
|
for (String key : metadataJsonMap.keySet()) {
|
|
for (String value : metadataJsonMap.get(key)) {
|
|
datasetMetadataRDAExportModels.add(new DatasetMetadataRDAExportModel().fromDataModel(key,value));
|
|
}
|
|
}
|
|
datasetRDAExportModel.setMetadata(datasetMetadataRDAExportModels);
|
|
|
|
return datasetRDAExportModel;
|
|
}
|
|
|
|
private List<String> xmlNodeListFromExpression(String xml, String expression) {
|
|
List<String> valuesList = new LinkedList<>();
|
|
Document document = XmlBuilder.fromXml(xml);
|
|
XPathFactory xpathFactory = XPathFactory.newInstance();
|
|
XPath xpath = xpathFactory.newXPath();
|
|
try {
|
|
XPathExpression expr = xpath.compile(expression);
|
|
NodeList nodeList = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
|
|
for (int i = 0; i < nodeList.getLength(); i++) {
|
|
Node node = nodeList.item(i);
|
|
valuesList.add(node.getNodeValue());
|
|
}
|
|
} catch (XPathExpressionException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
return valuesList;
|
|
}
|
|
|
|
private Map<String,String> combineListsIntoOrderedMap (List<String> keys, List<String> values) {
|
|
if (keys.size() != values.size())
|
|
throw new IllegalArgumentException ("Cannot combine lists with dissimilar sizes");
|
|
Map<String,String> map = new LinkedHashMap<>();
|
|
for (int i=0; i<keys.size(); i++) {
|
|
map.put(keys.get(i), values.get(i));
|
|
}
|
|
return map;
|
|
}
|
|
}
|