コード例 #1
0
        /// <summary>
        /// Cleanup any failed items in the queue and delete the queue entry.
        /// </summary>
        public override void Delete()
        {
            using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex))
            {
                var broker    = context.GetWorkItemUidBroker();
                var uidBroker = context.GetWorkItemUidBroker();

                var list = broker.GetWorkItemUidsForWorkItem(Proxy.Item.Oid);
                foreach (WorkItemUid sop in list)
                {
                    uidBroker.Delete(sop);
                }
                context.Commit();
            }

            if (PublishFiles != null && (PublishFiles.DeletionBehaviour == DeletionBehaviour.DeleteAlways || PublishFiles.DeletionBehaviour == DeletionBehaviour.DeleteOnSuccess))
            {
                foreach (string file in PublishFiles.FilePaths)
                {
                    try
                    {
                        FileUtils.Delete(file);
                        DirectoryUtility.DeleteIfEmpty(Path.GetDirectoryName(file));
                    }
                    catch (Exception e)
                    {
                        Platform.Log(LogLevel.Warn, "Unable to delete temporary publish file {0}: {1}", file, e.Message);
                    }
                }
            }

            Proxy.Delete();
        }
コード例 #2
0
        protected override void OnExecute(CommandProcessor theProcessor)
        {
            var broker = DataAccessContext.GetWorkItemUidBroker();

            _uid          = broker.GetWorkItemUid(_uid.Oid);
            _uid.Complete = true;
        }
コード例 #3
0
        /// <summary>
        /// Routine for failing a work queue uid record.
        /// </summary>
        /// <param name="uid">The WorkItemUid entry to fail.</param>
        /// <param name="retry">A boolean value indicating whether a retry will be attempted later.</param>
        protected WorkItemUid FailWorkItemUid(WorkItemUid uid, bool retry)
        {
            using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex))
            {
                var broker = context.GetWorkItemUidBroker();
                var sop    = broker.GetWorkItemUid(uid.Oid);

                if (!sop.FailureCount.HasValue)
                {
                    sop.FailureCount = 1;
                }
                else
                {
                    sop.FailureCount = (byte)(sop.FailureCount.Value + 1);
                }

                if (sop.FailureCount > WorkItemServiceSettings.Default.RetryCount)
                {
                    sop.Failed = true;
                }

                context.Commit();
                return(sop);
            }
        }
コード例 #4
0
		public void TestAddAndGet()
		{
			DeleteAllWorkItemUids();

			long oid, workItemOid;
			string version;
			using (var context = new DataAccessContext())
			{
				WorkItem workItem;

				var workItemBroker = context.GetWorkItemBroker();
				workItemBroker.AddWorkItem(workItem = CreateWorkItem("A"));

				var workItemUid = CreateWorkItemUid(workItem, "ABCDEF", "2", "3", true, true, 123);
				var broker = context.GetWorkItemUidBroker();
				broker.AddWorkItemUid(workItemUid);

				context.Commit();

				workItemOid = workItem.Oid;
				Assert.AreNotEqual(0, oid = workItemUid.Oid, "Oid should have been assigned on insert");
				Assert.IsNotNull(workItemUid.Version, "Version should have been assigned on insert");

				version = workItemUid.Version.ToString();
			}

			using (var context = new DataAccessContext())
			{
				var broker = context.GetWorkItemUidBroker();

				var workItemUid = broker.GetWorkItemUid(oid);
				Assert.AreEqual("ABCDEF", workItemUid.File, "File");
				Assert.AreEqual("2", workItemUid.SeriesInstanceUid, "SeriesInstanceUid");
				Assert.AreEqual("3", workItemUid.SopInstanceUid, "SopInstanceUid");
				Assert.AreEqual(workItemOid, workItemUid.WorkItemOid, "WorkItemOid");
				Assert.AreEqual(true, workItemUid.Complete, "Complete");
				Assert.AreEqual(true, workItemUid.Failed, "Failed");
				Assert.AreEqual(123, workItemUid.FailureCount, "FailureCount");

				workItemUid.Failed = false;
				workItemUid.FailureCount = null;
				context.Commit();

				Assert.AreNotEqual(version, workItemUid.Version, "Version should have been changed on update");
			}

			using (var context = new DataAccessContext())
			{
				var broker = context.GetWorkItemUidBroker();

				var workItemUid = broker.GetWorkItemUid(oid);
				Assert.AreEqual("ABCDEF", workItemUid.File, "File");
				Assert.AreEqual("2", workItemUid.SeriesInstanceUid, "SeriesInstanceUid");
				Assert.AreEqual("3", workItemUid.SopInstanceUid, "SopInstanceUid");
				Assert.AreEqual(workItemOid, workItemUid.WorkItemOid, "WorkItemOid");
				Assert.AreEqual(true, workItemUid.Complete, "Complete");
				Assert.AreEqual(false, workItemUid.Failed, "Failed");
				Assert.AreEqual(null, workItemUid.FailureCount, "FailureCount");
			}
		}
