--Author Manel Fredj-CEA LIST library Diagram; import ClassDiagNodes; import StateDiagNodes; import ProfileDiagNodes; import ClassAndProfileDiagEdges; import CompositeDiagNodes; import StateDiagEdges; import CompositeDiagEdges; --import VisualIDs; import NotationQueries; import GeneralMappingsandHelpers; modeltype di uses 'http://www.eclipse.org/papyrus/0.7.0/sashdi'; modeltype di2 uses 'http://www.papyrusuml.org/di2'; modeltype notation uses 'http://www.eclipse.org/gmf/runtime/1.0.2/notation'; modeltype ecore uses 'http://www.eclipse.org/emf/2002/Ecore'; modeltype uml uses 'http://www.eclipse.org/uml2/2.1.0/UML'; mapping di2::Diagram::diagram2diagram() : notation::Diagram inherits di2::GraphElement::element2View { --the id is set automatically --assign type type := self.getDiagramtype(); --assign name name := self.name; --assign element measurementUnit := notation::MeasurementUnit::Pixel; --transform contained nodes and edges if (type = ClassDiagram_P2) then { children := setChildrenForClassDiagram(self.contained); edges := setEdgesForClassAndProfileDiagram(self.contained); } endif; if (type = ProfileDiagram_P2) then { children := setChildrenForProfileDiagram(self.contained); edges := setEdgesForClassAndProfileDiagram(self.contained); } endif; if (type = CompositeStructure_P2) then { children := setChildrenForCompositeDiagram(self.contained); edges := setEdgesForCompositeDiagram(self.contained); } endif; if (type = StateMachineDiagram_P2) then { children := setChildrenForStateDiagram(self.contained); edges := setEdgesForStateDiagram(self.contained); } endif; --Set Style of diagram if (type != null) then { styles := setStylesForDiagram(); } endif; } -------------------------------------------------------------- --converting a composite diagram helper setChildrenForCompositeDiagram(in contained:OrderedSet(di2::DiagramElement)) : OrderedSet(notation::Node) { var setOfChildren:OrderedSet(notation::Node); var child:notation::Node; var itsParent: notation::Shape; contained ->forEach (node|node.oclIsTypeOf(di2::GraphNode)) { --case of containing a class if (node.oclAsType(di2::GraphNode).getElement().oclIsTypeOf(uml::Class) ) then { child := node.oclAsType(di2::GraphNode).map compositeDiagNode2Shape(); setOfChildren += child; } endif; --case of containing a port : map the potr and attach it to the semantic parent if (node.oclAsType(di2::GraphNode).getElement().oclIsTypeOf(uml::Port) ) then { child := node.oclAsType(di2::GraphNode).map compositeDiagPort2Shape(); var temp: di2::DiagramElement:=node.oclAsType(di2::GraphNode).getSemanticParent(); itsParent:= temp.oclAsType(di2::GraphNode).resolveone (notation::Shape); --add the child to the semantic parent itsParent.children+= child; } endif; }; return setOfChildren; } ------------------------------------------------------------ --converting a class diagram helper setChildrenForClassDiagram (in contained:OrderedSet(di2::DiagramElement)) : OrderedSet(notation::Node) { var setOfChildren:OrderedSet(notation::Node); var child:notation::Node; contained ->forEach (node|node.oclIsTypeOf(di2::GraphNode)) { child := node.oclAsType(di2::GraphNode).map classDiagNode2Shape(); setOfChildren += child; }; return setOfChildren; } ------------------------------------------------------------ --converting a profile diagram helper setChildrenForProfileDiagram (in contained:OrderedSet(di2::DiagramElement)) : OrderedSet(notation::Node) { var setOfChildren:OrderedSet(notation::Node); var child:notation::Node; contained ->forEach (node|node.oclIsTypeOf(di2::GraphNode)) { child := node.oclAsType(di2::GraphNode).map profileDiagNode2Shape(); setOfChildren += child; }; return setOfChildren; } --converting a state diagram helper setChildrenForStateDiagram (in contained:OrderedSet(di2::DiagramElement)) : OrderedSet(notation::Node) { var setOfChildren:OrderedSet(notation::Node); var child:notation::Node; contained ->forEach (node|node.oclIsTypeOf(di2::GraphNode)) { child := node.oclAsType(di2::GraphNode).map stateDiagNode2Shape(); setOfChildren += child; }; return setOfChildren; } helper setEdgesForClassAndProfileDiagram (in contained : OrderedSet(di2::DiagramElement)) : OrderedSet (notation::Edge) { var setofEdges : OrderedSet(notation::Edge); var edge : notation::Edge; contained->forEach (node|node.oclIsTypeOf(di2::GraphEdge)) { edge := node.oclAsType(di2::GraphEdge).map classAndProfileDiagEdge2Edge(); setofEdges += edge; }; contained->forEach (composite|composite.oclIsTypeOf(di2::GraphNode)) { composite.oclAsType(di2::GraphNode).contained->forEach (elem|elem.oclIsTypeOf(di2::GraphEdge)) { edge := elem.oclAsType(di2::GraphEdge).map classAndProfileDiagEdge2Edge(); setofEdges += edge; }; composite.oclAsType(di2::GraphNode).contained->forEach (prop|prop.oclIsTypeOf(di2::GraphNode)) { prop.oclAsType(di2::GraphNode).contained->forEach (connect|connect.oclIsTypeOf(di2::GraphEdge)) { edge := connect.oclAsType(di2::GraphEdge).map classAndProfileDiagEdge2Edge(); setofEdges += edge; }; }; }; return setofEdges; } helper setEdgesForCompositeDiagram (in contained : OrderedSet(di2::DiagramElement)) : OrderedSet (notation::Edge) { var setofEdges : OrderedSet(notation::Edge); var edge : notation::Edge; contained->forEach (node|node.oclIsTypeOf(di2::GraphEdge)) { edge := node.oclAsType(di2::GraphEdge).map compositeDiagEdge2Edge(); setofEdges += edge; }; contained->forEach (composite|composite.oclIsTypeOf(di2::GraphNode)) { composite.oclAsType(di2::GraphNode).contained->forEach (elem|elem.oclIsTypeOf(di2::GraphEdge)) { edge := elem.oclAsType(di2::GraphEdge).map compositeDiagEdge2Edge(); setofEdges += edge; }; composite.oclAsType(di2::GraphNode).contained->forEach (prop|prop.oclIsTypeOf(di2::GraphNode)) { prop.oclAsType(di2::GraphNode).contained->forEach (connect|connect.oclIsTypeOf(di2::GraphEdge)) { edge := connect.oclAsType(di2::GraphEdge).map compositeDiagEdge2Edge(); setofEdges += edge; }; }; }; return setofEdges; } helper setEdgesForStateDiagram (in contained : OrderedSet(di2::DiagramElement)) : OrderedSet (notation::Edge) { var setofEdges : OrderedSet(notation::Edge); var edge : notation::Edge; contained->forEach (node|node.oclIsTypeOf(di2::GraphEdge)) { edge := node.oclAsType(di2::GraphEdge).map stateDiagEdge2Edge(); setofEdges += edge; }; contained->forEach (composite|composite.oclIsTypeOf(di2::GraphNode)) { composite.oclAsType(di2::GraphNode).contained->forEach (elem|elem.oclIsTypeOf(di2::GraphEdge)) { edge := elem.oclAsType(di2::GraphEdge).map stateDiagEdge2Edge(); setofEdges += edge; }; composite.oclAsType(di2::GraphNode).contained->forEach (prop|prop.oclIsTypeOf(di2::GraphNode)) { prop.oclAsType(di2::GraphNode).contained->forEach (connect|connect.oclIsTypeOf(di2::GraphEdge)) { edge := connect.oclAsType(di2::GraphEdge).map stateDiagEdge2Edge(); setofEdges += edge; }; }; }; return setofEdges; } -------------------------------- --Helpers related to a diagram helper setStylesForDiagram() : OrderedSet (notation::Style) { -- var setofStyles : OrderedSet(notation::Style); var style := object notation::DiagramStyle { --the id is set automatically }; setofStyles := OrderedSet{style}; return setofStyles; }