in online_nearline/src/main/scala/VidispineMessageProcessor.scala [581:636]
def handleVidispineItemNeedsBackup(vault:Vault, itemId:String) = {
nearlineRecordDAO.findByVidispineId(itemId).flatMap({
case Some(existingRecord) =>
MDC.put("correlationId", existingRecord.correlationId)
logger.info(s"Item $itemId is registered in the nearline database with MXS ID ${existingRecord.objectId}, updating Vidispine...")
VidispineHelper.updateVidispineWithMXSId(itemId, existingRecord)
case None =>
val originalShapeFut = vidispineCommunicator.listItemShapes(itemId).map({
case None =>
logger.error(s"Can't back up vidispine item $itemId as it has no shapes on it")
throw SilentDropMessage(Some("item has no shapes"))
case Some(shapes) =>
shapes.find(_.tag.contains("original")) match {
case None =>
logger.error(s"Can't back up vidispine item $itemId as it has no original shape. Shapes were: ${shapes.flatMap(_.tag).mkString("; ")}")
throw SilentDropMessage(Some("item has no original shape"))
case Some(originalShape) => originalShape
}
})
val itemMetadataFut = vidispineCommunicator.getMetadata(itemId).map({
case None =>
logger.error(s"Can't get any metadata for item $itemId")
Left("Can't get metadata")
case Some(meta) =>
val possibleNearlineIds = meta.valuesForField("gnm_nearline_id", Some("Asset"))
if (possibleNearlineIds.isEmpty || possibleNearlineIds.count(_.value.nonEmpty) == 0) {
logger.info(s"Item $itemId does not appear to have a registered nearline copy, attempting to correct")
Right(meta)
} else {
logger.info(s"Item $itemId does have a registered nearline ID: ${possibleNearlineIds.filter(_.value.nonEmpty).map(_.value).mkString("; ")}, not going to do anything")
throw SilentDropMessage(Some("item already has a registered nearline copy"))
}
})
for {
metadata <- itemMetadataFut
originalShape <- originalShapeFut
maybePath <- originalShape.getLikelyFile.map(_.id) match {
case Some(fileId)=>
vidispineCommunicator.getFileInformation(fileId).map(_.flatMap(_.getAbsolutePath))
case None=>
Future(None)
}
result <- (metadata, maybePath) match {
case (Right(meta), Some(absPath))=>
logger.info(s"$itemId: Checking if there is a matching file in the nearline and uploading if necessary...")
uploadIfRequiredAndNotExists(vault, absPath, QueryableVidispineItemResponse(meta, originalShape))
case (_, None)=>
Future(Left(s"Could not determine a file path for $itemId"))
case (Left(err), _)=>
Future(Left(err))
}
} yield result
})
}