コード例 #5
0
        /// <summary>
        /// Load the specific SOP Instance Uids in the database for the WorkQueue item.
        /// </summary>
        protected void LoadUids()
        {
            using (var context = new DataAccessContext())
            {
                var broker = context.GetWorkItemUidBroker();

                _uidList = broker.GetWorkItemUidsForWorkItem(Proxy.Item.Oid);
            }
        }
コード例 #6
0
        private static void DeleteAllWorkItemUids()
        {
            using (var context = new DataAccessContext())
            {
                var workItemUidBroker = context.GetWorkItemUidBroker();
                workItemUidBroker.DeleteAll();

                var workItemBroker = context.GetWorkItemBroker();
                workItemBroker.DeleteAll();

                context.Commit();
            }
        }
コード例 #7
0
        /// <summary>
        /// Complete a <see cref="WorkItem"/>.
        /// </summary>
        public void Complete()
        {
            using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex))
            {
                var broker = context.GetWorkItemBroker();

                Item = broker.GetWorkItem(Item.Oid);

                DateTime now = Platform.Time;

                // Since we're completing, no need for additional status, its done.
                Progress.StatusDetails = string.Empty;

                Item.Progress       = Progress;
                Item.ProcessTime    = now;
                Item.ExpirationTime = now;
                Item.DeleteTime     = now.AddMinutes(WorkItemServiceSettings.Default.DeleteDelayMinutes);
                Item.Status         = WorkItemStatusEnum.Complete;

                var uidBroker = context.GetWorkItemUidBroker();
                foreach (var entity in Item.WorkItemUids)
                {
                    uidBroker.Delete(entity);
                }

                context.Commit();
            }

            Publish(false);
            var studyRequest = Item.Request as WorkItemStudyRequest;

            if (studyRequest != null)
            {
                Platform.Log(LogLevel.Info, "Completing {0} WorkItem for OID {1}: {2}, {3}:{4}", Item.Type, Item.Oid,
                             Item.Request.ActivityDescription,
                             studyRequest.Patient.PatientsName, studyRequest.Patient.PatientId);
            }
            else
            {
                Platform.Log(LogLevel.Info, "Completing {0} WorkItem for OID {1}: {2}", Item.Type, Item.Oid,
                             Item.Request.ActivityDescription);
            }
        }
コード例 #8
0
        /// <summary>
        /// Cleanup any failed items in the queue and delete the queue entry.
        /// </summary>
        public override void Delete()
        {
            LoadUids();
            var studyXml = Location.LoadStudyXml();

            foreach (WorkItemUid sop in WorkQueueUidList)
            {
                var defaultFilePath = String.IsNullOrEmpty(sop.File);
                var file            = GetFilePath(sop);
                if (sop.Failed || !sop.Complete)
                {
                    if (!defaultFilePath)
                    {
                        try
                        {
                            FileUtils.Delete(file);
                        }
                        catch (Exception e)
                        {
                            Platform.Log(LogLevel.Error, e,
                                         "Unexpected exception attempting to cleanup file for Work Item {0}", Proxy.Item.Oid);
                        }
                    }
                    else
                    {
                        try
                        {
                            // Only delete the file if its not in the study Xml file.  This should handle collisions with
                            // multiple WorkItems that may have been canceled when others succeeded.
                            if (!studyXml.Contains(sop.SeriesInstanceUid, sop.SopInstanceUid))
                            {
                                FileUtils.Delete(file);
                            }
                        }
                        catch (Exception e)
                        {
                            Platform.Log(LogLevel.Error, e,
                                         "Unexpected exception attempting to cleanup file for Work Item {0}",
                                         Proxy.Item.Oid);
                        }
                    }
                }
            }

            try
            {
                DirectoryUtility.DeleteIfEmpty(Location.StudyFolder);
            }
            catch (Exception e)
            {
                Platform.Log(LogLevel.Error, e, "Unexpected exception attempting to delete folder: {0}",
                             Location.StudyFolder);
            }

            // Now cleanup the actual WorkItemUid references
            using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex))
            {
                var broker    = context.GetWorkItemUidBroker();
                var uidBroker = context.GetWorkItemUidBroker();

                var list = broker.GetWorkItemUidsForWorkItem(Proxy.Item.Oid);
                foreach (WorkItemUid sop in list)
                {
                    uidBroker.Delete(sop);
                }
                context.Commit();
            }

            Proxy.Delete();
        }
