protected override void OnExecute(CommandProcessor theProcessor) { Platform.CheckForNullReference(Context, "Context"); Platform.CheckForNullReference(Context.ReconcileWorkQueueData, "Context.ReconcileWorkQueueData"); foreach (WorkQueueUid uid in Context.WorkQueueUidList) { string imagePath = GetReconcileUidPath(uid); try { using (var processor = new ServerCommandProcessor(String.Format("Deleting {0}", uid.SopInstanceUid))) { var deleteFile = new FileDeleteCommand(imagePath, true); var deleteUid = new DeleteWorkQueueUidCommand(uid); processor.AddCommand(deleteFile); processor.AddCommand(deleteUid); Platform.Log(ServerPlatform.InstanceLogLevel, deleteFile.ToString()); if (!processor.Execute()) { throw new Exception(String.Format("Unable to discard image {0}", uid.SopInstanceUid)); } } } catch (Exception e) { Platform.Log(LogLevel.Error, e, "Unexpected exception discarding file: {0}", imagePath); SopInstanceProcessor.FailUid(uid, true); } } }
private void ProcessSeriesLevelDelete(Model.WorkQueue item) { // ensure the Study is loaded. Study study = StorageLocation.Study; Platform.CheckForNullReference(study, "Study record doesn't exist"); Platform.Log(LogLevel.Info, "Processing Series Level Deletion for Study {0}, A#: {1}", study.StudyInstanceUid, study.AccessionNumber); _seriesToDelete = new List<Series>(); bool completed = false; try { // Load the list of Series to be deleted from the WorkQueueUid LoadUids(item); // Go through the list of series and add commands // to delete each of them. It's all or nothing. using (ServerCommandProcessor processor = new ServerCommandProcessor(String.Format("Deleting Series from study {0}, A#:{1}, Patient: {2}, ID:{3}", study.StudyInstanceUid, study.AccessionNumber, study.PatientsName, study.PatientId))) { StudyXml studyXml = StorageLocation.LoadStudyXml(); IDictionary<string, Series> existingSeries = StorageLocation.Study.Series; // Add commands to delete the folders and update the xml foreach (WorkQueueUid uid in WorkQueueUidList) { // Delete from study XML if (studyXml.Contains(uid.SeriesInstanceUid)) { //Note: DeleteDirectoryCommand doesn't throw exception if the folder doesn't exist var xmlUpdate = new RemoveSeriesFromStudyXml(studyXml, uid.SeriesInstanceUid); processor.AddCommand(xmlUpdate); } // Delete from filesystem string path = StorageLocation.GetSeriesPath(uid.SeriesInstanceUid); if (Directory.Exists(path)) { var delDir = new DeleteDirectoryCommand(path, true); processor.AddCommand(delDir); } } // flush the updated xml to disk processor.AddCommand(new SaveXmlCommand(studyXml, StorageLocation)); // Update the db.. NOTE: these commands are executed at the end. foreach (WorkQueueUid uid in WorkQueueUidList) { // Delete from DB WorkQueueUid queueUid = uid; Series theSeries = existingSeries[queueUid.SeriesInstanceUid]; if (theSeries!=null) { _seriesToDelete.Add(theSeries); var delSeries = new DeleteSeriesFromDBCommand(StorageLocation, theSeries); processor.AddCommand(delSeries); delSeries.Executing += DeleteSeriesFromDbExecuting; } else { // Series doesn't exist Platform.Log(LogLevel.Info, "Series {0} is invalid or no longer exists", uid.SeriesInstanceUid); } // The WorkQueueUid must be cleared before the entry can be removed from the queue var deleteUid = new DeleteWorkQueueUidCommand(uid); processor.AddCommand(deleteUid); // Force a re-archival if necessary processor.AddCommand(new InsertArchiveQueueCommand(item.ServerPartitionKey, item.StudyStorageKey)); } if (!processor.Execute()) throw new ApplicationException( String.Format("Error occurred when series from Study {0}, A#: {1}", study.StudyInstanceUid, study.AccessionNumber), processor.FailureException); else { foreach (Series series in _seriesToDelete) { OnSeriesDeleted(series); } } } completed = true; } finally { if (completed) { OnCompleted(); PostProcessing(item, WorkQueueProcessorStatus.Complete, WorkQueueProcessorDatabaseUpdate.ResetQueueState); } else { PostProcessing(item, WorkQueueProcessorStatus.Pending, WorkQueueProcessorDatabaseUpdate.None); } } }
/// <summary> /// Removes all WorkQueueUids from the database and delete the corresponding DICOM files from the filesystem. /// </summary> private void ProcessWorkQueueUids() { if (Study == null) Platform.Log(LogLevel.Info, "Begin StudyProcess Cleanup (Study has not been created): Attempt #{0}. {1} unprocessed files will be removed", WorkQueueItem.FailureCount + 1, WorkQueueUidList.Count); else Platform.Log(LogLevel.Info, "Begin StudyProcess Cleanup for study {0}, Patient {1} (PatientId:{2} A#:{3}) on Partition {4}. Attempt #{5}. {6} unprocessed files will be removed", Study.StudyInstanceUid, Study.PatientsName, Study.PatientId, Study.AccessionNumber, ServerPartition.Description, WorkQueueItem.FailureCount + 1, WorkQueueUidList.Count ); foreach (WorkQueueUid sop in WorkQueueUidList) { string path = GetFileStoredPath(sop); Platform.Log(LogLevel.Info, "Cleaning up {0}", path); using (ServerCommandProcessor processor = new ServerCommandProcessor(String.Format("Deleting {0}", sop.SopInstanceUid))) { // delete the file FileDeleteCommand deleteFile = new FileDeleteCommand(path, true); processor.AddCommand(deleteFile); // delete the WorkQueueUID from the database DeleteWorkQueueUidCommand deleteUid = new DeleteWorkQueueUidCommand(sop); processor.AddCommand(deleteUid); try { // delete the directory (if empty) var fileInfo = new FileInfo(path); ClearCanvas.ImageServer.Core.Command.DeleteDirectoryCommand deleteDir = new ClearCanvas.ImageServer.Core.Command.DeleteDirectoryCommand(fileInfo.Directory.FullName, false, true); processor.AddCommand(deleteDir); } catch (DirectoryNotFoundException ex) { // ignore } if (!processor.Execute()) { throw new Exception(String.Format("Unable to delete SOP {0}", sop.SopInstanceUid), processor.FailureException); } } // Delete the base directory if it's empty var baseDir = GetBaseDirectory(sop); if (Directory.Exists(baseDir)) { using (ServerCommandProcessor processor = new ServerCommandProcessor(String.Format("Deleting {0}", sop.SopInstanceUid))) { ClearCanvas.ImageServer.Core.Command.DeleteDirectoryCommand deleteDir = new ClearCanvas.ImageServer.Core.Command.DeleteDirectoryCommand(baseDir, false, true); processor.AddCommand(deleteDir); if (!processor.Execute()) { throw new Exception(String.Format("Unable to delete {0}", baseDir), processor.FailureException); } } } } }
private void ProcessUid(WorkQueueUid uid) { Platform.CheckForNullReference(uid, "uid"); string imagePath = GetUidPath(uid); using (ServerCommandProcessor processor = new ServerCommandProcessor(String.Format("Deleting {0}", uid.SopInstanceUid))) { // If the file for some reason doesn't exist, we just ignore it if (File.Exists(imagePath)) { Platform.Log(ServerPlatform.InstanceLogLevel, "Deleting {0}", imagePath); FileDeleteCommand deleteFile = new FileDeleteCommand(imagePath, true); processor.AddCommand(deleteFile); } else { Platform.Log(LogLevel.Warn, "WARNING {0} is missing.", imagePath); } DeleteWorkQueueUidCommand deleteUid = new DeleteWorkQueueUidCommand(uid); processor.AddCommand(deleteUid); if (!processor.Execute()) { throw new Exception(String.Format("Unable to delete image {0}", uid.SopInstanceUid)); } } }