diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java index 5664f313a093a4387a1daff59dbcec8e2555dfd7..4ecfce7d3e0c91836982bc3ce25708bbd4d44d41 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java @@ -2,8 +2,10 @@ package de.deadlocker8.budgetmaster.database; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import de.deadlocker8.budgetmaster.database.legacy.LegacyParser; 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; import de.thecodelabs.utils.util.Localization; import org.slf4j.Logger; @@ -14,6 +16,9 @@ import java.text.MessageFormat; public class DatabaseParser { final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); + + private final int LATEST_VERSION = 5; + private final String jsonString; private final Category categoryNone; @@ -37,6 +42,8 @@ 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(); @@ -53,19 +60,24 @@ public class DatabaseParser if(version == 4) { - final Database database = new DatabaseParser_v4(jsonString).parseDatabaseFromJSON(); - LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories, {2} accounts and {3} templates", database.getTransactions().size(), database.getCategories().size(), database.getAccounts().size(), database.getTemplates().size())); - return database; + 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) { - final BackupDatabase_v5 database = new DatabaseParser_v5(jsonString).parseDatabaseFromJSON(); - LOGGER.debug(MessageFormat.format("Parsed database with {0} transactions, {1} categories, {2} accounts, {3} templates and {4} charts", database.getTransactions().size(), database.getCategories().size(), database.getAccounts().size(), database.getTemplates().size(), database.getCharts().size())); - return database.convert(); + 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; } - throw new IllegalArgumentException(Localization.getString("error.database.import.unknown.version")); + if(importedDatabase == null) + { + throw new IllegalArgumentException(Localization.getString("error.database.import.unknown.version")); + } + + return upgradeDatabase(importedDatabase); } catch(Exception e) { @@ -73,4 +85,17 @@ public class DatabaseParser throw new IllegalArgumentException(Localization.getString("error.database.import.invalid.json"), e); } } + + private Database upgradeDatabase(BackupDatabase importedDatabase) + { + BackupDatabase upgradedDatabase = importedDatabase; + while(upgradedDatabase.getVersion() < LATEST_VERSION) + { + LOGGER.debug(MessageFormat.format("Upgrading database from version {0} to {1}", upgradedDatabase.getVersion(), upgradedDatabase.getVersion() + 1)); + upgradedDatabase = upgradedDatabase.upgrade(); + } + + LOGGER.debug(MessageFormat.format("Converting database with version {0} to internal entities", upgradedDatabase.getVersion())); + return upgradedDatabase.convert(); + } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/model/Upgradeable.java b/src/main/java/de/deadlocker8/budgetmaster/database/model/Upgradeable.java new file mode 100644 index 0000000000000000000000000000000000000000..4da81d2064df374be9b07025b9d734ee232ccc84 --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/database/model/Upgradeable.java @@ -0,0 +1,6 @@ +package de.deadlocker8.budgetmaster.database.model; + +public interface Upgradeable<T> +{ + T upgrade(); +}