コード例 #1
0
        public bool DoesRuleMatch(RoutedItem rr, DestRule rule)
        {
            RoutedItemEx routedItem = (RoutedItemEx)rr;

            //        Connection source, DestRule rule, DicomDataset dataSet
            //routedItem.sourceDicomFile?.Dataset
            //2017-10-09 sbh I was running into "hard to debug" npe so I broke out the logic for easier debugging
            //The idea here is to fail fast on rules and return false
            //If a rule field is specified it is "engaged" and must be satisfied
            //If a rule field is not specified ie null then it does not have to be satisfied

            //near future:  We might like to introspect any rule class to make this more dynamic
            //all we need is a fieldmatch table between hl7 and DICOM and other sources
            //then we can introspect class or JSON and loop the specifiers and compare to match
            //otherwise the Rule class itself can grow ridiculously large.

            try
            {
                return(DoesRuleMatchImpl(routedItem, rule));
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }

            return(false);
        }
コード例 #2
0
        private async Task RunImpl(Rules Item, RoutedItem routedItem)
        {
            var taskInfo = $"task: {routedItem.TaskID}";

            //get destRules that match this connection and
            var destRulesToProcess = Item.destRules.FindAll(e => e.fromConnectionName == routedItem.fromConnection);

            //loop the rules
            foreach (var destRule in destRulesToProcess)
            {
                //run the scripts for this rule
                foreach (var scriptname in destRule.preProcessToConnectionScriptNames)
                {
                    if (scriptname.Equals("ruleTags"))
                    {
                        //run the scripts for the rule tags
                        foreach (var ruleTag in destRule.ruleTags)
                        {
                            var tagscript = Item.scripts.Find(e => e.name == ruleTag.scriptName);
                            routedItem.ruleDicomTag = ruleTag;
                            _logger.Log(LogLevel.Debug, $"{taskInfo} running tag script {tagscript.name}");

                            await _scriptService.RunAsync(tagscript, routedItem);
                        }
                    }
                    else
                    {
                        var script = Item.scripts.Find(e => e.name == scriptname);
                        _logger.Log(LogLevel.Debug, $"{taskInfo} running tag script {script.name}");
                        //await script.RunAsync(routedItem);
                        await _scriptService.RunAsync(script, routedItem);
                    }
                }
            }
        }
コード例 #3
0
        private void CGetResponse(DicomCGetRequest request, DicomCGetResponse response)
        {
            RoutedItem ri = (RoutedItem)request.UserState;

            var taskInfo = $"id: {ri.id} messageID: {request.MessageID} connection: {Connection.name}";

            _logger.Log(LogLevel.Debug, $"{taskInfo} response: {response.Status}");

            try
            {
                //if(response.Status.ToString().Equals("Success") || response.Status.ToString().Equals("Pending")){

                if (response.HasDataset)
                {
                    foreach (var data in response.Dataset)
                    {
                        _logger.Log(LogLevel.Debug, $"{taskInfo} response.dataset.tag: {data}  ");
                    }
                    _logger.Log(LogLevel.Debug, $"{taskInfo} StudyID: {response.Dataset.GetValue<string>(DicomTag.StudyID, 0)} ");
                    _logger.Log(LogLevel.Debug, $"{taskInfo} StudyInstanceUID: {response.Dataset.GetValue<string>(DicomTag.StudyInstanceUID, 0)} ");
                    _logger.Log(LogLevel.Debug, $"{taskInfo} SOPInstanceUID: {response.Dataset.GetValue<string>(DicomTag.SOPInstanceUID, 0)} ");
                    _logger.Log(LogLevel.Debug, $"{taskInfo} QueryRetrieveLevel: {response.Dataset.GetValue<string>(DicomTag.QueryRetrieveLevel, 0)} ");
                    _logger.Log(LogLevel.Debug, $"{taskInfo} PatientName: {response.Dataset.GetValue<string>(DicomTag.PatientName, 0)} ");
                    _logger.Log(LogLevel.Debug, $"{taskInfo} PatientBirthDate: {response.Dataset.GetValue<string>(DicomTag.PatientBirthDate, 0)} ");
                    _logger.Log(LogLevel.Debug, $"{taskInfo} StudyDate: {response.Dataset.GetValue<string>(DicomTag.StudyDate, 0)} ");
                }
            }
            catch (Exception e)
            {
                _logger.LogFullException(e, taskInfo);
            }
        }
