From 8815bc46c2b027ae4d7e7ae454c0240db0034ff0 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 21 Aug 2022 20:46:36 +0200 Subject: [PATCH] #713 - removed migrator code --- BudgetMasterDatabaseMigrator/pom.xml | 80 --- .../databasemigrator/BatchConfiguration.java | 584 ------------------ .../databasemigrator/CommandLineOptions.java | 29 - .../databasemigrator/CustomIdGenerator.java | 29 - .../DatabaseMigratorMain.java | 82 --- .../databasemigrator/DatabaseType.java | 33 - .../budgetmaster/databasemigrator/Utils.java | 26 - .../DestinationDatabaseConfiguration.java | 50 -- .../DestinationIntegerRepository.java | 11 - .../destination/DestinationRepository.java | 9 - .../destination/ProvidesID.java | 8 - .../destination/StepNames.java | 44 -- .../destination/TableNames.java | 44 -- .../account/DestinationAccount.java | 43 -- .../DestinationAccountIntegerRepository.java | 7 - .../category/DestinationCategory.java | 35 -- .../DestinationCategoryIntegerRepository.java | 7 - .../destination/chart/DestinationChart.java | 44 -- .../DestinationChartIntegerRepository.java | 8 - .../destination/hint/DestinationHint.java | 32 - .../DestinationHintIntegerRepository.java | 7 - .../destination/icon/DestinationIcon.java | 34 - .../DestinationIconIntegerRepository.java | 7 - .../destination/image/DestinationImage.java | 35 -- .../DestinationImageIntegerRepository.java | 7 - .../repeating/DestinationRepeatingOption.java | 36 -- ...ationRepeatingOptionIntegerRepository.java | 7 - .../end/DestinationRepeatingEnd.java | 32 - .../DestinationRepeatingEndAfterXTimes.java | 32 - ...eatingEndAfterXTimesIntegerRepository.java | 7 - .../end/DestinationRepeatingEndDate.java | 31 - ...tionRepeatingEndDateIntegerRepository.java | 7 - ...tinationRepeatingEndIntegerRepository.java | 7 - .../end/DestinationRepeatingEndNever.java | 30 - ...ionRepeatingEndNeverIntegerRepository.java | 7 - .../DestinationRepeatingModifier.java | 33 - .../DestinationRepeatingModifierDays.java | 29 - ...epeatingModifierDaysIntegerRepository.java | 7 - ...ionRepeatingModifierIntegerRepository.java | 7 - .../DestinationRepeatingModifierMonths.java | 29 - ...eatingModifierMonthsIntegerRepository.java | 7 - .../DestinationRepeatingModifierYears.java | 29 - ...peatingModifierYearsIntegerRepository.java | 7 - .../report/DestinationReportColumn.java | 37 -- ...tinationReportColumnIntegerRepository.java | 7 - .../report/DestinationReportSettings.java | 38 -- ...nationReportSettingsIntegerRepository.java | 7 - .../settings/DestinationSettings.java | 85 --- .../DestinationSettingsIntegerRepository.java | 7 - .../destination/tag/DestinationTag.java | 31 - .../tag/DestinationTagIntegerRepository.java | 7 - .../tag/DestinationTemplateTag.java | 97 --- ...stinationTemplateTagIntegerRepository.java | 8 - .../tag/DestinationTransactionTag.java | 96 --- ...nationTransactionTagIntegerRepository.java | 8 - .../template/DestinationTemplate.java | 53 -- .../DestinationTemplateIntegerRepository.java | 7 - .../DestinationTemplateGroup.java | 33 - ...inationTemplateGroupIntegerRepository.java | 7 - .../transaction/DestinationTransaction.java | 50 -- ...stinationTransactionIntegerRepository.java | 7 - .../destination/user/DestinationUser.java | 33 - .../DestinationUserIntegerRepository.java | 7 - .../listener/GenericChunkListener.java | 44 -- .../listener/GenericJobListener.java | 37 -- .../listener/GenericStepListener.java | 81 --- .../source/SourceDatabaseConfiguration.java | 53 -- .../steps/GenericDoNothingProcessor.java | 17 - .../databasemigrator/steps/GenericWriter.java | 30 - .../steps/reader/AccountReader.java | 51 -- .../steps/reader/BaseReader.java | 37 -- .../steps/reader/CategoryReader.java | 47 -- .../steps/reader/ChartReader.java | 53 -- .../steps/reader/HintReader.java | 43 -- .../steps/reader/IconReader.java | 45 -- .../steps/reader/ImageReader.java | 45 -- .../steps/reader/SettingsReader.java | 81 --- .../steps/reader/TemplateGroupReader.java | 43 -- .../steps/reader/TemplateReader.java | 59 -- .../steps/reader/TransactionReader.java | 57 -- .../steps/reader/UserReader.java | 45 -- .../repeating/RepeatingOptionReader.java | 46 -- .../end/RepeatingEndAfterXTimesReader.java | 42 -- .../repeating/end/RepeatingEndDateReader.java | 42 -- .../end/RepeatingEndNeverReader.java | 40 -- .../repeating/end/RepeatingEndReader.java | 44 -- .../modifier/RepeatingModifierDaysReader.java | 40 -- .../RepeatingModifierMonthsReader.java | 40 -- .../modifier/RepeatingModifierReader.java | 46 -- .../RepeatingModifierYearsReader.java | 40 -- .../reader/report/ReportColumnReader.java | 46 -- .../reader/report/ReportSettingsReader.java | 48 -- .../steps/reader/tag/TagReader.java | 42 -- .../steps/reader/tag/TemplateTagReader.java | 44 -- .../reader/tag/TransactionTagReader.java | 45 -- .../src/main/resources/application.properties | 21 - .../databasemigrator/MigrateAccountsTest.java | 77 --- .../MigrateCategoriesTest.java | 74 --- .../databasemigrator/MigrateChartsTest.java | 219 ------- .../MigrateDefaultDatabaseTest.java | 65 -- .../databasemigrator/MigrateHintsTest.java | 70 --- .../databasemigrator/MigrateIconsTest.java | 76 --- .../databasemigrator/MigrateImagesTest.java | 74 --- .../MigrateRepeatingEndAfterXTimesTest.java | 70 --- .../MigrateRepeatingEndDateTest.java | 71 --- .../MigrateRepeatingEndNeverTest.java | 70 --- .../MigrateRepeatingEndsTest.java | 72 --- .../MigrateRepeatingModifierDaysTest.java | 70 --- .../MigrateRepeatingModifierMonthsTest.java | 70 --- .../MigrateRepeatingModifierYearsTest.java | 70 --- .../MigrateRepeatingModifiersTest.java | 72 --- .../MigrateRepeatingOptionsTest.java | 71 --- .../MigrateReportColumnsTest.java | 80 --- .../MigrateReportSettingsTest.java | 73 --- .../databasemigrator/MigrateSettingsTest.java | 73 --- .../databasemigrator/MigrateTagsTest.java | 121 ---- .../MigrateTemplateGroupsTest.java | 71 --- .../MigrateTemplatesTest.java | 72 --- .../MigrateTransactionsTest.java | 74 --- .../databasemigrator/MigrateUsersTest.java | 70 --- .../databasemigrator/MigratorTestBase.java | 129 ---- .../databasemigrator/UpdateSequencesTest.java | 70 --- .../src/test/resources/BudgetMaster.svg | 1 - .../src/test/resources/accounts.mv.db | Bin 98304 -> 0 bytes .../src/test/resources/categories.mv.db | Bin 98304 -> 0 bytes .../src/test/resources/charts.mv.db | Bin 98304 -> 0 bytes .../default_database_after_first_start.mv.db | Bin 94208 -> 0 bytes .../src/test/resources/tags.mv.db | Bin 98304 -> 0 bytes .../src/test/resources/templates.mv.db | Bin 94208 -> 0 bytes .../src/test/resources/transactions.mv.db | Bin 98304 -> 0 bytes pom.xml | 1 - 131 files changed, 5884 deletions(-) delete mode 100644 BudgetMasterDatabaseMigrator/pom.xml delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CommandLineOptions.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CustomIdGenerator.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseType.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/Utils.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationDatabaseConfiguration.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/ProvidesID.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/StepNames.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/TableNames.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccount.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccountIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategory.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategoryIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChart.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChartIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHint.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHintIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIcon.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIconIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImage.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImageIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOption.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOptionIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEnd.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimes.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimesIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDate.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDateIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNever.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNeverIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifier.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDays.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDaysIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonths.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonthsIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYears.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYearsIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumn.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumnIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettings.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettingsIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettings.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettingsIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTag.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTagIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTag.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTagIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTag.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTagIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplate.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplateIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroup.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroupIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransaction.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransactionIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUser.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUserIntegerRepository.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericChunkListener.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericJobListener.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericStepListener.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/source/SourceDatabaseConfiguration.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericDoNothingProcessor.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericWriter.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/AccountReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/BaseReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/CategoryReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ChartReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/HintReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/IconReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ImageReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/SettingsReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateGroupReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TransactionReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/UserReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/RepeatingOptionReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndAfterXTimesReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndDateReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndNeverReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierDaysReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierMonthsReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierYearsReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportColumnReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportSettingsReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TagReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TemplateTagReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TransactionTagReader.java delete mode 100644 BudgetMasterDatabaseMigrator/src/main/resources/application.properties delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateAccountsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateCategoriesTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateChartsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateDefaultDatabaseTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateHintsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateIconsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateImagesTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndAfterXTimesTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndDateTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndNeverTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierDaysTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierMonthsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierYearsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifiersTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingOptionsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportColumnsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportSettingsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateSettingsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTagsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplateGroupsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplatesTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTransactionsTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateUsersTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigratorTestBase.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/UpdateSequencesTest.java delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/BudgetMaster.svg delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/accounts.mv.db delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/categories.mv.db delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/charts.mv.db delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/default_database_after_first_start.mv.db delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/tags.mv.db delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/templates.mv.db delete mode 100644 BudgetMasterDatabaseMigrator/src/test/resources/transactions.mv.db diff --git a/BudgetMasterDatabaseMigrator/pom.xml b/BudgetMasterDatabaseMigrator/pom.xml deleted file mode 100644 index b5eed7be0..000000000 --- a/BudgetMasterDatabaseMigrator/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <parent> - <artifactId>BudgetMaster</artifactId> - <groupId>de.deadlocker8</groupId> - <version>2.12.0</version> - </parent> - <modelVersion>4.0.0</modelVersion> - - <artifactId>BudgetMasterDatabaseMigrator</artifactId> - - <properties> - <h2database.version>1.4.199</h2database.version> - <commons-cli.version>1.5.0</commons-cli.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-batch</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework.batch</groupId> - <artifactId>spring-batch-test</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - <version>${h2database.version}</version> - </dependency> - <dependency> - <groupId>org.postgresql</groupId> - <artifactId>postgresql</artifactId> - </dependency> - <dependency> - <groupId>org.mariadb.jdbc</groupId> - <artifactId>mariadb-java-client</artifactId> - </dependency> - - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - - <dependency> - <groupId>commons-cli</groupId> - <artifactId>commons-cli</artifactId> - <version>${commons-cli.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <configuration> - <outputDirectory>${basedir}/../BudgetMasterServer/src/main/resources</outputDirectory> - <finalName>${project.artifactId}</finalName> - </configuration> - <executions> - <execution> - <goals> - <goal>repackage</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> -</project> \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java deleted file mode 100644 index bb0940714..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java +++ /dev/null @@ -1,584 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.account.DestinationAccount; -import de.deadlocker8.budgetmaster.databasemigrator.destination.account.DestinationAccountIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.category.DestinationCategory; -import de.deadlocker8.budgetmaster.databasemigrator.destination.category.DestinationCategoryIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.chart.DestinationChart; -import de.deadlocker8.budgetmaster.databasemigrator.destination.chart.DestinationChartIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.hint.DestinationHint; -import de.deadlocker8.budgetmaster.databasemigrator.destination.hint.DestinationHintIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.icon.DestinationIcon; -import de.deadlocker8.budgetmaster.databasemigrator.destination.icon.DestinationIconIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.image.DestinationImage; -import de.deadlocker8.budgetmaster.databasemigrator.destination.image.DestinationImageIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.DestinationRepeatingOption; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.DestinationRepeatingOptionIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.*; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.*; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportColumn; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportColumnIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportSettings; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportSettingsIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.settings.DestinationSettings; -import de.deadlocker8.budgetmaster.databasemigrator.destination.settings.DestinationSettingsIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.tag.*; -import de.deadlocker8.budgetmaster.databasemigrator.destination.template.DestinationTemplate; -import de.deadlocker8.budgetmaster.databasemigrator.destination.template.DestinationTemplateIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.templateGroup.DestinationTemplateGroup; -import de.deadlocker8.budgetmaster.databasemigrator.destination.templateGroup.DestinationTemplateGroupIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.transaction.DestinationTransaction; -import de.deadlocker8.budgetmaster.databasemigrator.destination.transaction.DestinationTransactionIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.user.DestinationUser; -import de.deadlocker8.budgetmaster.databasemigrator.destination.user.DestinationUserIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.listener.GenericChunkListener; -import de.deadlocker8.budgetmaster.databasemigrator.listener.GenericJobListener; -import de.deadlocker8.budgetmaster.databasemigrator.listener.GenericStepListener; -import de.deadlocker8.budgetmaster.databasemigrator.steps.GenericDoNothingProcessor; -import de.deadlocker8.budgetmaster.databasemigrator.steps.GenericWriter; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.*; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.RepeatingOptionReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end.RepeatingEndAfterXTimesReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end.RepeatingEndDateReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end.RepeatingEndNeverReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end.RepeatingEndReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier.RepeatingModifierDaysReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier.RepeatingModifierMonthsReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier.RepeatingModifierReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier.RepeatingModifierYearsReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.report.ReportColumnReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.report.ReportSettingsReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag.TagReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag.TemplateTagReader; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag.TransactionTagReader; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.launch.support.RunIdIncrementer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.jdbc.core.JdbcTemplate; - -import javax.persistence.EntityManager; -import javax.sql.DataSource; - -@Configuration -@EnableBatchProcessing -@AllArgsConstructor -public class BatchConfiguration -{ - private static final Logger LOGGER = LoggerFactory.getLogger(BatchConfiguration.class); - - final JobBuilderFactory jobBuilderFactory; - final StepBuilderFactory stepBuilderFactory; - - final EntityManager entityManager; - - final DataSource primaryDataSource; - - final DestinationImageIntegerRepository destinationImageRepository; - final DestinationIconIntegerRepository destinationIconRepository; - final DestinationCategoryIntegerRepository destinationCategoryRepository; - final DestinationAccountIntegerRepository destinationAccountRepository; - final DestinationChartIntegerRepository destinationChartRepository; - final DestinationHintIntegerRepository destinationHintRepository; - - final DestinationRepeatingEndIntegerRepository destinationRepeatingEndRepository; - final DestinationRepeatingEndAfterXTimesIntegerRepository destinationRepeatingEndAfterXTimesRepository; - final DestinationRepeatingEndDateIntegerRepository destinationRepeatingEndDateRepository; - final DestinationRepeatingEndNeverIntegerRepository destinationRepeatingEndNeverRepository; - - final DestinationRepeatingModifierIntegerRepository destinationRepeatingModifierRepository; - final DestinationRepeatingModifierDaysIntegerRepository destinationRepeatingModifierDaysRepository; - final DestinationRepeatingModifierMonthsIntegerRepository destinationRepeatingModifierMonthsRepository; - final DestinationRepeatingModifierYearsIntegerRepository destinationRepeatingModifierYearsRepository; - - final DestinationRepeatingOptionIntegerRepository destinationRepeatingOptionRepository; - - final DestinationReportColumnIntegerRepository destinationReportColumnRepository; - final DestinationReportSettingsIntegerRepository destinationReportSettingsRepository; - - final DestinationSettingsIntegerRepository destinationSettingsRepository; - - final DestinationTagIntegerRepository destinationTagRepository; - final DestinationTemplateTagIntegerRepository destinationTemplateTagRepository; - final DestinationTransactionTagIntegerRepository destinationTransactionTagRepository; - - final DestinationUserIntegerRepository destinationUserRepository; - final DestinationTransactionIntegerRepository destinationTransactionRepository; - - final DestinationTemplateIntegerRepository destinationTemplateRepository; - final DestinationTemplateGroupIntegerRepository destinationTemplateGroupRepository; - - final ApplicationContext context; - - public void cleanDatabase() - { - LOGGER.debug(">>> Cleanup database..."); - - // deletion order is important! - - LOGGER.debug("Cleaning tags..."); - destinationTemplateTagRepository.deleteAll(); - destinationTransactionTagRepository.deleteAll(); - destinationTagRepository.deleteAll(); - - LOGGER.debug("Cleaning transactions..."); - destinationTransactionRepository.deleteAll(); - - LOGGER.debug("Cleaning templates..."); - destinationTemplateRepository.deleteAll(); - LOGGER.debug("Cleaning template groups."); - destinationTemplateGroupRepository.deleteAll(); - - LOGGER.debug("Cleaning categories..."); - destinationCategoryRepository.deleteAll(); - LOGGER.debug("Cleaning users..."); - destinationUserRepository.deleteAll(); - LOGGER.debug("Cleaning accounts..."); - destinationAccountRepository.deleteAll(); - - LOGGER.debug("Cleaning report settings..."); - destinationReportColumnRepository.deleteAll(); - destinationReportSettingsRepository.deleteAll(); - - LOGGER.debug("Cleaning charts..."); - destinationChartRepository.deleteAll(); - LOGGER.debug("Cleaning hints..."); - destinationHintRepository.deleteAll(); - - LOGGER.debug("Cleaning icons..."); - destinationIconRepository.deleteAll(); - LOGGER.debug("Cleaning images..."); - destinationImageRepository.deleteAll(); - - LOGGER.debug("Cleaning repeating options..."); - destinationRepeatingOptionRepository.deleteAll(); - destinationRepeatingEndAfterXTimesRepository.deleteAll(); - destinationRepeatingEndDateRepository.deleteAll(); - destinationRepeatingEndNeverRepository.deleteAll(); - destinationRepeatingEndRepository.deleteAll(); - destinationRepeatingModifierDaysRepository.deleteAll(); - destinationRepeatingModifierMonthsRepository.deleteAll(); - destinationRepeatingModifierYearsRepository.deleteAll(); - destinationRepeatingModifierRepository.deleteAll(); - - LOGGER.debug("Cleaning settings..."); - destinationSettingsRepository.deleteAll(); - - LOGGER.debug(">>> Cleanup database DONE"); - } - - @Bean(name = "jdbcTemplate2") - public JdbcTemplate createJdbcTemplate2(@Autowired @Qualifier("secondaryDataSource") DataSource dataSource2) - { - return new JdbcTemplate(dataSource2); - } - - @Bean(name = "migrateJob") - public Job createMigrateJob() - { - return jobBuilderFactory.get("Migrate from h2 to postgresql") - .incrementer(new RunIdIncrementer()) - .start(createStepForImageMigration()) - .next(createStepForIconMigration()) - - .next(createStepForCategoryMigration()) - .next(createStepForAccountMigration()) - - .next(createStepForChartMigration()) - .next(createStepForHintMigration()) - - // repeating end options - .next(createStepForRepeatingEndMigration()) - .next(createStepForRepeatingEndAfterXTimesMigration()) - .next(createStepForRepeatingEndDateMigration()) - .next(createStepForRepeatingEndNeverMigration()) - - // repeating modifiers - .next(createStepForRepeatingModifierMigration()) - .next(createStepForRepeatingModifierDaysMigration()) - .next(createStepForRepeatingModifierMonthsMigration()) - .next(createStepForRepeatingModifierYearsMigration()) - - .next(createStepForRepeatingOptionMigration()) - - .next(createStepForReportSettingsMigration()) - .next(createStepForReportColumnMigration()) - - .next(createStepForSettingsMigration()) - .next(createStepForUserMigration()) - - .next(createStepForTransactionMigration()) - - .next(createStepForTemplateGroupMigration()) - .next(createStepForTemplateMigration()) - - .next(createStepForTagMigration()) - .next(createStepForTemplateTagMigration()) - .next(createStepForTransactionTagMigration()) - - .listener(new GenericJobListener()) - .build(); - } - - @Bean - public Step createStepForImageMigration() - { - return stepBuilderFactory.get(StepNames.IMAGES) - .<DestinationImage, DestinationImage>chunk(1) - .reader(new ImageReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationImageRepository)) - .listener(new GenericChunkListener(TableNames.IMAGE)) - .listener(new GenericStepListener<>(TableNames.IMAGE, destinationImageRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForIconMigration() - { - return stepBuilderFactory.get(StepNames.ICONS) - .<DestinationIcon, DestinationIcon>chunk(1) - .reader(new IconReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationIconRepository)) - .listener(new GenericChunkListener(TableNames.ICON)) - .listener(new GenericStepListener<>(TableNames.ICON, destinationIconRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForCategoryMigration() - { - return stepBuilderFactory.get(StepNames.CATEGORIES) - .<DestinationCategory, DestinationCategory>chunk(1) - .reader(new CategoryReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationCategoryRepository)) - .listener(new GenericChunkListener(TableNames.CATEGORY)) - .listener(new GenericStepListener<>(TableNames.CATEGORY, destinationCategoryRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForAccountMigration() - { - return stepBuilderFactory.get(StepNames.ACCOUNTS) - .<DestinationAccount, DestinationAccount>chunk(1) - .reader(new AccountReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationAccountRepository)) - .listener(new GenericChunkListener(TableNames.ACCOUNT)) - .listener(new GenericStepListener<>(TableNames.ACCOUNT, destinationAccountRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForChartMigration() - { - return stepBuilderFactory.get(StepNames.CHARTS) - .<DestinationChart, DestinationChart>chunk(1) - .reader(new ChartReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationChartRepository)) - .listener(new GenericChunkListener(TableNames.CHART)) - .listener(new GenericStepListener<>(TableNames.CHART, destinationChartRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForHintMigration() - { - return stepBuilderFactory.get(StepNames.HINTS) - .<DestinationHint, DestinationHint>chunk(1) - .reader(new HintReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationHintRepository)) - .listener(new GenericChunkListener(TableNames.HINT)) - .listener(new GenericStepListener<>(TableNames.HINT, destinationHintRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingEndMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_ENDS) - .<DestinationRepeatingEnd, DestinationRepeatingEnd>chunk(1) - .reader(new RepeatingEndReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingEndRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_END)) - .listener(new GenericStepListener<>(TableNames.REPEATING_END, destinationRepeatingEndRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingEndAfterXTimesMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_END_AFTER_X_TIMES) - .<DestinationRepeatingEndAfterXTimes, DestinationRepeatingEndAfterXTimes>chunk(1) - .reader(new RepeatingEndAfterXTimesReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingEndAfterXTimesRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_END_AFTER_X_TIMES)) - .listener(new GenericStepListener<>(TableNames.REPEATING_END_AFTER_X_TIMES, destinationRepeatingEndAfterXTimesRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingEndDateMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_END_DATE) - .<DestinationRepeatingEndDate, DestinationRepeatingEndDate>chunk(1) - .reader(new RepeatingEndDateReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingEndDateRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_END_DATE)) - .listener(new GenericStepListener<>(TableNames.REPEATING_END_DATE, destinationRepeatingEndDateRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingEndNeverMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_END_NEVER) - .<DestinationRepeatingEndNever, DestinationRepeatingEndNever>chunk(1) - .reader(new RepeatingEndNeverReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingEndNeverRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_END_NEVER)) - .listener(new GenericStepListener<>(TableNames.REPEATING_END_NEVER, destinationRepeatingEndNeverRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingModifierMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_MODIFIERS) - .<DestinationRepeatingModifier, DestinationRepeatingModifier>chunk(1) - .reader(new RepeatingModifierReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingModifierRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_MODIFIER)) - .listener(new GenericStepListener<>(TableNames.REPEATING_MODIFIER, destinationRepeatingModifierRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingModifierDaysMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_MODIFIER_DAYS) - .<DestinationRepeatingModifierDays, DestinationRepeatingModifierDays>chunk(1) - .reader(new RepeatingModifierDaysReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingModifierDaysRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_MODIFIER_DAYS)) - .listener(new GenericStepListener<>(TableNames.REPEATING_MODIFIER_DAYS, destinationRepeatingModifierDaysRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingModifierMonthsMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_MODIFIER_MONTHS) - .<DestinationRepeatingModifierMonths, DestinationRepeatingModifierMonths>chunk(1) - .reader(new RepeatingModifierMonthsReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingModifierMonthsRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_MODIFIER_MONTHS)) - .listener(new GenericStepListener<>(TableNames.REPEATING_MODIFIER_MONTHS, destinationRepeatingModifierMonthsRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingModifierYearsMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_MODIFIER_YEARS) - .<DestinationRepeatingModifierYears, DestinationRepeatingModifierYears>chunk(1) - .reader(new RepeatingModifierYearsReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingModifierYearsRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_MODIFIER_YEARS)) - .listener(new GenericStepListener<>(TableNames.REPEATING_MODIFIER_YEARS, destinationRepeatingModifierYearsRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForRepeatingOptionMigration() - { - return stepBuilderFactory.get(StepNames.REPEATING_OPTIONS) - .<DestinationRepeatingOption, DestinationRepeatingOption>chunk(1) - .reader(new RepeatingOptionReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationRepeatingOptionRepository)) - .listener(new GenericChunkListener(TableNames.REPEATING_OPTION)) - .listener(new GenericStepListener<>(TableNames.REPEATING_OPTION, destinationRepeatingOptionRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForReportColumnMigration() - { - return stepBuilderFactory.get(StepNames.REPORT_COLUMNS) - .<DestinationReportColumn, DestinationReportColumn>chunk(1) - .reader(new ReportColumnReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationReportColumnRepository)) - .listener(new GenericChunkListener(TableNames.REPORT_COLUMN)) - .listener(new GenericStepListener<>(TableNames.REPORT_COLUMN, destinationReportColumnRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForReportSettingsMigration() - { - return stepBuilderFactory.get(StepNames.REPORT_SETTINGS) - .<DestinationReportSettings, DestinationReportSettings>chunk(1) - .reader(new ReportSettingsReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationReportSettingsRepository)) - .listener(new GenericChunkListener(TableNames.REPORT_SETTINGS)) - .listener(new GenericStepListener<>(TableNames.REPORT_SETTINGS, destinationReportSettingsRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForSettingsMigration() - { - return stepBuilderFactory.get(StepNames.SETTINGS) - .<DestinationSettings, DestinationSettings>chunk(1) - .reader(new SettingsReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationSettingsRepository)) - .listener(new GenericChunkListener(TableNames.SETTINGS)) - .listener(new GenericStepListener<>(TableNames.SETTINGS, destinationSettingsRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForTagMigration() - { - return stepBuilderFactory.get(StepNames.TAGS) - .<DestinationTag, DestinationTag>chunk(1) - .reader(new TagReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationTagRepository)) - .listener(new GenericChunkListener(TableNames.TAG)) - .listener(new GenericStepListener<>(TableNames.TAG, destinationTagRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForTemplateTagMigration() - { - return stepBuilderFactory.get(StepNames.TEMPLATE_TAGS) - .<DestinationTemplateTag, DestinationTemplateTag>chunk(1) - .reader(new TemplateTagReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationTemplateTagRepository)) - .listener(new GenericChunkListener(TableNames.TEMPLATE_TAGS)) - .listener(new GenericStepListener<>(TableNames.TEMPLATE_TAGS, destinationTemplateTagRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForTransactionTagMigration() - { - return stepBuilderFactory.get(StepNames.TRANSACTION_TAGS) - .<DestinationTransactionTag, DestinationTransactionTag>chunk(1) - .reader(new TransactionTagReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationTransactionTagRepository)) - .listener(new GenericChunkListener(TableNames.TRANSACTION_TAGS)) - .listener(new GenericStepListener<>(TableNames.TRANSACTION_TAGS, destinationTransactionTagRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), false)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForUserMigration() - { - return stepBuilderFactory.get(StepNames.USER) - .<DestinationUser, DestinationUser>chunk(1) - .reader(new UserReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationUserRepository)) - .listener(new GenericChunkListener(TableNames.USER_SOURCE)) - .listener(new GenericStepListener<>(TableNames.USER_DESTINATION, destinationUserRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForTransactionMigration() - { - return stepBuilderFactory.get(StepNames.TRANSACTIONS) - .<DestinationTransaction, DestinationTransaction>chunk(1) - .reader(new TransactionReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationTransactionRepository)) - .listener(new GenericChunkListener(TableNames.TRANSACTION)) - .listener(new GenericStepListener<>(TableNames.TRANSACTION, destinationTransactionRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForTemplateMigration() - { - return stepBuilderFactory.get(StepNames.TEMPLATES) - .<DestinationTemplate, DestinationTemplate>chunk(1) - .reader(new TemplateReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationTemplateRepository)) - .listener(new GenericChunkListener(TableNames.TEMPLATE)) - .listener(new GenericStepListener<>(TableNames.TEMPLATE, destinationTemplateRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } - - @Bean - public Step createStepForTemplateGroupMigration() - { - return stepBuilderFactory.get(StepNames.TEMPLATE_GROUPS) - .<DestinationTemplateGroup, DestinationTemplateGroup>chunk(1) - .reader(new TemplateGroupReader(primaryDataSource)) - .processor(new GenericDoNothingProcessor<>()) - .writer(new GenericWriter<>(destinationTemplateGroupRepository)) - .listener(new GenericChunkListener(TableNames.TEMPLATE_GROUP)) - .listener(new GenericStepListener<>(TableNames.TEMPLATE_GROUP, destinationTemplateGroupRepository, context.getBean("jdbcTemplate2", JdbcTemplate.class), true)) - .allowStartIfComplete(true) - .build(); - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CommandLineOptions.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CommandLineOptions.java deleted file mode 100644 index 88746d544..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CommandLineOptions.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -public enum CommandLineOptions -{ - SOURCE_URL("spring.datasource.jdbc-url", "source h2 database JDBC url, e.g. jdbc:h2:/C:/Users/Admin/AppData/Roaming/Deadlocker/BudgetMaster/debug/budgetmaster"), - DESTINATION_URL("spring.seconddatasource.jdbc-url", "destination database JDBC url (postgres ir mariadb), e.g. jdbc:postgresql://localhost:5432/budgetmaster"), - DESTINATION_DRIVER_CLASS_NAME("spring.seconddatasource.driver-class-name", "destination database driver class name, e.g. org.postgresql.Driver or org.mariadb.jdbc.Driver"), - DESTINATION_USER_NAME("spring.seconddatasource.username", "destination postresql user name, e.g. budgetmaster"), - DESTINATION_PASSWORD("spring.seconddatasource.password", "destination postresql password, e.g. BudgetMaster"); - - private final String name; - private final String description; - - CommandLineOptions(String name, String description) - { - this.name = name; - this.description = description; - } - - public String getName() - { - return name; - } - - public String getDescription() - { - return description; - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CustomIdGenerator.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CustomIdGenerator.java deleted file mode 100644 index 96be32804..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/CustomIdGenerator.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.id.IdentifierGenerator; -import org.hibernate.id.IdentityGenerator; - -import java.io.Serializable; - - -public class CustomIdGenerator extends IdentityGenerator implements IdentifierGenerator -{ - public static final String GENERATOR = "de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator"; - - @Override - public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException - { - final Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session); - - if(id == null) - { - return super.generate(session, object); - } - else - { - return id; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java deleted file mode 100644 index df58e3280..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java +++ /dev/null @@ -1,82 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import org.apache.commons.cli.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobParametersBuilder; -import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DatabaseMigratorMain implements CommandLineRunner -{ - public static DatabaseType databaseType; - - private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseMigratorMain.class); - - private final JobLauncher jobLauncher; - - private final BatchConfiguration batchConfiguration; - - @Qualifier("migrateJob") - private final Job migrateJob; - - public DatabaseMigratorMain(JobLauncher jobLauncher, BatchConfiguration batchConfiguration, Job migrateJob) - { - this.jobLauncher = jobLauncher; - this.batchConfiguration = batchConfiguration; - this.migrateJob = migrateJob; - } - - public static void main(String[] args) throws ParseException - { - final Options commandLineOptions = new Options(); - for(CommandLineOptions option : CommandLineOptions.values()) - { - commandLineOptions.addRequiredOption(null, option.getName(), true, option.getDescription()); - } - - showHelpIfRequested(args, commandLineOptions); - - final CommandLineParser parser = new DefaultParser(); - final CommandLine cmd = parser.parse(commandLineOptions, args); - - for(CommandLineOptions option : CommandLineOptions.values()) - { - LOGGER.debug("{}={}", option.getName(), cmd.getOptionValue(option.getName())); - } - - databaseType = DatabaseType.fromDriverClassName(cmd.getOptionValue(CommandLineOptions.DESTINATION_DRIVER_CLASS_NAME.getName())); - - SpringApplication.run(DatabaseMigratorMain.class, args); - } - - private static void showHelpIfRequested(String[] args, Options availableCommandLineOptions) throws ParseException - { - final Options commandLineOptions = new Options(); - commandLineOptions.addOption("h", "help", false, "Print this help"); - - final CommandLineParser parser = new DefaultParser(); - final CommandLine cmd = parser.parse(commandLineOptions, args, true); - - if(cmd.hasOption("help")) - { - final HelpFormatter formatter = new HelpFormatter(); - formatter.setWidth(200); - formatter.printHelp("BudgetMasterMigrator", availableCommandLineOptions); - System.exit(0); - } - } - - @Override - public void run(String... args) throws Exception - { - batchConfiguration.cleanDatabase(); - - jobLauncher.run(migrateJob, new JobParametersBuilder().toJobParameters()); - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseType.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseType.java deleted file mode 100644 index 0725be421..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseType.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -public enum DatabaseType -{ - POSTGRESQL("org.postgresql.Driver"), - MARIADB( "org.mariadb.jdbc.Driver"); - - private final String driverClassName; - - DatabaseType(String driverClassName) - { - this.driverClassName = driverClassName; - } - - - public String getDriverClassName() - { - return driverClassName; - } - - public static DatabaseType fromDriverClassName(String driverClassName) - { - for(DatabaseType type : values()) - { - if(type.getDriverClassName().equalsIgnoreCase(driverClassName)) - { - return type; - } - } - - return null; - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/Utils.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/Utils.java deleted file mode 100644 index b885385b4..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/Utils.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.StepExecution; - -public class Utils -{ - private Utils() - { - // empty - } - - public static int getCommitCount(StepExecution stepExecution) - { - final int commitCount = stepExecution.getCommitCount(); - if(commitCount > 0 || stepExecution.getStatus().equals(BatchStatus.COMPLETED)) - { - // subtract one because the commit count includes the final commit transaction - return commitCount - 1; - } - else - { - return commitCount; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationDatabaseConfiguration.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationDatabaseConfiguration.java deleted file mode 100644 index 877baddad..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationDatabaseConfiguration.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories( - entityManagerFactoryRef = "secondaryEntityManagerFactory", - transactionManagerRef = "secondaryTransactionManager", - basePackages = {"de.deadlocker8.budgetmaster.databasemigrator.destination"} -) -public class DestinationDatabaseConfiguration -{ - @Bean(name = "secondaryDataSource") - @ConfigurationProperties(prefix = "spring.seconddatasource") - public DataSource secondaryDataSource() - { - return DataSourceBuilder.create().build(); - } - - @Bean(name = "secondaryEntityManagerFactory") - public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder, - @Qualifier("secondaryDataSource") DataSource secondaryDataSource) - { - return builder - .dataSource(secondaryDataSource) - .packages("de.deadlocker8.budgetmaster.databasemigrator.destination") - .build(); - } - - @Bean(name = "secondaryTransactionManager") - public PlatformTransactionManager secondaryTransactionManager( - @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory secondaryEntityManagerFactory) - { - return new JpaTransactionManager(secondaryEntityManagerFactory); - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationIntegerRepository.java deleted file mode 100644 index f6e9f44b0..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationIntegerRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination; - -import org.springframework.data.repository.NoRepositoryBean; - -import java.util.List; - -@NoRepositoryBean -public interface DestinationIntegerRepository<T, ID> extends DestinationRepository<T, ID> -{ - List<T> findAllByOrderByIDDesc(); -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationRepository.java deleted file mode 100644 index d2f6affde..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/DestinationRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.NoRepositoryBean; - -@NoRepositoryBean -public interface DestinationRepository<T, ID> extends JpaRepository<T, ID> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/ProvidesID.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/ProvidesID.java deleted file mode 100644 index 4a4d9a1dd..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/ProvidesID.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination; - -public interface ProvidesID -{ - Integer getID(); - - void setID(Integer ID); -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/StepNames.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/StepNames.java deleted file mode 100644 index ce50ba387..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/StepNames.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination; - -public class StepNames -{ - private StepNames() - { - // empty - } - - public static final String IMAGES = "Migrate images"; - public static final String ICONS = "Migrate icons"; - public static final String CATEGORIES = "Migrate categories"; - public static final String ACCOUNTS = "Migrate accounts"; - public static final String CHARTS = "Migrate charts"; - public static final String HINTS = "Migrate hints"; - - public static final String REPEATING_ENDS = "Migrate repeating end options"; - public static final String REPEATING_END_AFTER_X_TIMES = "Migrate repeating end after x times"; - public static final String REPEATING_END_DATE = "Migrate repeating end after date"; - public static final String REPEATING_END_NEVER = "Migrate repeating end never"; - - public static final String REPEATING_MODIFIERS = "Migrate repeating modifiers"; - public static final String REPEATING_MODIFIER_DAYS = "Migrate repeating modifier days"; - public static final String REPEATING_MODIFIER_MONTHS = "Migrate repeating modifier months"; - public static final String REPEATING_MODIFIER_YEARS = "Migrate repeating modifier years"; - - public static final String REPEATING_OPTIONS = "Migrate repeating options"; - - public static final String REPORT_COLUMNS = "Migrate report columns"; - public static final String REPORT_SETTINGS = "Migrate report settings"; - - public static final String SETTINGS = "Migrate settings"; - - public static final String TAGS = "Migrate tags"; - public static final String TEMPLATE_TAGS = "Migrate template tags"; - public static final String TRANSACTION_TAGS = "Migrate transaction tags"; - - public static final String USER = "Migrate user"; - - public static final String TRANSACTIONS = "Migrate transactions"; - public static final String TEMPLATES = "Migrate templates"; - public static final String TEMPLATE_GROUPS = "Migrate template groups"; -} - diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/TableNames.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/TableNames.java deleted file mode 100644 index cecfc04e4..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/TableNames.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination; - -public class TableNames -{ - private TableNames() - { - // empty - } - - public static final String IMAGE = "image"; - public static final String ICON = "icon"; - public static final String CATEGORY = "category"; - public static final String ACCOUNT = "account"; - public static final String CHART = "chart"; - public static final String HINT = "hint"; - - public static final String REPEATING_END = "repeating_end"; - public static final String REPEATING_END_AFTER_X_TIMES = "repeating_end_afterxtimes"; - public static final String REPEATING_END_DATE = "repeating_end_date"; - public static final String REPEATING_END_NEVER = "repeating_end_never"; - - public static final String REPEATING_MODIFIER = "repeating_modifier"; - public static final String REPEATING_MODIFIER_DAYS = "repeating_modifier_days"; - public static final String REPEATING_MODIFIER_MONTHS = "repeating_modifier_months"; - public static final String REPEATING_MODIFIER_YEARS = "repeating_modifier_years"; - - public static final String REPEATING_OPTION = "repeating_option"; - - public static final String REPORT_COLUMN = "report_column"; - public static final String REPORT_SETTINGS = "report_settings"; - - public static final String SETTINGS = "settings"; - - public static final String TAG = "tag"; - public static final String TEMPLATE_TAGS = "template_tags"; - public static final String TRANSACTION_TAGS = "transaction_tags"; - - public static final String USER_SOURCE = "user"; - public static final String USER_DESTINATION = "login_user"; - - public static final String TRANSACTION = "transaction"; - public static final String TEMPLATE = "template"; - public static final String TEMPLATE_GROUP = "template_group"; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccount.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccount.java deleted file mode 100644 index 71e863aca..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccount.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.account; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.ACCOUNT) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationAccount implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - @Column(unique = true) - private String name; - - @Column(name = "is_selected") - private boolean isSelected; - - @Column(name = "is_default") - private boolean isDefault; - - @Column(name = "account_state") - private Integer accountState; - - @Column(name = "icon_reference_id") - private Integer iconReferenceID; - - private Integer type; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccountIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccountIntegerRepository.java deleted file mode 100644 index 2e106fc94..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/account/DestinationAccountIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.account; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationAccountIntegerRepository extends DestinationIntegerRepository<DestinationAccount, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategory.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategory.java deleted file mode 100644 index 3f89c0b79..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategory.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.category; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.CATEGORY) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationCategory implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private String name; - - private String color; - - private Integer type; - - @Column(name = "icon_reference_id") - private Integer iconReferenceID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategoryIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategoryIntegerRepository.java deleted file mode 100644 index 0c41fd22c..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/category/DestinationCategoryIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.category; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationCategoryIntegerRepository extends DestinationIntegerRepository<DestinationCategory, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChart.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChart.java deleted file mode 100644 index fa6031c1a..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChart.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.chart; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.CHART) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationChart implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private String name; - - @Column(columnDefinition = "TEXT") - @ToString.Exclude - private String script; - - private Integer type; - private int version; - - @Column(name = "display_type") - private Integer displayType; - - @Column(name = "group_type") - private Integer groupType; - - @Column(name = "preview_image_file_name") - private String previewImageFileName; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChartIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChartIntegerRepository.java deleted file mode 100644 index b0031c9c4..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/chart/DestinationChartIntegerRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.chart; - - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationChartIntegerRepository extends DestinationIntegerRepository<DestinationChart, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHint.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHint.java deleted file mode 100644 index b51fbbde3..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHint.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.hint; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.HINT) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationHint implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - @Column(name = "localization_key") - private String localizationKey; - - @Column(name = "is_dismissed") - private boolean isDismissed; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHintIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHintIntegerRepository.java deleted file mode 100644 index 7f25f2cec..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/hint/DestinationHintIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.hint; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationHintIntegerRepository extends DestinationIntegerRepository<DestinationHint, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIcon.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIcon.java deleted file mode 100644 index b6b7b2c98..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIcon.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.icon; - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.ICON) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationIcon implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - @Column(name = "image_id") - private Integer imageID; - - @Column(name = "builtin_identifier") - private String builtinIdentifier; - - @Column(name = "font_color") - private String fontColor; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIconIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIconIntegerRepository.java deleted file mode 100644 index ca8481c65..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/icon/DestinationIconIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.icon; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationIconIntegerRepository extends DestinationIntegerRepository<DestinationIcon, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImage.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImage.java deleted file mode 100644 index f750dc76d..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImage.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.image; - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.IMAGE) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationImage implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - @Lob - @ToString.Exclude - private byte[] image; - - @Column(name = "file_name") - private String fileName; - - @Column(name = "file_extension") - private Integer fileExtension; -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImageIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImageIntegerRepository.java deleted file mode 100644 index 6583a677b..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/image/DestinationImageIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.image; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationImageIntegerRepository extends DestinationIntegerRepository<DestinationImage, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOption.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOption.java deleted file mode 100644 index eb89e70d0..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOption.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; -import java.time.LocalDate; - -@Entity -@Table(name = TableNames.REPEATING_OPTION) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingOption implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - @Column(name = "start_date") - private LocalDate startDate; - - @Column(name = "end_option_id") - private Integer endOptionID; - - @Column(name = "modifier_id") - private Integer modifierID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOptionIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOptionIntegerRepository.java deleted file mode 100644 index 623f5737b..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/DestinationRepeatingOptionIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingOptionIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingOption, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEnd.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEnd.java deleted file mode 100644 index ddcc64123..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEnd.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.REPEATING_END) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingEnd implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - - private Integer ID; - - @Column(name = "localization_key") - private String localizationKey; - - private String type; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimes.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimes.java deleted file mode 100644 index 784fcd9c8..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimes.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = TableNames.REPEATING_END_AFTER_X_TIMES) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingEndAfterXTimes implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - - private Integer ID; - - private Integer times; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimesIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimesIntegerRepository.java deleted file mode 100644 index dab8aea1f..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndAfterXTimesIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingEndAfterXTimesIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingEndAfterXTimes, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDate.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDate.java deleted file mode 100644 index 0e81e1898..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDate.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; -import java.time.LocalDate; - -@Entity -@Table(name = TableNames.REPEATING_END_DATE) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingEndDate implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - - private Integer ID; - - @Column(name = "end_date") - private LocalDate endDate; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDateIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDateIntegerRepository.java deleted file mode 100644 index d3ea8c693..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndDateIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingEndDateIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingEndDate, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndIntegerRepository.java deleted file mode 100644 index 6e3bce339..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingEndIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingEnd, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNever.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNever.java deleted file mode 100644 index 7ed0ef451..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNever.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = TableNames.REPEATING_END_NEVER) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingEndNever implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - - private Integer ID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNeverIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNeverIntegerRepository.java deleted file mode 100644 index e54bc8c7e..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/end/DestinationRepeatingEndNeverIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingEndNeverIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingEndNever, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifier.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifier.java deleted file mode 100644 index b0034154f..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifier.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.REPEATING_MODIFIER) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingModifier implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - @Column(name = "localization_key") - private String localizationKey; - - private String type; - - private Integer quantity; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDays.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDays.java deleted file mode 100644 index 9ce7fe377..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDays.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = TableNames.REPEATING_MODIFIER_DAYS) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingModifierDays implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDaysIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDaysIntegerRepository.java deleted file mode 100644 index 8ce35b046..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierDaysIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingModifierDaysIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingModifierDays, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierIntegerRepository.java deleted file mode 100644 index 05c5eebf9..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingModifierIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingModifier, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonths.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonths.java deleted file mode 100644 index 11396244a..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonths.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = TableNames.REPEATING_MODIFIER_MONTHS) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingModifierMonths implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonthsIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonthsIntegerRepository.java deleted file mode 100644 index b498c5a14..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierMonthsIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingModifierMonthsIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingModifierMonths, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYears.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYears.java deleted file mode 100644 index 00ef17011..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYears.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = TableNames.REPEATING_MODIFIER_YEARS) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationRepeatingModifierYears implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYearsIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYearsIntegerRepository.java deleted file mode 100644 index 7531f8fb1..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/repeating/modifier/DestinationRepeatingModifierYearsIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationRepeatingModifierYearsIntegerRepository extends DestinationIntegerRepository<DestinationRepeatingModifierYears, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumn.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumn.java deleted file mode 100644 index c85efde7d..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumn.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.report; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.REPORT_COLUMN) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationReportColumn implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private boolean activated; - - @Column(name = "localization_key") - private String localizationKey; - - @Column(name = "column_position") - private Integer columnPosition; - - @Column(name = "referring_settings_id") - private Integer referringSettingsID = 1; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumnIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumnIntegerRepository.java deleted file mode 100644 index 45ec29d68..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportColumnIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.report; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationReportColumnIntegerRepository extends DestinationIntegerRepository<DestinationReportColumn, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettings.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettings.java deleted file mode 100644 index 69e8626c8..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettings.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.report; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; -import java.time.LocalDate; - -@Entity -@Table(name = TableNames.REPORT_SETTINGS) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationReportSettings implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private LocalDate date; - - @Column(name = "include_budget") - private boolean includeBudget; - - @Column(name = "include_category_budgets") - private boolean includeCategoryBudgets; - - @Column(name = "split_tables") - private boolean splitTables; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettingsIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettingsIntegerRepository.java deleted file mode 100644 index f44226f29..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/report/DestinationReportSettingsIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.report; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationReportSettingsIntegerRepository extends DestinationIntegerRepository<DestinationReportSettings, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettings.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettings.java deleted file mode 100644 index 2166bdb34..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettings.java +++ /dev/null @@ -1,85 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.settings; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; -import java.time.LocalDate; - -@Entity -@Table(name = TableNames.SETTINGS) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationSettings implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private String currency; - - @Column(name = "rest_activated") - private boolean restActivated; - - private Integer language; - - @Column(name = "use_dark_theme") - private boolean useDarkTheme; - - @Column(name = "show_categories_as_circles") - private boolean showCategoriesAsCircles; - - @Column(name = "auto_update_check_enabled") - private boolean autoUpdateCheckEnabled; - - @Column(name = "backup_reminder_activated") - private boolean backupReminderActivated; - - @Column(name = "last_backup_reminder_date") - private LocalDate lastBackupReminderDate; - - @Column(name = "search_items_per_page") - private Integer searchItemsPerPage; - - @Column(name = "auto_backup_strategy") - private Integer autoBackupStrategy; - - @Column(name = "auto_backup_days") - private Integer autoBackupDays; - - @Column(name = "auto_backup_time") - private Integer autoBackupTime; - - @Column(name = "auto_backup_files_to_keep") - private Integer autoBackupFilesToKeep; - - @Column(name = "auto_backup_git_url") - private String autoBackupGitUrl; - - @Column(name = "auto_backup_git_branch_name") - private String autoBackupGitBranchName; - - @Column(name = "auto_backup_git_user_name") - private String autoBackupGitUserName; - - @Column(name = "auto_backup_git_token") - private String autoBackupGitToken; - - @Column(name = "installed_version_code") - private Integer installedVersionCode; - - @Column(name = "whats_new_shown_for_current_version") - private Boolean whatsNewShownForCurrentVersion; - - @Column(name = "migration_declined") - private Boolean migrationDeclined = false; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettingsIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettingsIntegerRepository.java deleted file mode 100644 index a8f0e0853..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/settings/DestinationSettingsIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.settings; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationSettingsIntegerRepository extends DestinationIntegerRepository<DestinationSettings, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTag.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTag.java deleted file mode 100644 index 4745f3589..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTag.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.tag; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = TableNames.TAG) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationTag implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private String name; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTagIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTagIntegerRepository.java deleted file mode 100644 index 6c62aeff5..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTagIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.tag; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationTagIntegerRepository extends DestinationIntegerRepository<DestinationTag, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTag.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTag.java deleted file mode 100644 index f5552fca2..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTag.java +++ /dev/null @@ -1,97 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.tag; - - -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; - -import javax.persistence.*; -import java.io.Serial; -import java.io.Serializable; -import java.util.Objects; - -@Entity -@Table(name = TableNames.TEMPLATE_TAGS) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -@IdClass(DestinationTemplateTag.DestinationTemplateTagId.class) -public class DestinationTemplateTag implements ProvidesID -{ - public static final class DestinationTemplateTagId implements Serializable - { - @Serial - private static final long serialVersionUID = 0L; - private Integer templateID; - private Integer tagsID; - - public DestinationTemplateTagId(Integer templateID, Integer tagsID) - { - this.templateID = templateID; - this.tagsID = tagsID; - } - - public DestinationTemplateTagId() - { - } - - public Integer templateID() - { - return templateID; - } - - public Integer tagsID() - { - return tagsID; - } - - @Override - public boolean equals(Object obj) - { - if(obj == this) return true; - if(obj == null || obj.getClass() != this.getClass()) return false; - var that = (DestinationTemplateTagId) obj; - return Objects.equals(this.templateID, that.templateID) && - Objects.equals(this.tagsID, that.tagsID); - } - - @Override - public int hashCode() - { - return Objects.hash(templateID, tagsID); - } - - @Override - public String toString() - { - return "DestinationTemplateTagId[" + - "templateID=" + templateID + ", " + - "tagsID=" + tagsID + ']'; - } - - } - - @Id - @Column(name = "template_id") - private int templateID; - - @Id - @Column(name = "tags_id") - private int tagsID; - - @Override - public Integer getID() - { - return null; - } - - @Override - public void setID(Integer ID) - { - // not allowed - } -} - diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTagIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTagIntegerRepository.java deleted file mode 100644 index 327d8bfc4..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTemplateTagIntegerRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.tag; - - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationRepository; - -public interface DestinationTemplateTagIntegerRepository extends DestinationRepository<DestinationTemplateTag, DestinationTemplateTag.DestinationTemplateTagId> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTag.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTag.java deleted file mode 100644 index 9c4215e4e..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTag.java +++ /dev/null @@ -1,96 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.tag; - - -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; - -import javax.persistence.*; -import java.io.Serial; -import java.io.Serializable; -import java.util.Objects; - -@Entity -@Table(name = TableNames.TRANSACTION_TAGS) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -@IdClass(DestinationTransactionTag.DestinationTransactionTagId.class) -public class DestinationTransactionTag implements ProvidesID -{ - public static final class DestinationTransactionTagId implements Serializable - { - @Serial - private static final long serialVersionUID = 0L; - private Integer transactionID; - private Integer tagsID; - - public DestinationTransactionTagId(Integer transactionID, Integer tagsID) - { - this.transactionID = transactionID; - this.tagsID = tagsID; - } - - public DestinationTransactionTagId() - { - } - - public Integer transactionID() - { - return transactionID; - } - - public Integer tagsID() - { - return tagsID; - } - - @Override - public boolean equals(Object obj) - { - if(obj == this) return true; - if(obj == null || obj.getClass() != this.getClass()) return false; - var that = (DestinationTransactionTagId) obj; - return Objects.equals(this.transactionID, that.transactionID) && - Objects.equals(this.tagsID, that.tagsID); - } - - @Override - public int hashCode() - { - return Objects.hash(transactionID, tagsID); - } - - @Override - public String toString() - { - return "DestinationTransactionTagId[" + - "transactionID=" + transactionID + ", " + - "tagsID=" + tagsID + ']'; - } - - } - - @Id - @Column(name = "transaction_id") - private int transactionID; - - @Id - @Column(name = "tags_id") - private int tagsID; - - @Override - public Integer getID() - { - return null; - } - - @Override - public void setID(Integer ID) - { - // not allowed - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTagIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTagIntegerRepository.java deleted file mode 100644 index 86454f068..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/tag/DestinationTransactionTagIntegerRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.tag; - - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationRepository; - -public interface DestinationTransactionTagIntegerRepository extends DestinationRepository<DestinationTransactionTag, DestinationTransactionTag.DestinationTransactionTagId> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplate.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplate.java deleted file mode 100644 index 56c175f2b..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplate.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.template; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.TEMPLATE) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationTemplate implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - @Column(name = "template_name") - private String templateName; - - private Integer amount; - - @Column(name = "is_expenditure") - private Boolean isExpenditure; - - @Column(name = "account_id") - private Integer accountID; - - @Column(name = "category_id") - private Integer categoryID; - - private String name; - - private String description; - - @Column(name = "icon_reference_id") - private Integer iconReferenceID; - - @Column(name = "transfer_account_id") - private Integer transferAccountID; - - @Column(name = "template_group_id") - private Integer templateGroupID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplateIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplateIntegerRepository.java deleted file mode 100644 index 2751c32b7..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/template/DestinationTemplateIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.template; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationTemplateIntegerRepository extends DestinationIntegerRepository<DestinationTemplate, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroup.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroup.java deleted file mode 100644 index 7f66d18a8..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroup.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.templateGroup; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = TableNames.TEMPLATE_GROUP) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationTemplateGroup implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private String name; - - private Integer type; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroupIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroupIntegerRepository.java deleted file mode 100644 index 2bdab8fd4..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/templateGroup/DestinationTemplateGroupIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.templateGroup; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationTemplateGroupIntegerRepository extends DestinationIntegerRepository<DestinationTemplateGroup, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransaction.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransaction.java deleted file mode 100644 index ecf13ba5b..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransaction.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.transaction; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; -import java.time.LocalDate; - -@Entity -@Table(name = TableNames.TRANSACTION) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationTransaction implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private Integer amount; - - @Column(name = "is_expenditure") - private Boolean isExpenditure; - - private LocalDate date; - - @Column(name = "account_id") - private Integer accountID; - - @Column(name = "category_id") - private Integer categoryID; - - private String name; - - private String description; - - @Column(name = "repeating_option_id") - private Integer repeatingOptionID; - - @Column(name = "transfer_account_id") - private Integer transferAccountID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransactionIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransactionIntegerRepository.java deleted file mode 100644 index 7d3f67f0c..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/transaction/DestinationTransactionIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.transaction; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationTransactionIntegerRepository extends DestinationIntegerRepository<DestinationTransaction, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUser.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUser.java deleted file mode 100644 index 720c88b41..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUser.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.user; - - -import de.deadlocker8.budgetmaster.databasemigrator.CustomIdGenerator; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import lombok.*; -import org.hibernate.annotations.GenericGenerator; - -import javax.persistence.*; - -@Entity -@Table(name = TableNames.USER_DESTINATION) -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@EqualsAndHashCode -@ToString -public class DestinationUser implements ProvidesID -{ - @Id - @GeneratedValue(generator = "custom_generator") - @GenericGenerator(name = "custom_generator", strategy = CustomIdGenerator.GENERATOR) - private Integer ID; - - private String name; - - private String password; - - @Column(name = "selected_account_id") - private Integer selectedAccountID; -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUserIntegerRepository.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUserIntegerRepository.java deleted file mode 100644 index 6d7c86cb2..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/destination/user/DestinationUserIntegerRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.destination.user; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; - -public interface DestinationUserIntegerRepository extends DestinationIntegerRepository<DestinationUser, Integer> -{ -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericChunkListener.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericChunkListener.java deleted file mode 100644 index c19b1ab08..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericChunkListener.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.listener; - -import de.deadlocker8.budgetmaster.databasemigrator.Utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.core.ChunkListener; -import org.springframework.batch.core.scope.context.ChunkContext; - -public class GenericChunkListener implements ChunkListener -{ - private static final Logger LOGGER = LoggerFactory.getLogger(GenericChunkListener.class); - - private final String itemName; - - private int numberOfProcessedItems = 0; - - public GenericChunkListener(String itemName) - { - this.itemName = itemName; - } - - @Override - public void beforeChunk(ChunkContext context) - { - // nothing to do - } - - @Override - public void afterChunk(ChunkContext context) - { - final int count = Utils.getCommitCount(context.getStepContext().getStepExecution()); - if(count > numberOfProcessedItems) - { - numberOfProcessedItems++; - LOGGER.info("Migrating {} {}", itemName, count); - } - } - - @Override - public void afterChunkError(ChunkContext context) - { - // nothing to do - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericJobListener.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericJobListener.java deleted file mode 100644 index f39661929..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericJobListener.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.listener; - -import de.deadlocker8.budgetmaster.databasemigrator.Utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobExecutionListener; -import org.springframework.batch.core.StepExecution; - -public class GenericJobListener implements JobExecutionListener -{ - private static final Logger LOGGER = LoggerFactory.getLogger(GenericJobListener.class); - - @Override - public void beforeJob(JobExecution jobExecution) - { - // nothing to do - } - - @Override - public void afterJob(JobExecution jobExecution) - { - LOGGER.info("\n"); - LOGGER.info("=================================================="); - LOGGER.info("### Migration results ###"); - for(StepExecution stepExecution : jobExecution.getStepExecutions()) - { - final BatchStatus status = stepExecution.getStatus(); - final String name = stepExecution.getStepName(); - final int commitCount = Utils.getCommitCount(stepExecution); - final int readCount = stepExecution.getReadCount(); - LOGGER.info("[{}] {}: {}/{}", status, name, commitCount, readCount); - } - LOGGER.info("==================================================\n"); - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericStepListener.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericStepListener.java deleted file mode 100644 index 270a657a7..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/listener/GenericStepListener.java +++ /dev/null @@ -1,81 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.listener; - -import de.deadlocker8.budgetmaster.databasemigrator.DatabaseMigratorMain; -import de.deadlocker8.budgetmaster.databasemigrator.DatabaseType; -import de.deadlocker8.budgetmaster.databasemigrator.Utils; -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationIntegerRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.DestinationRepository; -import de.deadlocker8.budgetmaster.databasemigrator.destination.ProvidesID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.StepExecutionListener; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.text.MessageFormat; -import java.util.List; - -public class GenericStepListener<T extends ProvidesID, ID> implements StepExecutionListener -{ - private static final Logger LOGGER = LoggerFactory.getLogger(GenericStepListener.class); - - private final String tableName; - private final DestinationRepository<T, ID> repository; - private final JdbcTemplate jdbcTemplate; - private final boolean adjustSequence; - - public GenericStepListener(String tableName, DestinationRepository<T, ID> repository, JdbcTemplate jdbcTemplate, boolean adjustSequence) - { - this.tableName = tableName; - this.repository = repository; - this.jdbcTemplate = jdbcTemplate; - this.adjustSequence = adjustSequence; - } - - @Override - public void beforeStep(StepExecution stepExecution) - { - LOGGER.info("\n"); - LOGGER.info(">>> Migrate {}s...", tableName); - - if(adjustSequence && DatabaseMigratorMain.databaseType.equals(DatabaseType.POSTGRESQL)) - { - LOGGER.debug("Resetting sequence to 0"); - jdbcTemplate.update(MessageFormat.format("ALTER SEQUENCE {0}_id_seq RESTART WITH 1", tableName)); - } - } - - @Override - public ExitStatus afterStep(StepExecution stepExecution) - { - final int count = Utils.getCommitCount(stepExecution); - LOGGER.info(">>> Successfully migrated {} {}s\n", count, tableName); - - if(adjustSequence && DatabaseMigratorMain.databaseType.equals(DatabaseType.POSTGRESQL)) - { - final int highestUsedID = getHighestUsedID(); - final int newSequence = highestUsedID + 1; - LOGGER.debug("Adjusting sequence to {} (highest used id: {})", newSequence, highestUsedID); - jdbcTemplate.update(MessageFormat.format("ALTER SEQUENCE {0}_id_seq RESTART WITH {1}", tableName, String.valueOf(newSequence))); - } - - return null; - } - - public Integer getHighestUsedID() - { - if(repository instanceof DestinationIntegerRepository<T,ID> integerRepository) - { - final List<T> itemsOrderedByID = integerRepository.findAllByOrderByIDDesc(); - if(itemsOrderedByID.isEmpty()) - { - return 0; - } - - return itemsOrderedByID.get(0).getID(); - } - - return null; - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/source/SourceDatabaseConfiguration.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/source/SourceDatabaseConfiguration.java deleted file mode 100644 index 0e21a5a8d..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/source/SourceDatabaseConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.source; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories( - entityManagerFactoryRef = "primaryEntityManagerFactory", - transactionManagerRef = "primaryTransactionManager", - basePackages = {"de.deadlocker8.budgetmaster.databasemigrator.source"} -) -public class SourceDatabaseConfiguration -{ - @Bean(name = "primaryDataSource") - @Primary - @ConfigurationProperties(prefix = "spring.datasource") - public DataSource primaryDataSource() - { - return DataSourceBuilder.create().build(); - } - - @Primary - @Bean(name = "primaryEntityManagerFactory") - public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder, - @Qualifier("primaryDataSource") DataSource primaryDataSource) - { - return builder - .dataSource(primaryDataSource) - .packages("de.deadlocker8.budgetmaster.databasemigrator.source") - .build(); - } - - @Bean(name = "primaryTransactionManager") - public PlatformTransactionManager primaryTransactionManager( - @Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory) - { - return new JpaTransactionManager(primaryEntityManagerFactory); - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericDoNothingProcessor.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericDoNothingProcessor.java deleted file mode 100644 index 32d5713fd..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericDoNothingProcessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.item.ItemProcessor; - -public class GenericDoNothingProcessor<T> implements ItemProcessor<T, T> -{ - private static final Logger LOGGER = LoggerFactory.getLogger(GenericDoNothingProcessor.class); - - @Override - public T process(T item) - { - LOGGER.debug("GenericDoNothingProcessor: Processing item: {}", item); - return item; - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericWriter.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericWriter.java deleted file mode 100644 index a0bd628d0..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/GenericWriter.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.item.ItemWriter; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public class GenericWriter<T, ID> implements ItemWriter<T> -{ - private static final Logger LOGGER = LoggerFactory.getLogger(GenericWriter.class); - - final JpaRepository<T, ID> repository; - - public GenericWriter(JpaRepository<T, ID> repository) - { - this.repository = repository; - } - - @Override - public void write(List<? extends T> list) - { - for(T data : list) - { - LOGGER.debug("GenericWriter: Writing: {}", data); - repository.save(data); - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/AccountReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/AccountReader.java deleted file mode 100644 index 8d4ce0cb2..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/AccountReader.java +++ /dev/null @@ -1,51 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.account.DestinationAccount; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class AccountReader extends BaseReader<DestinationAccount> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String NAME = "NAME"; - public static final String IS_SELECTED = "IS_SELECTED"; - public static final String IS_DEFAULT = "IS_DEFAULT"; - public static final String ACCOUNT_STATE = "ACCOUNT_STATE"; - public static final String ICON_REFERENCE_ID = "ICON_REFERENCE_ID"; - public static final String TYPE = "TYPE"; - } - - public AccountReader(DataSource primaryDataSource) - { - super(TableNames.ACCOUNT, primaryDataSource); - } - - @Override - protected RowMapper<DestinationAccount> getRowMapper() - { - return new AccountRowMapper(); - } - - public static class AccountRowMapper implements RowMapper<DestinationAccount> - { - @Override - public DestinationAccount mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationAccount account = new DestinationAccount(); - account.setID(rs.getInt(DatabaseColumns.ID)); - account.setDefault(rs.getBoolean(DatabaseColumns.IS_DEFAULT)); - account.setSelected(rs.getBoolean(DatabaseColumns.IS_SELECTED)); - account.setName(rs.getString(DatabaseColumns.NAME)); - account.setAccountState(rs.getInt(DatabaseColumns.ACCOUNT_STATE)); - account.setType(rs.getInt(DatabaseColumns.TYPE)); - account.setIconReferenceID(getIntOrNull(rs, DatabaseColumns.ICON_REFERENCE_ID)); - return account; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/BaseReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/BaseReader.java deleted file mode 100644 index f3c521750..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/BaseReader.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import org.springframework.batch.item.ItemReader; -import org.springframework.batch.item.database.JdbcCursorItemReader; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.MessageFormat; - -public abstract class BaseReader<T> extends JdbcCursorItemReader<T> implements ItemReader<T> -{ - private static final int FETCH_SIZE = 100; - - protected BaseReader(String tableName, @Autowired DataSource primaryDataSource) - { - setDataSource(primaryDataSource); - setSql(MessageFormat.format("SELECT * FROM {0}", tableName)); - setFetchSize(FETCH_SIZE); - setRowMapper(getRowMapper()); - } - - protected abstract RowMapper<T> getRowMapper(); - - protected static Integer getIntOrNull(ResultSet resultSet, String columnName) throws SQLException - { - final Integer intFromDatabase = resultSet.getInt(columnName); - if(resultSet.wasNull()) - { - return null; - } - - return intFromDatabase; - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/CategoryReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/CategoryReader.java deleted file mode 100644 index bf1f7593c..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/CategoryReader.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.category.DestinationCategory; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class CategoryReader extends BaseReader<DestinationCategory> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String NAME = "NAME"; - public static final String COLOR = "COLOR"; - public static final String TYPE = "TYPE"; - public static final String ICON_REFERENCE_ID = "ICON_REFERENCE_ID"; - } - - public CategoryReader(DataSource primaryDataSource) - { - super(TableNames.CATEGORY, primaryDataSource); - } - - @Override - protected RowMapper<DestinationCategory> getRowMapper() - { - return new CategoryRowMapper(); - } - - public static class CategoryRowMapper implements RowMapper<DestinationCategory> - { - @Override - public DestinationCategory mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationCategory category = new DestinationCategory(); - category.setID(rs.getInt(DatabaseColumns.ID)); - category.setName(rs.getString(DatabaseColumns.NAME)); - category.setColor(rs.getString(DatabaseColumns.COLOR)); - category.setType(rs.getInt(DatabaseColumns.TYPE)); - category.setIconReferenceID(getIntOrNull(rs, DatabaseColumns.ICON_REFERENCE_ID)); - return category; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ChartReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ChartReader.java deleted file mode 100644 index 8a93600c7..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ChartReader.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.chart.DestinationChart; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class ChartReader extends BaseReader<DestinationChart> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String NAME = "NAME"; - public static final String SCRIPT = "SCRIPT"; - public static final String TYPE = "TYPE"; - public static final String VERSION = "VERSION"; - public static final String DISPLAY_TYPE = "DISPLAY_TYPE"; - public static final String GROUP_TYPE = "GROUP_TYPE"; - public static final String PREVIEW_IMAGE_FILE_NAME = "PREVIEW_IMAGE_FILE_NAME"; - } - - public ChartReader(DataSource primaryDataSource) - { - super(TableNames.CHART, primaryDataSource); - } - - @Override - protected RowMapper<DestinationChart> getRowMapper() - { - return new ChartRowMapper(); - } - - public static class ChartRowMapper implements RowMapper<DestinationChart> - { - @Override - public DestinationChart mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationChart chart = new DestinationChart(); - chart.setID(rs.getInt(DatabaseColumns.ID)); - chart.setName(rs.getString(DatabaseColumns.NAME)); - chart.setScript(rs.getString(DatabaseColumns.SCRIPT)); - chart.setType(rs.getInt(DatabaseColumns.TYPE)); - chart.setVersion(rs.getInt(DatabaseColumns.VERSION)); - chart.setDisplayType(rs.getInt(DatabaseColumns.DISPLAY_TYPE)); - chart.setGroupType(rs.getInt(DatabaseColumns.GROUP_TYPE)); - chart.setPreviewImageFileName(rs.getString(DatabaseColumns.PREVIEW_IMAGE_FILE_NAME)); - return chart; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/HintReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/HintReader.java deleted file mode 100644 index 5ee0e969b..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/HintReader.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.hint.DestinationHint; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class HintReader extends BaseReader<DestinationHint> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String LOCALIZATION_KEY = "LOCALIZATION_KEY"; - public static final String IS_DISMISSED = "IS_DISMISSED"; - } - - public HintReader(DataSource primaryDataSource) - { - super(TableNames.HINT, primaryDataSource); - } - - @Override - protected RowMapper<DestinationHint> getRowMapper() - { - return new HintRowMapper(); - } - - public static class HintRowMapper implements RowMapper<DestinationHint> - { - @Override - public DestinationHint mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationHint hint = new DestinationHint(); - hint.setID(rs.getInt(DatabaseColumns.ID)); - hint.setLocalizationKey(rs.getString(DatabaseColumns.LOCALIZATION_KEY)); - hint.setDismissed(rs.getBoolean(DatabaseColumns.IS_DISMISSED)); - return hint; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/IconReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/IconReader.java deleted file mode 100644 index e3c218818..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/IconReader.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.icon.DestinationIcon; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class IconReader extends BaseReader<DestinationIcon> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String BUILTIN_IDENTIFIER = "BUILTIN_IDENTIFIER"; - public static final String IMAGE_ID = "IMAGE_ID"; - public static final String FONT_COLOR = "FONT_COLOR"; - } - - public IconReader(DataSource primaryDataSource) - { - super(TableNames.ICON, primaryDataSource); - } - - @Override - protected RowMapper<DestinationIcon> getRowMapper() - { - return new IconRowMapper(); - } - - public static class IconRowMapper implements RowMapper<DestinationIcon> - { - @Override - public DestinationIcon mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationIcon icon = new DestinationIcon(); - icon.setID(rs.getInt(DatabaseColumns.ID)); - icon.setBuiltinIdentifier(rs.getString(DatabaseColumns.BUILTIN_IDENTIFIER)); - icon.setImageID(getIntOrNull(rs, DatabaseColumns.IMAGE_ID)); - icon.setFontColor(rs.getString(DatabaseColumns.FONT_COLOR)); - return icon; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ImageReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ImageReader.java deleted file mode 100644 index 4cd4be19c..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/ImageReader.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.image.DestinationImage; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class ImageReader extends BaseReader<DestinationImage> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String FILE_EXTENSION = "FILE_EXTENSION"; - public static final String FILE_NAME = "FILE_NAME"; - public static final String IMAGE = "IMAGE"; - } - - public ImageReader(DataSource primaryDataSource) - { - super(TableNames.IMAGE, primaryDataSource); - } - - @Override - protected RowMapper<DestinationImage> getRowMapper() - { - return new ImageRowMapper(); - } - - public static class ImageRowMapper implements RowMapper<DestinationImage> - { - @Override - public DestinationImage mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationImage image = new DestinationImage(); - image.setID(rs.getInt(DatabaseColumns.ID)); - image.setFileExtension(getIntOrNull(rs, DatabaseColumns.FILE_EXTENSION)); - image.setFileName(rs.getString(DatabaseColumns.FILE_NAME)); - image.setImage(rs.getBytes(DatabaseColumns.IMAGE)); - return image; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/SettingsReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/SettingsReader.java deleted file mode 100644 index 485b30ba9..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/SettingsReader.java +++ /dev/null @@ -1,81 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.settings.DestinationSettings; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class SettingsReader extends BaseReader<DestinationSettings> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String CURRENCY = "CURRENCY"; - public static final String LANGUAGE = "LANGUAGE"; - public static final String USE_DARK_THEME = "USE_DARK_THEME"; - public static final String SHOW_CATEGORIES_AS_CIRCLES = "SHOW_CATEGORIES_AS_CIRCLES"; - public static final String AUTO_UPDATE_CHECK_ENABLED = "AUTO_UPDATE_CHECK_ENABLED"; - public static final String BACKUP_REMINDER_ACTIVATED = "BACKUP_REMINDER_ACTIVATED"; - public static final String LAST_BACKUP_REMINDER_DATE = "LAST_BACKUP_REMINDER_DATE"; - public static final String SEARCH_ITEMS_PER_PAGE = "SEARCH_ITEMS_PER_PAGE"; - - public static final String AUTO_BACKUP_STRATEGY = "AUTO_BACKUP_STRATEGY"; - public static final String AUTO_BACKUP_DAYS = "AUTO_BACKUP_DAYS"; - public static final String AUTO_BACKUP_TIME = "AUTO_BACKUP_TIME"; - public static final String AUTO_BACKUP_FILES_TO_KEEP = "AUTO_BACKUP_FILES_TO_KEEP"; - - public static final String AUTO_BACKUP_GIT_URL = "AUTO_BACKUP_GIT_URL"; - public static final String AUTO_BACKUP_GIT_BRANCH_NAME = "AUTO_BACKUP_GIT_BRANCH_NAME"; - public static final String AUTO_BACKUP_GIT_USER_NAME = "AUTO_BACKUP_GIT_USER_NAME"; - public static final String AUTO_BACKUP_GIT_TOKEN = "AUTO_BACKUP_GIT_TOKEN"; - - public static final String INSTALLED_VERSION_CODE = "INSTALLED_VERSION_CODE"; - public static final String WHATS_NEW_SHOWN_FOR_CURRENT_VERSION = "WHATS_NEW_SHOWN_FOR_CURRENT_VERSION"; - } - - public SettingsReader(DataSource primaryDataSource) - { - super(TableNames.SETTINGS, primaryDataSource); - } - - @Override - protected RowMapper<DestinationSettings> getRowMapper() - { - return new SettingsRowMapper(); - } - - public static class SettingsRowMapper implements RowMapper<DestinationSettings> - { - @Override - public DestinationSettings mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationSettings settings = new DestinationSettings(); - settings.setID(1); - settings.setCurrency(rs.getString(DatabaseColumns.CURRENCY)); - settings.setLanguage(rs.getInt(DatabaseColumns.LANGUAGE)); - settings.setUseDarkTheme(rs.getBoolean(DatabaseColumns.USE_DARK_THEME)); - settings.setShowCategoriesAsCircles(rs.getBoolean(DatabaseColumns.SHOW_CATEGORIES_AS_CIRCLES)); - settings.setAutoUpdateCheckEnabled(rs.getBoolean(DatabaseColumns.AUTO_UPDATE_CHECK_ENABLED)); - settings.setBackupReminderActivated(rs.getBoolean(DatabaseColumns.BACKUP_REMINDER_ACTIVATED)); - settings.setLastBackupReminderDate(rs.getDate(DatabaseColumns.LAST_BACKUP_REMINDER_DATE).toLocalDate()); - settings.setSearchItemsPerPage(rs.getInt(DatabaseColumns.SEARCH_ITEMS_PER_PAGE)); - - settings.setAutoBackupStrategy(rs.getInt(DatabaseColumns.AUTO_BACKUP_STRATEGY)); - settings.setAutoBackupDays(rs.getInt(DatabaseColumns.AUTO_BACKUP_DAYS)); - settings.setAutoBackupTime(rs.getInt(DatabaseColumns.AUTO_BACKUP_TIME)); - settings.setAutoBackupFilesToKeep(rs.getInt(DatabaseColumns.AUTO_BACKUP_FILES_TO_KEEP)); - - settings.setAutoBackupGitUrl(rs.getString(DatabaseColumns.AUTO_BACKUP_GIT_URL)); - settings.setAutoBackupGitBranchName(rs.getString(DatabaseColumns.AUTO_BACKUP_GIT_BRANCH_NAME)); - settings.setAutoBackupGitUserName(rs.getString(DatabaseColumns.AUTO_BACKUP_GIT_USER_NAME)); - settings.setAutoBackupGitToken(rs.getString(DatabaseColumns.AUTO_BACKUP_GIT_TOKEN)); - - settings.setInstalledVersionCode(rs.getInt(DatabaseColumns.INSTALLED_VERSION_CODE)); - settings.setWhatsNewShownForCurrentVersion(rs.getBoolean(DatabaseColumns.WHATS_NEW_SHOWN_FOR_CURRENT_VERSION)); - return settings; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateGroupReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateGroupReader.java deleted file mode 100644 index 5fb1330ce..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateGroupReader.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.templateGroup.DestinationTemplateGroup; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class TemplateGroupReader extends BaseReader<DestinationTemplateGroup> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String NAME = "NAME"; - public static final String TYPE = "TYPE"; - } - - public TemplateGroupReader(DataSource primaryDataSource) - { - super(TableNames.TEMPLATE_GROUP, primaryDataSource); - } - - @Override - protected RowMapper<DestinationTemplateGroup> getRowMapper() - { - return new TemplateGroupRowMapper(); - } - - public static class TemplateGroupRowMapper implements RowMapper<DestinationTemplateGroup> - { - @Override - public DestinationTemplateGroup mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationTemplateGroup templateGroup = new DestinationTemplateGroup(); - templateGroup.setID(rs.getInt(DatabaseColumns.ID)); - templateGroup.setName(rs.getString(DatabaseColumns.NAME)); - templateGroup.setType(rs.getInt(DatabaseColumns.TYPE)); - return templateGroup; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateReader.java deleted file mode 100644 index f22ea8890..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TemplateReader.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.template.DestinationTemplate; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class TemplateReader extends BaseReader<DestinationTemplate> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String TEMPLATE_NAME = "TEMPLATE_NAME"; - public static final String AMOUNT = "AMOUNT"; - public static final String IS_EXPENDITURE = "IS_EXPENDITURE"; - public static final String ACCOUNT_ID = "ACCOUNT_ID"; - public static final String CATEGORY_ID = "CATEGORY_ID"; - public static final String NAME = "NAME"; - public static final String DESCRIPTION = "DESCRIPTION"; - public static final String ICON_REFERENCE_ID = "ICON_REFERENCE_ID"; - public static final String TRANSFER_ACCOUNT_ID = "TRANSFER_ACCOUNT_ID"; - public static final String TEMPLATE_GROUP_ID = "TEMPLATE_GROUP_ID"; - } - - public TemplateReader(DataSource primaryDataSource) - { - super(TableNames.TEMPLATE, primaryDataSource); - } - - @Override - protected RowMapper<DestinationTemplate> getRowMapper() - { - return new TemplateRowMapper(); - } - - public static class TemplateRowMapper implements RowMapper<DestinationTemplate> - { - @Override - public DestinationTemplate mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationTemplate template = new DestinationTemplate(); - template.setID(rs.getInt(DatabaseColumns.ID)); - template.setTemplateName(rs.getString(DatabaseColumns.TEMPLATE_NAME)); - template.setAmount(getIntOrNull(rs, DatabaseColumns.AMOUNT)); - template.setIsExpenditure(rs.getBoolean(DatabaseColumns.IS_EXPENDITURE)); - template.setAccountID(getIntOrNull(rs, DatabaseColumns.ACCOUNT_ID)); - template.setCategoryID(getIntOrNull(rs, DatabaseColumns.CATEGORY_ID)); - template.setName(rs.getString(DatabaseColumns.NAME)); - template.setDescription(rs.getString(DatabaseColumns.DESCRIPTION)); - template.setTransferAccountID(getIntOrNull(rs, DatabaseColumns.TRANSFER_ACCOUNT_ID)); - template.setIconReferenceID(getIntOrNull(rs, DatabaseColumns.ICON_REFERENCE_ID)); - template.setTemplateGroupID(getIntOrNull(rs, DatabaseColumns.TEMPLATE_GROUP_ID)); - return template; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TransactionReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TransactionReader.java deleted file mode 100644 index 6d1357927..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/TransactionReader.java +++ /dev/null @@ -1,57 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.transaction.DestinationTransaction; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class TransactionReader extends BaseReader<DestinationTransaction> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String AMOUNT = "AMOUNT"; - public static final String IS_EXPENDITURE = "IS_EXPENDITURE"; - public static final String DATE = "DATE"; - public static final String ACCOUNT_ID = "ACCOUNT_ID"; - public static final String CATEGORY_ID = "CATEGORY_ID"; - public static final String NAME = "NAME"; - public static final String DESCRIPTION = "DESCRIPTION"; - public static final String REPEATING_OPTION_ID = "REPEATING_OPTION_ID"; - public static final String TRANSFER_ACCOUNT_ID = "TRANSFER_ACCOUNT_ID"; - } - - public TransactionReader(DataSource primaryDataSource) - { - super(TableNames.TRANSACTION, primaryDataSource); - } - - @Override - protected RowMapper<DestinationTransaction> getRowMapper() - { - return new TransactionRowMapper(); - } - - public static class TransactionRowMapper implements RowMapper<DestinationTransaction> - { - @Override - public DestinationTransaction mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationTransaction transaction = new DestinationTransaction(); - transaction.setID(rs.getInt(DatabaseColumns.ID)); - transaction.setAmount(rs.getInt(DatabaseColumns.AMOUNT)); - transaction.setIsExpenditure(rs.getBoolean(DatabaseColumns.IS_EXPENDITURE)); - transaction.setDate(rs.getDate(DatabaseColumns.DATE).toLocalDate()); - transaction.setAccountID(rs.getInt(DatabaseColumns.ACCOUNT_ID)); - transaction.setCategoryID(rs.getInt(DatabaseColumns.CATEGORY_ID)); - transaction.setName(rs.getString(DatabaseColumns.NAME)); - transaction.setDescription(rs.getString(DatabaseColumns.DESCRIPTION)); - transaction.setRepeatingOptionID(getIntOrNull(rs, DatabaseColumns.REPEATING_OPTION_ID)); - transaction.setTransferAccountID(getIntOrNull(rs, DatabaseColumns.TRANSFER_ACCOUNT_ID)); - return transaction; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/UserReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/UserReader.java deleted file mode 100644 index f75ede45c..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/UserReader.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.user.DestinationUser; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class UserReader extends BaseReader<DestinationUser> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String NAME = "NAME"; - public static final String PASSWORD = "PASSWORD"; - public static final String SELECTED_ACCOUNT_ID = "SELECTED_ACCOUNT_ID"; - } - - public UserReader(DataSource primaryDataSource) - { - super(TableNames.USER_SOURCE, primaryDataSource); - } - - @Override - protected RowMapper<DestinationUser> getRowMapper() - { - return new UserRowMapper(); - } - - public static class UserRowMapper implements RowMapper<DestinationUser> - { - @Override - public DestinationUser mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationUser user = new DestinationUser(); - user.setID(rs.getInt(DatabaseColumns.ID)); - user.setName(rs.getString(DatabaseColumns.NAME)); - user.setPassword(rs.getString(DatabaseColumns.PASSWORD)); - user.setSelectedAccountID(rs.getInt(DatabaseColumns.SELECTED_ACCOUNT_ID)); - return user; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/RepeatingOptionReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/RepeatingOptionReader.java deleted file mode 100644 index 67f59cd55..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/RepeatingOptionReader.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.DestinationRepeatingOption; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingOptionReader extends BaseReader<DestinationRepeatingOption> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String START_DATE = "START_DATE"; - public static final String END_OPTION_ID = "END_OPTION_ID"; - public static final String MODIFIER_ID = "MODIFIER_ID"; - } - - public RepeatingOptionReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_OPTION, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingOption> getRowMapper() - { - return new RepeatingOptionRowMapper(); - } - - public static class RepeatingOptionRowMapper implements RowMapper<DestinationRepeatingOption> - { - @Override - public DestinationRepeatingOption mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingOption repeatingOption = new DestinationRepeatingOption(); - repeatingOption.setID(rs.getInt(DatabaseColumns.ID)); - repeatingOption.setStartDate(rs.getDate(DatabaseColumns.START_DATE).toLocalDate()); - repeatingOption.setEndOptionID(rs.getInt(DatabaseColumns.END_OPTION_ID)); - repeatingOption.setModifierID(rs.getInt(DatabaseColumns.MODIFIER_ID)); - return repeatingOption; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndAfterXTimesReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndAfterXTimesReader.java deleted file mode 100644 index b238431ee..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndAfterXTimesReader.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndAfterXTimes; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingEndAfterXTimesReader extends BaseReader<DestinationRepeatingEndAfterXTimes> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String TIMES = "TIMES"; - } - - public RepeatingEndAfterXTimesReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_END_AFTER_X_TIMES, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingEndAfterXTimes> getRowMapper() - { - return new DestinationRepeatingEndAfterXTimesRowMapper(); - } - - public static class DestinationRepeatingEndAfterXTimesRowMapper implements RowMapper<DestinationRepeatingEndAfterXTimes> - { - @Override - public DestinationRepeatingEndAfterXTimes mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingEndAfterXTimes repeatingEndAfterXTimes = new DestinationRepeatingEndAfterXTimes(); - repeatingEndAfterXTimes.setID(rs.getInt(DatabaseColumns.ID)); - repeatingEndAfterXTimes.setTimes(rs.getInt(DatabaseColumns.TIMES)); - return repeatingEndAfterXTimes; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndDateReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndDateReader.java deleted file mode 100644 index eacf03128..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndDateReader.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndDate; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingEndDateReader extends BaseReader<DestinationRepeatingEndDate> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String END_DATE = "END_DATE"; - } - - public RepeatingEndDateReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_END_DATE, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingEndDate> getRowMapper() - { - return new DestinationRepeatingEndDateRowMapper(); - } - - public static class DestinationRepeatingEndDateRowMapper implements RowMapper<DestinationRepeatingEndDate> - { - @Override - public DestinationRepeatingEndDate mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingEndDate repeatingEndDate = new DestinationRepeatingEndDate(); - repeatingEndDate.setID(rs.getInt(DatabaseColumns.ID)); - repeatingEndDate.setEndDate(rs.getDate(DatabaseColumns.END_DATE).toLocalDate()); - return repeatingEndDate; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndNeverReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndNeverReader.java deleted file mode 100644 index 1bdd766bb..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndNeverReader.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndNever; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingEndNeverReader extends BaseReader<DestinationRepeatingEndNever> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - } - - public RepeatingEndNeverReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_END_NEVER, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingEndNever> getRowMapper() - { - return new DestinationRepeatingEndNeverRowMapper(); - } - - public static class DestinationRepeatingEndNeverRowMapper implements RowMapper<DestinationRepeatingEndNever> - { - @Override - public DestinationRepeatingEndNever mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingEndNever repeatingEndNever = new DestinationRepeatingEndNever(); - repeatingEndNever.setID(rs.getInt(DatabaseColumns.ID)); - return repeatingEndNever; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndReader.java deleted file mode 100644 index d28c48b5e..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/end/RepeatingEndReader.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.end; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEnd; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingEndReader extends BaseReader<DestinationRepeatingEnd> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String LOCALIZATION_KEY = "LOCALIZATION_KEY"; - public static final String TYPE = "TYPE"; - } - - public RepeatingEndReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_END, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingEnd> getRowMapper() - { - return new RepeatingEndRowMapper(); - } - - public static class RepeatingEndRowMapper implements RowMapper<DestinationRepeatingEnd> - { - @Override - public DestinationRepeatingEnd mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingEnd repeatingEnd = new DestinationRepeatingEnd(); - repeatingEnd.setID(rs.getInt(DatabaseColumns.ID)); - repeatingEnd.setLocalizationKey(rs.getString(DatabaseColumns.LOCALIZATION_KEY)); - repeatingEnd.setType(rs.getString(DatabaseColumns.TYPE)); - return repeatingEnd; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierDaysReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierDaysReader.java deleted file mode 100644 index da5263349..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierDaysReader.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierDays; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingModifierDaysReader extends BaseReader<DestinationRepeatingModifierDays> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - } - - public RepeatingModifierDaysReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_MODIFIER_DAYS, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingModifierDays> getRowMapper() - { - return new DestinationRepeatingModifierRowMapper(); - } - - public static class DestinationRepeatingModifierRowMapper implements RowMapper<DestinationRepeatingModifierDays> - { - @Override - public DestinationRepeatingModifierDays mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingModifierDays repeatingModifier = new DestinationRepeatingModifierDays(); - repeatingModifier.setID(rs.getInt(DatabaseColumns.ID)); - return repeatingModifier; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierMonthsReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierMonthsReader.java deleted file mode 100644 index c45b5907b..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierMonthsReader.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierMonths; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingModifierMonthsReader extends BaseReader<DestinationRepeatingModifierMonths> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - } - - public RepeatingModifierMonthsReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_MODIFIER_MONTHS, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingModifierMonths> getRowMapper() - { - return new DestinationRepeatingModifierRowMapper(); - } - - public static class DestinationRepeatingModifierRowMapper implements RowMapper<DestinationRepeatingModifierMonths> - { - @Override - public DestinationRepeatingModifierMonths mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingModifierMonths repeatingModifier = new DestinationRepeatingModifierMonths(); - repeatingModifier.setID(rs.getInt(DatabaseColumns.ID)); - return repeatingModifier; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierReader.java deleted file mode 100644 index d3416f7a2..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierReader.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifier; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingModifierReader extends BaseReader<DestinationRepeatingModifier> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String LOCALIZATION_KEY = "LOCALIZATION_KEY"; - public static final String TYPE = "TYPE"; - public static final String QUANTITY = "QUANTITY"; - } - - public RepeatingModifierReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_MODIFIER, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingModifier> getRowMapper() - { - return new RepeatingModifierRowMapper(); - } - - public static class RepeatingModifierRowMapper implements RowMapper<DestinationRepeatingModifier> - { - @Override - public DestinationRepeatingModifier mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingModifier repeatingModifier = new DestinationRepeatingModifier(); - repeatingModifier.setID(rs.getInt(DatabaseColumns.ID)); - repeatingModifier.setLocalizationKey(rs.getString(DatabaseColumns.LOCALIZATION_KEY)); - repeatingModifier.setType(rs.getString(DatabaseColumns.TYPE)); - repeatingModifier.setQuantity(rs.getInt(DatabaseColumns.QUANTITY)); - return repeatingModifier; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierYearsReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierYearsReader.java deleted file mode 100644 index f7a81fe95..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/repeating/modifier/RepeatingModifierYearsReader.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.repeating.modifier; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierYears; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RepeatingModifierYearsReader extends BaseReader<DestinationRepeatingModifierYears> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - } - - public RepeatingModifierYearsReader(DataSource primaryDataSource) - { - super(TableNames.REPEATING_MODIFIER_YEARS, primaryDataSource); - } - - @Override - protected RowMapper<DestinationRepeatingModifierYears> getRowMapper() - { - return new DestinationRepeatingModifierRowMapper(); - } - - public static class DestinationRepeatingModifierRowMapper implements RowMapper<DestinationRepeatingModifierYears> - { - @Override - public DestinationRepeatingModifierYears mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationRepeatingModifierYears repeatingModifier = new DestinationRepeatingModifierYears(); - repeatingModifier.setID(rs.getInt(DatabaseColumns.ID)); - return repeatingModifier; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportColumnReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportColumnReader.java deleted file mode 100644 index bfc7cf1ed..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportColumnReader.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.report; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportColumn; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class ReportColumnReader extends BaseReader<DestinationReportColumn> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String ACTIVATED = "ACTIVATED"; - public static final String KEY = "KEY"; - public static final String POSITION = "POSITION"; - } - - public ReportColumnReader(DataSource primaryDataSource) - { - super(TableNames.REPORT_COLUMN, primaryDataSource); - } - - @Override - protected RowMapper<DestinationReportColumn> getRowMapper() - { - return new ReportColumnRowMapper(); - } - - public static class ReportColumnRowMapper implements RowMapper<DestinationReportColumn> - { - @Override - public DestinationReportColumn mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationReportColumn column = new DestinationReportColumn(); - column.setID(rs.getInt(DatabaseColumns.ID)); - column.setActivated(rs.getBoolean(DatabaseColumns.ACTIVATED)); - column.setLocalizationKey(rs.getString(DatabaseColumns.KEY)); - column.setColumnPosition(rs.getInt(DatabaseColumns.POSITION)); - return column; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportSettingsReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportSettingsReader.java deleted file mode 100644 index ad2e9f9d4..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/report/ReportSettingsReader.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.report; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportSettings; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class ReportSettingsReader extends BaseReader<DestinationReportSettings> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String DATE = "DATE"; - public static final String INCLUDE_BUDGET = "INCLUDE_BUDGET"; - public static final String INCLUDE_CATEGORY_BUDGETS = "INCLUDE_CATEGORY_BUDGETS"; - public static final String SPLIT_TABLES = "SPLIT_TABLES"; - } - - public ReportSettingsReader(DataSource primaryDataSource) - { - super(TableNames.REPORT_SETTINGS, primaryDataSource); - } - - @Override - protected RowMapper<DestinationReportSettings> getRowMapper() - { - return new ReportSettingsRowMapper(); - } - - public static class ReportSettingsRowMapper implements RowMapper<DestinationReportSettings> - { - @Override - public DestinationReportSettings mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationReportSettings settings = new DestinationReportSettings(); - settings.setID(1); - settings.setDate(rs.getDate(DatabaseColumns.DATE).toLocalDate()); - settings.setIncludeBudget(rs.getBoolean(DatabaseColumns.INCLUDE_BUDGET)); - settings.setIncludeCategoryBudgets(rs.getBoolean(DatabaseColumns.INCLUDE_CATEGORY_BUDGETS)); - settings.setSplitTables(rs.getBoolean(DatabaseColumns.SPLIT_TABLES)); - return settings; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TagReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TagReader.java deleted file mode 100644 index eeb08d496..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TagReader.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.tag.DestinationTag; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class TagReader extends BaseReader<DestinationTag> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String NAME = "NAME"; - } - - public TagReader(DataSource primaryDataSource) - { - super(TableNames.TAG, primaryDataSource); - } - - @Override - protected RowMapper<DestinationTag> getRowMapper() - { - return new TagRowMapper(); - } - - public static class TagRowMapper implements RowMapper<DestinationTag> - { - @Override - public DestinationTag mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationTag tag = new DestinationTag(); - tag.setID(rs.getInt(DatabaseColumns.ID)); - tag.setName(rs.getString(DatabaseColumns.NAME)); - return tag; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TemplateTagReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TemplateTagReader.java deleted file mode 100644 index 0e1cfdc94..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TemplateTagReader.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.tag.DestinationTemplateTag; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class TemplateTagReader extends BaseReader<DestinationTemplateTag> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String TEMPLATE_ID = "TEMPLATE_ID"; - public static final String TAGS_ID = "TAGS_ID"; - } - - public TemplateTagReader(DataSource primaryDataSource) - { - super(TableNames.TEMPLATE_TAGS, primaryDataSource); - } - - @Override - protected RowMapper<DestinationTemplateTag> getRowMapper() - { - return new TagRowMapper(); - } - - public static class TagRowMapper implements RowMapper<DestinationTemplateTag> - { - @Override - public DestinationTemplateTag mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationTemplateTag tag = new DestinationTemplateTag(); - tag.setID(rowNum); - tag.setTemplateID(rs.getInt(DatabaseColumns.TEMPLATE_ID)); - tag.setTagsID(rs.getInt(DatabaseColumns.TAGS_ID)); - return tag; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TransactionTagReader.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TransactionTagReader.java deleted file mode 100644 index 1d2596b04..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/steps/reader/tag/TransactionTagReader.java +++ /dev/null @@ -1,45 +0,0 @@ - -package de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.TableNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.tag.DestinationTransactionTag; -import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.BaseReader; -import org.springframework.jdbc.core.RowMapper; - -import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class TransactionTagReader extends BaseReader<DestinationTransactionTag> -{ - private static class DatabaseColumns - { - public static final String ID = "ID"; - public static final String TRANSACTION_ID = "TRANSACTION_ID"; - public static final String TAGS_ID = "TAGS_ID"; - } - - public TransactionTagReader(DataSource primaryDataSource) - { - super(TableNames.TRANSACTION_TAGS, primaryDataSource); - } - - @Override - protected RowMapper<DestinationTransactionTag> getRowMapper() - { - return new TagRowMapper(); - } - - public static class TagRowMapper implements RowMapper<DestinationTransactionTag> - { - @Override - public DestinationTransactionTag mapRow(ResultSet rs, int rowNum) throws SQLException - { - final DestinationTransactionTag tag = new DestinationTransactionTag(); - tag.setID(rowNum); - tag.setTransactionID(rs.getInt(DatabaseColumns.TRANSACTION_ID)); - tag.setTagsID(rs.getInt(DatabaseColumns.TAGS_ID)); - return tag; - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/main/resources/application.properties b/BudgetMasterDatabaseMigrator/src/main/resources/application.properties deleted file mode 100644 index 8c007825b..000000000 --- a/BudgetMasterDatabaseMigrator/src/main/resources/application.properties +++ /dev/null @@ -1,21 +0,0 @@ -# commented lines should be passed by command line and are only retained as example -#spring.datasource.jdbc-url= -spring.datasource.username=sa -spring.datasource.password= -spring.datasource.driver-class-name=org.h2.Driver - -#spring.seconddatasource.jdbc-url= -#spring.seconddatasource.username= -#spring.seconddatasource.password= -#spring.seconddatasource.driver-class-name= - -spring.jpa.database=default -spring.jpa.show-sql=false -spring.jpa.generate-ddl=true -spring.jpa.hibernate.ddl-auto=update - -spring.batch.jdbc.initialize-schema=always -spring.batch.job.enabled=false - -logging.level.root=INFO -logging.level.de.deadlocker8=DEBUG \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateAccountsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateAccountsTest.java deleted file mode 100644 index 23dfd7ef4..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateAccountsTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.account.DestinationAccount; -import de.deadlocker8.budgetmaster.databasemigrator.destination.account.DestinationAccountIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateAccountsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateAccountsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:accounts.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationAccountIntegerRepository accountRepository; - - @Test - void test_stepMigrateAccounts() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.ACCOUNTS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(7); - assertThat(stepExecution.getCommitCount()).isEqualTo(8); - - final DestinationAccount accountPlaceholder = new DestinationAccount(1, "Placeholder", false, false, 0, 1, 0); - final DestinationAccount accountDefault = new DestinationAccount(2, "Default Account", true, true, 0, 2, 1); - final DestinationAccount accountWithBuiltinIcon = new DestinationAccount(3, "Account with builtin icon", false, false, 0, 5, 1); - final DestinationAccount accountWithoutIcon = new DestinationAccount(4, "Account without icon", false, false, 0, 6, 1); - final DestinationAccount accountWithImage = new DestinationAccount(5, "Account with image", false, false, 0, 7, 1); - final DestinationAccount accountReadOnly = new DestinationAccount(6, "Read-only account", false, false, 1, 8, 1); - final DestinationAccount accountHidden = new DestinationAccount(7, "Hidden account", false, false, 2, 9, 1); - - - final List<DestinationAccount> accounts = accountRepository.findAll(); - assertThat(accounts) - .hasSize(7) - .containsExactly(accountPlaceholder, accountDefault, accountWithBuiltinIcon, accountWithoutIcon, accountWithImage, accountReadOnly, accountHidden); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateCategoriesTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateCategoriesTest.java deleted file mode 100644 index 4c1e665cc..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateCategoriesTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.category.DestinationCategory; -import de.deadlocker8.budgetmaster.databasemigrator.destination.category.DestinationCategoryIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateCategoriesTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateCategoriesTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:categories.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationCategoryIntegerRepository categoryRepository; - - @Test - void test_stepMigraCategories() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.CATEGORIES, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(5); - assertThat(stepExecution.getCommitCount()).isEqualTo(6); - - final DestinationCategory categoryNoCategory = new DestinationCategory(1, "No Category", "#FFFFFF", 0, 3); - final DestinationCategory categoryRest = new DestinationCategory(2, "Rest", "#FFFF00", 1, 4); - final DestinationCategory categoryWithIcon = new DestinationCategory(3, "Awesome Category", "#ff9500", 2, 5); - final DestinationCategory categoryWithBuiltinIcon = new DestinationCategory(4, "Category with built in icon", "#4cd964", 2, 6); - final DestinationCategory categoryWithoutIcon = new DestinationCategory(5, "Category without icon", "#a90329", 2, 7); - - final List<DestinationCategory> categories = categoryRepository.findAll(); - assertThat(categories) - .hasSize(5) - .containsExactly(categoryNoCategory, categoryRest, categoryWithIcon, categoryWithBuiltinIcon, categoryWithoutIcon); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateChartsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateChartsTest.java deleted file mode 100644 index 4facccd62..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateChartsTest.java +++ /dev/null @@ -1,219 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.chart.DestinationChart; -import de.deadlocker8.budgetmaster.databasemigrator.destination.chart.DestinationChartIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateChartsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateChartsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:charts.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationChartIntegerRepository chartRepository; - - private static final String DEFAULT_CHART_SCRIPT = """ - /* This list will be dynamically filled with all the transactions between - * the start and and date you select on the "Show Chart" page - * and filtered according to your specified filter. - * An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki: - * https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts - */ - var transactionData = []; - - // Note: All variables starting with "localized" are only available inside default charts. - - // group transactions by date - var groups = transactionData.reverse().reduce((groups, transaction) => - { - var date = transaction.date; - if(!groups[date]) - { - groups[date] = []; - } - groups[date].push(transaction); - return groups; - }, {}); - - var dates = Object.keys(groups); - var previousSum = 0; - var sums = []; - - // calculate sum for each date - for(var key in groups) - { - if(groups.hasOwnProperty(key)) - { - var group = groups[key]; - - // extract all amount values - var amounts = group.map(transaction => transaction.amount); - - // sum up all amounts - var currentSum = amounts.reduce((a, b) => a + b, 0); - - // add sum of current date to previous sum - currentSum = previousSum + currentSum; - - // save current sum for next loop cycle - previousSum = currentSum; - - // add sum to array - sums.push(currentSum / 100); - } - } - - // Prepare your chart settings here (mandatory) - var plotlyData = [ - { - x: dates, - y: sums, - type: 'line' - } - ]; - - // Add your Plotly layout settings here (optional) - var plotlyLayout = { - title: { - text: localizedTitle, - }, - yaxis: { - title: localizedData['axisY'] + localizedCurrency, - rangemode: 'tozero', - tickformat: '.2f', - showline: true - }, - xaxis: { - tickformat: '%d.%m.%y' - } - }; - - // Add your Plotly configuration settings here (optional) - var plotlyConfig = { - showSendToCloud: false, - displaylogo: false, - showLink: false, - responsive: true, - displayModeBar: true, - toImageButtonOptions: { - format: 'png', - filename: 'BudgetMaster_chart_export', - height: 1080, - width: 1920, - } - }; - - // Don't touch this line - Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig);"""; - - private static final String CUSTOM_CHART_SCRIPT = """ - /* This list will be dynamically filled with all the transactions between - * the start and and date you select on the "Show Chart" page - * and filtered according to your specified filter. - * An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki: - * https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts - */ - var transactionData = []; - - // Prepare your chart settings here (mandatory) - var plotlyData = [{ - x: [], - y: [], - type: 'bar' - }]; - - // Add your Plotly layout settings here (optional) - var plotlyLayout = {}; - - // Add your Plotly configuration settings here (optional) - var plotlyConfig = { - showSendToCloud: false, - displaylogo: false, - showLink: false, - responsive: true - }; - - console.log("my custom chart"); - - // Don't touch this line - Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig);"""; - - - @Test - void test_stepMigrateCharts() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.CHARTS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(13); - assertThat(stepExecution.getCommitCount()).isEqualTo(14); - - final List<DestinationChart> charts = chartRepository.findAll(); - assertThat(charts).hasSize(13); - - final DestinationChart migratedDefaultChart = charts.get(0); - assertThat(migratedDefaultChart) - .hasFieldOrPropertyWithValue("ID", 1) - .hasFieldOrPropertyWithValue("name", "charts.default.accountSumPerDay") - .hasFieldOrPropertyWithValue("type", 0) - .hasFieldOrPropertyWithValue("version", 11) - .hasFieldOrPropertyWithValue("displayType", 2) - .hasFieldOrPropertyWithValue("groupType", 0) - .hasFieldOrPropertyWithValue("previewImageFileName", "accountSumPerDay.png"); - - assertThat(migratedDefaultChart.getScript()) - .isEqualTo(DEFAULT_CHART_SCRIPT.replace("\n", "\r\n")); - - final DestinationChart migratedCustomChart = charts.get(12); - assertThat(migratedCustomChart) - .hasFieldOrPropertyWithValue("ID", 13) - .hasFieldOrPropertyWithValue("name", "Custom chart") - .hasFieldOrPropertyWithValue("type", 1) - .hasFieldOrPropertyWithValue("version", 0) - .hasFieldOrPropertyWithValue("displayType", 3) - .hasFieldOrPropertyWithValue("groupType", 0) - .hasFieldOrPropertyWithValue("previewImageFileName", null); - - assertThat(migratedCustomChart.getScript()) - .isEqualTo(CUSTOM_CHART_SCRIPT.replace("\n", "\r\n")); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateDefaultDatabaseTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateDefaultDatabaseTest.java deleted file mode 100644 index 2bb7b4c26..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateDefaultDatabaseTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateDefaultDatabaseTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateDefaultDatabaseTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:default_database_after_first_start.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Test - void test_jobMigrate() throws Exception - { - final JobExecution jobExecution = jobLauncherTestUtils.launchJob(DEFAULT_JOB_PARAMETERS); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - } - - @Test - void test_stepMigrateImages_noImages() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.IMAGES, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isZero(); - assertThat(stepExecution.getCommitCount()).isOne(); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateHintsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateHintsTest.java deleted file mode 100644 index b81669be0..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateHintsTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.hint.DestinationHint; -import de.deadlocker8.budgetmaster.databasemigrator.destination.hint.DestinationHintIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateHintsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateHintsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:default_database_after_first_start.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationHintIntegerRepository hintRepository; - - @Test - void test_stepMigrateHints() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.HINTS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(7); - assertThat(stepExecution.getCommitCount()).isEqualTo(8); - - final DestinationHint hint = new DestinationHint(1, "hint.first.use.teaser", false); - - final List<DestinationHint> hints = hintRepository.findAll(); - assertThat(hints) - .hasSize(7) - .contains(hint); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateIconsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateIconsTest.java deleted file mode 100644 index 6e05b213a..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateIconsTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.icon.DestinationIcon; -import de.deadlocker8.budgetmaster.databasemigrator.destination.icon.DestinationIconIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateIconsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateIconsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:categories.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationIconIntegerRepository iconRepository; - - @Test - void test_stepMigrateImages() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.ICONS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(7); - assertThat(stepExecution.getCommitCount()).isEqualTo(8); - - final DestinationIcon iconAllAccounts = new DestinationIcon(1, null, "fas fa-landmark", null); - final DestinationIcon iconEmpty1 = new DestinationIcon(2, null, null, null); - final DestinationIcon iconEmpty2 = new DestinationIcon(3, null, null, null); - final DestinationIcon iconEmpty3 = new DestinationIcon(4, null, null, null); - final DestinationIcon iconWithImage = new DestinationIcon(5, 1, null, null); - final DestinationIcon iconBuiltin = new DestinationIcon(6, null, "fas fa-apple-alt", null); - final DestinationIcon iconFontColor = new DestinationIcon(7, null, null, "#000000ff"); - - final List<DestinationIcon> icons = iconRepository.findAll(); - assertThat(icons) - .hasSize(7) - .containsExactly(iconAllAccounts, iconEmpty1, iconEmpty2, iconEmpty3, iconWithImage, iconBuiltin, iconFontColor); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateImagesTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateImagesTest.java deleted file mode 100644 index 0ec2d42c1..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateImagesTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.image.DestinationImage; -import de.deadlocker8.budgetmaster.databasemigrator.destination.image.DestinationImageIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateImagesTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateImagesTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:categories.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationImageIntegerRepository imageRepository; - - @Test - void test_stepMigrateImages() throws IOException, URISyntaxException - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.IMAGES, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isOne(); - assertThat(stepExecution.getCommitCount()).isEqualTo(2); - - final byte[] imageBytes = Files.readAllBytes(Paths.get(this.getClass().getClassLoader().getResource("BudgetMaster.svg").toURI())); - final DestinationImage expectedImage = new DestinationImage(1, imageBytes, "BudgetMaster.svg", 2); - - final List<DestinationImage> images = imageRepository.findAll(); - assertThat(images) - .hasSize(1) - .containsExactly(expectedImage); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndAfterXTimesTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndAfterXTimesTest.java deleted file mode 100644 index 643759068..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndAfterXTimesTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndAfterXTimes; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndAfterXTimesIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingEndAfterXTimesTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingEndAfterXTimesTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingEndAfterXTimesIntegerRepository repeatingEndAfterXTimesRepository; - - @Test - void test_stepMigrateRepeatingEndAfterXTimes() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_END_AFTER_X_TIMES, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(4); - assertThat(stepExecution.getCommitCount()).isEqualTo(5); - - final DestinationRepeatingEndAfterXTimes endAfterXTimes = new DestinationRepeatingEndAfterXTimes(6, 2); - - final List<DestinationRepeatingEndAfterXTimes> repeatingEndAfterXTimes = repeatingEndAfterXTimesRepository.findAll(); - assertThat(repeatingEndAfterXTimes) - .hasSize(4) - .contains(endAfterXTimes); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndDateTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndDateTest.java deleted file mode 100644 index 8afa57b01..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndDateTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndDate; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndDateIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingEndDateTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingEndDateTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingEndDateIntegerRepository repeatingEndDateRepository; - - @Test - void test_stepMigrateRepeatingEndDates() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_END_DATE, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(1); - assertThat(stepExecution.getCommitCount()).isEqualTo(2); - - final DestinationRepeatingEndDate endDate = new DestinationRepeatingEndDate(4, LocalDate.of(2022, 3, 31)); - - final List<DestinationRepeatingEndDate> repeatingEndDates = repeatingEndDateRepository.findAll(); - assertThat(repeatingEndDates) - .hasSize(1) - .containsExactly(endDate); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndNeverTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndNeverTest.java deleted file mode 100644 index 0cf717c77..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndNeverTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndNever; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndNeverIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingEndNeverTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingEndNeverTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingEndNeverIntegerRepository repeatingEndNeverRepository; - - @Test - void test_stepMigrateRepeatingEndNever() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_END_NEVER, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(1); - assertThat(stepExecution.getCommitCount()).isEqualTo(2); - - final DestinationRepeatingEndNever endNever = new DestinationRepeatingEndNever(5); - - final List<DestinationRepeatingEndNever> repeatingEndNevers = repeatingEndNeverRepository.findAll(); - assertThat(repeatingEndNevers) - .hasSize(1) - .containsExactly(endNever); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndsTest.java deleted file mode 100644 index cc0de3d56..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingEndsTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEnd; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.end.DestinationRepeatingEndIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingEndsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingEndsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingEndIntegerRepository repeatingEndRepository; - - @Test - void test_stepMigrateRepeatingEnds() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_ENDS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(6); - assertThat(stepExecution.getCommitCount()).isEqualTo(7); - - final DestinationRepeatingEnd repeatingEndDate = new DestinationRepeatingEnd(4, "repeating.end.key.date", "RepeatingEndDate"); - final DestinationRepeatingEnd repeatingEndNever = new DestinationRepeatingEnd(5, "repeating.end.key.never", "RepeatingEndNever"); - final DestinationRepeatingEnd repeatingEndAfterXTimes = new DestinationRepeatingEnd(6, "repeating.end.key.afterXTimes", "RepeatingEndAfterXTimes"); - - final List<DestinationRepeatingEnd> repeatingEnds = repeatingEndRepository.findAll(); - assertThat(repeatingEnds) - .hasSize(6) - .contains(repeatingEndDate, repeatingEndNever, repeatingEndAfterXTimes); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierDaysTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierDaysTest.java deleted file mode 100644 index daeafd0fa..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierDaysTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierDays; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierDaysIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingModifierDaysTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingModifierDaysTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingModifierDaysIntegerRepository modifierDaysRepository; - - @Test - void test_stepMigrateRepeatingModifierDays() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_MODIFIER_DAYS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(2); - assertThat(stepExecution.getCommitCount()).isEqualTo(3); - - final DestinationRepeatingModifierDays modifierDays = new DestinationRepeatingModifierDays(7); - - final List<DestinationRepeatingModifierDays> repeatingModifierDays = modifierDaysRepository.findAll(); - assertThat(repeatingModifierDays) - .hasSize(2) - .contains(modifierDays); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierMonthsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierMonthsTest.java deleted file mode 100644 index b231b73f5..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierMonthsTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierMonths; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierMonthsIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingModifierMonthsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingModifierMonthsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingModifierMonthsIntegerRepository modifierMonthsRepository; - - @Test - void test_stepMigrateRepeatingModifierMonths() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_MODIFIER_MONTHS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(3); - assertThat(stepExecution.getCommitCount()).isEqualTo(4); - - final DestinationRepeatingModifierMonths modifierMonths = new DestinationRepeatingModifierMonths(4); - - final List<DestinationRepeatingModifierMonths> repeatingModifierMonths = modifierMonthsRepository.findAll(); - assertThat(repeatingModifierMonths) - .hasSize(3) - .contains(modifierMonths); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierYearsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierYearsTest.java deleted file mode 100644 index 8989c464a..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifierYearsTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierYears; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierYearsIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingModifierYearsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingModifierYearsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingModifierYearsIntegerRepository modifierYearsRepository; - - @Test - void test_stepMigrateRepeatingModifierYears() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_MODIFIER_YEARS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(1); - assertThat(stepExecution.getCommitCount()).isEqualTo(2); - - final DestinationRepeatingModifierYears modifierYears = new DestinationRepeatingModifierYears(8); - - final List<DestinationRepeatingModifierYears> repeatingModifierYears = modifierYearsRepository.findAll(); - assertThat(repeatingModifierYears) - .hasSize(1) - .contains(modifierYears); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifiersTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifiersTest.java deleted file mode 100644 index 496455039..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingModifiersTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifier; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.modifier.DestinationRepeatingModifierIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingModifiersTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingModifiersTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingModifierIntegerRepository repeatingModifierRepository; - - @Test - void test_stepMigrateRepeatingModifiers() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_MODIFIERS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(6); - assertThat(stepExecution.getCommitCount()).isEqualTo(7); - - final DestinationRepeatingModifier modifierDays = new DestinationRepeatingModifier(7, "repeating.modifier.days", "RepeatingModifierDays", 2); - final DestinationRepeatingModifier modifierMonths = new DestinationRepeatingModifier(4, "repeating.modifier.months", "RepeatingModifierMonths", 1); - final DestinationRepeatingModifier modifierYears = new DestinationRepeatingModifier(8, "repeating.modifier.years", "RepeatingModifierYears", 1); - - final List<DestinationRepeatingModifier> repeatingModifiers = repeatingModifierRepository.findAll(); - assertThat(repeatingModifiers) - .hasSize(6) - .contains(modifierDays, modifierMonths, modifierYears); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingOptionsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingOptionsTest.java deleted file mode 100644 index 93a7a6edc..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateRepeatingOptionsTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.DestinationRepeatingOption; -import de.deadlocker8.budgetmaster.databasemigrator.destination.repeating.DestinationRepeatingOptionIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateRepeatingOptionsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateRepeatingOptionsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationRepeatingOptionIntegerRepository repeatingOptionRepository; - - @Test - void test_stepMigrateRepeatingOptions() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPEATING_OPTIONS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(6); - assertThat(stepExecution.getCommitCount()).isEqualTo(7); - - final DestinationRepeatingOption repeatingOption = new DestinationRepeatingOption(4, LocalDate.of(2022, 3, 23), 4, 4); - - final List<DestinationRepeatingOption> destinationRepeatingOptions = repeatingOptionRepository.findAll(); - assertThat(destinationRepeatingOptions) - .hasSize(6) - .contains(repeatingOption); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportColumnsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportColumnsTest.java deleted file mode 100644 index 695ec3958..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportColumnsTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportColumn; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportColumnIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateReportColumnsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateReportColumnsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:default_database_after_first_start.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationReportColumnIntegerRepository columnRepository; - - @Test - void test_stepMigrateReportColumns() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPORT_COLUMNS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(11); - assertThat(stepExecution.getCommitCount()).isEqualTo(12); - - final DestinationReportColumn column1 = new DestinationReportColumn(1, true, "report.position", 0, 1); - final DestinationReportColumn column2 = new DestinationReportColumn(2, true, "report.date", 1, 1); - final DestinationReportColumn column3 = new DestinationReportColumn(3, true, "report.repeating", 2, 1); - final DestinationReportColumn column4 = new DestinationReportColumn(4, true, "report.transfer", 3, 1); - final DestinationReportColumn column5 = new DestinationReportColumn(5, true, "report.category", 4, 1); - final DestinationReportColumn column6 = new DestinationReportColumn(6, true, "report.name", 5, 1); - final DestinationReportColumn column7 = new DestinationReportColumn(7, true, "report.description", 6, 1); - final DestinationReportColumn column8 = new DestinationReportColumn(8, true, "report.tags", 7, 1); - final DestinationReportColumn column9 = new DestinationReportColumn(9, true, "report.account", 8, 1); - final DestinationReportColumn column10 = new DestinationReportColumn(10, true, "report.rating", 9, 1); - final DestinationReportColumn column11 = new DestinationReportColumn(11, true, "report.amount", 10, 1); - - final List<DestinationReportColumn> reportColumns = columnRepository.findAll(); - assertThat(reportColumns) - .hasSize(11) - .containsExactly(column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportSettingsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportSettingsTest.java deleted file mode 100644 index dc7493ece..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateReportSettingsTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportSettings; -import de.deadlocker8.budgetmaster.databasemigrator.destination.report.DestinationReportSettingsIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateReportSettingsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateReportSettingsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:default_database_after_first_start.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationReportSettingsIntegerRepository settingsRepository; - - @Test - void test_stepMigrateReportSettings() - { - assertThat(settingsRepository.findAll()).isEmpty(); - - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.REPORT_SETTINGS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(1); - assertThat(stepExecution.getCommitCount()).isEqualTo(2); - - final DestinationReportSettings settings = new DestinationReportSettings(1, LocalDate.of(2022, 3, 15), true, true, true); - - final List<DestinationReportSettings> reportSettings = settingsRepository.findAll(); - assertThat(reportSettings) - .hasSize(1) - .containsExactly(settings); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateSettingsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateSettingsTest.java deleted file mode 100644 index 7eac72ef4..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateSettingsTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.settings.DestinationSettings; -import de.deadlocker8.budgetmaster.databasemigrator.destination.settings.DestinationSettingsIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateSettingsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateSettingsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:default_database_after_first_start.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationSettingsIntegerRepository settingsRepository; - - @Test - void test_stepMigrateSettings() - { - assertThat(settingsRepository.findAll()).isEmpty(); - - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.SETTINGS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(1); - assertThat(stepExecution.getCommitCount()).isEqualTo(2); - - final DestinationSettings settings = new DestinationSettings(1, "€", false, 1, false, true, true, true, LocalDate.of(2022, 3, 15), 10, 0, 1, 0, 3, "", "", "", "", 35, false, false); - - final List<DestinationSettings> settingsItems = settingsRepository.findAll(); - assertThat(settingsItems) - .hasSize(1) - .contains(settings); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTagsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTagsTest.java deleted file mode 100644 index 222ce4716..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTagsTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.tag.*; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateTagsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateTagsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:tags.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationTagIntegerRepository tagRepository; - - @Autowired - private DestinationTemplateTagIntegerRepository templateTagRepository; - - @Autowired - private DestinationTransactionTagIntegerRepository transactionTagRepository; - - @Test - void test_stepMigrateTags() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.TAGS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(2); - assertThat(stepExecution.getCommitCount()).isEqualTo(3); - - final DestinationTag tag1 = new DestinationTag(1, "My Awesome Tag"); - final DestinationTag tag2 = new DestinationTag(2, "ABC"); - - final List<DestinationTag> tags = tagRepository.findAll(); - assertThat(tags) - .hasSize(2) - .containsExactly(tag1, tag2); - } - - @Test - void test_stepMigrateTemplateTags() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.TEMPLATE_TAGS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(2); - assertThat(stepExecution.getCommitCount()).isEqualTo(3); - - final DestinationTemplateTag tag1 = new DestinationTemplateTag(1, 1); - final DestinationTemplateTag tag2 = new DestinationTemplateTag(1,2); - - final List<DestinationTemplateTag> tags = templateTagRepository.findAll(); - assertThat(tags) - .hasSize(2) - .containsExactly(tag1, tag2); - } - - @Test - void test_stepMigrateTransactionTags() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.TRANSACTION_TAGS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(3); - assertThat(stepExecution.getCommitCount()).isEqualTo(4); - - final DestinationTransactionTag tag1 = new DestinationTransactionTag(1, 1); - final DestinationTransactionTag tag2 = new DestinationTransactionTag(2,1); - final DestinationTransactionTag tag3 = new DestinationTransactionTag(2,2); - - final List<DestinationTransactionTag> tags = transactionTagRepository.findAll(); - assertThat(tags) - .hasSize(3) - .containsExactly(tag1, tag2, tag3); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplateGroupsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplateGroupsTest.java deleted file mode 100644 index b9482d798..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplateGroupsTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.templateGroup.DestinationTemplateGroup; -import de.deadlocker8.budgetmaster.databasemigrator.destination.templateGroup.DestinationTemplateGroupIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateTemplateGroupsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateTemplateGroupsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:templates.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationTemplateGroupIntegerRepository templateGroupRepository; - - @Test - void test_stepMigrateTemplateGroups() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.TEMPLATE_GROUPS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(2); - assertThat(stepExecution.getCommitCount()).isEqualTo(3); - - final DestinationTemplateGroup templateGroupDefault = new DestinationTemplateGroup(1, "Not grouped", 0); - final DestinationTemplateGroup templateGroup = new DestinationTemplateGroup(2, "Template Group", 1); - - final List<DestinationTemplateGroup> templateGroups = templateGroupRepository.findAll(); - assertThat(templateGroups) - .hasSize(2) - .contains(templateGroupDefault, templateGroup); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplatesTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplatesTest.java deleted file mode 100644 index b4e4923cc..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTemplatesTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.template.DestinationTemplate; -import de.deadlocker8.budgetmaster.databasemigrator.destination.template.DestinationTemplateIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateTemplatesTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateTemplatesTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:templates.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationTemplateIntegerRepository templateRepository; - - @Test - void test_stepMigrateTemplates() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.TEMPLATES, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(3); - assertThat(stepExecution.getCommitCount()).isEqualTo(4); - - final DestinationTemplate templateNormal = new DestinationTemplate(1, "Template normal", null, true, null, 1, "", "", 5, null, 1); - final DestinationTemplate templateTransfer = new DestinationTemplate(2, "Template transfer", null, true, 2, 1, "", "", 7, 3, 1); - final DestinationTemplate templateWithGroup = new DestinationTemplate(3, "Template with group", 1200, false, null, 1, "", "", 8, null, 2); - - final List<DestinationTemplate> templates = templateRepository.findAll(); - assertThat(templates) - .hasSize(3) - .contains(templateNormal, templateTransfer, templateWithGroup); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTransactionsTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTransactionsTest.java deleted file mode 100644 index 095327a19..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateTransactionsTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.transaction.DestinationTransaction; -import de.deadlocker8.budgetmaster.databasemigrator.destination.transaction.DestinationTransactionIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateTransactionsTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateTransactionsTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:transactions.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationTransactionIntegerRepository transactionRepository; - - @Test - void test_stepMigrateTransactions() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.TRANSACTIONS, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(12); - assertThat(stepExecution.getCommitCount()).isEqualTo(13); - - final DestinationTransaction transactionNormal = new DestinationTransaction(1, -1500, true, LocalDate.of(2022, 3, 23), 2, 3, "Normal transaction", "", null, null); - final DestinationTransaction transactionRepeating = new DestinationTransaction(5, -100, true, LocalDate.of(2022, 3, 23), 2, 1, "Repeating month end date", "", 4, null); - final DestinationTransaction transactionTransfer = new DestinationTransaction(12, -1000, true, LocalDate.of(2022, 3, 27), 2, 1, "Transfer", "", null, 3); - final DestinationTransaction transactionTransferRepeating = new DestinationTransaction(13, -200, true, LocalDate.of(2022, 3, 27), 2, 1, "Repeating Transfer", "", 9, 3); - - final List<DestinationTransaction> transactions = transactionRepository.findAll(); - assertThat(transactions) - .hasSize(12) - .contains(transactionNormal, transactionRepeating, transactionTransfer, transactionTransferRepeating); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateUsersTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateUsersTest.java deleted file mode 100644 index 06b9f5cd7..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigrateUsersTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.user.DestinationUser; -import de.deadlocker8.budgetmaster.databasemigrator.destination.user.DestinationUserIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(MigrateUsersTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class MigrateUsersTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:default_database_after_first_start.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationUserIntegerRepository userRepository; - - @Test - void test_stepMigrateUsers() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.USER, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(1); - assertThat(stepExecution.getCommitCount()).isEqualTo(2); - - final DestinationUser user = new DestinationUser(1, "Default", "$2a$10$dbMjXS1WOp40fpbIa4uyV./JnMsw3tQBNmTqhhgRPm.I3C1HnQLSS", 2); - - final List<DestinationUser> users = userRepository.findAll(); - assertThat(users) - .hasSize(1) - .contains(user); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigratorTestBase.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigratorTestBase.java deleted file mode 100644 index f5cd1d800..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/MigratorTestBase.java +++ /dev/null @@ -1,129 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersBuilder; -import org.springframework.batch.test.JobLauncherTestUtils; -import org.springframework.batch.test.JobRepositoryTestUtils; -import org.springframework.batch.test.context.SpringBatchTest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import org.springframework.transaction.PlatformTransactionManager; -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - - -@SpringBatchTest -@SpringBootTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -@Testcontainers -@ContextConfiguration(classes = {BatchConfiguration.class}) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) -@EnableJpaRepositories( - entityManagerFactoryRef = "secondaryEntityManagerFactory", - transactionManagerRef = "secondaryTransactionManager", - basePackages = {"de.deadlocker8.budgetmaster.databasemigrator.destination"} -) -@Import(MigratorTestBase.DestinationTestDatabaseConfiguration.class) -public abstract class MigratorTestBase -{ - protected static final JobParameters DEFAULT_JOB_PARAMETERS = new JobParametersBuilder().toJobParameters(); - - @Autowired - protected JobLauncherTestUtils jobLauncherTestUtils; - - @Autowired - protected JobRepositoryTestUtils jobRepositoryTestUtils; - - @AfterEach - public void afterEach() - { - jobRepositoryTestUtils.removeJobExecutions(); - } - - @Container - static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.5") - .withDatabaseName("budgetmaster-tests-db") - .withUsername("budgetmaster") - .withPassword("BudgetMaster"); - - @DynamicPropertySource - static void properties(DynamicPropertyRegistry registry) - { - registry.add("spring.seconddatasource.url", postgresDB::getJdbcUrl); - registry.add("spring.seconddatasource.username", postgresDB::getUsername); - registry.add("spring.seconddatasource.password", postgresDB::getPassword); - } - - @BeforeAll - public static void beforeAll() - { - DatabaseMigratorMain.databaseType = DatabaseType.POSTGRESQL; - } - - @TestConfiguration - static class DestinationTestDatabaseConfiguration - { - @Primary - @Bean(name = "primaryEntityManagerFactory") - public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder, - @Qualifier("primaryDataSource") DataSource primaryDataSource) - { - return builder - .dataSource(primaryDataSource) - .packages("de.deadlocker8.budgetmaster.databasemigrator.source") - .build(); - } - - @Bean(name = "primaryTransactionManager") - public PlatformTransactionManager primaryTransactionManager( - @Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory) - { - return new JpaTransactionManager(primaryEntityManagerFactory); - } - - @Bean(name = "secondaryDataSource") - public DataSource secondaryDataSource() - { - return DataSourceBuilder.create().username(postgresDB.getUsername()).password(postgresDB.getPassword()) - .url(postgresDB.getJdbcUrl()).driverClassName(postgresDB.getDriverClassName()).build(); - } - - @Bean(name = "secondaryEntityManagerFactory") - public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder, - @Qualifier("secondaryDataSource") DataSource secondaryDataSource) - { - return builder - .dataSource(secondaryDataSource) - .packages("de.deadlocker8.budgetmaster.databasemigrator.destination") - .build(); - } - - @Bean(name = "secondaryTransactionManager") - public PlatformTransactionManager secondaryTransactionManager( - @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory secondaryEntityManagerFactory) - { - return new JpaTransactionManager(secondaryEntityManagerFactory); - } - } -} diff --git a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/UpdateSequencesTest.java b/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/UpdateSequencesTest.java deleted file mode 100644 index 30c69187e..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/java/de/deadlocker8/budgetmaster/databasemigrator/UpdateSequencesTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.deadlocker8.budgetmaster.databasemigrator; - -import de.deadlocker8.budgetmaster.databasemigrator.destination.StepNames; -import de.deadlocker8.budgetmaster.databasemigrator.destination.category.DestinationCategory; -import de.deadlocker8.budgetmaster.databasemigrator.destination.category.DestinationCategoryIntegerRepository; -import org.junit.jupiter.api.Test; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.StepExecution; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.Resource; - -import javax.sql.DataSource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Import(UpdateSequencesTest.TestDatabaseConfiguration.class) -@EnableAutoConfiguration -class UpdateSequencesTest extends MigratorTestBase -{ - @TestConfiguration - static class TestDatabaseConfiguration - { - @Value("classpath:categories.mv.db") - private Resource databaseResource; - - @Bean(name = "primaryDataSource") - @Primary - public DataSource dataSource() throws IOException - { - final String folderName = databaseResource.getFile().getAbsolutePath().replace(".mv.db", ""); - String jdbcString = "jdbc:h2:/" + folderName + ";DB_CLOSE_ON_EXIT=TRUE"; - return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build(); - } - } - - @Autowired - private DestinationCategoryIntegerRepository categoryRepository; - - @Test - void test_updateSequences() - { - final JobExecution jobExecution = jobLauncherTestUtils.launchStep(StepNames.CATEGORIES, DEFAULT_JOB_PARAMETERS); - final List<StepExecution> stepExecutions = new ArrayList<>(jobExecution.getStepExecutions()); - - assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); - - assertThat(stepExecutions).hasSize(1); - final StepExecution stepExecution = stepExecutions.get(0); - assertThat(stepExecution.getReadCount()).isEqualTo(5); - assertThat(stepExecution.getCommitCount()).isEqualTo(6); - - final List<DestinationCategory> categoriesOrderedById = categoryRepository.findAllByOrderByIDDesc(); - final DestinationCategory savedCategory = categoryRepository.save(new DestinationCategory(null, "New One", "#ffffff", 0, null)); - assertThat(savedCategory.getID()).isEqualTo(categoriesOrderedById.get(0).getID() + 1); - - final DestinationCategory savedCategory2 = categoryRepository.save(new DestinationCategory(null, "New Two", "#ffffff", 0, null)); - assertThat(savedCategory2.getID()).isEqualTo(categoriesOrderedById.get(0).getID() + 2); - } -} \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/BudgetMaster.svg b/BudgetMasterDatabaseMigrator/src/test/resources/BudgetMaster.svg deleted file mode 100644 index 1f64835cc..000000000 --- a/BudgetMasterDatabaseMigrator/src/test/resources/BudgetMaster.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 1218 1218" width="1218pt" height="1218pt"><defs><clipPath id="_clipPath_rWtj0rtuYbDYO4GkwsTvP2oNwd4oCylR"><rect width="1218" height="1218"/></clipPath></defs><g clip-path="url(#_clipPath_rWtj0rtuYbDYO4GkwsTvP2oNwd4oCylR)"><path d="M 245.75 80 L 972.25 80 C 999.294 80 1021.25 101.956 1021.25 129 L 1021.25 1165 C 1021.25 1192.044 999.294 1214 972.25 1214 L 245.75 1214 C 218.706 1214 196.75 1192.044 196.75 1165 L 196.75 129 C 196.75 101.956 218.706 80 245.75 80 Z" style="stroke:none;fill:#2E79B9;stroke-miterlimit:10;"/><rect x="270" y="168" width="678" height="958" transform="matrix(1,0,0,1,0,0)" fill="rgb(255,255,255)"/><path d=" M 378.5 197 L 839.5 197 Q 820.716 81.878 661.5 57 C 656.929 56.286 660.595 7 608.5 7 C 556.143 7 557.406 56.676 555.5 57 Q 378.643 87.071 378.5 197 Z " fill="rgb(105,105,105)"/><g><rect x="569.086" y="122.453" width="402.735" height="935.051" transform="matrix(0.839,-0.544,0.544,0.839,-197.013,514.592)" fill="rgb(139,175,90)"/><rect x="628.931" y="197.261" width="283.83" height="785.261" transform="matrix(0.839,-0.544,0.544,0.839,-196.902,514.791)" fill="rgb(179,226,116)"/><path d=" M 694.002 635.907 C 637.162 548.381 624.763 455.405 666.332 428.41 C 707.9 401.416 787.795 450.56 844.635 538.086 C 901.475 625.612 913.874 718.588 872.306 745.583 C 830.737 772.577 750.842 723.433 694.002 635.907 Z " fill="rgb(139,175,90)"/><rect x="568.628" y="473.172" width="405.742" height="234.553" transform="matrix(0.839,-0.544,0.544,0.839,-197.1,515.237)" fill="rgb(207,207,207)"/></g><g><circle vector-effect="non-scaling-stroke" cx="557" cy="929" r="103" fill="rgb(255,215,11)"/><circle vector-effect="non-scaling-stroke" cx="333" cy="760.0000000000001" r="103" fill="rgb(255,215,11)"/></g></g></svg> \ No newline at end of file diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/accounts.mv.db b/BudgetMasterDatabaseMigrator/src/test/resources/accounts.mv.db deleted file mode 100644 index 8b6e4cd28d0589aeb2683b8f76702b99a3739dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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Ȼ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 Az5oCK diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/categories.mv.db b/BudgetMasterDatabaseMigrator/src/test/resources/categories.mv.db deleted file mode 100644 index 969f8d0520b74646047b99076f15a476a3ef1a3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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 diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/charts.mv.db b/BudgetMasterDatabaseMigrator/src/test/resources/charts.mv.db deleted file mode 100644 index 46bbc4fd95ad405feae04633be9dbca7b9a3c368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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 H9d9lGNPIes diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/default_database_after_first_start.mv.db b/BudgetMasterDatabaseMigrator/src/test/resources/default_database_after_first_start.mv.db deleted file mode 100644 index 36ca61ae144e56adb8d0d616095a9c96a576d8df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94208 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�R?uhPwJWyT%*2xR^URnH$F&8d^HVn;5#9$2++h z8N|D~nLC<0TNoM}xEUyED){+_DENi?_<)J{5dU}=S2xE{pAZF@K?+I%p-w)Y&PsYp z!I8lsuD&E%p#xq|r{wJK;~%7?5at-<?BN)sVPtBm36%lep@Av^cNA1bNMwMkl7gpS zh^xD65LC?5+21cd$koj?2<%%=7q|j0O+gk71!dk`=O9<d5Lc>sL?JlDF(^bK+%v>O z!C1k`)yLn@Js1>XA&yQyu7WI@3W~fQP&)&HJbfL5A{D${Bay-nDjM(Y8X0e_q~Py| zB<JiH;_B`n6se@4<msZMDafLwpvqhB=o8`^qyV-6n_2}&7Z(L*f4|_6AV*KX5M(8A zL6A*Qi$TtT7_Z>z=i(ZHq#mjQ>NG(XZ3PA19ww-7oE@D#TwO4o;o%q*qND+dU!({? zk3JXA-~b=T$arkg=pN)B8h}-XaIy#pat-rz4UhNqb#!-)ck}ddjmOjkO)kOCL7o92 zN(v#a5g||^Y|aUD4GQ-3_k*V;xK}`lN=HGF*9{sZ(C`9<D6UX+L62cba6zM2S3#Ax z3`g{W6%rS>E=meWP9Y|8U6ce_^b{0$_YjC(4^Ka=kqavyH2hp6LKMOreL`Io-28)( zLIJ&)urzZvH8eIfi+6Rhu#7ixadwWkFmp7Gw{$XdcD1y$FtIQ&qp&0*$_i+_dj`k5 zcn14=1_!&kC@DDk`}?>$`oSX_s>sLR+0n-{$}z;#-w%{2PzxwfYS1UGh#|^_$VH3= zmLi5lKtYk$h3F(`gq8v!Q3_3fEP@KEyv5j4AXp($3DAht^k<|b$igC|pul^9K>7m} z@Yo6$($k-*xtW2niMdm}v!RnwyorT{S-hpCiFv%Up{t9fv$>h8qp=Bv>5nKYph?Rq z)YB)#(=XoB#nmsw)6LTrd$s81?-vq}yVishdPt=%C{3~mla?rnayD|JG{u%EMHCcy zU5QVW=&2GC(Xdo0s-VhSiak|=6%v;!Nl%vGbSb8wz<Y;Kx&+lW)Jd2|mWC!~2F4cg zj%Ma2@g_zFX7P?r#zyf521e%2X6CNOPG;s5CQPENfF?|E4eA;Z;_8RJ4n$UlS<%8v zP)I)uss9a|Q%^z+0HmfEq$L|$rcu(P#-SJ5|4)YY^9;?P{XEc$0BDcS4Br1YhxH*L zJv(E_gt8H0LOIzu1>Unu#$h8-!jS&|QE>mCnSmDle*u=4nEijq48>^w-^vm?;DD4a z!6Odv0SDy42FUsmjMPHfXwm36Kz^PT%Jj+TH~`(o0Y>}(qy2x#pulMVUqL}ZX|(?z z6bb6b#v70J|3~}(pz+1g{{LwIf3*Ma2rU+kM*IItRPFyG^}k{L|71k}Kh50GEZHQ{ Lkf^RRX^OZ2fy`U3 diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/tags.mv.db b/BudgetMasterDatabaseMigrator/src/test/resources/tags.mv.db deleted file mode 100644 index 4da999fd57030cf2e32dc930e307362256c0b149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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 Pm||j?N=b(rt6nYu$@ue9 diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/templates.mv.db b/BudgetMasterDatabaseMigrator/src/test/resources/templates.mv.db deleted file mode 100644 index e24aa14aa03cf56d6d7c6f7e56a2ad85f57b0eae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94208 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 diff --git a/BudgetMasterDatabaseMigrator/src/test/resources/transactions.mv.db b/BudgetMasterDatabaseMigrator/src/test/resources/transactions.mv.db deleted file mode 100644 index 93435af3eeceb9d2c7e495edc68a75992fc210c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 zcmeaUGSW%P$xqI<GBkrQf-|d9tqcte40Mt+O7pU<j8k=zi&7IyQd6u9&C`-B%u>vg zjEr>B@{4j4ORNla%2JDpGxPI6>e6yjOOi8Ei>%TNjSWo<5-qtHM!{$ZjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz`%#VX#aoU<6zVUqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsK<f~I&haNh=KigWbaGPjtPD+bax%+OeG@CJ49!g}48XjA z#Prl+D`R7w+{6Ma6APVOuxw(gfldKL##E;$KflB(&A`CGz{Jwf(!gA&Br`YF%FsB~ z*uugv6|qtvS%D}3T0P*&@Pe6@k%57qfq}tt9++kcoCBuW>*T;R_hlI{&0iY>riHrY zBqSsxge6!dSq)h|Srb_+85jf-1a>h?Fc=yco0yuJvvRO<vU0I<v+}U=vhuO=vkI^Z zvI?;Zvx=~avWl^avq~@svM4I3MFhKsC^!eXI)=E$JB51sxF{G}S_-l#DJb!_Fhax? zLW5m{6g=G&{QN@{Tq8V#LxL5Qf*q9<f*pNA6x1y&EfXzF&5crwO${sz&5YF*JRE~P z6x5B)4K0$5j8jt#Q;dyM(oB=hjVw})l2TGljZ;&M49t=f%~DcLOpFXI3=@r#OjC_a zEK&`P4AYE_)6&c=6O+{y99?`p{RCN*6%=^qF+<(r?C9*_>Y@<h=;Y(7pcD}5<m2hA zq^IQQ?Cc-v7ow!W1qyd1PZuQxPrndXch?{V7gsmOP@fP54L{e25QQ*DpHNo?H~%0c z&B2kuA+Emh!LEU!u71w0@y?Fs&ZfqW2JueD&ZhAuZca||md>Uw@h+}z&Zd?|E>0#E zhDw^?;P4Ce@lgN~@ge>od9Y0|gDAB^2jUs1-{ONq979~;{(?$+2E(jXQgHJ3_i=Uf zL&yZX`nWoWxVoTA`8oQ!Dk+3H2042;25A_Xnj$;{)f^HTfN7Ppzh8WitD9>OIFyjW zm`hWTMMXiGHy0X7)CvHF;1I{45QT8h5Dx_t1t(V@e?RwNP)LKLUywyrL6O%TYG*)@ zr>|pBq=L6=BvQCTMdQ6)Bja6_6#V^=<e=fIqyb7Unu0893aY$ijy@r-K{%6_f}@Lz zg0sJ0a7d7&r(Xz?VF*ExJy2^wj)9o2;OXb$8iAx9ssidTK^Aod1>WaOP`}_v<j#&E zuI~Opk<>}$uI8pLW~LUV@h*<0&haMZX3p`BmgWZWmaa~2&c>DoMh3=a6sB^btbnFC zXMZ36Ak;(&m7zsy)gUdk66Fy>sZ~=!k=Fwn!_eplB@i5m!Wb>JA|fA}T(uNbdCRdU zSGZcD(yOtO0+MrxNUz39f-Kq!3cNjp(yNDK5Y{3YRFQxRO=twWcm@afI7Y@}D|Fn0 z{6hn<$`DQ#0YR=|p045Xp1zLmuJLZ3KCbbYnxJk7b`J6k2vJf9ag7Lp3So0jm}^k5 zr@tS(6oyv<pdwI5L6O&u_y~4Ek6}n~L8Dg}cWDGFwL_GMi(40xBiBVqkVQ{Hfp-sq z*!A$FR()&i>}Y6aVPX<*;ArL&Z{lod7;kCl<Q8x4>||i(X71|jYT-y>Nko(t(0B(` zsh+{Up25LLH77ixp^AL`ogIBVqZ~s#{ry0NIBLlSN)7s?6){A)5V?r4z)~Ty2q-A> zx)7ZNjnGmcBub$PkVQ~ImA4ps0RvV@R01?2HT@YW39_&VDJbyHXMy?yM{OA5>Kot# zY7tST&1Y(AY+~kW;u>$^<YXRi;%00Z?_}WW6mRBiY;5A{V&G!wYD8fgB+3eC@^bVA zH)mmuSg5FrE2NkLmq5tPH>kX4aJ*|ofUBR2XGmy}E8$ijR2wWLahHzJrcyjon-8iN zR@GpU^2FI*gz60ma`X#!a}A2eZ9Lp*ka_^geoz);5hg8<xfz=qm>9ZR#Jf2exy75f zIhw{h8M!#e8ygxpn;MuH8arD!D<S7Gb8LA`L_v|)6Ph-WDoz~rxS2CrCWCni-tJ@( zRZ!)vz@E|Iiiyf>Bp3E(&Y;{Trl7!khd^l$u0yHQ@H8|uH?nYXbcuI#bheB)F?Di^ zcXV=ejyJP#Gct8Db~H9~Godi65oHB56@uFZt`Q-we%NbvWM!Dm2lRRY5>5(EKK@Q{ zDR5F1CoQQG<pboTYKSeVN+>Aux)PmKP0&&*#4nHrAp--?CfO6r5)7=8tWvDftTL>! zta7aKtO~4(tV*oPtSYRktZJ<4tQxGEtXizvtU9c^ta_~atOg8%EG&`=s=OuG6F9^U zqEfdBsa1&yC~-?EDDWO6khp_f16&<LJpJ6`UHx2Oi5$}WgO#$zh8TThq{4`dK?YM( zBPUl27w33K69dC|6H^1zcnbq(<9Gv87js85V`E1%LsJTK0Z~>!lQ-e^42!gaGH)I< zF%i+jC(3q|6l{Pk3Ck!b^7=t-C0yDXqc>^Lq88S+kyTLTt;3!oQFRcNGC{T?xebzI z@OJr)!Oa{w1qI$>sNZn3a!_0o@8}ld8Wa)Y>FXK{Po`iFtf2rebD+_RoJL{2E^u)q zub{{q3AGx@={PDeOSF;!kE>uIte~LE+rdag5TkgCsNl9FwIHwr6$FY33cMLm9}^YW zE=Y|_S3j3{Fkb;2_#uwI0fa(WNkNe}2x=eU5O%{G!eFZ*$x4ugMOi_Ww~?rz1?wX! zOx;KgQ#VkUswgP%`a}IlRG9j?hPej8k}l4~2^!Z6h8jya=*;j29n?lxvIGtCH4znd z5RF6yo*AiuX9fy9(2(CfqH88!e-}?TPekC+xOy@(Ff_KXa5j&3H8(eiH!(GIjdwIO zaf`Qba&dBXaWykCbEdRUPLvhUT!z1Tf+`9Ob@U7I42gt~&VWlg&`=)<)fQ2%B3x~O z2Kz`z!lpRWFe2VzNf<Qn*Gw=8!}SrDf=x+I!ls}!3>pT6d6QrP0CQ5ji(@3b{=!)Z zfJW0Ih%N+N(HpObDhkb7STKSH*a%lpsG5liOOR8LN-apSjkh)63T~-_2HirT9wt64 zef|AHJP3!TzJele6x47e$Kk5)(MO-LgeJ^lSa=#JsPc9Zoh;*_+KCELOOl7EEsd2J z7z9IjCV+Y@hO9=c#;hi+rmSYH=ByU1maJB+)~q(Hwybun_N)%9j;v0s&a5u1uB>jX z?yMf59*d!Z0&fU3xQLI7NLR-o!ck$QpvX&n!geB9GQ>lzg++w1f+}x2@eu*hO;kKM zky=PNfyxLI1qI$qMAviv0iYpOY)u5xCvshl+>D(Joh{>CP0fwtP0S1|;w_DxjN{GC z%#F+p%$y93&CDt6V-aNqw0;85X5wf@f*P0*uVWcWgBL<bg(bLdGbOD{MwDX-*KKAB zioAi)%t5#;akIdgf*~G841}2z)v$%?A}Ym#EJt!85oNKP1t`s0C@Ap$CY)ydgF@n+ z{e41x{iu^*UEEw;-HeP3;~gDcoZ?MfO`YPM49(o)O^qzgP0XBJ&CCp(DNL|LSpiM3 zj?N*TVUEZP2+;eN-ma0TGapc$0sg_B;Czg$V+vkJ5Cj@>33d$u4ZQ>-r+aYXwj?ca z6Xh|K#BHR2xuk%_ilp%dHv`PXjhrZ8WwJHi@dhLv#HDHjQVU`?15m2AQBdH$2V2#H zyIKP|2No;X(lu-#0UFnkP9{db*w5J~)CIJt$i>|?1U?smo`5`|%HZ<|PN5+6!8kPp z2l#k~#Df=rU{M54IJOFkyaB|QPgq)xs38E0L^}ml-Ui$iD~cxK;*sPbO*e2$(OyA; zcM}`bhdAPqga~vD4e^h6a&-0%4S+PwVVM>h!N~HU(Q@z-9B)_G0C-0Wi$ZtLka(vc zM?Yr|Jkv@@7K7A>_<OthVJ%OPod8l98stNqx?tBJ;_MF&2?8yzL3AFm_z9H8vHCeQ z0F(*hojqKgz2jZ|K#S85i>}a<JT#<(Tzx@{f<Uuh=%p;wYUj`(&{8YxC9J1kaEPOi zkE=^ObWK9Mv%d?*nk^qkKle~acP!$;A+RWiI|SqhC5!>CAlKlKc)~S7uq$XeS-fY6 zt8Z|8fNM~E02XV5J^aJtp;_J2H8|ceINsSa$l1pgk(Hr-4-IyWcX15zjt}v01ua&C zu5CjP%Wx0Jkl=Vf*YJ3d(SGr6{z37OU<-kT3%n!&mkkaiEy6)>x*#$YtW0pky$T1e zn5eSAg47}%+)i;)P~e?Rpq&!p=#H%vC%rjs?riR4YHDH>Z)#*}9&h4gViNCYYHks4 zX5ebz=ICr`WMWC_#2ryqK$8fb$vALSJCio!MwHbk?FVel2NwlJUT0{@jMVVN(a$zS zYdwIY3YN576;yePun(Yv)De}c3`tE@hM;zWn}P!GN<yg$y8I#@JTp(71m<XD;^O9L zW)bgZW^NX5;%aFa?_}cU7H{NYWMXb+?rQ32;6!2bmnbW6CNQW3Wb75Xz!;p?+(}Do zL@fm&nASW<vy>>WBU_5uK4xIxTd8;xG^XOo>c#5K>ci^G>c{HO8o(OJ8pImR8p0aN z8payV8o?UL8pRsT8p9gP8pj&XngAM8@l;TRPZki)8fNC`c>^uM!Lo^$f&y<5G{@m+ z3&B=V#D_S#!^daff=Hce^y&qq9=Trvmj_3>w}JxicLEF3!E0PVwWmLox`@t3W(LNt z=Em`Ej^^f|JYo{>=<4Va@8aZQW@+qZ<Yew@L17*t$_i*!z_CyXG<Am2lAzJ@CETlr zpe>C^<S2x?8!?~>8BV~W1RQlZmM4MZ--omgDpA3Toc|2Xu+=cW3W~fw(DY6?8@ZuR zEP{OnOOUWU<fov@TZ5yj0WH#kswb+-0ojP;E@FmUz;lWI3JSaxP=Ddd#|XEeW@RLC zvU78Qf&%Yd0+k+UCk%C}Iu}E8GiM89qj*a<(3)2>GthD<Q?qyj3pZCsb2mdva|24V zF;P}Pvjd*C6jVikV{mY|e~=4mw+mh%LRG<boM2nh2hKBrq}5qO`2ji4VAffJEG$7J zErT*buX!M`4$CXS3aY%N*z*clAyJtGWCv-P#K;`fG7C{q<V}QTl2AX-z))9=iKS5Q zcqb=IpCI4x;PAjO59dh3NE2fNZ%+dQ&!Bivk23<aLj}i97;rk!6l7ruRZ!)fg=4G( zTHxYYfsW4&N(vB%YbZf1BhLeZEG%IPioCG|!@@A!B_P<<#nju+(J0c`!o$zWJ;=|) z)6@wX7TBBM5T^;Uu!Jk9@=n7M4)|N)q2BR0?ItD+aB7A-T#$t&LP3!?j$jzLdl|V! z8oM}qMwkb9n0s58S(vzcJDM0cLybaTGzCt_u=o*VVTn{w<(-Zr5Ws42r}<Ftc$~Hq z6ACyr!<{b3!V;yR$eRWY1#k*S>TbDtdmEdCdwKd8yLg8=xq5m9TLwCsIXOl|L_m$e zvo8!|1v4mXL@OxrCg8NqD8xA2G|bR7INT}7(Jdmx+0e)@(#Ocz1Zo@lY86;BR7nH2 zi4oKk0ofCypvaq!(;iP}_h2`74?oukLnD9p0Ov3dV@p#%&oE1<J?JyIu(l9rwgs!V zVii<*FW`t|xFc~#w3|0hpDTg(Te^C>`+>GQp?VV|^W!lF>M=7V1@PnnXcJ;EQbfZ_ zC1``g&mTM*C&<DQhg4=_rVcl6S7Q?&XAkp0H<Jj@h(NzcFJliwBVTibbtq*eJSa4j zU_lCtuy_Sk-b<8(AWpZSg&>N>Sb`9zIS4;t4MLc?pfutF?nJ=CFhN0;cNGq=A)3;l zNlfG=iuh8CrE!>}g=wT~m_@itc$lMqps{;EgqxYMF`8dJK@P#{S`>THoXo($V{Z75 zS(t$}ku`}mnKgwql{Jkuoi&3slQoMqn>B|umo<;IkhO%hl(met0@OWCR8ZwzOq3TP z<D@vZg1UJ-TZVWWx&{ZB`?`h&xf*!6h6NdfhFG|JQ^jwBEG$V1s=P~xax0-#Y;N98 zo@Q>I9s!ZAu1-FY9!{agCSk#bzTWN;)N*XHf-3J?f{umHaf25J;Y&H@hE9QzewL=5 zzTRE|PNuHm&hAb=9)3Y?WH=aRD_ZgqWMN5BP~}}uysHT=XL0j3_w)5J4l?j}4{?oj za*K!v^$ZU+bTbYyqpG`86;yfG5$|q7t3TYl-A&!xLd`?HEh8NRyj*;p%_BU0{KEWA z4XNtvGzCT8Y@C&yZ+JwIQ>b%9kgrdGWk`gpkBg<7v$3f=tg=Jz<RXd&Nbg=rLkUzi zK{&ADI$c4P_aVWMg6P51)^+p7={mF!LURI^f*Yqv(1P0yN8N|;FL(n3xT~Uor~xw+ z6nQgo2CikOb5KM`kfp1eW0-%0g_)6YkW-kcv6CCZQj{7HVHq@RG?ZZ32o|)N3aY$M zs1dX{-G&ylC=S39usF>@_>n*z1G53Mq{vcG<SoD%x&cO}o)*UDP8LStVIi)DL8czY zMy?)?!4?Rc(L)zBkqlc^q6Bsp#zF~D`!HKUmG=eiKt?hJUulZdeP|(!!yQ<{8mEZ} zAA=1;Z@>k)27ufQpEkp2$mJ-g^44STdBa*|(Afyw9!5H+0W`u)S|8jD+y~Fa+b(zU zG<NqiH!?Fe3k?r5iwp>LH+J_7H3>9^`W}7PH_YWq8cHxG#1pW*l&7G|dk;r6!*t*+ zo^ZMdErwx+Az6<lc5#}9@E_LLMKv8W7Zu_yqfDGEeS=NI%+14%%smbK{Vgs1A|f1p zEDfQy;^|d^2RzY+aY5Oq1aG&%$RN}x$kNN##XG>*%+ue%#V_34BG3mmf`Yy(6Ye|E zi~%Sr9o@kTnm`tnDyZ_FArOI(;Y{4g*3BE2gU}-pW-*qi!({|C44ss)cdS6e92j}A z3~!g)D8kh-B*-Z&FvKk^!adY9%*4gSGThY{mI(+3A8f7%)cO}>VX071<W0s|#G1Jq z8MrwI89R9dnK^lSxJMe91O*xf8N!Bm&|3%K6agL5M(vI=FbKLwhlA#~Dp{*ot66JU zYgy}9>scEZSsNKyn;2P}8ChExSz8%d+Zb8f8Cg3RSvwh7yBJx!8CiQ6S^F4S`x#j$ zFtSc$1obE?6;ydI<BE91kTu@Si_>pt@eb|%f(s2SQIFFYXx!s!SU`=%%&t`mio7W} zW5nIl+dL>V($^x$(9a~o&ppW5$Jxx=)6)ZC9ZIE#8Y8f7DA+TCEG*Rus=QYz3`d+U zLJLO}yRif$PIC}G!&>~o%*71J8U;n(9GoHPZR#E9XJ+E%6X|Ff5$x(>78Ggj6<`_W zj<63;NTN5@U?EzopvwD{!VtyjGPDrI>IN(!i_<)WPqBt9y7`zPT!%M=L%fVk!@>>y zL(E+KJUpG<J$?PW98C-&JrVZe31M)`#ZtS}E2#3`p)iDTx(qFZvAO|E2;(#l;Zv+3 zjI$7EU{p}#O~sjZ%}q@$Bm9gbOaly@j7`E!ox@!W{N0?*&7k(74^e{s0V$Uu^`V9m zs5*ru+D1kNRo;t)!xW+yUtNmRVdw#ir!vK92Eub#0~2d)+5`$n+=YNkkh6D)e~@vo znTd~kxVMwPv9F1_qmvhGOqrN~MASF1@N5Q!=L2elCr<aFhbNjNu%uC(MiB~DgwdD< zKno~%ai>#9rw|uce*+hv2m@C~KUWv`2-DCAA1Ct=sGT^bN3hLxg4%nnpm4=iUlEut zar4IM7__j&YCDzy#c3YGb6C?U&P?CNsGz`mfxtvL=<FBjOq3IKW((qM267H#B+3ft z1UKl6%n(n%cuyBszYxfVT$F<pp~}F=T7WVd+EQvae?Rb!5%i<(z;om6pkzw?=}qX< z)Q~U-kNpU;uylY@A+AF=oIyvJ;T*t5>LVMGe0~$Si`)sa99Pp9ma_1b&^YJp&~gFD z&!}foYGTO)I8B4*0aqM7ACT#orAZgab60SboA7oXKHuS-yCchYI8B54&X^?Mb%PQi zY^NyZbeUO*rN3K*zf*8vm{FjYm!F}jfrXi`g})cnGF*ugd;}k~H`fCSz!NwE5FF<C z0uQGP&;t){C6*L{(-4F=u$GG8e2tkT`anLqiNi;*u>rjOJe&g@Xublsk<i<lSUiZ+ zJg5gro<;2kdGR^{FA{Eg;T#!2_b2iQ02cq@GzaQGoP!xqb1~y^0x03*o^LmC@^v>c z@-Z_q_jNJza&mGFGzvEHjqvq_T8L)^3Y4VL3MoMrmWiMM#Z`<DnPzY}2`wzK*pDSd ziSQuyECH%aP{)TD7#Ma(e_`Qa2nu86VC7>KU=?MRW|e1EW>sZXXVv86V98-zDa7E- zx>Cpi%;^<n@@DN7g>bq>nY~%Np`4ilY~HLh1t2o7MA*GqUx`3C_vJafS?|k3I9oM2 zy;-+vLO34{xx86F8bUbl47t5o-$6OQ<axYVe?j&9mErYf{VM}e_EnM3oAs-r0|Ns? zcg##y9tJ)RrX0p@QD#;SFsoOTDGbb*DZs|c2WG7lVh92=wrX;+N`qPV<vCbI!K_yz z?5qM{);mLPR%I~jqahcoJec)Wkq;CMOgW6d<at<C!D4@9cv;m!r&q%;0|SFm%yu?r z$l2iHRu8~uf6HBjoC&U6wgk*Ky0?s(iJ2vom4lU=fk7_PsgI4BAs{H2k8!1tzLr8r zMrN@>PG)h5LV0FRjzUtZLP}*`Vs2(~Vopw_LRw}{PHKumd1gt5LSjyiLP<udLP=3# zUU6b_NoIatu|iU6NqK5&9+!d^SgyDvv8Y5LF)sy-QxZ#36)N*f6^c`HQj<#*^7Fuo zl!7zz%N3k65{pWd6hJ4ZgLH%Rq-Exmq!y*7C?qB)=NF}9=A|o?<bw<-QYbD+P0mcq zOickfsU)>X52VL2Pa(A;F}ENmRUtL6q^MFMEx$;i1nwb_ktL-i`9+zDISPqM`K2Wa zAd5@#6(F~{D<qc|m*nRvB!gU1tdN`t@_kx<X<mv#Cd8#qr77vDCBBKpC8<RU<(b); zRv>FLN=gcft@QQNGfOf`lk}4FbM;eF6H`D}$fp)r=p$>=2Wisx$S>C|$=8M0std7I z7h)@yf|fp4Sz-}#sJbMUBr4b{M8{flap~(T_~n<RS}8c@<S3LS7G)+T<)juXfWsLS zKH!*9%E?bo%*m`uO;J)vEJ{_#&&#P)NGwat%mJxZ$jmFwOi5KpNli;E%_)I;R}XA< zdQpC90kYl23Q3g;pm+m23M^f$V2i8*<T|~gRM4IGsT!JkMX4#J$*CF|5T!Z_NU1|p z!Pbte8hl1M$cG?PQH|0A30Z>`WTt5-LX3z83C3!IMIo9&=^a@P8a5!|TCg%?Nxg#7 z;tUOBS3oQ%N-ZfZ%2R+SwdShTQK+ufwB`bP6J#UEm;OmvsmUdJ*{PMqQ2%IJgB27M zrIuypmlg+?<|^1K7(fJzOLIY*V9}JEn3G(Z14{A5rMcjgn3|ZJ0SU{r{2~od5M-xT zf|3@*5t`7j$xMS<rk9ae>|dT2P?TSgT2xZ0k)2wpi5?ChQ^494Y@vRM&Q7far4&$b zfUv&4LTW`xQDSllIL9XD=9lJ`D3m4Ul%^JgLkpw`WDG<G<OQ&Sdbx=O$l<17Ylj?} zdJyHHAOjfy!ut9OAg`7dAX$WJMRI9TQEFZZB-kJZ6vI<YqK-lmD2XT}DrhSt=_nYW znVp!D0yaNCO#x~SI50s)0xUj2@^C*v6+tY6sQ~e`VfuqhbFI1H>Osy=EK7w+g3JO( zTV85Ki9$|(et|-AWpYj`Ts^XpwlG~7M#5ZOlCO|hRFqf=*A7Z9ki?1PP<;hM1CYN# z!CA{y3(k`PMX3d#TwIx7S_H|g3dN}<C7F5Y#R?gzMX3rJxruoxi6!|(m70*$nUi0V zQwhqKpqv4=5Rq{ztiYjG4C!}*?5VT@c@;^Zq_QB@N<lp*GcQ#gth<&Al%VwW6&zDi zAjNM0*b0T5#7a;pisqdB0#IF$n1k#ZABaj@1&B*ZGD~t&t)Lu`BT7;$N~{#%<yHtt z9^%AW2vwO_ky(tQ1Ed5=3&_9G>L68->ahyi2(z5Qi7vSkVh+f%qQt!P)ZF|OkS|N} zt5S>d)e({<naSB{`9-;jB~}XRdPZqTQpFkh<)BcpQYa}Zg(L*1>ncF@qPh;r6x9?x z)m%N*N?2&tLJD&9&`i$HOUq0zElLChA9@^P3sh&Y1_fB4f}9tenwJui@0^ognqsAp zmY7qV3h`M=W^qAIVr5Q#dOnIcNRLluUN(wgQEG8PeqM2ASt`V*C`S0^r=&V179q=& z<a_2Orl&fUmXze@`GaF0C92@TS&)~G6r5?9IjMPxxu94;t|Q~YHDP>eML~X136k=R z)XemZ5-SBm0}BI)i$HN%o|#gTVWnVbX#^Fl<$?yUOMaeui9$(!X>tav5s;V41xdMj zd8y?fmWEPteqKppW?pKMr;Cz~LIF5kgOU=A4N15#9wfvyt@#*xMMoP;Be=1Yo1dGS zSE2_luu?U^6sW!B18R7sf+{XhjS6c=fSLp#er8^Ber_tLhJ}fwRurV>rDT?r7QuzN zklHGsgoxTi0*N46Th?4$u%<*NxFMpDsbGU#OM{i?q~@iUWLPU?YHP#V7$Dam*@J0E zbS9|C2W2pQeOU82FSQ(8Qz&GnDdgtom1HPn7AxfCgW45Esfj7zrVOa(0IoAYHh}!E zV5<NLE9ABWxS^-12X3|cr)j8zO;gv@gA^1R>b}0d3XzfOnvkX%s4WOGs#q^GFFB_) zCAC-s#KmX}fdq>oRVs)H)eZ6kG~gj}u=*7wfgJv*vbB(gfxf;1s0J^|SAdwIkYA*L zqzM!raPLAIG^k+-Z6?7z0##$DV1TV9my=jr;+dC{TA^SIwXawY5_<}|3Wg9vK+cA^ zr8pX{J{F+?Sx{R6Vjn~&q;Z^@Qw*uPAT=?_I8a={jZ&~h_8@lqkwO5?5x8Wu6?_v* zGV~IYiZvikg2oQ4k&~RCSC$IuD(2)seGUrRVo>8QB{exSH!+6`>S<6SaZOCl&`2xI z19v(#z-?I_g-lSu!4f#A*B1>I0R;_Mg#x&71#ap?jRNIUQ1V8y8_E3`4nUGCriLq! z&4W6H4sAWC-w`z^a&r$M3aOak1skX!iB<=7BU1emb5jk~W5LND+WbKzC9KU$WRD_j zAje)Kn7sqjB1QJ|XoD2gOhs+wLz+jU4bp*VkamwYNJsMM9i)*p+8`ZmkmiDGDNvgZ z($X4jkivRcs7>S11}S>87`dG`@D0+W#3H28AG)<iNwIdcIXXH%T2zWU#5y`YnyzWh zz#ud&^Bo%#Ls&Q;<4l3kq0-TzQt(g$(L<$0sl_F*fzr_tQR<I~g2NZ<h$pDwh&&hw zQHeeZ2^K|ePuVJ92x%jaM8gL{A(NWO<9(o+P~?F=utC%qU;`UOzlIFhI*joxM0=uE zXUL3N<s>Gh<`|C7qmIs_>MPK89`%*TXyahCaX?z*06K*MTHO*0S$l=tbA<|z#8yLP zYGM)6G-_nz=p-t5#(i`Wb#xMyste|zB@mv*9%x>Dbj%8KQ6G448aiz}M5a(7PKGTj z8(p<GWLNDmFxW2G;Ks(xz{<hO$;!pYcwe4sjZa?CP5{t$2=JmN@OB5#egn`#B+!ys zLR%id+Cdsf+4BI_Gyt0(!1hve*8|8veO~b5Wu#SUpfx9u#vCsfFAaA-fJ_ICdL$>7 zq^9Q=Re~0{K*ydSZc5J2$uB|?ftLR;*MW3nHbFt=lDIsNm#dl=T-<<6L<$PjIXqCn zfEMV1ECAIrAjQazM^&u{lhOm#N7fMYLCc<sQbD^D@>0tcU@AZ>`_LBjrDP_TK(v6C z;lUJwg9x!44_R1K6QUgI5s>?krJ)P-kcBj%ZUQR>2Q_413d#QnKY-%`SqC&KAX*HN zWsqY8O}Z8qbo%-VDXAr?MY)-IsgM<93ZVT3NGSodK?Ag^Q6VWcIkB`j6})8$$!W#l zEjFM~%P&d+?^a5xL<A@(OBd(orou!rQ;Q+NqpuI&V3nI$TnyT~lbTtQky-@aa{%!a z+G0bfPEc%vSGFnG!c2uESv|0*f0_n*;KFSrw3HE|5M%+qsbh$$%rxjqJ_XQXMu-?v zoI`w2j97z*CIDZW2+>&!p+JihAuJ@LkmC_y9yU>J%vFXE(`tFSz)=oL_V9f<CHW<Z zIp9@(kZca-d&1Y~8dxI<yP_`C1<COeSdpj+&&((WYuiFL-&pf<)q+whFBh^;a148* znT6sSOasA%B`He@As$66eutH7yzu44S&-$$Sqe62X$~?lY^{)`t&MObC<Q@xwSY<r z^n@Cn6>AO4fFPv>sYS`Dc_oSIsgTfDuvO47G%!%mS3nLqO$9CJ($Hdv0if~%RXb9+ zpqYUrQw%Z)Im{uZK@tkcJkVYgxI+pcyKg-5%TkL%QY%U{ko={ifbMe8DpYWfGde34 z6uB@bf{a9Rf`Y9AvF0M_(m`363$+2_Z0IuOBybS~D#eqbC71%ZyaX-OF3-p;Nrk8e zc@m;D9JG4^9JLUc%rp(K22cp=mE?yO6r>h8Cl-S?_JP|q#o?JH85-)!ZeXB}rL0Fa z*AQB?gEJo}Fc4`BQX(T|^9n14Xhe9T_!}V%iI-R%h;u<ER$3`UgNKhm>+iueqdIK# zS_iQS2uZ?7Jr-Gieo-bU?SU3ES}CY!s3RE-U7-pd!ADq_0ZIy)d1?7p3hJPEMb-h9 z0|{CwM1v?4Uw{NK-4Cjitzg^7K)D6U0lA4q*{MZV3P_;@@-jGztRPVfiYXlh1$})5 zSltARdi7$63WUo+dLjFl&<q4gKn+z_HZlZ3WM6@#K^VH%1}TbB&4w1@Af-?yxP${o zKDbOm?>iCLKZaZ^LH6N*mX<>7gzX@M@IY3Af){B&7<daAM79<hq_ACD5K)jG(DtYF zqD=T+DO4HIRxof{Du!;4f=I)RgLPjaq9Efy8WQu;L0j7_4WO37#MAQgN-$zFEipGU zr_xG6y*M$iShqN}C^HQ`;EOY>QmqsWO^}QO83~K7q@2X$Y;}YaV2*>)Nr^?!oo>Y? zAeB&KzzG#9k(`rXoLXF>4oXCz08s!-Diq`wlomkt4ukelg9TGl6f#Rvb9uRH!38*$ zErG;sVndEu#G+w{FF;PfvW*QQiDe%fL;|D>c_SM{6k{hFL>Ouc>QW7e6pp=Y5J^zL zL-wdxDX4=tvmuESwVMs09%VZlLKvFI!28)CqM)`5EVQxC#qd&TQyZvC=H-HItH4r2 zLF*K7A%#@+=|CDZ$kl&NX{rLWodex=0r3lT*EOt&0-2<st)Q-;uAq%%pk7J7TV_RS ziiV*kNLE!r10)Y#t%fEA)(9{CVLLrRnl#lx4J<y!t(v1<e8>p{kiEl1o@)T=kt+<Z zF226LLOysye=)d=m6}+bnOdZfk(if~1L}Ptx_z0c#gG#&lJkoo1xN}=0ce>5FIRF- zVsWv8Gc+p%m*&D-`N{ct#U(|h$tC$kC_OM8NHvVvEe7pTf_H4eSpl^}2W>ln3LS`2 zP~RBTmIl%2lJE{2sA~e!0<LvIjKq`_Xip7?6QEkPZDG5`AbAy3?(lLU`Bbl<D8D2h z)F{#`$qz0m0tJe#0<65y(5!~$Zir){Aq4i9wt|v^j)IbcHh3d0Y$*t&4#5ae4^WJx z7GVun96kU=4Xn=s@-p1->8T}7l`t=WoPrWFn5H570A#3MT4r8~Mt)Kj==1}$MiW$R zeo_`%B-)}zBP2Az&VqFb;O+y(4XiK>F3rVs5I8KsE&-oofvgsq0^nw)r<R0(dbGi% zxf+-Tf!h4w-V{=6ALJ&41!?(3sQc=Q;SK^RMDsnwENxp*{}~pcSbPf72@NQ)4s=Hs zmn4>CCMy)@7nS&x<|d^UX@HM`fS812CDe>Ws8tHO3Q15Vx{2wjpz|e)gY%0@Qd4jQ z1Smiu3P3|;8JWd;AQ3&t*ehaVA*iXNiR1_*&w!+$4p30E1)Tu`aWY5=xY3K?LY)q> z0b-{f$hR7>R2f{F3r+E0aY!g2B@}S{f?^LcfC5#kV5<NcxWhC=1EdwC9I1y(lpaK1 zpUADm@C*vF4QW6O6r_kFfxsQFOw|59EER(?B&uq7PNICQ5+%6w2owYgwzjqkrFki- zX_<McDVVtj)i6-5MGJkDas}no8-$m@O?FLC{D4ylsJR7VWTt6g#ucRw#$qCMT@8wK zXvKkY91t{9KyxKggM`rJNyy83AP+#SL<&Pt2of4KB*g;sT_H$Tfpen1z5<0KYl$f- z!Kp==sl^&7sS14H4KEjBfCMy11V4^KFF8LiIk7|op&2uVbrcN2scSHFwZXkbwEm?I zDIH8uyh3{B)kXQ`#a0T2;C57LZeFpKf)T8Do0ylE52``(L88%!G8e7T#@hD=*#PNW z8yO&Uf<$4agV-QkQIwiyrJz)hSddzz1noeB#6h?ck6cA!UUEi$k(GiHXm}HgUbuWo zegV3{pbl+fQBi(5bnF4mUbN8;a4`!R_%c#Q9^L}EvBFBhK+nh&&4fxT1tfnX`*|dX zo+0+oGba#wkOTw@cu1>ubYuh)BB10)+&Mo8^@Dz71W^bV!y9j~(g}GKqzLIeAz1eW z;!RNP32qN7fE&<A6%?Wg53NE$N<nQ$43)v9x$sslczg&H)*#j3ffCSkHAoxy7&lOB z71V<P(a;JSR<D6HfEy;bHGrj&)kDTaAr30Wv;etzhpY`;CxGTqP^{7bISMpyl9E~h zKK?C%mrJD@Vg+=zuhu51$POe5IqCy8si+S+D~+fDAshz4CYThoz{jp38C9#w%as6f zJ0iLuquwY^2e}*+tVrc$W*XQ(df+f4VFm>hcSy#7xX^wBYzhS=1RYfeF`=^X-af*y zh!zCK6bmF}SV6|?ijnFANN`&zKxiZhP;VbJ)|r`#JT48Xd=T-8qya35V|E0j4JwtF zpNC>1zL}0<*i;9SHJ~7%+EfN~VjW~A2qT3ua;=z>pPQJOhcSc?uAz|!`$0w|=jW8> z=7HT^nwy8@ZkT~ceMD$XBBBj4aQV@2bl`Gy;1bkHMCx0Ent7-_W{?QdfnXr@s7FDl zr=+Sw3J352r2^=ta_ATkM8MhK$3IBHRsmGdKtw$Koc(=W6>JrZta-U0Laq@3u6{0_ zA)!Gaabs|O1FkxdhWS8cV>GCzk1XK~8mxrNP&UW_oq7*Jj4oh?1!P?mC=cRWuLM34 zvINN>L@ymQAB$yP8@W=0tzjZ$3bY0XIR>U35*(0%8PhumSAgpeP_%(GLq=jDb7r6g zh4A161vI2gM>H?!w&D!r63R|@gH*1dcmkP)al9Ku8mU%<r~(g!f|#)20R<5x6d>V> z)DHwn!Gaz%+EfhggMzXE#Bh*22*cDsq6e%9oGnmQfyR6sL5H}ajP}5eNYez3ALeKn zXo9sv@(@}2!L#{D84h6xd`$^>C<5eg{Oi{gK#3W)fDK{{D9Ipi?}P>%WEl_mlsQll z0x}w;5*99?utUvjh@=X#1Deu7%d3h=UsVWk1JZ8NXiyBr61~0<mws?cLG}V>ib1v% z9OJQ&G=x;<B7BOHDIq}wIz<`T3`n#?4MACri0MeAC`Q*nZ2V^C!B&nafFc#zutUT& zcts#=CKmaqK6nVHq*e@)6@!=o1Px4RF954I(3Fs{su0sU<oLj6CpLB3gjODcauc}6 z2U!6G>b$|qY`7HCY9VBK@OU2LIB~EkplKJ#JSONEe(?F3#aJs>P(cYRp&&<qqK?~x zW{e<C0@W(8?gTa`!Q^473!L;bW22!_fP3X4D5oHm;$Zi~tVCM82vUaBEQZEUW^6Qa zc#~!eQh*jK;I<0MMWAqpmH<d011mSc3Xu#&Q;j534AKJ5#gq>i!`oDlE&?@HLcv!B zDS=l7!NwlJoi|EHZ84WcVLNXdl8Qia4q7w?UsR)KfU*DzBv)LTmX=w8w6Y7f%mb-g z1sW`cbO%8vb3@DqwVJ@~R79<mpO*@{Dj_*LHANvQ5qYU~F?h!YNFKD-DHVCOFIb=~ zwWtz$=q+eTcRJ*rgpAZ&(ESMD>_=+ugSFF;R@NetJf!}ERLZcmwV<#<%0{3p3T;7# zfe-UXl#k%)Hjr`<Mp6f@#Zh!YDgxvsuxOefITdULXzc-{%?suh!?Hd^H%K1{gDgZ} zu!*)B7h)zT_e5vLf|lb#odgjF8xCzzzzhTp9YAD3(;_6U$;C7slsh4*1ZDwL4N?{c zI|IYZ$b}I;e<K-$=6NI;%n(451lx}#7?6~Z5Ee+fbYN`;Br&jMsG&mInqpWuLWarE z*A;_gL2HXqQV*oP6`d7J**F=hji6pE$TkoLm%kte2tx`_aCaHpE=0;oAZgI*WB5Wc zkg90JYzo$8#D=KLh(Tt6mLfyb5hSgGLlv?BPR{^mu)`F9W)DEdz%X>|4Q=@`NETd9 zLr2m;IRklY4lWOpfG$IZxJE|-B!m>{=oW%n^0<~FgN%i)pH;5_EyvTyRM1v1)P$@( z29=TEG7+>U2r{h+DN&J1QgDfz1T94onGa+zygE_`S4ZgH0hjKn>8W`sRtlNmse1JB zwj8i5*ai4JfMb*q<OFcr9<CQ0amCT_6bkVraVxArra|f=v?K<S0AZ+A_*PnjltEX5 zA|-FsKm(~k8mdI&f?HBhF^E1;ey#wW*bZK21G@zXx&*tlIJH<IQ6VKWEiDyvMT<f* z=$aTvY$_z@=N2RuWfp_(YsyyurvlLJL791(pjGpr{v|wfA?+{#U5No%%>p`{9F$m~ zg&Am!91@F|3oTGIse{&VqWb~S5H2oF0@(|y(LpDN=cOp5=A|eU<QGGnrBRfclUR~j zmI}L+O2GhJ$s0m#ElUL5;gnL60UG;K(1%=$0zD}J>Qayr@V*DI5404(QGz4~vd>ll zniCWd@{j-rIWDIX(p-yH2L~G{;~=~UI+`3Qjlc$&qrq0{fP90TLt&G}knD#r1*sVX zT@(*)^G9dGG=myKpicehoFpV(Kq+e2%}HYJCqf#TMc$}1h*xVfFnClq+p@7RuyV8V zu=29<@iD#|odqH1TDoDld>d&*4%9qD9gPHujLw2UE@1?P#po;u^oBi}uVn?*wM5N= zU_YA)QX`E{fk1{j;8Q50Qy`FWnb9c_a7w^)L<6Yz0qt{-PJyIWfNnm7tdWLxQ=mOW ztV^V!<Bg!1Bk-+Ls6*|eQy`Gz2apC#MyEh9f&?^#i8Nt?99W>?MDP&Y=oE;;=oARz z4np_@<meO#DEEv`fuM!}QV{|khJ{vSpivvpcpTao_UIIdf`S6l7%^xt6Dh>N<u54c zKo~M03F;q0N^GRDN09XB6o>+N!4!NJ05o5UG`b27Bha|3l>%f87CP_?nH(6M0zn0% zQy@hOpu{pd1u{AXf_m{fWXuONsX2OJ4Mn%GgC@0x-GMc~M$e=jo$=5EC2de^HyLRb z4>bA!UkeCcM1Ud!U3L)wI<XIOkS+28Q>29$#aNVJUA=}j<pP@<2VW!)@5F&ziKGy7 zUIsE30V(uAijlp9sv5D<8nhAx+KNT2-UBVahiL|#aR@qdH8BT%_54sdsTL{pA<gh; z__BUb3kpX>p(}+q?D6ja05xGjL!_f8*n*a-K=-~vQx;K&Qy^y+=!hsJDj=h*pfN5` ztbs6&m_yM8-x7dtToyAYV>g3XOHrK)TMhzVR!-qr7U1FtQFb7$Wrbx_Py$4(Kd0oB zSV*WimZcUYrh`tGgD(Vv3PF$4K#4HaQ&^EA2&xCPyc2dFFjNTnFcvIkLCUejloXc$ z_~9HHh>kUABQxj#Sg2v}HGiOB0B;e`F9My|2}?G3%)xXlF2i&b(h_ruQ$c2eO9gPm z4yvOzVY^;2mxe=EEMZ%D3Aug@ayB4b9?RNqQifJR*OfwI5R`X7O>jsz6=~Htw8M{B zk_cNy23wT~UVMqRNS>6FO-2uh81_eJViZk~nKsn3A&N_Lq5E(_X%V7==<O{a&Db`y zfQ*7}DAxd~(T8pcgSOo?A#066JIp~XOxW3d3V6z)L`Z=P9*WgLIs6-1p6Mun@{tdC z1unvepw*@+DbSHgP-_iVAwW(;B>6;Y64r<#4QpZ_7zLM-ppZh8+mJdPNhfG6H?r4Z zizz|cKm(;P?|=$+WI5F1q|0E121pzB_1xg%1jkx#upDT>8+0@_#-<0Pu7QpMvRgHg z9RzAhTcO4qq69=;H;rr{LJcT(A?mD<Vj5aZg8YSJRW-PW0zLvEzX&o!O5FNsNQsOT z6(Bo67-}HCb<^Mlx>nFs2i}B$@CV2UXsZi}30@}+P7v_SKwv2)IHw{KIyAQ-rw7pa zv*43y!Ag;i6@g1&)Mt<!$;bFtX7tpD(NiCIxlqq=fF~E9{N%(Oa7zzz8UScf8Ok64 zQcoPzc#TX=EP{;!fC_vhY0xwfYWEu?g0_fKUta;dsRH>X-(t{~H?YNshCfZ0*`baA zfDSbR)h8eqfNBx6Q2<a!7n0{eV+|Cq&Vv{QTAv59kMI!%5LMs}Mj*REZE{dy1HwpQ z4~rT|t%K<QgUcb1T9Dged$%D*f_eUF8Zc8K4#Q$5N>>p{9^@3T`H+-@(wl<02bNSI z)+6;}iakJ=9>C6S0{8krYB2jK*i6Er3ez}9TFOZ+0qyWnFtAq0RIpKicpb7f5X<Ie zkhFp=L=|L|2^Mxp{x0@UgXRKc!GP2vkSIhKBrHK5f`m#iTFa~m`Qi<PBt#o%5d+BC zNPS;qiy*c`n_q;tav~i`f|@y@-oV^)2;O{(Sb+*%3x{Nm9yrP9fj5=-r)j8zH6Yy* z>Z`7aa_$2x3?ZWipdK=0*B-Kw5IN{L3P=OCu@sOvS~ZRwz6dtju6>X`q>37`bPXhd zW*}19f<z3OfHtmu`5?2PmVk2wh!08u(C~xon1lA>K^r&`uGI%076xiagO0}m>4V5Y z6~l4>ByVFg4wMrywIQ+uL?>n|1QHD>E(0A@14)KRZbw=`0d*6|184z*=?f$UP;FSf zf@wO;KUfSP)>Bvv)kIv`MCl+EB!rMsPK6bu&_HU$R$4(X7eezpl9H0jf>bL7b+rAM zkoGmah6Yul(ds2diOH#;t^w+Ck{O^<lyF-gH9aB15b74#XbM3OVTllExd$}~lnTl5 z73vYAMEVMgYcRdW%LO_>YA}po5j$1|n&XdD2d%pusG%zG&O-3HbdZD&8sLQ;e1JX- zIC?#cg1S>_N_uLEZ(?ytYEgW0Mq*J(d}>8Oeo+Z>XMNBgLW)s8fIFKQ{Zg<f(OpnJ z#;=N_9njGZDA65IaAOjs2bzpDii9eGauOh@y#lG{K&=eeJqE}f5TyD7n-WNe0c;F- z7!}-MKx%n|Dq?uEI}`nOLL`N#?QD=X^j-njlZYlZl3s#sYhPc5$Vl+{i=es|)Q<!k zhSZS+^Fi%6kOHJC9V`w#X%NhYHM3Bgt4N`Z>XFgObOi<Eej9Qcg0!%)^t(qV(^K<O zGD}K}Qb7ldL7EewEC%WCp(QYgAhZ*RtpkXZnlZCF$~XnYC|C*y<pdnLA4S*bWICd{ z2gMS!vkB^VfV%BSMFVKg8QdfU1uaM^BtD>h9kAk@<kFnPl2oV=_Q`Y|$Prku`FvP> zfeb{7FQ^gNOhr<KoFAjJVzC$vNq%^yrcgYAYjzywNId2sxeDrbT!xKKwWp^-r@l+_ zt5S>dk(<n*!`cuBxs6V>SLWoW=cC@<0h&u2UGz)MMZb8mHS(0`=*%^!<X0G-xz0;L z8v7b<GuJrQo#-g!fzSN%PxH;sE6FHEZ8d<Fi6Abp1CJLJ(_kG6niCYj1JICZZ{pYR zgI$MkKK16_85kG>glDibGZ-2fGYGOPDmXa!2jnCsr)K2mq@)%pC<?MGDL6U?yQHQi zmgbZwI3|M+NK;f2WLH*ja0m)cP0r6tfeWiKFfe$E7;-?(V^#EqUYYLimk+-@R6#|M zRS6<tVBisyT3n*2D#)trt(=x-X=-5L?&##Kq|Cs;swX&?lLzE56H_yDRt{E9RxZ#1 zNeqG<ib@K}-~p^+y%dPU^b#Qs3ogwKNG)<ntc*Yx&@0GG7x?@C|9^gNrj<ep+JYQP ziVD0&XvRRAR>h8aDM&-}#fZB!of3<9)rnAqWSi)Hc?AtY4rL`pUPGd63rH;jr&piM zyi{H_?3N*`L9&ajR}|zk6-7l}1Cs0l`AZeQRZfXTNH%eFgKbh(AUzBNGE)hMVL)ao zl5NskH9=vhrl`nkNt(Z4x1eUG7W0Bm70J&{MUP!rSi)mDGqo7WZuyUf3M}G+9O{aS zkWo`aqAN-*E`jL|LFOQ7=bI^@pf1Rvp{T^GPps2HQ?#HMQNbA_P!&k_2)q(eP!r_P zR8-=%Ajux&5YokOA(B!go0Z=gDkuwbXkp1t(548|6slt`=zv9}y#T!GL?}YCP4$<& zf~FvcwxSZREt)@}27xnAP9<c*5KCl3!;aU8H1$YsQ2#3fa)XYd0<R-^Zh#H^fnwQ= zNOvIVL2`@cS49Oy1_p*(lF?l3u+ox2kXg|oG9xpuL@zC~sJKM0v^Z6-BsH-(wMdXz z$srspQ<MrC{0Cjx1iD>NkXhLw1}t8Znp*(s66=Al;nT}btt=K~R)HFaJP25vSe7ct ztm=>m)|Q@=pOl#6l30=&keQsFTBMheUjosq<`557k(r#Ir&n5#lb@KPmzkTGo~j4B zhft7N-60k%54X5Dzo<kHya1<|fq~Ia`YA6P1FRBY5M&MsN-aoDEXmAEcg;%yS*Q|K z1QXFq%}W6}89YKM$Q+8S)GxIxwMaD@Q*9ndLXbHcS+QeUNor9<NM>$ov05UgmPCX! zZjI{XYSbWCqb7ch3=9kk(m(lF7$6lYgCLWVnjn*sx*(IHh9HxYCIbV5h>R{jBZCQp zAQSih8TJeeDhvz^d@|Ysj0~m>f{dyR42(Xq;eyEV!GZ`k-~5!!v`lFIRjd+=2)A6Q zj2?JQw^&gSr!G~pbgALh6$y`7m<wGJD~r{Uk^<a)DT$TEN`fp=7&<`3MzKZ=7B7L; z<A8jG-4;z;wt#Z2uxyMF6N5P`CxalPx*#Jc0>ot32{VI|JA)vjiXfw^AS0+%#V@;3 zgpq-jgF%o{gMon|ME0;KN*t(ge+S2wiXe+BgsG}3$f5>es;LRGs6&|Q>Vhm95T=HP zAd4pVZ;&=kkj4LGZN<1@B?zp&#URM4=okzwD&S|#DhRSFIr>9ILF;T36$Dw89YdfZ z@Gw$R5M)(>YX_GdX{klZ3WBVva8cOAiHd?Cs~X%;(DDLR1wmGI$1td&DXGQDMVSSl z{Y+{Kf~*>Fr6q~!#p()zteTENP^HkepN4`UtCnLRRImtKVrVJ|vTDP{AmguE3JeSk zQgXM&85s;11X&e8!E<`vYb6FpM@I$*1}%9;39yWaf}*mEi;Ihbf}^ABBPJad6-AIz z1_nnhM+Zj+2FB}ht7Lc>3{je^pz}Og`56Sc6rJvHLzKHXhWX_e<tFAJFE0c&c?G#t zol;<GV&EwdGWrNQ7gqrk)=G*h41!#0PHUK8N@KAp1s7^cimD8PT<T6I7-4F86|pG> z7iS6;3MHWOPDxRXL6A!W;gmpxmXyRwB}H`xK`u?F6z-p(wBzE4O<Kz-1(LL|OKUrQ zVTQRV7-2d%k0~i?FbHz#IK5zpncxF%K%}J>DJe223v%g#yaP_RE{<Uc%?L%B%7R>a zAVq&54#cTQAEf9nUPTNH455nka*Pay41z3*-q4N^uZ@aPqKct`igA>`fsa|KNkFzs zp?h&~n2~XaNn)v|p_!X$Rd!x_PLZRlhj)f)K&oY`Z-}FdcUnoQU#1cR1B0WYfIKsU zAQO7m%1Dq2xd&z_$b{C(GG>4PF~v4TMg~D9n3D{_!jg*5l|aTS8VWKg83{6}!IVoX z{!j)<C>skhsTc|}sTzURGcaf=K2l|45M)v@5oA&|6=YH~6J%017i7|4<q%}jWaWe^ z17!py4mILbx+)o}b2A7sDHsYeDHsVdDHsbfDVPW{DVPc}DVPZ|DVPf~DS*sZVC4j{ zxIhFq!X_}wPwB5752%U)dBs$aNy$u*Ny%K0NeQG;38Ybpl?%k>1`#|Uf)_;afe3!E z5lDoe(t3T6X^N(TOp0cLOp4}$Oo||r6hS5_f=p6m<pzoIfCyd?!3QGv1(}o~VT){< za-;#sGzLRKCI(g>K_(SbK_*o*K_)eGK_+#OvFadW)j`H;fQ;2-<pqT%ABezon=-c{ z+%!``CI&M>CI)km$s8bp6GU)<2yQ_pWsq&kAk&mt`9NF@)A*IYn1B+762#R$%1bQR zpv5{U2?wVo7AvGB>gFWorGN&47#IXuKnYTiMVSG_237ciEUI9(8Uur`vQetJWs+rD z8Uq7^hKh+LC<TDMZ6wIVU@XYQU?RxG0CqGYe56(K9l$w;S<&AwzXY<FIyD7U&c>;* zGq5l+Fz_=lcp6Lt(_WLVfobo#m%y}-<^>2nIYdfMT2hBCH?cs^$cz<4CG&u42ECm8 zB+!gCFPKx3n3R*MXKuj2z}l%;#vsMOk(^PQm#t@P3}aZp7?v<bB8-s)Hr5bqhoJ$4 zg7S<YJYxuD0-;PHlo^CFhfo#}$`V2)L8xR1l>(tsAygWeGJ;rS1hL2nVv!NVA|um6 zu=A~qjdhZ8@{_ZzjC68R^Q;U_baFDwQhgIEtPH@cfW-9FVk-lk+{6Ma6EmIM#0o1z zbIVi%odU3gv8hf`etwBna<YMefr&-3iHW%msCc(BG)^^2Gfy<rDN8LX&dkrVGBz%U z+Gqi_(a;iNCD<MuHkw0hG&C{L$xE#$u`*1AT5JxnH`M?PObwF}_8J?S8JHmKwJ3wy zYYDSAkyv|E%wX0gL9K;)H`N4eZL%ebwH5{j2x~1Xpw=eBtW5%2Yl_di7GUq18o|74 z1Pf<F6R3YJKo%#bnju?kZh~xaA}pMfpcWe$fGsv6Y_XwfD%8V9Mo<r1LhS{`uYo~o zk^xdUo13OtAUvET3d$!|`30$Y;7Ss5U~;i6SQL_bjLmeC!B^OYK@)``imW9*SrcQt zvUp84!E3Uq5k8Ym@tSOAfKRU(UN@WJHQC$*pULK?cxCbW*8+!|!Mh;zEO6KhmBry^ zsH_EcS3zVg@!D&N5estQlmpRgXn-Njz`&xT7sVjQ04eMsWu+0MtTciYi$;)Q(Fjs3 z8l{0tVMqaJ3@IFqA%&wcq;NEb%0WtDV@QE(3@LDpAqB26#AIWL$;J?qjUgsOw3$Fm zHi4LI0&$Ru1=wy=FbSz-%)xAkxFwjKi0WgEh(MLbhzS&FLjuwmF@>Vr2qUUcr7<D{ zTwz*4a=8JjTKwKH!tYKa{O&Zy?@nV3cglm)6vUl|#u!dZg2+SDoH0f=N`iO|svpB` zP-%#EOGEU`fGSPEazl)=1J!XRnEJWFp3BKk@=Yv2cBnZ<D4`l<fZ@+%NH~<{rR4kM zr|Y5n#Mlf~9zB?iE#XcHN=<{L4QOLZ2JA*i0AlzMS<)Om^pL9xLv$CRR3wHNLBqhn zWS~>UAk6^IXUSkP1x%)b$uvHYv-BVlXJ}xA$~8gdnxS$nQMiW2s9aRVh88HYMh2){ zRC|q3?KMI*$_UjcV^pJzQH?T2b)<<2q)iL)uLUa43`NcYnP+K$!ZSqS8KLk@kfX~8 zJ%OM^7iJNFtQRwjqsU^UAtobJCL=Q@BXcGbLnh-?CZl8~qZB5iR3@V|CSwC8V?!om zBPL^GCSwyOV@oFEG$z9|CL;qTBSR)5BPQcyCL?1e;}ix4#$|>!43Z4sv<vG9fD<){ z<C|CjX9uOGfg3)0=nWr;R!B;Rh8u)qXb6dQD9;!g{7^0`4;uUsIU{HgLwRP%HW))f zA0lOpVxKXp95jBRDlL)qnV_gNK~ZUfqS6$_DW)hY%}{JNLow3~#nI-BW{f6`ri_M+ z#*CIs#uki;OvXu!$&4wC=8UO~X-tL&OooO`hDJ<=#!QALOopaRhGtBL=1hhbOoo<> z77Pr`(T3U#It<8uFh{Z793?o-O;J>$_{aj9f#78xB$8lUBX&?fN6*jzN*h9Hn7A>N zZvv%Fp|ly4Hiyy{P&ye(r$Xs82yFy4*9dB^5!75GsCh<E^NgV88A0_MrLlqC2UTti zb*3@YIAf@@jG@*WTSAmWg-r|~TvG^T2BFL$lm&!>>PUp}QXo_+gi2#FF<>%GVlqr- zGE8AIOl2}LXEL$iPBQ>?3e6473=H6GON&$(+cen%E^cOMf?%5^BiM-+W-#^UX%@*a zc2XL`%w$swBba!Kfgwz<g^6i0Os|D$k^!7;mISxU!rTCEmxZ}G+)NAe6cd=478d5o zaJHq93EZ4SW4PNalFVV|8yFawo0vo0W08z-zeP$aOpS>}njzfp7HOt%Gc64)VD=iC zr6eaOLd~%>G=jO=(A*%&0xE83Zj@?b3RPp0mI61&)X)&YHZrz^x!KGt%>WjLW{IZo zxG+nzg!|pxz|g<|G0HN^8V!Nb5Eu=C(GVC7fzc2c4S~@R7|J04os&q0O${K1?~`@X za#Bl@Gg6DJQWA|!lhRVm!K>P-N^n8#PleiVXa=5|FoaAmL1sV9;FB)q&^ZVr$Q(o( zc<uw-yoS#)8CzHw86!NAN{MT^7#JAh82&;g4jUL4>>v|{cqR_TNt-xiVPZMXAP%26 zOoq)4LPnw><Hdtyb`UmahDa!AvxA1_CKkvugvQ3macF3sh%rS7=?z*MS|U#&Sy&jR zBBC!j51Kwwpy|Veh^abAsxdKxO_jk?3uKB8)EPrbEk+3IQosW@qcc{Zu}|pO{pgGp zWONZSGD_tcD+Q&1P$wTxXC*zQ;K<+*SKs(x*T7I$KWEo?S94PrGgAxGco#=g=Xeuy zGv|0mOLK#GOIIg1XJbnPBLibIB~1lC{}2VgP#+&K5g+0o@8as_80r(E05gbED|EO( zC8(0KzmI>Al0ukckh6zlkcN?|sU}p$&(YTvRRZoPsEUxt09PdiPrndXch?}On5VP9 zUwn|On`;o*x1KI=1zehfEE)>Ryt&Rnu8twDRP%^JaEN12h(fq$h=+oSf|IL{zn^<B zD8xb>oqSvcSu_<Cc|D+Z1_XKfItE25c)La-g&$Nj-rF@Y-dIV&-w#R7*)hb`-9IQ& zNkhrgMM+bTMN2`Ix7^Vu#5G6(Yymd43XU!=3eNt1!68A8o_-<7O5lPZo1hkhoC7gl z!PC#hH3CUJR0Y&&f-Kq!3cNi`P~SK^I(xXfU^>IYF(^by0}{VT5r7_jE}p>wK8}&` z*rL%r$Uigys|?{}5fJ1W=II(9@9FF4?i%mr>EjxYsR^1~f}Mjr145J(LR=$4phDQ3 z6XqHe?CI|ZPfKvGfD)CCf+DXQG)SP~1qxAIq3D7h!;s*DMz5}dDsLH%=mjezE^b|v z6p)-kOys&K39{%ZDDdtf5W60pepn+HRz7I>xkiL2ggN?zx+=K&2O)(5dP!vL>}Y6a zVPX<*;ArL&Z{lod7;kCl<Q8x4>||i(X71|jYT-y>Nko(t(0KO@j(714_Vo-7c6Cuw zaPs%}adq^AM>JHCkH52{k7tx)h^N0FC{v&oP@vSHPg)T}lnarI7z->#42yt*BCiY4 zNze!_1wx_}ngCe@6;yePv8O<=LZT9&5vl3VNJ)@|MMyz`cRmZ$A2>>v5Le#-AIA_^ zYy}MIY0%Wv*u>1$#5LZ+$;mw4#Ld_+-pRn#Dc;Q4*x1C?#lXeV)ri70NR$=O<mKq= zAL<tZFJ_>kF0PPb3S0tVsVO~!<6R>HT>V@;LqdaG;b|AD8)w-E3rXCiqocDk$UX5$ zg*enuSha*j3U>_*)f*Dz=ojqf8WfM)c(~Ib^#GFnpe)8BOj;guGd4FcF?6+vcXKjw zi#Ks|G>vyMa&e9~HZ*WHH83$WcD8U<Le696*z%Z&f+DXcG;Jc4tw;qNR1{P$#G5&z zWiptT;1xNGsDdhQ1@?>vS4>o9Be}3Qa|Y!$F$D$QI|NF5a2-lkR)hAhkow>7^_i)N z0RW4n6tfibGz(B$kg6Eg|4)PV?+nfH_5Ur<`u~tMh!{OOQ$&w0jS|;F`u~3*{r>~B z=>K!EoWs`thpa&v?f)Am!-gG@(kFP_f$-8*ibjn_#{u&5tWehEjE)1)a2#N?|3BLQ zAMO8-_W!|sJN$z?qy7KU{y%7ZakT$G+W&_Q!Q<|rkM{owjN^~?|3Q0Jt&EZS-|+r_ W8lwMiX_#u1Vv&|eNpBjfUM>I<rGeN0 diff --git a/pom.xml b/pom.xml index 8d4674193..b4c1b5f29 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,6 @@ <name>BudgetMaster</name> <modules> - <module>BudgetMasterDatabaseMigrator</module> <module>BudgetMasterServer</module> </modules> -- GitLab