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

#598 - removed old parsers

parent 1d4ed36b
No related branches found
No related tags found
No related merge requests found
package de.deadlocker8.budgetmaster.database;
import com.google.gson.*;
import de.deadlocker8.budgetmaster.accounts.Account;
import de.deadlocker8.budgetmaster.accounts.AccountState;
import de.deadlocker8.budgetmaster.accounts.AccountType;
import de.deadlocker8.budgetmaster.categories.Category;
import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
import de.deadlocker8.budgetmaster.repeating.endoption.*;
import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifier;
import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierType;
import de.deadlocker8.budgetmaster.tags.Tag;
import de.deadlocker8.budgetmaster.transactions.Transaction;
import de.thecodelabs.utils.util.Localization;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class DatabaseParser_v3
{
final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
private final String jsonString;
protected List<Category> categories;
protected List<Account> accounts;
public DatabaseParser_v3(String json)
{
this.jsonString = json;
}
public Database parseDatabaseFromJSON() throws IllegalArgumentException
{
JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject();
categories = parseCategories(root);
accounts = parseAccounts(root);
List<Transaction> transactions = parseTransactions(root);
return new Database(categories, accounts, transactions, new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
}
protected List<Category> parseCategories(JsonObject root)
{
List<Category> parsedCategories = new ArrayList<>();
JsonArray jsonCategories = root.get("categories").getAsJsonArray();
for(JsonElement currentCategory : jsonCategories)
{
Category parsedCategory = new Gson().fromJson(currentCategory, Category.class);
parsedCategories.add(parsedCategory);
}
return parsedCategories;
}
protected List<Account> parseAccounts(JsonObject root)
{
List<Account> parsedAccounts = new ArrayList<>();
JsonArray jsonAccounts = root.get("accounts").getAsJsonArray();
for(JsonElement currentAccount : jsonAccounts)
{
final JsonObject accountObject = currentAccount.getAsJsonObject();
Integer ID = accountObject.get("ID").getAsInt();
String name = accountObject.get("name").getAsString();
AccountType accountType = AccountType.valueOf(accountObject.get("type").getAsString());
AccountState accountState = AccountState.FULL_ACCESS;
if(accountObject.has("accountState"))
{
accountState = AccountState.valueOf(accountObject.get("accountState").getAsString());
}
Account parsedAccount = new Account(name, accountType, null);
parsedAccount.setID(ID);
parsedAccount.setAccountState(accountState);
parsedAccounts.add(parsedAccount);
}
return parsedAccounts;
}
protected List<Transaction> parseTransactions(JsonObject root)
{
List<Transaction> parsedTransactions = new ArrayList<>();
JsonArray transactions = root.get("transactions").getAsJsonArray();
for(JsonElement currentTransaction : transactions)
{
int amount = currentTransaction.getAsJsonObject().get("amount").getAsInt();
String name = currentTransaction.getAsJsonObject().get("name").getAsString();
String description = currentTransaction.getAsJsonObject().get("description").getAsString();
Transaction transaction = new Transaction();
transaction.setAmount(amount);
transaction.setName(name);
transaction.setDescription(description);
transaction.setTags(parseTags(currentTransaction.getAsJsonObject()));
int categoryID = currentTransaction.getAsJsonObject().get("category").getAsJsonObject().get("ID").getAsInt();
transaction.setCategory(getCategoryByID(categoryID));
int accountID = currentTransaction.getAsJsonObject().get("account").getAsJsonObject().get("ID").getAsInt();
transaction.setAccount(getAccountByID(accountID));
JsonElement transferAccount = currentTransaction.getAsJsonObject().get("transferAccount");
if(transferAccount != null)
{
int transferAccountID = transferAccount.getAsJsonObject().get("ID").getAsInt();
transaction.setTransferAccount(getAccountByID(transferAccountID));
}
String date = currentTransaction.getAsJsonObject().get("date").getAsString();
DateTime parsedDate = DateTime.parse(date, DateTimeFormat.forPattern("yyyy-MM-dd"));
transaction.setDate(parsedDate);
transaction.setRepeatingOption(parseRepeatingOption(currentTransaction.getAsJsonObject(), parsedDate));
parsedTransactions.add(transaction);
}
return parsedTransactions;
}
protected RepeatingOption parseRepeatingOption(JsonObject transaction, DateTime startDate)
{
if(!transaction.has("repeatingOption"))
{
return null;
}
JsonObject option = transaction.get("repeatingOption").getAsJsonObject();
JsonObject repeatingModifier = option.get("modifier").getAsJsonObject();
String repeatingModifierType = repeatingModifier.get("localizationKey").getAsString();
RepeatingModifierType type = RepeatingModifierType.getByLocalization(Localization.getString(repeatingModifierType));
RepeatingModifier modifier = RepeatingModifier.fromModifierType(type, repeatingModifier.get("quantity").getAsInt());
JsonObject repeatingEnd = option.get("endOption").getAsJsonObject();
String repeatingEndType = repeatingEnd.get("localizationKey").getAsString();
RepeatingEnd endOption = null;
RepeatingEndType endType = RepeatingEndType.getByLocalization(Localization.getString(repeatingEndType));
switch(endType)
{
case NEVER:
endOption = new RepeatingEndNever();
break;
case AFTER_X_TIMES:
endOption = new RepeatingEndAfterXTimes(repeatingEnd.get("times").getAsInt());
break;
case DATE:
DateTime endDate = DateTime.parse(repeatingEnd.get("endDate").getAsString(), DateTimeFormat.forPattern("yyyy-MM-dd"));
endOption = new RepeatingEndDate(endDate);
break;
}
RepeatingOption repeatingOption = new RepeatingOption();
repeatingOption.setStartDate(startDate);
repeatingOption.setEndOption(endOption);
repeatingOption.setModifier(modifier);
return repeatingOption;
}
protected List<Tag> parseTags(JsonObject transaction)
{
List<Tag> parsedTags = new ArrayList<>();
JsonArray tags = transaction.get("tags").getAsJsonArray();
for(JsonElement currentTag : tags)
{
parsedTags.add(new Gson().fromJson(currentTag, Tag.class));
}
return parsedTags;
}
protected Category getCategoryByID(int ID)
{
for(Category category : categories)
{
if(category.getID() == ID)
{
return category;
}
}
return null;
}
protected Account getAccountByID(int ID)
{
for(Account account : accounts)
{
if(account.getID() == ID)
{
return account;
}
}
return null;
}
}
\ No newline at end of file
package de.deadlocker8.budgetmaster.database.legacy;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import de.deadlocker8.budgetmaster.database.Database;
import de.deadlocker8.budgetmaster.accounts.Account;
import de.deadlocker8.budgetmaster.accounts.AccountType;
import de.deadlocker8.budgetmaster.categories.Category;
import de.deadlocker8.budgetmaster.categories.CategoryType;
import de.deadlocker8.budgetmaster.transactions.Transaction;
import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndDate;
import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndNever;
import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierDays;
import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierMonths;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@SuppressWarnings("deprecation")
public class LegacyParser
{
private final String DATE_FORMAT = "yyyy-MM-dd";
private Account account;
private String jsonString;
private List<Category> categories;
private List<Tag> tags;
private List<TagMatch> tagMatches;
private Category categoryNone;
public LegacyParser(String json, Category categoryNone)
{
this.jsonString = json;
this.account = new Account("LEGACY_IMPORT", AccountType.CUSTOM);
this.categoryNone = categoryNone;
}
public Database parseDatabaseFromJSON()
{
JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject();
categories = new ArrayList<>(parseCategories(root));
tags = parseTags(root);
tagMatches = parseTagMatches(root);
List<Transaction> transactions = parsePayments(root);
List<Account> accounts = new ArrayList<>();
accounts.add(account);
return new Database(categories, accounts, transactions, new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
}
private Set<Category> parseCategories(JsonObject root)
{
Set<Category> parsedCategories = new HashSet<>();
JsonArray jsonCategories = root.get("categories").getAsJsonArray();
for(JsonElement currentCategory : jsonCategories)
{
int ID = currentCategory.getAsJsonObject().get("ID").getAsInt();
String name = currentCategory.getAsJsonObject().get("name").getAsString();
String color = currentCategory.getAsJsonObject().get("color").getAsString();
if(name.equals("NONE") || name.equals("Übertrag")|| name.equals("Rest"))
{
continue;
}
Category category = new Category(name, color, CategoryType.CUSTOM);
category.setID(ID);
parsedCategories.add(category);
}
return parsedCategories;
}
private List<Tag> parseTags(JsonObject root)
{
List<Tag> parsedTags = new ArrayList<>();
JsonArray jsonTags = root.get("tags").getAsJsonArray();
for(JsonElement currentTag : jsonTags)
{
int ID = currentTag.getAsJsonObject().get("ID").getAsInt();
String name = currentTag.getAsJsonObject().get("name").getAsString();
parsedTags.add(new Tag(ID, name));
}
return parsedTags;
}
private List<TagMatch> parseTagMatches(JsonObject root)
{
List<TagMatch> parsedTagMatches = new ArrayList<>();
JsonArray jsonTagMatches = root.get("tagMatches").getAsJsonArray();
for(JsonElement currentTagMatch : jsonTagMatches)
{
int tagID = currentTagMatch.getAsJsonObject().get("tagID").getAsInt();
int paymentID = currentTagMatch.getAsJsonObject().get("paymentID").getAsInt();
int repeatingPaymentID = currentTagMatch.getAsJsonObject().get("repeatingPaymentID").getAsInt();
parsedTagMatches.add(new TagMatch(getTagByID(tagID).getName(), paymentID, repeatingPaymentID));
}
return parsedTagMatches;
}
private List<Transaction> parsePayments(JsonObject root)
{
List<Transaction> parsedTransactions = new ArrayList<>();
parsedTransactions.addAll(parseNormalPayments(root));
parsedTransactions.addAll(parseRepeatingPayments(root));
return parsedTransactions;
}
private List<Transaction> parseNormalPayments(JsonObject root)
{
List<Transaction> parsedTransactions = new ArrayList<>();
JsonArray payments = root.get("normalPayments").getAsJsonArray();
for(JsonElement currentPayment : payments)
{
int ID = currentPayment.getAsJsonObject().get("ID").getAsInt();
int amount = currentPayment.getAsJsonObject().get("amount").getAsInt();
String date = currentPayment.getAsJsonObject().get("date").getAsString();
int categoryID = currentPayment.getAsJsonObject().get("categoryID").getAsInt();
String name = currentPayment.getAsJsonObject().get("name").getAsString();
String description = currentPayment.getAsJsonObject().get("description").getAsString();
Transaction transaction = new Transaction();
transaction.setAmount(amount);
transaction.setName(name);
transaction.setDescription(description);
transaction.setCategory(getCategoryByID(categoryID));
transaction.setAccount(account);
transaction.setRepeatingOption(null);
transaction.setTags(getTagsByPaymentID(ID));
DateTime parsedDate = DateTime.parse(date, DateTimeFormat.forPattern(DATE_FORMAT));
transaction.setDate(parsedDate);
parsedTransactions.add(transaction);
}
return parsedTransactions;
}
private List<Transaction> parseRepeatingPayments(JsonObject root)
{
List<Transaction> parsedTransactions = new ArrayList<>();
JsonArray payments = root.get("repeatingPayments").getAsJsonArray();
for(JsonElement currentPayment : payments)
{
int ID = currentPayment.getAsJsonObject().get("ID").getAsInt();
int amount = currentPayment.getAsJsonObject().get("amount").getAsInt();
String date = currentPayment.getAsJsonObject().get("date").getAsString();
int categoryID = currentPayment.getAsJsonObject().get("categoryID").getAsInt();
String name = currentPayment.getAsJsonObject().get("name").getAsString();
String description = currentPayment.getAsJsonObject().get("description").getAsString();
Transaction transaction = new Transaction();
transaction.setAmount(amount);
transaction.setName(name);
transaction.setDescription(description);
transaction.setCategory(getCategoryByID(categoryID));
transaction.setTags(getTagsByPaymentID(ID));
transaction.setAccount(account);
DateTime parsedDate = DateTime.parse(date, DateTimeFormat.forPattern(DATE_FORMAT));
transaction.setDate(parsedDate);
transaction.setRepeatingOption(parseRepeatingOption(currentPayment.getAsJsonObject(), parsedDate));
parsedTransactions.add(transaction);
}
return parsedTransactions;
}
private RepeatingOption parseRepeatingOption(JsonObject repeatingPayment, DateTime startDate)
{
RepeatingOption repeatingOption = new RepeatingOption();
repeatingOption.setStartDate(startDate);
// end option
if(repeatingPayment.has("repeatEndDate"))
{
String repeatEndDate = repeatingPayment.get("repeatEndDate").getAsString();
repeatingOption.setEndOption(new RepeatingEndDate(DateTime.parse(repeatEndDate, DateTimeFormat.forPattern(DATE_FORMAT))));
}
else
{
repeatingOption.setEndOption(new RepeatingEndNever());
}
// modifier
int repeatMonthDay = repeatingPayment.get("repeatMonthDay").getAsInt();
if(repeatMonthDay == 0)
{
int repeatInterval = repeatingPayment.get("repeatInterval").getAsInt();
repeatingOption.setModifier(new RepeatingModifierDays(repeatInterval));
}
else
{
repeatingOption.setModifier(new RepeatingModifierMonths(1));
}
return repeatingOption;
}
private Category getCategoryByID(int ID)
{
for(Category category : categories)
{
if(category.getID() == ID)
{
return category;
}
}
return categoryNone;
}
private Tag getTagByID(int ID)
{
for(Tag tag : tags)
{
if(tag.getID() == ID)
{
return tag;
}
}
return null;
}
private List<de.deadlocker8.budgetmaster.tags.Tag> getTagsByPaymentID(int paymentID)
{
List<de.deadlocker8.budgetmaster.tags.Tag> paymentTags = new ArrayList<>();
for(TagMatch tagMatch : tagMatches)
{
if(tagMatch.getPaymentID() == paymentID)
{
paymentTags.add(new de.deadlocker8.budgetmaster.tags.Tag(tagMatch.getTagName()));
}
}
return paymentTags;
}
}
\ No newline at end of file
package de.deadlocker8.budgetmaster.database.legacy;
@Deprecated
public class Tag
{
private int ID;
private String name;
public Tag(int ID, String name)
{
this.ID = ID;
this.name = name;
}
public int getID()
{
return ID;
}
public String getName()
{
return name;
}
}
\ No newline at end of file
package de.deadlocker8.budgetmaster.database.legacy;
@Deprecated
public class TagMatch
{
private String tagName;
private int paymentID;
private int repeatingPaymentID;
public TagMatch(String tagName, int paymentID, int repeatingPaymentID)
{
this.tagName = tagName;
this.paymentID = paymentID;
this.repeatingPaymentID = repeatingPaymentID;
}
public String getTagName()
{
return tagName;
}
public void setTagName(String tagName)
{
this.tagName = tagName;
}
public int getPaymentID()
{
return paymentID;
}
public int getRepeatingPaymentID()
{
return repeatingPaymentID;
}
}
\ No newline at end of file
package de.deadlocker8.budgetmaster.unit.database;
import de.deadlocker8.budgetmaster.accounts.Account;
import de.deadlocker8.budgetmaster.accounts.AccountType;
import de.deadlocker8.budgetmaster.categories.Category;
import de.deadlocker8.budgetmaster.categories.CategoryType;
import de.deadlocker8.budgetmaster.database.Database;
import de.deadlocker8.budgetmaster.database.DatabaseParser_v3;
import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndAfterXTimes;
import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierDays;
import de.deadlocker8.budgetmaster.tags.Tag;
import de.deadlocker8.budgetmaster.transactions.Transaction;
import de.thecodelabs.utils.util.Localization;
import de.thecodelabs.utils.util.Localization.LocalizationDelegate;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import static org.assertj.core.api.Assertions.assertThat;
public class DatabaseParser_v3Test
{
@Before
public void before()
{
Localization.setDelegate(new LocalizationDelegate()
{
@Override
public Locale getLocale()
{
return Locale.ENGLISH;
}
@Override
public String getBaseResource()
{
return "languages/base";
}
});
Localization.load();
}
@Test
public void test_Categories()
{
try
{
String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v3Test.json").toURI())));
DatabaseParser_v3 importer = new DatabaseParser_v3(json);
Database database = importer.parseDatabaseFromJSON();
final Category categoryNone = new Category("Keine Kategorie", "#FFFFFF", CategoryType.NONE);
categoryNone.setID(1);
final Category categoryRest = new Category("Übertrag", "#FFFF00", CategoryType.REST);
categoryRest.setID(2);
final Category category3 = new Category("0815", "#ffcc00", CategoryType.CUSTOM);
category3.setID(3);
assertThat(database.getCategories()).hasSize(3)
.containsExactlyInAnyOrder(categoryNone, categoryRest, category3);
}
catch(IOException | URISyntaxException e)
{
e.printStackTrace();
}
}
@Test
public void test_Accounts()
{
try
{
String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v3Test.json").toURI())));
DatabaseParser_v3 importer = new DatabaseParser_v3(json);
Database database = importer.parseDatabaseFromJSON();
final Account expectedAccount1 = new Account("Placeholder", AccountType.ALL);
expectedAccount1.setID(1);
final Account expectedAccount2 = new Account("Default", AccountType.CUSTOM);
expectedAccount2.setID(2);
final Account expectedAccount3 = new Account("Second Account", AccountType.CUSTOM);
expectedAccount3.setID(3);
assertThat(database.getAccounts()).hasSize(3)
.containsExactlyInAnyOrder(expectedAccount1, expectedAccount2, expectedAccount3);
}
catch(IOException | URISyntaxException e)
{
e.printStackTrace();
}
}
@Test
public void test_Transactions()
{
try
{
String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v3Test.json").toURI())));
DatabaseParser_v3 importer = new DatabaseParser_v3(json);
Database database = importer.parseDatabaseFromJSON();
Account account1 = new Account("Default", AccountType.CUSTOM);
account1.setID(2);
Account account2 = new Account("Second Account", AccountType.CUSTOM);
account2.setID(3);
Category categoryNone = new Category("Keine Kategorie", "#FFFFFF", CategoryType.NONE);
categoryNone.setID(1);
Category category3 = new Category("0815", "#ffcc00", CategoryType.CUSTOM);
category3.setID(3);
Transaction normalTransaction_1 = new Transaction();
normalTransaction_1.setAmount(35000);
normalTransaction_1.setDate(DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd")));
normalTransaction_1.setCategory(categoryNone);
normalTransaction_1.setName("Income");
normalTransaction_1.setDescription("Lorem Ipsum");
normalTransaction_1.setTags(new ArrayList<>());
normalTransaction_1.setAccount(account1);
Transaction normalTransaction_2 = new Transaction();
normalTransaction_2.setAmount(-2000);
normalTransaction_2.setDate(DateTime.parse("2018-06-15", DateTimeFormat.forPattern("yyyy-MM-dd")));
normalTransaction_2.setName("Simple");
normalTransaction_2.setDescription("");
normalTransaction_2.setAccount(account2);
normalTransaction_2.setCategory(category3);
List<Tag> tags = new ArrayList<>();
Tag tag = new Tag("0815");
tag.setID(1);
tags.add(tag);
normalTransaction_2.setTags(tags);
Transaction repeatingTransaction_1 = new Transaction();
repeatingTransaction_1.setAmount(-12300);
DateTime repeatingTransactionDate_1 = DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd"));
repeatingTransaction_1.setDate(repeatingTransactionDate_1);
repeatingTransaction_1.setCategory(categoryNone);
repeatingTransaction_1.setName("Test");
repeatingTransaction_1.setDescription("");
repeatingTransaction_1.setAccount(account1);
RepeatingOption repeatingOption_1 = new RepeatingOption();
repeatingOption_1.setModifier(new RepeatingModifierDays(10));
repeatingOption_1.setStartDate(repeatingTransactionDate_1);
repeatingOption_1.setEndOption(new RepeatingEndAfterXTimes(2));
repeatingTransaction_1.setRepeatingOption(repeatingOption_1);
repeatingTransaction_1.setTags(new ArrayList<>());
Transaction repeatingTransaction_2 = new Transaction();
repeatingTransaction_2.setAmount(-12300);
DateTime repeatingTransactionDate_2 = DateTime.parse("2018-03-23", DateTimeFormat.forPattern("yyyy-MM-dd"));
repeatingTransaction_2.setDate(repeatingTransactionDate_2);
repeatingTransaction_2.setCategory(categoryNone);
repeatingTransaction_2.setName("Test");
repeatingTransaction_2.setDescription("");
repeatingTransaction_2.setAccount(account1);
RepeatingOption repeatingOption_2 = new RepeatingOption();
repeatingOption_2.setModifier(new RepeatingModifierDays(10));
repeatingOption_2.setStartDate(repeatingTransactionDate_2);
repeatingOption_2.setEndOption(new RepeatingEndAfterXTimes(2));
repeatingTransaction_2.setRepeatingOption(repeatingOption_2);
repeatingTransaction_2.setTags(new ArrayList<>());
Transaction transferTransaction = new Transaction();
transferTransaction.setAmount(-250);
transferTransaction.setDate(DateTime.parse("2018-06-15", DateTimeFormat.forPattern("yyyy-MM-dd")));
transferTransaction.setName("Transfer");
transferTransaction.setDescription("");
transferTransaction.setAccount(account2);
transferTransaction.setTransferAccount(account1);
transferTransaction.setCategory(category3);
transferTransaction.setTags(new ArrayList<>());
assertThat(database.getTransactions()).hasSize(6)
.contains(normalTransaction_1,
normalTransaction_2,
repeatingTransaction_1,
repeatingTransaction_2,
transferTransaction);
}
catch(IOException | URISyntaxException e)
{
e.printStackTrace();
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment