package uk.ac.imperial.lsds.seep.infrastructure.api; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.jetty.util.MultiMap; import uk.ac.imperial.lsds.seep.api.QueryPlan; import uk.ac.imperial.lsds.seep.operator.Connectable; import uk.ac.imperial.lsds.seep.operator.OperatorContext.PlacedOperator; import com.fasterxml.jackson.databind.ObjectMapper; public class RestAPIQueryPlan implements RestAPIRegistryEntry { public static final ObjectMapper mapper = new ObjectMapper(); private QueryPlan queryPlan; private Map<String, Object> extractQPInformation() { Map<String, Object> qpInformation = new HashMap<String, Object>(); List<Object> nodes = new ArrayList<Object>(); List<Object> edges = new ArrayList<Object>(); for (Integer id : queryPlan.getElements().keySet()) { Map<String, Object> nDetails = new HashMap<>(); Connectable c = queryPlan.getElements().get(id); nDetails.put("id", "" + c.getOperatorId()); if (c.getOpContext().getOperatorStaticInformation() != null) { nDetails.put("ip", c.getOpContext().getOperatorStaticInformation().getMyNode().getIp()); nDetails.put("port", c.getOpContext().getOperatorStaticInformation().getMyNode().getPort()); } if (c.getOpContext().isSource()) nDetails.put("type", "graph_type_source"); else if (c.getOpContext().isSink()) nDetails.put("type", "graph_type_sink"); else nDetails.put("type", "graph_type_query"); Map<String, Object> nData = new HashMap<String, Object>(); nData.put("data", nDetails); nodes.add(nData); Iterator<PlacedOperator> iter = c.getOpContext().downstreams.iterator(); while (iter.hasNext()) { PlacedOperator po = iter.next(); Map<String, Object> eDetails = new HashMap<>(); eDetails.put("streamid", c.getOperatorId() + "-" + po.opID()); eDetails.put("source", "" + c.getOperatorId()); eDetails.put("target", "" + po.opID()); eDetails.put("type", "graph_edge_defaults"); Map<String, Object> eData = new HashMap<String, Object>(); eData.put("data", eDetails); edges.add(eData); } } qpInformation.put("nodes", nodes); qpInformation.put("edges", edges); return qpInformation; } public RestAPIQueryPlan(QueryPlan queryPlan) { this.queryPlan = queryPlan; } @Override public Object getAnswer(MultiMap<String> reqParameters) { return extractQPInformation(); } }