use of org.jkiss.dbeaver.ext.ui.locks.graph.LockGraph in project dbeaver by dbeaver.
the class LockGraphManager method getGraph.
public LockGraph getGraph(DBAServerLock curLock) {
LockGraphNode selection = nodes.get(curLock.getId());
LockGraph graph = graphIndex.get(curLock.getId());
if (graph != null && selection != null) {
graph.setSelection(selection);
}
return graph;
}
use of org.jkiss.dbeaver.ext.ui.locks.graph.LockGraph in project dbeaver by dbeaver.
the class LockGraphManager method createGraph.
@SuppressWarnings("unchecked")
private LockGraph createGraph(DBAServerLock root) {
LockGraph graph = new LockGraph(root);
int maxWidth = 1;
int level = 1;
LockGraphNode nodeRoot = nodes.get(root.getId());
nodeRoot.setLevel(0);
nodeRoot.setSpan(1);
graph.getNodes().add(nodeRoot);
graphIndex.put(root.getId(), graph);
List<DBAServerLock> current = new ArrayList<>();
// Prevent Cycle
Set<DBAServerLock> touched = new HashSet<>();
current.add(root);
touched.add(root);
Map<Object, DBAServerLock> childs = new HashMap<>();
while (current.size() > 0) {
if (maxWidth < current.size()) {
maxWidth = current.size();
}
for (int index = 0; index < current.size(); index++) {
DBAServerLock l = (DBAServerLock) current.get(index);
LockGraphNode node = nodes.get(l.getId());
if (index == 0) {
node.setLevelPosition(LockGraphNode.LevelPosition.LEFT);
} else if (index == current.size() - 1) {
node.setLevelPosition(LockGraphNode.LevelPosition.RIGHT);
} else {
node.setLevelPosition(LockGraphNode.LevelPosition.CENTER);
}
node.setSpan(current.size());
for (DBAServerLock c : l.waitThis()) {
if (touched.contains(c))
continue;
touched.add(c);
childs.put(c.getId(), c);
graphIndex.put(c.getId(), graph);
LockGraphNode nodeChild = nodes.get(c.getId());
graph.getNodes().add(nodeChild);
nodeChild.setLevel(level);
LockGraphEdge edge = new LockGraphEdge();
edge.setSource(node);
edge.setTarget(nodeChild);
}
}
level++;
current = new ArrayList<>(childs.values());
childs.clear();
}
graph.setMaxWidth(maxWidth);
return graph;
}
Aggregations