|  | [** | 
|  | Based on the API in https://www.eclipse.org/hawk/advanced-use/meta-queries/ | 
|  | *] | 
|  | digraph G { | 
|  | node[shape=record, fontname=Tahoma, fontsize=10, style=filled, fillcolor=azure] | 
|  | edge[fontname=Tahoma, fontsize=10, fontcolor=grey] | 
|  |  | 
|  | [%var colors = Sequence{"floralwhite", "lemonchiffon", "mistyrose", "pink", "wheat", "plum"};%] | 
|  | [%var types = M.types;%] | 
|  | [%var files : Set;%] | 
|  |  | 
|  | [* For every type *] | 
|  | [%for (t in types){%] | 
|  | [%var elements = t.all;%] | 
|  |  | 
|  | [* For all elements that are instances of the type *] | 
|  | [%for (e in elements){%] | 
|  |  | 
|  | [* Produce the element node*] | 
|  | [%=e.getNodeId()%][label="{:[%=t.name%]|[%=e.getAttributesLabel(t)%]}", fillcolor="[%=colors.get(types.indexOf(t).mod(colors.size()))%]"]; | 
|  |  | 
|  | [* Link the element to its file *] | 
|  | [%if(isLayerActive("files")){%] | 
|  | [%var file = M.getFileOf(e); files.add(file);%] | 
|  | [%=file.getNodeId()%] -> [%=e.getNodeId()%]; | 
|  | [%}%] | 
|  |  | 
|  | [* Create links for references by*] | 
|  | [%for (r in t.references){%] | 
|  | [%for (target in e.getFeature(r.name).select(target | target.isDefined())){%] | 
|  | [%=e.getNodeId()%] -> [%=target.getNodeId()%] [label="[%=r.name%]"] | 
|  | [%}%] | 
|  | [%}%] | 
|  |  | 
|  | [%}%] | 
|  | [%}%] | 
|  |  | 
|  | [* Produce the file nodes *] | 
|  | [%if(isLayerActive("files")){%] | 
|  | [%for (f in files){%] | 
|  | [%=f.getNodeId()%][label="[%=f.path%]",shape="note", fillcolor="beige"]; | 
|  | [%}%] | 
|  | [%}%] | 
|  | } | 
|  |  | 
|  | [% | 
|  | operation Any getAttributesLabel(type : Any) { | 
|  | return type.attributes.collect(a|a.name + " = " + self.getFeature(a.name)).concat("\\n"); | 
|  | } | 
|  |  | 
|  | operation Any getNodeId() { | 
|  | return (self.getNode().id+"").replaceAll("#","x").replaceAll(":","x"); | 
|  | } | 
|  |  | 
|  | operation isLayerActive(id : String) { | 
|  | var layer = layers.selectOne(l|l.id = id); | 
|  | if (layer.isDefined()) { | 
|  | return layer.active; | 
|  | } | 
|  | else { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | %] |