コード例 #4
0
        public RoutedItem LoadFromFile(string file)
        {
            //deserialize
            //JsonSerializerSettings settings = new JsonSerializerSettings
            //{
            //    TypeNameHandling = TypeNameHandling.Objects
            //};

            string json = File.ReadAllText(file);

            if (string.IsNullOrEmpty(json))
            {
                _logger.Log(LogLevel.Error, $"{file} is null or blank.");
                return(null);
            }

            try
            {
                RoutedItem st = JsonSerializer.Deserialize <RoutedItem>(json);
                return(st);
            }
            catch (System.Text.Json.JsonException)
            {
                return(null);
            }
        }
コード例 #5
0
        public RoutedItem Dicomize(RoutedItem ri)
        {
            var routedItem = (RoutedItemEx)ri;

            try
            {
                _logger.Log(LogLevel.Information, $"Attempting to DICOMIZE {routedItem.sourceFileName}");
                DicomDataset data = new DicomDataset();
                data.AddOrUpdate(DicomTag.PatientID, routedItem.PatientID);
                data.AddOrUpdate(DicomTag.StudyInstanceUID, routedItem.Study);
                data.AddOrUpdate(DicomTag.AccessionNumber, routedItem.AccessionNumber);
                data.AddOrUpdate(DicomTag.SeriesInstanceUID, routedItem.AccessionNumber);
                data.AddOrUpdate(DicomTag.SOPInstanceUID, routedItem.Sop);
                data.AddOrUpdate(DicomTag.IssuerOfPatientID, routedItem.PatientIDIssuer);
                data.Add(DicomTag.SOPClassUID, DicomUID.EncapsulatedPDFStorage);
                byte[] fileData = _util.ReadBytesFromFile(routedItem.sourceFileName);
                if (fileData.Length > 0)
                {
                    data.Add(DicomTag.EncapsulatedDocument, fileData);

                    routedItem.sourceDicomFile = new DicomFile(data);
                    routedItem.sourceDicomFile.Save(routedItem.sourceFileName);
                }
            }
            catch (Exception e)
            {
                _logger.Log(LogLevel.Critical, $"{routedItem.sourceFileName} cannot be DICOMIZED {e.Message} {e.StackTrace}");
            }

            return(routedItem);
        }
コード例 #6
0
        public override RoutedItem Route(RoutedItem routedItem, bool copy = false)
        {
            try
            {
                var taskInfo = $"task: {routedItem.TaskID} connection: {Connection.name}:";

                //check if dicom, if not dicomize since dicom only does dicom, duh.
                if (routedItem.sourceFileName != null)
                {
                    if (!_dicomUtil.IsDICOM(routedItem))
                    {
                        routedItem = _dicomUtil.Dicomize(routedItem);
                    }
                }
                //enqueue the routedItem

                _routedItemManager.Init(routedItem);
                _routedItemManager.Enqueue(Connection, Connection.toDicom, nameof(Connection.toDicom), copy: copy);
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);

                //throw e;
                throw;
            }

            return(routedItem);
        }