コード例 #9
0
		private static void DeleteAllWorkItemUids()
		{
			using (var context = new DataAccessContext())
			{
				var workItemUidBroker = context.GetWorkItemUidBroker();
				workItemUidBroker.DeleteAll();

				var workItemBroker = context.GetWorkItemBroker();
				workItemBroker.DeleteAll();

				context.Commit();
			}
		}
コード例 #10
0
		public void TestGetWorkItemUidsForWorkItem()
		{
			DeleteAllWorkItemUids();

			long workItemOidA, workItemOidB, workItemOidC, workItemOidD;
			using (var context = new DataAccessContext())
			{
				WorkItem workItemA, workItemB, workItemC, workItemD;
				var workItemBroker = context.GetWorkItemBroker();
				workItemBroker.AddWorkItem(workItemA = CreateWorkItem("A"));
				workItemBroker.AddWorkItem(workItemB = CreateWorkItem("B"));
				workItemBroker.AddWorkItem(workItemC = CreateWorkItem("C"));
				workItemBroker.AddWorkItem(workItemD = CreateWorkItem("D"));

				var broker = context.GetWorkItemUidBroker();
				broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file1", "series1", "sop1"));
				broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file4", "series2", "sop4"));
				broker.AddWorkItemUid(CreateWorkItemUid(workItemB, "file6", "series4", "sop6"));

				broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file3", "series2", "sop3"));
				broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file2", "series1", "sop2"));
				broker.AddWorkItemUid(CreateWorkItemUid(workItemB, "file5", "series3", "sop5"));

				context.Commit();

				workItemOidA = workItemA.Oid;
				workItemOidB = workItemB.Oid;
				workItemOidC = workItemC.Oid;
				workItemOidD = workItemD.Oid;
			}

			using (var context = new DataAccessContext())
			{
				var workItemBroker = context.GetWorkItemBroker();
				workItemBroker.Delete(workItemBroker.GetWorkItem(workItemOidD));
				context.Commit();
			}

			using (var context = new DataAccessContext())
			{
				var broker = context.GetWorkItemUidBroker();

				var listA = broker.GetWorkItemUidsForWorkItem(workItemOidA).OrderBy(x => x.File).ToList();
				var listB = broker.GetWorkItemUidsForWorkItem(workItemOidB).OrderBy(x => x.File).ToList();
				var listC = broker.GetWorkItemUidsForWorkItem(workItemOidC);
				var listD = broker.GetWorkItemUidsForWorkItem(workItemOidD);

				Assert.AreEqual(4, listA.Count, "Unexpected number of results for work item A");
				Assert.AreEqual("file1", listA[0].File, "Unexpected result for work item A");
				Assert.AreEqual("file2", listA[1].File, "Unexpected result for work item A");
				Assert.AreEqual("file3", listA[2].File, "Unexpected result for work item A");
				Assert.AreEqual("file4", listA[3].File, "Unexpected result for work item A");

				Assert.AreEqual(2, listB.Count, "Unexpected number of results for work item B");
				Assert.AreEqual("file5", listB[0].File, "Unexpected result for work item A");
				Assert.AreEqual("file6", listB[1].File, "Unexpected result for work item A");

				Assert.AreEqual(0, listC.Count, "Unexpected results for work item C");
				Assert.AreEqual(0, listD.Count, "Unexpected results for work item D");
			}
		}
