diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java index eb87c103be50e7871278e7431395d15e219f19e2..bb6ebd041da0d88faa14201b4080aea4916318a5 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java @@ -2,8 +2,6 @@ package de.deadlocker8.budgetmaster.database; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializer; import de.deadlocker8.budgetmaster.accounts.Account; import de.deadlocker8.budgetmaster.accounts.AccountService; import de.deadlocker8.budgetmaster.categories.Category; @@ -11,6 +9,7 @@ import de.deadlocker8.budgetmaster.categories.CategoryService; import de.deadlocker8.budgetmaster.charts.Chart; import de.deadlocker8.budgetmaster.charts.ChartService; import de.deadlocker8.budgetmaster.charts.ChartType; +import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5; import de.deadlocker8.budgetmaster.images.Image; import de.deadlocker8.budgetmaster.images.ImageService; import de.deadlocker8.budgetmaster.repeating.RepeatingOption; @@ -22,7 +21,6 @@ import de.deadlocker8.budgetmaster.transactions.Transaction; import de.deadlocker8.budgetmaster.transactions.TransactionService; import de.thecodelabs.utils.io.PathUtils; import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -44,10 +42,7 @@ import java.util.stream.Stream; @Service public class DatabaseService { - public static final Gson GSON = new GsonBuilder() - .excludeFieldsWithoutExposeAnnotation() - .registerTypeAdapter(DateTime.class, (JsonSerializer<DateTime>) (json, typeOfSrc, context) -> new JsonPrimitive(ISODateTimeFormat.date().print(json))) - .create(); + public static final Gson GSON = new GsonBuilder().create(); private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseService.class); private final AccountService accountService; @@ -222,7 +217,7 @@ public class DatabaseService @Transactional public void exportDatabase(Path backupPath) { - final Database database = getDatabaseForJsonSerialization(); + final BackupDatabase_v5 database = getDatabaseForJsonSerialization(); try(Writer writer = new FileWriter(backupPath.toString())) { @@ -247,7 +242,7 @@ public class DatabaseService return "BudgetMasterDatabase_" + DateTime.now().toString(formatString) + ".json"; } - public Database getDatabaseForJsonSerialization() + public BackupDatabase_v5 getDatabaseForJsonSerialization() { List<Category> categories = categoryService.getAllEntitiesAsc(); List<Account> accounts = accountService.getRepository().findAll(); @@ -260,7 +255,10 @@ public class DatabaseService Database database = new Database(categories, accounts, filteredTransactions, templates, charts, images); LOGGER.debug(MessageFormat.format("Created database for JSON with {0} transactions, {1} categories, {2} accounts, {3} templates, {4} charts and {5} images", database.getTransactions().size(), database.getCategories().size(), database.getAccounts().size(), database.getTemplates().size(), database.getCharts().size(), database.getImages())); - return database; + + BackupDatabase_v5 databaseInExternalForm = BackupDatabase_v5.createFromInternalEntities(database); + LOGGER.debug("Converted database to external form"); + return databaseInExternalForm; } private List<Transaction> filterRepeatingTransactions(List<Transaction> transactions) diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java index 2b54747d3ef967434e97300b95992244c983820b..dca501e392cf9db5887eeb49043ba9163683ad04 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java @@ -10,6 +10,7 @@ import de.deadlocker8.budgetmaster.database.Database; import de.deadlocker8.budgetmaster.database.DatabaseParser; import de.deadlocker8.budgetmaster.database.DatabaseService; import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList; +import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5; import de.deadlocker8.budgetmaster.services.ImportResultItem; import de.deadlocker8.budgetmaster.services.ImportService; import de.deadlocker8.budgetmaster.services.UpdateCheckService; @@ -218,7 +219,7 @@ public class SettingsController extends BaseController { LOGGER.debug("Exporting database..."); - final Database databaseForJsonSerialization = databaseService.getDatabaseForJsonSerialization(); + final BackupDatabase_v5 databaseForJsonSerialization = databaseService.getDatabaseForJsonSerialization(); String data = DatabaseService.GSON.toJson(databaseForJsonSerialization); byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java index f40b97f92bd7747e726f732dd946f489e83643b1..58f0859f8c62e8becea010a351151f869fbe6ebd 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java @@ -4,10 +4,10 @@ import de.deadlocker8.budgetmaster.backup.AutoBackupStrategy; import de.deadlocker8.budgetmaster.backup.BackupStatus; import de.deadlocker8.budgetmaster.backup.BackupTask; import de.deadlocker8.budgetmaster.backup.LocalGitBackupTask; -import de.deadlocker8.budgetmaster.categories.Category; import de.deadlocker8.budgetmaster.categories.CategoryType; -import de.deadlocker8.budgetmaster.database.Database; import de.deadlocker8.budgetmaster.database.DatabaseService; +import de.deadlocker8.budgetmaster.database.model.v5.BackupCategory_v5; +import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5; import de.deadlocker8.budgetmaster.settings.Settings; import de.deadlocker8.budgetmaster.settings.SettingsService; import de.deadlocker8.budgetmaster.unit.helpers.Helpers; @@ -103,7 +103,7 @@ public class LocalGitBackupTaskTest final Path repositoryFolder = tempFolder.newFolder().toPath().resolve(".git"); - final Database database = new Database(); + final BackupDatabase_v5 database = new BackupDatabase_v5(); Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database); Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any()); @@ -131,7 +131,7 @@ public class LocalGitBackupTaskTest final Path repositoryFolder = tempFolder.newFolder().toPath().resolve(".git"); - final Database database = new Database(); + final BackupDatabase_v5 database = new BackupDatabase_v5(); Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database); Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any()); @@ -155,7 +155,7 @@ public class LocalGitBackupTaskTest final Path repositoryFolder = tempFolder.newFolder().toPath().resolve(".git"); - final Database database = new Database(); + final BackupDatabase_v5 database = new BackupDatabase_v5(); Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database); Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any()); @@ -163,7 +163,7 @@ public class LocalGitBackupTaskTest localGitBackupTask.setGitFolder(repositoryFolder); localGitBackupTask.run(); - final Database databaseModified = new Database(List.of(new Category("myCategory", "#FF0000", CategoryType.CUSTOM)), List.of(), List.of(), List.of(), List.of(), List.of()); + final BackupDatabase_v5 databaseModified = new BackupDatabase_v5(List.of(new BackupCategory_v5(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of()); Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified); localGitBackupTask.run(); diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java index d5978c4742a296f5b323fec325e98842fd23deb3..2af26eb7414abc596177ee0e460c0cdf69b3ff16 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java @@ -1,10 +1,13 @@ package de.deadlocker8.budgetmaster.unit.backup; -import de.deadlocker8.budgetmaster.backup.*; -import de.deadlocker8.budgetmaster.categories.Category; +import de.deadlocker8.budgetmaster.backup.AutoBackupStrategy; +import de.deadlocker8.budgetmaster.backup.BackupStatus; +import de.deadlocker8.budgetmaster.backup.BackupTask; +import de.deadlocker8.budgetmaster.backup.RemoteGitBackupTask; import de.deadlocker8.budgetmaster.categories.CategoryType; -import de.deadlocker8.budgetmaster.database.Database; import de.deadlocker8.budgetmaster.database.DatabaseService; +import de.deadlocker8.budgetmaster.database.model.v5.BackupCategory_v5; +import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5; import de.deadlocker8.budgetmaster.settings.Settings; import de.deadlocker8.budgetmaster.settings.SettingsService; import de.deadlocker8.budgetmaster.unit.helpers.Helpers; @@ -21,7 +24,6 @@ import org.mockito.Mockito; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.List; @@ -215,7 +217,7 @@ public class RemoteGitBackupTaskTest final RemoteGitBackupTask remoteGitBackupTask = createBackupTask(repositoryFolder, fakeServerFolder); remoteGitBackupTask.run(); - final Database databaseModified = new Database(List.of(new Category("myCategory", "#FF0000", CategoryType.CUSTOM)), List.of(), List.of(), List.of(), List.of(), List.of()); + final BackupDatabase_v5 databaseModified = new BackupDatabase_v5(List.of(new BackupCategory_v5(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of()); Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified); remoteGitBackupTask.run(); @@ -255,7 +257,7 @@ public class RemoteGitBackupTaskTest settings.setAutoBackupGitToken("0815"); Mockito.when(settingsService.getSettings()).thenReturn(settings); - final Database database = new Database(); + final BackupDatabase_v5 database = new BackupDatabase_v5(); Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database); Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any()); diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java index 1c646d0cf28aa5441b5608b99be026444fa9089a..6bf49d2b1308a1961dab731aed8dc5a7f1349ac5 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java @@ -63,7 +63,7 @@ public class DatabaseParser_v5Test { String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI()))); DatabaseParser_v5 importer = new DatabaseParser_v5(json); - Database database = importer.parseDatabaseFromJSON().convert(); + Database database = importer.parseDatabaseFromJSON().convertToInternal(); final Chart chart = new Chart("The best chart", "/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n x: [],\r\n y: [],\r\n type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n showSendToCloud: false,\r\n displaylogo: false,\r\n showLink: false,\r\n responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n", ChartType.CUSTOM, 7); chart.setID(9); @@ -84,7 +84,7 @@ public class DatabaseParser_v5Test { String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI()))); DatabaseParser_v5 importer = new DatabaseParser_v5(json); - Database database = importer.parseDatabaseFromJSON().convert(); + Database database = importer.parseDatabaseFromJSON().convertToInternal(); final Category category = new Category("0815", "#ffcc00", CategoryType.CUSTOM, "fas fa-icons"); category.setID(3); @@ -105,7 +105,7 @@ public class DatabaseParser_v5Test { String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI()))); DatabaseParser_v5 importer = new DatabaseParser_v5(json); - Database database = importer.parseDatabaseFromJSON().convert(); + Database database = importer.parseDatabaseFromJSON().convertToInternal(); final Image accountImage = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG); accountImage.setID(1); @@ -131,7 +131,7 @@ public class DatabaseParser_v5Test { String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI()))); DatabaseParser_v5 importer = new DatabaseParser_v5(json); - Database database = importer.parseDatabaseFromJSON().convert(); + Database database = importer.parseDatabaseFromJSON().convertToInternal(); final Image image = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG); image.setID(1); @@ -155,7 +155,7 @@ public class DatabaseParser_v5Test { String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI()))); DatabaseParser_v5 importer = new DatabaseParser_v5(json); - Database database = importer.parseDatabaseFromJSON().convert(); + Database database = importer.parseDatabaseFromJSON().convertToInternal(); final Image templateImage = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG); templateImage.setID(1); @@ -184,7 +184,7 @@ public class DatabaseParser_v5Test { String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI()))); DatabaseParser_v5 importer = new DatabaseParser_v5(json); - Database database = importer.parseDatabaseFromJSON().convert(); + Database database = importer.parseDatabaseFromJSON().convertToInternal(); Account account1 = new Account("Default", AccountType.CUSTOM); account1.setID(2);