/**
  * Apply $rule that was triggered by a change on $artifact
  *
  * @param Tracker_Artifact $artifact
  * @param Tracker_Workflow_Trigger_TriggerRule $rule
  */
 public function process(Tracker_Artifact $artifact, Tracker_Workflow_Trigger_TriggerRule $rule)
 {
     $this->logger->start(__METHOD__, $artifact->getXRef(), $rule->getId());
     $parent = $artifact->getParentWithoutPermissionChecking();
     if ($parent && !$this->parentAlreadyHasTargetValue($parent, $rule)) {
         $this->logger->debug('Parent ' . $parent->getXRef() . ' does not have target value…');
         $processor_strategy = $this->getRuleStrategy($artifact, $rule);
         if ($processor_strategy->allPrecondtionsAreMet()) {
             $this->logger->debug('All preconditions are met…');
             $this->updateParent($parent, $artifact, $rule);
         }
     }
     $this->logger->end(__METHOD__, $artifact->getId(), $rule->getId());
 }
 /**
  * Delete a rule in target tracker
  *
  * @param Tracker $tracker
  * @param Tracker_Workflow_Trigger_TriggerRule $rule
  * @throws Tracker_Workflow_Trigger_Exception_RuleException
  */
 public function delete(Tracker $tracker, Tracker_Workflow_Trigger_TriggerRule $rule)
 {
     if ($rule->getTargetTracker() != $tracker) {
         throw new Tracker_Workflow_Trigger_Exception_RuleException('Cannot delete rules from another tracker');
     }
     try {
         $this->dao->enableExceptionsOnError();
         $this->dao->startTransaction();
         $this->dao->deleteTriggeringFieldsByRuleId($rule->getId());
         $this->dao->deleteTargetByRuleId($rule->getId());
         $this->dao->commit();
     } catch (DataAccessException $exception) {
         throw new Tracker_Workflow_Trigger_Exception_RuleException('Database error: cannot delete rule');
     }
 }