コード例 #7
0
        private async Task ScanImpl(Profile profile, DcmtkConnection Connection, int taskID)
        {
            var taskInfo = $"task: {taskID} connection: {Connection.name}";

            try
            {
                var dir = profile.tempPath + Path.DirectorySeparatorChar + Connection.name + Path.DirectorySeparatorChar + "toScanner";
                Directory.CreateDirectory(dir);
                var fileEntries = _util.DirSearch(dir, "*");
                //var dd = new DuplicatesDetection();
                if (profile.duplicatesDetectionUpload)
                {
                    _logger.Log(LogLevel.Information,
                                $"{taskInfo} toCloud: {(fileEntries == null ? 0 : fileEntries.Count)} files to be send to cloud (before duplicates elimination).");
                }
                else
                {
                    _logger.Log(LogLevel.Information,
                                $"{taskInfo} toCloud: {(fileEntries == null ? 0 : fileEntries.Count)} files to be send to cloud.");
                }

                foreach (string file in fileEntries)
                {
                    if (_taskManager.cts.IsCancellationRequested)
                    {
                        break;
                    }

                    _logger.Log(LogLevel.Debug, $"{taskInfo} Found {file}");
                    RoutedItem routedItem = new RoutedItem(fromConnection: Connection.name, sourceFileName: file, taskID: taskID)
                    {
                        type = RoutedItem.Type.DICOM
                    };

                    routedItem = await _dcmDumpService.DcmDump(taskID, routedItem, Connection);

                    try
                    {
                        _routedItemManager.Init(routedItem);
                        _routedItemManager.Enqueue(Connection, Connection.toRules, nameof(Connection.toRules));
                    }
                    catch (Exception e)
                    {
                        _logger.LogFullException(e);
                    }
                }
            }
            catch (TaskCanceledException)
            {
                _logger.Log(LogLevel.Information, $"Task was canceled.");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
            finally
            {
                _taskManager.Stop($"{Connection.name}.Scanner");
            }
        }
コード例 #8
0
        public void RemoveCachedItem(RoutedItem routedItem)
        {
            using var scope = ServiceActivator.GetScope();
            var cacheService = scope.ServiceProvider.GetRequiredService <IConnectionCacheResponseService>();

            cacheService.RemoveCachedItem(Connection, routedItem, cache);
        }
コード例 #9
0
        /// <summary>
        /// Push a file to DICOM.
        /// </summary>
        /// <param name="routedItem"></param>
        /// <param name="taskID"></param>
        /// <param name="connection"></param>
        public void CStore(RoutedItem routedItem, long taskID, DICOMConnection connection)
        {
            Connection = connection;
            var taskInfo = $"task: {taskID} connection: {Connection.name}";

            try
            {
                try
                {
                    if (File.Exists(routedItem.sourceFileName))
                    {
                        var cStoreRequest = new DicomCStoreRequest(routedItem.sourceFileName);
                        routedItem.MessageId    = cStoreRequest.MessageID;
                        cStoreRequest.UserState = routedItem;
                        _logger.Log(LogLevel.Debug, $"{taskInfo} Request id: {routedItem.id} {cStoreRequest.MessageID}, {routedItem.sourceFileName} {routedItem.fileIndex}/{routedItem.fileCount} attempt: {routedItem.attempts}");

                        cStoreRequest.OnResponseReceived = (DicomCStoreRequest request, DicomCStoreResponse response) =>
                        {
                            var ri = (RoutedItem)request.UserState;
                            _logger.Log(LogLevel.Information, $"{taskInfo} Request id: {ri.id} {response.RequestMessageID} status: {response.Status.Code} description: {response.Status.Description} comment: {response.Status.ErrorComment} state: {response.Status.State}");

                            _routedItemManager.Init(ri);
                            //2018-08-01 shb BOUR-559 handle and log failure conditions
                            if (response.Status == DicomStatus.Success)
                            {
                                _routedItemManager.Dequeue(Connection, Connection.toDicom, nameof(Connection.toDicom), error: false);
                            }
                            else
                            {
                                _routedItemManager.Dequeue(Connection, Connection.toDicom, nameof(Connection.toDicom), error: true);
                            }

                            OnCStoreRequestComplete(request, response);
                        };

                        dicomClient.AddRequest(cStoreRequest);
                    }
                    else
                    {
                        _logger.Log(LogLevel.Information, $"{taskInfo} File does not exist: {routedItem.sourceFileName}");
                        _routedItemManager.Init(routedItem);
                        _routedItemManager.Dequeue(Connection, Connection.toDicom, nameof(Connection.toDicom), error: true);
                    }
                }
                catch (DicomDataException e)
                {
                    _logger.Log(LogLevel.Warning, $"{taskInfo} {routedItem.sourceFileName} {e.Message} {e.StackTrace} ");

                    // !e.GetType().IsAssignableFrom(typeof(DicomFileException)))

                    _routedItemManager.Init(routedItem);
                    _routedItemManager.Dequeue(Connection, Connection.toDicom, nameof(Connection.toDicom), error: true);
                }
            }
            catch (Exception e)
            {
                _logger.LogFullException(e, taskInfo);
            }
        }
コード例 #10
0
        public void DisengageWaitConditions(RoutedItem rr)
        {
            RoutedItemEx routedItem = (RoutedItemEx)rr;
            var          taskInfo   = $"task: {routedItem.TaskID}";

            if (routedItem.sourceDicomFile != null)
            {
                DicomDataset dataSet = routedItem.sourceDicomFile.Dataset;

                //Disengage: Waits get engaged when DICOM Priority Tag detected, and get disengaged when done
                ushort priority = 3;
                string uuid     = null;
                try
                {
                    if (dataSet.Contains(DicomTag.StudyInstanceUID))
                    {
                        uuid = dataSet.GetValue <string>(DicomTag.StudyInstanceUID, 0);
                    }
                }
                catch (DicomDataException e)
                {
                    _logger.Log(LogLevel.Debug, $"{taskInfo} {uuid} has no StudyInstanceUID field. {e.Message} {e.StackTrace}");
                }

                try
                {
                    if (dataSet.Contains(DicomTag.Priority))
                    {
                        priority = dataSet.GetValue <ushort>(DicomTag.Priority, 0);
                    }
                    else
                    {
                        _logger.Log(LogLevel.Debug, $"{taskInfo} {uuid} has no priority field.");
                    }
                }
                catch (DicomDataException e)
                {
                    _logger.Log(LogLevel.Debug, $"{taskInfo} {uuid} has no priority field. {e.Message} {e.StackTrace}");
                }

                if (priority < 3)
                {
                    if (dataSet.Contains(DicomTag.Priority))
                    {
                        if (dataSet.GetValue <ushort>(DicomTag.Priority, 0) == 0x01)
                        {
                            _logger.Log(LogLevel.Information, $"{taskInfo} {uuid} with high priority completed.  Clearing highWait flag.");
                            _profileStorage.Current.highWait = false;
                        }

                        if (dataSet.GetValue <ushort>(DicomTag.Priority, 0) == 0x00)
                        {
                            _logger.Log(LogLevel.Information, $"{taskInfo} {uuid} with medium priority completed.  Clearing mediumWait flag.");
                            _profileStorage.Current.mediumWait = false;
                        }
                    }
                }
            }
        }
コード例 #11
0
 /// <summary>
 ///  result cache where we consolidate multiple routed items based on the same id.The result is added onto the id: key
 ///  which usually arrives in chronological order(Pending, Pending, Success) though not required
 /// </summary>
 /// <param name="routedItem"></param>
 /// <returns></returns>
 public RoutedItem CacheResponse(RoutedItem routedItem)
 {
     using (var scope = ServiceActivator.GetScope())
     {
         var cacheService = scope.ServiceProvider.GetRequiredService <IConnectionCacheResponseService>();
         return(cacheService.CacheResponse(Connection, routedItem, cache));
     }
 }
コード例 #12
0
        public override RoutedItem Route(RoutedItem routedItem, bool copy = false)
        {
            var taskInfo = $"task: {routedItem.TaskID} connection: {Connection.name} type: {routedItem.type} id: {routedItem.id}";

            try
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo}");

                if (routedItem.type == RoutedItem.Type.DICOM && routedItem.sourceFileName == null)
                {
                    _logger.Log(LogLevel.Critical,
                                $"{taskInfo} RoutedItem.Type.DICOM requires routedItem.sourceFileName, will not route this request");
                    return(null);
                }

                if (routedItem.type != RoutedItem.Type.COMPLETION)
                {
                    //populate the response cache
                    routedItem = CacheResponse(routedItem);
                }

                if (routedItem.type == RoutedItem.Type.RPC || routedItem.type == RoutedItem.Type.COMPLETION)
                {
                    if (routedItem.status == RoutedItem.Status.COMPLETED ||
                        routedItem.status == RoutedItem.Status.FAILED)
                    {
                        _logger.Log(LogLevel.Debug, $"{taskInfo} Enqueuing Completed response");
                        _routedItemManager.Init(routedItem);
                        _routedItemManager.Enqueue(this.Connection, Connection.toCloud, nameof(Connection.toCloud));
                    }
                    else if (Connection.sendIntermediateResults)
                    {
                        _logger.Log(LogLevel.Debug, $"{taskInfo} Enqueuing Intermediate response");
                        _routedItemManager.Init(routedItem);
                        _routedItemManager.Enqueue(this.Connection, Connection.toCloud, nameof(Connection.toCloud));
                    }
                }
                else
                {
                    _logger.Log(LogLevel.Debug, $"{taskInfo} Enqueuing");

                    _routedItemManager.Init(routedItem);
                    _routedItemManager.Enqueue(this.Connection, Connection.toCloud, nameof(Connection.toCloud), copy: copy);
                }
            }
            catch (Exception e)
            {
                _logger.LogFullException(e, taskInfo);

                //throw e;
                throw;
            }

            return(routedItem);
        }
