in magenta-lib/src/main/scala/magenta/artifact/S3Location.scala [28:71]
def listAll(bucket: String)(implicit s3Client: S3Client): Seq[S3Object] =
listObjects(bucket, None)
def listObjects(location: S3Location)(implicit
s3Client: S3Client
): Seq[S3Object] =
listObjects(location.bucket, Some(location.key))
val maxKeysInBucketListing =
1000 // AWS won't return more than this, even if you set the parameter to a larger value
private def listObjects(bucket: String, prefix: Option[String])(implicit
s3Client: S3Client
): Seq[S3Object] = {
def request(continuationToken: Option[String]): ListObjectsV2Request =
ListObjectsV2Request
.builder()
.bucket(bucket)
.prefix(prefix.orNull)
.maxKeys(maxKeysInBucketListing)
.continuationToken(continuationToken.orNull)
.build()
@tailrec
def pageListings(
acc: Seq[ListObjectsV2Response],
previousListing: ListObjectsV2Response
): Seq[ListObjectsV2Response] = {
if (!previousListing.isTruncated) {
acc
} else {
val listing = s3Client.listObjectsV2(
request(Some(previousListing.nextContinuationToken))
)
pageListings(acc :+ listing, listing)
}
}
val initialListing = s3Client.listObjectsV2(request(None))
for {
summaries <- pageListings(Seq(initialListing), initialListing)
summary <- summaries.contents.asScala
} yield S3Object(bucket, summary.key, summary.size)
}