. */ include_once 'phing/filters/BaseParamFilterReader.php'; include_once 'phing/types/RegularExpression.php'; include_once 'phing/filters/ChainableReader.php'; /** * Filter which includes only those lines that contain the user-specified * regular expression matching strings. * * Example: *

 *   
 * 
* * Or: * *

 *    
 * 
* * This will fetch all those lines that contain the pattern foo * * @author Yannick Lecaillez * @author Hans Lellelid * @version $Id$ * @see FilterReader * @package phing.filters */ class LineContainsRegexp extends BaseParamFilterReader implements ChainableReader { /** * Parameter name for regular expression. * @var string */ const REGEXP_KEY = "regexp"; /** * Regular expressions that are applied against lines. * @var array */ private $_regexps = array(); /** * Returns all lines in a buffer that contain specified strings. * @return mixed buffer, -1 on EOF */ function read($len = null) { if ( !$this->getInitialized() ) { $this->_initialize(); $this->setInitialized(true); } $buffer = $this->in->read($len); if ($buffer === -1) { return -1; } $lines = explode("\n", $buffer); $matched = array(); $regexpsSize = count($this->_regexps); foreach($lines as $line) { for($i = 0 ; $i<$regexpsSize ; $i++) { $regexp = $this->_regexps[$i]; $re = $regexp->getRegexp($this->getProject()); $matches = $re->matches($line); if ( !$matches ) { $line = null; break; } } if($line !== null) { $matched[] = $line; } } $filtered_buffer = implode("\n", $matched); return $filtered_buffer; } /** * Adds a regexp element. * * @return object regExp The regexp element added. */ function createRegexp() { $num = array_push($this->_regexps, new RegularExpression()); return $this->_regexps[$num-1]; } /** * Sets the vector of regular expressions which must be contained within * a line read from the original stream in order for it to match this * filter. * * @param regexps An array of regular expressions which must be contained * within a line in order for it to match in this filter. Must not be * null. */ function setRegexps($regexps) { // type check, error must never occur, bad code of it does if ( !is_array($regexps) ) { throw new Exception("Excpected an 'array', got something else"); } $this->_regexps = $regexps; } /** * Returns the array of regular expressions which must be contained within * a line read from the original stream in order for it to match this * filter. * * @return array The array of regular expressions which must be contained within * a line read from the original stream in order for it to match this * filter. The returned object is "live" - in other words, changes made to * the returned object are mirrored in the filter. */ function getRegexps() { return $this->_regexps; } /** * Creates a new LineContainsRegExp using the passed in * Reader for instantiation. * * @param object A Reader object providing the underlying stream. * Must not be null. * * @return object A new filter based on this configuration, but filtering * the specified reader */ function chain(Reader $reader) { $newFilter = new LineContainsRegExp($reader); $newFilter->setRegexps($this->getRegexps()); $newFilter->setInitialized(true); $newFilter->setProject($this->getProject()); return $newFilter; } /** * Parses parameters to add user defined regular expressions. */ private function _initialize() { $params = $this->getParameters(); if ( $params !== null ) { for($i = 0 ; $igetType() ) { $pattern = $params[$i]->getValue(); $regexp = new RegularExpression(); $regexp->setPattern($pattern); array_push($this->_regexps, $regexp); } } } } }