コード例 #13
0
        private async Task ProcessItem(int taskID, RoutedItem routedItem, LITEConnection connection, IHttpManager httpManager)
        {
            var taskInfo = $"task: {taskID} connection: {Connection.name}";

            if (routedItem.lastAttempt == null || routedItem.lastAttempt >= DateTime.Now.AddMinutes(-connection.retryDelayMinutes)) //not attempted lately
            {
                await Task.CompletedTask;
                return;
            }

            routedItem.attempts++;
            if (routedItem.attempts > 1)
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo} {routedItem.sourceFileName} second attempt.");
            }
            routedItem.lastAttempt = DateTime.Now;

            if (routedItem.attempts > connection.maxAttempts)
            {
                _logger.Log(LogLevel.Warning, $"Resource {routedItem.resource} exceeded max attempts.  Deleting item.");

                if (await _deleteEGSResourceService.DeleteEGSResource(taskID, routedItem, connection, httpManager))
                {
                    _routedItemManager.Init(routedItem);
                    _routedItemManager.Dequeue(connection, connection.fromEGS, nameof(connection.fromEGS), error: false);
                }
                else
                {
                    routedItem.Error = "Exceeded maxAttempts";
                    _routedItemManager.Init(routedItem);
                    _routedItemManager.Dequeue(connection, connection.fromEGS, nameof(connection.fromEGS), error: true);
                }
            }

            switch (Connection.protocol)
            {
            case Protocol.Http:
                //  while (!LITETask.CanStart($"{name}.DownloadViaHttp"))
                //  {
                //      await Task.Delay(LITE.profile.taskDelay).ConfigureAwait(false);
                //  }
                var  newTaskID = _taskManager.NewTaskID();
                Task task      = new Task(new Action(async() => await _downloadViaHttpService.DownloadViaHttp(newTaskID, routedItem, connection, httpManager)), _taskManager.cts.Token);
                await _taskManager.Start(newTaskID, task, $"{Connection.name}.DownloadViaHttp", routedItem.resource, isLongRunning : false).ConfigureAwait(false);

                //await DownloadViaHttp(newTaskID, ri).ConfigureAwait(false);
                break;
                // case Protocol.UDT:
                //     await DownloadViaUDTShell(remoteHostname, remotePort, $"{routedItem.box + "/" + routedItem.resource}", LITE.profile.tempPath + Path.DirectorySeparatorChar + "toScanner", taskID);
                //     break;
            }
        }
