/**
   * Get a item backup file preserved in the cloud.
   *
   * @param context context DSpace
   * @param ref ID of the item
   * @param establishConnection true if pretend establish connection to cloud
   * @return true if file correctly sent to cloud, or false if not
   */
  public Boolean getItem(Context context, Integer ref, Boolean establishConnection) {
    DSpaceObject obj = this.getDSpaceObject(context, Constants.ITEM, ref);

    // if Object DSpace doesn't exist, return false
    if (obj == null) return false;

    // if just one file to get make connection with cloud
    if (establishConnection == true) {
      this.makeConnection();
      this.filesInCloud.putAll(this.newCloudConnection.getInfoFilesIn(Constants.ITEM));
    }

    // see if it is possible and necessary get community backup from cloud
    Boolean var = this.couldGetFileFromCloud(context, ref, Constants.ITEM);
    if (var == false) {
      // if just one file to send close connection with cloud
      if (establishConnection == true) this.closeConnection();
      return false;
    }

    // get file name of the community backup
    Backup backup = new Backup();
    String filename = backup.getFileNameObj(obj);

    // get file from cloud
    Boolean result = this.getFileFromCloud(filename);

    // if just one file to send close connection with cloud
    if (establishConnection == true) this.closeConnection();

    return result;
  }
  /**
   * See if is necessary and possible to get the backup file from cloud.
   *
   * @param context DSpace context
   * @param ref ID of the object
   * @param type type of the object DSpace
   * @return true if it is necessary or possible to get the backup from cloud or false if not
   */
  private Boolean couldGetFileFromCloud(Context context, int ref, int type) {
    // get the corresponding Dspace Object
    DSpaceObject obj = this.getDSpaceObject(context, type, ref);

    // if Object DSpace doesn't exist, return false
    if (obj == null) return false;

    // see if backup file exists in cloud, if not return false
    if (this.filesInCloud.containsKey(obj.getHandle())) {
      BackupProcess backupPro = new BackupProcess();
      String ETagSaved = backupPro.getETag(context, obj.getHandle());

      // see if ETag of file in cloud, has equal to the last send, if not return false
      if (ETagSaved.compareTo(this.filesInCloud.get(obj.getHandle())) == 0) {
        // see if exists backup file locally
        Backup backup = new Backup();
        String filename = backup.getFileNameObj(obj);
        Boolean existLocalFile = backup.existFile(filename);

        // if not exist file locally return true
        if (existLocalFile == true) {
          // get MD5 of local file
          String md5LocalFile = backup.getMD5File(filename);
          // get MD5 of the last file sent to cloud
          String md5FileSentCloud = backupPro.getSentMD5(context, obj.getHandle());

          // if files equal, there is no necessity to get file from cloud, then return false
          if (md5LocalFile.compareTo(md5FileSentCloud) == 0) return false;
          else return true;
        } else return true;
      } else return false;
    } else return false;
  }
  /**
   * Send a community backup file to cloud to be preserved.
   *
   * @param context context DSpace
   * @param ref ID of the community
   * @param establishConnection true if pretend establish connection to cloud
   * @return true if file correctly sent to cloud, or false if not
   */
  public Boolean sendCommunity(Context context, Integer ref, Boolean establishConnection) {
    // get Dspace Object to the respective community
    DSpaceObject obj = this.getDSpaceObject(context, Constants.COMMUNITY, ref);

    // if Object DSpace doesn't exist, return false
    if (obj == null) return false;

    // if connection not maked
    if (establishConnection == true) {
      this.makeConnection();
      this.filesInCloud.putAll(this.newCloudConnection.getInfoFilesIn(Constants.COMMUNITY));
    }

    // see if last backup has sent to cloud
    Boolean var = this.sendDone(context, ref, Constants.COMMUNITY);
    if (var == true) {
      // if just one file to send close connection with cloud
      if (establishConnection == true) this.closeConnection();
      return false;
    }

    Backup backup = new Backup();

    // see if backup exists and is correct
    Boolean statBackup = backup.backupDone(context, ref, Constants.COMMUNITY);

    // if backup doesn't exist, do it
    Boolean statOperation = false;
    if (statBackup == false) statOperation = backup.exportCommunity(context, ref);
    else statOperation = true;

    // if backup operation fails, return false
    if (statOperation == false) {
      // if just one file to send close connection with cloud
      if (establishConnection == true) this.closeConnection();
      return false;
    }

    // get file name of the community backup
    String filename = backup.getFileNameObj(obj);

    // send file to cloud
    Boolean result = this.sendFileToCloud(context, filename);

    // if just one file to send close connection with cloud
    if (establishConnection == true) this.closeConnection();

    return result;
  }