244 lines
10 KiB
Java
244 lines
10 KiB
Java
package eu.eudat.migration;
|
|
|
|
import eu.eudat.logic.managers.AdminManager;
|
|
import eu.eudat.logic.managers.MetricsManager;
|
|
import eu.eudat.logic.services.ApiContext;
|
|
import eu.eudat.migration.dao.TemplateRepository;
|
|
import eu.eudat.migration.entities.Question;
|
|
import eu.eudat.migration.entities.QuestionFormat;
|
|
import eu.eudat.migration.entities.Template;
|
|
import eu.eudat.migration.entities.Theme;
|
|
import eu.eudat.models.data.admin.components.datasetprofile.Field;
|
|
import eu.eudat.models.data.admin.components.datasetprofile.FieldSet;
|
|
import eu.eudat.models.data.admin.components.datasetprofile.Page;
|
|
import eu.eudat.models.data.admin.components.datasetprofile.Section;
|
|
import eu.eudat.models.data.admin.composite.DatasetProfile;
|
|
import eu.eudat.models.data.components.commons.DefaultValue;
|
|
import eu.eudat.models.data.components.commons.Multiplicity;
|
|
import eu.eudat.models.data.components.commons.ViewStyle;
|
|
import eu.eudat.models.data.components.commons.Visibility;
|
|
import eu.eudat.types.MetricNames;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.boot.CommandLineRunner;
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import javax.transaction.Transactional;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
@Component
|
|
@ConditionalOnProperty(prefix = "roadmap", name = "database.url")
|
|
public class DMPRoadmapMigration implements CommandLineRunner {
|
|
|
|
private final TemplateRepository templateRepository;
|
|
private final ApiContext apiContext;
|
|
private final MetricsManager metricsManager;
|
|
/** Profiles */
|
|
private final List<DatasetProfile> datasetProfiles = new ArrayList<>();
|
|
private final List<eu.eudat.data.entities.DatasetProfile> profiles = new ArrayList<>();
|
|
/** Metadata */
|
|
private final Map<Long, UUID> groups = new HashMap<>();
|
|
|
|
@Autowired
|
|
public DMPRoadmapMigration(TemplateRepository templateRepository, ApiContext apiContext, MetricsManager metricsManager) {
|
|
this.templateRepository = templateRepository;
|
|
this.apiContext = apiContext;
|
|
this.metricsManager = metricsManager;
|
|
}
|
|
|
|
@Override
|
|
public void run(String... args) {
|
|
List<Template> templates = templateRepository.findAll();
|
|
templates.forEach(template -> {
|
|
DatasetProfile datasetProfile = buildDatasetProfile(template);
|
|
this.datasetProfiles.add(datasetProfile);
|
|
this.createProfile(datasetProfile, template);
|
|
});
|
|
}
|
|
|
|
@Transactional
|
|
void createProfile(DatasetProfile profile, Template template) {
|
|
DatasetProfile shortenProfile = profile.toShort();
|
|
eu.eudat.data.entities.DatasetProfile datasetProfile = AdminManager.generateViewStyleDefinition(shortenProfile, this.apiContext);
|
|
if(groups.get(template.getFamilyId()) == null) {
|
|
groups.put(template.getFamilyId(), UUID.randomUUID());
|
|
}
|
|
datasetProfile.setGroupId(groups.get(template.getFamilyId()));
|
|
datasetProfile.setVersion(template.getVersion());
|
|
datasetProfile = this.apiContext.getOperationsContext().getDatabaseRepository().
|
|
getDatasetProfileDao().createOrUpdate(datasetProfile);
|
|
this.profiles.add(datasetProfile);
|
|
metricsManager.increaseValue(MetricNames.DATASET_TEMPLATE, 1, MetricsManager.datasetTemplateStatus.get(datasetProfile.getStatus()));
|
|
}
|
|
|
|
private DatasetProfile buildDatasetProfile(Template template) {
|
|
DatasetProfile datasetProfile = new DatasetProfile();
|
|
datasetProfile.setLabel(template.getTitle());
|
|
datasetProfile.setDescription(template.getDescription());
|
|
datasetProfile.setLanguage(template.getLocale());
|
|
datasetProfile.setStatus((short) 1);
|
|
datasetProfile.setVersion((short) 0);
|
|
datasetProfile.setUsers(new ArrayList<>());
|
|
this.buildPages(template, datasetProfile);
|
|
return datasetProfile;
|
|
}
|
|
|
|
private DatasetProfile buildPages(Template template, DatasetProfile datasetProfile) {
|
|
List<Page> pages = new ArrayList<>();
|
|
List<Section> sections = new ArrayList<>();
|
|
template.getPhases().forEach(phase -> {
|
|
Page page = new Page();
|
|
page.setId(String.valueOf(UUID.randomUUID()));
|
|
page.setOrdinal(Math.toIntExact(phase.getNumber()) - 1);
|
|
page.setTitle(phase.getTitle());
|
|
pages.add(page);
|
|
sections.addAll(buildSections(phase.getSections(), page.getId()));
|
|
});
|
|
datasetProfile.setPages(pages);
|
|
datasetProfile.setSections(sections);
|
|
return datasetProfile;
|
|
}
|
|
|
|
private List<Section> buildSections(List<eu.eudat.migration.entities.Section> sections, String pageId) {
|
|
return sections.stream().map(s -> {
|
|
Section section = new Section();
|
|
section.setId(String.valueOf(UUID.randomUUID()));
|
|
section.setPage(pageId);
|
|
section.setTitle(s.getTitle());
|
|
section.setDescription(s.getDescription());
|
|
section.setOrdinal(Math.toIntExact(s.getNumber()) - 1);
|
|
section.setDefaultVisibility(true);
|
|
section.setMultiplicity(false);
|
|
section.setSections(new ArrayList<>());
|
|
section.setFieldSets(buildFieldSets(s.getQuestions()));
|
|
return section;
|
|
}).collect(Collectors.toList());
|
|
}
|
|
|
|
private List<FieldSet> buildFieldSets(List<Question> questions) {
|
|
return questions.stream().map(question -> {
|
|
FieldSet fieldSet = new FieldSet();
|
|
fieldSet.setId(String.valueOf(UUID.randomUUID()));
|
|
fieldSet.setTitle(question.getText());
|
|
fieldSet.setDescription(buildDescription(question.getThemes()));
|
|
fieldSet.setOrdinal(Math.toIntExact(question.getNumber()) - 1);
|
|
fieldSet.setMultiplicity(buildMultiplicity());
|
|
fieldSet.setHasCommentField(question.getOptionCommentDisplay());
|
|
fieldSet.setFields(buildFields(question));
|
|
return fieldSet;
|
|
}).collect(Collectors.toList());
|
|
}
|
|
|
|
private String buildDescription(Set<Theme> themes) {
|
|
StringBuilder sb = new StringBuilder();
|
|
themes.forEach(theme -> {
|
|
if(theme.getTitle() != null) {
|
|
sb.append("<b>").append(theme.getTitle()).append("</b><br>");
|
|
}
|
|
if(theme.getDescription() != null) {
|
|
sb.append("<p>").append(theme.getDescription()).append("</p>");
|
|
}
|
|
if(theme.getGuidances().size() > 0) {
|
|
theme.getGuidances().forEach(guidance -> {
|
|
sb.append("<b>").append(guidance.getGuidanceGroup().getName()).append("</b><br>");
|
|
sb.append("<p>").append(guidance.getText()).append("</p>");
|
|
});
|
|
}
|
|
});
|
|
return sb.toString();
|
|
}
|
|
|
|
private Multiplicity buildMultiplicity() {
|
|
Multiplicity multiplicity = new Multiplicity();
|
|
multiplicity.setPlaceholder("");
|
|
return multiplicity;
|
|
}
|
|
|
|
private List<Field> buildFields(Question question) {
|
|
Field field = new Field();
|
|
field.setId(String.valueOf(UUID.randomUUID()));
|
|
field.setOrdinal(0);
|
|
field.setDefaultValue(buildDefaultValue(question.getDefaultValue()));
|
|
field.setValue(field.getDefaultValue().getValue());
|
|
field.setValidations(buildValidators());
|
|
field.setVisible(buildVisibility());
|
|
field.setViewStyle(buildViewStyle(question.getQuestionFormat()));
|
|
field.setData(buildData(question));
|
|
return Collections.singletonList(field);
|
|
}
|
|
|
|
private DefaultValue buildDefaultValue(String value) {
|
|
DefaultValue defaultValue = new DefaultValue();
|
|
defaultValue.setType("String");
|
|
defaultValue.setValue((value != null)?value:"");
|
|
return defaultValue;
|
|
}
|
|
|
|
private List<Integer> buildValidators() {
|
|
return Collections.singletonList((int) Field.ValidationType.REQUIRED.getValue());
|
|
}
|
|
|
|
private Visibility buildVisibility() {
|
|
Visibility visibility = new Visibility();
|
|
visibility.setRules(new ArrayList<>());
|
|
visibility.setStyle("");
|
|
return visibility;
|
|
}
|
|
|
|
private ViewStyle buildViewStyle(QuestionFormat questionFormat) {
|
|
ViewStyle viewStyle = new ViewStyle();
|
|
viewStyle.setCssClass("");
|
|
switch (questionFormat.getFormattype()) {
|
|
case TEXT_FIELD:
|
|
viewStyle.setRenderStyle("freetext");
|
|
break;
|
|
case TEXTAREA:
|
|
viewStyle.setRenderStyle("richTextarea");
|
|
break;
|
|
case CHECKBOX:
|
|
viewStyle.setRenderStyle("checkBox");
|
|
break;
|
|
case RADIOBUTTON:
|
|
viewStyle.setRenderStyle("radiobox");
|
|
break;
|
|
case DATE:
|
|
viewStyle.setRenderStyle("datePicker");
|
|
break;
|
|
case DROPDOWN:
|
|
case MULTI_SELECT:
|
|
viewStyle.setRenderStyle("combobox");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return viewStyle;
|
|
}
|
|
|
|
private Map<String, Object> buildData(Question question) {
|
|
Map<String, Object> object = new HashMap<>();
|
|
object.put("label", "");
|
|
if(question.getQuestionFormat().getOptionBased()) {
|
|
object.put("options", question.getOptions().stream().map(questionOption -> {
|
|
Map<String, Object> option = new HashMap<>();
|
|
option.put(questionOption.getText(), questionOption.getText());
|
|
return option;
|
|
}).collect(Collectors.toList()));
|
|
}
|
|
if(question.getQuestionFormat().getFormattype() == QuestionFormat.FormatType.DROPDOWN ||
|
|
question.getQuestionFormat().getFormattype() == QuestionFormat.FormatType.MULTI_SELECT) {
|
|
object.put("type", "wordlist");
|
|
object.put("multiList", question.getQuestionFormat().getFormattype() == QuestionFormat.FormatType.MULTI_SELECT);
|
|
}
|
|
return object;
|
|
}
|
|
|
|
public List<DatasetProfile> getDatesetProfiles() {
|
|
return datasetProfiles;
|
|
}
|
|
|
|
public List<eu.eudat.data.entities.DatasetProfile> getProfiles() {
|
|
return profiles;
|
|
}
|
|
}
|