コード例 #14
0
        public string GetCachedItemMetaData(LifeImageCloudConnection Connection, RoutedItem routedItem, long taskID)
        {
            Throw.IfNull(Connection);

            var        taskInfo   = $"conn: {Connection.name} taskID: {taskID}";
            RootObject rootObject = new RootObject
            {
                ImagingStudy = new List <ImagingStudy>()
            };

            ImagingStudy study = new ImagingStudy
            {
                accession = new Accession(),
                patient   = new Patient(),
                series    = new List <Series>()
            };

            var cacheItem = LifeImageCloudConnection.cache[routedItem.id].ToList();

            var query = cacheItem
                        .GroupBy(item => new { item.Study, item.Series, item.PatientID, item.AccessionNumber })
                        .Select(grp => new
            {
                Study     = grp.Key.Study,
                Series    = grp.Key.Series,
                PatientID = grp.Key.PatientID,
                Accession = grp.Key.AccessionNumber,
                Instances = grp.Count()
            });

            foreach (var result in query)
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo} Study:{result.Study} Series:{result.Series} PatientID:{result.PatientID} Accession:{result.Accession} Instances:{result.Instances}");
                var series = new Series
                {
                    number = result.Instances,
                    uid    = result.Series
                };
                study.series.Add(series);
            }

            study.numberOfInstances = query.Sum(x => x.Instances);
            study.numberOfSeries    = query.Count();
            rootObject.ImagingStudy.Add(study);

            var json = JsonSerializer.Serialize(rootObject);

            _logger.Log(LogLevel.Debug, $"{taskInfo} Json:{json}");

            return(json);
        }
