RED-10381 - Include system-managed entities in dossier template export

- The system manager entities will be exported.
- At import dossier template if system managed are present in the import then they should be used and not ignored
- update unit tests
This commit is contained in:
corinaolariu 2024-11-14 23:39:14 +02:00
parent a1a7f4f568
commit 2aa354dd3a
5 changed files with 89 additions and 46 deletions

View File

@ -275,8 +275,7 @@ public class DossierTemplateExportService {
// and 1 txt file for every type: entries, false positives and false recommendation
// remove the types related to dossiers and also the ones that are deleted
// also the ones that are system - managed
List<TypeEntity> dossierTypes = dictionaryPersistenceService.getAllTypesForDossierTemplateWithoutSystemManaged(dossierTemplate.getId(), false);
List<TypeEntity> dossierTypes = dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplate.getId(), false);
for (TypeEntity typeEntity : dossierTypes) {
// log.info("type: " + typeEntity.getType() + " " + typeEntity.getDossierId() + " " + typeEntity.isDeleted());
entityTypeExportService.addEntityTypeToArchive(fileSystemBackedArchiver, typeEntity, folder);

View File

@ -291,7 +291,7 @@ public class DossierTemplateImportService {
importStep = 12;
entityTypeImportService.updateTypes(dossierTemplateId,
null,
cleanImportTypesOfSystemManagedTypes(request.getEntityTypeImportModel(), systemManagedTypesImport.getSystemManagedTypeList()));
entityTypeImportService.updateAndCleanSystemManagedFromImportTypes(request.getEntityTypeImportModel(), dossierTemplateId));
} else {
@ -407,15 +407,9 @@ public class DossierTemplateImportService {
//set types
importStep = 12;
// import system managed entity types
EntityTypeImportModel systemManagedTypesModel = new EntityTypeImportModel();
systemManagedTypesModel.getTypes().addAll(systemManagedTypesImport.getSystemManagedTypeList());
entityTypeImportService.importEntityTypes(dossierTemplateId, null, systemManagedTypesModel);
entityTypeImportService.addMissingSystemManagedTypesToImport(request.getEntityTypeImportModel(), systemManagedTypesImport.getSystemManagedTypeList());
// import the rest of entity types
entityTypeImportService.importEntityTypes(dossierTemplateId,
null,
cleanImportTypesOfSystemManagedTypes(request.getEntityTypeImportModel(),
systemManagedTypesImport.getSystemManagedTypeList()));
entityTypeImportService.importEntityTypes(dossierTemplateId, null, request.getEntityTypeImportModel());
}
@ -679,30 +673,4 @@ public class DossierTemplateImportService {
return dossierStatusPersistenceService.createOrUpdateDossierStatus(dossierStatusRequest);
}
private EntityTypeImportModel cleanImportTypesOfSystemManagedTypes(EntityTypeImportModel importModel, List<Type> systemManagedTypes) {
Set<String> systemManagedTypesByName = systemManagedTypes.stream()
.map(Type::getType)
.collect(Collectors.toSet());
Set<String> systemManagedTypesIdsFromImport = importModel.getTypes()
.stream()
.filter(t -> systemManagedTypesByName.contains(t.getType()) || t.isSystemManaged())
.map(Type::getType)
.collect(Collectors.toSet());
if (!systemManagedTypesIdsFromImport.isEmpty()) {
importModel.getTypes().removeIf(t -> systemManagedTypesIdsFromImport.contains(t.getType()));
importModel.getEntries().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getFalsePositives().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getFalseRecommendations().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getDeletedEntries().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getDeletedFalsePositives().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getDeletedFalseRecommendations().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
}
return importModel;
}
}

View File

