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