libretime/library/phing/Target.php

318 lines
9.7 KiB
PHP
Raw Blame History

<?php
/*
* $Id: Target.php 905 2010-10-05 16:28:03Z mrook $
*
* 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 <20> 2001,2002 THYRELL. All rights reserved
* @version $Revision: 905 $ $Date: 2010-10-05 18:28:03 +0200 (Tue, 05 Oct 2010) $
* @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;
}
}