Current File : //opt/RZphp83/includes/PHP/UML/Output/Xmi/BuilderImpl1.php |
<?php
/**
* PHP_UML (PHP_UML_Output_Xmi_BuilderImpl1)
*
* 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 1
*
* 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_BuilderImpl1 extends PHP_UML_Output_Xmi_AbstractBuilder
{
const XMI_VERSION = '1.2';
const UML_VERSION = '1.4';
const DEFAULT_CLASSIFIER_ATT = ' visibility="public" isAbstract="false"
isSpecification="false" isRoot="false" isLeaf="false" ';
public function getXmiHeaderOpen()
{
return '<XMI xmi.version="'.self::XMI_VERSION.'"
xmlns:UML="http://www.omg.org/spec/UML/1.4">
<XMI.header>
<XMI.documentation>
<XMI.exporter>'.self::EXPORTER_NAME.'</XMI.exporter>
</XMI.documentation>
<XMI.metamodel XMI.name="UML" XMI.version="'.self::XMI_VERSION.'" />
</XMI.header>
<XMI.content>';
}
public function getXmiHeaderClose()
{
return '</XMI.content></XMI>';
}
public function getModelOpen(PHP_UML_Metamodel_Package $model)
{
return '<UML:Model name="'.$model->name.'" xmi.id="'.$model->id.'" '.
self::DEFAULT_CLASSIFIER_ATT.'>';
}
public function getStereotypes()
{
$str = '';
foreach (self::$allStereotypes as $item)
$str .= '<UML:Stereotype xmi.id="'.self::getUID('stereotype_'.$item).'"
name="'.$item.'" '.self::DEFAULT_CLASSIFIER_ATT.' />';
$str .= '<UML:Stereotype xmi.id="'.self::getUID('stereotype_realize').'"
name="realize" '.self::DEFAULT_CLASSIFIER_ATT.'>
<UML:Stereotype.baseClass>Abstraction</UML:Stereotype.baseClass>
</UML:Stereotype>';
$str .= $this->getTagDefinition('documentation');
return $str;
}
public function getStereotypeInstance(PHP_UML_Metamodel_Stereotype $s)
{
return '';
}
public function getMetadata(PHP_UML_Metamodel_Tag $tag)
{
return '<'.$tag->name.'>'.$tag->value.'</'.$tag->name.'>';
}
public function getModelClose()
{
return '</UML:Model>';
}
public function getPackageOpen(PHP_UML_Metamodel_Package $package)
{
$str = '<UML:Package xmi.id="'.$package->id.'" name="'.$package->name.'">';
if (isset($package->description)) {
$str .= $this->getComment($package->description);
}
return $str;
}
public function getNamespaceOpen()
{
return '<UML:Namespace.ownedElement>';
}
public function getPackageClose()
{
return '</UML:Package>';
}
public function getNamespaceClose()
{
return '</UML:Namespace.ownedElement>';
}
public function getSubsystemOpen(PHP_UML_Metamodel_Package $package)
{
return '<UML:Subsystem name="'.$package->name.'" xmi.id="'.
$package->id.'" isInstantiable="false"><UML:Namespace.ownedElement>';
}
public function getSubsystemClose()
{
return '</UML:Namespace.ownedElement></UML:Subsystem>';
}
public function getDatatype(PHP_UML_Metamodel_Datatype $type)
{
$str = '<UML:DataType xmi.id="'.$type->id.'"'.
' name="'.$type->name.'" visibility="public" isRoot="false" '.
' isLeaf="false" isAbstract="false">';
if (isset($class->description))
$str .= $this->getComment($class->description);
return $str.'</UML:DataType>';
}
public function getClass(PHP_UML_Metamodel_Class $class)
{
$str = '<UML:Class name="'.$class->name.'" xmi.id="'.
$class->id.'" visibility="package"
isAbstract="'.($class->isAbstract?'true':'false').'">';
list($generalizable, $generalization) = $this->getGeneralizations($class);
$str .= $generalizable;
$str .= '<UML:Classifier.feature>';
foreach ($class->ownedAttribute as &$property) {
$str .= $this->getProperty($property);
}
foreach ($class->ownedOperation as &$operation) {
$str .= $this->getOperation($operation);
}
$str .= '</UML:Classifier.feature>';
if (isset($class->description))
$str .= $this->getComment($class->description);
$str .= '</UML:Class>';
return $str.$generalization.$this->getRealizations($class);
}
public function getInterface(PHP_UML_Metamodel_Interface $interface)
{
$str = '<UML:Interface name="'.$interface->name.'"'.
' xmi.id="'.$interface->id.'"'.
' visibility="package" isAbstract="true">';
list($generalizable, $generalization) = $this->getGeneralizations($interface);
$str .= $generalizable;
$str .= '<UML:Classifier.feature>';
foreach ($interface->ownedOperation as &$operation)
$str .= $this->getOperation($operation);
$str .= '</UML:Classifier.feature>';
if (isset($interface->description))
$str .= $this->getComment($interface->description);
$str .= '</UML:Interface>';
return $str.$generalization;
}
public function getGeneralizations(PHP_UML_Metamodel_Type $client)
{
$str = '';
$generalizable = '';
$generalization = '';
foreach ($client->superClass as &$gclass) {
if (is_object($gclass)) {
$id = self::getUID();
$generalizable .= '<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="'.$id.'"/>
</UML:GeneralizableElement.generalization>';
$generalization .= '<UML:Generalization xmi.id="'.$id.'">
<UML:Generalization.child><UML:Class xmi.idref="'.
$client->id.
'" /></UML:Generalization.child>
<UML:Generalization.parent><UML:Class xmi.idref="'.
$gclass->id.'"/>
</UML:Generalization.parent></UML:Generalization>';
}
}
return array($generalizable, $generalization);
}
public function getRealizations(PHP_UML_Metamodel_Class $client)
{
$str = '';
foreach ($client->implements as &$rclass) {
if (is_object($rclass)) {
$str .= '<UML:Abstraction '.
'xmi.id="'.self::getUID().'" isSpecification="false">'.
'<UML:ModelElement.stereotype><UML:Stereotype xmi.idref="'.
self::getUID('stereotype_realize').'"/>'.
'</UML:ModelElement.stereotype>'.
'<UML:Dependency.client><UML:Class xmi.idref="'.
$client->id.
'"/></UML:Dependency.client>'.
'<UML:Dependency.supplier><UML:Interface xmi.idref="'.
$rclass->id.'"/>'.
'</UML:Dependency.supplier></UML:Abstraction>';
}
}
return $str;
}
public function getProperty(PHP_UML_Metamodel_Property $property)
{
$str = '<UML:Attribute xmi.id="'.$property->id.'"'.
' name="'.$property->name.'" '.
' visibility="'.$property->visibility.'" ';
if (!$property->isInstantiable) {
$str .= ' isStatic="true" ownerScope="classifier"';
} else {
$str .= ' ownerScope="instance"';
}
if ($property->isReadOnly)
$str .= ' changeability="frozen" isReadOnly="true" ';
$str .= '>';
$str .= self::getStructuralFeatureType($property);
if (isset($property->description))
$str .= $this->getComment($property->description);
$str .= '</UML:Attribute>';
return $str;
}
public function getOperation(PHP_UML_Metamodel_Operation $operation)
{
$str = '<UML:Operation xmi.id="'.$operation->id.'"'.
' name="'.$operation->name.'"'.
' visibility="'.$operation->visibility.'"';
if (!$operation->isInstantiable)
$str .= ' isStatic="true"';
if ($operation->isAbstract)
$str .= ' isAbstract="true"';
$str .= ' isQuery="false" concurrency="sequential">'.
'<UML:BehavioralFeature.parameter>';
foreach ($operation->ownedParameter as &$parameter) {
$str .= $this->getParameter($parameter);
}
$str .= '</UML:BehavioralFeature.parameter>';
if (isset($operation->description))
$str .= $this->getComment($operation->description);
$str .= '</UML:Operation>';
return $str;
}
public function getParameter(PHP_UML_Metamodel_Parameter $parameter)
{
return '<UML:Parameter xmi.id="'.$parameter->id.'" '.
' name="'.$parameter->name.'"'.
' kind="'.$parameter->direction.'">'.
$this->getParameterType($parameter).
'</UML:Parameter>';
}
public function getParameterType(PHP_UML_Metamodel_TypedElement $parameter)
{
$str = '';
$id = self::getUID();
// Exception to MOF : a PHP class can have the name of a datatype
if (isset($parameter->type->id)) {
$str .= '<UML:Parameter.type>'.
'<UML:DataType xmi.idref="'.$parameter->type->id.
'"/></UML:Parameter.type>';
}
if ($parameter->default!='') {
$str .= '<UML:Parameter.defaultValue>'.
'<UML:Expression xmi.id="'.$id.'"'.
' body="'.htmlspecialchars($parameter->default, ENT_QUOTES).'" />'.
'</UML:Parameter.defaultValue>';
}
return $str;
}
public function getArtifact(PHP_UML_Metamodel_Artifact $file, &$mf = array())
{
return '<UML:Artifact '.
' xmi.id="'.$file->id.'"'.
' name="'.basename(htmlspecialchars($file->name)).'">'.
'<UML:ModelElement.stereotype>'.
'<UML:Stereotype xmi.idref="'.self::getUID('stereotype_'.self::PHP_FILE).'"/>'.
'</UML:ModelElement.stereotype>'.
'</UML:Artifact>';
}
public function getComponentOpen(PHP_UML_Metamodel_Package $package, array $provided, array $required)
{
return self::getSubsystemOpen($package);
}
public function getComponentClose()
{
return self::getSubsystemClose();
}
public function getComment(PHP_UML_Metamodel_Stereotype $s, $annotatedElement='')
{
$tag = PHP_UML_Metamodel_Helper::getStereotypeTag($s, 'description');
if(!is_null($tag))
return $this->getTaggedValue($tag->value, self::getUID('Tag_documentation'));
else
return '';
}
public function getTaggedValue($value, $tag)
{
return '<UML:ModelElement.taggedValue>'.
'<UML:TaggedValue xmi.id="'.self::getUID().'" visibility="public">'.
'<UML:TaggedValue.dataValue>'.htmlspecialchars($value).'</UML:TaggedValue.dataValue>'.
'<UML:TaggedValue.type>'.
'<UML:TagDefinition xmi.idref="'.$tag.'"/>'.
'</UML:TaggedValue.type>'.
'</UML:TaggedValue>'.
'</UML:ModelElement.taggedValue>';
}
public function getTagDefinition($name)
{
return '<UML:TagDefinition xmi.id="'.self::getUID('Tag_'.$name).'" '.
'name="'.$name.'" isSpecification="false" tagType="string">
<UML:TagDefinition.multiplicity>
<UML:Multiplicity xmi.id="'.self::getUID('TagMultiplicity_'.$name).'">
<UML:Multiplicity.range>
<UML:MultiplicityRange xmi.id="'.self::getUID('TagMultiRange_'.$name).'"
lower="0" upper="1"/>
</UML:Multiplicity.range>
</UML:Multiplicity>
</UML:TagDefinition.multiplicity>
</UML:TagDefinition>';
}
public function getProfile()
{
}
/**
* Get the structural type of an element (XMI 1.x)
*
* @param PHP_UML_TypedElement $element Element
*
* @return string XMI code
*/
static protected function getStructuralFeatureType(PHP_UML_Metamodel_TypedElement $element)
{
$str = '';
$id = self::getUID();
if (!is_object($element->type))
return '';
if (get_class($element->type)=='PHP_UML_Metamodel_Class') {
$str .= '<UML:StructuralFeature.type>'.
'<UML:DataType xmi.idref="'.$element->type->id.
'"/></UML:StructuralFeature.type>';
} elseif (get_class($element->type)=='PHP_UML_Metamodel_Datatype') {
$str .= '<UML:StructuralFeature.type>'.
'<UML:DataType xmi.idref="'.$element->type->id.
'"/></UML:StructuralFeature.type>';
}
if ($element->default!='') {
$str .= '<UML:Attribute.initialValue>'.
'<UML:Expression xmi.id="'.$id.'"'.
' body="'.htmlspecialchars($element->default, ENT_QUOTES).'" />'.
'</UML:Attribute.initialValue>';
}
return $str;
}
}
?>