diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java index 4ecfce7d3e0c91836982bc3ce25708bbd4d44d41..48f6140d92b8987f897d28e78675cea6c41e0cf1 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java @@ -3,7 +3,6 @@ package de.deadlocker8.budgetmaster.database; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import de.deadlocker8.budgetmaster.categories.Category; -import de.deadlocker8.budgetmaster.database.legacy.LegacyParser; import de.deadlocker8.budgetmaster.database.model.BackupDatabase; import de.deadlocker8.budgetmaster.database.model.v4.BackupDatabase_v4; import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5; @@ -17,6 +16,7 @@ public class DatabaseParser { final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); + private final int MINIMUM_VERSION = 4; private final int LATEST_VERSION = 5; private final String jsonString; @@ -29,6 +29,39 @@ public class DatabaseParser } public Database parseDatabaseFromJSON() throws IllegalArgumentException + { + int version = parseVersion(); + + if(version < MINIMUM_VERSION) + { + throw new IllegalArgumentException(Localization.getString("error.database.import.version.too.old", version, MINIMUM_VERSION)); + } + + BackupDatabase importedDatabase = null; + + if(version == 4) + { + BackupDatabase_v4 parsedDatabase = new DatabaseParser_v4(jsonString).parseDatabaseFromJSON(); + LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories, {2} accounts and {3} templates", parsedDatabase.getTransactions().size(), parsedDatabase.getCategories().size(), parsedDatabase.getAccounts().size(), parsedDatabase.getTemplates().size())); + importedDatabase = parsedDatabase; + } + + if(version == 5) + { + BackupDatabase_v5 parsedDatabase = new DatabaseParser_v5(jsonString).parseDatabaseFromJSON(); + LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories, {2} accounts, {3} templates {4} charts and {5} images", parsedDatabase.getTransactions().size(), parsedDatabase.getCategories().size(), parsedDatabase.getAccounts().size(), parsedDatabase.getTemplates().size(), parsedDatabase.getCharts().size(), parsedDatabase.getImages().size())); + importedDatabase = parsedDatabase; + } + + if(importedDatabase == null) + { + throw new IllegalArgumentException(Localization.getString("error.database.import.unknown.version")); + } + + return upgradeDatabase(importedDatabase); + } + + private int parseVersion() { try { @@ -41,43 +74,7 @@ public class DatabaseParser int version = root.get("VERSION").getAsInt(); LOGGER.info(MessageFormat.format("Parsing BudgetMaster database with version {0}", version)); - - BackupDatabase importedDatabase = null; - - if(version == 2) - { - final Database database = new LegacyParser(jsonString, categoryNone).parseDatabaseFromJSON(); - LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories and {2} accounts", database.getTransactions().size(), database.getCategories().size(), database.getAccounts().size())); - return database; - } - - if(version == 3) - { - final Database database = new DatabaseParser_v3(jsonString).parseDatabaseFromJSON(); - LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories and {2} accounts", database.getTransactions().size(), database.getCategories().size(), database.getAccounts().size())); - return database; - } - - if(version == 4) - { - BackupDatabase_v4 parsedDatabase = new DatabaseParser_v4(jsonString).parseDatabaseFromJSON(); - LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories, {2} accounts and {3} templates", parsedDatabase.getTransactions().size(), parsedDatabase.getCategories().size(), parsedDatabase.getAccounts().size(), parsedDatabase.getTemplates().size())); - importedDatabase = parsedDatabase; - } - - if(version == 5) - { - BackupDatabase_v5 parsedDatabase = new DatabaseParser_v5(jsonString).parseDatabaseFromJSON(); - LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories, {2} accounts, {3} templates {4} charts and {5} images", parsedDatabase.getTransactions().size(), parsedDatabase.getCategories().size(), parsedDatabase.getAccounts().size(), parsedDatabase.getTemplates().size(), parsedDatabase.getCharts().size(), parsedDatabase.getImages().size())); - importedDatabase = parsedDatabase; - } - - if(importedDatabase == null) - { - throw new IllegalArgumentException(Localization.getString("error.database.import.unknown.version")); - } - - return upgradeDatabase(importedDatabase); + return version; } catch(Exception e) { diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties index 62bb26e9e0ebd0460ad4c34f0200dc6b38cb4666..b98a9810b3c8d8e3394ebc04d7530d43bfdf3599 100644 --- a/src/main/resources/languages/base_de.properties +++ b/src/main/resources/languages/base_de.properties @@ -19,6 +19,7 @@ error.title.database.import=Importfehler error.text.database.import=Beim Importieren der Datei ist ein Fehler aufgetreten.<br>Details:<br>{0} error.database.import.invalid.json=Die hochgeladene JSON Datei ist ungültig. error.database.import.unknown.version=Die hochgeladene JSON Datei enthält keine gültige Definition einer BudgetMaster Datenbank. +error.database.import.version.too.old=Die hochgeladene JSON Datei ist zu alt. Version: {0} Mindestversion: {1} # TITLE title.incomes=Einnahmen diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties index 30c54ae148100291459049e3788039dd0c136779..5f2b3f655033105f947c3d47b1ad0022404f96fe 100644 --- a/src/main/resources/languages/base_en.properties +++ b/src/main/resources/languages/base_en.properties @@ -19,6 +19,8 @@ error.title.database.import=Import Error error.text.database.import=An error occurred while importing the file.<br>Details:<br>{0} error.database.import.invalid.json=The uploaded JSON File is invalid. error.database.import.unknown.version=The uploaded JSON File does not contain a valid BudgetMaster database definition. +error.database.import.version.too.old=The uploaded JSON File is too old. Version: {0} Minimum version: {1} + # TITLE title.incomes=Incomes diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParserTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParserTest.java index 21fa45aa9de25a650ef77f9a7485143ecee0be42..24773d6650a4c7edb49909e5f75d1e72fa5ba804 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParserTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParserTest.java @@ -6,6 +6,8 @@ import de.deadlocker8.budgetmaster.database.Database; import de.deadlocker8.budgetmaster.database.DatabaseParser; import de.thecodelabs.utils.util.Localization; import de.thecodelabs.utils.util.Localization.LocalizationDelegate; +import de.thecodelabs.utils.util.localization.LocalizationMessageFormatter; +import de.thecodelabs.utils.util.localization.formatter.JavaMessageFormatter; import org.junit.Before; import org.junit.Test; @@ -16,6 +18,7 @@ import java.nio.file.Paths; import java.util.Locale; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class DatabaseParserTest @@ -31,6 +34,12 @@ public class DatabaseParserTest return Locale.ENGLISH; } + @Override + public LocalizationMessageFormatter messageFormatter() + { + return new JavaMessageFormatter(); + } + @Override public String getBaseResource() { @@ -74,9 +83,9 @@ public class DatabaseParserTest categoryNone.setID(1); DatabaseParser importer = new DatabaseParser(json, categoryNone); - final Database database = importer.parseDatabaseFromJSON(); - assertThat(database.getTransactions()) - .hasSize(6); + assertThatThrownBy(importer::parseDatabaseFromJSON) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("too old"); } @Test @@ -87,8 +96,8 @@ public class DatabaseParserTest categoryNone.setID(1); DatabaseParser importer = new DatabaseParser(json, categoryNone); - final Database database = importer.parseDatabaseFromJSON(); - assertThat(database.getTransactions()) - .hasSize(4); + assertThatThrownBy(importer::parseDatabaseFromJSON) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("too old"); } } \ No newline at end of file