PMA\libraries\Advisor::parseRulesFile PHP Method

parseRulesFile() public static method

Reads the rule file into an array, throwing errors messages on syntax errors.
public static parseRulesFile ( ) : array
return array with parsed data
    public static function parseRulesFile()
    {
        $filename = 'libraries/advisory_rules.txt';
        $file = file($filename, FILE_IGNORE_NEW_LINES);
        $errors = array();
        $rules = array();
        $lines = array();
        if ($file === FALSE) {
            $errors[] = sprintf(__('Error in reading file: The file \'%s\' does not exist or is not readable!'), $filename);
            return array('rules' => $rules, 'lines' => $lines, 'errors' => $errors);
        }
        $ruleSyntax = array('name', 'formula', 'test', 'issue', 'recommendation', 'justification');
        $numRules = count($ruleSyntax);
        $numLines = count($file);
        $ruleNo = -1;
        $ruleLine = -1;
        for ($i = 0; $i < $numLines; $i++) {
            $line = $file[$i];
            if ($line == "" || $line[0] == '#') {
                continue;
            }
            // Reading new rule
            if (substr($line, 0, 4) == 'rule') {
                if ($ruleLine > 0) {
                    $errors[] = sprintf(__('Invalid rule declaration on line %1$s, expected line ' . '%2$s of previous rule.'), $i + 1, $ruleSyntax[$ruleLine++]);
                    continue;
                }
                if (preg_match("/rule\\s'(.*)'( \\[(.*)\\])?\$/", $line, $match)) {
                    $ruleLine = 1;
                    $ruleNo++;
                    $rules[$ruleNo] = array('name' => $match[1]);
                    $lines[$ruleNo] = array('name' => $i + 1);
                    if (isset($match[3])) {
                        $rules[$ruleNo]['precondition'] = $match[3];
                        $lines[$ruleNo]['precondition'] = $i + 1;
                    }
                } else {
                    $errors[] = sprintf(__('Invalid rule declaration on line %s.'), $i + 1);
                }
                continue;
            } else {
                if ($ruleLine == -1) {
                    $errors[] = sprintf(__('Unexpected characters on line %s.'), $i + 1);
                }
            }
            // Reading rule lines
            if ($ruleLine > 0) {
                if (!isset($line[0])) {
                    continue;
                    // Empty lines are ok
                }
                // Non tabbed lines are not
                if ($line[0] != "\t") {
                    $errors[] = sprintf(__('Unexpected character on line %1$s. Expected tab, but ' . 'found "%2$s".'), $i + 1, $line[0]);
                    continue;
                }
                $rules[$ruleNo][$ruleSyntax[$ruleLine]] = chop(mb_substr($line, 1));
                $lines[$ruleNo][$ruleSyntax[$ruleLine]] = $i + 1;
                ++$ruleLine;
            }
            // Rule complete
            if ($ruleLine == $numRules) {
                $ruleLine = -1;
            }
        }
        return array('rules' => $rules, 'lines' => $lines, 'errors' => $errors);
    }

Usage Example

Example #1
0
 /**
  * Test for adding rule
  *
  * @param array  $rule     Rule to test
  * @param array  $expected Expected rendered rule in fired/errors list
  * @param string $error    Expected error string (null if none error expected)
  *
  * @return void
  *
  * @depends testParse
  * @dataProvider rulesProvider
  */
 public function testAddRule($rule, $expected, $error)
 {
     $advisor = new Advisor();
     $parseResult = $advisor->parseRulesFile();
     $this->assertEquals($parseResult['errors'], array());
     $advisor->setVariable('value', 0);
     $advisor->addRule('fired', $rule);
     $runResult = $advisor->getRunResult();
     if (isset($runResult['errors']) || !is_null($error)) {
         $this->assertEquals(array($error), $runResult['errors']);
     }
     if (isset($runResult['fired']) || $expected != array()) {
         $this->assertEquals(array($expected), $runResult['fired']);
     }
 }