Example #1
0
        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));
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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();
        }