private static void ValidateNode(SequencingRuleNodeReader nodeReader) { if (nodeReader == null) { return; } ValidateCollection(nodeReader.Conditions); // caught BadProperties2 ValidateProperty(nodeReader.Action); // caught BadProperties2 ValidateProperty(nodeReader.Combination); // caught BadProperties3 }
private bool SequencingRuleCheck(Activity activity, SequencingRuleNodeReader rule) // [UP.2.1] (for an activity and a Sequencing Rule; returns True if the rule applies, False if the rule does not apply, and Unknown if the condition(s) cannot be evaluated): { bool? bRet = null; bool firstRule = true; // Evaluate each condition against the activity's tracking information foreach(SequencingRuleConditionNodeReader condition in rule.Conditions) { bool? b = null; bool objectiveMeasureStatus; float objectiveNormalizedMeasure; bool progressStatus; bool satisfiedStatus; switch(condition.Condition) { case SequencingRuleCondition.Always: b = true; break; case SequencingRuleCondition.Satisfied: GetObjectiveSatisfiedStatus(activity, condition.ReferencedObjectiveId, out progressStatus, out satisfiedStatus); if(progressStatus) { b = satisfiedStatus; } break; case SequencingRuleCondition.ObjectiveStatusKnown: GetObjectiveSatisfiedStatus(activity, condition.ReferencedObjectiveId, out progressStatus, out satisfiedStatus); b = progressStatus; break; case SequencingRuleCondition.ObjectiveMeasureKnown: GetObjectiveNormalizedMeasure(activity, condition.ReferencedObjectiveId, out objectiveMeasureStatus, out objectiveNormalizedMeasure); b = objectiveMeasureStatus; break; case SequencingRuleCondition.ObjectiveMeasureGreaterThan: GetObjectiveNormalizedMeasure(activity, condition.ReferencedObjectiveId, out objectiveMeasureStatus, out objectiveNormalizedMeasure); if(objectiveMeasureStatus) { b = (objectiveNormalizedMeasure > (float)condition.MeasureThreshold); } break; case SequencingRuleCondition.ObjectiveMeasureLessThan: GetObjectiveNormalizedMeasure(activity, condition.ReferencedObjectiveId, out objectiveMeasureStatus, out objectiveNormalizedMeasure); if(objectiveMeasureStatus) { b = (objectiveNormalizedMeasure < (float)condition.MeasureThreshold); } break; case SequencingRuleCondition.Completed: if(activity.DataModel.AttemptProgressStatus) { b = activity.DataModel.AttemptCompletionStatus; } break; case SequencingRuleCondition.ActivityProgressKnown: b = activity.DataModel.ActivityProgressStatus & activity.DataModel.AttemptProgressStatus; break; case SequencingRuleCondition.Attempted: //if(activity.DataModel.ActivityProgressStatus) //{ b = (activity.DataModel.ActivityAttemptCount > 0); //} break; case SequencingRuleCondition.AttemptLimitExceeded: //if(activity.DataModel.ActivityProgressStatus) //{ b = (activity.DataModel.ActivityAttemptCount >= activity.Sequencing.AttemptLimit); //} break; case SequencingRuleCondition.OutsideAvailableTimeRange: // not supported b = false; break; case SequencingRuleCondition.TimeLimitExceeded: // not supported b = false; break; default: Utilities.Assert(false); b = false; break; } if(condition.Operator == SequencingConditionOperator.Not && b.HasValue) { b = !b; } if(rule.Combination == SequencingConditionCombination.All) { if(firstRule) { firstRule = false; bRet = b; } else { // perform AND as per truth table on page SN-4-36 switch(b) { case true: // any value AND with true results in that same value break; case false: // any value AND with false results in false bRet = false; break; case null: // true or unknown AND with unknown results in unknown // false AND with unknown results in false if(bRet != false) { bRet = null; } break; } } } else { if(firstRule) { firstRule = false; bRet = b; } else { // perform OR as per truth table on page SN-4-36 switch(b) { case true: // any value OR with true results in true bRet = true; break; case false: // any value OR with false results that same value break; case null: // false or unknown OR with unknown results in unknown // true OR with unknown results in true if(bRet != true) { bRet = null; } break; } } } } return (bRet == true); }