Example #1
0
			public SendOperationInfo(WorkItemData reference, ushort messageId, byte presentationId, ClearCanvas.Dicom.Network.DicomServer server)
			{
				PresentationId = presentationId;
				Server = server;
				WorkItemData = reference;
				MessageId = messageId;
			    SubOperations = 0;
			    Complete = false;
			    FailedSopInstanceUids = new List<string>();
			}
		public void Test_add_deleted_item()
		{
			var items = new ItemCollection<ActivityMonitorComponent.WorkItem>();

			Assert.AreEqual(0, items.Count);

			var data = new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Deleted};
			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {});
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison);

			Assert.AreEqual(0, items.Count);
		}
		public void Test_add_new_item_filtered()
		{
			var items = new ItemCollection<ActivityMonitorComponent.WorkItem>();

			Assert.AreEqual(0, items.Count);

			var data = new WorkItemData { Identifier = 1, Priority = WorkItemPriorityEnum.Stat };
			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NormalPriorityFilter, () => { });
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison);

			// item not added because of filter
			Assert.AreEqual(0, items.Count);
		}
		public void Test_add_new_item()
	    {
	    	var items = new ItemCollection<ActivityMonitorComponent.WorkItem>();

			Assert.AreEqual(0, items.Count);

	    	var data = new WorkItemData {Identifier = 1};
			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {});
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison);

			Assert.AreEqual(1, items.Count);
			Assert.IsTrue(items.Any(item => item.Id == 1));
	    }
Example #5
0
		private SendOperationInfo GetSendOperationInfo(WorkItemData reference)
		{
			lock (_syncLock)
			{
				return CollectionUtils.SelectFirst(_sendOperations,
				                                   info => info.WorkItemData.Identifier == reference.Identifier);
			}
		}
Example #6
0
        private void UpdateProgress(WorkItemData workItem)
        {
            try
            {
				SendOperationInfo sendOperationInfo = GetSendOperationInfo(workItem);
                if (sendOperationInfo == null)
                {
                    return;
                }

				sendOperationInfo.WorkItemData = workItem;

                var progress = GetProgressByMessageId(sendOperationInfo.MessageId);

                var msg = new DicomMessage();
                DicomStatus status;

				if (workItem.Status == WorkItemStatusEnum.Failed)
                {
                    sendOperationInfo.Complete = true;
                }
				else if (progress.RemainingSubOperations == 0 && workItem.Status != WorkItemStatusEnum.Pending)
                {
                    sendOperationInfo.Complete = true;
                }

                if (SendOperationsComplete(sendOperationInfo.MessageId))
                {
                    status = DicomStatuses.Success;

                    foreach (SendOperationInfo info in GetSendOperationInfo(sendOperationInfo.MessageId))
                    {
                        foreach (string sopInstanceUid in info.FailedSopInstanceUids)
                            msg.DataSet[DicomTags.FailedSopInstanceUidList].AppendString(sopInstanceUid);
						if (workItem.Status == WorkItemStatusEnum.Canceled)
                            status = DicomStatuses.Cancel;
						else if (workItem.Status == WorkItemStatusEnum.Failed)
                            status = DicomStatuses.QueryRetrieveUnableToProcess;
                        else if (progress.FailureSubOperations > 0 && status == DicomStatuses.Success)
                            status = DicomStatuses.QueryRetrieveSubOpsOneOrMoreFailures;
                    }
                }
                else
                {
                    status = DicomStatuses.Pending;
                    if ((progress.RemainingSubOperations%5) != 0)
                        return;

                    // Only send a RSP every 5 to reduce network load
                }

                if (sendOperationInfo.Server.NetworkActive)
                {
                    sendOperationInfo.Server.SendCMoveResponse(sendOperationInfo.PresentationId,
                                                               sendOperationInfo.MessageId,
                                                               msg, status,
                                                               (ushort) progress.SuccessSubOperations,
                                                               (ushort) progress.RemainingSubOperations,
                                                               (ushort) progress.FailureSubOperations,
                                                               (ushort) progress.WarningSubOperations);
                }

                if (status != DicomStatuses.Pending || !sendOperationInfo.Server.NetworkActive)
                {
                    foreach (SendOperationInfo info in GetSendOperationInfo(sendOperationInfo.MessageId))
                    {
                        RemoveSendOperationInfo(info);
                    }
                }
            }
            catch (Exception e)
            {
                Platform.Log(LogLevel.Error, e, "Unexpected error processing C-MOVE Responses");
            }
        }
