Initial Commit
This commit is contained in:
388
database/php/pear/PHP/UML/Output/Xmi/BuilderImpl2.php
Normal file
388
database/php/pear/PHP/UML/Output/Xmi/BuilderImpl2.php
Normal file
@@ -0,0 +1,388 @@
|
||||
<?php
|
||||
/**
|
||||
* PHP_UML (PHP_UML_Output_Xmi_BuilderImpl2)
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_UML
|
||||
* @author Baptiste Autin <ohlesbeauxjours@yahoo.fr>
|
||||
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
|
||||
* @version SVN: $Revision: 174 $
|
||||
* @link http://pear.php.net/package/PHP_UML
|
||||
* @since $Date: 2011-09-15 03:17:32 +0200 (jeu., 15 sept. 2011) $
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implementation class to create XMI in version 2
|
||||
*
|
||||
* See the interface PHP_UML_Output_Xmi_Builder for the comments.
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_UML
|
||||
* @subpackage Output
|
||||
* @subpackage Xmi
|
||||
* @see PHP_UML_Output_Xmi_Builder
|
||||
* @author Baptiste Autin <ohlesbeauxjours@yahoo.fr>
|
||||
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
|
||||
*/
|
||||
class PHP_UML_Output_Xmi_BuilderImpl2 extends PHP_UML_Output_Xmi_AbstractBuilder
|
||||
{
|
||||
const XMI_VERSION = '2.1';
|
||||
const UML_VERSION = '2.1.2';
|
||||
|
||||
const DEFAULT_CLASSIFIER_ATT = ' visibility="public" isAbstract="false" ';
|
||||
|
||||
/**
|
||||
* PHP_UML UML Profile (TODO)
|
||||
* @var string
|
||||
*/
|
||||
public $profile = '';
|
||||
|
||||
public function getXmiHeaderOpen()
|
||||
{
|
||||
return '<xmi:XMI xmi:version="'.self::XMI_VERSION.'"
|
||||
xmlns:uml="http://schema.omg.org/spec/UML/'.self::UML_VERSION.'"
|
||||
xmlns:xmi="http://schema.omg.org/spec/XMI/'.self::XMI_VERSION.'"
|
||||
xmlns:php="http://schemas/phpdoc/'.self::getUID().'">
|
||||
<xmi:Documentation exporter="'.self::EXPORTER_NAME.'"/>';
|
||||
}
|
||||
|
||||
public function getModelOpen(PHP_UML_Metamodel_Package $model)
|
||||
{
|
||||
return '<uml:Model xmi:type="uml:Model" name="'.$model->name.'"
|
||||
xmi:id="'.$model->id.'" '.self::DEFAULT_CLASSIFIER_ATT.'>';
|
||||
}
|
||||
|
||||
public function getModelClose()
|
||||
{
|
||||
return '</uml:Model>';
|
||||
}
|
||||
|
||||
public function getXmiHeaderClose()
|
||||
{
|
||||
return '</xmi:XMI>';
|
||||
}
|
||||
|
||||
public function getPackageOpen(PHP_UML_Metamodel_Package $package)
|
||||
{
|
||||
$str = '<packagedElement xmi:type="uml:Package" xmi:id="'.$package->id.
|
||||
'" name="'.$package->name.'">';
|
||||
if (isset($package->description)) {
|
||||
$str .= $this->getComment($package->description, $package->id);
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getPackageClose()
|
||||
{
|
||||
return '</packagedElement>';
|
||||
}
|
||||
|
||||
public function getNamespaceOpen()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
public function getNamespaceClose()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
public function getDatatype(PHP_UML_Metamodel_Datatype $type)
|
||||
{
|
||||
$str = '<packagedElement xmi:type="uml:DataType"'.
|
||||
' xmi:id="'.$type->id.'"'.
|
||||
' name="'.$type->name.'">';
|
||||
if (isset($type->description))
|
||||
$str .= $this->getComment($type->description, $type->id);
|
||||
return $str.'</packagedElement>';
|
||||
}
|
||||
|
||||
public function getSubsystemOpen(PHP_UML_Metamodel_Package $package)
|
||||
{
|
||||
return '<packagedElement xmi:type="uml:Component" xmi:id="'.
|
||||
$package->id.'" name="'.$package->name.
|
||||
'" '.self::DEFAULT_CLASSIFIER_ATT.'>';
|
||||
}
|
||||
|
||||
public function getSubsystemClose()
|
||||
{
|
||||
return '</packagedElement>';
|
||||
}
|
||||
|
||||
public function getClass(PHP_UML_Metamodel_Class $class)
|
||||
{
|
||||
$strRealization = '';
|
||||
|
||||
$str = '<packagedElement xmi:type="uml:Class" name="'.$class->name.'" xmi:id="'.
|
||||
$class->id.'" visibility="package"
|
||||
isAbstract="'.($class->isAbstract?'true':'false').'">';
|
||||
|
||||
$str .= $this->getGeneralizations($class);
|
||||
|
||||
$strRealization .= $this->getRealizations($class);
|
||||
|
||||
foreach ($class->ownedAttribute as &$property)
|
||||
$str .= $this->getProperty($property);
|
||||
|
||||
foreach ($class->ownedOperation as &$operation)
|
||||
$str .= $this->getOperation($operation);
|
||||
|
||||
if (isset($class->description))
|
||||
$str .= $this->getComment($class->description, $class->id);
|
||||
|
||||
$str .= '</packagedElement>';
|
||||
|
||||
return $str.$strRealization;
|
||||
}
|
||||
|
||||
public function getInterface(PHP_UML_Metamodel_Interface $interface)
|
||||
{
|
||||
$str = '<packagedElement xmi:type="uml:Interface" '.
|
||||
' name="'.$interface->name.'" xmi:id="'.$interface->id.'"'.
|
||||
' visibility="package" isAbstract="true">';
|
||||
|
||||
foreach ($interface->ownedOperation as &$operation)
|
||||
$str .= $this->getOperation($operation);
|
||||
|
||||
$str .= $this->getGeneralizations($interface);
|
||||
|
||||
if (isset($interface->description))
|
||||
$str .= $this->getComment($interface->description, $interface->id);
|
||||
|
||||
$str .= '</packagedElement>';
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getRealizations(PHP_UML_Metamodel_Class $client)
|
||||
{
|
||||
$str = '';
|
||||
foreach ($client->implements as &$rclass) {
|
||||
if (is_object($rclass)) {
|
||||
$str .= '<packagedElement xmi:type="uml:Realization" '.
|
||||
'xmi:id="'.self::getUID().'" '.
|
||||
'client="'.$client->id.'" '.
|
||||
'supplier="'.$rclass->id.'" '.
|
||||
'realizingClassifier="'.$rclass->id.'"/>';
|
||||
}
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getGeneralizations(PHP_UML_Metamodel_Type $client)
|
||||
{
|
||||
$str = '';
|
||||
foreach ($client->superClass as &$gclass) {
|
||||
if (is_object($gclass)) {
|
||||
$str .= '<generalization xmi:type="uml:Generalization" '.
|
||||
'xmi:id="'.self::getUID().'" '.
|
||||
'general="'.$gclass->id.'"/> ';
|
||||
}
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getProperty(PHP_UML_Metamodel_Property $property)
|
||||
{
|
||||
$str = '<ownedAttribute xmi:type="uml:Property"'.
|
||||
' name="'.$property->name.'"'.
|
||||
' xmi:id="'.$property->id.'"'.
|
||||
' visibility="'.$property->visibility.'" ';
|
||||
|
||||
if (!$property->isInstantiable)
|
||||
$str .= ' isStatic="true"';
|
||||
if ($property->isReadOnly)
|
||||
$str .= ' isReadOnly="true" ';
|
||||
|
||||
$str .= '>'.$this->getParameterType($property);
|
||||
|
||||
if (isset($property->description))
|
||||
$str .= $this->getComment($property->description, $property->id);
|
||||
|
||||
$str .= '</ownedAttribute>';
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getOperation(PHP_UML_Metamodel_Operation $operation)
|
||||
{
|
||||
$str = '<ownedOperation xmi:id="'.$operation->id.'"
|
||||
name="'.$operation->name.'" visibility="'.$operation->visibility.'" ';
|
||||
|
||||
if (!$operation->isInstantiable)
|
||||
$str .= ' isStatic="true"';
|
||||
if ($operation->isAbstract)
|
||||
$str .= ' isAbstract="true"';
|
||||
|
||||
$str .= '>';
|
||||
|
||||
foreach ($operation->ownedParameter as &$parameter) {
|
||||
$str .= $this->getParameter($parameter);
|
||||
}
|
||||
|
||||
if (isset($operation->description))
|
||||
$str .= $this->getComment($operation->description, $operation->id);
|
||||
|
||||
$str .= '</ownedOperation>';
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getParameter(PHP_UML_Metamodel_Parameter $parameter)
|
||||
{
|
||||
return '<ownedParameter xmi:id="'.$parameter->id.'" '.
|
||||
'name="'.$parameter->name.'" direction="'.$parameter->direction.'">'.
|
||||
$this->getParameterType($parameter).
|
||||
'</ownedParameter>';
|
||||
}
|
||||
|
||||
public function getParameterType(PHP_UML_Metamodel_TypedElement $parameter)
|
||||
{
|
||||
$str = '';
|
||||
$id = self::getUID();
|
||||
|
||||
if (isset($parameter->type->id))
|
||||
$str = '<type xmi:idref="'.$parameter->type->id.'"/>';
|
||||
|
||||
if ($parameter->default!='')
|
||||
$str .= '<defaultValue xmi:type="uml:LiteralString" xmi:id="'.$id.'"'.
|
||||
' value="'.htmlspecialchars($parameter->default, ENT_QUOTES).'" />';
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getArtifact(PHP_UML_Metamodel_Artifact $file, &$mf = array())
|
||||
{
|
||||
$id = $file->id;
|
||||
$file = htmlspecialchars($file->name);
|
||||
$name = basename($file);
|
||||
$str = '
|
||||
<packagedElement xmi:type="uml:Artifact"'.
|
||||
' xmi:id="'.$id.'"'.
|
||||
' name="'.$name.'" '.
|
||||
' stereotype="'.self::getUID('stereotype_'.self::PHP_FILE).'" '.
|
||||
self::DEFAULT_CLASSIFIER_ATT.' >';
|
||||
|
||||
foreach ($mf as $class) {
|
||||
if ($class instanceof PHP_UML_Metamodel_Classifier) {
|
||||
$id_supplier = $class->id;
|
||||
$str .= self::getManifestation($id, $id_supplier, 'source');
|
||||
}
|
||||
}
|
||||
|
||||
$str .= '</packagedElement>';
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getComponentOpen(PHP_UML_Metamodel_Package $package, array $provided, array $required)
|
||||
{
|
||||
$str = '
|
||||
<packagedElement xmi:type="uml:Component"'.
|
||||
' xmi:id="'.$package->id.'"'.
|
||||
' name="'.$package->name.'" '.
|
||||
self::DEFAULT_CLASSIFIER_ATT.' >';
|
||||
|
||||
foreach ($provided as $c) {
|
||||
switch (get_class($c)) {
|
||||
case 'PHP_UML_Metamodel_Interface':
|
||||
case 'PHP_UML_Metamodel_Class':
|
||||
$id = self::getUID('CV_provided_'.$c->name);
|
||||
$id_provided = $c->id;
|
||||
$str .= '<provided xmi:id="'.$id.'" xmi:idref="'.$id_provided.
|
||||
'" name="'.$c->name.'"/>';
|
||||
}
|
||||
}
|
||||
foreach ($required as $c) {
|
||||
$id = self::getUID('CV_required_'.$c->name);
|
||||
$id_provided = $c->id;
|
||||
$str .= '<required xmi:id="'.$id.'" xmi:idref="'.$id_provided.'" name="'.$c->name.'"/>';
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
public function getComponentClose()
|
||||
{
|
||||
return '</packagedElement>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Formates a Profile adapted to PHP_UML.
|
||||
*
|
||||
* TODO. Experimental.
|
||||
*
|
||||
* @return string XMI Code
|
||||
*/
|
||||
public function getProfile()
|
||||
{
|
||||
return file_get_contents('../Metamodel/phpdoc.profile.xmi').
|
||||
'<profileApplication xmi:type="uml:ProfileApplication" xmi:id="'.self::getUID().'">'.
|
||||
'<appliedProfile xmi:idref="PHP_UML_phpdoc_1"/>'.
|
||||
'</profileApplication>';
|
||||
}
|
||||
|
||||
public function getComment(PHP_UML_Metamodel_Stereotype $s, $annotatedElement='')
|
||||
{
|
||||
$tag = PHP_UML_Metamodel_Helper::getStereotypeTag($s, 'description');
|
||||
if(!is_null($tag))
|
||||
return '<ownedComment xmi:type="uml:Comment"
|
||||
xmi:id="'.self::getUID().'" annotatedElement="'.$annotatedElement.
|
||||
'"><body>'.htmlspecialchars($tag->value).'</body></ownedComment>';
|
||||
else
|
||||
return '';
|
||||
}
|
||||
|
||||
public function getStereotypes()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all the elements contained in a stereotype
|
||||
* Note: the property "documentation" is not discarded (we will have
|
||||
* it as an "ownedComent" tag, instead; see getComment())
|
||||
*
|
||||
* @param PHP_UML_Metamodel_Stereotype $s Stereotype
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getStereotypeInstance(PHP_UML_Metamodel_Stereotype $s)
|
||||
{
|
||||
$str = '';
|
||||
foreach ($s->ownedAttribute as $tag) {
|
||||
if($tag->value!='' && $tag->name!='description')
|
||||
$str .= $this->getMetadata($tag);
|
||||
}
|
||||
|
||||
if ($str!='')
|
||||
return '<'.$s->profile.':'.$s->name.
|
||||
' base_Element="'.$s->element->id.'">'.
|
||||
$str.'</'.$s->profile.':'.$s->name.'>';
|
||||
else
|
||||
return '';
|
||||
}
|
||||
|
||||
public function getMetadata(PHP_UML_Metamodel_Tag $tag)
|
||||
{
|
||||
return '<'.$tag->name.'>'.htmlspecialchars($tag->value).'</'.$tag->name.'>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a manifestation element (= the link between a class and the
|
||||
* artifact where the class is defined)
|
||||
*
|
||||
* @param string $client Name of the client
|
||||
* @param string $supplier Name of the supplier
|
||||
* @param string $name Name of the relation
|
||||
*
|
||||
* @return string XMI code
|
||||
*/
|
||||
public function getManifestation($client, $supplier, $name)
|
||||
{
|
||||
return '<manifestation xmi:type="uml:Manifestation" '.
|
||||
'xmi:id="'.self::getUID().'" '.
|
||||
'client="'.$client.'" supplier="'.$supplier.'" '.
|
||||
'utilizedElement="'.$supplier.'" name="'.$name.'"/>';
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user