sintonia/library/phing/parser/ProjectHandler.php

177 lines
6.0 KiB
PHP

<?php
/*
* $Id: ProjectHandler.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>.
*/
require_once 'phing/parser/AbstractHandler.php';
require_once 'phing/system/io/PhingFile.php';
/**
* Handler class for the <project> XML element This class handles all elements
* under the <project> element.
*
* @author Andreas Aderhold <andi@binarycloud.com>
* @copyright (c) 2001,2002 THYRELL. All rights reserved
* @version $Revision: 905 $ $Date: 2010-10-05 18:28:03 +0200 (Tue, 05 Oct 2010) $
* @access public
* @package phing.parser
*/
class ProjectHandler extends AbstractHandler {
/**
* The phing project configurator object.
* @var ProjectConfigurator
*/
private $configurator;
/**
* Constructs a new ProjectHandler
*
* @param object the ExpatParser object
* @param object the parent handler that invoked this handler
* @param object the ProjectConfigurator object
* @access public
*/
function __construct($parser, $parentHandler, $configurator) {
$this->configurator = $configurator;
parent::__construct($parser, $parentHandler);
}
/**
* Executes initialization actions required to setup the project. Usually
* this method handles the attributes of a tag.
*
* @param string the tag that comes in
* @param array attributes the tag carries
* @param object the ProjectConfigurator object
* @throws ExpatParseException if attributes are incomplete or invalid
* @access public
*/
function init($tag, $attrs) {
$def = null;
$name = null;
$id = null;
$desc = null;
$baseDir = null;
$ver = null;
// some shorthands
$project = $this->configurator->project;
$buildFileParent = $this->configurator->buildFileParent;
foreach ($attrs as $key => $value) {
if ($key === "default") {
$def = $value;
} elseif ($key === "name") {
$name = $value;
} elseif ($key === "id") {
$id = $value;
} elseif ($key === "basedir") {
$baseDir = $value;
} elseif ($key === "description") {
$desc = $value;
} elseif ($key === "phingVersion") {
$ver = $value;
} else {
throw new ExpatParseException("Unexpected attribute '$key'");
}
}
// these things get done no matter what
if (null != $name) {
$canonicalName = self::canonicalName($name);
$this->configurator->setCurrentProjectName($canonicalName);
$project->setUserProperty("phing.file.{$canonicalName}",
(string) $this->configurator->getBuildFile());
}
if (!$this->configurator->isIgnoringProjectTag()) {
if ($def === null) {
throw new ExpatParseException(
"The default attribute of project is required");
}
$project->setDefaultTarget($def);
if ($name !== null) {
$project->setName($name);
$project->addReference($name, $project);
}
if ($id !== null) {
$project->addReference($id, $project);
}
if ($desc !== null) {
$project->setDescription($desc);
}
if($ver !== null) {
$project->setPhingVersion($ver);
}
if ($project->getProperty("project.basedir") !== null) {
$project->setBasedir($project->getProperty("project.basedir"));
} else {
if ($baseDir === null) {
$project->setBasedir($buildFileParent->getAbsolutePath());
} else {
// check whether the user has specified an absolute path
$f = new PhingFile($baseDir);
if ($f->isAbsolute()) {
$project->setBasedir($baseDir);
} else {
$project->setBaseDir($project->resolveFile($baseDir, new PhingFile(getcwd())));
}
}
}
}
}
/**
* Handles start elements within the <project> tag by creating and
* calling the required handlers for the detected element.
*
* @param string the tag that comes in
* @param array attributes the tag carries
* @throws ExpatParseException if a unxepected element occurs
* @access public
*/
function startElement($name, $attrs) {
$project = $this->configurator->project;
$types = $project->getDataTypeDefinitions();
if ($name == "target") {
$tf = new TargetHandler($this->parser, $this, $this->configurator);
$tf->init($name, $attrs);
} elseif (isset($types[$name])) {
$tyf = new DataTypeHandler($this->parser, $this, $this->configurator);
$tyf->init($name, $attrs);
} else {
$tf = new TaskHandler($this->parser, $this, $this->configurator);
$tf->init($name, $attrs);
}
}
static function canonicalName ($name) {
return preg_replace('/\W/', '_', strtolower($name));
}
}