/src/com/coetre/rift/utils/JsonDataManager.java

https://bitbucket.org/methodin/rift · Java · 508 lines · 368 code · 49 blank · 91 comment · 46 complexity · ed4a88b6c177fa64672e6e360d13142f MD5 · raw file

  1. package com.coetre.rift.utils;
  2. import android.database.sqlite.SQLiteConstraintException;
  3. import android.os.Environment;
  4. import android.util.JsonReader;
  5. import android.util.JsonToken;
  6. import android.util.JsonWriter;
  7. import com.activeandroid.query.Select;
  8. import com.coetre.rift.entities.Invoice;
  9. import com.coetre.rift.entities.Task;
  10. import com.coetre.rift.entities.Client;
  11. import com.coetre.rift.entities.InvoiceClient;
  12. import com.coetre.rift.entities.InvoiceRecord;
  13. import com.coetre.rift.entities.TaskLog;
  14. import java.io.*;
  15. import java.text.ParseException;
  16. import java.text.SimpleDateFormat;
  17. import java.util.ArrayList;
  18. import java.util.HashMap;
  19. import java.util.List;
  20. public class JsonDataManager {
  21. public static final String AUTOMATED_FILE_NAMEE = "automated-backup.json";
  22. public static final String FILE_NAME = "backup.json";
  23. public static final String DIRECTORY = "Rift";
  24. private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  25. private String filename = FILE_NAME;
  26. public JsonDataManager() {
  27. }
  28. public JsonDataManager(String filename) {
  29. this.filename = filename;
  30. }
  31. /**
  32. * Backup the database to a file
  33. *
  34. * @return
  35. * @throws IOException
  36. */
  37. public boolean backup() {
  38. try {
  39. FileOutputStream out = new FileOutputStream(getFileDirectory() + filename);
  40. JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
  41. writer.setIndent(" ");
  42. writer.beginObject();
  43. backupClient(writer);
  44. backupInvoice(writer);
  45. backupInvoiceClient(writer);
  46. backupTask(writer);
  47. backupInvoiceRecord(writer);
  48. backupTaskLog(writer);
  49. writer.endObject();
  50. writer.close();
  51. return true;
  52. } catch (IOException e) {
  53. e.printStackTrace();
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. return false;
  58. }
  59. /**
  60. * Restore the backed up file
  61. *
  62. * @return
  63. */
  64. public int restore() {
  65. try {
  66. FileInputStream in = new FileInputStream(getFileDirectory() + filename);
  67. JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
  68. int count = 0;
  69. try {
  70. reader.beginObject();
  71. while (reader.hasNext()) {
  72. String name = reader.nextName();
  73. if (name.equals("Client")) {
  74. count += restoreClient(reader);
  75. } else if (name.equals("Invoice")) {
  76. count += restoreInvoice(reader);
  77. } else if (name.equals("InvoiceClient")) {
  78. count += restoreInvoiceClient(reader);
  79. } else if (name.equals("InvoiceRecord")) {
  80. count += restoreInvoiceRecord(reader);
  81. } else if (name.equals("Task")) {
  82. count += restoreTask(reader);
  83. } else if (name.equals("TaskLog")) {
  84. count += restoreTaskLog(reader);
  85. }
  86. }
  87. reader.endObject();
  88. } finally {
  89. reader.close();
  90. }
  91. return count;
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. } catch (Exception e) {
  95. e.printStackTrace();
  96. }
  97. return 0;
  98. }
  99. /**
  100. * Builds the directory for teh backup file
  101. *
  102. * @return
  103. * @throws IOException
  104. */
  105. public static String getFileDirectory() throws IOException {
  106. String directory = Environment.getExternalStorageDirectory() + "/" + DIRECTORY + "/";
  107. File folder = new File(directory);
  108. if (!folder.exists()) {
  109. if (!folder.mkdir()) {
  110. throw new IOException("Cannot create directory " + directory);
  111. }
  112. }
  113. return directory;
  114. }
  115. /**
  116. * Inserts a record into the DB
  117. *
  118. * @param table
  119. * @param reader
  120. * @param map
  121. * @return int
  122. */
  123. private int executeInsert(String table, JsonReader reader, HashMap<String, String> map) {
  124. ArrayList<Object> replacements = new ArrayList<Object>();
  125. String keyList = "";
  126. String valueList = "";
  127. try {
  128. while (reader.hasNext()) {
  129. String name = reader.nextName();
  130. if (map.containsKey(name)) {
  131. String type = map.get(name);
  132. keyList += (keyList.equals("") ? "" : ",") + name;
  133. if (reader.peek() == JsonToken.NULL) {
  134. valueList += (valueList.equals("") ? "" : ",") + "NULL";
  135. reader.skipValue();
  136. } else {
  137. valueList += (valueList.equals("") ? "" : ",") + "?";
  138. try {
  139. if (type.equals("Integer")) {
  140. replacements.add(reader.nextInt());
  141. } else if (type.equals("Long")) {
  142. replacements.add(reader.nextLong());
  143. } else if (type.equals("Boolean")) {
  144. replacements.add(reader.nextBoolean());
  145. } else if (type.equals("Date")) {
  146. replacements.add(formatter.parse(reader.nextString()));
  147. } else if (type.equals("Double")) {
  148. replacements.add(reader.nextDouble());
  149. } else {
  150. replacements.add(reader.nextString());
  151. }
  152. } catch (ParseException e) {
  153. e.printStackTrace();
  154. }
  155. }
  156. }
  157. }
  158. com.activeandroid.util.SQLiteUtils.execSql(
  159. "INSERT INTO " + table + " (" + keyList + ") VALUES (" + valueList + ")",
  160. replacements.toArray());
  161. return 1;
  162. } catch (IOException e) {
  163. e.printStackTrace();
  164. } catch (SQLiteConstraintException e) {
  165. e.printStackTrace();
  166. }
  167. return 0;
  168. }
  169. /**
  170. * Backup the Client entities
  171. *
  172. * @param writer
  173. */
  174. private void backupClient(JsonWriter writer) throws IOException {
  175. writer.name("Client");
  176. writer.beginArray();
  177. // Fetch all clients
  178. final List<Client> rows = new Select().from(Client.class).orderBy("Id ASC").execute();
  179. for (Client row : rows) {
  180. writer.beginObject();
  181. writer.name("Id").value(row.getId());
  182. writer.name("Name").value(row.getName());
  183. writer.name("Color").value(row.getColor());
  184. writer.name("Rate").value(row.getRate());
  185. writer.name("Deleted").value(row.isDeleted());
  186. writer.endObject();
  187. }
  188. writer.endArray();
  189. }
  190. /**
  191. * Restore the Client entities
  192. *
  193. * @param reader
  194. */
  195. private int restoreClient(JsonReader reader) {
  196. HashMap<String, String> map = new HashMap<String, String>();
  197. map.put("Id", "Long");
  198. map.put("Name", "String");
  199. map.put("Color", "String");
  200. map.put("Rate", "Integer");
  201. map.put("Deleted", "Boolean");
  202. int count = 0;
  203. try {
  204. reader.beginArray();
  205. while (reader.hasNext()) {
  206. reader.beginObject();
  207. count += executeInsert("Client", reader, map);
  208. reader.endObject();
  209. }
  210. reader.endArray();
  211. } catch (IOException e) {
  212. e.printStackTrace();
  213. }
  214. return count;
  215. }
  216. /**
  217. * Backup the Invoice entities
  218. *
  219. * @param writer
  220. */
  221. private void backupInvoice(JsonWriter writer) throws IOException {
  222. writer.name("Invoice");
  223. writer.beginArray();
  224. // Fetch all clients
  225. final List<Invoice> rows = new Select().from(Invoice.class).orderBy("Id ASC").execute();
  226. for (Invoice row : rows) {
  227. writer.beginObject();
  228. writer.name("Id").value(row.getId());
  229. writer.name("Date").value(formatter.format(row.getDate()));
  230. writer.name("Seconds").value(row.getSeconds());
  231. writer.name("Total").value(row.getTotal());
  232. writer.endObject();
  233. }
  234. writer.endArray();
  235. }
  236. /**
  237. * Restore the Invoice entities
  238. *
  239. * @param reader
  240. */
  241. private int restoreInvoice(JsonReader reader) {
  242. HashMap<String, String> map = new HashMap<String, String>();
  243. map.put("Id", "Long");
  244. map.put("Date", "Date");
  245. map.put("Seconds", "Integer");
  246. map.put("Total", "Double");
  247. int count = 0;
  248. try {
  249. reader.beginArray();
  250. while (reader.hasNext()) {
  251. reader.beginObject();
  252. count += executeInsert("Invoice", reader, map);
  253. reader.endObject();
  254. }
  255. reader.endArray();
  256. } catch (IOException e) {
  257. e.printStackTrace();
  258. }
  259. return count;
  260. }
  261. /**
  262. * Backup the InvoiceClient entities
  263. *
  264. * @param writer
  265. */
  266. private void backupInvoiceClient(JsonWriter writer) throws IOException {
  267. writer.name("InvoiceClient");
  268. writer.beginArray();
  269. // Fetch all clients
  270. final List<InvoiceClient> rows = new Select().from(InvoiceClient.class).orderBy("Id ASC").execute();
  271. for (InvoiceClient row : rows) {
  272. writer.beginObject();
  273. writer.name("Id").value(row.getId());
  274. writer.name("Invoice").value(row.getInvoice().getId());
  275. writer.name("Seconds").value(row.getSeconds());
  276. writer.name("Client").value(row.getClient().getId());
  277. writer.name("Rate").value(row.getRate());
  278. writer.name("Total").value(row.getTotal());
  279. writer.endObject();
  280. }
  281. writer.endArray();
  282. }
  283. /**
  284. * Restore the InvoiceClient entities
  285. *
  286. * @param reader
  287. */
  288. private int restoreInvoiceClient(JsonReader reader) {
  289. HashMap<String, String> map = new HashMap<String, String>();
  290. map.put("Id", "Long");
  291. map.put("Invoice", "Long");
  292. map.put("Seconds", "Integer");
  293. map.put("Client", "Long");
  294. map.put("Rate", "Integer");
  295. map.put("Total", "Double");
  296. int count = 0;
  297. try {
  298. reader.beginArray();
  299. while (reader.hasNext()) {
  300. reader.beginObject();
  301. count += executeInsert("InvoiceClient", reader, map);
  302. reader.endObject();
  303. }
  304. reader.endArray();
  305. } catch (IOException e) {
  306. e.printStackTrace();
  307. }
  308. return count;
  309. }
  310. /**
  311. * Backup the InvoiceRecord entities
  312. *
  313. * @param writer
  314. */
  315. private void backupInvoiceRecord(JsonWriter writer) throws IOException {
  316. writer.name("InvoiceRecord");
  317. writer.beginArray();
  318. // Fetch all clients
  319. final List<InvoiceRecord> rows = new Select().from(InvoiceRecord.class).orderBy("Id ASC").execute();
  320. for (InvoiceRecord row : rows) {
  321. writer.beginObject();
  322. writer.name("Id").value(row.getId());
  323. writer.name("InvoiceClient").value(row.getInvoiceClient().getId());
  324. writer.name("Seconds").value(row.getSeconds());
  325. writer.name("Task").value(row.getTask().getId());
  326. writer.name("Total").value(row.getTotal());
  327. writer.name("Parent").value(row.getParent() == null ? null : row.getParent().getId());
  328. writer.endObject();
  329. }
  330. writer.endArray();
  331. }
  332. /**
  333. * Restore the InvoiceRecord entities
  334. *
  335. * @param reader
  336. */
  337. private int restoreInvoiceRecord(JsonReader reader) {
  338. HashMap<String, String> map = new HashMap<String, String>();
  339. map.put("Id", "Long");
  340. map.put("InvoiceClient", "Long");
  341. map.put("Seconds", "Integer");
  342. map.put("Task", "Long");
  343. map.put("Total", "Double");
  344. map.put("Parent", "Long");
  345. int count = 0;
  346. try {
  347. reader.beginArray();
  348. while (reader.hasNext()) {
  349. reader.beginObject();
  350. count += executeInsert("InvoiceRecord", reader, map);
  351. reader.endObject();
  352. }
  353. reader.endArray();
  354. } catch (IOException e) {
  355. e.printStackTrace();
  356. }
  357. return count;
  358. }
  359. /**
  360. * Backup the Task entities
  361. *
  362. * @param writer
  363. */
  364. private void backupTask(JsonWriter writer) throws IOException {
  365. writer.name("Task");
  366. writer.beginArray();
  367. // Fetch all clients
  368. final List<Task> rows = new Select().from(Task.class).orderBy("Id ASC").execute();
  369. for (Task row : rows) {
  370. writer.beginObject();
  371. writer.name("Id").value(row.getId());
  372. writer.name("Seconds").value(row.getSeconds());
  373. writer.name("Name").value(row.getName());
  374. writer.name("Parent").value(row.getParent() == null ? null : row.getParent().getId());
  375. writer.name("Date").value(row.getDate() == null ? null : formatter.format(row.getDate()));
  376. writer.name("Client").value(row.getClient() == null ? null : row.getClient().getId());
  377. writer.name("Deleted").value(row.getDeleted());
  378. writer.endObject();
  379. }
  380. writer.endArray();
  381. }
  382. /**
  383. * Restore the Task entities
  384. *
  385. * @param reader
  386. */
  387. private int restoreTask(JsonReader reader) {
  388. HashMap<String, String> map = new HashMap<String, String>();
  389. map.put("Id", "Long");
  390. map.put("Seconds", "Integer");
  391. map.put("Name", "String");
  392. map.put("Parent", "Long");
  393. map.put("Date", "Date");
  394. map.put("Client", "Long");
  395. map.put("Deleted", "Boolean");
  396. int count = 0;
  397. try {
  398. reader.beginArray();
  399. while (reader.hasNext()) {
  400. reader.beginObject();
  401. count += executeInsert("Task", reader, map);
  402. reader.endObject();
  403. }
  404. reader.endArray();
  405. } catch (IOException e) {
  406. e.printStackTrace();
  407. }
  408. return count;
  409. }
  410. /**
  411. * Backup the TaskLog entities
  412. *
  413. * @param writer
  414. */
  415. private void backupTaskLog(JsonWriter writer) throws IOException {
  416. writer.name("TaskLog");
  417. writer.beginArray();
  418. // Fetch all clients
  419. final List<TaskLog> rows = new Select().from(TaskLog.class).orderBy("Id ASC").execute();
  420. for (TaskLog row : rows) {
  421. writer.beginObject();
  422. writer.name("Id").value(row.getId());
  423. writer.name("Task").value(row.getTask().getId());
  424. writer.name("StartDate").value(formatter.format(row.getStartDate()));
  425. writer.name("EndDate").value(formatter.format(row.getEndDate()));
  426. writer.name("Seconds").value(row.getSeconds());
  427. writer.name("InvoiceRecord").value(row.getInvoiceRecord() == null ? null : row.getInvoiceRecord().getId());
  428. writer.endObject();
  429. }
  430. writer.endArray();
  431. }
  432. /**
  433. * Restore the TaskLog entities
  434. *
  435. * @param reader
  436. */
  437. private int restoreTaskLog(JsonReader reader) {
  438. HashMap<String, String> map = new HashMap<String, String>();
  439. map.put("Id", "Long");
  440. map.put("Task", "Long");
  441. map.put("StartDate", "Date");
  442. map.put("EndDate", "Date");
  443. map.put("Seconds", "Integer");
  444. map.put("InvoiceRecord", "Long");
  445. int count = 0;
  446. try {
  447. reader.beginArray();
  448. while (reader.hasNext()) {
  449. reader.beginObject();
  450. count += executeInsert("TaskLog", reader, map);
  451. reader.endObject();
  452. }
  453. reader.endArray();
  454. } catch (IOException e) {
  455. e.printStackTrace();
  456. }
  457. return count;
  458. }
  459. }