Spaces:
Sleeping
Sleeping
| /* | |
| * $Id: Target.php 3076 2006-12-18 08:52:12Z fabien $ | |
| * | |
| * 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: 2005/10/04 19:13:44 $ | |
| * @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(TaskPhing $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 TaskPhing) { | |
| // 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 TaskPhing) { | |
| // 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 (Exception $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; | |
| } | |
| } | |