// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ package graphtea.plugins.main.core.actions; import graphtea.graph.atributeset.GraphAttrSet; import graphtea.graph.graph.Edge; import graphtea.graph.graph.GraphModel; import graphtea.graph.graph.Vertex; import graphtea.graph.old.GStroke; import graphtea.platform.Application; import graphtea.platform.core.AbstractAction; import graphtea.platform.core.BlackBoard; import graphtea.platform.core.Listener; import graphtea.plugins.main.core.actions.edge.AddEdge; import graphtea.plugins.main.core.actions.vertex.AddVertex; import graphtea.ui.UIUtils; import java.util.HashMap; /** * @author azin azadi */ public class BlackBoardWatcher extends AbstractAction { /** * constructor * * @param bb the blackboard of the action */ public BlackBoardWatcher(BlackBoard bb) { super(bb); listen4Event(UIUtils.getUIEventKey("debug blackboard")); } public void performAction(String eventName, Object value) { GraphModel g = blackboard.getData(GraphAttrSet.name); final BlackBoardDebug bbd = new BlackBoardDebug(g); new Thread(){ public void run() { Application gg = new graphtea.platform.Application(); //blackboard.getData(Application.APPLICATION_INSTANCE); gg.plugger = new graphtea.platform.plugin.Plugger(bbd); gg.run(bbd); } }.start(); } } class BlackBoardDebug extends BlackBoard { GraphModel g; public BlackBoardDebug(GraphModel g) { this.g = g; } /** * searchs in the stackTrace and returns the * first nonblackboard classname.callingmethod.linenumber */ private StackTraceElement getCallingMethod() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); int n = 2; StackTraceElement st = stackTrace[n]; String c = st.getClassName(); while (c.contains("BlackBoard") || c.contains("AbstractAction")) { System.out.println(stackTrace[n]); ++n; c = stackTrace[n].getClassName(); } return stackTrace[n]; // return "*"+clazz+"."+s.getMethodName();//+":"+s.getLineNumber(); } // HashMap<String, Vertex> knownPlaces=new HashMap<String, Vertex>(); HashMap<String, Vertex> knownLogs = new HashMap<>(); HashMap<StackTraceElement, Vertex> knownTraces = new HashMap<>(); // public Log getLog(String name) { // addEdge(getCallingMethod(),name); // return super.getLog(name); // } public void setData(String name, Object value) { addEdge(getCallingMethod(), name, true, false); super.setData(name, value); } @Override public void addListener(String key, Listener listener) { addEdge(getCallingMethod(), key, true, true); super.addListener(key, listener); } @Override protected void fireListeners(String key, Object newValue) { addEdge(getCallingMethod(), key, false, true); super.fireListeners(key, newValue); } public <t> t getData(String name) { addEdge(getCallingMethod(), name, false, false); return (t) super.getData(name); } private Vertex getLogVertex(String name) { Vertex vn = knownLogs.get(name); if (vn == null || !g.containsVertex(vn)) { vn = addVertex(); vn.setLabel(name); vn.setColor(2); knownLogs.put(name, vn); } return vn; } private Vertex addVertex() { return AddVertex.addVertexToRandomPosition(g); } HashMap<Vertex, Vertex> methodOwners = new HashMap<>(); HashMap<String, Vertex> classes = new HashMap<>(); HashMap<String, HashMap<String, Vertex>> methods = new HashMap<>(); private Vertex getClassVertex(StackTraceElement ste) { String clazz = ste.getClassName(); String method = ste.getMethodName(); Vertex _class = classes.get(clazz); methods.putIfAbsent(clazz, new HashMap<>()); Vertex _method = methods.get(clazz).get(method); Vertex _methodParent = methodOwners.get(_method); if (_class == null || !g.containsVertex(_class)) { _class = addVertex(); _class.setLabel(clazz.substring(clazz.lastIndexOf(".") + 1)); _class.setColor(4); classes.put(clazz, _class); } if (_method == null || _methodParent != _class || !g.containsVertex(_method)) { _method = addVertex(); methodOwners.put(_method, _class); methods.get(clazz).put(method, _method); AddEdge.doJob(g, _class, _method).setLabel(""); _method.setLabel(method + "()"); _method.setColor(3); } return _method; } private Edge addEdge(StackTraceElement ste, String logName, boolean set, boolean listener) { g.setShowChangesOnView(true); Edge e; if (set) e= AddEdge.doJob(g, getClassVertex(ste), getLogVertex(logName)); else e= AddEdge.doJob(g, getLogVertex(logName),getClassVertex(ste)); e.setLabel(ste.getLineNumber() + ""); e.setWeight(1 + e.getWeight()); if (set && !listener) e.setColor(5); //else // e.setColor(2); if (listener) e.setStroke(GStroke.dashed); g.setShowChangesOnView(false); return e; } // public Variable getVar(String name) { //// addEdge(getCallingMethod(),name); // return super.getVar(name); // } }