def bulkDownloadItemData()

in app/controllers/BulkDownloadController.scala [225:272]


  def bulkDownloadItemData(tokenValue:String, itemId:String) = Action.async { request=>
    logger.warn(s"bulkDownloadItem: token is $tokenValue, item ID is $itemId")
    validateTokenAsync(request, Some(tokenValue)) { (serverToken, projectId, vaultId)=>
      logger.debug(s"In bulkDownloadItem for $itemId on vault $vaultId")

      userInfoCache.infoForVaultId(vaultId) match {
        case None=>
          logger.error(s"bulkDownloadItem - vaultId is not valid, had no userInfoCache entry")
          Future(NotFound(GenericErrorResponse("not_found","item or vault not found").asJson))
        case Some(userInfo)=>
          implicit val vault:Vault = MatrixStore.openVault(userInfo)
          ObjectMatrixEntry(itemId).getMetadata.map(entry=>{
            entry.attributes.flatMap(_.stringValues.get("GNM_PROJECT_ID")) match {
              case None=>
                logger.error(s"Item $itemId found in vault $vaultId but it is not a member of any project!")
                vault.dispose()
                NotFound(GenericErrorResponse("not_found","item or vault not found").asJson)
              case Some(itemsProjectId)=>
                if(projectId!=itemsProjectId) {
                  logger.error(s"Item $itemId found in vault $vaultId but it is a member of project $itemsProjectId not $projectId")
                  vault.dispose()
                  NotFound(GenericErrorResponse("not_found","item or vault not found").asJson)
                } else {
                  val headers = headersForEntry(entry, Seq(), getMaybeResponseSize(entry, None))
                  val mxsEntry = vault.getObject(itemId)
                  val updatedHeaders = MetadataHelper.getOMFileMd5(mxsEntry) match {
                    case Failure(err)=>
                      logger.warn(s"Could not get appliance MD5: ", err)
                      headers
                    case Success(checksum)=>headers + ("ETag"->checksum)
                  }

                  vault.dispose()
                  Result(
                    ResponseHeader(200, updatedHeaders),
                    HttpEntity.Streamed(getStreamingSourceFor(userInfo, entry), getMaybeResponseSize(entry, None), getMaybeMimetype(entry))
                  )
                }
            }
          }).recover({
            case err:Throwable=>
              logger.error(s"Could not get metadata for $itemId: ", err)
              vault.dispose()
              InternalServerError(GenericErrorResponse("sever_error","Could not get metadata").asJson)
          })
      }
    }
  }