public WorkQueueTypeProperties(
     WorkQueueTypeEnum _workQueueTypeEnum_
     , WorkQueuePriorityEnum _workQueuePriorityEnum_
     , Boolean _memoryLimited_
     , Boolean _alertFailedWorkQueue_
     , Int32 _maxFailureCount_
     , Int32 _processDelaySeconds_
     , Int32 _failureDelaySeconds_
     , Int32 _deleteDelaySeconds_
     , Int32 _postponeDelaySeconds_
     , Int32 _expireDelaySeconds_
     , Int32 _maxBatchSize_
     , Boolean _readLock_
     , Boolean _writeLock_
     , QueueStudyStateEnum _queueStudyStateEnum_
     , Int16 _queueStudyStateOrder_
     ) : base("WorkQueueTypeProperties")
 {
     WorkQueueTypeEnum     = _workQueueTypeEnum_;
     WorkQueuePriorityEnum = _workQueuePriorityEnum_;
     MemoryLimited         = _memoryLimited_;
     AlertFailedWorkQueue  = _alertFailedWorkQueue_;
     MaxFailureCount       = _maxFailureCount_;
     ProcessDelaySeconds   = _processDelaySeconds_;
     FailureDelaySeconds   = _failureDelaySeconds_;
     DeleteDelaySeconds    = _deleteDelaySeconds_;
     PostponeDelaySeconds  = _postponeDelaySeconds_;
     ExpireDelaySeconds    = _expireDelaySeconds_;
     MaxBatchSize          = _maxBatchSize_;
     ReadLock             = _readLock_;
     WriteLock            = _writeLock_;
     QueueStudyStateEnum  = _queueStudyStateEnum_;
     QueueStudyStateOrder = _queueStudyStateOrder_;
 }
Пример #2
0
 public WorkQueueTypeProperties(
      WorkQueueTypeEnum _workQueueTypeEnum_
     ,WorkQueuePriorityEnum _workQueuePriorityEnum_
     ,Boolean _memoryLimited_
     ,Boolean _alertFailedWorkQueue_
     ,Int32 _maxFailureCount_
     ,Int32 _processDelaySeconds_
     ,Int32 _failureDelaySeconds_
     ,Int32 _deleteDelaySeconds_
     ,Int32 _postponeDelaySeconds_
     ,Int32 _expireDelaySeconds_
     ,Int32 _maxBatchSize_
     ,Boolean _readLock_
     ,Boolean _writeLock_
     ,QueueStudyStateEnum _queueStudyStateEnum_
     ,Int16 _queueStudyStateOrder_
     ):base("WorkQueueTypeProperties")
 {
     WorkQueueTypeEnum = _workQueueTypeEnum_;
     WorkQueuePriorityEnum = _workQueuePriorityEnum_;
     MemoryLimited = _memoryLimited_;
     AlertFailedWorkQueue = _alertFailedWorkQueue_;
     MaxFailureCount = _maxFailureCount_;
     ProcessDelaySeconds = _processDelaySeconds_;
     FailureDelaySeconds = _failureDelaySeconds_;
     DeleteDelaySeconds = _deleteDelaySeconds_;
     PostponeDelaySeconds = _postponeDelaySeconds_;
     ExpireDelaySeconds = _expireDelaySeconds_;
     MaxBatchSize = _maxBatchSize_;
     ReadLock = _readLock_;
     WriteLock = _writeLock_;
     QueueStudyStateEnum = _queueStudyStateEnum_;
     QueueStudyStateOrder = _queueStudyStateOrder_;
 }
        public UpdateWorkQueueCommand(DicomMessageBase message, StudyStorageLocation location, bool duplicate, WorkQueueData data=null, WorkQueueUidData uidData=null, ExternalRequestQueue request=null, WorkQueuePriorityEnum priority=null)
            : base("Update/Insert a WorkQueue Entry")
        {
            Platform.CheckForNullReference(message, "Dicom Message object");
            Platform.CheckForNullReference(location, "Study Storage Location");
            
            _message = message;
            _storageLocation = location;
            _duplicate = duplicate;
            _data = data;
            _request = request;
            _uidData = uidData;
	        _priority = priority;
        }
Пример #4
0
 public WorkQueue(
     ServerEntityKey _serverPartitionKey_
     ,ServerEntityKey _studyStorageKey_
     ,WorkQueueTypeEnum _workQueueTypeEnum_
     ,WorkQueueStatusEnum _workQueueStatusEnum_
     ,WorkQueuePriorityEnum _workQueuePriorityEnum_
     ,Int32 _failureCount_
     ,DateTime _scheduledTime_
     ,DateTime _insertTime_
     ,DateTime? _lastUpdatedTime_
     ,String _failureDescription_
     ,XmlDocument _data_
     ,ServerEntityKey _externalRequestQueueKey_
     ,String _processorID_
     ,String _groupID_
     ,DateTime? _expirationTime_
     ,ServerEntityKey _deviceKey_
     ,ServerEntityKey _studyHistoryKey_
     )
     : base("WorkQueue")
 {
     ServerPartitionKey = _serverPartitionKey_;
     StudyStorageKey = _studyStorageKey_;
     WorkQueueTypeEnum = _workQueueTypeEnum_;
     WorkQueueStatusEnum = _workQueueStatusEnum_;
     WorkQueuePriorityEnum = _workQueuePriorityEnum_;
     FailureCount = _failureCount_;
     ScheduledTime = _scheduledTime_;
     InsertTime = _insertTime_;
     LastUpdatedTime = _lastUpdatedTime_;
     FailureDescription = _failureDescription_;
     Data = _data_;
     ExternalRequestQueueKey = _externalRequestQueueKey_;
     ProcessorID = _processorID_;
     GroupID = _groupID_;
     ExpirationTime = _expirationTime_;
     DeviceKey = _deviceKey_;
     StudyHistoryKey = _studyHistoryKey_;
 }
Пример #5
0
 public WorkQueue(
      ServerEntityKey _serverPartitionKey_
     ,ServerEntityKey _studyStorageKey_
     ,WorkQueueTypeEnum _workQueueTypeEnum_
     ,WorkQueueStatusEnum _workQueueStatusEnum_
     ,WorkQueuePriorityEnum _workQueuePriorityEnum_
     ,Int32 _failureCount_
     ,DateTime _scheduledTime_
     ,DateTime _insertTime_
     ,DateTime _lastUpdatedTime_
     ,String _failureDescription_
     ,XmlDocument _data_
     ,ServerEntityKey _externalRequestQueueKey_
     ,String _processorID_
     ,String _groupID_
     ,DateTime _expirationTime_
     ,ServerEntityKey _deviceKey_
     ,ServerEntityKey _studyHistoryKey_
     ):base("WorkQueue")
 {
     ServerPartitionKey = _serverPartitionKey_;
     StudyStorageKey = _studyStorageKey_;
     WorkQueueTypeEnum = _workQueueTypeEnum_;
     WorkQueueStatusEnum = _workQueueStatusEnum_;
     WorkQueuePriorityEnum = _workQueuePriorityEnum_;
     FailureCount = _failureCount_;
     ScheduledTime = _scheduledTime_;
     InsertTime = _insertTime_;
     LastUpdatedTime = _lastUpdatedTime_;
     FailureDescription = _failureDescription_;
     Data = _data_;
     ExternalRequestQueueKey = _externalRequestQueueKey_;
     ProcessorID = _processorID_;
     GroupID = _groupID_;
     ExpirationTime = _expirationTime_;
     DeviceKey = _deviceKey_;
     StudyHistoryKey = _studyHistoryKey_;
 }
Пример #6
0
        /// <summary>
        /// Reschedule a list of <see cref="WorkQueue"/> items
        /// </summary>
        /// <param name="items">List of <see cref="WorkQueue"/> items to be rescheduled</param>
        /// <param name="newScheduledTime">New schedule start date/time</param>
        /// <param name="expirationTime">New expiration date/time</param>
        /// <param name="priority">New priority</param>
        /// <returns>A value indicating whether all <see cref="WorkQueue"/> items in <paramref name="items"/> are updated successfully.</returns>
        /// <remarks>
        /// If one or more <see cref="WorkQueue"/> in <paramref name="items"/> cannot be rescheduled, all changes will be 
        /// reverted and <b>false</b> will be returned.
        /// </remarks>
        public bool RescheduleWorkQueueItems(IList<WorkQueue> items, DateTime newScheduledTime, DateTime expirationTime, WorkQueuePriorityEnum priority)
        {
            if (items == null || items.Count == 0)
                return false;

            WorkQueueUpdateColumns updatedColumns = new WorkQueueUpdateColumns();
            updatedColumns.WorkQueuePriorityEnum = priority;
            updatedColumns.ScheduledTime = newScheduledTime;
            updatedColumns.ExpirationTime = expirationTime;
            updatedColumns.FailureCount = 0;
            updatedColumns.FailureDescription = String.Empty;
            updatedColumns.LastUpdatedTime = Platform.Time;

            bool result = false;
            IPersistentStore store = PersistentStoreRegistry.GetDefaultStore();
            using (IUpdateContext ctx = store.OpenUpdateContext(UpdateContextSyncMode.Flush))
            {
                IWorkQueueEntityBroker workQueueBroker = ctx.GetBroker<IWorkQueueEntityBroker>();
                foreach (WorkQueue item in items)
                {
                    result = workQueueBroker.Update(item.Key, updatedColumns);
                    if (!result)
                    {
                        break;
                    }
                }
                if (result)
                    ctx.Commit();
            }

            return result;
        }
