package uk.ac.cam.echo.server.analysis.internal;
import org.hibernate.criterion.Restrictions;
import uk.ac.cam.echo.server.HibernateUtil;
import uk.ac.cam.echo.server.models.NodeModel;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
Author: Petar 'PetarV' Veličković
A utility class designed to simplify graph generation
and conversion into various JSON forms.
*/
public class GraphUtil
{
public static long lastTS = 0L;
public static List<NodeModel> getAll()
{
return HibernateUtil.getTransaction().createCriteria(NodeModel.class).list();
}
private static NodeModel createNode(String val)
{
NodeModel model = new NodeModel();
model.setName(val);
model.setAdjacent(new HashSet<NodeModel>());
model.save();
return model;
}
public static NodeModel getNode(String val)
{
List<NodeModel> res = HibernateUtil.getTransaction().createCriteria(NodeModel.class).add(Restrictions.eq("name", val)).list();
if (res == null) return createNode(val);
if (res.isEmpty()) return createNode(val);
return res.get(0);
}
public static void addEdge(String from, String to)
{
NodeModel u = getNode(from);
NodeModel v = getNode(to);
u.addAdjacentNode(v);
HibernateUtil.getTransaction().update(u);
}
private static void flush()
{
// kill the database. NOP for now.
}
public static String getJSONGraph()
{
StringBuilder jsonGraph = new StringBuilder();
boolean headStart = false;
jsonGraph.append('[');
List<NodeModel> V = getAll();
for (NodeModel N : V)
{
if (headStart) jsonGraph.append(",\n");
else jsonGraph.append('\n');
jsonGraph.append('{');
jsonGraph.append("\"name\":\"").append(N.getName()).append("\",");
jsonGraph.append("\"size\":").append(N.getId()).append(',');
jsonGraph.append("\"imports\":");
jsonGraph.append('[');
Set<NodeModel> adj = N.getAdjacent();
boolean start = false;
for (NodeModel M : adj)
{
if (start) jsonGraph.append(',');
jsonGraph.append('\"').append(M.getName()).append('\"');
start = true;
}
jsonGraph.append("]}");
headStart = true;
}
jsonGraph.append("\n]\n");
return jsonGraph.toString();
}
}