コード例 #11
0
        protected override void OnExecute(CommandProcessor theProcessor)
        {
            var workItemBroker = DataAccessContext.GetWorkItemBroker();

            DateTime now = Platform.Time;

            if (WorkItem != null)
            {
                // Already have a committed WorkItem, just set the Oid
                WorkItemUid.WorkItemOid = WorkItem.Oid;

                WorkItem = workItemBroker.GetWorkItem(WorkItem.Oid);
                if (WorkItem.Status == WorkItemStatusEnum.Idle ||
                    WorkItem.Status == WorkItemStatusEnum.Pending ||
                    WorkItem.Status == WorkItemStatusEnum.InProgress)
                {
                    WorkItem.ExpirationTime = now.AddSeconds(ExpirationDelaySeconds);

                    var workItemUidBroker = DataAccessContext.GetWorkItemUidBroker();
                    workItemUidBroker.AddWorkItemUid(WorkItemUid);
                }
                else
                {
                    WorkItem = null;
                }
            }

            if (WorkItem == null)
            {
                var list = workItemBroker.GetWorkItems(_request.WorkItemType, WorkItemStatusFilter.Active, _studyInstanceUid);
                if (list != null)
                {
                    foreach (var item in list)
                    {
                        if (item.Request.GetType() == _request.GetType())
                        {
                            var thisRequest = _request as DicomReceiveRequest;
                            if (thisRequest != null)
                            {
                                var request = item.Request as DicomReceiveRequest;
                                if (request != null)
                                {
                                    if (request.SourceServerName.Equals(thisRequest.SourceServerName))
                                    {
                                        WorkItem = item;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                WorkItem = item;
                                break;
                            }
                        }
                    }
                }

                if (WorkItem == null)
                {
                    WorkItem = new WorkItem
                    {
                        ScheduledTime    = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds),
                        Request          = _request,
                        ProcessTime      = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds),
                        Priority         = _request.Priority,
                        Type             = _request.WorkItemType,
                        DeleteTime       = now.AddHours(2),
                        ExpirationTime   = now.AddSeconds(ExpirationDelaySeconds),
                        RequestedTime    = now,
                        StudyInstanceUid = _studyInstanceUid,
                        Status           = WorkItemStatusEnum.Pending,
                        Progress         = _progress
                    };

                    workItemBroker.AddWorkItem(WorkItem);
                    WorkItemUid.WorkItem = WorkItem;

                    var workItemUidBroker = DataAccessContext.GetWorkItemUidBroker();
                    workItemUidBroker.AddWorkItemUid(WorkItemUid);
                }
                else
                {
                    WorkItem.ExpirationTime = now.AddSeconds(ExpirationDelaySeconds);
                    WorkItemUid.WorkItemOid = WorkItem.Oid;
                    var workItemUidBroker = DataAccessContext.GetWorkItemUidBroker();
                    workItemUidBroker.AddWorkItemUid(WorkItemUid);
                }
            }
        }
コード例 #12
0
        public void TestAddAndGet()
        {
            DeleteAllWorkItemUids();

            long   oid, workItemOid;
            string version;

            using (var context = new DataAccessContext())
            {
                WorkItem workItem;

                var workItemBroker = context.GetWorkItemBroker();
                workItemBroker.AddWorkItem(workItem = CreateWorkItem("A"));

                var workItemUid = CreateWorkItemUid(workItem, "ABCDEF", "2", "3", true, true, 123);
                var broker      = context.GetWorkItemUidBroker();
                broker.AddWorkItemUid(workItemUid);

                context.Commit();

                workItemOid = workItem.Oid;
                Assert.AreNotEqual(0, oid = workItemUid.Oid, "Oid should have been assigned on insert");
                Assert.IsNotNull(workItemUid.Version, "Version should have been assigned on insert");

                version = workItemUid.Version.ToString();
            }

            using (var context = new DataAccessContext())
            {
                var broker = context.GetWorkItemUidBroker();

                var workItemUid = broker.GetWorkItemUid(oid);
                Assert.AreEqual("ABCDEF", workItemUid.File, "File");
                Assert.AreEqual("2", workItemUid.SeriesInstanceUid, "SeriesInstanceUid");
                Assert.AreEqual("3", workItemUid.SopInstanceUid, "SopInstanceUid");
                Assert.AreEqual(workItemOid, workItemUid.WorkItemOid, "WorkItemOid");
                Assert.AreEqual(true, workItemUid.Complete, "Complete");
                Assert.AreEqual(true, workItemUid.Failed, "Failed");
                Assert.AreEqual(123, workItemUid.FailureCount, "FailureCount");

                workItemUid.Failed       = false;
                workItemUid.FailureCount = null;
                context.Commit();

                Assert.AreNotEqual(version, workItemUid.Version, "Version should have been changed on update");
            }

            using (var context = new DataAccessContext())
            {
                var broker = context.GetWorkItemUidBroker();

                var workItemUid = broker.GetWorkItemUid(oid);
                Assert.AreEqual("ABCDEF", workItemUid.File, "File");
                Assert.AreEqual("2", workItemUid.SeriesInstanceUid, "SeriesInstanceUid");
                Assert.AreEqual("3", workItemUid.SopInstanceUid, "SopInstanceUid");
                Assert.AreEqual(workItemOid, workItemUid.WorkItemOid, "WorkItemOid");
                Assert.AreEqual(true, workItemUid.Complete, "Complete");
                Assert.AreEqual(false, workItemUid.Failed, "Failed");
                Assert.AreEqual(null, workItemUid.FailureCount, "FailureCount");
            }
        }
