@Override public void run() { logger.debug("Register root " + startDir.toString()); try { registerAll(startDir); } catch (IOException ex) { logger.error(ex.getMessage()); return; } if (isInterrupted()) return; VOSync.debug("Sync local db with drive"); DbPool.goSql( "Synching the local db with drive", "select NAME from FILES", new SqlWorker<Boolean>() { @Override public Boolean go(Connection conn, PreparedStatement stmt) throws SQLException { ResultSet resSet = stmt.executeQuery(); while (resSet.next()) { try { String fileName = resSet.getString(1); Path filePath = FileSystems.getDefault().getPath(startDir.toString(), fileName.substring(1)); if (!filePath.toFile().exists()) { logger.debug( "Deleting file " + fileName + " existing in DB and not present on disk"); api.delete(fileName); MetaHandler.delete(fileName); } } catch (DropboxException ex) { } } resSet.close(); return true; } }); if (isInterrupted()) return; VOSync.debug("Sync storage"); syncStorage(); logger.debug("Start watching"); while (!isInterrupted()) { WatchKey key; try { key = watcher.take(); } catch (InterruptedException x) { return; } Path dir = keys.get(key); if (dir == null) { System.err.println("WatchKey " + key.toString() + " not recognized!"); continue; } for (WatchEvent<?> event : key.pollEvents()) { Kind<?> kind = event.kind(); // TBD - provide example of how OVERFLOW event is handled if (kind == OVERFLOW) { continue; } // Context for directory entry event is the file name of entry WatchEvent<Path> ev = cast(event); Path name = ev.context(); Path child = dir.resolve(name); Path relativeDir = startDir.relativize(child); String fileRelPath = "/" + fixPath(relativeDir.toString()); // print out event logger.debug(event.kind().name() + ":" + child + " " + name + " " + key); try { if (Files.exists(child, new LinkOption[] {}) && Files.isHidden(child)) { logger.error( "Skipping hidden file " + child.getFileName()); // skip OS generated catalog files } else { if (event.kind() == ENTRY_CREATE) { if (Files.isRegularFile(child, NOFOLLOW_LINKS)) { // file modified uploadFile(fileRelPath, child); } else if (Files.isDirectory(child, NOFOLLOW_LINKS)) { // directory contents changed registerAll(child); } } else if (event.kind() == ENTRY_DELETE) { logger.debug("Deleting " + fileRelPath); api.delete(fileRelPath); MetaHandler.delete(fileRelPath); logger.debug("Deleted!"); } else if (event.kind() == ENTRY_MODIFY) { if (Files.isRegularFile(child, NOFOLLOW_LINKS)) { // file modified uploadFile(fileRelPath, child); } else if (Files.isDirectory(child, NOFOLLOW_LINKS)) { // directory contents changed // logger.debug("Renewing dir: "+relativeDir.toString()); // TODO update folder date // MetaHandler.setFile(fileRelPath, child, rev); } } } } catch (IOException ex) { ex.printStackTrace(); logger.error(ex.getMessage()); } catch (DropboxException ex) { ex.printStackTrace(); logger.error(ex.getMessage()); } } boolean valid = key.reset(); if (!valid) keys.remove(key); } }
/** * First of all create a backup of Money and Categories Database on the SD card. After that, get * those backups from the SD card and upload it to the DropBox after the app checks if it already * exist. If the backup already exists then delete the old and create the new one. * * @param params * @return */ @Override protected String doInBackground(String... params) { String MoneyDBpath = "/data/" + context.getPackageName() + "/databases/MoneyDatabase"; String MoneyOutputName = "/TransactionsBackup"; BackupRestoreSD backupRestoreSD = new BackupRestoreSD(MoneyDBpath, MoneyOutputName, context); backupRestoreSD.backup(); File MoneyBackup = new File(backupRestoreSD.getSDPath() + "/Pocket-Wallet/TransactionsBackup"); String CategoriesDBpath = "/data/" + context.getPackageName() + "/databases/categories"; String CategoriesOutputName = "/CategoriesBackup"; backupRestoreSD = new BackupRestoreSD(CategoriesDBpath, CategoriesOutputName, context); backupRestoreSD.backup(); File CategoryBackup = new File(backupRestoreSD.getSDPath() + "/Pocket-Wallet/CategoriesBackup"); try { InputStream Mis = new FileInputStream(MoneyBackup); InputStream Cis = new FileInputStream(CategoryBackup); DropboxAPI.Entry metadata = api.metadata("/", 1000, null, true, null); boolean flag = false, cflag = false; List<DropboxAPI.Entry> CFolder = metadata.contents; for (DropboxAPI.Entry entry : CFolder) { if (entry.fileName().equals("TransactionsBackup")) { flag = true; } else if (entry.fileName().equals("CategoriesBackup")) { cflag = true; } if (flag && cflag) { break; } } if (!flag) { api.putFile("TransactionsBackup", Mis, MoneyBackup.length(), null, null); } else { api.delete("/TransactionsBackup"); api.putFile("TransactionsBackup", Mis, MoneyBackup.length(), null, null); } if (!cflag) { api.putFile("CategoriesBackup", Cis, CategoryBackup.length(), null, null); } else { api.delete("/CategoriesBackup"); api.putFile("CategoriesBackup", Cis, CategoryBackup.length(), null, null); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DropboxException e) { e.printStackTrace(); } return null; }