package uk.ac.cam.echo.server.analysis.internal; import java.util.*; /** Author: Petar 'PetarV' Veličković Non-persistent force graph. */ public class NPForceGraph { public static class Node { private String name; private long type; private long internalId; public String getName() { return name; } public void setName(String name) { this.name = name; } public long getType() { return type; } public void setType(long type) { this.type = type; } public long getIid() { return internalId; } public void setIid(long iId) { this.internalId = iId; } } private static Map<String, Node> T = new HashMap<String, Node>(); private static Map<Node, Set<Node>> G = new HashMap<Node, Set<Node>>(); public static long lastTS = 0L; private static Node getFNode(String val, long type, long iid) { String tString = type + "|!@()#$||" + iid; if (T.containsKey(tString)) return T.get(tString); Node model = new Node(); model.setName(val); model.setType(type); model.setIid(iid); T.put(tString, model); G.put(model, new HashSet<Node>()); return model; } public static void addNode(String name, long type, long iid) { getFNode(name, type, iid); } public static void addEdge(String uName, long uType, long uIid, String vName, long vType, long vIid) { Node u = getFNode(uName, uType, uIid); Node v = getFNode(vName, vType, vIid); G.get(u).add(v); } public static void flush() { T.clear(); G.clear(); lastTS = 0L; } public static String getJSONFGraph() { StringBuilder jsonFGraph = new StringBuilder(); StringBuilder nodeBuilder = new StringBuilder(); StringBuilder linkBuilder = new StringBuilder(); Map<Node, Long> mst = new HashMap<Node, Long>(); long seqId = 0; nodeBuilder.append('['); boolean nodeStart = false; for (Node FN : G.keySet()) { if (nodeStart) nodeBuilder.append(",\n"); else nodeBuilder.append('\n'); nodeBuilder.append('{'); nodeBuilder.append("\"name\":\"").append(FN.getName()).append("\","); nodeBuilder.append("\"group\":").append(FN.getType()); nodeBuilder.append('}'); mst.put(FN, seqId++); nodeStart = true; } nodeBuilder.append("\n]"); linkBuilder.append('['); boolean linkStart = false; for (Node FN : G.keySet()) { Set<Node> EE = G.get(FN); for (Node FM : EE) { if (linkStart) linkBuilder.append(",\n"); else linkBuilder.append('\n'); linkBuilder.append('{'); linkBuilder.append("\"source\":").append(mst.get(FN)).append(','); linkBuilder.append("\"target\":").append(mst.get(FM)).append(','); linkBuilder.append("\"value\":").append(1); linkBuilder.append('}'); linkStart = true; } } linkBuilder.append("\n]"); jsonFGraph.append("{\n"); jsonFGraph.append("\"nodes\":").append(nodeBuilder).append(",\n"); jsonFGraph.append("\"links\":").append(linkBuilder).append('\n'); jsonFGraph.append("}\n"); return jsonFGraph.toString(); } }