Esempio n. 1
0
  @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;
  }