645 lines
32 KiB
Java
645 lines
32 KiB
Java
package eu.old.eudat.migration;
|
|
|
|
import com.fasterxml.jackson.annotation.JsonValue;
|
|
import eu.eudat.commons.XmlHandlingService;
|
|
import eu.eudat.commons.enums.*;
|
|
import eu.eudat.commons.types.descriptiontemplate.*;
|
|
import eu.eudat.commons.types.descriptiontemplate.fielddata.*;
|
|
import eu.eudat.commons.types.externalfetcher.*;
|
|
import eu.eudat.commons.types.referencetype.*;
|
|
import eu.eudat.convention.ConventionService;
|
|
import eu.eudat.data.DescriptionTemplateEntity;
|
|
import eu.eudat.data.ReferenceEntity;
|
|
import eu.eudat.data.ReferenceTypeEntity;
|
|
import eu.eudat.data.converters.enums.DatabaseEnum;
|
|
import eu.eudat.model.DescriptionTemplate;
|
|
import eu.eudat.query.DescriptionTemplateQuery;
|
|
import eu.old.eudat.logic.utilities.builders.XmlBuilder;
|
|
import eu.old.eudat.models.data.components.commons.Multiplicity;
|
|
import eu.old.eudat.models.data.components.commons.Rule;
|
|
import eu.old.eudat.models.data.components.commons.datafield.*;
|
|
import eu.old.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.*;
|
|
import gr.cite.tools.data.query.Ordering;
|
|
import gr.cite.tools.data.query.Paging;
|
|
import gr.cite.tools.data.query.QueryFactory;
|
|
import gr.cite.tools.exception.MyApplicationException;
|
|
import gr.cite.tools.logging.LoggerService;
|
|
import jakarta.persistence.EntityManager;
|
|
import jakarta.xml.bind.JAXBException;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.http.MediaType;
|
|
import org.springframework.stereotype.Service;
|
|
import org.w3c.dom.Document;
|
|
import org.xml.sax.SAXException;
|
|
|
|
import javax.management.InvalidApplicationException;
|
|
import javax.xml.parsers.ParserConfigurationException;
|
|
import javax.xml.transform.TransformerException;
|
|
import java.io.IOException;
|
|
import java.net.URI;
|
|
import java.net.URISyntaxException;
|
|
import java.time.Instant;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
|
|
@Service
|
|
public class DescriptionTemplateXmlMigrationService {
|
|
|
|
private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DescriptionTemplateXmlMigrationService.class));
|
|
private final EntityManager entityManager;
|
|
private final ConventionService conventionService;
|
|
private final XmlHandlingService xmlHandlingService;
|
|
private final QueryFactory queryFactory;
|
|
|
|
private static final int PageSize = 500;
|
|
private static final boolean TestMode = false;
|
|
|
|
public DescriptionTemplateXmlMigrationService(EntityManager entityManager, ConventionService conventionService, XmlHandlingService xmlHandlingService, QueryFactory queryFactory) {
|
|
this.entityManager = entityManager;
|
|
this.conventionService = conventionService;
|
|
this.xmlHandlingService = xmlHandlingService;
|
|
this.queryFactory = queryFactory;
|
|
}
|
|
|
|
public void migrate() throws IOException, NoSuchFieldException, IllegalAccessException, JAXBException, ParserConfigurationException, InstantiationException, SAXException, InvalidApplicationException, TransformerException, URISyntaxException {
|
|
long total = this.queryFactory.query(DescriptionTemplateQuery.class).count();
|
|
logger.debug("Migrate DescriptionTemplate Total : " + total);
|
|
int page = 0;
|
|
|
|
Map<String, ReferenceTypeEntity> referenceTypeEntityMap = new HashMap<>();
|
|
List<DescriptionTemplateEntity> items;
|
|
do {
|
|
DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class);
|
|
query.setOrder(new Ordering().addDescending(DescriptionTemplate._createdAt));
|
|
query.setPage(new Paging(page * PageSize, PageSize));
|
|
items = query.collect();
|
|
if (items != null && !items.isEmpty()) {
|
|
|
|
logger.debug("Migrate DescriptionTemplate " + page * PageSize + " of " + total);
|
|
|
|
for (DescriptionTemplateEntity item : items) {
|
|
if (this.conventionService.isNullOrEmpty(item.getDefinition())) continue;
|
|
Document document = XmlBuilder.fromXml(item.getDefinition());
|
|
if (document == null){
|
|
logger.error("Migrate DescriptionTemplate " + item.getId() + " failed read xml");
|
|
throw new MyApplicationException("Migrate DescriptionTemplate " + item.getId() + " failed read xml");
|
|
}
|
|
ViewStyleModel viewStyleModel = null;
|
|
try {
|
|
viewStyleModel = new ViewStyleModel().fromXml(document.getDocumentElement());
|
|
} catch (Exception ex){
|
|
logger.error("Migrate DescriptionTemplate " + item.getId() + " failed read xml");
|
|
throw new MyApplicationException("Migrate DescriptionTemplate " + item.getId() + " failed read xml");
|
|
}
|
|
item.setDefinition(this.xmlHandlingService.toXml(this.buildDefinitionEntity(viewStyleModel, referenceTypeEntityMap)));
|
|
this.entityManager.merge(item);
|
|
}
|
|
|
|
this.entityManager.flush();
|
|
page++;
|
|
}
|
|
} while (items != null && !items.isEmpty() && !TestMode);
|
|
|
|
logger.debug("Migrate DescriptionTemplate ReferenceTypes : " + referenceTypeEntityMap.size());
|
|
for (ReferenceTypeEntity item : referenceTypeEntityMap.values()){
|
|
this.entityManager.persist(item);
|
|
}
|
|
this.entityManager.flush();
|
|
}
|
|
|
|
private @NotNull DefinitionEntity buildDefinitionEntity(ViewStyleModel persist, Map<String, ReferenceTypeEntity> referenceTypeEntityMap) throws URISyntaxException {
|
|
DefinitionEntity data = new DefinitionEntity();
|
|
if (persist == null)
|
|
return data;
|
|
if (!this.conventionService.isListNullOrEmpty(persist.getPages())) {
|
|
data.setPages(new ArrayList<>());
|
|
for (Page pagePersist : persist.getPages()) {
|
|
data.getPages().add(this.buildPageEntity(pagePersist, persist.getSections(), referenceTypeEntityMap));
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
private @NotNull SectionEntity buildSectionEntity(Section persist, Map<String, ReferenceTypeEntity> referenceTypeEntityMap) throws URISyntaxException {
|
|
SectionEntity data = new SectionEntity();
|
|
if (persist == null)
|
|
return data;
|
|
|
|
data.setId(persist.getId());
|
|
data.setDescription(persist.getDescription());
|
|
data.setExtendedDescription(persist.getExtendedDescription());
|
|
data.setNumbering(persist.getNumbering());
|
|
data.setOrdinal(persist.getOrdinal());
|
|
data.setDefaultVisibility(persist.isDefaultVisibility());
|
|
data.setMultiplicity(persist.getMultiplicity());
|
|
data.setTitle(persist.getTitle());
|
|
|
|
if (!this.conventionService.isListNullOrEmpty(persist.getSections())) {
|
|
data.setSections(new ArrayList<>());
|
|
for (Section sectionPersist : persist.getSections()) {
|
|
data.getSections().add(this.buildSectionEntity(sectionPersist, referenceTypeEntityMap));
|
|
}
|
|
}
|
|
|
|
if (!this.conventionService.isListNullOrEmpty(persist.getFieldSets())) {
|
|
data.setFieldSets(new ArrayList<>());
|
|
for (FieldSet fieldSetPersist : persist.getFieldSets()) {
|
|
data.getFieldSets().add(this.buildFieldSetEntity(fieldSetPersist, referenceTypeEntityMap));
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
private @NotNull FieldSetEntity buildFieldSetEntity(FieldSet persist, Map<String, ReferenceTypeEntity> referenceTypeEntityMap) throws URISyntaxException {
|
|
FieldSetEntity data = new FieldSetEntity();
|
|
if (persist == null)
|
|
return data;
|
|
|
|
data.setId(persist.getId());
|
|
data.setOrdinal(persist.getOrdinal());
|
|
data.setNumbering(persist.getNumbering());
|
|
data.setTitle(persist.getTitle());
|
|
data.setExtendedDescription(persist.getExtendedDescription());
|
|
data.setAdditionalInformation(persist.getAdditionalInformation());
|
|
data.setHasCommentField(persist.getHasCommentField());
|
|
if (persist.getMultiplicity() != null) data.setMultiplicity(this.buildMultiplicityEntity(persist.getMultiplicity()));
|
|
|
|
if (!this.conventionService.isListNullOrEmpty(persist.getFields())) {
|
|
data.setFields(new ArrayList<>());
|
|
for (Field fieldPersist : persist.getFields()) {
|
|
data.getFields().add(this.buildFieldEntity(fieldPersist, referenceTypeEntityMap));
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
private @NotNull FieldEntity buildFieldEntity(Field persist, Map<String, ReferenceTypeEntity> referenceTypeEntityMap) throws URISyntaxException {
|
|
FieldEntity data = new FieldEntity();
|
|
if (persist == null)
|
|
return data;
|
|
|
|
data.setId(persist.getId());
|
|
data.setOrdinal(persist.getOrdinal());
|
|
data.setSchematics(persist.getSchematics());
|
|
data.setNumbering(persist.getNumbering());
|
|
if (persist.getDefaultValue() != null) data.setDefaultValue(persist.getDefaultValue().getValue());
|
|
if (persist.getValidations() != null) data.setValidations(persist.getValidations().stream().map(x-> {
|
|
switch (x){
|
|
case NONE -> {
|
|
return FieldValidationType.None;
|
|
}
|
|
case REQUIRED -> {
|
|
return FieldValidationType.Required;
|
|
}
|
|
case URL -> {
|
|
return FieldValidationType.Url;
|
|
}
|
|
default -> throw new MyApplicationException("Invalid type " + x);
|
|
}
|
|
|
|
}).toList());
|
|
data.setIncludeInExport(persist.getExport());
|
|
if (persist.getData() != null) {
|
|
data.setData(this.buildFieldDataEntity(persist.getData(), persist.getViewStyle().getRenderStyle(), referenceTypeEntityMap));
|
|
if (persist.getViewStyle().getRenderStyle().equals("externalDatasets")){
|
|
FieldDataExternalDatasetType type = null;
|
|
try {
|
|
type = FieldDataExternalDatasetType.of(((ExternalDatasetsData)persist.getData()).getType());
|
|
} catch (Exception e) { type = FieldDataExternalDatasetType.Other; }
|
|
if (type == null) type = FieldDataExternalDatasetType.Other;
|
|
if (data.getSchematics() == null) data.setSchematics(new ArrayList<>());
|
|
switch (type){
|
|
case Other -> data.getSchematics().add("referencetype.externaldataset.type.other");
|
|
case ProducedDataset -> data.getSchematics().add("referencetype.externaldataset.type.produced");
|
|
case ReusedDataset -> data.getSchematics().add("referencetype.externaldataset.type.reused");
|
|
default -> throw new MyApplicationException("Invalid type " + type);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (persist.getVisible() != null && !this.conventionService.isListNullOrEmpty(persist.getVisible().getRules())) {
|
|
data.setVisibilityRules(new ArrayList<>());
|
|
for (Rule fieldPersist : persist.getVisible().getRules()) {
|
|
data.getVisibilityRules().add(this.buildRuleEntity(fieldPersist));
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
private BaseFieldDataEntity buildFieldDataEntity(FieldData<?> persist, String renderStyle, Map<String, ReferenceTypeEntity> referenceTypeEntityMap) throws URISyntaxException {
|
|
if (renderStyle.equals("checkBox")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.CHECK_BOX);
|
|
}
|
|
if (renderStyle.equals("validation")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.VALIDATION);
|
|
}
|
|
if (renderStyle.equals("textarea")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.TEXT_AREA);
|
|
}
|
|
if (renderStyle.equals("tags")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.TAGS);
|
|
}
|
|
if (renderStyle.equals("richTextarea")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.RICH_TEXT_AREA);
|
|
}
|
|
if (renderStyle.equals("freetext")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.FREE_TEXT);
|
|
}
|
|
if (renderStyle.equals("datePicker")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.DATE_PICKER);
|
|
}
|
|
if (renderStyle.equals("datasetIdentifier")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.DATASET_IDENTIFIER);
|
|
}
|
|
if (renderStyle.equals("currency")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.CURRENCY);
|
|
}
|
|
if (renderStyle.equals("taxonomies")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((TaxonomiesData)persist).getMultiAutoComplete(), ReferenceTypeIds.Taxonomy);
|
|
}
|
|
if (renderStyle.equals("services")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((ServicesData)persist).getMultiAutoComplete(),ReferenceTypeIds.Services);
|
|
}
|
|
if (renderStyle.equals("researchers")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((ResearcherData)persist).getMultiAutoComplete(),ReferenceTypeIds.Researcher);
|
|
}
|
|
if (renderStyle.equals("registries")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((RegistriesData)persist).getMultiAutoComplete(),ReferenceTypeIds.Registries);
|
|
}
|
|
if (renderStyle.equals("pubRepositories")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((DataRepositoriesData)persist).getMultiAutoComplete(),ReferenceTypeIds.PubRepositories);
|
|
}
|
|
if (renderStyle.equals("publications")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((PublicationsData)persist).getMultiAutoComplete(), ReferenceTypeIds.Publication);
|
|
}
|
|
if (renderStyle.equals("organizations")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((OrganizationsData)persist).getMultiAutoComplete(), ReferenceTypeIds.Organizations);
|
|
}
|
|
if (renderStyle.equals("licenses")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((LicensesData)persist).getMultiAutoComplete(), ReferenceTypeIds.License);
|
|
}
|
|
if (renderStyle.equals("journalRepositories")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((DataRepositoriesData)persist).getMultiAutoComplete(), ReferenceTypeIds.Journal);
|
|
}
|
|
if (renderStyle.equals("dataRepositories")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((DataRepositoriesData)persist).getMultiAutoComplete(), ReferenceTypeIds.DataRepositories);
|
|
}
|
|
if (renderStyle.equals("booleanDecision")){
|
|
return this.buildLabelDataEntity(persist.getLabel(), FieldType.BOOLEAN_DECISION);
|
|
}
|
|
if (renderStyle.equals("internalDmpEntities")){
|
|
switch (((InternalDmpEntitiesData<?>)persist).getType()){
|
|
case "dmps":
|
|
return this.buildLabelAndMultiplicityDataEntity(persist.getLabel(), ((DMPsAutoCompleteData)persist).getMultiAutoComplete(),FieldType.INTERNAL_ENTRIES_DMPS);
|
|
case "datasets":
|
|
return this.buildLabelAndMultiplicityDataEntity(persist.getLabel(), ((DatasetsAutoCompleteData)persist).getMultiAutoComplete(),FieldType.INTERNAL_ENTRIES_DESCRIPTIONS);
|
|
case "researchers":
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((ResearchersAutoCompleteData)persist).getMultiAutoComplete(), ReferenceTypeIds.Researcher);
|
|
}
|
|
}
|
|
|
|
if (renderStyle.equals("externalDatasets")){
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((ExternalDatasetsData)persist).getMultiAutoComplete(), ReferenceTypeIds.Datasets);
|
|
}
|
|
|
|
|
|
|
|
if (renderStyle.equals("upload")){
|
|
UploadDataEntity data = new UploadDataEntity();
|
|
data.setLabel(persist.getLabel());
|
|
data.setMaxFileSizeInMB(((UploadData)persist).getMaxFileSizeInMB());
|
|
data.setTypes(new ArrayList<>());
|
|
if (((UploadData)persist).getTypes() != null){
|
|
for (UploadData.Option option : ((UploadData)persist).getTypes()){
|
|
UploadDataEntity.UploadDataOptionEntity optionEntity =new UploadDataEntity.UploadDataOptionEntity();
|
|
optionEntity.setValue(option.getValue());
|
|
optionEntity.setLabel(option.getLabel());
|
|
data.getTypes().add(optionEntity);
|
|
}
|
|
}
|
|
data.setFieldType(FieldType.UPLOAD);
|
|
return data;
|
|
}
|
|
|
|
if (renderStyle.equals("radiobox")){
|
|
RadioBoxDataEntity data = new RadioBoxDataEntity();
|
|
data.setLabel(persist.getLabel());
|
|
data.setOptions(new ArrayList<>());
|
|
if (((RadioBoxData)persist).getOptions() != null){
|
|
for (RadioBoxData.Option option : ((RadioBoxData)persist).getOptions()){
|
|
RadioBoxDataEntity.RadioBoxDataOptionEntity optionEntity = new RadioBoxDataEntity.RadioBoxDataOptionEntity();
|
|
optionEntity.setValue(option.getValue());
|
|
optionEntity.setLabel(option.getLabel());
|
|
data.getOptions().add(optionEntity);
|
|
}
|
|
}
|
|
data.setFieldType(FieldType.RADIO_BOX);
|
|
return data;
|
|
}
|
|
|
|
if (renderStyle.equals("combobox")){
|
|
switch (((ComboBoxData<?>)persist).getType()){
|
|
case "wordlist":{
|
|
SelectDataEntity data = new SelectDataEntity();
|
|
data.setLabel(persist.getLabel());
|
|
data.setOptions(new ArrayList<>());
|
|
data.setMultipleSelect(((WordListData)persist).getMultiList());
|
|
if (((WordListData)persist).getOptions() != null){
|
|
for (ComboBoxData.Option option : ((WordListData)persist).getOptions()){
|
|
SelectDataEntity.OptionEntity optionEntity = new SelectDataEntity.OptionEntity();
|
|
optionEntity.setValue(option.getValue());
|
|
optionEntity.setLabel(option.getLabel());
|
|
data.getOptions().add(optionEntity);
|
|
}
|
|
}
|
|
data.setFieldType(FieldType.SELECT);
|
|
return data;
|
|
}
|
|
case "autocomplete":{
|
|
ReferenceTypeEntity referenceType = this.resolveReferenceTypeEntityAutoCompleteData(((AutoCompleteData)persist), referenceTypeEntityMap);
|
|
return this.buildReferenceTypeDataEntity(persist.getLabel(), ((AutoCompleteData)persist).getMultiAutoComplete(), referenceType.getId());
|
|
}
|
|
}
|
|
}
|
|
throw new MyApplicationException("Can transform field data" + renderStyle);
|
|
}
|
|
|
|
private BaseFieldDataEntity buildLabelDataEntity(String label, FieldType fieldType) {
|
|
LabelDataEntity data = new LabelDataEntity();
|
|
data.setLabel(label);
|
|
data.setFieldType(fieldType);
|
|
return data;
|
|
}
|
|
|
|
private BaseFieldDataEntity buildLabelAndMultiplicityDataEntity(String label, Boolean multiAutoComplete, FieldType fieldType) {
|
|
LabelAndMultiplicityDataEntity data = new LabelAndMultiplicityDataEntity();
|
|
data.setLabel(label);
|
|
data.setFieldType(fieldType);
|
|
data.setMultipleSelect(multiAutoComplete);
|
|
return data;
|
|
}
|
|
|
|
private BaseFieldDataEntity buildReferenceTypeDataEntity(String label, Boolean multiAutoComplete, UUID referenceTypeId) {
|
|
ReferenceTypeDataEntity data = new ReferenceTypeDataEntity();
|
|
data.setLabel(label);
|
|
data.setFieldType(FieldType.REFERENCE_TYPES);
|
|
data.setMultipleSelect(multiAutoComplete);
|
|
data.setReferenceTypeId(referenceTypeId);
|
|
return data;
|
|
}
|
|
|
|
|
|
private @NotNull RuleEntity buildRuleEntity(Rule persist) {
|
|
RuleEntity data = new RuleEntity();
|
|
if (persist == null)
|
|
return data;
|
|
|
|
data.setTarget(persist.getTarget());
|
|
data.setValue(persist.getValue());
|
|
return data;
|
|
}
|
|
private @NotNull MultiplicityEntity buildMultiplicityEntity(Multiplicity persist) {
|
|
MultiplicityEntity data = new MultiplicityEntity();
|
|
if (persist == null)
|
|
return data;
|
|
|
|
data.setMax(persist.getMax());
|
|
data.setMin(persist.getMin());
|
|
data.setPlaceholder(persist.getPlaceholder());
|
|
data.setTableView(persist.getTableView());
|
|
return data;
|
|
}
|
|
|
|
|
|
|
|
private @NotNull PageEntity buildPageEntity(Page persist, List<Section> allSections, Map<String, ReferenceTypeEntity> referenceTypeEntityMap) throws URISyntaxException {
|
|
PageEntity data = new PageEntity();
|
|
if (persist == null)
|
|
return data;
|
|
|
|
data.setId(persist.getId());
|
|
data.setOrdinal(persist.getOrdinal());
|
|
data.setTitle(persist.getTitle());
|
|
|
|
List<Section> sections = allSections.stream().filter(x-> this.isInPage(x, persist)).toList();
|
|
if (!this.conventionService.isListNullOrEmpty(sections)) {
|
|
data.setSections(new ArrayList<>());
|
|
for (Section sectionPersist : sections) {
|
|
data.getSections().add(this.buildSectionEntity(sectionPersist, referenceTypeEntityMap));
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
private boolean isInPage(Section section, Page page){
|
|
try {
|
|
return UUID.fromString(section.getPage()).equals(UUID.fromString(page.getId()));
|
|
} catch (Exception e){
|
|
if (section.getPage().toLowerCase(Locale.ROOT).equals(page.getId().toLowerCase(Locale.ROOT))) return true;
|
|
try {
|
|
return Integer.parseInt(section.getPage().replace("page_", "")) == page.getOrdinal();
|
|
} catch (Exception e1){
|
|
return section.getPage().toLowerCase(Locale.ROOT).equals(page.getId().toLowerCase(Locale.ROOT));
|
|
}
|
|
}
|
|
}
|
|
|
|
public ReferenceTypeEntity resolveReferenceTypeEntityAutoCompleteData(AutoCompleteData persist, Map<String, ReferenceTypeEntity> referenceTypeEntityMap) throws URISyntaxException {
|
|
ReferenceTypeDefinitionEntity definitionEntity = this.buildReferenceTypeDefinitionEntity(persist);
|
|
String hash = this.referenceTypeCalculatedHash(definitionEntity);
|
|
ReferenceTypeEntity data = referenceTypeEntityMap.getOrDefault(hash, null);
|
|
if (data == null) {
|
|
data = new ReferenceTypeEntity();
|
|
data.setId(UUID.randomUUID());
|
|
data.setIsActive(IsActive.Active);
|
|
data.setCreatedAt(Instant.now());
|
|
data.setName(persist.getLabel().substring(0, Math.min(persist.getLabel().length(), 199)));
|
|
data.setCode(persist.getLabel().substring(0, Math.min(persist.getLabel().length(), 99)));
|
|
data.setDefinition(this.xmlHandlingService.toXmlSafe(definitionEntity));
|
|
data.setUpdatedAt(Instant.now());
|
|
referenceTypeEntityMap.put(hash, data);
|
|
}
|
|
return data;
|
|
}
|
|
|
|
public String referenceTypeCalculatedHash(ReferenceTypeDefinitionEntity definitionEntity) {
|
|
List<String> sourceKeys = new ArrayList<>();
|
|
if (definitionEntity.getSources() != null){
|
|
for (ExternalFetcherApiSourceConfigurationEntity source : definitionEntity.getSources().stream().map(x-> (ExternalFetcherApiSourceConfigurationEntity)x).toList()){
|
|
StringBuilder sourceStringBuilder = new StringBuilder();
|
|
sourceStringBuilder.append(source.getUrl());
|
|
sourceStringBuilder.append(source.getHttpMethod().getValue().toString());
|
|
sourceStringBuilder.append(source.getKey());
|
|
if (source.getResults() != null){
|
|
sourceStringBuilder.append(source.getResults().getResultsArrayPath());
|
|
if (source.getResults().getFieldsMapping() != null) {
|
|
sourceStringBuilder.append(source.getResults().getFieldsMapping().stream().filter(x-> x.getCode().equals(ReferenceEntity.KnownFields.ReferenceId)).map(ResultFieldsMappingConfigurationEntity::getResponsePath).findFirst().orElse(""));
|
|
sourceStringBuilder.append(source.getResults().getFieldsMapping().stream().filter(x-> x.getCode().equals(ReferenceEntity.KnownFields.Label)).map(ResultFieldsMappingConfigurationEntity::getResponsePath).findFirst().orElse(""));
|
|
}
|
|
}
|
|
sourceKeys.add(sourceStringBuilder.toString().toLowerCase(Locale.ROOT));
|
|
}
|
|
}
|
|
return sourceKeys.stream().sorted().collect(Collectors.joining(""));
|
|
}
|
|
|
|
private @NotNull ReferenceTypeDefinitionEntity buildReferenceTypeDefinitionEntity(AutoCompleteData persist) throws URISyntaxException {
|
|
ReferenceTypeDefinitionEntity data = new ReferenceTypeDefinitionEntity();
|
|
if (persist == null) return data;
|
|
data.setFields(new ArrayList<>());
|
|
|
|
if (!this.conventionService.isListNullOrEmpty(persist.getAutoCompleteSingleDataList())){
|
|
data.setSources(new ArrayList<>());
|
|
int ordinal = 0;
|
|
for (AutoCompleteData.AutoCompleteSingleData sourceBaseConfigPersist: persist.getAutoCompleteSingleDataList()) {
|
|
data.getSources().add(this.buildSourceBaseConfigEntity(sourceBaseConfigPersist, ordinal));
|
|
ordinal++;
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
private @NotNull ExternalFetcherApiSourceConfigurationEntity buildSourceBaseConfigEntity(AutoCompleteData.AutoCompleteSingleData persist, int ordinal) throws URISyntaxException {
|
|
if (persist == null) return new ExternalFetcherApiSourceConfigurationEntity();
|
|
|
|
ExternalFetcherApiSourceConfigurationEntity apiEntity = new ExternalFetcherApiSourceConfigurationEntity();
|
|
|
|
URI uri;
|
|
if (persist.getUrl().contains("?")) {
|
|
uri = new URI(persist.getUrl().substring(0, persist.getUrl().trim().lastIndexOf("?")));
|
|
} else {
|
|
uri = new URI(persist.getUrl().trim());
|
|
}
|
|
String source = persist.getAutoCompleteOptions().getSource();
|
|
source = source != null && !source.isEmpty() ? source : uri.getHost();
|
|
|
|
String parsedUrl = persist.getUrl().trim();
|
|
parsedUrl = parsedUrl.replace("%20", " ");
|
|
parsedUrl = parsedUrl.replace("%22", "\"");
|
|
while (parsedUrl.contains("&")) {
|
|
parsedUrl = parsedUrl.replace("&", "&");
|
|
}
|
|
|
|
apiEntity.setUrl(parsedUrl);
|
|
apiEntity.setResults(this.buildResultsConfigEntity(persist));
|
|
|
|
apiEntity.setPaginationPath(null);
|
|
apiEntity.setContentType(MediaType.APPLICATION_JSON_VALUE);
|
|
apiEntity.setFirstPage("1");
|
|
apiEntity.setHttpMethod(this.toReferenceTypeExternalApiHTTPMethodType(persist.getMethod()));
|
|
apiEntity.setRequestBody(null);
|
|
apiEntity.setFilterType(null);
|
|
if (persist.getHasAuth() && persist.getAuth() != null) {
|
|
apiEntity.setAuth(this.buildAuthConfigEntity(persist.getAuth()));
|
|
}
|
|
apiEntity.setQueries(new ArrayList<>());
|
|
apiEntity.getQueries().add(this.buildQueryConfigEntity(parsedUrl));
|
|
|
|
apiEntity.setType(ExternalFetcherSourceType.API);
|
|
apiEntity.setKey(source);
|
|
apiEntity.setLabel(source);
|
|
apiEntity.setOrdinal(ordinal);
|
|
apiEntity.setReferenceTypeDependencyIds(null);
|
|
|
|
return apiEntity;
|
|
}
|
|
|
|
private @NotNull ResultsConfigurationEntity buildResultsConfigEntity(AutoCompleteData.AutoCompleteSingleData persist){
|
|
ResultsConfigurationEntity data = new ResultsConfigurationEntity();
|
|
|
|
|
|
data.setResultsArrayPath(persist.getOptionsRoot());
|
|
if (persist.getAutoCompleteOptions() == null && this.conventionService.isNullOrEmpty(persist.getAutoCompleteOptions().getLabel())) {
|
|
data.setFieldsMapping(new ArrayList<>());
|
|
ResultFieldsMappingConfigurationEntity labelField = new ResultFieldsMappingConfigurationEntity();
|
|
labelField.setCode(ReferenceEntity.KnownFields.Label);
|
|
labelField.setResponsePath(persist.getAutoCompleteOptions().getLabel());
|
|
data.getFieldsMapping().add(labelField);
|
|
}
|
|
if (persist.getAutoCompleteOptions() == null && this.conventionService.isNullOrEmpty(persist.getAutoCompleteOptions().getValue())) {
|
|
ResultFieldsMappingConfigurationEntity idField = new ResultFieldsMappingConfigurationEntity();
|
|
idField.setCode(ReferenceEntity.KnownFields.ReferenceId);
|
|
idField.setResponsePath(persist.getAutoCompleteOptions().getValue());
|
|
data.getFieldsMapping().add(idField);
|
|
}
|
|
return data;
|
|
}
|
|
|
|
private @NotNull QueryConfigEntity buildQueryConfigEntity(String path){
|
|
QueryConfigEntity data = new QueryConfigEntity();
|
|
|
|
data.setName("like");
|
|
if ((path.toLowerCase(Locale.ROOT).trim().contains("openaire") || path.toLowerCase(Locale.ROOT).trim().contains("orcid")
|
|
|| path.toLowerCase(Locale.ROOT).trim().contains("ror") || path.toLowerCase(Locale.ROOT).trim().contains("fairsharing"))) {
|
|
data.setDefaultValue("*");
|
|
} else {
|
|
data.setDefaultValue("");
|
|
}
|
|
data.setCases(new ArrayList<>());
|
|
QueryCaseConfigEntity caseConfig = new QueryCaseConfigEntity();
|
|
caseConfig.setReferenceTypeId(null);
|
|
caseConfig.setReferenceTypeSourceKey(null);
|
|
caseConfig.setSeparator(null);
|
|
caseConfig.setValue("{like}");
|
|
caseConfig.setLikePattern(null);
|
|
data.getCases().add(caseConfig);
|
|
|
|
return data;
|
|
}
|
|
|
|
private @NotNull AuthenticationConfigurationEntity buildAuthConfigEntity(AutoCompleteData.AuthAutoCompleteData persist){
|
|
AuthenticationConfigurationEntity data = new AuthenticationConfigurationEntity();
|
|
if (persist == null) return data;
|
|
|
|
data.setEnabled(true);
|
|
data.setAuthUrl(persist.getUrl());
|
|
data.setAuthMethod(this.toReferenceTypeExternalApiHTTPMethodType(persist.getMethod()));
|
|
data.setAuthRequestBody(persist.getBody());
|
|
data.setType(persist.getType());
|
|
data.setAuthTokenPath(persist.getPath());
|
|
|
|
return data;
|
|
}
|
|
|
|
private ExternalFetcherApiHTTPMethodType toReferenceTypeExternalApiHTTPMethodType(String method){
|
|
|
|
if (this.conventionService.isNullOrEmpty(method)) {
|
|
logger.error("Migrate DescriptionTemplate autocomplete method not set use default GET");
|
|
return ExternalFetcherApiHTTPMethodType.GET;
|
|
} else if (method.toLowerCase(Locale.ROOT).trim().equals("get")) {
|
|
return ExternalFetcherApiHTTPMethodType.GET;
|
|
} else if (method.toLowerCase(Locale.ROOT).trim().equals("post")) {
|
|
return ExternalFetcherApiHTTPMethodType.POST;
|
|
} else {
|
|
logger.error("Migrate DescriptionTemplate autocomplete method is invalid " + method);
|
|
throw new MyApplicationException("Migrate DescriptionTemplate autocomplete method is invalid " + method);
|
|
}
|
|
}
|
|
|
|
public enum FieldDataExternalDatasetType implements DatabaseEnum<String> {
|
|
ReusedDataset("reused_dataset"),
|
|
ProducedDataset("produced_dataset"),
|
|
Other("other");
|
|
private final String value;
|
|
|
|
FieldDataExternalDatasetType(String value) {
|
|
this.value = value;
|
|
}
|
|
|
|
@JsonValue
|
|
public String getValue() {
|
|
return value;
|
|
}
|
|
|
|
private static final Map<String, FieldDataExternalDatasetType> map = EnumUtils.getEnumValueMap(FieldDataExternalDatasetType.class);
|
|
|
|
public static FieldDataExternalDatasetType of(String i) {
|
|
return map.get(i);
|
|
}
|
|
}
|
|
}
|