PhpUml
EXPERIMENTAL
Let me knwow by sending a message
if someone is working on PHP_UML
to improve the 'php to xmi' process.
Description
Task to process phpuml
(see: pear.php.net/package/PHP_UML).
PhpUml v1.6.1 is embedded within ant4x.jar.
Installation
If you get error message :
$ php UML.php -h
PHP Warning: require_once(PEAR/Exception.php): failed to open stream: No such file or directory in PHP_UML-1.6.1/UML.php on line 22
PHP Fatal error: require_once(): Failed opening required 'PEAR/Exception.php' (include_path='.:/usr/share/php:/usr/share/pear') in PHP_UML-1.6.1/UML.php on line 22
Please install (linux debian):
$ apt-get install php-pear
PhpUml task parameters
| Attribute | Description | Value | Required |
|---|---|---|---|
| file | the php input file | yes | |
| tofile | the xmi output file | yes |
Examples
<project name="phpuml task">
<taskdef name="phpuml"
classname="net.sourceforge.ant4x.taskdefs.php.PhpUmlTask"
classpath="PATH/TO/ant4x.jar"/>
<target name="phpuml">
<mkdir dir="gen/uml"/>
<ant4x:phpuml file="../dev/src/resources/PHP_UML-1.6.1/UML/FileScanner.php" tofile="gen/uml/filescanner.xmi"/>
</target>
</project>
<?php
/**
* PHP_UML
*
* PHP version 5
*
* @category PHP
* @package PHP_UML
* @author Baptiste Autin
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
* @version SVN: $Revision: 105 $
* @link http://pear.php.net/package/PHP_UML
* @link http://www.baptisteautin.com/projects/PHP_UML/
* @since $Date: 2009-06-04 19:48:27 +0200 (jeu., 04 juin 2009) $
*/
/**
* A superclass for scanning files and folders. It does nothing but browsing
* recursively the file system tree, given a list of entry folders. At least
* one folder must be provided.
* It can be seen as an extension of RecursiveDirectoryIterator, upon which
* it is based.
*
* @category PHP
* @package PHP_UML
* @author Baptiste Autin
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*
*/
abstract class PHP_UML_FileScanner
{
/**
* List of directories to scan
*
* @var array
*/
protected $directories = array();
/**
* List of files to scan
*
* @var array
*/
protected $files = array();
/**
* Allowed path-/file-names (possible wildcards are ? and *)
*
* @var array
*/
protected $matchPatterns = array('*.php');
/**
* Ignored directories (possible wildcards are ? and *)
*
* @var array();
*/
protected $ignorePatterns = array();
/**
* Constructor
*
*/
public function __construct()
{
}
/**
* This function will be called every time the scanner meets
* a new file (while it looks into the folders), as well as for
* each file defined in the property $files.
* It's up to the subclass to define the treatment to be done.
*
* @param mixed $basedir Directory path
*
* @param string $filename File name
*/
abstract function tickFile($basedir, $filename);
/**
* Starts the scan
*
*/
public function scan()
{
// We parse the directories
foreach ($this->directories as $pathItem) {
$baseDir = realpath($pathItem);
$trailing = substr($baseDir, -1);
if ($baseDir != false && is_dir($baseDir) && is_readable($baseDir)) {
if ($trailing != '/' && $trailing != '\\')
$baseDir .= DIRECTORY_SEPARATOR;
$objects = new RecursiveIteratorIterator(
new PHP_UML_FilePatternFilterIterator(
new RecursiveDirectoryIterator($baseDir), $this->ignorePatterns, $this->matchPatterns
)
);
$baseDirPos = strlen($baseDir);
foreach ($objects as $ptr) {
$relativePath = substr($ptr->getPathname(), $baseDirPos);
$this->tickFile($baseDir, $relativePath);
}
}
else
$this->raiseUnknownFolderException($pathItem);
}
// We parse the files
foreach ($this->files as $filenameItem) {
$filenameItem = realpath($filenameItem);
$baseDir = dirname($filenameItem).DIRECTORY_SEPARATOR;
$baseName = basename($filenameItem);
if ($filenameItem != false)
$this->tickFile($baseDir, $baseName);
}
}
/**
* Can be overriden to treat unknown folder exception
*
* @param string $basedir Directory name
*/
public function raiseUnknownFolderException($basedir)
{
}
public function setFiles(array $files)
{
$this->files = $files;
}
public function setDirectories(array $directories)
{
$this->directories = $directories;
}
public function setMatchPatterns(array $patterns)
{
$this->matchPatterns = $patterns;
}
public function setIgnorePatterns(array $patterns)
{
$this->ignorePatterns = $patterns;
}
}
?>
<?xml version="1.0" encoding="iso-8859-1"?><xmi:XMI xmi:version="2.1"
xmlns:uml="http://schema.omg.org/spec/UML/2.1.2"
xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
xmlns:php="http://schemas/phpdoc/52f4c1050fecc">
<xmi:Documentation exporter="PEAR\PHP_UML"/><uml:Model xmi:type="uml:Model" name="default"
xmi:id="52f4c1050c636" visibility="public" isAbstract="false" ><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050c74f" name="mixed"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1050ff33" annotatedElement="52f4c1050c74f"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050c9a9" name="array"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1050ff89" annotatedElement="52f4c1050c9a9"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050ca37" name="string"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1050ffd3" annotatedElement="52f4c1050ca37"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050cabf" name="int"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1051001b" annotatedElement="52f4c1050cabf"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050cb90" name="integer"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510063" annotatedElement="52f4c1050cb90"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050cc18" name="bool"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105100ab" annotatedElement="52f4c1050cc18"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050cca1" name="boolean"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105100f3" annotatedElement="52f4c1050cca1"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050cd29" name="float"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1051013b" annotatedElement="52f4c1050cd29"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050cdb2" name="void"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510187" annotatedElement="52f4c1050cdb2"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050ce48" name="null"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105101cf" annotatedElement="52f4c1050ce48"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050ced2" name="object"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510216" annotatedElement="52f4c1050ced2"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:DataType" xmi:id="52f4c1050cf5b" name="resource"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1051025e" annotatedElement="52f4c1050cf5b"><body>Internal PHP type.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:Interface" name="Iterator" xmi:id="52f4c1050d089" visibility="package" isAbstract="true"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105102ad" annotatedElement="52f4c1050d089"><body>Internal PHP interface.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:Interface" name="Countable" xmi:id="52f4c1050d11b" visibility="package" isAbstract="true"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105102f8" annotatedElement="52f4c1050d11b"><body>Internal PHP interface.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:Class" name="Exception" xmi:id="52f4c1050d1f2" visibility="package"
isAbstract="false"><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510349" annotatedElement="52f4c1050d1f2"><body>Internal PHP class.</body></ownedComment></packagedElement><packagedElement xmi:type="uml:Package" xmi:id="52f4c1050de9e" name="PHP_UML"><packagedElement xmi:type="uml:Class" name="PHP_UML_FileScanner" xmi:id="52f4c1050df1f" visibility="package"
isAbstract="true"><ownedAttribute xmi:type="uml:Property" name="$directories" xmi:id="52f4c1050e239" visibility="protected" ><type xmi:idref="52f4c1050c9a9"/><defaultValue xmi:type="uml:LiteralString" xmi:id="52f4c105103a8" value="array()" /><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105103f4" annotatedElement="52f4c1050e239"><body>List of directories to scan</body></ownedComment></ownedAttribute><ownedAttribute xmi:type="uml:Property" name="$files" xmi:id="52f4c1050e36d" visibility="protected" ><type xmi:idref="52f4c1050c9a9"/><defaultValue xmi:type="uml:LiteralString" xmi:id="52f4c1051043b" value="array()" /><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510481" annotatedElement="52f4c1050e36d"><body>List of files to scan</body></ownedComment></ownedAttribute><ownedAttribute xmi:type="uml:Property" name="$matchPatterns" xmi:id="52f4c1050e481" visibility="protected" ><type xmi:idref="52f4c1050c9a9"/><defaultValue xmi:type="uml:LiteralString" xmi:id="52f4c105104c6" value="array('*.php')" /><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1051050c" annotatedElement="52f4c1050e481"><body>Allowed path-/file-names (possible wildcards are ? and *)</body></ownedComment></ownedAttribute><ownedAttribute xmi:type="uml:Property" name="$ignorePatterns" xmi:id="52f4c1050e598" visibility="protected" ><type xmi:idref="52f4c1050c9a9"/><defaultValue xmi:type="uml:LiteralString" xmi:id="52f4c10510554" value="array()" /><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510599" annotatedElement="52f4c1050e598"><body>Ignored directories (possible wildcards are ? and *)</body></ownedComment></ownedAttribute><ownedOperation xmi:id="52f4c1050e729"
name="__construct" visibility="public" ><ownedParameter xmi:id="52f4c1050e811" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c1051062d" annotatedElement="52f4c1050e729"><body>Constructor</body></ownedComment></ownedOperation><ownedOperation xmi:id="52f4c1050e883"
name="tickFile" visibility="public" isAbstract="true"><ownedParameter xmi:id="52f4c1050e9d2" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedParameter xmi:id="52f4c1050ea1c" name="$basedir" direction="in"><type xmi:idref="52f4c1050c74f"/></ownedParameter><ownedParameter xmi:id="52f4c1050ea83" name="$filename" direction="in"><type xmi:idref="52f4c1050ca37"/></ownedParameter><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510743" annotatedElement="52f4c1050e883"><body>This function will be called every time the scanner meets a new file (while it looks into the folders), as well as for each file defined in the property $files.
It's up to the subclass to define the treatment to be done.</body></ownedComment></ownedOperation><ownedOperation xmi:id="52f4c1050eae8"
name="scan" visibility="public" ><ownedParameter xmi:id="52f4c1050eb89" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105107da" annotatedElement="52f4c1050eae8"><body>Starts the scan</body></ownedComment></ownedOperation><ownedOperation xmi:id="52f4c1050ed9b"
name="raiseUnknownFolderException" visibility="public" ><ownedParameter xmi:id="52f4c1050ee95" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedParameter xmi:id="52f4c1050eede" name="$basedir" direction="in"><type xmi:idref="52f4c1050ca37"/></ownedParameter><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c105108a9" annotatedElement="52f4c1050ed9b"><body>Can be overriden to treat unknown folder exception</body></ownedComment></ownedOperation><ownedOperation xmi:id="52f4c1050ef42"
name="setFiles" visibility="public" ><ownedParameter xmi:id="52f4c1050ef9a" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedParameter xmi:id="52f4c1050efe4" name="$files" direction="in"><type xmi:idref="52f4c1050c9a9"/></ownedParameter></ownedOperation><ownedOperation xmi:id="52f4c1050f05f"
name="setDirectories" visibility="public" ><ownedParameter xmi:id="52f4c1050f0b1" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedParameter xmi:id="52f4c1050f0fa" name="$directories" direction="in"><type xmi:idref="52f4c1050c9a9"/></ownedParameter></ownedOperation><ownedOperation xmi:id="52f4c1050f169"
name="setMatchPatterns" visibility="public" ><ownedParameter xmi:id="52f4c1050f1b9" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedParameter xmi:id="52f4c1050f203" name="$patterns" direction="in"><type xmi:idref="52f4c1050c9a9"/></ownedParameter></ownedOperation><ownedOperation xmi:id="52f4c1050f270"
name="setIgnorePatterns" visibility="public" ><ownedParameter xmi:id="52f4c1050f2c0" name="return" direction="return"><type xmi:idref="52f4c1050cdb2"/></ownedParameter><ownedParameter xmi:id="52f4c1050f30a" name="$patterns" direction="in"><type xmi:idref="52f4c1050c9a9"/></ownedParameter></ownedOperation><ownedComment xmi:type="uml:Comment"
xmi:id="52f4c10510b30" annotatedElement="52f4c1050df1f"><body>A superclass for scanning files and folders. It does nothing but browsing recursively the file system tree, given a list of entry folders. At least one folder must be provided.
It can be seen as an extension of RecursiveDirectoryIterator, upon which it is based.</body></ownedComment></packagedElement></packagedElement></uml:Model></xmi:XMI>