Пример #7
0
		/// <summary>
		/// Creates an instance of <see cref="SopInstanceImporterContext"/> to be used
		/// by <see cref="SopInstanceImporter"/> 
		/// </summary>
		/// <param name="contextId">The ID assigned to the context. This will be used as the name of storage folder in case of duplicate.</param>
		/// <param name="sourceAe">Source AE title of the image(s) to be imported</param>
		/// <param name="partition">The <see cref="ServerPartition"/> which the image(s) will be imported to</param>
		/// <param name="request">An external request that triggered this operation.</param>
		/// <param name="priority">The priority that resulting <see cref="WorkQueue"/> will have upon insertion.</param>
		public SopInstanceImporterContext(string contextId, string sourceAe, ServerPartition partition,
		                                  ExternalRequestQueue request = null, WorkQueuePriorityEnum priority=null)
		{
			Platform.CheckForEmptyString(contextId, "contextID");
			Platform.CheckForNullReference(partition, "partition");
			_contextID = contextId;
			_sourceAE = sourceAe;
			_partition = partition;
			_request = request;
			_priorityEnum = priority;
		}
Пример #8
0
        /// <summary>
        /// Insert an EditStudy request.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="studyStorageKey"></param>
        /// <param name="serverPartitionKey"></param>
        /// <param name="type"></param>
        /// <param name="updateItems"></param>
        /// <param name="reason"></param>
        /// <param name="user"></param>
        /// <param name="editType"></param>
		/// <param name="priorityEnum">Optional parameter to set the priority of resultant <see cref="WorkQueue"/> items.</param>
        /// <returns></returns>
		private static WorkQueue InsertExternalEditStudyRequest(IUpdateContext context, ServerEntityKey studyStorageKey, ServerEntityKey serverPartitionKey, 
			WorkQueueTypeEnum type, List<UpdateItem> updateItems, string reason, string user, EditType editType, WorkQueuePriorityEnum priorityEnum = null)
        {
            var propertiesBroker = context.GetBroker<IWorkQueueTypePropertiesEntityBroker>();
            var criteria = new WorkQueueTypePropertiesSelectCriteria();
            criteria.WorkQueueTypeEnum.EqualTo(type);
            WorkQueueTypeProperties properties = propertiesBroker.FindOne(criteria);

            var broker = context.GetBroker<IWorkQueueEntityBroker>();
            var insert = new WorkQueueUpdateColumns();
            DateTime now = Platform.Time;
            var data = new EditStudyWorkQueueData
            {
                EditRequest =
                {
                    TimeStamp = now,
                    UserId = user,
                    UpdateEntries = updateItems,
                    Reason = reason,
                    EditType = editType
                }
            };
            insert.WorkQueueTypeEnum = type;
            insert.StudyStorageKey = studyStorageKey;
            insert.ServerPartitionKey = serverPartitionKey;
            insert.ScheduledTime = now;
            insert.ExpirationTime = now.AddSeconds(properties.ExpireDelaySeconds);
            insert.WorkQueueStatusEnum = WorkQueueStatusEnum.Pending;
            insert.WorkQueuePriorityEnum = priorityEnum ?? properties.WorkQueuePriorityEnum;
            insert.Data = XmlUtils.SerializeAsXmlDoc(data); 
            WorkQueue editEntry = broker.Insert(insert);
            if (editEntry == null)
            {
                throw new ApplicationException(string.Format("Unable to insert an Edit request of type {0} for study for user {1}", type.Description, user));
            }
            return editEntry;
        }
Пример #9
0
	    /// <summary>
	    /// Insert an EditStudy request.
	    /// </summary>
	    /// <param name="context"></param>
	    /// <param name="studyStorageKey"></param>
	    /// <param name="serverPartitionKey"></param>
	    /// <param name="type"></param>
	    /// <param name="updateItems"></param>
	    /// <param name="reason"></param>
	    /// <param name="user"></param>
	    /// <param name="editType"></param>
		/// <param name="priorityEnum">Optional parameter to set the priority of resultant <see cref="WorkQueue"/> items.</param>
	    /// <returns></returns>
		private static WorkQueue InsertEditStudyRequest(IUpdateContext context, ServerEntityKey studyStorageKey, ServerEntityKey serverPartitionKey, WorkQueueTypeEnum type, List<UpdateItem> updateItems, string reason, string user, EditType editType, WorkQueuePriorityEnum priorityEnum = null)
        {
        	var broker = context.GetBroker<IInsertWorkQueue>();
            InsertWorkQueueParameters criteria = new EditStudyWorkQueueParameters(studyStorageKey, serverPartitionKey, type, updateItems, reason, user, editType);
		    if (priorityEnum != null)
			    criteria.WorkQueuePriorityEnum = priorityEnum;
            WorkQueue editEntry = broker.FindOne(criteria);
            if (editEntry == null)
            {
                throw new ApplicationException(string.Format("Unable to insert an Edit request of type {0} for study for user {1}",type.Description, user));
            }
            return editEntry;
        }
