Skip to content
Snippets Groups Projects
Commit 10fb7535 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#598 - throw error if json files with a backup version less than 4 are imported

parent acdc0960
No related branches found
No related tags found
No related merge requests found
...@@ -3,7 +3,6 @@ package de.deadlocker8.budgetmaster.database; ...@@ -3,7 +3,6 @@ package de.deadlocker8.budgetmaster.database;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import de.deadlocker8.budgetmaster.categories.Category; 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.BackupDatabase;
import de.deadlocker8.budgetmaster.database.model.v4.BackupDatabase_v4; import de.deadlocker8.budgetmaster.database.model.v4.BackupDatabase_v4;
import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5; import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5;
...@@ -17,6 +16,7 @@ public class DatabaseParser ...@@ -17,6 +16,7 @@ public class DatabaseParser
{ {
final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
private final int MINIMUM_VERSION = 4;
private final int LATEST_VERSION = 5; private final int LATEST_VERSION = 5;
private final String jsonString; private final String jsonString;
...@@ -30,33 +30,14 @@ public class DatabaseParser ...@@ -30,33 +30,14 @@ public class DatabaseParser
public Database parseDatabaseFromJSON() throws IllegalArgumentException public Database parseDatabaseFromJSON() throws IllegalArgumentException
{ {
try int version = parseVersion();
{
final JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject();
final String type = root.get("TYPE").getAsString();
if(!type.equals(JSONIdentifier.BUDGETMASTER_DATABASE.toString()))
{
throw new IllegalArgumentException("JSON is not of type BUDGETMASTER_DATABASE");
}
int version = root.get("VERSION").getAsInt(); if(version < MINIMUM_VERSION)
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(); throw new IllegalArgumentException(Localization.getString("error.database.import.version.too.old", version, MINIMUM_VERSION));
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) BackupDatabase importedDatabase = null;
{
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) if(version == 4)
{ {
...@@ -79,6 +60,22 @@ public class DatabaseParser ...@@ -79,6 +60,22 @@ public class DatabaseParser
return upgradeDatabase(importedDatabase); return upgradeDatabase(importedDatabase);
} }
private int parseVersion()
{
try
{
final JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject();
final String type = root.get("TYPE").getAsString();
if(!type.equals(JSONIdentifier.BUDGETMASTER_DATABASE.toString()))
{
throw new IllegalArgumentException("JSON is not of type BUDGETMASTER_DATABASE");
}
int version = root.get("VERSION").getAsInt();
LOGGER.info(MessageFormat.format("Parsing BudgetMaster database with version {0}", version));
return version;
}
catch(Exception e) catch(Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
......
...@@ -19,6 +19,7 @@ error.title.database.import=Importfehler ...@@ -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.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.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.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
title.incomes=Einnahmen title.incomes=Einnahmen
......
...@@ -19,6 +19,8 @@ error.title.database.import=Import Error ...@@ -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.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.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.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
title.incomes=Incomes title.incomes=Incomes
......
...@@ -6,6 +6,8 @@ import de.deadlocker8.budgetmaster.database.Database; ...@@ -6,6 +6,8 @@ import de.deadlocker8.budgetmaster.database.Database;
import de.deadlocker8.budgetmaster.database.DatabaseParser; import de.deadlocker8.budgetmaster.database.DatabaseParser;
import de.thecodelabs.utils.util.Localization; import de.thecodelabs.utils.util.Localization;
import de.thecodelabs.utils.util.Localization.LocalizationDelegate; 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.Before;
import org.junit.Test; import org.junit.Test;
...@@ -16,6 +18,7 @@ import java.nio.file.Paths; ...@@ -16,6 +18,7 @@ import java.nio.file.Paths;
import java.util.Locale; import java.util.Locale;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class DatabaseParserTest public class DatabaseParserTest
...@@ -31,6 +34,12 @@ public class DatabaseParserTest ...@@ -31,6 +34,12 @@ public class DatabaseParserTest
return Locale.ENGLISH; return Locale.ENGLISH;
} }
@Override
public LocalizationMessageFormatter messageFormatter()
{
return new JavaMessageFormatter();
}
@Override @Override
public String getBaseResource() public String getBaseResource()
{ {
...@@ -74,9 +83,9 @@ public class DatabaseParserTest ...@@ -74,9 +83,9 @@ public class DatabaseParserTest
categoryNone.setID(1); categoryNone.setID(1);
DatabaseParser importer = new DatabaseParser(json, categoryNone); DatabaseParser importer = new DatabaseParser(json, categoryNone);
final Database database = importer.parseDatabaseFromJSON(); assertThatThrownBy(importer::parseDatabaseFromJSON)
assertThat(database.getTransactions()) .isInstanceOf(IllegalArgumentException.class)
.hasSize(6); .hasMessageContaining("too old");
} }
@Test @Test
...@@ -87,8 +96,8 @@ public class DatabaseParserTest ...@@ -87,8 +96,8 @@ public class DatabaseParserTest
categoryNone.setID(1); categoryNone.setID(1);
DatabaseParser importer = new DatabaseParser(json, categoryNone); DatabaseParser importer = new DatabaseParser(json, categoryNone);
final Database database = importer.parseDatabaseFromJSON(); assertThatThrownBy(importer::parseDatabaseFromJSON)
assertThat(database.getTransactions()) .isInstanceOf(IllegalArgumentException.class)
.hasSize(4); .hasMessageContaining("too old");
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment