From 7f1f70f77d89a2a5f4564d4424f862b018cfe13f Mon Sep 17 00:00:00 2001
From: tkuehn <thomas.kuehn3@tu-dresden.de>
Date: Wed, 17 Jul 2019 15:48:41 +0200
Subject: [PATCH] added Datastructure for creating PlantUML outputs

---
 dg/src/main/jastadd/DGtoDotG.jrag   | 65 +++++++++++++++++++++++++++++
 dg/src/main/jastadd/DGtoDotG.relast |  2 +
 dg/src/main/jastadd/DotGraph.jrag   | 58 +++++++++++++++++++++++++
 dg/src/main/jastadd/DotGraph.relast |  4 ++
 4 files changed, 129 insertions(+)
 create mode 100644 dg/src/main/jastadd/DGtoDotG.jrag
 create mode 100644 dg/src/main/jastadd/DGtoDotG.relast
 create mode 100644 dg/src/main/jastadd/DotGraph.jrag
 create mode 100644 dg/src/main/jastadd/DotGraph.relast

diff --git a/dg/src/main/jastadd/DGtoDotG.jrag b/dg/src/main/jastadd/DGtoDotG.jrag
new file mode 100644
index 0000000..f4e4f50
--- /dev/null
+++ b/dg/src/main/jastadd/DGtoDotG.jrag
@@ -0,0 +1,65 @@
+aspect DGtoDotG {
+
+  syn DotGraph DependencyGraph.dotGraph() {
+    DotGraph dg = new DotGraph();
+    //create DotGraph
+    dg.setDependencyGraph(this);
+    Map<Component,DotNode> componentMap = new HashMap<>();
+    for (Component component: getComponentList()) {
+      DotNode n = new DotNode();
+      n.setComponent(component);
+      dg.addDotNode(n);
+      componentMap.put(component, n);
+    }
+    
+    for (Component from: getComponentList()) {
+      for (Component to: from.getToList()) {
+        if (to.getToList().contains(from)) {
+          if (to.hashCode() < from.hashCode()) {
+            componentMap.get(from).addRel(componentMap.get(to));
+          }
+        } else {
+          componentMap.get(from).addRef(componentMap.get(to));
+        }
+      }
+    }
+
+    return dg;
+  }
+
+  syn DotGraph DependencyGraph.dotGraph(Set<Component> components) {
+    DotGraph dg = new DotGraph();
+    //Ensure that components are part of DependencyGraph
+    Set<Component> subset=new HashSet();
+    for (Component c:getComponentList())
+      subset.add(c);
+    subset.retainAll(components);
+
+    //create DotGraph
+    dg.setDependencyGraph(this);
+    Map<Component,DotNode> componentMap = new HashMap<>();
+    for (Component component: subset) {
+      DotNode n = new DotNode();
+      n.setComponent(component);
+      dg.addDotNode(n);
+      componentMap.put(component, n);
+    }
+    
+    for (Component from: subset) {
+      for (Component to: from.getToList()) {
+        if (subset.contains(to)) {
+          if (to.getToList().contains(from)) {
+            if (to.hashCode() < from.hashCode()) {
+              componentMap.get(from).addRel(componentMap.get(to));
+            }
+          } else {
+            componentMap.get(from).addRef(componentMap.get(to));
+          }
+        }
+      }
+    }
+
+    return dg;
+  }
+
+}
diff --git a/dg/src/main/jastadd/DGtoDotG.relast b/dg/src/main/jastadd/DGtoDotG.relast
new file mode 100644
index 0000000..17412cf
--- /dev/null
+++ b/dg/src/main/jastadd/DGtoDotG.relast
@@ -0,0 +1,2 @@
+rel DotGraph.DependencyGraph -> DependencyGraph;
+rel DotNode.Component -> Component;
diff --git a/dg/src/main/jastadd/DotGraph.jrag b/dg/src/main/jastadd/DotGraph.jrag
new file mode 100644
index 0000000..08c35a6
--- /dev/null
+++ b/dg/src/main/jastadd/DotGraph.jrag
@@ -0,0 +1,58 @@
+aspect DotGraphToPlantUML {
+
+  inh String DotNode.name();
+  eq DotGraph.getDotNode(int i).name() = "v" + i;
+
+  syn String DotNode.label() = name();
+
+//  syn String CycleGraph.toDot() {
+//    StringBuilder b = new StringBuilder();
+//    b.append("strict digraph cycles {\n");
+
+//    for (Vertex from: getVertexList()) {
+//      b.append("  ").append(from.name()).append("[label=\"").append(from.label()).append("\"];\n");
+
+//      for (Vertex to: from.getRefList()) {
+//        b.append("  ").append(from.name()).append(" -> ").append(to.name()).append(";\n");
+//      }
+//      for (Vertex to: from.getRelList()) {
+//        b.append("  ").append(from.name()).append(" -> ").append(to.name()).append("[dir=\"both\"];\n");
+//      }
+//    }
+
+//    b.append("}\n");
+//    return b.toString();
+//  }
+
+  syn String DotGraph.toPlant(String shape, String relation) {
+    StringBuilder b = new StringBuilder();
+    b.append("@startuml\n")
+      .append("hide circle\n")
+      .append("skinparam shadowing false\n")
+      .append("skinparam monochrome true\n")
+      .append("skinparam classAttributeIconSize 0\n")
+      .append("/'Remove automatic namespace generation'/\n")
+      .append("set namespaceSeparator none\n");
+
+    for (DotNode from: getDotNodeList()) {
+      b.append(shape).append(" ")
+        .append(from.label()).append("\n");
+    }
+
+    for (DotNode from: getDotNodeList()) {
+      for (DotNode to: from.getRefList()) {
+          b.append(from.label())
+            .append(" ").append(relation).append("> ")
+            .append(to.label()).append("\n");
+      }
+      for (DotNode to: from.getRelList()) {
+        b.append(from.label())
+          .append(" <").append(relation).append("> ")
+          .append(to.label()).append("\n");
+      }
+    }
+
+    b.append("@enduml\n");
+    return b.toString();
+  }
+}
diff --git a/dg/src/main/jastadd/DotGraph.relast b/dg/src/main/jastadd/DotGraph.relast
new file mode 100644
index 0000000..1bb8ddf
--- /dev/null
+++ b/dg/src/main/jastadd/DotGraph.relast
@@ -0,0 +1,4 @@
+DotGraph ::= DotNode*;
+DotNode;
+rel DotNode.Ref* -> DotNode;
+rel DotNode.Rel* -> DotNode;
-- 
GitLab