package it.slumdroid.utilities.module.androidtest.graphviz; import it.slumdroid.droidmodels.xml.NodeListIterator; import it.slumdroid.utilities.module.androidtest.efg.EfgEvent; import it.slumdroid.utilities.module.androidtest.efg.EventFlowGraph; import static it.slumdroid.utilities.Resources.BREAK; import static it.slumdroid.utilities.Resources.NEW_LINE; import static it.slumdroid.utilities.Resources.TAB; import static it.slumdroid.utilities.module.androidtest.graphviz.DotUtilities.getCaption; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Element; // TODO: Auto-generated Javadoc /** * The Class GuiTreeToEfgDot. */ public class GuiTreeToEfgDot { /** The edges. */ private List<String> edges; /** The efg. */ private Document efg; /** The nodes. */ private Map<String,String> nodes; /** * Instantiates a new gui tree to efg dot. * * @param efg the efg */ public GuiTreeToEfgDot(EventFlowGraph efg) { this.efg = efg.getDom(); this.edges = new ArrayList<String>(); this.nodes = new HashMap<String,String>(); } /** * Extract edges. */ public void extractEdges() { Element efg = (Element) this.efg.getChildNodes().item(0); this.extractEdges (efg); } /** * Extract edges. * * @param event the event */ private void extractEdges(Element event) { String parentName = event.getAttribute("id"); for (Element element: new NodeListIterator (event)) { String transition = parentName + " -> " + element.getAttribute("id"); this.edges.add (transition); this.extractEdges(element); } } /** * Extract nodes. */ public void extractNodes() { Element efg = (Element) this.efg.getChildNodes().item(0); this.extractNodes (efg); } /** * Extract nodes. * * @param event the event */ private void extractNodes(Element event) { for (Element element: new NodeListIterator (event)) { String name = element.getAttribute("id"); String nodeDesc = getCaption (new EfgEvent(element)); this.nodes.put(name, nodeDesc); this.extractNodes(element); } } /** * Gets the dot. * * @return the dot */ public String getDot() { StringBuilder dot = new StringBuilder (); dot.append("digraph EFG {" + NEW_LINE); extractEdges(); dot.append(NEW_LINE + "## Edges" + BREAK); for (String edge: this.edges) { dot.append(TAB + edge + ";" + NEW_LINE); } extractNodes(); dot.append(NEW_LINE + "## Nodes" + BREAK); for (String node: this.nodes.keySet()) { dot.append(TAB + node + " [label=\"" + nodes.get(node) + "\"];" + NEW_LINE); } dot.append(NEW_LINE + "}"); return dot.toString(); } }