R/AWR-S3.R

#' An R client to Amazon S3
#'
#' This is a simple wrapper around the most important features of the related Java SDK, \code{s3_put_file()}, \code{s3_get_file()}, \code{s3_delete_file()}.
#' @references \url{http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/Batch/AWSBatchClient.html}
#' @docType package
#' @importFrom rJava .jnew J .jbyte
#' @import AWR
#' @name AWR.S3
NULL

#' @param bucket the S3 bucket
#' @param key    the S3 key
#' @param local_file  the filename
#' @param client SDK client
#' @export
#' @rdname AWR.S3
s3_put_file <- function(bucket, key, local_file, client=s3_client()) {
  local_file <- .jnew("java.io.File", local_file)
  client$putObject(bucket, key, local_file)
}

#' @export
#' @rdname AWR.S3
s3_get_file <- function(bucket, key, local_file, client=s3_client()) {
  request <- .jnew("com.amazonaws.services.s3.model.GetObjectRequest", bucket, key)
  local_file <- .jnew("java.io.File", local_file)
  client$getObject(request, local_file)
}

#' deletes an object from an S3 bucket
#' @export
#' @rdname AWR.S3
s3_delete_file <- function(bucket, key, client=s3_client()) {
  client$deleteObject(bucket, key)
}

#' @export
#' @rdname AWR.S3
s3_list_files <- function(bucket, key="", client=s3_client()) {

  listResult <- client$listObjectsV2(bucket, key)
  summaries <- listResult$getObjectSummaries()

  origin <- as.POSIXct("1970-01-01")
  n <- summaries$size()
  ret <- data.frame(
    bucketName = character(n),
    key = character(n),
    eTag = character(n),
    size = numeric(n),
    lastModified = as.POSIXct(numeric(n), origin=origin),
    storageClass = character(n),
    owner = character(n),
    stringsAsFactors = FALSE
  )

  null2NA <- function(x) if(is.null(x)) NA else x

  for (i in 1:n) {
    obj <- summaries$get(as.integer(i-1))
    row <- list(
      obj$getBucketName(),
      obj$getKey(),
      obj$getETag(),
      obj$getSize(),
      as.POSIXct(obj$getLastModified()$getTime()  / 1000, origin=origin),
      obj$getStorageClass(),
      obj$getOwner()
    )

    ret[i,] <- lapply(row, null2NA)
  }

  ret
}


#' @export
#' @rdname AWR.S3
s3_client <- function() {
  client <- .jnew('com.amazonaws.services.s3.AmazonS3ClientBuilder')$defaultClient()

  ## fail on error
  if (inherits(client, 'SdkClientException')) {
    stop(paste(
      'There was an error while starting the S3 Client, probably due to no configured AWS Region',
      '(that you could fix eg in ~/.aws/config or via environment variables, then reload the package):',
      client$message))
  }

  ## return
  invisible(client)
}
nfultz/AWR.S3 documentation built on May 30, 2019, 8:26 a.m.