Viewing file: BuilderImpl1.php (13.58 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?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; } } ?>
|