Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/** $Id: Target.php 175 2007-03-14 13:52:03Z hans $** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.** This software consists of voluntary contributions made by many individuals* and is licensed under the LGPL. For more information please see* <http://phing.info>.*/include_once 'phing/TaskContainer.php';/*** The Target component. Carries all required target data. Implements the* abstract class {@link TaskContainer}** @author Andreas Aderhold <andi@binarycloud.com>* @copyright � 2001,2002 THYRELL. All rights reserved* @version $Revision: 1.10 $ $Date: 2007-03-14 14:52:03 +0100 (Wed, 14 Mar 2007) $* @access public* @see TaskContainer* @package phing*/class Target implements TaskContainer {/** name of target */private $name;/** dependencies */private $dependencies = array();/** holds objects of children of this target */private $children = array();/** the if cond. from xml */private $ifCondition = "";/** the unless cond. from xml */private $unlessCondition = "";/** description of this target */private $description;/** reference to project */private $project;/*** References the project to the current component.** @param Project The reference to the current project*/public function setProject(Project $project) {$this->project = $project;}/*** Returns reference to current project** @return Project Reference to current porject object*/public function getProject() {return $this->project;}/*** Sets the target dependencies from xml** @param string $depends Comma separated list of targetnames that depend on* this target* @throws BuildException*/public function setDepends($depends) {// explode should be faster than strtok$deps = explode(',', $depends);for ($i=0, $size=count($deps); $i < $size; $i++) {$trimmed = trim($deps[$i]);if ($trimmed === "") {throw new BuildException("Syntax Error: Depend attribute for target ".$this->getName()." is malformed.");}$this->addDependency($trimmed);}}/*** Adds a singular dependent target name to the list** @param string The dependency target to add* @access public*/public function addDependency($dependency) {$this->dependencies[] = (string) $dependency;}/*** Returns reference to indexed array of the dependencies this target has.** @return array Referece to target dependencoes*/public function getDependencies() {return $this->dependencies;}/*** Sets the name of the target** @param string Name of this target*/public function setName($name) {$this->name = (string) $name;}/*** Returns name of this target.** @return string The name of the target* @access public*/function getName() {return (string) $this->name;}/*** Adds a task element to the list of this targets child elements** @param object The task object to add* @access public*/function addTask(Task $task) {$this->children[] = $task;}/*** Adds a runtime configurable element to the list of this targets child* elements.** @param object The RuntimeConfigurabel object* @access public*/function addDataType($rtc) {$this->children[] = $rtc;}/*** Returns an array of all tasks this target has as childrens.** The task objects are copied here. Don't use this method to modify* task objects.** @return array Task[]*/public function getTasks() {$tasks = array();for ($i=0,$size=count($this->children); $i < $size; $i++) {$tsk = $this->children[$i];if ($tsk instanceof Task) {// note: we're copying objects here!$tasks[] = clone $tsk;}}return $tasks;}/*** Set the if-condition from the XML tag, if any. The property name given* as parameter must be present so the if condition evaluates to true** @param string The property name that has to be present* @access public*/public function setIf($property) {$this->ifCondition = ($property === null) ? "" : $property;}/*** Set the unless-condition from the XML tag, if any. The property name* given as parameter must be present so the unless condition evaluates* to true** @param string The property name that has to be present* @access public*/public function setUnless($property) {$this->unlessCondition = ($property === null) ? "" : $property;}/*** Sets a textual description of this target.** @param string The description text*/public function setDescription($description) {if ($description !== null && strcmp($description, "") !== 0) {$this->description = (string) $description;} else {$this->description = null;}}/*** Returns the description of this target.** @return string The description text of this target*/public function getDescription() {return $this->description;}/*** Returns a string representation of this target. In our case it* simply returns the target name field** @return string The string representation of this target*/function toString() {return (string) $this->name;}/*** The entry point for this class. Does some checking, then processes and* performs the tasks for this target.**/public function main() {if ($this->testIfCondition() && $this->testUnlessCondition()) {foreach($this->children as $o) {if ($o instanceof Task) {// child is a task$o->perform();} else {// child is a RuntimeConfigurable$o->maybeConfigure($this->project);}}} elseif (!$this->testIfCondition()) {$this->project->log("Skipped target '".$this->name."' because property '".$this->ifCondition."' not set.", Project::MSG_VERBOSE);} else {$this->project->log("Skipped target '".$this->name."' because property '".$this->unlessCondition."' set.", Project::MSG_VERBOSE);}}/*** Performs the tasks by calling the main method of this target that* actually executes the tasks.** This method is for ZE2 and used for proper exception handling of* task exceptions.*/public function performTasks() {try {// try to execute this target$this->project->fireTargetStarted($this);$this->main();$this->project->fireTargetFinished($this, $null=null);} catch (BuildException $exc) {// log here and rethrow$this->project->fireTargetFinished($this, $exc);throw $exc;}}/*** Tests if the property set in ifConfiditon exists.** @return boolean <code>true</code> if the property specified* in <code>$this->ifCondition</code> exists;* <code>false</code> otherwise*/private function testIfCondition() {if ($this->ifCondition === "") {return true;}$properties = explode(",", $this->ifCondition);$result = true;foreach ($properties as $property) {$test = ProjectConfigurator::replaceProperties($this->getProject(), $property, $this->project->getProperties());$result = $result && ($this->project->getProperty($test) !== null);}return $result;}/*** Tests if the property set in unlessCondition exists.** @return boolean <code>true</code> if the property specified* in <code>$this->unlessCondition</code> exists;* <code>false</code> otherwise*/private function testUnlessCondition() {if ($this->unlessCondition === "") {return true;}$properties = explode(",", $this->unlessCondition);$result = true;foreach ($properties as $property) {$test = ProjectConfigurator::replaceProperties($this->getProject(), $property, $this->project->getProperties());$result = $result && ($this->project->getProperty($test) === null);}return $result;}}