home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / phing / Target.php < prev    next >
Encoding:
PHP Script  |  2007-03-14  |  9.7 KB  |  318 lines

  1. <?php
  2. /*
  3.  * $Id: Target.php 175 2007-03-14 13:52:03Z hans $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information please see
  19.  * <http://phing.info>.
  20.  */
  21.  
  22. include_once 'phing/TaskContainer.php';
  23.  
  24. /**
  25.  *  The Target component. Carries all required target data. Implements the
  26.  *  abstract class {@link TaskContainer}
  27.  *
  28.  *  @author    Andreas Aderhold <andi@binarycloud.com>
  29.  *  @copyright ∩┐╜ 2001,2002 THYRELL. All rights reserved
  30.  *  @version   $Revision: 1.10 $ $Date: 2007-03-14 14:52:03 +0100 (Wed, 14 Mar 2007) $
  31.  *  @access    public
  32.  *  @see       TaskContainer
  33.  *  @package   phing
  34.  */
  35.  
  36. class Target implements TaskContainer {
  37.     
  38.     /** name of target */
  39.     private $name;
  40.     
  41.     /** dependencies */
  42.     private $dependencies = array();
  43.     
  44.     /** holds objects of children of this target */
  45.     private $children = array();
  46.     
  47.     /** the if cond. from xml */
  48.     private $ifCondition = "";
  49.     
  50.     /** the unless cond. from xml */
  51.     private $unlessCondition = "";
  52.     
  53.     /** description of this target */
  54.     private $description;
  55.     
  56.     /** reference to project */
  57.     private $project;
  58.  
  59.     /**
  60.      *  References the project to the current component.
  61.      *
  62.      *  @param Project The reference to the current project
  63.      */
  64.     public function setProject(Project $project) {
  65.         $this->project = $project;
  66.     }
  67.  
  68.     /**
  69.      *  Returns reference to current project
  70.      *
  71.      *  @return Project Reference to current porject object
  72.      */
  73.     public function getProject() {
  74.         return $this->project;
  75.     }
  76.  
  77.     /**
  78.      *  Sets the target dependencies from xml
  79.      *
  80.      *  @param string $depends Comma separated list of targetnames that depend on
  81.      *                  this target
  82.      *  @throws BuildException
  83.      */
  84.     public function setDepends($depends) {
  85.         // explode should be faster than strtok
  86.         $deps = explode(',', $depends);
  87.         for ($i=0, $size=count($deps); $i < $size; $i++) {
  88.             $trimmed = trim($deps[$i]);
  89.             if ($trimmed === "") {
  90.                 throw new BuildException("Syntax Error: Depend attribute for target ".$this->getName()." is malformed.");
  91.             } 
  92.             $this->addDependency($trimmed);
  93.         }
  94.     }
  95.  
  96.     /**
  97.      *  Adds a singular dependent target name to the list
  98.      *
  99.      *  @param   string   The dependency target to add
  100.      *  @access  public
  101.      */
  102.     public function addDependency($dependency) {
  103.         $this->dependencies[] = (string) $dependency;
  104.     }
  105.  
  106.     /**
  107.      *  Returns reference to indexed array of the dependencies this target has.
  108.      *
  109.      *  @return  array  Referece to target dependencoes
  110.      */
  111.     public function getDependencies() {
  112.         return $this->dependencies;
  113.     }
  114.  
  115.     /**
  116.      *  Sets the name of the target
  117.      *
  118.      *  @param  string   Name of this target
  119.      */
  120.     public function setName($name) {
  121.         $this->name = (string) $name;
  122.     }
  123.  
  124.     /**
  125.      *  Returns name of this target.
  126.      *
  127.      *  @return  string     The name of the target
  128.      *  @access   public
  129.      */
  130.     function getName() {
  131.         return (string) $this->name;
  132.     }
  133.  
  134.     /**
  135.      *  Adds a task element to the list of this targets child elements
  136.      *
  137.      *  @param   object  The task object to add
  138.      *  @access  public
  139.      */
  140.     function addTask(Task $task) {
  141.         $this->children[] = $task;
  142.     }
  143.  
  144.     /**
  145.      *  Adds a runtime configurable element to the list of this targets child
  146.      *  elements.
  147.      *
  148.      *  @param   object  The RuntimeConfigurabel object
  149.      *  @access  public
  150.      */
  151.     function addDataType($rtc) {
  152.         $this->children[] = $rtc;
  153.     }
  154.  
  155.     /**
  156.      *  Returns an array of all tasks this target has as childrens.
  157.      *
  158.      *  The task objects are copied here. Don't use this method to modify
  159.      *  task objects.
  160.      *
  161.      *  @return  array  Task[]
  162.      */
  163.     public function getTasks() {
  164.         $tasks = array();
  165.         for ($i=0,$size=count($this->children); $i < $size; $i++) {
  166.             $tsk = $this->children[$i];
  167.             if ($tsk instanceof Task) {
  168.                 // note: we're copying objects here!
  169.                 $tasks[] = clone $tsk;
  170.             }
  171.         }
  172.         return $tasks;
  173.     }
  174.  
  175.     /**
  176.      *  Set the if-condition from the XML tag, if any. The property name given
  177.      *  as parameter must be present so the if condition evaluates to true
  178.      *
  179.      *  @param   string  The property name that has to be present
  180.      *  @access  public
  181.      */
  182.     public function setIf($property) {
  183.         $this->ifCondition = ($property === null) ? "" : $property;
  184.     }
  185.  
  186.     /**
  187.      *  Set the unless-condition from the XML tag, if any. The property name
  188.      *  given as parameter must be present so the unless condition evaluates
  189.      *  to true
  190.      *
  191.      *  @param   string  The property name that has to be present
  192.      *  @access  public
  193.      */
  194.     public function setUnless($property) {
  195.         $this->unlessCondition = ($property === null) ? "" : $property;
  196.     }
  197.  
  198.     /**
  199.      *  Sets a textual description of this target.
  200.      *
  201.      *  @param string The description text
  202.      */
  203.     public function setDescription($description) {
  204.         if ($description !== null && strcmp($description, "") !== 0) {
  205.             $this->description = (string) $description;
  206.         } else {
  207.             $this->description = null;
  208.         }
  209.     }
  210.  
  211.     /**
  212.      *  Returns the description of this target.
  213.      *
  214.      *  @return string The description text of this target
  215.      */
  216.     public function getDescription() {
  217.         return $this->description;
  218.     }
  219.  
  220.     /**
  221.      *  Returns a string representation of this target. In our case it
  222.      *  simply returns the target name field
  223.      *
  224.      *  @return string The string representation of this target
  225.      */
  226.     function toString() {
  227.         return (string) $this->name;
  228.     }
  229.  
  230.     /**
  231.      *  The entry point for this class. Does some checking, then processes and
  232.      *  performs the tasks for this target.
  233.      *
  234.      */
  235.     public function main() {
  236.         if ($this->testIfCondition() && $this->testUnlessCondition()) {
  237.             foreach($this->children as $o) {
  238.                 if ($o instanceof Task) {
  239.                     // child is a task
  240.                     $o->perform();
  241.                 } else {
  242.                     // child is a RuntimeConfigurable
  243.                     $o->maybeConfigure($this->project);
  244.                 }
  245.             }
  246.         } elseif (!$this->testIfCondition()) {
  247.             $this->project->log("Skipped target '".$this->name."' because property '".$this->ifCondition."' not set.", Project::MSG_VERBOSE);
  248.         } else {
  249.             $this->project->log("Skipped target '".$this->name."' because property '".$this->unlessCondition."' set.", Project::MSG_VERBOSE);
  250.         }
  251.     }
  252.  
  253.     /**
  254.      *  Performs the tasks by calling the main method of this target that
  255.      *  actually executes the tasks.
  256.      *
  257.      *  This method is for ZE2 and used for proper exception handling of
  258.      *  task exceptions.
  259.      */
  260.     public function performTasks() {
  261.         try {// try to execute this target
  262.             $this->project->fireTargetStarted($this);
  263.             $this->main();
  264.             $this->project->fireTargetFinished($this, $null=null);
  265.         } catch (BuildException $exc) {
  266.             // log here and rethrow
  267.             $this->project->fireTargetFinished($this, $exc);
  268.             throw $exc;
  269.         }
  270.     }    
  271.  
  272.     /**
  273.      *  Tests if the property set in ifConfiditon exists.
  274.      *
  275.      *  @return  boolean  <code>true</code> if the property specified
  276.      *                    in <code>$this->ifCondition</code> exists;
  277.      *                    <code>false</code> otherwise
  278.      */
  279.     private function testIfCondition() {
  280.         if ($this->ifCondition === "") {
  281.             return true;
  282.         }
  283.  
  284.         $properties = explode(",", $this->ifCondition);
  285.  
  286.         $result = true;
  287.         foreach ($properties as $property) {
  288.             $test = ProjectConfigurator::replaceProperties($this->getProject(), $property, $this->project->getProperties());
  289.             $result = $result && ($this->project->getProperty($test) !== null);
  290.         }
  291.  
  292.         return $result;
  293.     }
  294.  
  295.     /**
  296.      *  Tests if the property set in unlessCondition exists.
  297.      *
  298.      *  @return  boolean  <code>true</code> if the property specified
  299.      *                    in <code>$this->unlessCondition</code> exists;
  300.      *                    <code>false</code> otherwise
  301.      */
  302.     private function testUnlessCondition() {
  303.         if ($this->unlessCondition === "") {
  304.             return true;
  305.         }
  306.         
  307.         $properties = explode(",", $this->unlessCondition);
  308.  
  309.         $result = true;
  310.         foreach ($properties as $property) {
  311.             $test = ProjectConfigurator::replaceProperties($this->getProject(), $property, $this->project->getProperties());
  312.             $result = $result && ($this->project->getProperty($test) === null);
  313.         }
  314.         return $result;
  315.     }
  316.  
  317. }
  318.