package org.hadatac.console.models;
import org.apache.jena.base.Sys;
import org.hadatac.console.http.GetSparqlQuery;
import org.hadatac.utils.Collections;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ForceFieldQuery {
String collectionSource = Collections.METADATA_SPARQL;
List<AgentNode> agents = new ArrayList<AgentNode>();
public ForceFieldQuery() {
this(Collections.METADATA_SPARQL);
}
public ForceFieldQuery(String source) {
collectionSource = source;
System.out.println("Collection source in use: " + collectionSource);
agents.add(new AgentNode("prov:Agent", "Public", AgentNode.AGENT, "", ""));
addGroupNodes();
addPersonNodes();
}
private JsonNode readTreeNodes(String tabQuery){
SparqlQuery query = new SparqlQuery();
GetSparqlQuery query_submit = new GetSparqlQuery(collectionSource, query);
System.out.println("Requested: <" + tabQuery + ">");
String query_json = null;
try {
query_json = query_submit.executeQuery(tabQuery);
System.out.println("Here is the result: <" + query_json + ">");
} catch (IllegalStateException e1) {
e1.printStackTrace();
}
ObjectMapper mapper = new ObjectMapper();
// use the ObjectMapper to read the json string and create a tree
JsonNode rootNode = null;
try {
rootNode = mapper.readTree(query_json);
System.out.println("Here is the size of results: <" + rootNode.size() + ">");
} catch (IOException e) {
e.printStackTrace();
}
return rootNode;
}
private String getNodeValue(JsonNode node, String defaultValue) {
if (node != null && node.get("value") != null) {
return node.get("value").asText();
}
else {
return defaultValue;
}
}
private void addGroupNodes(){
JsonNode rootNode = readTreeNodes("GroupsH");
JsonNode bindingsNode = rootNode.findPath("bindings");
System.out.println("Here is the size of bindings: <" + bindingsNode.size() + ">");
Iterator<JsonNode> elements = bindingsNode.elements();
while (elements.hasNext()){
JsonNode binding = elements.next();
String uri = getNodeValue(binding.findPath("agent"), "");
String name = getNodeValue(binding.findPath("name"), uri);
String email = getNodeValue(binding.findPath("email"), "");
String memberOf = getNodeValue(binding.findPath("group"), "");
agents.add(new AgentNode(uri, name, AgentNode.GROUP, email, memberOf));
}
}
private void addPersonNodes(){
JsonNode rootNode = readTreeNodes("PeopleH");
JsonNode bindingsNode = rootNode.findPath("bindings");
System.out.println("Here is the size of bindings: <" + bindingsNode.size() + ">");
System.out.println(bindingsNode.toString());
Iterator<JsonNode> elements = bindingsNode.elements();
while (elements.hasNext()){
JsonNode binding = elements.next();
String uri = getNodeValue(binding.findPath("agent"), "");
String name = getNodeValue(binding.findPath("name"), uri);
String email = getNodeValue(binding.findPath("email"), "");
String memberOf = getNodeValue(binding.findPath("group"), "");
agents.add(new AgentNode(uri, name, AgentNode.PERSON, email, memberOf));
}
}
private int findAgentIndex(String uri) {
Iterator<AgentNode> ag = agents.iterator();
if (uri.equals("Public")){
return 0;
}
while (ag.hasNext()) {
AgentNode tmpAgent = ag.next();
if (tmpAgent.getURI().equals(uri)){
return agents.indexOf(tmpAgent);
}
}
return -1;
}
private String toJson() {
JSONObject tree = new JSONObject();
JSONArray nodes = new JSONArray();
Iterator<AgentNode> ag = agents.iterator();
while (ag.hasNext()) {
AgentNode tmpAgent = ag.next();
JSONObject agent = new JSONObject();
System.out.println(tmpAgent.getName());
agent.put("name", tmpAgent.getName());
if (tmpAgent.getEmail() != null && !tmpAgent.getEmail().equals("")) {
agent.put("email", tmpAgent.getEmail());
}
agent.put("group", tmpAgent.getType() + 1);
nodes.add(agent);
}
tree.put("nodes", nodes);
JSONArray links = new JSONArray();
ag = agents.iterator();
while (ag.hasNext()) {
AgentNode tmpAgent = ag.next();
JSONObject edge = new JSONObject();
System.out.println(tmpAgent.getName() + "=====");
System.out.println(tmpAgent.getMemberOf() + "!!!!!");
if (!tmpAgent.getMemberOf().equals("")) {
int ind = findAgentIndex(tmpAgent.getMemberOf());
if (ind == -1) {
System.out.println("Invalid memberOf info for " + tmpAgent.getURI() + " under " + tmpAgent.getMemberOf());
}
else {
edge.put("source", agents.indexOf(tmpAgent));
edge.put("target", ind);
edge.put("value", 4);
links.add(edge);
}
}
}
tree.put("links", links);
System.out.println(tree.toJSONString());
return tree.toJSONString();
}
public String getQueryResult() {
if (agents.size() == 0){
return "";
}
else{
return toJson();
}
}
}