/// <summary> /// Load the <see cref="ServerRulesEngine"/> for each partition. /// </summary> private void LoadRulesEngine() { using (var context = new ServerExecutionContext()) { var broker = context.ReadContext.GetBroker <IServerPartitionEntityBroker>(); var criteria = new ServerPartitionSelectCriteria(); IList <ServerPartition> partitions = broker.Find(criteria); foreach (ServerPartition partition in partitions) { //TODO CR (Jan 2014) - Cached engine not being used now, due to #11673 var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); engine.Load(); _engines.Add(partition, engine); engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key); engine.Load(); _postArchivalEngines.Add(partition, engine); engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); engine.AddIncludeType(ServerRuleTypeEnum.DataAccess); engine.Load(); _dataAccessEngine.Add(partition, engine); } } }
public UpdateStudyCommand(ServerPartition partition, StudyStorageLocation studyLocation, IList <BaseImageLevelUpdateCommand> imageLevelCommands, ServerRuleApplyTimeEnum applyTime) : base("Update existing study") { _partition = partition; _oldStudyLocation = studyLocation; _commands = imageLevelCommands; _statistics = new UpdateStudyStatistics(_oldStudyLocation.StudyInstanceUid); // Load the engine for editing rules. _rulesEngine = new ServerRulesEngine(applyTime, _partition.Key); if (applyTime.Equals(ServerRuleApplyTimeEnum.SopProcessed)) { _rulesEngine.AddIncludeType(ServerRuleTypeEnum.AutoRoute); } _rulesEngine.Load(); }
/// <summary> /// Load the <see cref="ServerRulesEngine"/> for each partition. /// </summary> private void LoadRulesEngine() { using (var context = new ServerExecutionContext()) { var broker = context.ReadContext.GetBroker<IServerPartitionEntityBroker>(); var criteria = new ServerPartitionSelectCriteria(); IList<ServerPartition> partitions = broker.Find(criteria); foreach (ServerPartition partition in partitions) { //TODO CR (Jan 2014) - Cached engine not being used now, due to #11673 var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); engine.Load(); _engines.Add(partition, engine); engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key); engine.Load(); _postArchivalEngines.Add(partition, engine); engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); engine.AddIncludeType(ServerRuleTypeEnum.DataAccess); engine.Load(); _dataAccessEngine.Add(partition, engine); } } }
public UpdateStudyCommand(ServerPartition partition, StudyStorageLocation studyLocation, IList<BaseImageLevelUpdateCommand> imageLevelCommands, ServerRuleApplyTimeEnum applyTime, WorkQueue workQueue) : base("Update existing study") { _partition = partition; _oldStudyLocation = studyLocation; _commands = imageLevelCommands; _workQueue = workQueue; _statistics = new UpdateStudyStatistics(_oldStudyLocation.StudyInstanceUid); // Load the engine for editing rules. _rulesEngine = new ServerRulesEngine(applyTime, _partition.Key); if (applyTime.Equals(ServerRuleApplyTimeEnum.SopProcessed)) _rulesEngine.AddIncludeType(ServerRuleTypeEnum.AutoRoute); _rulesEngine.Load(); }
/// <summary> /// Reprocess a file systems /// </summary> /// <param name="partition"></param> private void ReprocessPartition(ServerPartition partition) { var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); engine.Load(); var postArchivalEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key); postArchivalEngine.Load(); var dataAccessEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); dataAccessEngine.AddIncludeType(ServerRuleTypeEnum.DataAccess); dataAccessEngine.Load(); var filesystems = FilesystemMonitor.Instance.GetFilesystems(); foreach (var f in filesystems) { var partitionDir = Path.Combine(f.Filesystem.FilesystemPath, partition.PartitionFolder); var filesystemDir = new DirectoryInfo(partitionDir); foreach (DirectoryInfo dateDir in filesystemDir.GetDirectories()) { if (dateDir.FullName.EndsWith("Deleted") || dateDir.FullName.EndsWith(ServerPlatform.ReconcileStorageFolder)) { continue; } foreach (DirectoryInfo studyDir in dateDir.GetDirectories()) { String studyInstanceUid = studyDir.Name; try { StudyStorageLocation location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid); if (location == null) { foreach (DirectoryInfo seriesDir in studyDir.GetDirectories()) { FileInfo[] sopInstanceFiles = seriesDir.GetFiles("*.dcm"); DicomFile file = null; foreach (FileInfo sopFile in sopInstanceFiles) { if (!sopFile.FullName.EndsWith(ServerPlatform.DicomFileExtension)) { continue; } try { file = new DicomFile(sopFile.FullName); file.Load(DicomTags.StudyId, DicomReadOptions.DoNotStorePixelDataInDataSet | DicomReadOptions.Default); break; } catch (Exception e) { Platform.Log(LogLevel.Warn, e, "Unexpected failure loading file: {0}. Continuing to next file.", sopFile.FullName); file = null; } } if (file != null) { studyInstanceUid = file.DataSet[DicomTags.StudyInstanceUid].ToString(); break; } } location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid); if (location == null) { continue; } } ProcessStudy(partition, location, engine, postArchivalEngine, dataAccessEngine); //_stats.NumStudies++; if (CancelPending) { return; } } catch (Exception e) { Platform.Log(LogLevel.Error, e, "Unexpected error while processing study: {0} on partition {1}.", studyInstanceUid, partition.Description); } } // Cleanup the directory, if its empty. DirectoryUtility.DeleteIfEmpty(dateDir.FullName); } } }
/// <summary> /// Reprocess a file systems /// </summary> /// <param name="partition"></param> private void ReprocessPartition(ServerPartition partition) { var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); engine.Load(); var postArchivalEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key); postArchivalEngine.Load(); var dataAccessEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key); dataAccessEngine.AddIncludeType(ServerRuleTypeEnum.DataAccess); dataAccessEngine.Load(); var filesystems = FilesystemMonitor.Instance.GetFilesystems(); foreach (var f in filesystems) { var partitionDir = Path.Combine(f.Filesystem.FilesystemPath, partition.PartitionFolder); var filesystemDir = new DirectoryInfo(partitionDir); foreach (DirectoryInfo dateDir in filesystemDir.GetDirectories()) { if (dateDir.FullName.EndsWith("Deleted") || dateDir.FullName.EndsWith(ServerPlatform.ReconcileStorageFolder)) continue; foreach (DirectoryInfo studyDir in dateDir.GetDirectories()) { String studyInstanceUid = studyDir.Name; try { StudyStorageLocation location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid); if (location == null) { foreach (DirectoryInfo seriesDir in studyDir.GetDirectories()) { FileInfo[] sopInstanceFiles = seriesDir.GetFiles("*.dcm"); DicomFile file = null; foreach (FileInfo sopFile in sopInstanceFiles) { if (!sopFile.FullName.EndsWith(ServerPlatform.DicomFileExtension)) continue; try { file = new DicomFile(sopFile.FullName); file.Load(DicomTags.StudyId, DicomReadOptions.DoNotStorePixelDataInDataSet | DicomReadOptions.Default); break; } catch (Exception e) { Platform.Log(LogLevel.Warn, e, "Unexpected failure loading file: {0}. Continuing to next file.", sopFile.FullName); file = null; } } if (file != null) { studyInstanceUid = file.DataSet[DicomTags.StudyInstanceUid].ToString(); break; } } location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid); if (location == null) continue; } ProcessStudy(partition, location, engine, postArchivalEngine, dataAccessEngine); //_stats.NumStudies++; if (CancelPending) return; } catch (Exception e) { Platform.Log(LogLevel.Error, e, "Unexpected error while processing study: {0} on partition {1}.", studyInstanceUid, partition.Description); } } // Cleanup the directory, if its empty. DirectoryUtility.DeleteIfEmpty(dateDir.FullName); } } }