def fromS3Sync()

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
    }
  }