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

#598 - upgrade database from one version to the next one until the latest version is reached

parent c88e5808
No related branches found
No related tags found
No related merge requests found
...@@ -2,8 +2,10 @@ package de.deadlocker8.budgetmaster.database; ...@@ -2,8 +2,10 @@ 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.database.legacy.LegacyParser;
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.v4.BackupDatabase_v4;
import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5; import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5;
import de.thecodelabs.utils.util.Localization; import de.thecodelabs.utils.util.Localization;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -14,6 +16,9 @@ import java.text.MessageFormat; ...@@ -14,6 +16,9 @@ import java.text.MessageFormat;
public class DatabaseParser public class DatabaseParser
{ {
final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
private final int LATEST_VERSION = 5;
private final String jsonString; private final String jsonString;
private final Category categoryNone; private final Category categoryNone;
...@@ -37,6 +42,8 @@ public class DatabaseParser ...@@ -37,6 +42,8 @@ public class DatabaseParser
int version = root.get("VERSION").getAsInt(); int version = root.get("VERSION").getAsInt();
LOGGER.info(MessageFormat.format("Parsing BudgetMaster database with version {0}", version)); LOGGER.info(MessageFormat.format("Parsing BudgetMaster database with version {0}", version));
BackupDatabase importedDatabase = null;
if(version == 2) if(version == 2)
{ {
final Database database = new LegacyParser(jsonString, categoryNone).parseDatabaseFromJSON(); final Database database = new LegacyParser(jsonString, categoryNone).parseDatabaseFromJSON();
...@@ -53,24 +60,42 @@ public class DatabaseParser ...@@ -53,24 +60,42 @@ public class DatabaseParser
if(version == 4) if(version == 4)
{ {
final Database database = new DatabaseParser_v4(jsonString).parseDatabaseFromJSON(); BackupDatabase_v4 parsedDatabase = 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())); 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()));
return database; importedDatabase = parsedDatabase;
} }
if(version == 5) if(version == 5)
{ {
final BackupDatabase_v5 database = new DatabaseParser_v5(jsonString).parseDatabaseFromJSON(); BackupDatabase_v5 parsedDatabase = 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())); 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()));
return database.convert(); importedDatabase = parsedDatabase;
} }
if(importedDatabase == null)
{
throw new IllegalArgumentException(Localization.getString("error.database.import.unknown.version")); throw new IllegalArgumentException(Localization.getString("error.database.import.unknown.version"));
} }
return upgradeDatabase(importedDatabase);
}
catch(Exception e) catch(Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
throw new IllegalArgumentException(Localization.getString("error.database.import.invalid.json"), e); 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
package de.deadlocker8.budgetmaster.database.model;
public interface Upgradeable<T>
{
T upgrade();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment