From 9b9ac66417f06f736c5e2fac6847b6bd3fec6779 Mon Sep 17 00:00:00 2001 From: deiflaender Date: Fri, 8 Apr 2022 11:57:36 +0200 Subject: [PATCH] RED-3818: Added migration for false_positive and recommendaction color --- .../migration/MigrationStarterService.java | 3 + .../migrations/TypeToEntityMigration5.java | 140 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/TypeToEntityMigration5.java diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationStarterService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationStarterService.java index 89f76d681..6cf72fdc0 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationStarterService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationStarterService.java @@ -10,6 +10,7 @@ import com.iqser.red.service.peristence.v1.server.migration.migrations.Dictionar import com.iqser.red.service.peristence.v1.server.migration.migrations.EntityTypesMigration4; import com.iqser.red.service.peristence.v1.server.migration.migrations.IndexMigration1; import com.iqser.red.service.peristence.v1.server.migration.migrations.MigrateHighlights3; +import com.iqser.red.service.peristence.v1.server.migration.migrations.TypeToEntityMigration5; import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.MigrationPersistenceService; @@ -29,6 +30,7 @@ public class MigrationStarterService { private final DictionaryToEntityMigration2 dictionaryToEntityMigration2; private final MigrateHighlights3 migrateHighlights3; private final EntityTypesMigration4 entityTypesMigration4; + private final TypeToEntityMigration5 typeToEntityMigration5; private final FileManagementServiceSettings settings; private final ApplicationContext ctx; @@ -49,6 +51,7 @@ public class MigrationStarterService { dictionaryToEntityMigration2.run(); migrateHighlights3.run(); entityTypesMigration4.run(); + typeToEntityMigration5.run(); log.info("Migration is finished"); System.exit(SpringApplication.exit(ctx, () -> 0)); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/TypeToEntityMigration5.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/TypeToEntityMigration5.java new file mode 100644 index 000000000..6471e8950 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/TypeToEntityMigration5.java @@ -0,0 +1,140 @@ +package com.iqser.red.service.peristence.v1.server.migration.migrations; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.peristence.v1.server.controller.DictionaryController; +import com.iqser.red.service.peristence.v1.server.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; + +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Setter +@Service +public class TypeToEntityMigration5 extends Migration { + + private static final String NAME = "Migrate false positives, set recommendation color, remove unneeded dictionaries"; + private static final long VERSION = 5; + + @Autowired + private DictionaryPersistenceService dictionaryPersistenceService; + + @Autowired + private DossierTemplatePersistenceService dossierTemplatePersistenceService; + + @Autowired + private EntryPersistenceService entryPersistenceService; + + @Autowired + private DictionaryController dictionaryController; + + + public TypeToEntityMigration5() { + + super(NAME, VERSION); + } + + + @Override + protected void migrate() { + + var types = dictionaryPersistenceService.getAllTypes(); + types.forEach(type -> type.setRecommendationHexColor("#8df06c")); + dictionaryPersistenceService.saveAllTypes(types); + + var dossierTemplates = dossierTemplatePersistenceService.getAllDossierTemplates(); + + dossierTemplates.forEach(dossierTemplate -> { + var typeIdsToDelete = new HashSet(); + var typesOfDossierTemplate = dictionaryPersistenceService.getAllTypes(); + var falsePositive = typesOfDossierTemplate.stream() + .filter(t -> t.getType().equals("false_positive")) + .findFirst(); + if (!falsePositive.isPresent()) { + return; + } + typeIdsToDelete.add(falsePositive.get().getId()); + var falsePositiveEntries = entryPersistenceService.getEntries(falsePositive.get() + .getId(), DictionaryEntryType.ENTRY, null) + .stream() + .map(f -> f.getValue()) + .collect(Collectors.toSet()); + + typesOfDossierTemplate.stream().filter(t -> !t.getType().equals("false_positive")).forEach(typeEntity -> { + + if (typeEntity.getType().startsWith("recommendation_")) { + typeIdsToDelete.add(typeEntity.getId()); + return; + } + + var entries = entryPersistenceService.getEntries(typeEntity.getId(), DictionaryEntryType.ENTRY, null) + .stream() + .map(f -> f.getValue()) + .collect(Collectors.toSet()); + + var typeFalsePositives = new HashSet(); + falsePositiveEntries.forEach(falsePositiveValue -> { + if (containsAnyWord(falsePositiveValue, entries, typeEntity.isCaseInsensitive())) { + typeFalsePositives.add(falsePositiveValue); + } + }); + + if (!typeFalsePositives.isEmpty()) { + dictionaryController.addEntries(typeEntity.getId(), new ArrayList<>(typeFalsePositives), false, true, DictionaryEntryType.FALSE_POSITIVE); + } + + }); + + typeIdsToDelete.forEach(typeIdToDelete -> { + dictionaryController.deleteType(typeIdToDelete); + }); + + }); + + } + + + public boolean containsAnyWord(String text, Set values, boolean isCaseInsensitive) { + + String inputString = isCaseInsensitive ? text.toLowerCase(Locale.ROOT) : text; + + for (String value : values) { + + String cleanValue = isCaseInsensitive ? value.toLowerCase(Locale.ROOT).trim() : value.trim(); + + int startIndex; + int stopIndex = 0; + do { + startIndex = inputString.indexOf(cleanValue, stopIndex); + stopIndex = startIndex + cleanValue.length(); + + if (startIndex > -1 && (startIndex == 0 || Character.isWhitespace(inputString.charAt(startIndex - 1)) || isSeparator(inputString.charAt(startIndex - 1))) && (stopIndex == inputString.length() || isSeparator(inputString.charAt(stopIndex)))) { + return true; + } + } while (startIndex > -1); + } + return false; + } + + + private boolean isSeparator(char c) { + + return Character.isWhitespace(c) || Pattern.matches("\\p{Punct}", String.valueOf(c)) || c == '\"' || c == '‘' || c == '’'; + } + +}