예제 #1
0
 /**
  * This method will create a single rule instance and add it to the given
  * {@link \PHPMD\RuleSet} object.
  *
  * @param \PHPMD\RuleSet $ruleSet
  * @param \SimpleXMLElement $ruleNode
  * @return void
  * @throws \PHPMD\RuleClassFileNotFoundException
  * @throws \PHPMD\RuleClassNotFoundException
  */
 private function parseSingleRuleNode(RuleSet $ruleSet, \SimpleXMLElement $ruleNode)
 {
     $fileName = "";
     $ruleSetFolderPath = dirname($ruleSet->getFileName());
     if (isset($ruleNode['file'])) {
         if (is_readable((string) $ruleNode['file'])) {
             $fileName = (string) $ruleNode['file'];
         } elseif (is_readable($ruleSetFolderPath . DIRECTORY_SEPARATOR . (string) $ruleNode['file'])) {
             $fileName = $ruleSetFolderPath . DIRECTORY_SEPARATOR . (string) $ruleNode['file'];
         }
     }
     $className = (string) $ruleNode['class'];
     if (!is_readable($fileName)) {
         $fileName = strtr($className, '\\', '/') . '.php';
     }
     if (!is_readable($fileName)) {
         $fileName = str_replace(array('\\', '_'), '/', $className) . '.php';
     }
     if (class_exists($className) === false) {
         $handle = @fopen($fileName, 'r', true);
         if ($handle === false) {
             throw new RuleClassFileNotFoundException($className);
         }
         fclose($handle);
         include_once $fileName;
         if (class_exists($className) === false) {
             throw new RuleClassNotFoundException($className);
         }
     }
     /* @var $rule \PHPMD\Rule */
     $rule = new $className();
     $rule->setName((string) $ruleNode['name']);
     $rule->setMessage((string) $ruleNode['message']);
     $rule->setExternalInfoUrl((string) $ruleNode['externalInfoUrl']);
     $rule->setRuleSetName($ruleSet->getName());
     if (trim($ruleNode['since']) !== '') {
         $rule->setSince((string) $ruleNode['since']);
     }
     foreach ($ruleNode->children() as $node) {
         if ($node->getName() === 'description') {
             $rule->setDescription((string) $node);
         } elseif ($node->getName() === 'example') {
             $rule->addExample((string) $node);
         } elseif ($node->getName() === 'priority') {
             $rule->setPriority((int) $node);
         } elseif ($node->getName() === 'properties') {
             $this->parsePropertiesNode($rule, $node);
         }
     }
     if ($rule->getPriority() <= $this->minimumPriority) {
         $ruleSet->addRule($rule);
     }
 }