From c88e5808d2f9da2b31fc488264d2b35b845aa663 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 22 May 2021 22:23:06 +0200
Subject: [PATCH] #598 - migrated DatabaseParser_v4

---
 .../database/DatabaseParser_v4.java           | 153 +++---------------
 1 file changed, 19 insertions(+), 134 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v4.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v4.java
index c73b40efa..713f704ea 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v4.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v4.java
@@ -1,169 +1,54 @@
 package de.deadlocker8.budgetmaster.database;
 
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
-import de.deadlocker8.budgetmaster.templates.Template;
-import de.deadlocker8.budgetmaster.transactions.Transaction;
-import de.deadlocker8.budgetmaster.transactions.TransactionBase;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import de.deadlocker8.budgetmaster.database.model.v4.*;
 
-import java.util.ArrayList;
 import java.util.List;
-import java.util.Optional;
 
-public class DatabaseParser_v4 extends DatabaseParser_v3
+public class DatabaseParser_v4
 {
-	final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
 	private final String jsonString;
 
-	protected List<Transaction> transactions;
-	protected List<Template> templates;
-
 	public DatabaseParser_v4(String json)
 	{
-		super(json);
 		this.jsonString = json;
 	}
 
-	@Override
-	public Database parseDatabaseFromJSON() throws IllegalArgumentException
-	{
-		final JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject();
-		super.categories = super.parseCategories(root);
-		super.accounts = super.parseAccounts(root);
-		this.transactions = parseTransactions(root);
-		this.templates = parseTemplates(root);
-
-		return new Database(categories, accounts, transactions, templates, new ArrayList<>(), new ArrayList<>());
-	}
-
-	@Override
-	protected List<Transaction> parseTransactions(JsonObject root)
+	public BackupDatabase_v4 parseDatabaseFromJSON() throws IllegalArgumentException
 	{
-		List<Transaction> parsedTransactions = new ArrayList<>();
-		JsonArray transactionsToImport = root.get("transactions").getAsJsonArray();
-		for(JsonElement currentTransaction : transactionsToImport)
-		{
-			final JsonObject transactionObject = currentTransaction.getAsJsonObject();
-
-			int amount = transactionObject.get("amount").getAsInt();
-			String name = transactionObject.get("name").getAsString();
-			String description = transactionObject.get("description").getAsString();
-
-			Transaction transaction = new Transaction();
-			transaction.setAmount(amount);
-			transaction.setName(name);
-			transaction.setDescription(description);
-			transaction.setTags(parseTags(transactionObject));
-
-			int categoryID = transactionObject.get("category").getAsJsonObject().get("ID").getAsInt();
-			transaction.setCategory(getCategoryByID(categoryID));
-
-			int accountID = transactionObject.get("account").getAsJsonObject().get("ID").getAsInt();
-			transaction.setAccount(getAccountByID(accountID));
+		BackupDatabase_v4 database = new BackupDatabase_v4();
 
-			JsonElement transferAccount = transactionObject.get("transferAccount");
-			if(transferAccount != null)
-			{
-				int transferAccountID = transferAccount.getAsJsonObject().get("ID").getAsInt();
-				transaction.setTransferAccount(getAccountByID(transferAccountID));
-			}
-
-			String date = transactionObject.get("date").getAsString();
-			DateTime parsedDate = DateTime.parse(date, DateTimeFormat.forPattern("yyyy-MM-dd"));
-			transaction.setDate(parsedDate);
-
-			transaction.setRepeatingOption(super.parseRepeatingOption(transactionObject, parsedDate));
+		final JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject();
+		database.setAccounts(BackupItemParser.parseItems(root.get("accounts").getAsJsonArray(), BackupAccount_v4.class));
+		database.setCategories(BackupItemParser.parseItems(root.get("categories").getAsJsonArray(), BackupCategory_v4.class));
 
-			handleIsExpenditure(transactionObject, transaction);
+		database.setTransactions(BackupItemParser.parseItems(root.get("transactions").getAsJsonArray(), BackupTransaction_v4.class));
+		fixMissingIsExpenditure(database.getTransactions());
 
-			parsedTransactions.add(transaction);
-		}
+		database.setTemplates(BackupItemParser.parseItems(root.get("templates").getAsJsonArray(), BackupTemplate_v4.class));
+		fixMissingIsExpenditure(database.getTemplates());
 
-		return parsedTransactions;
+		return database;
 	}
 
-	protected List<Template> parseTemplates(JsonObject root)
+	private void fixMissingIsExpenditure(List<? extends BackupTransactionBase_v4> items)
 	{
-		final List<Template> parsedTemplates = new ArrayList<>();
-		final JsonArray templatesToImport = root.get("templates").getAsJsonArray();
-		for(JsonElement currentTemplate : templatesToImport)
+		for(BackupTransactionBase_v4 item : items)
 		{
-			final JsonObject templateObject = currentTemplate.getAsJsonObject();
-
-			final String templateName = templateObject.get("templateName").getAsString();
-
-			final Template template = new Template();
-			template.setTemplateName(templateName);
-			template.setTags(super.parseTags(templateObject));
-
-			final JsonElement element = templateObject.get("amount");
-			if(element != null)
+			if(item.getExpenditure() != null)
 			{
-				template.setAmount(element.getAsInt());
+				continue;
 			}
 
-			final JsonElement name = templateObject.get("name");
-			if(name != null)
+			if(item.getAmount() == null)
 			{
-				template.setName(name.getAsString());
-			}
-
-			final JsonElement description = templateObject.get("description");
-			if(description != null)
-			{
-				template.setDescription(description.getAsString());
-			}
-
-			final Optional<Integer> categoryOptional = parseIDOfElementIfExists(templateObject, "category");
-			categoryOptional.ifPresent(integer -> template.setCategory(super.getCategoryByID(integer)));
-
-			final Optional<Integer> accountOptional = parseIDOfElementIfExists(templateObject, "account");
-			accountOptional.ifPresent(integer -> template.setAccount(super.getAccountByID(integer)));
-
-			final Optional<Integer> transferAccountOptional = parseIDOfElementIfExists(templateObject, "transferAccount");
-			transferAccountOptional.ifPresent(integer -> template.setTransferAccount(super.getAccountByID(integer)));
-
-			handleIsExpenditure(templateObject, template);
-
-			parsedTemplates.add(template);
-		}
-
-		return parsedTemplates;
-	}
-
-	protected Optional<Integer> parseIDOfElementIfExists(JsonObject jsonObject, String elementName)
-	{
-		final JsonElement element = jsonObject.get(elementName);
-		if(element != null)
-		{
-			return Optional.of(element.getAsJsonObject().get("ID").getAsInt());
-		}
-		return Optional.empty();
-	}
-
-	protected void handleIsExpenditure(JsonObject jsonObject, TransactionBase transactionBase)
-	{
-		final JsonElement isExpenditure = jsonObject.get("isExpenditure");
-		if(isExpenditure == null)
-		{
-			if(transactionBase.getAmount() == null)
-			{
-				transactionBase.setIsExpenditure(true);
+				item.setExpenditure(true);
 			}
 			else
 			{
-				transactionBase.setIsExpenditure(transactionBase.getAmount() <= 0);
+				item.setExpenditure(item.getAmount() <= 0);
 			}
 		}
-		else
-		{
-			transactionBase.setIsExpenditure(isExpenditure.getAsBoolean());
-		}
 	}
 }
\ No newline at end of file
-- 
GitLab