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