コード例 #15
0
        /// <summary>
        /// Look up translation for specified tag, write translationhistory record and replace tag contents.
        /// </summary>
        /// <param name="Item"></param>
        /// <param name="params"></param>
        public void Translate(RoutedItem Item, TranslateServiceParams @params)
        {
            Throw.IfNull(@params);
            Throw.IfNull(@params);

            try
            {
                TranslateImpl(Item, @params);
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
        }
コード例 #16
0
        private async Task ProcessDestRule(Rules Item, RoutedItem routedItem, DestRule destRule, string taskInfo)
        {
            Throw.IfNull(destRule);

            _logger.Log(LogLevel.Debug, $"{taskInfo} rule {destRule.name}");

            //run the scripts for this rule
            foreach (var scriptname in destRule.preProcessFromConnectionScriptNames)
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo} script {scriptname}");

                await ProcessScripts(scriptname, Item.scripts, routedItem, destRule);
            }
        }
        /// <summary>
        /// RunPostProcessToConnectionScripts is intended to be run once for each toConnection after outbound processing.
        /// </summary>
        /// <param name="Item"></param>
        /// <param name="routedItem"></param>
        /// <returns></returns>
        public async Task RunPostProcessToConnectionScripts(Rules Item, RoutedItem routedItem)
        {
            Throw.IfNull(Item);
            Throw.IfNull(routedItem);

            var taskInfo = $"task: {routedItem.TaskID}";

            try
            {
                //get destRules that match this connection and
                var destRulesToProcess = Item.destRules.FindAll(e => e.fromConnectionName == routedItem.fromConnection);

                //loop the rules
                foreach (var destRule in destRulesToProcess)
                {
                    //run the scripts for this rule
                    foreach (var scriptname in destRule.postProcessToConnectionScriptNames)
                    {
                        if (scriptname.Equals("ruleTags"))
                        {
                            //run the scripts for the rule tags
                            foreach (var ruleTag in destRule.ruleTags)
                            {
                                var tagscript = Item.scripts.Find(e => e.name == ruleTag.scriptName);
                                routedItem.ruleDicomTag = ruleTag;
                                _logger.Log(LogLevel.Debug, $"{taskInfo} running tag script {tagscript.name}");
                                //await tagscript.RunAsync(routedItem);
                                await _scriptService.RunAsync(tagscript, routedItem);
                            }
                        }
                        else
                        {
                            var script = Item.scripts.Find(e => e.name == scriptname);
                            _logger.Log(LogLevel.Debug, $"{taskInfo} running script {script.name}");
                            //await script.RunAsync(routedItem);
                            await _scriptService.RunAsync(script, routedItem);
                        }
                    }
                }
            }
            catch (TaskCanceledException)
            {
                _logger.Log(LogLevel.Information, $"Task was canceled.");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
        }
コード例 #18
0
        private async Task RunImpl(Rules Item, RoutedItem routedItem, string taskInfo)
        {
            //get destRules that match this connection and
            var destRulesToProcess = Item.destRules.FindAll(e => e.fromConnectionName == routedItem.fromConnection);

            _logger.Log(LogLevel.Debug, $"{taskInfo} found {destRulesToProcess.Count} rules");

            //loop the rules
            foreach (DestRule destRule in destRulesToProcess)
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo} rule {destRule.name}");

                await ProcessDestRule(Item, routedItem, destRule, taskInfo);
            }
        }
コード例 #19
0
        public async Task <ActionResult <FilesModel> > GetFiles(string box)
        {
            FilesModel files = new FilesModel();

            try
            {
                var profile    = _profileStorage.Current;
                var connection = _connectionFinder.GetPrimaryLITEConnection(profile);
                var path       = connection.resourcePath + Path.DirectorySeparatorChar + connection.name + Path.DirectorySeparatorChar + box;
                Directory.CreateDirectory(path);
                var temp = Directory.GetFiles(path);

                foreach (var file in temp)
                {
                    if (file != ".DS_Store" && !file.EndsWith(".tmp"))
                    {
                        try
                        {
                            var        info = new FileInfo(file);
                            RoutedItem ri   = new RoutedItem
                            {
                                type              = RoutedItem.Type.FILE,
                                name              = file.Replace(connection.resourcePath + Path.DirectorySeparatorChar + connection.name + Path.DirectorySeparatorChar + box + Path.DirectorySeparatorChar, ""),
                                resource          = file.Replace(connection.resourcePath + Path.DirectorySeparatorChar + connection.name + Path.DirectorySeparatorChar + box + Path.DirectorySeparatorChar, ""),
                                box               = box,
                                creationTimeUtc   = info.CreationTimeUtc,
                                lastWriteTimeUtc  = info.LastWriteTimeUtc,
                                lastAccessTimeUtc = info.LastAccessTimeUtc,
                                length            = info.Length
                            };

                            files.files.Add(ri);
                            if (files.files.Count >= 1000)
                            {  //limit rows returned
                                break;
                            }
                        }
                        catch (FileNotFoundException) { }
                    }
                }
            }
            catch (DirectoryNotFoundException)
            {
            }

            return(files);
        }
コード例 #20
0
        // Incoming file, store
        public override RoutedItem Route(RoutedItem routedItem, bool copy = false)
        {
            var taskInfo = $"task: {routedItem.TaskID} connection: {Connection.name}";

            //enqueue the routedItem, we don't support Q/R at this stage of dev
            if (routedItem.sourceFileName != null)
            {
                DirectoryInfo mydir;

                mydir = Directory.CreateDirectory(PathFormatter(routedItem));

                _logger.Log(LogLevel.Debug,
                            $"{taskInfo} Creating File: {Connection.inpath}/{routedItem.sourceFileName.Replace(":", "-")}");

                try
                {
                    routedItem.destFileName = mydir.FullName + Path.DirectorySeparatorChar + routedItem.sourceFileName
                                              .Substring(routedItem.sourceFileName.LastIndexOf(
                                                             Path.DirectorySeparatorChar) + 1).Replace(":", "-");
                    bool result = true;
                    if (_profileStorage.Current.duplicatesDetectionUpload && routedItem.type == RoutedItem.Type.DICOM)
                    {
                        var dd = _duplicatesDetectionService;
                        dd.DuplicatesPurge();
                        lock (routedItem)
                        {
                            if (!dd.DuplicatesReference(routedItem.fromConnection + "_FileConnection",
                                                        routedItem.sourceFileName))
                            {
                                result = false;
                            }
                        }
                    }

                    if (result)
                    {
                        File.Copy(routedItem.sourceFileName, routedItem.destFileName, true);
                    }
                }
                catch (Exception e)
                {
                    _logger.LogFullException(e, taskInfo);
                }
            }

            return(routedItem);
        }
