private AdjacencyGraph<Node, Edge<Node>> CreateGraphFromNode(XDocument xDocument, XNode parent) { var graph = new AdjacencyGraph<Node, Edge<Node>>(); var nodes = xDocument.Descendants().Where(x => x.Parent != null && (x.Parent.Parent != null && (x.Parent != null && x.Parent.Parent.Parent == parent))); var fromList = nodes.Where(x => x.Parent != null && (x.Name.LocalName == "ControlFlow" && x.Parent.Name.LocalName =="FromSimpleRelationships") ); var toList = nodes.Where(x => x.Parent != null && (x.Name.LocalName == "ControlFlow" && x.Parent.Name.LocalName =="ToSimpleRelationships") ); foreach (var fromNode in fromList) { var xNode1 = fromNode.Parent.Parent; string idref = fromNode.Attribute("Idref").Value; var xNode2 = toList.Where(x => x.Parent != null && (x.Attribute("Idref").Value.ToString() == idref)) .Select(x => x.Parent.Parent).FirstOrDefault(); if (xNode1 == null || xNode2 == null) continue; Node node1 = new Node(xNode1.Attribute("Name").Value, GetNodeType(xNode1)); Node node2 = new Node(xNode2.Attribute("Name").Value, GetNodeType(xNode2)); if (!graph.Vertices.Any(x => x.Name==node1.Name && x.Type==node1.Type)) { graph.AddVertex(node1); } else { node1 = graph.Vertices.FirstOrDefault(x => x.Name == node1.Name && x.Type == node1.Type); } if (!graph.Vertices.Any(x => x.Name == node2.Name && x.Type == node2.Type)) { graph.AddVertex(node2); } else { node2 = graph.Vertices.FirstOrDefault(x => x.Name == node2.Name && x.Type == node2.Type); } var newEdge = new Edge<Node>(node1, node2); if(!graph.ContainsEdge(newEdge)) graph.AddEdge(newEdge); } return graph; }
/// <summary> /// Znajduje wszystkie paterny dec /// </summary> /// <param name="g"></param> /// <returns></returns> public AdjacencyGraph<Node, Edge<Node>> FindDecisionPattern(AdjacencyGraph<Node, Edge<Node>> g) { List<Node> decisionNodes = g.Vertices.Where(x => x.Type == NodeType.DecisionNode).ToList(); foreach (var decisionNode in decisionNodes) { var outEdges = g.OutEdges(decisionNode); var left = outEdges.ElementAt(0).Target; var right = outEdges.ElementAt(1).Target; var upperEdge = g.Edges.Where(x => x.Target == decisionNode).ToList().FirstOrDefault(); if (g.OutEdges(left).Count() == 1 && g.OutEdges(right).Count() == 1 && ( g.OutEdges(left).ElementAt(0).Target == g.OutEdges(right).ElementAt(0).Target) || g.OutEdges(left).ElementAt(0).Target == right || g.OutEdges(right).ElementAt(0).Target == left || left.Type==NodeType.ActivityFinalNode || right.Type==NodeType.ActivityFinalNode) { string name = "dec(" + decisionNode.Name + ", " + left.Name + ", " + right.Name + ")"; var decisionPattern = new Node(name, NodeType.DecisionPattern); g.AddVertex(decisionPattern); var nextNode = g.OutEdges(right).ElementAt(0).Target; if(nextNode == left || nextNode==right) nextNode = g.OutEdges(left).ElementAt(0).Target; g.AddEdge(new Edge<Node>(upperEdge.Source, decisionPattern)); g.AddEdge(new Edge<Node>(decisionPattern, nextNode)); g.RemoveVertex(decisionNode); g.RemoveVertex(left); g.RemoveVertex(right); } } return g; }
internal static AdjacencyGraph<Node, Edge<Node>> GetGraphMock(int number) { var graph = new AdjacencyGraph<Node, Edge<Node>>(); if (number == 1) { Node start = new Node("start", NodeType.InitalNode); Node a = new Node("a", NodeType.ActivityAction); Node b = new Node("b", NodeType.ActivityAction); Node c = new Node("c", NodeType.ActivityAction); Node end = new Node("end", NodeType.ActivityFinalNode); Node dec1 = new Node("dec1", NodeType.DecisionNode); Node dec2 = new Node("dec2", NodeType.DecisionNode); graph.AddVertex(start); graph.AddVertex(a); graph.AddVertex(b); graph.AddVertex(c); graph.AddVertex(end); graph.AddVertex(dec1); graph.AddVertex(dec2); graph.AddEdge(new Edge<Node>(start, dec1)); graph.AddEdge(new Edge<Node>(c, end)); graph.AddEdge(new Edge<Node>(dec1, c)); graph.AddEdge(new Edge<Node>(dec1, dec2)); graph.AddEdge(new Edge<Node>(dec2, a)); graph.AddEdge(new Edge<Node>(dec2, b)); graph.AddEdge(new Edge<Node>(a, end)); graph.AddEdge(new Edge<Node>(b, end)); } if (number == 2) { Node start = new Node("start", NodeType.InitalNode); Node a = new Node("a", NodeType.ActivityAction); Node b = new Node("b", NodeType.ActivityAction); Node c = new Node("c", NodeType.ActivityAction); Node d = new Node("d", NodeType.ActivityAction); Node end = new Node("end", NodeType.ActivityFinalNode); Node dec1 = new Node("dec1", NodeType.DecisionNode); Node dec2 = new Node("dec2", NodeType.DecisionNode); graph.AddVertex(start); graph.AddVertex(a); graph.AddVertex(b); graph.AddVertex(c); graph.AddVertex(end); graph.AddVertex(dec1); graph.AddVertex(dec2); graph.AddVertex(d); graph.AddEdge(new Edge<Node>(start, dec1)); graph.AddEdge(new Edge<Node>(c, end)); graph.AddEdge(new Edge<Node>(dec1, c)); graph.AddEdge(new Edge<Node>(dec1, dec2)); graph.AddEdge(new Edge<Node>(dec2, a)); graph.AddEdge(new Edge<Node>(dec2, b)); graph.AddEdge(new Edge<Node>(b, end)); graph.AddEdge(new Edge<Node>(a, d)); graph.AddEdge(new Edge<Node>(d, end)); } if (number == 3) { Node start = new Node("start", NodeType.InitalNode); Node a = new Node("a", NodeType.ActivityAction); Node b = new Node("b", NodeType.ActivityAction); Node c = new Node("c", NodeType.ActivityAction); Node d = new Node("d", NodeType.ActivityAction); Node e = new Node("e", NodeType.ActivityAction); Node f = new Node("f", NodeType.ActivityAction); Node g = new Node("g", NodeType.ActivityAction); Node h = new Node("h", NodeType.ActivityAction); Node end = new Node("end", NodeType.ActivityFinalNode); Node dec1 = new Node("dec1", NodeType.DecisionNode); Node dec2 = new Node("dec2", NodeType.DecisionNode); Node fork1 = new Node("fork1", NodeType.ForkNode); Node fork2 = new Node("fork2", NodeType.ForkNode); Node join1 = new Node("join1", NodeType.JoinNode); Node join2 = new Node("join2", NodeType.JoinNode); graph.AddVertex(start); graph.AddVertex(a); graph.AddVertex(b); graph.AddVertex(c); graph.AddVertex(d); graph.AddVertex(e); graph.AddVertex(f); graph.AddVertex(g); graph.AddVertex(h); graph.AddVertex(end); graph.AddVertex(dec1); graph.AddVertex(dec2); graph.AddVertex(fork1); graph.AddVertex(fork2); graph.AddVertex(join1); graph.AddVertex(join2); graph.AddEdge(new Edge<Node>(start, dec1)); graph.AddEdge(new Edge<Node>(dec1, g)); graph.AddEdge(new Edge<Node>(dec1, dec2)); graph.AddEdge(new Edge<Node>(g, fork2)); graph.AddEdge(new Edge<Node>(fork2, e)); graph.AddEdge(new Edge<Node>(fork2, f)); graph.AddEdge(new Edge<Node>(e, join2)); graph.AddEdge(new Edge<Node>(f, join2)); graph.AddEdge(new Edge<Node>(join2, end)); graph.AddEdge(new Edge<Node>(dec2, a)); graph.AddEdge(new Edge<Node>(dec2, h)); graph.AddEdge(new Edge<Node>(h, fork1)); graph.AddEdge(new Edge<Node>(fork1, b)); graph.AddEdge(new Edge<Node>(a, d)); graph.AddEdge(new Edge<Node>(d, end)); graph.AddEdge(new Edge<Node>(fork1, c)); graph.AddEdge(new Edge<Node>(b, join1)); graph.AddEdge(new Edge<Node>(c, join1)); graph.AddEdge(new Edge<Node>(join1, end)); } if (number == 4) { Node start = new Node("start", NodeType.InitalNode); Node a = new Node("a", NodeType.ActivityAction); Node b = new Node("b", NodeType.ActivityAction); Node c = new Node("c", NodeType.ActivityAction); Node d = new Node("d", NodeType.ActivityAction); Node e = new Node("e", NodeType.ActivityAction); Node f = new Node("f", NodeType.ActivityAction); Node g = new Node("g", NodeType.ActivityAction); Node h = new Node("h", NodeType.ActivityAction); Node i = new Node("i", NodeType.ActivityAction); Node j = new Node("j", NodeType.ActivityAction); Node k = new Node("k", NodeType.ActivityAction); Node l = new Node("l", NodeType.ActivityAction); Node end = new Node("end", NodeType.ActivityFinalNode); Node dec1 = new Node("dec1", NodeType.DecisionNode); Node dec2 = new Node("dec2", NodeType.DecisionNode); Node fork1 = new Node("fork1", NodeType.ForkNode); Node fork2 = new Node("fork2", NodeType.ForkNode); Node fork3 = new Node("fork3", NodeType.ForkNode); Node join1 = new Node("join1", NodeType.JoinNode); Node join2 = new Node("join2", NodeType.JoinNode); Node join3 = new Node("join3", NodeType.JoinNode); graph.AddVertex(start); graph.AddVertex(a); graph.AddVertex(b); graph.AddVertex(c); graph.AddVertex(d); graph.AddVertex(e); graph.AddVertex(f); graph.AddVertex(g); graph.AddVertex(h); graph.AddVertex(i); graph.AddVertex(j); graph.AddVertex(k); graph.AddVertex(l); graph.AddVertex(end); graph.AddVertex(dec1); graph.AddVertex(dec2); graph.AddVertex(fork1); graph.AddVertex(fork2); graph.AddVertex(fork3); graph.AddVertex(join1); graph.AddVertex(join2); graph.AddVertex(join3); graph.AddEdge(new Edge<Node>(start, dec1)); graph.AddEdge(new Edge<Node>(dec1, g)); graph.AddEdge(new Edge<Node>(dec1, dec2)); graph.AddEdge(new Edge<Node>(g, fork2)); graph.AddEdge(new Edge<Node>(fork2, l)); graph.AddEdge(new Edge<Node>(fork2, i)); graph.AddEdge(new Edge<Node>(i, j)); graph.AddEdge(new Edge<Node>(j, k)); graph.AddEdge(new Edge<Node>(l, fork3)); graph.AddEdge(new Edge<Node>(fork3, e)); graph.AddEdge(new Edge<Node>(fork3, f)); graph.AddEdge(new Edge<Node>(e, join3)); graph.AddEdge(new Edge<Node>(f, join3)); graph.AddEdge(new Edge<Node>(join3, join2)); graph.AddEdge(new Edge<Node>(k, join2)); graph.AddEdge(new Edge<Node>(join2, end)); graph.AddEdge(new Edge<Node>(dec2, a)); graph.AddEdge(new Edge<Node>(dec2, h)); graph.AddEdge(new Edge<Node>(h, fork1)); graph.AddEdge(new Edge<Node>(fork1, b)); graph.AddEdge(new Edge<Node>(a, d)); graph.AddEdge(new Edge<Node>(d, end)); graph.AddEdge(new Edge<Node>(fork1, c)); graph.AddEdge(new Edge<Node>(b, join1)); graph.AddEdge(new Edge<Node>(c, join1)); graph.AddEdge(new Edge<Node>(join1, end)); } if (number == 5) { Node start = new Node("start", NodeType.InitalNode); Node a = new Node("a", NodeType.ActivityAction); Node b = new Node("b", NodeType.ActivityAction); Node c = new Node("c", NodeType.ActivityAction); Node d = new Node("d", NodeType.ActivityAction); Node e = new Node("e", NodeType.ActivityAction); Node f = new Node("f", NodeType.ActivityAction); Node g = new Node("g", NodeType.ActivityAction); Node h = new Node("h", NodeType.ActivityAction); Node i = new Node("i", NodeType.ActivityAction); Node j = new Node("j", NodeType.ActivityAction); Node l = new Node("l", NodeType.ActivityAction); Node end = new Node("end", NodeType.ActivityFinalNode); Node dec1 = new Node("dec1", NodeType.DecisionNode); Node dec2 = new Node("dec2", NodeType.DecisionNode); Node dec3 = new Node("dec3", NodeType.DecisionNode); Node fork1 = new Node("fork1", NodeType.ForkNode); Node fork2 = new Node("fork2", NodeType.ForkNode); Node fork3 = new Node("fork3", NodeType.ForkNode); Node join1 = new Node("join1", NodeType.JoinNode); Node join2 = new Node("join2", NodeType.JoinNode); Node join3 = new Node("join3", NodeType.JoinNode); graph.AddVertex(start); graph.AddVertex(a); graph.AddVertex(b); graph.AddVertex(c); graph.AddVertex(d); graph.AddVertex(e); graph.AddVertex(f); graph.AddVertex(g); graph.AddVertex(h); graph.AddVertex(i); graph.AddVertex(j); graph.AddVertex(l); graph.AddVertex(end); graph.AddVertex(dec1); graph.AddVertex(dec2); graph.AddVertex(dec3); graph.AddVertex(fork1); graph.AddVertex(fork2); graph.AddVertex(fork3); graph.AddVertex(join1); graph.AddVertex(join2); graph.AddVertex(join3); graph.AddEdge(new Edge<Node>(start, dec1)); graph.AddEdge(new Edge<Node>(dec1, g)); graph.AddEdge(new Edge<Node>(dec1, dec2)); graph.AddEdge(new Edge<Node>(g, fork2)); graph.AddEdge(new Edge<Node>(fork2, l)); graph.AddEdge(new Edge<Node>(fork2, i)); graph.AddEdge(new Edge<Node>(i, dec3)); graph.AddEdge(new Edge<Node>(j, dec3)); graph.AddEdge(new Edge<Node>(dec3, j)); graph.AddEdge(new Edge<Node>(dec3, join2)); graph.AddEdge(new Edge<Node>(l, fork3)); graph.AddEdge(new Edge<Node>(fork3, e)); graph.AddEdge(new Edge<Node>(fork3, f)); graph.AddEdge(new Edge<Node>(e, join3)); graph.AddEdge(new Edge<Node>(f, join3)); graph.AddEdge(new Edge<Node>(join3, join2)); graph.AddEdge(new Edge<Node>(join2, end)); graph.AddEdge(new Edge<Node>(dec2, a)); graph.AddEdge(new Edge<Node>(dec2, h)); graph.AddEdge(new Edge<Node>(h, fork1)); graph.AddEdge(new Edge<Node>(fork1, b)); graph.AddEdge(new Edge<Node>(a, d)); graph.AddEdge(new Edge<Node>(d, end)); graph.AddEdge(new Edge<Node>(fork1, c)); graph.AddEdge(new Edge<Node>(b, join1)); graph.AddEdge(new Edge<Node>(c, join1)); graph.AddEdge(new Edge<Node>(join1, end)); } if (number == 6) { Node start = new Node("start", NodeType.InitalNode); Node a = new Node("a", NodeType.ActivityAction); Node b = new Node("b", NodeType.ActivityAction); Node c = new Node("c", NodeType.ActivityAction); Node d = new Node("d", NodeType.ActivityAction); Node e = new Node("e", NodeType.ActivityAction); Node f = new Node("f", NodeType.ActivityAction); Node g = new Node("g", NodeType.ActivityAction); Node h = new Node("h", NodeType.ActivityAction); Node i = new Node("i", NodeType.ActivityAction); Node j = new Node("j", NodeType.ActivityAction); Node k = new Node("k", NodeType.ActivityAction); Node l = new Node("l", NodeType.ActivityAction); Node m = new Node("m", NodeType.ActivityAction); Node n = new Node("n", NodeType.ActivityAction); Node o = new Node("o", NodeType.ActivityAction); Node p = new Node("p", NodeType.ActivityAction); Node end = new Node("end", NodeType.ActivityFinalNode); Node dec1 = new Node("dec1", NodeType.DecisionNode); Node dec2 = new Node("dec2", NodeType.DecisionNode); Node dec3 = new Node("dec3", NodeType.DecisionNode); Node dec4 = new Node("dec4", NodeType.DecisionNode); Node dec5 = new Node("dec5", NodeType.DecisionNode); Node fork1 = new Node("fork1", NodeType.ForkNode); Node fork2 = new Node("fork2", NodeType.ForkNode); Node fork3 = new Node("fork3", NodeType.ForkNode); Node join1 = new Node("join1", NodeType.JoinNode); Node join2 = new Node("join2", NodeType.JoinNode); Node join3 = new Node("join3", NodeType.JoinNode); graph.AddVertex(start); graph.AddVertex(a); graph.AddVertex(b); graph.AddVertex(c); graph.AddVertex(d); graph.AddVertex(g); graph.AddVertex(h); graph.AddVertex(i); graph.AddVertex(j); graph.AddVertex(k); graph.AddVertex(l); graph.AddVertex(m); graph.AddVertex(n); graph.AddVertex(o); graph.AddVertex(p); graph.AddVertex(end); graph.AddVertex(dec1); graph.AddVertex(dec2); graph.AddVertex(dec3); graph.AddVertex(dec4); graph.AddVertex(dec5); graph.AddVertex(fork1); graph.AddVertex(fork2); graph.AddVertex(fork3); graph.AddVertex(join1); graph.AddVertex(join2); graph.AddVertex(join3); graph.AddEdge(new Edge<Node>(start, dec1)); graph.AddEdge(new Edge<Node>(dec1, g)); graph.AddEdge(new Edge<Node>(dec1, dec2)); graph.AddEdge(new Edge<Node>(g, fork2)); graph.AddEdge(new Edge<Node>(fork2, l)); graph.AddEdge(new Edge<Node>(fork2, i)); graph.AddEdge(new Edge<Node>(i, dec3)); graph.AddEdge(new Edge<Node>(dec3, j)); graph.AddEdge(new Edge<Node>(j, dec4)); graph.AddEdge(new Edge<Node>(dec4, k)); graph.AddEdge(new Edge<Node>(k, dec4)); graph.AddEdge(new Edge<Node>(dec4, dec3)); graph.AddEdge(new Edge<Node>(dec3, join2)); graph.AddEdge(new Edge<Node>(l, fork3)); graph.AddEdge(new Edge<Node>(fork3, m)); graph.AddEdge(new Edge<Node>(fork3, n)); graph.AddEdge(new Edge<Node>(n, join3)); graph.AddEdge(new Edge<Node>(m, dec5)); graph.AddEdge(new Edge<Node>(dec5, o)); graph.AddEdge(new Edge<Node>(dec5, join3)); graph.AddEdge(new Edge<Node>(o, p)); graph.AddEdge(new Edge<Node>(p, dec5)); graph.AddEdge(new Edge<Node>(join3, join2)); graph.AddEdge(new Edge<Node>(join2, end)); graph.AddEdge(new Edge<Node>(dec2, a)); graph.AddEdge(new Edge<Node>(dec2, h)); graph.AddEdge(new Edge<Node>(h, fork1)); graph.AddEdge(new Edge<Node>(fork1, b)); graph.AddEdge(new Edge<Node>(a, d)); graph.AddEdge(new Edge<Node>(d, end)); graph.AddEdge(new Edge<Node>(fork1, c)); graph.AddEdge(new Edge<Node>(b, join1)); graph.AddEdge(new Edge<Node>(c, join1)); graph.AddEdge(new Edge<Node>(join1, end)); } return graph; }
/// <summary> /// Tworzy noda typu loop /// </summary> /// <param name="g"></param> /// <param name="decisionNode"></param> /// <param name="d"></param> /// <param name="e"></param> /// <param name="previousNode"></param> /// <param name="nextNode"></param> /// <returns></returns> private AdjacencyGraph<Node, Edge<Node>> MakeLoopPattern(AdjacencyGraph<Node, Edge<Node>> g, Node decisionNode, Node d, Node e, Node previousNode, Node nextNode) { string name = "loop(" + d.Name + "," + decisionNode.Name + "," + e.Name + ")"; var loopPattern = new Node(name, NodeType.LoopPattern); g.AddVertex(loopPattern); g.AddEdge(new Edge<Node>(previousNode, loopPattern)); g.AddEdge(new Edge<Node>(loopPattern, nextNode)); g.RemoveVertex(d); g.RemoveVertex(e); g.RemoveVertex(decisionNode); return g; }
/// <summary> /// Zwraca liste rodzicow dla danego noda /// </summary> /// <param name="g"></param> /// <param name="node"></param> /// <returns></returns> private IEnumerable<Node> GetParents(AdjacencyGraph<Node, Edge<Node>> g, Node node) { return g.Edges.Where(x => x.Target == node).Select(x => x.Source); }
/// <summary> /// Znajduje wszystkie paterny seq /// </summary> /// <param name="g"></param> /// <returns></returns> public AdjacencyGraph<Node, Edge<Node>> FindSeqPattern(AdjacencyGraph<Node, Edge<Node>> g) { var chuj = true; while (chuj) { List<Edge<Node>> followingEdges = GetEdgesForSeq(g); if (followingEdges.Count == 0) { chuj = false; continue; } var followingEdge = followingEdges.FirstOrDefault(); //utworzenie nowego seq patternu string name = "seq(" + followingEdge.Source.Name + "," + followingEdge.Target.Name + ")"; var seqPattern = new Node(name, NodeType.SeqPattern); //znalezienie poprzedniego i nastepnego polaczenia polaczenia var upperEdge = g.Edges.Where(x => x.Target == followingEdge.Source).ToList().FirstOrDefault(); var lowerEdge = g.OutEdges(followingEdge.Target).ElementAt(0); //dodanie noda i polaczen g.AddVertex(seqPattern); g.AddEdge(new Edge<Node>(upperEdge.Source, seqPattern)); g.AddEdge(new Edge<Node>(seqPattern, lowerEdge.Target)); //usuniecie starych nodow g.RemoveVertex(followingEdge.Source); g.RemoveVertex(followingEdge.Target); } return g; }
/// <summary> /// Znajduje wszystkie paterny par /// </summary> /// <param name="g"></param> /// <returns></returns> public AdjacencyGraph<Node, Edge<Node>> FindParPattern(AdjacencyGraph<Node, Edge<Node>> g) { List<Node> forkNodes = g.Vertices.Where(x => x.Type == NodeType.ForkNode).ToList(); foreach (var forkNode in forkNodes) { var forkEdges = g.Edges.Where(x => x.Source == forkNode).ToList(); var leftEdge = forkEdges[0]; var rightEdge = forkEdges[1]; var forkInEdge = g.Edges.Where(x => x.Target == forkNode).ToList().FirstOrDefault(); var leftOutNode = g.OutEdges(leftEdge.Target).ElementAt(0).Target; var rightOutNode = g.OutEdges(rightEdge.Target).ElementAt(0).Target; var startParNode = forkInEdge.Source; var startParNodeInEdge = g.Edges.Where(x => x.Target == startParNode).ToList().FirstOrDefault(); if (leftOutNode == rightOutNode && leftOutNode.Type == NodeType.JoinNode) { string name = "par(" + forkInEdge.Source.Name + "," + leftEdge.Target.Name + "," + rightEdge.Target.Name + ")"; var parPattern = new Node(name, NodeType.ParPattern); //dodaje pattern g.AddVertex(parPattern); g.AddEdge(new Edge<Node>(startParNodeInEdge.Source, parPattern)); g.AddEdge(new Edge<Node>(parPattern, g.OutEdges(rightOutNode).ElementAt(0).Target)); //usuwa fork,join,a,b g.RemoveVertex(leftEdge.Target); g.RemoveVertex(rightEdge.Target); g.RemoveVertex(forkNode); g.RemoveVertex(rightOutNode); g.RemoveVertex(startParNode); } } return g; }