2 * Copyright © 2021 Damyan Ivanov.
3 * This file is part of MoLe.
4 * MoLe is free software: you can distribute it and/or modify it
5 * under the term of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your opinion), any later version.
9 * MoLe is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License terms for details.
14 * You should have received a copy of the GNU General Public License
15 * along with MoLe. If not, see <https://www.gnu.org/licenses/>.
18 package net.ktnx.mobileledger.backup;
20 import android.util.JsonReader;
21 import android.util.JsonToken;
23 import net.ktnx.mobileledger.backup.ConfigIO.Keys;
24 import net.ktnx.mobileledger.dao.CurrencyDAO;
25 import net.ktnx.mobileledger.dao.ProfileDAO;
26 import net.ktnx.mobileledger.dao.TemplateHeaderDAO;
27 import net.ktnx.mobileledger.db.Currency;
28 import net.ktnx.mobileledger.db.DB;
29 import net.ktnx.mobileledger.db.Profile;
30 import net.ktnx.mobileledger.db.TemplateAccount;
31 import net.ktnx.mobileledger.db.TemplateHeader;
32 import net.ktnx.mobileledger.db.TemplateWithAccounts;
34 import java.io.BufferedReader;
35 import java.io.IOException;
36 import java.io.InputStream;
37 import java.io.InputStreamReader;
38 import java.util.ArrayList;
39 import java.util.List;
41 public class RawConfigReader {
42 private final JsonReader r;
43 private List<Currency> commodities;
44 private List<Profile> profiles;
45 private List<TemplateWithAccounts> templates;
46 private String currentProfile;
47 public RawConfigReader(InputStream inputStream) {
48 r = new JsonReader(new BufferedReader(new InputStreamReader(inputStream)));
50 public List<Currency> getCommodities() {
53 public List<Profile> getProfiles() {
56 public List<TemplateWithAccounts> getTemplates() {
59 public String getCurrentProfile() {
60 return currentProfile;
62 public void readConfig() throws IOException {
66 currentProfile = null;
69 String item = r.nextName();
70 if (r.peek() == JsonToken.NULL) {
75 case Keys.COMMODITIES:
76 commodities = readCommodities();
79 profiles = readProfiles();
82 templates = readTemplates();
84 case Keys.CURRENT_PROFILE:
85 currentProfile = r.nextString();
88 throw new RuntimeException("unexpected top-level item " + item);
93 private TemplateAccount readTemplateAccount() throws IOException {
95 TemplateAccount result = new TemplateAccount(0L, 0L, 0L);
96 while (r.peek() != JsonToken.END_OBJECT) {
97 String item = r.nextName();
98 if (r.peek() == JsonToken.NULL) {
104 result.setAccountName(r.nextString());
106 case Keys.NAME_GROUP:
107 result.setAccountNameMatchGroup(r.nextInt());
110 result.setAccountComment(r.nextString());
112 case Keys.COMMENT_GROUP:
113 result.setAccountCommentMatchGroup(r.nextInt());
116 result.setAmount((float) r.nextDouble());
118 case Keys.AMOUNT_GROUP:
119 result.setAmountMatchGroup(r.nextInt());
121 case Keys.NEGATE_AMOUNT:
122 result.setNegateAmount(r.nextBoolean());
125 result.setCurrency(r.nextLong());
127 case Keys.CURRENCY_GROUP:
128 result.setCurrencyMatchGroup(r.nextInt());
132 throw new IllegalStateException("Unexpected template account item: " + item);
139 private TemplateWithAccounts readTemplate(JsonReader r) throws IOException {
142 TemplateHeader t = new TemplateHeader(0L, "", "");
143 List<TemplateAccount> accounts = new ArrayList<>();
145 while (r.peek() != JsonToken.END_OBJECT) {
146 String item = r.nextName();
147 if (r.peek() == JsonToken.NULL) {
153 t.setUuid(r.nextString());
156 t.setName(r.nextString());
159 t.setRegularExpression(r.nextString());
162 t.setTestText(r.nextString());
165 t.setDateYear(r.nextInt());
167 case Keys.DATE_YEAR_GROUP:
168 t.setDateYearMatchGroup(r.nextInt());
170 case Keys.DATE_MONTH:
171 t.setDateMonth(r.nextInt());
173 case Keys.DATE_MONTH_GROUP:
174 t.setDateMonthMatchGroup(r.nextInt());
177 t.setDateDay(r.nextInt());
179 case Keys.DATE_DAY_GROUP:
180 t.setDateDayMatchGroup(r.nextInt());
182 case Keys.TRANSACTION:
183 t.setTransactionDescription(r.nextString());
185 case Keys.TRANSACTION_GROUP:
186 t.setTransactionDescriptionMatchGroup(r.nextInt());
189 t.setTransactionComment(r.nextString());
191 case Keys.COMMENT_GROUP:
192 t.setTransactionCommentMatchGroup(r.nextInt());
194 case Keys.IS_FALLBACK:
195 t.setFallback(r.nextBoolean());
199 while (r.peek() == JsonToken.BEGIN_OBJECT) {
200 accounts.add(readTemplateAccount());
205 throw new RuntimeException("Unknown template header item: " + item);
210 TemplateWithAccounts result = new TemplateWithAccounts();
212 result.accounts = accounts;
215 private List<TemplateWithAccounts> readTemplates() throws IOException {
216 List<TemplateWithAccounts> list = new ArrayList<>();
219 while (r.peek() == JsonToken.BEGIN_OBJECT) {
220 list.add(readTemplate(r));
226 private List<Currency> readCommodities() throws IOException {
227 List<Currency> list = new ArrayList<>();
230 while (r.peek() == JsonToken.BEGIN_OBJECT) {
231 Currency c = new Currency();
234 while (r.peek() != JsonToken.END_OBJECT) {
235 final String item = r.nextName();
236 if (r.peek() == JsonToken.NULL) {
242 c.setName(r.nextString());
245 c.setPosition(r.nextString());
248 c.setHasGap(r.nextBoolean());
251 throw new RuntimeException("Unknown commodity key: " + item);
258 throw new RuntimeException("Missing commodity name");
266 private List<Profile> readProfiles() throws IOException {
267 List<Profile> list = new ArrayList<>();
269 while (r.peek() == JsonToken.BEGIN_OBJECT) {
270 Profile p = new Profile();
272 while (r.peek() != JsonToken.END_OBJECT) {
273 String item = r.nextName();
274 if (r.peek() == JsonToken.NULL) {
281 p.setUuid(r.nextString());
284 p.setName(r.nextString());
287 p.setUrl(r.nextString());
290 p.setUseAuthentication(r.nextBoolean());
293 p.setAuthUser(r.nextString());
296 p.setAuthPassword(r.nextString());
299 p.setApiVersion(r.nextInt());
302 p.setPermitPosting(r.nextBoolean());
304 case Keys.DEFAULT_COMMODITY:
305 p.setDefaultCommodity(r.nextString());
307 case Keys.SHOW_COMMODITY:
308 p.setShowCommodityByDefault(r.nextBoolean());
310 case Keys.SHOW_COMMENTS:
311 p.setShowCommentsByDefault(r.nextBoolean());
313 case Keys.FUTURE_DATES:
314 p.setFutureDates(r.nextInt());
316 case Keys.PREF_ACCOUNT:
317 p.setPreferredAccountsFilter(r.nextString());
320 p.setTheme(r.nextInt());
325 throw new IllegalStateException("Unexpected profile item: " + item);
336 public void restoreAll() {
337 restoreCommodities();
341 private void restoreTemplates() {
342 if (templates == null)
345 TemplateHeaderDAO dao = DB.get()
348 for (TemplateWithAccounts t : templates) {
349 if (dao.getTemplateWithAccountsByUuidSync(t.header.getUuid()) == null)
353 private void restoreProfiles() {
354 if (profiles == null)
357 ProfileDAO dao = DB.get()
360 for (Profile p : profiles) {
361 if (dao.getByUuidSync(p.getUuid()) == null)
365 private void restoreCommodities() {
366 if (commodities == null)
369 CurrencyDAO dao = DB.get()
372 for (Currency c : commodities) {
373 if (dao.getByNameSync(c.getName()) == null)