in common/src/main/scala/com/theguardian/multimedia/archivehunter/common/ArchiveEntryHitReader.scala [22:74]
private def mappingToLightboxes(value:Seq[Map[String,String]]) =
value.map(entry=>
LightboxIndex(entry("owner"),
//if you don't do this, an original value of None becomes Some(null), which is not pleasant...
safeGetOptional(entry, "avatarUrl"),
ZonedDateTime.parse(entry("addedAt"), DateTimeFormatter.ISO_DATE_TIME),
safeGetOptional(entry, "memberOfBulk")
)
)
implicit object ArchiveEntryHR extends HitReader[ArchiveEntry] {
override def read(hit: Hit): Try[ArchiveEntry] = {
val size = try {
hit.sourceField("size").asInstanceOf[Long]
} catch {
case ex:java.lang.ClassCastException=>
hit.sourceField("size").asInstanceOf[Int].toLong
}
Try {
val timestamp = ZonedDateTime.parse(hit.sourceField("last_modified").asInstanceOf[String])
ArchiveEntry(
hit.sourceField("id").asInstanceOf[String],
hit.sourceField("bucket").asInstanceOf[String],
hit.sourceField("path").asInstanceOf[String],
hit.sourceFieldOpt("maybeVersion").flatMap(v=>Option(v.asInstanceOf[String])), //for some reason this keeps coming through as Some(null)
hit.sourceFieldOpt("region").flatMap(v=>Option(v.asInstanceOf[String])),
hit.sourceFieldOpt("file_extension").flatMap(v=>Option(v.asInstanceOf[String])),
size,
timestamp,
hit.sourceField("etag").asInstanceOf[String],
mappingToMimeType(hit.sourceField("mimeType").asInstanceOf[Map[String,String]]),
hit.sourceField("proxied").asInstanceOf[Boolean],
StorageClass.withName(hit.sourceField("storageClass").asInstanceOf[String]),
mappingToLightboxes(hit.sourceField("lightboxEntries").asInstanceOf[Seq[Map[String,String]]]),
hit.sourceField("beenDeleted").asInstanceOf[Boolean],
hit.sourceFieldOpt("mediaMetadata").asInstanceOf[Option[Map[String,AnyVal]]] match {
case None=>None
case Some(null)=>None
case Some(other)=>
try {
Some(mappingToMediaMetadata(other))
} catch {
case err:ClassCastException=>
ownLogger.error(s"Class Cast exception converting metadata for ${hit.sourceField("id").asInstanceOf[String]}: ",err)
None
}
},
hit.sourceFieldOpt("hasDeleteMarker").asInstanceOf[Option[Boolean]]
)
}
}
}