Example #7
0
		private static bool IsNonTerminalStudyUpdateItem(WorkItemData item)
		{
			if (item.Request.ConcurrencyType != WorkItemConcurrency.StudyUpdate)
				return false;

			switch (item.Status)
			{
				case WorkItemStatusEnum.Pending:
				case WorkItemStatusEnum.InProgress:
				case WorkItemStatusEnum.Idle:
					return true;
				default:
					return false;
			}
		}
        public static void PublishWorkItemChanged(WorkItemsChangedEventType eventType, WorkItemData workItem)
		{
			PublishWorkItemsChanged(eventType, new List<WorkItemData> { workItem });
		}
		public void Test_update_item()
		{
			var items = new ItemCollection<ActivityMonitorComponent.WorkItem>
			{ new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1, Priority = WorkItemPriorityEnum.Normal }) };

			Assert.AreEqual(1, items.Count);
			Assert.AreEqual(1, items[0].Id);
			Assert.AreEqual(WorkItemPriorityEnum.Normal, items[0].Priority);

			var data = new WorkItemData { Identifier = 1, Priority = WorkItemPriorityEnum.Stat };
			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {});
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison);

			Assert.AreEqual(1, items.Count);
			Assert.AreEqual(1, items[0].Id);
			Assert.AreEqual(WorkItemPriorityEnum.Stat, items[0].Priority);
		}
		public void Test_failed_item_tracking_ignores_filter()
		{
			var items = new ItemCollection<ActivityMonitorComponent.WorkItem>
			            	{
			            		new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1 })
			            	};

			Assert.AreEqual(1, items.Count);

			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NormalPriorityFilter, () => { });

			// add a failed item that does not meet the filter criteria
			var failedItem = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Failed, Priority = WorkItemPriorityEnum.Stat};
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison);

			// verify that the item is not added to the collection, but is tracked as a failed item
			Assert.AreEqual(1, items.Count);
			Assert.AreEqual(1, items[0].Id);
			Assert.AreEqual(1, manager.FailedItemCount);
		}
		public void Test_failed_item_tracking()
		{
			var items = new ItemCollection<ActivityMonitorComponent.WorkItem>
			            	{
			            		new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1 })
			            	};

			Assert.AreEqual(1, items.Count);

			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {});

			// add a failed item
			var failedItem = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Failed };
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison);

			Assert.AreEqual(2, items.Count);
			Assert.AreEqual(1, manager.FailedItemCount);

			// add another failed item
			failedItem = new WorkItemData { Identifier = 3, Status = WorkItemStatusEnum.Failed };
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison);
			
			Assert.AreEqual(3, items.Count);
			Assert.AreEqual(2, manager.FailedItemCount);

			// update one of the items to Pending (e.g. retry)
			var item = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Pending };
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(item) }, NopComparison);

			Assert.AreEqual(3, items.Count);
			Assert.AreEqual(1, manager.FailedItemCount);

			// update other item to Pending (e.g. retry)
			item = new WorkItemData { Identifier = 3, Status = WorkItemStatusEnum.Pending };
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(item) }, NopComparison);

			Assert.AreEqual(3, items.Count);
			Assert.AreEqual(0, manager.FailedItemCount);

			// update an item to failed
			item = new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Failed };
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(item) }, NopComparison);

			Assert.AreEqual(3, items.Count);
			Assert.AreEqual(1, manager.FailedItemCount);

		}
		public void Test_clear_items()
		{
			var items = new ItemCollection<ActivityMonitorComponent.WorkItem>
			            	{
			            		new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1 })
			            	};

			Assert.AreEqual(1, items.Count);

			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {});

			// add a failed item
			var failedItem = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Failed };
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison);

			Assert.AreEqual(2, items.Count);
			Assert.AreEqual(1, manager.FailedItemCount);

			manager.Clear();

			// items collection is cleared
			Assert.AreEqual(0, items.Count);

			// failed item count is cleared
			Assert.AreEqual(0, manager.FailedItemCount);
		}
		public void Test_update_item_delete()
		{
			var items = new ItemCollection<ActivityMonitorComponent.WorkItem>
			{ new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Complete }) };

			Assert.AreEqual(1, items.Count);
			Assert.AreEqual(1, items[0].Id);
			Assert.AreEqual(WorkItemStatusEnum.Complete, items[0].Status);

			var data = new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Deleted};
			var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {});
			manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison);

			// item removed from collection, because of deleted status
			Assert.AreEqual(0, items.Count);
		}
		/// <summary>
		/// Publishes changing work item activity to the <see cref="IWorkItemActivityMonitorService"/>.
		/// </summary>
		/// <param name="item">The work item data</param>
		public void PublishWorkItemActivity(WorkItemData item)
		{
			if (_activityMonitorService == null)
				_activityMonitorService = Platform.GetService<IWorkItemActivityMonitorService>();

			_activityMonitorService.Publish(new WorkItemPublishRequest {Item = item});
		}