package eu.old.eudat.migration; import eu.eudat.commons.XmlHandlingService; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.ReferenceFieldDataType; import eu.eudat.commons.enums.ReferenceSourceType; import eu.eudat.commons.types.reference.DefinitionEntity; import eu.eudat.commons.types.reference.FieldEntity; import eu.eudat.convention.ConventionService; import eu.eudat.data.ReferenceEntity; import eu.old.eudat.data.dao.entities.RegistryDao; import eu.old.eudat.data.entities.Registry; import eu.old.eudat.logic.services.operations.DatabaseRepository; import gr.cite.tools.logging.LoggerService; import jakarta.persistence.EntityManager; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.List; import java.util.Locale; @Service public class RegistryMigrationService { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(RegistryMigrationService.class)); private static final int PageSize = 500; private static final String InternalReferenceSource = "dmp"; private final DatabaseRepository databaseRepository; private final EntityManager entityManager; private final ConventionService conventionService; private final XmlHandlingService xmlHandlingService; public RegistryMigrationService(DatabaseRepository databaseRepository, EntityManager entityManager, ConventionService conventionService, XmlHandlingService xmlHandlingService) { this.databaseRepository = databaseRepository; this.entityManager = entityManager; this.conventionService = conventionService; this.xmlHandlingService = xmlHandlingService; } public void migrate(){ RegistryDao registryDao = databaseRepository.getRegistryDao(); long total = registryDao.asQueryable().count(); logger.debug("Migrate Registry Total : " + total); int page = 0; List items; do { items = registryDao.asQueryable().orderBy((builder, root) -> builder.asc(root.get("created"))).orderBy((builder, root) -> builder.asc(root.get("ID"))).skip(page * PageSize).take(PageSize).toList(); if (items != null && !items.isEmpty()) { logger.debug("Migrate Registry " + page * PageSize + " of " + total); for (Registry item : items) { entityManager.detach(item); if (item.getReference() == null || !item.getReference().contains(":")){ logger.warn("Reference generated because is null Registry " + item.getId()); item.setReference(InternalReferenceSource + ":" + item.getId().toString().replace("-", "").toLowerCase(Locale.ROOT)); } eu.old.eudat.models.data.registries.RegistryModel model = new eu.old.eudat.models.data.registries.RegistryModel().fromDataModel(item); String[] referenceParts = item.getReference().split(":", 2); boolean isInternal = referenceParts[0].equals(InternalReferenceSource); ReferenceEntity data = new ReferenceEntity(); data.setId(item.getId()); data.setLabel(item.getLabel()); data.setAbbreviation(item.getAbbreviation()); data.setIsActive(IsActive.Active); data.setTypeId(ReferenceTypeIds.Registries); data.setCreatedAt(item.getCreated().toInstant()); data.setUpdatedAt(item.getModified().toInstant()); if (item.getCreationUser() != null) data.setCreatedById(item.getCreationUser().getId()); data.setReference(referenceParts[1]); data.setSource(isInternal? "Internal" : referenceParts[0]); data.setSourceType(isInternal? ReferenceSourceType.Internal : ReferenceSourceType.External); if (!this.conventionService.isNullOrEmpty(item.getUri())){ DefinitionEntity definitionEntity = new DefinitionEntity(); FieldEntity fieldEntity = new FieldEntity(); fieldEntity.setCode("uri"); fieldEntity.setDataType(ReferenceFieldDataType.Text); fieldEntity.setValue(item.getUri()); definitionEntity.setFields(List.of(fieldEntity)); data.setDefinition(this.xmlHandlingService.toXmlSafe(definitionEntity)); } this.entityManager.persist(data); } this.entityManager.flush(); page++; } } while (items != null && !items.isEmpty()); } }