コード例 #13
0
        public void TestGetWorkItemUidsForWorkItem()
        {
            DeleteAllWorkItemUids();

            long workItemOidA, workItemOidB, workItemOidC, workItemOidD;

            using (var context = new DataAccessContext())
            {
                WorkItem workItemA, workItemB, workItemC, workItemD;
                var      workItemBroker = context.GetWorkItemBroker();
                workItemBroker.AddWorkItem(workItemA = CreateWorkItem("A"));
                workItemBroker.AddWorkItem(workItemB = CreateWorkItem("B"));
                workItemBroker.AddWorkItem(workItemC = CreateWorkItem("C"));
                workItemBroker.AddWorkItem(workItemD = CreateWorkItem("D"));

                var broker = context.GetWorkItemUidBroker();
                broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file1", "series1", "sop1"));
                broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file4", "series2", "sop4"));
                broker.AddWorkItemUid(CreateWorkItemUid(workItemB, "file6", "series4", "sop6"));

                broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file3", "series2", "sop3"));
                broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file2", "series1", "sop2"));
                broker.AddWorkItemUid(CreateWorkItemUid(workItemB, "file5", "series3", "sop5"));

                context.Commit();

                workItemOidA = workItemA.Oid;
                workItemOidB = workItemB.Oid;
                workItemOidC = workItemC.Oid;
                workItemOidD = workItemD.Oid;
            }

            using (var context = new DataAccessContext())
            {
                var workItemBroker = context.GetWorkItemBroker();
                workItemBroker.Delete(workItemBroker.GetWorkItem(workItemOidD));
                context.Commit();
            }

            using (var context = new DataAccessContext())
            {
                var broker = context.GetWorkItemUidBroker();

                var listA = broker.GetWorkItemUidsForWorkItem(workItemOidA).OrderBy(x => x.File).ToList();
                var listB = broker.GetWorkItemUidsForWorkItem(workItemOidB).OrderBy(x => x.File).ToList();
                var listC = broker.GetWorkItemUidsForWorkItem(workItemOidC);
                var listD = broker.GetWorkItemUidsForWorkItem(workItemOidD);

                Assert.AreEqual(4, listA.Count, "Unexpected number of results for work item A");
                Assert.AreEqual("file1", listA[0].File, "Unexpected result for work item A");
                Assert.AreEqual("file2", listA[1].File, "Unexpected result for work item A");
                Assert.AreEqual("file3", listA[2].File, "Unexpected result for work item A");
                Assert.AreEqual("file4", listA[3].File, "Unexpected result for work item A");

                Assert.AreEqual(2, listB.Count, "Unexpected number of results for work item B");
                Assert.AreEqual("file5", listB[0].File, "Unexpected result for work item A");
                Assert.AreEqual("file6", listB[1].File, "Unexpected result for work item A");

                Assert.AreEqual(0, listC.Count, "Unexpected results for work item C");
                Assert.AreEqual(0, listD.Count, "Unexpected results for work item D");
            }
        }