114 lines
4.9 KiB
Java
114 lines
4.9 KiB
Java
package eu.eudat.file.transformer.model.rda.mapper;
|
|
|
|
import eu.eudat.commonmodels.models.descriptiotemplate.FieldModel;
|
|
import eu.eudat.commonmodels.models.reference.ReferenceFieldModel;
|
|
import eu.eudat.commonmodels.models.reference.ReferenceModel;
|
|
import eu.eudat.file.transformer.model.rda.Metadatum;
|
|
|
|
import eu.eudat.file.transformer.utils.string.MyStringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import java.util.*;
|
|
|
|
@Component
|
|
public class MetadataRDAMapper{
|
|
private static final Logger logger = LoggerFactory.getLogger(MetadataRDAMapper.class);
|
|
|
|
private final MetadataStandardIdRDAMapper metadataStandardIdRDAMapper;
|
|
|
|
public MetadataRDAMapper(MetadataStandardIdRDAMapper metadataStandardIdRDAMapper) {
|
|
this.metadataStandardIdRDAMapper = metadataStandardIdRDAMapper;
|
|
}
|
|
|
|
public List<Metadatum> toRDA(List<FieldModel> nodes, List<eu.eudat.commonmodels.models.description.FieldModel> valueFields) {
|
|
if (nodes == null) return null;
|
|
if (valueFields == null) throw new IllegalArgumentException("valueFields is missing");
|
|
|
|
Map<String, String> rdaMap = new HashMap<>();
|
|
List<Metadatum> rdas = new ArrayList<>();
|
|
for (FieldModel node : nodes) {
|
|
String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.metadata")).findFirst().orElse("");
|
|
eu.eudat.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null);
|
|
|
|
for (PropertyName propertyName : PropertyName.values()) {
|
|
if (rdaProperty.contains(propertyName.getName())) {
|
|
switch (propertyName) {
|
|
case METADATA_STANDARD_ID:
|
|
if (rdaValue != null && rdaValue.getReferences() != null) {
|
|
for (ReferenceModel referenceModel : rdaValue.getReferences()) { //TODO reference ??
|
|
String uri = referenceModel != null && referenceModel.getDefinition() != null && referenceModel.getDefinition().getFields() != null ? referenceModel.getDefinition().getFields().stream().filter(x-> x.getCode().equals("uri")).map(ReferenceFieldModel::getValue).findFirst().orElse(null) : null;
|
|
if (uri!= null && !uri.isBlank()) { //TODO
|
|
rdas.add(new Metadatum());
|
|
rdas.getLast().setMetadataStandardId(metadataStandardIdRDAMapper.toRDA(uri));
|
|
rdas.getLast().setDescription(referenceModel.getLabel());
|
|
rdas.getLast().setAdditionalProperty("fieldId", node.getId());
|
|
rdas.getLast().setAdditionalProperty("valueId", referenceModel.getReference());
|
|
rdaMap.put(uri, node.getNumbering());
|
|
}
|
|
}
|
|
} else if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) {
|
|
rdas.add(new Metadatum());
|
|
rdas.getLast().setMetadataStandardId(metadataStandardIdRDAMapper.toRDA(rdaValue.getTextValue()));
|
|
rdas.getLast().setAdditionalProperty("identifierId", node.getId());
|
|
rdaMap.put(rdaValue.getTextValue(), node.getNumbering());
|
|
}
|
|
break;
|
|
case DESCRIPTION:
|
|
if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) {
|
|
Metadatum rda = getRelative(rdas, rdaMap, node.getNumbering());
|
|
if (rda != null) {
|
|
rda.setDescription(rdaValue.getTextValue());
|
|
rda.setAdditionalProperty("descriptionId", node.getId());
|
|
} else {
|
|
rdas.stream().filter(rda1 -> rda1.getDescription() == null || rda1.getDescription().isEmpty()).forEach(rda1 -> rda1.setDescription(rdaValue.getTextValue()));
|
|
}
|
|
}
|
|
break;
|
|
case LANGUAGE:
|
|
if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) {
|
|
String language = rdaValue.getTextValue();
|
|
Metadatum.Language lang = Metadatum.Language.fromValue(language);
|
|
Metadatum rda = getRelative(rdas, rdaMap, node.getNumbering());
|
|
if (rda != null) {
|
|
rda.setLanguage(lang);
|
|
rda.setAdditionalProperty("languageId", node.getId());
|
|
} else {
|
|
rdas.forEach(rda1 -> rda1.setLanguage(lang));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
return rdas;
|
|
}
|
|
|
|
private static Metadatum getRelative(List<Metadatum> rdas, Map<String, String> rdaMap, String numbering) {
|
|
String target = rdaMap.entrySet().stream().filter(entry -> MyStringUtils.getFirstDifference(entry.getValue(), numbering) > 0)
|
|
.max(Comparator.comparingInt(entry -> MyStringUtils.getFirstDifference(entry.getValue(), numbering))).map(Map.Entry::getKey).orElse("");
|
|
return rdas.stream().filter(rda -> rda.getMetadataStandardId().getIdentifier().equals(target)).distinct().findFirst().orElse(null);
|
|
}
|
|
|
|
private enum PropertyName {
|
|
METADATA_STANDARD_ID("metadata_standard_id"),
|
|
DESCRIPTION("description"),
|
|
LANGUAGE("language");
|
|
|
|
private final String name;
|
|
|
|
PropertyName(String name) {
|
|
this.name = name;
|
|
}
|
|
|
|
public String getName() {
|
|
return name;
|
|
}
|
|
}
|
|
}
|