コード例 #21
0
#pragma warning disable 1998
        public override RoutedItem Route(RoutedItem routedItem, bool copy = false)
        {
            //enqueue the routedItem, we don't support Q/R at this stage of dev
            if (routedItem.sourceFileName != null)
            {
                //check if dicom, if not dicomize since dicom only does dicom, duh.
                if (!_dicomUtil.IsDICOM(routedItem))
                {
                    routedItem = _dicomUtil.Dicomize(routedItem);
                }
            }

            _routedItemManager.Init(routedItem);
            _routedItemManager.Enqueue(Connection, Connection.toDicom, nameof(Connection.toDicom), copy: copy);

            return(routedItem);
        }
コード例 #22
0
        public void RemoveCachedItem(Connection Connection, RoutedItem routedItem, Dictionary <string, List <RoutedItem> > cache)
        {
            Throw.IfNull(Connection);
            Throw.IfNull(cache);

            try
            {
                _routedItemManager.Init(routedItem);
                _routedItemManager.DequeueCache(Connection, cache, nameof(cache), error: false);

                _logger.Log(LogLevel.Debug, $"{routedItem.id} removed from cache");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
        }
コード例 #23
0
        /// <summary>
        /// RunPreProcessToConnectionScripts is intended to be run once for the stream before outbound processing
        /// </summary>
        /// <param name="Item"></param>
        /// <param name="routedItem"></param>
        /// <returns></returns>
        public async Task RunPreProcessToConnectionScripts(Rules Item, RoutedItem routedItem)
        {
            Throw.IfNull(Item);
            Throw.IfNull(routedItem);

            try
            {
                await RunImpl(Item, routedItem);
            }
            catch (TaskCanceledException)
            {
                _logger.Log(LogLevel.Information, $"Task was canceled.");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);
            }
        }
コード例 #24
0
        public bool IsDICOM(RoutedItem routedItem)
        {
            FileStream stream = null;

            try
            {
                if (File.Exists(routedItem.sourceFileName))
                {
                    //check if dicom per spec directly
                    stream = File.OpenRead(routedItem.sourceFileName);
                    byte[] bytes = new byte[132];
                    //stream.Seek(128, SeekOrigin.Begin);
                    var    count       = stream.Read(bytes, 0, 132);
                    string dicomPrefix = Encoding.ASCII.GetString(bytes);
                    if (dicomPrefix.EndsWith("DICM"))
                    {
                        _logger.Log(LogLevel.Debug, $"{routedItem.sourceFileName} is DICOM");
                        return(true);
                    }
                    else
                    {
                        _logger.Log(LogLevel.Information, $"{routedItem.sourceFileName} is not DICOM");
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception)
            {
                return(false);
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
            }
        }
コード例 #25
0
        public override RoutedItem Route(RoutedItem routedItem, bool copy = false)
        {
            var taskInfo = $"task: {routedItem.TaskID} connection: {Connection.name}";

            try
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo} Route item");

                if (routedItem.type == RoutedItem.Type.RPC)
                {
                    //populate the response cache and then send the response cache
                    routedItem = CacheResponse(routedItem);

                    if (routedItem.status == RoutedItem.Status.COMPLETED || routedItem.status == RoutedItem.Status.FAILED)
                    {
                        _logger.Log(LogLevel.Information, "Enqueuing item:", routedItem.name);
                        _routedItemManager.Init(routedItem);
                        _routedItemManager.Enqueue(Connection, Connection.ToHL7, nameof(Connection.ToHL7));
                    }
                    else if (Connection.sendIntermediateResults)
                    {
                        _routedItemManager.Init(routedItem);
                        _routedItemManager.Enqueue(Connection, Connection.ToHL7, nameof(Connection.ToHL7));
                    }
                }
                else
                {
                    _routedItemManager.Init(routedItem);
                    _routedItemManager.Enqueue(Connection, Connection.ToHL7, nameof(Connection.ToHL7), copy: copy);
                }
            }
            catch (Exception e)
            {
                _logger.LogFullException(e, taskInfo);
                //throw e;
                throw;
            }

            return(routedItem);
        }