Пример #10
0
        /// <summary>
        /// Inserts an External edit request(s) to update a study.
        /// </summary>
        /// <remarks>
        /// The External Edit request can be for a study in any state.  The study could be offline/nearline/etc.
        /// </remarks>
        /// <param name="context">The persistence context used for database connection.</param>
        /// <param name="studyStorageKey">The StudyStorage record key</param>
        /// <param name="reason">The reason the study is being editted</param>
        /// <param name="user">A string identifying the user that triggered the edit and is stored with the history for the edit.</param>
        /// <exception cref="InvalidStudyStateOperationException"></exception>
        /// <param name="updateItems"></param>
        /// <param name="editType">The request is a web edit request </param>
		/// <param name="priorityEnum">Optional parameter to set the priority of resultant <see cref="WorkQueue"/> items.</param>
		public static IList<WorkQueue> ExternalEditStudy(IUpdateContext context, ServerEntityKey studyStorageKey, List<UpdateItem> updateItems, string reason, string user, EditType editType, WorkQueuePriorityEnum priorityEnum = null)
        {
            // Find all location of the study in the system and insert series delete request
            StudyStorage s = StudyStorage.Load(studyStorageKey);
            IList<WorkQueue> entries = new List<WorkQueue>();

            // insert an edit request
            WorkQueue request = InsertExternalEditStudyRequest(context, s.Key, s.ServerPartitionKey,
                                                       WorkQueueTypeEnum.ExternalEdit, updateItems, reason, user,
                                                       editType, priorityEnum);
            entries.Add(request);

            return entries;
        }
Пример #11
0
        /// <summary>
        /// Inserts edit request(s) to update a study.
        /// </summary>
        /// <param name="context">The persistence context used for database connection.</param>
        /// <param name="studyStorageKey">The StudyStorage record key</param>
        /// <param name="reason">The reason the study is being editted</param>
        /// <param name="userId">The ID of the user requesting the study edit</param> 
        /// <param name="editType">The request is a web edit request</param>
        /// <exception cref="InvalidStudyStateOperationException"></exception>
		/// <param name="priorityEnum">Optional parameter to set the priority of resultant <see cref="WorkQueue"/> items.</param>
        /// <param name="updateItems"></param>
		public static IList<WorkQueue> EditStudy(IUpdateContext context, ServerEntityKey studyStorageKey, List<UpdateItem> updateItems, string reason, string userId, EditType editType, WorkQueuePriorityEnum priorityEnum = null)
        {
            // Find all location of the study in the system and insert series delete request
			IList<StudyStorageLocation> storageLocations = StudyStorageLocation.FindStorageLocations(studyStorageKey);
			IList<WorkQueue> entries = new List<WorkQueue>();

            foreach (StudyStorageLocation location in storageLocations)
            {
                if (location.StudyStatusEnum.Equals(StudyStatusEnum.OnlineLossy))
                {
                    if (location.IsLatestArchiveLossless)
                    {
                        throw new InvalidStudyStateOperationException("Study is lossy but was archived as lossless. It must be restored before editing.");                
                    }
                }

                try
                {
                    string failureReason;
                    if (ServerHelper.LockStudy(location.Key, QueueStudyStateEnum.EditScheduled, out failureReason))
                    {
                        // insert an edit request
                        WorkQueue request = InsertEditStudyRequest(context, location.Key, location.ServerPartitionKey, WorkQueueTypeEnum.WebEditStudy, updateItems, reason, userId, editType,priorityEnum);
                        entries.Add(request);
                    }
                    else
                    {
                        throw new ApplicationException(String.Format("Unable to lock storage location {0} for edit : {1}", location.Key, failureReason));
                    }
                }
                catch (Exception ex)
                {
                    Platform.Log(LogLevel.Error, ex, "Errors occured when trying to insert edit request");
                    if (!ServerHelper.UnlockStudy(location.Key))
                        throw new ApplicationException("Unable to unlock the study");
                }
            }

            return entries;
        }