// Copyright (c) 2005 DMTF.  All rights reserved.
   [Version ( "2.7.0" ), 
    UMLPackagePath ( "CIM::Policy" ), 
    Description ( 
       "The central class used for representing the \'If Condition "
       "then Action\' semantics of a policy rule. A PolicyRule "
       "condition, in the most general sense, is represented as either "
       "an ORed set of ANDed conditions (Disjunctive Normal Form, or "
       "DNF) or an ANDed set of ORed conditions (Conjunctive Normal "
       "Form, or CNF). Individual conditions may either be negated "
       "(NOT C) or unnegated (C). The actions specified by a "
       "PolicyRule are to be performed if and only if the PolicyRule "
       "condition (whether it is represented in DNF or CNF) evaluates "
       "to TRUE. \n"
       "\n"
       "The conditions and actions associated with a PolicyRule are "
       "modeled, respectively, with subclasses of PolicyCondition and "
       "PolicyAction. These condition and action objects are tied to "
       "instances of PolicyRule by the PolicyConditionInPolicyRule and "
       "PolicyActionInPolicyRule aggregations. \n"
       "\n"
       "A PolicyRule may also be associated with one or more policy "
       "time periods, indicating the schedule according to which the "
       "policy rule is active and inactive. In this case it is the "
       "PolicySetValidityPeriod aggregation that provides this "
       "linkage. \n"
       "\n"
       "The PolicyRule class uses the property ConditionListType, to "
       "indicate whether the conditions for the rule are in DNF "
       "(disjunctive normal form), CNF (conjunctive normal form) or, "
       "in the case of a rule with no conditions, as an "
       "UnconditionalRule. The PolicyConditionInPolicyRule aggregation "
       "contains two additional properties to complete the "
       "representation of the Rule\'s conditional expression. The "
       "first of these properties is an integer to partition the "
       "referenced PolicyConditions into one or more groups, and the "
       "second is a Boolean to indicate whether a referenced Condition "
       "is negated. An example shows how ConditionListType and these "
       "two additional properties provide a unique representation of a "
       "set of PolicyConditions in either DNF or CNF. \n"
       "\n"
       "Suppose we have a PolicyRule that aggregates five "
       "PolicyConditions C1 through C5, with the following values in "
       "the properties of the five PolicyConditionInPolicyRule "
       "associations: \n"
       "C1: GroupNumber = 1, ConditionNegated = FALSE \n"
       "C2: GroupNumber = 1, ConditionNegated = TRUE \n"
       "C3: GroupNumber = 1, ConditionNegated = FALSE \n"
       "C4: GroupNumber = 2, ConditionNegated = FALSE \n"
       "C5: GroupNumber = 2, ConditionNegated = FALSE \n"
       "\n"
       "If ConditionListType = DNF, then the overall condition for the "
       "PolicyRule is: \n"
       "(C1 AND (NOT C2) AND C3) OR (C4 AND C5) \n"
       "\n"
       "On the other hand, if ConditionListType = CNF, then the "
       "overall condition for the PolicyRule is: \n"
       "(C1 OR (NOT C2) OR C3) AND (C4 OR C5) \n"
       "\n"
       "In both cases, there is an unambiguous specification of the "
       "overall condition that is tested to determine whether to "
       "perform the PolicyActions associated with the PolicyRule. \n"
       "\n"
       "PolicyRule instances may also be used to aggregate other "
       "PolicyRules and/or PolicyGroups. When used in this way to "
       "implement nested rules, the conditions of the aggregating rule "
       "apply to the subordinate rules as well. However, any side "
       "effects of condition evaluation or the execution of actions "
       "MUST NOT affect the result of the evaluation of other "
       "conditions evaluated by the rule engine in the same evaluation "
       "pass. That is, an implementation of a rule engine MAY evaluate "
       "all conditions in any order before applying the priority and "
       "determining which actions are to be executed." )]
class CIM_PolicyRule : CIM_PolicySet {

