protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext) { string seriesUid = _file.DataSet[DicomTags.SeriesInstanceUid].GetString(0, String.Empty); string sopUid = _file.DataSet[DicomTags.SopInstanceUid].GetString(0, String.Empty); ImageSetDescriptor imageSet = new ImageSetDescriptor(_file.DataSet); ReconcileStudyQueueDescription queueDesc = GetQueueEntryDescription(_storageLocation, _file); ReconcileStudyWorkQueueData detailsData = new ReconcileStudyWorkQueueData { StoragePath = _reconcileImageStorage.GetFolderPath(), Details = new ImageSetDetails(_file.DataSet) }; detailsData.Details.InsertFile(_file); IInsertStudyIntegrityQueue broker = updateContext.GetBroker <IInsertStudyIntegrityQueue>(); InsertStudyIntegrityQueueParameters parameters = new InsertStudyIntegrityQueueParameters { Description = queueDesc.ToString(), StudyInstanceUid = _storageLocation.StudyInstanceUid, ServerPartitionKey = _storageLocation.ServerPartition.Key, StudyStorageKey = _storageLocation.Key, StudyIntegrityReasonEnum = _reason, SeriesInstanceUid = seriesUid, SeriesDescription = sopUid, SopInstanceUid = _file.DataSet[DicomTags.SopInstanceUid].GetString(0, String . Empty), StudyData = XmlUtils.SerializeAsXmlDoc(imageSet), Details = XmlUtils.SerializeAsXmlDoc(detailsData), GroupID = _uidGroup, UidRelativePath = _reconcileImageStorage.GetSopRelativePath( _file.DataSet[DicomTags.SopInstanceUid].ToString()) }; StudyIntegrityQueue item = broker.FindOne(parameters); if (item == null) { throw new ApplicationException("Unable to update reconcile queue"); } _siqItem = item; if (!parameters.Inserted) { // Need to re-use the path that's already assigned for this entry ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Details); data.Details.InsertFile(_file); XmlDocument updatedQueueDataXml = XmlUtils.SerializeAsXmlDoc(data); IStudyIntegrityQueueEntityBroker updateBroker = updateContext.GetBroker <IStudyIntegrityQueueEntityBroker>(); StudyIntegrityQueueUpdateColumns columns = new StudyIntegrityQueueUpdateColumns { Details = updatedQueueDataXml }; updateBroker.Update(item.GetKey(), columns); } }
protected override void ProcessItem(Model.WorkQueue item) { Platform.CheckForNullReference(item, "item"); Platform.CheckForNullReference(item.Data, "item.Data"); _reconcileQueueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(WorkQueueItem.Data); LoadUids(item); if (WorkQueueUidList.Count == 0) { DirectoryUtility.DeleteIfEmpty(_reconcileQueueData.StoragePath); Platform.Log(LogLevel.Info, "Reconcile Cleanup is completed. GUID={0}.", WorkQueueItem.GetKey()); PostProcessing(WorkQueueItem, WorkQueueProcessorStatus.Complete, WorkQueueProcessorDatabaseUpdate.ResetQueueState); } else { Platform.Log(LogLevel.Info, "Starting Cleanup of Reconcile Queue item for study {0} for Patient {1} (PatientId:{2} A#:{3}) on Partition {4}, {5} objects", Study.StudyInstanceUid, Study.PatientsName, Study.PatientId, Study.AccessionNumber, ServerPartition.Description, WorkQueueUidList.Count); ProcessUidList(); Platform.Log(LogLevel.Info, "Successfully complete Reconcile Cleanup. GUID={0}. {0} uids processed.", WorkQueueItem.GetKey(), WorkQueueUidList.Count); PostProcessing(WorkQueueItem, WorkQueueProcessorStatus.Pending, WorkQueueProcessorDatabaseUpdate.None); } }
protected override void ProcessItem(Model.WorkQueue item) { Platform.CheckForNullReference(item, "item"); Platform.CheckForNullReference(item.Data, "item.Data"); _reconcileQueueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(WorkQueueItem.Data); LoadUids(item); InitializeContext(); SetupProcessor(); if (WorkQueueUidList.Count == 0) { Platform.Log(LogLevel.Info, "Completing study reconciliation for Study {0}, Patient {1} (PatientId:{2} A#:{3}) on Partition {4}, {5} objects", Study.StudyInstanceUid, Study.PatientsName, Study.PatientId, Study.AccessionNumber, ServerPartition.Description, WorkQueueUidList.Count); ExecuteCommands(true); } else { Platform.Log(LogLevel.Info, "Reconciling study {0} for Patient {1} (PatientId:{2} A#:{3}) on Partition {4}, {5} objects", Study.StudyInstanceUid, Study.PatientsName, Study.PatientId, Study.AccessionNumber, ServerPartition.Description, WorkQueueUidList.Count); ExecuteCommands(false); } }
private string GetWorkQueueSecondaryFolder(Model.WorkQueue item) { if (WorkQueueHasSecondaryPath(item)) { if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.ProcessDuplicate)) { ProcessDuplicateQueueEntryQueueData queueData = XmlUtils.Deserialize <ProcessDuplicateQueueEntryQueueData>(item.Data); DirectoryInfo dir = new DirectoryInfo(queueData.DuplicateSopFolder); return(dir.Parent.FullName); } if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.CleanupDuplicate)) { ProcessDuplicateQueueEntryQueueData queueData = XmlUtils.Deserialize <ProcessDuplicateQueueEntryQueueData>(item.Data); DirectoryInfo dir = new DirectoryInfo(queueData.DuplicateSopFolder); return(dir.Parent.FullName); } if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.ReconcileCleanup)) { ReconcileStudyWorkQueueData queueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Data); DirectoryInfo dir = new DirectoryInfo(queueData.StoragePath); return(dir.Parent.FullName); } if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.ReconcileStudy)) { ReconcileStudyWorkQueueData queueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Data); DirectoryInfo dir = new DirectoryInfo(queueData.StoragePath); return(dir.Parent.FullName); } } return(null); }
public InconsistentDataSIQRecord(StudyIntegrityQueue queue) { _queueItem = queue; ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(queue.Details); _conflictingImageDetails = data.Details; _conflictingImageDescriptor = XmlUtils.Deserialize <ImageSetDescriptor>(queue.StudyData); StudyStorage storage = StudyStorage.Load(HttpContextData.Current.ReadContext, queue.StudyStorageKey); Study study = storage.LoadStudy(HttpContextData.Current.ReadContext); _existingStudyInfo = new StudyInformation(new ServerEntityAttributeProvider(study)); }
private string GetSIQItemStorageFolder(StudyIntegrityQueue queue) { if (queue.StudyIntegrityReasonEnum.Equals(StudyIntegrityReasonEnum.InconsistentData)) { ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(queue.Details); DirectoryInfo dir = new DirectoryInfo(data.StoragePath); return(dir.Parent.FullName); } if (queue.StudyIntegrityReasonEnum.Equals(StudyIntegrityReasonEnum.Duplicate)) { DuplicateSIQQueueData data = XmlUtils.Deserialize <DuplicateSIQQueueData>(queue.Details); DirectoryInfo dir = new DirectoryInfo(data.StoragePath); return(dir.Parent.FullName); } return(null); }
private static void ReconcileStudy(string command, StudyIntegrityQueue item) { //Ignore the reconcile command if the item is null. if (item == null) { return; } // Preload the change description so its not done during the DB transaction XmlDocument changeDescription = new XmlDocument(); changeDescription.LoadXml(command); // The Xml in the SIQ item was generated when the images were received and put into the SIQ. // We now add the user info to it so that it will be logged in the history ReconcileStudyWorkQueueData queueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Details); queueData.TimeStamp = Platform.Time; queueData.UserId = ServerHelper.CurrentUserName; using (IUpdateContext context = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { LockStudyParameters lockParms = new LockStudyParameters { QueueStudyStateEnum = QueueStudyStateEnum.ReconcileScheduled, StudyStorageKey = item.StudyStorageKey }; ILockStudy broker = context.GetBroker <ILockStudy>(); broker.Execute(lockParms); if (!lockParms.Successful) { throw new ApplicationException(lockParms.FailureReason); } //Add to Study History StudyHistoryeAdaptor historyAdaptor = new StudyHistoryeAdaptor(); StudyHistoryUpdateColumns parameters = new StudyHistoryUpdateColumns { StudyData = item.StudyData, ChangeDescription = changeDescription, StudyStorageKey = item.StudyStorageKey, StudyHistoryTypeEnum = StudyHistoryTypeEnum.StudyReconciled }; StudyHistory history = historyAdaptor.Add(context, parameters); //Create WorkQueue Entry WorkQueueAdaptor workQueueAdaptor = new WorkQueueAdaptor(); WorkQueueUpdateColumns row = new WorkQueueUpdateColumns { Data = XmlUtils.SerializeAsXmlDoc(queueData), ServerPartitionKey = item.ServerPartitionKey, StudyStorageKey = item.StudyStorageKey, StudyHistoryKey = history.GetKey(), WorkQueueTypeEnum = WorkQueueTypeEnum.ReconcileStudy, WorkQueueStatusEnum = WorkQueueStatusEnum.Pending, ScheduledTime = Platform.Time, ExpirationTime = Platform.Time.AddHours(1), GroupID = item.GroupID }; WorkQueue newWorkQueueItem = workQueueAdaptor.Add(context, row); StudyIntegrityQueueUidAdaptor studyIntegrityQueueUidAdaptor = new StudyIntegrityQueueUidAdaptor(); StudyIntegrityQueueUidSelectCriteria crit = new StudyIntegrityQueueUidSelectCriteria(); crit.StudyIntegrityQueueKey.EqualTo(item.GetKey()); IList <StudyIntegrityQueueUid> uidList = studyIntegrityQueueUidAdaptor.Get(context, crit); WorkQueueUidAdaptor workQueueUidAdaptor = new WorkQueueUidAdaptor(); WorkQueueUidUpdateColumns update = new WorkQueueUidUpdateColumns(); foreach (StudyIntegrityQueueUid uid in uidList) { update.WorkQueueKey = newWorkQueueItem.GetKey(); update.SeriesInstanceUid = uid.SeriesInstanceUid; update.SopInstanceUid = uid.SopInstanceUid; update.RelativePath = uid.RelativePath; workQueueUidAdaptor.Add(context, update); } //DeleteStudyIntegrityQueue Item StudyIntegrityQueueUidSelectCriteria criteria = new StudyIntegrityQueueUidSelectCriteria(); criteria.StudyIntegrityQueueKey.EqualTo(item.GetKey()); studyIntegrityQueueUidAdaptor.Delete(context, criteria); StudyIntegrityQueueAdaptor studyIntegrityQueueAdaptor = new StudyIntegrityQueueAdaptor(); studyIntegrityQueueAdaptor.Delete(context, item.GetKey()); context.Commit(); } }