. */ require_once 'phing/Task.php'; require_once 'phing/system/io/FileSystem.php'; include_once 'phing/tasks/system/PhingTask.php'; /** * task * * Task definition for the foreach task. This task takes a list with * delimited values, and executes a target with set param. * * Usage: * * * Attributes: * list --> The list of values to process, with the delimiter character, * indicated by the "delimiter" attribute, separating each value. * target --> The target to call for each token, passing the token as the * parameter with the name indicated by the "param" attribute. * param --> The name of the parameter to pass the tokens in as to the * target. * delimiter --> The delimiter string that separates the values in the "list" * parameter. The default is ",". * * @author Jason Hines * @author Hans Lellelid * @version $Revision: 905 $ * @package phing.tasks.system */ class ForeachTask extends Task { /** Delimter-separated list of values to process. */ private $list; /** Name of parameter to pass to callee */ private $param; /** Name of absolute path parameter to pass to callee */ private $absparam; /** Delimiter that separates items in $list */ private $delimiter = ','; /** * PhingCallTask that will be invoked w/ calleeTarget. * @var PhingCallTask */ private $callee; /** Array of filesets */ private $filesets = array(); /** * Target to execute. * @var string */ private $calleeTarget; function init() { $this->callee = $this->project->createTask("phingcall"); $this->callee->setOwningTarget($this->getOwningTarget()); $this->callee->setTaskName($this->getTaskName()); $this->callee->setLocation($this->getLocation()); $this->callee->init(); } /** * This method does the work. * @return void */ function main() { if ($this->list === null && count($this->filesets) == 0) { throw new BuildException("Need either list or nested fileset to iterate through"); } if ($this->param === null) { throw new BuildException("You must supply a property name to set on each iteration in param"); } if ($this->calleeTarget === null) { throw new BuildException("You must supply a target to perform"); } $callee = $this->callee; $callee->setTarget($this->calleeTarget); $callee->setInheritAll(true); $callee->setInheritRefs(true); if (trim($this->list)) { $arr = explode($this->delimiter, $this->list); foreach ($arr as $value) { $value = trim($value); $this->log("Setting param '$this->param' to value '$value'", Project::MSG_VERBOSE); $prop = $callee->createProperty(); $prop->setOverride(true); $prop->setName($this->param); $prop->setValue($value); $callee->main(); } } $total_files = 0; $total_dirs = 0; // filesets foreach ($this->filesets as $fs) { $ds = $fs->getDirectoryScanner($this->project); $fromDir = $fs->getDir($this->project); $srcFiles = $ds->getIncludedFiles(); $srcDirs = $ds->getIncludedDirectories(); $this->log(count($srcDirs) . ' directories and ' . count($srcFiles) . ' files', Project::MSG_VERBOSE); $filecount = count($srcFiles); $total_files = $total_files + $filecount; for ($j = 0; $j < $filecount; $j++) { $value = $srcFiles[$j]; if ($this->param) { $this->log("Setting param '$this->param' to value '$value'", Project::MSG_VERBOSE); $prop = $callee->createProperty(); $prop->setOverride(true); $prop->setName($this->param); $prop->setValue($value); } if ($this->absparam) { $prop = $callee->createProperty(); $prop->setOverride(true); $prop->setName($this->absparam); $prop->setValue($fromDir . FileSystem::getFileSystem()->getSeparator() . $value); } $callee->main(); } $dircount = count($srcDirs); $total_dirs = $total_dirs + $dircount; for ($j = 0; $j < $dircount; $j++) { $value = $srcDirs[$j]; if ($this->param) { $this->log("Setting param '$this->param' to value '$value'", Project::MSG_VERBOSE); $prop = $callee->createProperty(); $prop->setOverride(true); $prop->setName($this->param); $prop->setValue($value); } if ($this->absparam) { $prop = $callee->createProperty(); $prop->setOverride(true); $prop->setName($this->absparam); $prop->setValue($fromDir . FileSystem::getFileSystem()->getSeparator() . $value); } $callee->main(); } } } function setList($list) { $this->list = (string) $list; } function setTarget($target) { $this->calleeTarget = (string) $target; } function setParam($param) { $this->param = (string) $param; } function setAbsparam($absparam) { $this->absparam = (string) $absparam; } function setDelimiter($delimiter) { $this->delimiter = (string) $delimiter; } /** * Nested creator, adds a set of files (nested fileset attribute). */ function createFileSet() { $num = array_push($this->filesets, new FileSet()); return $this->filesets[$num-1]; } /** * @return Property */ function createProperty() { return $this->callee->createProperty(); } }