示例#1
0
 protected function doesRuleMatch(HeraldRule $rule, HeraldObjectAdapter $object)
 {
     $id = $rule->getID();
     if (isset($this->results[$id])) {
         // If we've already evaluated this rule because another rule depends
         // on it, we don't need to reevaluate it.
         return $this->results[$id];
     }
     if (isset($this->stack[$id])) {
         // We've recursed, fail all of the rules on the stack. This happens when
         // there's a dependency cycle with "Rule conditions match for rule ..."
         // conditions.
         foreach ($this->stack as $rule_id => $ignored) {
             $this->results[$rule_id] = false;
         }
         throw new HeraldRecursiveConditionsException();
     }
     $this->stack[$id] = true;
     $all = $rule->getMustMatchAll();
     $conditions = $rule->getConditions();
     $result = null;
     $local_version = id(new HeraldRule())->getConfigVersion();
     if ($rule->getConfigVersion() > $local_version) {
         $reason = "Rule could not be processed, it was created with a newer " . "version of Herald.";
         $result = false;
     } else {
         if (!$conditions) {
             $reason = "Rule failed automatically because it has no conditions.";
             $result = false;
         } else {
             if ($rule->hasInvalidOwner()) {
                 $reason = "Rule failed automatically because its owner is invalid " . "or disabled.";
                 $result = false;
             } else {
                 foreach ($conditions as $condition) {
                     $match = $this->doesConditionMatch($rule, $condition, $object);
                     if (!$all && $match) {
                         $reason = "Any condition matched.";
                         $result = true;
                         break;
                     }
                     if ($all && !$match) {
                         $reason = "Not all conditions matched.";
                         $result = false;
                         break;
                     }
                 }
                 if ($result === null) {
                     if ($all) {
                         $reason = "All conditions matched.";
                         $result = true;
                     } else {
                         $reason = "No conditions matched.";
                         $result = false;
                     }
                 }
             }
         }
     }
     $rule_transcript = new HeraldRuleTranscript();
     $rule_transcript->setRuleID($rule->getID());
     $rule_transcript->setResult($result);
     $rule_transcript->setReason($reason);
     $rule_transcript->setRuleName($rule->getName());
     $rule_transcript->setRuleOwner($rule->getAuthorPHID());
     $this->transcript->addRuleTranscript($rule_transcript);
     return $result;
 }