public virtual Task <SourceResultDataContract> UpsertFileDataSource(FileDataContract fileData, Stream stream)
 {
     return(Task.Run(() =>
     {
         lock (UpsertFileDataSourceLock)
         {
             var hash = GetHash(stream);
             var fileSource = Context.GetFileDataSource(fileData.SourceId, hash);
             if (fileSource == null)
             {
                 fileSource = new FileDataSource
                 {
                     OriginalFileName = fileData.OriginalFileName,
                     DateEdit = DateTime.Now,
                     InputStatus = SourceStatus.PendingExtraction,
                     ReferenceNotes = fileData.ReferenceNotes,
                     UserName = fileData.UserName,
                     HandlerName = fileData.HandlerName,
                     FileHash = hash,
                     MediaType = fileData.MediaType
                 };
                 fileSource = Context.AddDataSource(fileSource);
                 var newFileName = streamManager
                                   .StageStream(
                     fileSource.Id,
                     fileData.OriginalFileName,
                     stream);
                 fileSource.CurrentFileName = newFileName;
             }
             if (fileSource.InputStatus != SourceStatus.PendingExtraction)
             {
                 return DataContractError(fileSource.Id,
                                          DataSourceServiceResources.FileSourceIsNotPendingExtraction);
             }
             fileSource.OriginalFileName = fileData.OriginalFileName ?? fileSource.OriginalFileName;
             fileSource.HandlerName = fileData.HandlerName ?? fileSource.HandlerName;
             fileSource.MediaType = fileData.MediaType ?? fileSource.MediaType;
             fileSource.UserName = fileData.UserName;
             fileSource.DateEdit = DateTime.Now;
             fileSource.ReferenceNotes = fileData.ReferenceNotes ?? fileSource.ReferenceNotes;
             Context.UpdateDataSource(fileSource);
             return ValidateSource(fileSource.Id);
         }
     }));
 }