コード例 #26
0
        /// <summary>
        /// Determines whether all tags specified in the rule are satisfied in the dataSet. If a tagValue can be anything but must be present, use "+." regex
        /// </summary>
        /// <param name="rule"></param>
        /// <param name="rr"></param>
        /// <returns></returns>
        public RoutedItem DoTagsMatch(DestRule rule, RoutedItem rr)
        {
            RoutedItemEx ri = (RoutedItemEx)rr;

            //dicom tag matching

            RoutedItemEx result = DicomMatching(ri, rule);

            if (result != null)
            {
                return(result);
            }

            result = Hl7Matching(ri, rule);
            if (result != null)
            {
                return(result);
            }

            ri.RuleMatch = true;
            return(ri);
        }
コード例 #27
0
        public async Task <ScriptState> RunAsync(Core.Models.Script item, RoutedItem routedItem)
        {
            Throw.IfNull(item);

            ScriptState scriptState = null;

            try
            {
                if (item.script == null)
                {
                    Compile(item);
                }
                scriptState = await item.script.RunAsync(globals : routedItem);

                item.errors = $"No Errors.  Last executed at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff")}";
            }
            catch (TaskCanceledException)
            {
                _logger.Log(LogLevel.Information, $"Task was canceled.");
            }
            catch (Exception e)
            {
                _logger.LogFullException(e);

                item.errors = $"{e.Message} {e.StackTrace}";
                int i             = 1;
                int j             = 0;
                var lines         = item.script.Code.Split("\n");
                var formattedCode = "";
                foreach (var line in lines)
                {
                    formattedCode += $"[{i++},{j}] " + line.Replace("\n", "").Trim() + (line == "" ? "" : "\n");
                    j             += line.Length + 1;
                }
                _logger.Log(LogLevel.Critical, $"code: \n{formattedCode}");
            }
            return(scriptState);
        }
コード例 #28
0
        private async Task ProcessScriptFromTag(Tag ruleTag, RoutedItem routedItem, List <Script> scripts)
        {
            Throw.IfNull(ruleTag);
            Throw.IfNull(scripts);
            Throw.IfNull(routedItem);

            var taskInfo = GetTaskInfo(routedItem);

            var tagscript = scripts.Find(e => e.name == ruleTag.scriptName);

            routedItem.ruleDicomTag = ruleTag;
            _logger.Log(LogLevel.Debug, $"{taskInfo} running rule tag: {ruleTag.tagName} tag script: {ruleTag.scriptName}");
            if (tagscript != null)
            {
                await _scriptService.RunAsync(tagscript, routedItem);

                //await tagscript.RunAsync(routedItem);
            }
            else
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo} script: {ruleTag.scriptName} not found!");
            }
        }
コード例 #29
0
        private async Task ProcessScripts(string scriptname, List <Script> scripts, RoutedItem routedItem, DestRule destRule)
        {
            Throw.IfNull(destRule);

            var taskInfo = GetTaskInfo(routedItem);

            _logger.Log(LogLevel.Debug, $"{taskInfo} script {scriptname}");

            if (!scriptname.Equals("ruleTags"))
            {
                var script = scripts.Find(e => e.name == scriptname);
                _logger.Log(LogLevel.Debug, $"{taskInfo} running script {script.name}");
                await _scriptService.RunAsync(script, routedItem);

                return;
            }

            //run the scripts for the rule tags
            foreach (Tag ruleTag in destRule.ruleTags)
            {
                await ProcessScriptFromTag(ruleTag, routedItem, scripts);
            }
        }
コード例 #30
0
        // Note: cGet is not working at this point
        public void CGet(RoutedItem routedItem, int taskID, DICOMConnection connection)
        {
            Connection = connection;
            //process any outstanding moves and return the results

            var taskInfo = $"task: {taskID} connection: {Connection.name}";

            List <string> movesToRemove = new List <string>();

            try
            {
                _logger.Log(LogLevel.Debug, $"{taskInfo} dicom.AddRequest: {routedItem.id} ");
                try
                {
                    var request = new DicomCGetRequest(routedItem.request)
                    {
                        UserState = routedItem
                    };

                    request.OnResponseReceived += CGetResponse;
                    // Fix if cGet is ever fixed                        dicomClient.AddRequest(request);
                }
                catch (TaskCanceledException)
                {
                    _logger.Log(LogLevel.Information, $"Task was canceled.");
                }
                catch (DicomDataException e)
                {
                    _logger.Log(LogLevel.Warning, $"{taskInfo} move: {routedItem.id} {e.Message} {e.StackTrace}");
                }
            }
            catch (Exception e)
            {
                _logger.LogFullException(e, taskInfo);
            }
        }