package org.hadatac.console.models;
import java.util.TreeMap;
import java.util.ArrayList;
import java.util.Random;
import com.fasterxml.jackson.databind.JsonNode;
public class OtMTripleDocument{
public TreeMap<String,ArrayList<String>> items = new TreeMap<String,ArrayList<String>>();
//public String resultType;
private ArrayList<String> vars;
private int numVars;
public OtMTripleDocument() {
System.out.println("created new OtMTripleDocument");
}
public OtMTripleDocument(JsonNode node, ArrayList<String> vars) {
//this.resultType = resultType;
this.vars = vars;
this.numVars = vars.size();
String variable;
for( int i = 0; i < this.numVars; i++){
variable = "";
try {
if (node.get(vars.get(i)).hasNonNull("value")) {
variable = node.get(vars.get(i)).get("value").asText();
if(variable.contains("#")) {
if(!variable.contains("URI"))
variable = prettyFromURI(variable);
}
if(isDouble(variable)){
variable = toNum(Double.parseDouble(variable));
}
}
//System.out.println("read: " + vars.get(i) + " = " + variable);
} catch (NullPointerException e){
if(vars.get(i).equals("sn")) {
variable = generateID();
//System.out.println(resultType + " is missing a serial number! " + variable + " generated as placeholder");
}
else {
variable = "";
//System.out.println("Error getting " + vars.get(i) + " from results " + resultType);
}
}// /catch
addItem(vars.get(i), variable);
}// /for
}// constructor
public void addDoc(JsonNode node){
String variable;
for( int i = 0; i < this.numVars; i++){
variable = "";
try {
if(node.get(vars.get(i)).hasNonNull("value")){
variable = node.get(vars.get(i)).get("value").asText();
if(variable.contains("#"))
if(!variable.contains("URI"))
variable = prettyFromURI(variable);
if(isDouble(variable)){
variable = toNum(Double.parseDouble(variable));
}
}
//System.out.println("read: " + vars.get(i) + " = " + variable);
} catch (NullPointerException e){
if(vars.get(i).equals("sn")) {
variable = generateID();
//System.out.println(resultType + " is missing a serial number! " + variable + " generated as placeholder");
}
else {
variable = "";
//System.out.println("Error getting " + vars.get(i) + " from results " + resultType);
}
}// /catch
addItem(vars.get(i), variable);
}// /for
}// /addDoc()
// Adds a new key-value pair
// If the key already exists, use the below method
private void addItem(String key, String value){
if(this.items.containsKey(key))
addValue(key, value);
ArrayList<String> vals = new ArrayList<String>();
vals.add(value);
items.put(key,vals);
}
// Adds a value to an existing key
private void addValue(String key, String value){
this.items.get(key).add(value);
}
// The Scala table generators use this method to access the triple's fields
// This method is distinct from TripleDocument's implementation in that
// this returns an ARRAY of Strings (due to one-to-many mapping), rather
// than a single String. This is true even if the ArrayList contains only
// one String.
public ArrayList<String> get(String key){
return this.items.get(key);
}
public boolean has(String key){
if (!this.vars.contains(key))
return false;
else if (this.items.get(key).isEmpty())
return false;
else return true;
}
private static String prettyFromURI (String origURI) {
if (!origURI.contains("#"))
return origURI;
String pretty = origURI.substring(origURI.indexOf('#') + 1);
String prettyFinal = "" + pretty.charAt(0);
for (int pos = 1; pos < pretty.length(); pos++) {
if (Character.isLowerCase(pretty.charAt(pos - 1)) && Character.isUpperCase(pretty.charAt(pos))) {
prettyFinal = prettyFinal + " " + pretty.charAt(pos);
} else {
prettyFinal = prettyFinal + pretty.charAt(pos);
}
}
return prettyFinal;
}
private static boolean isDouble(String str) {
try {
Double.parseDouble(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
private static String toNum(double d) {
if(d == (long) d)
return String.format("%d",(long)d);
else
return String.format("%s",d);
}
// The accordion menus for results are composed of two div elements
// that must have corresponding names that are unique for each entry.
// We use serial numbers where applicable, since these are guaranteed
// to be unique, but for queries where the results don't have serial numbers,
// (eg, Entities) we'll just generate a random 5-digit number instead.
public String generateID(){
Random rand = new Random();
int randomNum = rand.nextInt((99999 - 10000) + 1) + 10000;
return String.valueOf(randomNum);
}
}