file-transformer-rda-json/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/ProjectRDAMapper.java

103 lines
4.5 KiB
Java

package org.opencdmp.filetransformer.rda.model.rda.mapper;
import org.opencdmp.commonmodels.models.reference.ReferenceDefinitionModel;
import org.opencdmp.commonmodels.models.reference.ReferenceFieldModel;
import org.opencdmp.commonmodels.models.reference.ReferenceModel;
import org.opencdmp.commonmodels.models.reference.ReferenceTypeModel;
import org.opencdmp.filetransformer.rda.model.FundingModel;
import org.opencdmp.filetransformer.rda.model.ProjectModel;
import org.opencdmp.filetransformer.rda.model.rda.Funding;
import org.opencdmp.filetransformer.rda.model.rda.Project;
import org.opencdmp.filetransformer.rda.service.rdafiletransformer.RdaFileTransformerServiceProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class ProjectRDAMapper {
private final static Logger logger = LoggerFactory.getLogger(ProjectRDAMapper.class);
private final FundingRDAMapper fundingRDAMapper;
private final RdaFileTransformerServiceProperties rdaFileTransformerServiceProperties;
public ProjectRDAMapper(FundingRDAMapper fundingRDAMapper, RdaFileTransformerServiceProperties rdaFileTransformerServiceProperties) {
this.fundingRDAMapper = fundingRDAMapper;
this.rdaFileTransformerServiceProperties = rdaFileTransformerServiceProperties;
}
public Project toRDA(ProjectModel model, Map<String, Object> extraData) {
if (model == null) return null;
if (model.getProject() == null) throw new IllegalArgumentException("Project is missing");
if (model.getProject().getLabel() == null || model.getProject().getLabel().isBlank()) throw new IllegalArgumentException("Project Title is missing");
Project rda = new Project();
try {
rda.setTitle(model.getProject().getLabel());
rda.setDescription(model.getProject().getDescription());
if (model.getProject().getDefinition() != null && model.getProject().getDefinition().getFields() != null) {
String startDateString = model.getProject().getDefinition().getFields().stream().filter(field -> field.getCode().equals("startDate")).map(ReferenceFieldModel::getValue).findFirst().orElse(null);
if (startDateString != null) {
rda.setStart(startDateString);
}
String endDateString = model.getProject().getDefinition().getFields().stream().filter(field -> field.getCode().equals("endDate")).map(ReferenceFieldModel::getValue).findFirst().orElse(null);
if (endDateString != null) {
rda.setEnd(endDateString);
}
}
FundingModel fundingModel = new FundingModel();
fundingModel.setGrant(model.getGrant());
fundingModel.setFunder(model.getFunder());
rda.setFunding(List.of(fundingRDAMapper.toRDA(fundingModel)));
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
}
return rda;
}
public ProjectModel toEntity(Project rda) {
ProjectModel projectModel = new ProjectModel();
ReferenceModel project = new ReferenceModel();
project.setLabel(rda.getTitle());
project.setDescription(rda.getDescription());
ReferenceTypeModel referenceTypeModel = new ReferenceTypeModel();
referenceTypeModel.setCode(rdaFileTransformerServiceProperties.getProjectReferenceCode());
project.setType(referenceTypeModel);
ReferenceDefinitionModel projectDefinition = new ReferenceDefinitionModel();
projectDefinition.setFields(new ArrayList<>());
if (rda.getStart() != null && !rda.getStart().isEmpty()) {
ReferenceFieldModel startDateField = new ReferenceFieldModel();
startDateField.setCode("startDate");
startDateField.setValue(rda.getStart());
projectDefinition.getFields().add(startDateField);
}
if (rda.getEnd() != null && !rda.getEnd().isEmpty()) {
ReferenceFieldModel startDateField = new ReferenceFieldModel();
startDateField.setCode("endDate");
startDateField.setValue(rda.getEnd());
projectDefinition.getFields().add(startDateField);
}
project.setDefinition(projectDefinition);
projectModel.setProject(project);
List<FundingModel> fundingModels = fundingRDAMapper.toEntities(rda.getFunding());
if (fundingModels != null && !fundingModels.isEmpty()){
projectModel.setFunder(fundingModels.getFirst().getFunder()); //TODO
projectModel.setGrant(fundingModels.getFirst().getGrant());
}
return projectModel;
}
public List<ProjectModel> toEntities(List<Project> rdas) {
if (rdas == null) return null;
List<ProjectModel> items = new ArrayList<>();
for (Project rda : rdas){
ProjectModel item = this.toEntity(rda);
if (item != null) items.add(item);
}
return items;
}
}