def handleVidispineItemNeedsBackup()

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