From ab59020ada8b62d35ed5e047cbf27e5621bb2da9 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Fri, 15 Apr 2022 21:44:58 +0200 Subject: [PATCH] #691 - refactoring: optimize importers --- .../database/importer/AccountImporter.java | 37 ++++++++----- .../database/importer/CategoryImporter.java | 53 +++++++++++-------- .../database/importer/ImageImporter.java | 2 +- .../importer/TemplateGroupImporter.java | 28 ++++++---- 4 files changed, 73 insertions(+), 47 deletions(-) diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java b/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java index 6ce884c99..6d916131c 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java @@ -41,25 +41,13 @@ public class AccountImporter extends ItemImporter<Account> try { - final Account sourceAccount = accountsToUpdate.stream() - .filter(account -> account.getID().equals(accountMatch.getAccountSource().getID())) - .findFirst() - .orElseThrow(); - + final Account sourceAccount = getSourceAccountForMatch(accountsToUpdate, accountMatch); final Account destinationAccount = repository.findById(accountMatch.getAccountDestination().getID()).orElseThrow(); final Icon sourceIcon = sourceAccount.getIconReference(); if(sourceIcon != null) { - LOGGER.debug("Overwriting destination account icon"); - - // explicitly delete old icon to avoid remaining references - final Icon existingIcon = destinationAccount.getIconReference(); - destinationAccount.setIconReference(null); - iconRepository.delete(existingIcon); - - destinationAccount.setIconReference(sourceIcon); - repository.save(destinationAccount); + overwriteIcon(destinationAccount, sourceIcon); } accountsToUpdate.remove(sourceAccount); @@ -78,6 +66,27 @@ public class AccountImporter extends ItemImporter<Account> return new ImportResultItem(entityType, numberOfImportedItems, accountMatchList.getAccountMatches().size(), collectedErrorMessages); } + private void overwriteIcon(Account destinationAccount, Icon sourceIcon) + { + LOGGER.debug("Overwriting destination account icon"); + + // explicitly delete old icon to avoid remaining references + final Icon existingIcon = destinationAccount.getIconReference(); + destinationAccount.setIconReference(null); + iconRepository.delete(existingIcon); + + destinationAccount.setIconReference(sourceIcon); + repository.save(destinationAccount); + } + + private Account getSourceAccountForMatch(List<Account> accountsToUpdate, AccountMatch accountMatch) + { + return accountsToUpdate.stream() + .filter(account -> account.getID().equals(accountMatch.getAccountSource().getID())) + .findFirst() + .orElseThrow(); + } + @Override protected int importSingleItem(Account account) { diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java b/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java index 1b7d42770..8af21fbb9 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.MessageFormat; +import java.util.Optional; public class CategoryImporter extends ItemImporter<Category> { @@ -19,45 +20,55 @@ public class CategoryImporter extends ItemImporter<Category> } @Override - protected int importSingleItem(Category category) + protected int importSingleItem(Category categoryToImport) { if(!(repository instanceof CategoryRepository repository)) { throw new IllegalArgumentException("Invalid repository type"); } - LOGGER.debug(MessageFormat.format("Importing category {0}", category.getName())); + LOGGER.debug(MessageFormat.format("Importing category {0}", categoryToImport.getName())); - Category existingCategory; - if(category.getType().equals(CategoryType.NONE) || category.getType().equals(CategoryType.REST)) + final Optional<Category> existingCategoryOptional = findExistingCategory(categoryToImport, repository); + + int newCategoryID; + if(existingCategoryOptional.isEmpty()) { - existingCategory = repository.findByType(category.getType()); + // category does not exist --> create it + final Category newCategory = createCategory(categoryToImport, repository); + newCategoryID = newCategory.getID(); } else { - existingCategory = repository.findByNameAndColorAndType(category.getName(), category.getColor(), category.getType()); + // category already exists + final Category existingCategory = existingCategoryOptional.get(); + newCategoryID = existingCategory.getID(); + categoryToImport.setIconReference(existingCategory.getIconReference()); + LOGGER.debug(MessageFormat.format("Found matching category with ID: {0} for category \"{1}\".", newCategoryID, categoryToImport.getName())); } + return newCategoryID; + } - int newCategoryID; - if(existingCategory == null) + private Optional<Category> findExistingCategory(Category categoryToImport, CategoryRepository repository) + { + if(categoryToImport.getType().equals(CategoryType.NONE) || categoryToImport.getType().equals(CategoryType.REST)) { - //category does not exist --> create it - LOGGER.debug(MessageFormat.format("No matching category found for category \"{0}\". Creating new one...", category.getName())); - - Category categoryToCreate = new Category(category.getName(), category.getColor(), category.getType(), category.getIconReference()); - repository.save(categoryToCreate); - - Category newCategory = repository.findByNameAndColorAndType(category.getName(), category.getColor(), category.getType()); - newCategoryID = newCategory.getID(); + return Optional.of(repository.findByType(categoryToImport.getType())); } else { - //category already exists - newCategoryID = existingCategory.getID(); - category.setIconReference(existingCategory.getIconReference()); - LOGGER.debug(MessageFormat.format("Found matching category with ID: {0} for category \"{1}\".", newCategoryID, category.getName())); + return Optional.ofNullable(repository.findByNameAndColorAndType(categoryToImport.getName(), categoryToImport.getColor(), categoryToImport.getType())); } - return newCategoryID; + } + + private Category createCategory(Category categoryToImport, CategoryRepository repository) + { + LOGGER.debug(MessageFormat.format("No matching category found for category \"{0}\". Creating new one...", categoryToImport.getName())); + + final Category categoryToCreate = new Category(categoryToImport.getName(), categoryToImport.getColor(), categoryToImport.getType(), categoryToImport.getIconReference()); + repository.save(categoryToCreate); + + return repository.findByNameAndColorAndType(categoryToImport.getName(), categoryToImport.getColor(), categoryToImport.getType()); } @Override diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java b/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java index fed8cc14f..7a5f4c6c2 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java @@ -19,7 +19,7 @@ public class ImageImporter extends ItemImporter<Image> throw new IllegalArgumentException("Invalid repository type"); } - Image imageToCreate = new Image(image.getImage(), image.getFileName(), image.getFileExtension()); + final Image imageToCreate = new Image(image.getImage(), image.getFileName(), image.getFileExtension()); final Image savedImage = repository.save(imageToCreate); return savedImage.getID(); diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java b/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java index b5de025e0..3cd321f88 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java @@ -5,6 +5,8 @@ import de.deadlocker8.budgetmaster.templategroup.TemplateGroup; import de.deadlocker8.budgetmaster.templategroup.TemplateGroupRepository; import de.deadlocker8.budgetmaster.templategroup.TemplateGroupType; +import java.util.Optional; + public class TemplateGroupImporter extends ItemImporter<TemplateGroup> { public TemplateGroupImporter(TemplateGroupRepository templateGroupRepository) @@ -20,17 +22,8 @@ public class TemplateGroupImporter extends ItemImporter<TemplateGroup> throw new IllegalArgumentException("Invalid repository type"); } - TemplateGroup existingTemplateGroup; - if(templateGroup.getType().equals(TemplateGroupType.DEFAULT)) - { - existingTemplateGroup = repository.findFirstByType(TemplateGroupType.DEFAULT); - } - else - { - existingTemplateGroup = repository.findByNameAndType(templateGroup.getName(), templateGroup.getType()); - } - - if(existingTemplateGroup == null) + final Optional<TemplateGroup> existingTemplateGroupOptional = findExistingTemplateGroup(templateGroup, repository); + if(existingTemplateGroupOptional.isEmpty()) { // template group does not exist --> create it TemplateGroup templateGroupToCreate = new TemplateGroup(templateGroup.getName(), templateGroup.getType()); @@ -41,10 +34,23 @@ public class TemplateGroupImporter extends ItemImporter<TemplateGroup> else { // template group already exists + final TemplateGroup existingTemplateGroup = existingTemplateGroupOptional.get(); return existingTemplateGroup.getID(); } } + private Optional<TemplateGroup> findExistingTemplateGroup(TemplateGroup templateGroup, TemplateGroupRepository repository) + { + if(templateGroup.getType().equals(TemplateGroupType.DEFAULT)) + { + return Optional.of(repository.findFirstByType(TemplateGroupType.DEFAULT)); + } + else + { + return Optional.ofNullable(repository.findByNameAndType(templateGroup.getName(), templateGroup.getType())); + } + } + @Override protected String getNameForItem(TemplateGroup item) { -- GitLab