public void ProcessDocument(BsonDocument document) { string documentId = document["_id"].ToString(); var headerDoc = document["header"] as BsonDocument; if (headerDoc == null) { LogUnprocessedDocument(documentId, new ApplicationException("Document did not contain a header field")); return; } var message = new DicomFileMessage { NationalPACSAccessionNumber = AccNoOrNull(headerDoc["NationalPACSAccessionNumber"]), DicomFilePath = (string)headerDoc["DicomFilePath"], DicomFileSize = headerDoc.Contains("DicomFileSize") ? (long)headerDoc["DicomFileSize"] : -1 }; try { // Rebuild the dataset from the document, then serialize it to JSON to send DicomDataset ds = DicomTypeTranslaterWriter.BuildDicomDataset(document); message.DicomDataset = DicomTypeTranslater.SerializeDatasetToJson(ds); // Add the header information message.StudyInstanceUID = ds.GetValue <string>(DicomTag.StudyInstanceUID, 0); message.SeriesInstanceUID = ds.GetValue <string>(DicomTag.SeriesInstanceUID, 0); message.SOPInstanceUID = ds.GetValue <string>(DicomTag.SOPInstanceUID, 0); } catch (Exception e) { LogUnprocessedDocument(documentId, e); return; } if (!message.VerifyPopulated()) { LogUnprocessedDocument(documentId, new ApplicationException("Message was not valid")); return; } IMessageHeader header = MongoDocumentHeaders.RebuildMessageHeader(headerDoc["MessageHeader"].AsBsonDocument); lock (_oBufferLock) _messageBuffer.Add(new Tuple <DicomFileMessage, IMessageHeader>(message, header)); }
public void SeriesDocumentHeader_HasCorrectHeaders() { var msg = new SeriesMessage { DirectoryPath = "path/to/files", NationalPACSAccessionNumber = "AAA", ImagesInSeries = 1234 }; BsonDocument seriesHeader = MongoDocumentHeaders.SeriesDocumentHeader(msg); var expected = new BsonDocument { { "DirectoryPath", msg.DirectoryPath }, { "NationalPACSAccessionNumber", msg.NationalPACSAccessionNumber }, { "ImagesInSeries", msg.ImagesInSeries } }; Assert.AreEqual(expected, seriesHeader); }
public void Test_SeriesDocumentHeader_NullAccessionNo() { var msg = new SeriesMessage { DirectoryPath = "path/to/files", NationalPACSAccessionNumber = null, ImagesInSeries = 1234 }; BsonDocument seriesHeader = MongoDocumentHeaders.SeriesDocumentHeader(msg); var expected = new BsonDocument { { "DirectoryPath", msg.DirectoryPath }, { "NationalPACSAccessionNumber", BsonNull.Value }, { "ImagesInSeries", msg.ImagesInSeries } }; Assert.AreEqual(expected, seriesHeader); }
public void Test_DicomFileProcessor_ProcessDocument_NullAccNo() { var processor = new DicomFileProcessor(new DicomReprocessorOptions(), null, null); BsonDocument datasetDoc = DicomTypeTranslaterReader.BuildBsonDocument(new DicomDataset()); var msg = new DicomFileMessage { DicomFilePath = "foo", DicomFileSize = 123, NationalPACSAccessionNumber = null, }; datasetDoc.Add("_id", "foo"); BsonDocument bsonHeader = MongoDocumentHeaders.ImageDocumentHeader(msg, new MessageHeader()); BsonDocument document = new BsonDocument() .Add("header", bsonHeader) .AddRange(datasetDoc); processor.ProcessDocument(document); }
public void ImageDocumentHeader_HasCorrectHeaders() { var msg = new DicomFileMessage { DicomFilePath = "path/to/file.dcm", NationalPACSAccessionNumber = "1234" }; string parents = $"{Guid.NewGuid().ToString()}->{Guid.NewGuid().ToString()}"; var headers = new Dictionary <string, object> { { "MessageGuid", Guid.NewGuid().ToString() }, { "ProducerProcessID", 1234 }, { "ProducerExecutableName", "MongoDocumentHeadersTests" }, { "Parents", parents }, { "OriginalPublishTimestamp", MessageHeader.UnixTimeNow() } }; var header = new MessageHeader(headers); BsonDocument bsonImageHeader = MongoDocumentHeaders.ImageDocumentHeader(msg, header); var expected = new BsonDocument { { "DicomFilePath", msg.DicomFilePath }, { "DicomFileSize", msg.DicomFileSize }, { "NationalPACSAccessionNumber", msg.NationalPACSAccessionNumber }, { "MessageHeader", new BsonDocument { { "MessageGuid", header.MessageGuid.ToString() }, { "ProducerProcessID", header.ProducerProcessID }, { "ProducerExecutableName", header.ProducerExecutableName }, { "Parents", string.Join(MessageHeader.Splitter, header.Parents) }, { "OriginalPublishTimestamp", header.OriginalPublishTimestamp } } } }; Assert.AreEqual(expected, bsonImageHeader); }
public void RebuildMessageHeader_HasCorrectHeaders() { var msg = new DicomFileMessage { DicomFilePath = "path/to/file.dcm", NationalPACSAccessionNumber = "1234" }; string parents = $"{Guid.NewGuid().ToString()}->{Guid.NewGuid().ToString()}"; var headers = new Dictionary <string, object> { { "MessageGuid", Guid.NewGuid().ToString() }, { "ProducerProcessID", 1234 }, { "ProducerExecutableName", "MongoDocumentHeadersTests" }, { "Parents", parents }, { "OriginalPublishTimestamp", MessageHeader.UnixTimeNow() } }; var header = new MessageHeader(headers); BsonDocument bsonImageHeader = MongoDocumentHeaders.ImageDocumentHeader(msg, header); IMessageHeader rebuiltHeader = MongoDocumentHeaders.RebuildMessageHeader(bsonImageHeader["MessageHeader"].AsBsonDocument); Assert.AreEqual(header, rebuiltHeader); }
public override void AddToWriteQueue(SeriesMessage message, IMessageHeader header, ulong deliveryTag) { // Only time we are not processing is if we are shutting down anyway if (IsStopping) { return; } if (Model == null) { throw new ApplicationException("Model needs to be set before messages can be processed"); } DicomDataset dataset; try { dataset = DicomTypeTranslater.DeserializeJsonToDataset(message.DicomDataset); } catch (Exception e) { throw new ApplicationException("Could not deserialize json to dataset", e); } BsonDocument datasetDoc; try { datasetDoc = DicomTypeTranslaterReader.BuildBsonDocument(dataset); } catch (Exception e) { throw new ApplicationException("Exception converting dataset to BsonDocument", e); } BsonDocument bsonHeader = MongoDocumentHeaders.SeriesDocumentHeader(message); BsonDocument document = new BsonDocument() .Add("header", bsonHeader) .AddRange(datasetDoc); int docByteLength = document.ToBson().Length; if (docByteLength > MaxDocumentSize) { throw new ApplicationException($"BsonDocument was larger than the max allowed size (have {docByteLength}, max is {MaxDocumentSize})"); } var forceProcess = false; lock (LockObj) { ToProcess.Enqueue(new Tuple <BsonDocument, ulong>(document, deliveryTag)); if (ToProcess.Count >= MaxQueueSize) { forceProcess = true; } } if (!forceProcess) { return; } Logger.Debug("SeriesMessageProcessor: Max queue size reached, calling ProcessQueue"); ProcessQueue(); }