in common/src/main/scala/com/theguardian/multimedia/archivehunter/common/ArchiveEntry.scala [36:77]
def fromS3Sync(bucket: String, key: String, maybeVersion:Option[String], region:String)(implicit client:S3Client):ArchiveEntry = {
Try {
val req = maybeVersion match {
case None=>HeadObjectRequest.builder().bucket(bucket).key(key).build()
case Some(ver)=>HeadObjectRequest.builder().bucket(bucket).key(key).versionId(ver).build()
}
client.headObject(req)
} match {
case Success(meta) =>
val mimeType = Option(meta.contentType()) match {
case Some(mimeTypeString) =>
MimeType.fromString(mimeTypeString) match {
case Right(mt) => mt
case Left(error) =>
logger.warn(error)
MimeType("application", "octet-stream")
}
case None =>
logger.warn(s"received no content type from S3 for s3://$bucket/$key")
MimeType("application", "octet-stream")
}
val storageClass = Option(meta.storageClassAsString()) match {
case Some(sc) => sc
case None =>
logger.warn(s"s3://$bucket/$key has no storage class! Assuming STANDARD.")
"STANDARD"
}
println(s"version from head request is ${Option(meta.versionId())}, passed version is $maybeVersion")
//prefer the version as obtained from s3 metadata over the one we are given
val versionToStore = (Option(meta.versionId()), maybeVersion) match {
case (Some(v), _)=>Some(v)
case (_, Some(v))=>Some(v)
case (None, None)=>None
}
println(s"versionToStore is $versionToStore")
ArchiveEntry(makeDocId(bucket, key), bucket, key, versionToStore, Some(region), getFileExtension(key), meta.contentLength(), ZonedDateTime.ofInstant(meta.lastModified(), ZoneId.systemDefault()), meta.eTag(), mimeType, proxied = false, StorageClass.withName(storageClass), Seq(), beenDeleted = false, None)
case Failure(err) =>
logger.error(s"Could not look up metadata for s3://$bucket/$key in region $region: ${err.getMessage}")
throw err
}
}