      [Key, Description ( "The scoping System\'s CreationClassName." ), 
       MaxLen ( 256 ), 
       Propagated ( "CIM_System.CreationClassName" )]
   string SystemCreationClassName;

      [Key, Description ( "The scoping System\'s Name." ), 
       MaxLen ( 256 ), 
       Propagated ( "CIM_System.Name" )]
   string SystemName;

      [Key, Description ( 
          "CreationClassName indicates the name of the class or the "
          "subclass used in the creation of an instance. When used "
          "with the other key properties of this class, this "
          "property allows all instances of this class and its "
          "subclasses to be uniquely identified." ), 
       MaxLen ( 256 )]
   string CreationClassName;

      [Key, Description ( "A user-friendly name of this PolicyRule." ), 
       MaxLen ( 256 )]
   string PolicyRuleName;

      [Description ( 
          "Indicates whether the list of PolicyConditions "
          "associated with this PolicyRule is in disjunctive normal "
          "form (DNF), conjunctive normal form (CNF), or has no "
          "conditions (i.e., is an UnconditionalRule) and is "
          "automatically evaluated to \"True.\" The default value "
          "is 1 (\"DNF\")." ), 
       ValueMap { "0", "1", "2" }, 
       Values { "Unconditional Rule", "DNF", "CNF" }]
   uint16 ConditionListType = 1;

      [Description ( 
          "A free-form string that can be used to provide "
          "guidelines on how this PolicyRule should be used." )]
   string RuleUsage;

      [Deprecated { "CIM_PolicySetComponent.Priority" }, 
       Description ( 
          "PolicyRule.Priority is deprecated and replaced by "
          "providing the priority for a rule (and a group) in the "
          "context of the aggregating PolicySet instead of the "
          "priority being used for all aggregating PolicySet "
          "instances. Thus, the assignment of priority values is "
          "much simpler. \n"
          "\n"
          "A non-negative integer for prioritizing this Policy Rule "
          "relative to other Rules. A larger value indicates a "
          "higher priority. The default value is 0." )]
   uint16 Priority = 0;

      [Deprecated { "No value" }, 
       Description ( 
          "A flag indicating that the evaluation of the Policy "
          "Conditions and execution of PolicyActions (if the "
          "Conditions evaluate to TRUE) is required. The evaluation "
          "of a PolicyRule MUST be attempted if the Mandatory "
          "property value is TRUE. If the Mandatory property is "
          "FALSE, then the evaluation of the Rule is \'best effort\' "
          "and MAY be ignored." )]
   boolean Mandatory;

      [Description ( 
          "This property gives a policy administrator a way of "
          "specifying how the ordering of the PolicyActions "
          "associated with this PolicyRule is to be interpreted. "
          "Three values are supported: \n"
          "o mandatory(1): Do the actions in the indicated order, "
          "or don\'t do them at all. \n"
          "o recommended(2): Do the actions in the indicated order "
          "if you can, but if you can\'t do them in this order, do "
          "them in another order if you can. \n"
          "o dontCare(3): Do them -- I don\'t care about the order. \n"
          "The default value is 3 (\"DontCare\")." ), 
       ValueMap { "1", "2", "3" }, 
       Values { "Mandatory", "Recommended", "Dont Care" }]
   uint16 SequencedActions = 3;

      [Description ( 
          "ExecutionStrategy defines the strategy to be used in "
          "executing the sequenced actions aggregated by this "
          "PolicyRule. There are three execution strategies: \n"
          "\n"
          "Do Until Success - execute actions according to "
          "predefined order, until successful execution of a single "
          "action. \n"
          "Do All - execute ALL actions which are part of the "
          "modeled set, according to their predefined order. "
          "Continue doing this, even if one or more of the actions "
          "fails. \n"
          "Do Until Failure - execute actions according to "
          "predefined order, until the first failure in execution "
          "of an action instance." ), 
       ValueMap { "1", "2", "3" }, 
       Values { "Do Until Success", "Do All", "Do Until Failure" }]
   uint16 ExecutionStrategy;


};
