Exemple #1
0
		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();
		}
Exemple #2
0
		/// <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);
                }
			}

			
		}
Exemple #3
0
 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_;
 }
Exemple #4
0
 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;
		}