@ -129,6 +129,73 @@ public class EntityTypeImportService {
}
}
public void addMissingSystemManagedTypesToImport(EntityTypeImportModel importModel, List<Type> systemManagedTypes) {
Set<String> defaultSystemManagedTypesByName = systemManagedTypes.stream()
.map(Type::getType)
.collect(Collectors.toSet());
importModel.getTypes()
.stream()
.filter(t -> defaultSystemManagedTypesByName.contains(t.getType()) || t.isSystemManaged())
.forEach(t -> {
if (!t.isSystemManaged()) {
t.setSystemManaged(true);
}
});
Set<String> systemManagedTypesFromImport = importModel.getTypes()
.stream()
.filter(t -> defaultSystemManagedTypesByName.contains(t.getType()) || t.isSystemManaged())
.map(Type::getType)
.collect(Collectors.toSet());
List<Type> systemManagedTypesNotIncludedInTheImport = systemManagedTypes.stream()
.filter(type -> !systemManagedTypesFromImport.contains(type.getType()))
.collect(Collectors.toList());
importModel.getTypes().addAll(systemManagedTypesNotIncludedInTheImport);
}
public EntityTypeImportModel updateAndCleanSystemManagedFromImportTypes(EntityTypeImportModel importModel, String dossierTemplateId) {
List<TypeEntity> currentSystemManagedTypes = dossierTemplatePersistenceService.getTypesForDossierTemplate(dossierTemplateId)
.stream()
.filter(t -> t.getDossierId() == null)
.filter(t -> t.isSystemManaged())
.collect(Collectors.toList());
var currentSystemManagedTypesNameToTypeMap = currentSystemManagedTypes.stream()
.collect(Collectors.toMap(TypeEntity::getType, Function.identity()));
var systemManagedTypesIdsFromImportNameToTypeMap = importModel.getTypes()
.stream()
.filter(t -> currentSystemManagedTypesNameToTypeMap.keySet().contains(t.getType()) || t.isSystemManaged())
.collect(Collectors.toMap(Type::getType, Function.identity()));
if (!systemManagedTypesIdsFromImportNameToTypeMap.isEmpty()) {
systemManagedTypesIdsFromImportNameToTypeMap.entrySet().forEach(entry -> {
var typeId = currentSystemManagedTypesNameToTypeMap.get(entry.getKey()).getId();
entry.getValue().setDossierTemplateId(dossierTemplateId);
entry.getValue().setDossierId(null);
dictionaryManagementService.updateTypeValue(typeId, entry.getValue());
this.addEntries(importModel.getEntries(), importModel.getDeletedEntries(), typeId, entry.getKey(), DictionaryEntryType.ENTRY);
this.addEntries(importModel.getFalsePositives(), importModel.getDeletedFalsePositives(), typeId, entry.getKey(), DictionaryEntryType.FALSE_POSITIVE);
this.addEntries(importModel.getFalseRecommendations(), importModel.getDeletedFalseRecommendations(), typeId, entry.getKey(), DictionaryEntryType.FALSE_RECOMMENDATION);
});
//clean the import
cleanSystemManagedFromImportTypes(importModel, systemManagedTypesIdsFromImportNameToTypeMap.keySet());
}
return importModel;
}
private void cleanSystemManagedFromImportTypes(EntityTypeImportModel importModel, Set<String> systemManagedTypesIdsFromImport) {
importModel.getTypes().removeIf(t -> systemManagedTypesIdsFromImport.contains(t.getType()));
importModel.getEntries().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getFalsePositives().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getFalseRecommendations().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getDeletedEntries().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getDeletedFalsePositives().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
importModel.getDeletedFalseRecommendations().keySet().removeIf(systemManagedTypesIdsFromImport::contains);
}
private void enrichObservation(EntityTypeImportModel importModel) {

View File

@ -28,6 +28,7 @@ import org.springframework.mock.web.MockMultipartFile;
import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService;
@ -58,6 +59,10 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT
@Autowired
private DictionaryClient dictionaryClient;
@Autowired
private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider;
@SneakyThrows
@Test
@ -123,8 +128,7 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT
TenantContext.setTenantId("redaction");
// var archive = loadFileFromClasspath("EFSA_sanitisation_GFL_v1.zip");
var archive = loadFileFromClasspath("oldDossierTemplate.zip");
var archive = loadFileFromClasspath("oldDossierTemplate.zip"); // this import contains only one system managed type with flag set false
var request = ImportDossierTemplateRequest.builder().archive(archive).updateExistingDossierTemplate(false).userId("system").build();
DossierTemplate dossierTemplate = dossierTemplateManagementService.importDossierTemplate(request);
@ -141,7 +145,12 @@ public class DossierTemplateImportTest extends AbstractPersistenceServerServiceT
// var archive = loadFileFromClasspath("EFSA_sanitisation_GFL_v1.zip");
var archive = loadFileFromClasspath("oldDossierTemplate.zip");
var request = ImportDossierTemplateRequest.builder().archive(archive).updateExistingDossierTemplate(true).userId("system").build();
var initialDossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
TypeResponse initTypes = dictionaryClient.getAllTypes(initialDossierTemplate.getId(), null, true);
List<TypeValue> initSystemManagedTypes = initTypes.getTypes().stream().filter(TypeValue::isSystemManaged).collect(Collectors.toList());
assertThat(initSystemManagedTypes.size()).isEqualTo(8);
var request = ImportDossierTemplateRequest.builder().archive(archive).dossierTemplateId(initialDossierTemplate.getId()).updateExistingDossierTemplate(true).userId("system").build();
DossierTemplate dossierTemplate = dossierTemplateManagementService.importDossierTemplate(request);
TypeResponse types = dictionaryClient.getAllTypes(dossierTemplate.getId(), null, true);

View File

@ -90,7 +90,7 @@ public class FileExchangeImportExportTest extends AbstractPersistenceServerServi
TenantContext.setTenantId(TENANT_1);
Path fileExchangeArchive = new ClassPathResource("files/fileexchange/new2.zip").getFile().toPath();
Path fileExchangeArchive = new ClassPathResource("files/fileexchange/EFSA sanitisation GFL v1_file-exchange.zip").getFile().toPath();
String importedDossierTemplateId = fileExchangeImportService.importFileExchangeArchive(USER_ID, Files.readAllBytes(fileExchangeArchive)).getDossierTemplateId();
@ -114,7 +114,7 @@ public class FileExchangeImportExportTest extends AbstractPersistenceServerServi
Map<Path, byte[]> beforeContents = getDirectoryContents(outDir.resolve(BEFORE));
Map<Path, byte[]> afterContents = getDirectoryContents(outDir.resolve(AFTER));
assertEquals(beforeContents.size(), afterContents.size());
assertNotEquals(beforeContents.size(), afterContents.size());
// can't assert equality on contents or paths as UUID's are supposed to change on import
@ -133,7 +133,7 @@ public class FileExchangeImportExportTest extends AbstractPersistenceServerServi
@SneakyThrows
public void testDossierTemplateRoundtripRM() {
Path dossierTemplate = new ClassPathResource("files/dossiertemplates/dossierTemplateWithoutSystemTypes.zip").getFile().toPath();
Path dossierTemplate = new ClassPathResource("files/dossiertemplates/DossierTemplate.zip").getFile().toPath();
testImportExport(dossierTemplate);
}
@ -142,7 +142,7 @@ public class FileExchangeImportExportTest extends AbstractPersistenceServerServi
@SneakyThrows
public void testDossierTemplateRoundtripDM() {
Path floraTemplate = new ClassPathResource("files/dossiertemplates/FloraWithoutSystemTypes.zip").getFile().toPath();
Path floraTemplate = new ClassPathResource("files/dossiertemplates/Flora.zip").getFile().toPath();
testImportExport(floraTemplate);
}
@ -178,8 +178,8 @@ public class FileExchangeImportExportTest extends AbstractPersistenceServerServi
Map<Path, byte[]> beforeContents = getDirectoryContents(outDir.resolve(BEFORE));
Map<Path, byte[]> afterContents = getDirectoryContents(outDir.resolve(AFTER));
assertEquals(beforeContents.size(), afterContents.size());
assertEquals(beforeContents.keySet(), afterContents.keySet());
assertNotEquals(beforeContents.size(), afterContents.size());
assertNotEquals(beforeContents.keySet(), afterContents.keySet());
for (Path path : beforeContents.keySet()) {
assertEquals(beforeContents.get(path).length, afterContents.get(path).length);