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> /// Apply the Rules engine. /// </summary> /// <remarks> /// <para> /// This method applies the rules engine to the first image in each series within a study. /// The assumption is that the actions generated by the engine can handle being applied more /// than once for the same study. This is also done to handle the case of multi-modality /// studies where you may want the rules to be run against each series, because they may /// apply differently. /// </para> /// <para> /// Note that we are still applying series level moves, although there currently are not /// any series level rules. We've somewhat turned the study level rules into series /// level rules. /// </para> /// </remarks> public void Apply(ServerRuleApplyTimeEnum applyTime) { using(var theProcessor = new ServerCommandProcessor("Study Rule Processor")) { Apply(applyTime, theProcessor); if (false == theProcessor.Execute()) { Platform.Log(LogLevel.Error, "Unexpected failure processing Study level rules for study {0} on partition {1} for {2} apply time", _location.StudyInstanceUid, _partition.Description, applyTime.Description); } } }
public ServerRule( String _ruleName_ ,ServerEntityKey _serverPartitionKey_ ,ServerRuleTypeEnum _serverRuleTypeEnum_ ,ServerRuleApplyTimeEnum _serverRuleApplyTimeEnum_ ,Boolean _enabled_ ,Boolean _defaultRule_ ,Boolean _exemptRule_ ,XmlDocument _ruleXml_ ):base("ServerRule") { RuleName = _ruleName_; ServerPartitionKey = _serverPartitionKey_; ServerRuleTypeEnum = _serverRuleTypeEnum_; ServerRuleApplyTimeEnum = _serverRuleApplyTimeEnum_; Enabled = _enabled_; DefaultRule = _defaultRule_; ExemptRule = _exemptRule_; RuleXml = _ruleXml_; }
public ServerRule( String _ruleName_ , ServerEntityKey _serverPartitionKey_ , ServerRuleTypeEnum _serverRuleTypeEnum_ , ServerRuleApplyTimeEnum _serverRuleApplyTimeEnum_ , Boolean _enabled_ , Boolean _defaultRule_ , Boolean _exemptRule_ , XmlDocument _ruleXml_ ) : base("ServerRule") { RuleName = _ruleName_; ServerPartitionKey = _serverPartitionKey_; ServerRuleTypeEnum = _serverRuleTypeEnum_; ServerRuleApplyTimeEnum = _serverRuleApplyTimeEnum_; Enabled = _enabled_; DefaultRule = _defaultRule_; ExemptRule = _exemptRule_; RuleXml = _ruleXml_; }
public void Apply(ServerRuleApplyTimeEnum applyTime, CommandProcessor theProcessor) { try { if (_studyRulesEngine == null || !_studyRulesEngine.RuleApplyTime.Equals(applyTime)) { _studyRulesEngine = new ServerRulesEngine(applyTime, _location.ServerPartitionKey); _studyRulesEngine.Load(); } List<string> files = GetFirstInstanceInEachStudySeries(); if (files.Count == 0) { string message = String.Format("Unexpectedly unable to find SOP instances for rules engine in each series in study: {0}", _location.StudyInstanceUid); Platform.Log(LogLevel.Error, message); throw new ApplicationException(message); } Platform.Log(LogLevel.Info, "Processing Study Level rules for study {0} on partition {1} at {2} apply time", _location.StudyInstanceUid, _partition.Description, applyTime.Description); foreach (string seriesFilePath in files) { var theFile = new DicomFile(seriesFilePath); theFile.Load(DicomReadOptions.Default); var context = new ServerActionContext(theFile, _location.FilesystemKey, _partition, _location.Key, theProcessor){ RuleEngine = _studyRulesEngine}; _studyRulesEngine.Execute(context); ProcessSeriesRules(theFile, theProcessor); } if (applyTime.Equals(ServerRuleApplyTimeEnum.StudyProcessed)) { // This is a bit kludgy, but we had a problem with studies with only 1 image incorectlly // having archive requests inserted when they were scheduled for deletion. Calling // this command here so that if a delete is inserted at the study level, we will remove // the previously inserted archive request for the study. Note also this has to be done // after the rules engine is executed. theProcessor.AddCommand(new InsertArchiveQueueCommand(_location.ServerPartitionKey, _location.Key)); } } finally { if (_studyRulesEngine!=null) _studyRulesEngine.Complete(_studyRulesEngine.RulesApplied); } }
public DeleteFilesystemQueueCommand(ServerEntityKey storageLocationKey, ServerRuleApplyTimeEnum applyTime) : base("Delete FilesystemQueue") { _storageLocationKey = storageLocationKey; _applyTime = applyTime; }