package eu.old.eudat.migration; import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.enums.ReferenceSourceType; import eu.eudat.data.ReferenceEntity; import eu.old.eudat.data.dao.entities.ExternalDatasetDao; import eu.old.eudat.data.entities.ExternalDataset; 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 ExternalDatasetMigrationService { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ExternalDatasetMigrationService.class)); private static final int PageSize = 500; private static final String InternalReferenceSource = "dmp"; private final DatabaseRepository databaseRepository; private final EntityManager entityManager; public ExternalDatasetMigrationService(DatabaseRepository databaseRepository, EntityManager entityManager) { this.databaseRepository = databaseRepository; this.entityManager = entityManager; } public void migrate(){ ExternalDatasetDao externalDatasetDao = databaseRepository.getExternalDatasetDao(); long total = externalDatasetDao.asQueryable().count(); logger.debug("Migrate ExternalDataset Total : " + total); int page = 0; List items; do { items = externalDatasetDao.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 ExternalDataset " + page * PageSize + " of " + total); for (ExternalDataset item : items) { entityManager.detach(item); if (item.getReference() == null || !item.getReference().contains(":")){ logger.warn("Reference generated because is null ExternalDataset " + item.getId()); item.setReference(InternalReferenceSource + ":" + item.getId().toString().replace("-", "").toLowerCase(Locale.ROOT)); } eu.old.eudat.models.data.externaldataset.ExternalDatasetModel model = new eu.old.eudat.models.data.externaldataset.ExternalDatasetModel().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.Datasets); 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); this.entityManager.persist(data); } this.entityManager.flush(); page++; } } while (items != null && !items.isEmpty()); } }