package org.hadatac.console.controllers.metadataacquisition;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.net.URLEncoder;
import play.mvc.Controller;
import play.mvc.Result;
import org.hadatac.console.views.html.metadataacquisition.*;
import org.hadatac.entity.pojo.Measurement;
import org.hadatac.metadata.loader.ValueCellProcessing;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.query.ResultSetRewindable;
import org.apache.jena.sparql.engine.http.QueryExceptionHTTP;
import org.hadatac.console.controllers.AuthApplication;
import org.hadatac.console.controllers.triplestore.UserManagement;
import org.hadatac.console.models.SysUser;
import org.hadatac.utils.Collections;
import org.hadatac.utils.NameSpaces;
import be.objectify.deadbolt.java.actions.Group;
import be.objectify.deadbolt.java.actions.Restrict;
public class ViewSubject extends Controller {
public static Map<String, List<String>> findSubjectIndicators(String study_uri, String subject_uri) {
String indicatorQuery = "";
if (study_uri.startsWith("http")) {
study_uri = "<" + study_uri + ">";
}
if (subject_uri.startsWith("http")) {
subject_uri = "<" + subject_uri + ">";
}
indicatorQuery += NameSpaces.getInstance().printSparqlNameSpaceList();
indicatorQuery += "SELECT ?subjectIndicator ?label ?comment WHERE { "
+ "?subjectIndicator rdfs:subClassOf chear:StudyIndicator . "
+ "?subjectIndicator rdfs:label ?label . "
+ "?subjectIndicator rdfs:comment ?comment . }";
QueryExecution qexecInd = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), indicatorQuery);
ResultSet indicatorResults = qexecInd.execSelect();
ResultSetRewindable resultsrwIndc = ResultSetFactory.copyResults(indicatorResults);
qexecInd.close();
Map<String, String> indicatorMap = new HashMap<String, String>();
String indicatorLabel = "";
while (resultsrwIndc.hasNext()) {
QuerySolution soln = resultsrwIndc.next();
indicatorLabel = soln.get("label").toString();
indicatorMap.put(soln.get("subjectIndicator").toString(), indicatorLabel);
}
Map<String, String> indicatorMapSorted = new TreeMap<String, String>(indicatorMap);
Map<String, List<String>> indicatorValues = new HashMap<String, List<String>>();
for(Map.Entry<String, String> entry : indicatorMapSorted.entrySet()){
String parentIndicatorUri = entry.getKey();
String indvIndicatorQuery = "";
indvIndicatorQuery += NameSpaces.getInstance().printSparqlNameSpaceList();
// indvIndicatorQuery += "SELECT DISTINCT ?uri ?label ?comment WHERE { "
// + "?schemaUri hasco:isSchemaOf " + study_uri + " ."
// + "?uri hasneto:partOfSchema ?schemaUri . "
// + "?uri hasneto:hasEntity sio:Human . "
// + "?subIndicator rdfs:subClassOf* <" + parentIndicatorUri + "> . "
// + "?uri hasneto:hasAttribute ?subIndicator ."
// + "?uri rdfs:label ?label . "
// + "?uri rdfs:comment ?comment ."
// + "}";
indvIndicatorQuery += "SELECT DISTINCT ?label ?uri WHERE { "
+ "?schemaUri hasco:isSchemaOf " + study_uri + " . "
+ "?schemaAttribute hasneto:partOfSchema ?schemaUri . "
+ "?schemaAttribute hasneto:hasAttribute ?uri . "
+ "?uri rdfs:subClassOf* <" + parentIndicatorUri + "> . "
+ "?uri rdfs:label ?label . "
+ "}";
try {
QueryExecution qexecIndvInd = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), indvIndicatorQuery);
ResultSet indvIndResults = qexecIndvInd.execSelect();
ResultSetRewindable resultsrwIndvInd = ResultSetFactory.copyResults(indvIndResults);
qexecIndvInd.close();
List<String> listIndicatorLabel = new ArrayList<String>();
while (resultsrwIndvInd.hasNext()) {
QuerySolution soln = resultsrwIndvInd.next();
if(Measurement.findForViews(findUser(), study_uri, ValueCellProcessing.convertToWholeURI(subject_uri), soln.get("uri").toString()).documents.size() > 0){
listIndicatorLabel.add(soln.get("label").toString());
System.out.println("HEREHERE" + Measurement.findForViews(findUser(), study_uri, ValueCellProcessing.convertToWholeURI(subject_uri), soln.get("uri").toString()).documents.get(0).getObjectUri().toString()
+ Measurement.findForViews(findUser(), study_uri, ValueCellProcessing.convertToWholeURI(subject_uri), soln.get("uri").toString()).documents.get(0).getCharacteristic().toString()
+ Measurement.findForViews(findUser(), study_uri, ValueCellProcessing.convertToWholeURI(subject_uri), soln.get("uri").toString()).documents.get(0).getValue().toString());
}
// listIndicatorLabel.add(soln.get("comment").toString());
}
indicatorValues.put(entry.getValue().toString(), listIndicatorLabel);
} catch (QueryExceptionHTTP e) {
e.printStackTrace();
}
}
return indicatorValues;
}
/* public static String findBasicHTML(String subject_uri) {
String str = "";
System.out.println("findBasicHTML (input): <" + subject_uri + ">");
Map<String, List<String>> subjObj = findBasic(subject_uri);
if (subjObj != null) {
System.out.println("findBasicHTML (1)");
for (String key : subjObj.keySet()) {
System.out.println("findBasicHTML (key): <" + key + ">");
}
List<String> values = new ArrayList<String>();
values = subjObj.get(subject_uri);
if (values != null) {
System.out.println("findBasicHTML (2)");
for (String v : values) {
str += v + "<br/>";
}
}
}
System.out.println("findBasicHTML (output): <" + str + ">");
return str;
} */
public static String findBasicHTML(String subject_uri) {
System.out.println("findBasicHTML (subject_uri): '" + subject_uri + "'" );
if (subject_uri == null || subject_uri.equals("")) {
return null;
}
ResultSetRewindable resultsrw = findSubjectBasic(subject_uri);
if (resultsrw == null) {
return null;
}
String html = "";
if (resultsrw.hasNext()) {
QuerySolution soln = resultsrw.next();
html += "<table>";
html += "<tr> <td><b>Original ID </b></td> <td>" + soln.get("pid").toString() + "</td></tr>";
html += "<tr> <td><b>Internal ID</b></td> <td>" + soln.get("subjectLabel").toString() + "</td></tr>";
html += "<tr> <td><b>Type</b></td> <td>" + soln.get("subjectTypeLabel").toString() + "</td></tr>";
html += "<tr> <td><b>Cohort</b></td> <td>" + soln.get("cohortLabel").toString() + "</td></tr>";
html += "<tr> <td><b>Study</b></td> <td>" + soln.get("studyLabel").toString() + "</td></tr>";
html += "<tr> <td> </td> <td> </td></tr>";
html += "<tr> <td></td> <td><a href='/hadatac/metadataacquisitions/viewSubject?study_uri="
+ URLEncoder.encode(soln.get("studyUri").toString())
+ "&subject_uri=" + URLEncoder.encode(subject_uri)
+ "'>(More info about object)</a></td></tr>";
html += "</table>";
}
return html;
}
public static ResultSetRewindable findSubjectBasic(String subject_uri) {
System.out.println("in findSubjectBasic (1): '" + subject_uri + "'");
String subjectQueryString = "";
if (subject_uri == null || subject_uri.equals("")) {
return null;
}
if (subject_uri.indexOf("http") != -1) {
subject_uri = "<" + subject_uri + ">";
}
System.out.println("in findSubjectBasic (2): '" + subject_uri + "'");
subjectQueryString += NameSpaces.getInstance().printSparqlNameSpaceList();
subjectQueryString += "SELECT ?pid ?subjectTypeLabel ?subjectLabel ?cohortLabel ?studyUri ?studyLabel WHERE { "
+ subject_uri + " hasco:originalID ?pid . "
+ "?subjectUri hasco:isSubjectOf* ?cohort . "
+ "?studyUri rdfs:label ?studyLabel . "
+ "?cohort hasco:isCohortOf ?studyUri . "
+ "?cohort rdfs:label ?cohortLabel . "
+ "OPTIONAL { ?subjectUri rdfs:label ?subjectLabel } . "
+ "OPTIONAL { ?subjectUri a ?subjectType . "
+ " ?subjectType rdfs:label ?subjectTypeLabel } . "
+ "FILTER ( ?subjectUri = " + subject_uri + " ) . "
+ "}";
Query basicQuery = QueryFactory.create(subjectQueryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), basicQuery);
ResultSet results = qexec.execSelect();
ResultSetRewindable resultsrw = ResultSetFactory.copyResults(results);
qexec.close();
return resultsrw;
}
public static Map<String, List<String>> findBasic(String subject_uri) {
System.out.println("in findBasic (subject_uri): '" + subject_uri + "'" );
if (subject_uri == null || subject_uri.equals("")) {
return null;
}
ResultSetRewindable resultsrw = findSubjectBasic(subject_uri);
if (resultsrw == null) {
return null;
}
Map<String, List<String>> subjectResult = new HashMap<String, List<String>>();
List<String> values; // = new ArrayList<String>();
while (resultsrw.hasNext()) {
QuerySolution soln = resultsrw.next();
//System.out.println("HERE IS THE RAW SOLN*********" + soln.toString());
values = new ArrayList<String>();
values.add("Pid: " + soln.get("pid").toString());
values.add("Label: " + soln.get("subjectLabel").toString());
values.add("Type: " + soln.get("subjectTypeLabel").toString());
values.add("Cohort: " + soln.get("cohortLabel").toString());
values.add("Study: " + soln.get("studyLabel").toString());
subjectResult.put(subject_uri, values);
//System.out.println("THIS IS SUBROW*********" + subjectResult);
}
return subjectResult;
}
public static Map<String, String> findSubjectIndicatorsUri(String study_uri) {
String indicatorQuery = "";
if (study_uri.startsWith("http")) {
study_uri = "<" + study_uri + ">";
}
indicatorQuery += NameSpaces.getInstance().printSparqlNameSpaceList();
indicatorQuery += "SELECT ?subjectIndicator ?label ?comment WHERE { "
+ "?subjectIndicator rdfs:subClassOf chear:StudyIndicator . "
+ "?subjectIndicator rdfs:label ?label . "
+ "?subjectIndicator rdfs:comment ?comment . }";
Map<String, String> indicatorMap = new HashMap<String, String>();
String indicatorLabel = "";
try {
QueryExecution qexecInd = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), indicatorQuery);
ResultSet indicatorResults = qexecInd.execSelect();
ResultSetRewindable resultsrwIndc = ResultSetFactory.copyResults(indicatorResults);
qexecInd.close();
while (resultsrwIndc.hasNext()) {
QuerySolution soln = resultsrwIndc.next();
indicatorLabel = soln.get("label").toString();
indicatorMap.put(soln.get("subjectIndicator").toString(),indicatorLabel);
}
} catch (QueryExceptionHTTP e) {
e.printStackTrace();
}
Map<String, String> indicatorMapSorted = new TreeMap<String, String>(indicatorMap);
Map<String, String> indicatorUris = new HashMap<String, String>();
for(Map.Entry<String, String> entry : indicatorMapSorted.entrySet()){
String parentIndicatorUri = entry.getKey();
String indvIndicatorQuery = "";
indvIndicatorQuery += NameSpaces.getInstance().printSparqlNameSpaceList();
// indvIndicatorQuery += "SELECT DISTINCT ?uri ?label ?comment WHERE { "
// + "?schemaUri hasco:isSchemaOf " + study_uri + " ."
// + "?uri hasneto:partOfSchema ?schemaUri . "
// + "?uri hasneto:hasEntity sio:Human . "
// + "?subIndicator rdfs:subClassOf* <" + parentIndicatorUri + "> . "
// + "?uri hasneto:hasAttribute ?subIndicator ."
// + "?uri rdfs:label ?label . "
// + "?uri rdfs:comment ?comment ."
// + "}";
indvIndicatorQuery += "SELECT DISTINCT ?label ?uri WHERE { "
+ "?schemaUri hasco:isSchemaOf " + study_uri + " . "
+ "?schemaAttribute hasneto:partOfSchema ?schemaUri . "
+ "?schemaAttribute hasneto:hasAttribute ?uri . "
+ "?uri rdfs:subClassOf* <" + parentIndicatorUri + "> . "
+ "?uri rdfs:label ?label . "
+ "}";
try {
QueryExecution qexecIndvInd = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), indvIndicatorQuery);
ResultSet indvIndResults = qexecIndvInd.execSelect();
ResultSetRewindable resultsrwIndvInd = ResultSetFactory.copyResults(indvIndResults);
qexecIndvInd.close();
while (resultsrwIndvInd.hasNext()) {
QuerySolution soln = resultsrwIndvInd.next();
System.out.println("Solution: " + soln);
indicatorUris.put(soln.get("label").toString(), soln.get("uri").toString());
}
} catch (QueryExceptionHTTP e) {
e.printStackTrace();
}
}
return indicatorUris;
}
public static Map<String, List<String>> findSampleMap(String subject_uri) {
String sampleQueryString = "";
if (subject_uri.startsWith("http")) {
subject_uri = "<" + subject_uri + ">";
}
sampleQueryString += NameSpaces.getInstance().printSparqlNameSpaceList();
sampleQueryString += "SELECT ?sampleUri ?subjectUri ?subjectLabel ?sampleType ?sampleLabel ?cohortLabel ?comment WHERE { "
+ "?subjectUri hasco:isSubjectOf* ?cohort . "
+ "?sampleUri hasco:isSampleOf ?subjectUri . "
+ "?sampleUri rdfs:comment ?comment . "
+ "?cohort rdfs:label ?cohortLabel . "
+ "OPTIONAL { ?subjectUri rdfs:label ?subjectLabel } . "
+ "OPTIONAL { ?sampleUri rdfs:label ?sampleLabel } . "
+ "OPTIONAL { ?sampleUri a ?sampleType } . "
+ "FILTER ( ?subjectUri = " + subject_uri + " ) . "
+ "}";
Query basicQuery = QueryFactory.create(sampleQueryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), basicQuery);
ResultSet results = qexec.execSelect();
ResultSetRewindable resultsrw = ResultSetFactory.copyResults(results);
qexec.close();
Map<String, List<String>> sampleResult = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
while (resultsrw.hasNext()) {
QuerySolution soln = resultsrw.next();
System.out.println("HERE IS THE RAW SOLN*********" + soln.toString());
values = new ArrayList<String>();
values.add("Label: " + soln.get("sampleLabel").toString());
values.add("Type: " + ValueCellProcessing.replaceNameSpaceEx(soln.get("sampleType").toString()));
values.add("Sample Of: " + ValueCellProcessing.replaceNameSpaceEx(soln.get("subjectLabel").toString()));
sampleResult.put(ValueCellProcessing.replaceNameSpaceEx(soln.get("sampleUri").toString()), values);
System.out.println("THIS IS SUBROW*********" + sampleResult);
}
return sampleResult;
}
public static List<String> findSample(String subject_uri) {
String sampleQueryString = "";
sampleQueryString += NameSpaces.getInstance().printSparqlNameSpaceList();
sampleQueryString += "SELECT * WHERE { "
+ "?s <http://hadatac.org/ont/hasco/isSampleOf> " + subject_uri + " . "
+ "}";
Query sampleQuery = QueryFactory.create(sampleQueryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService(
Collections.getCollectionsName(Collections.METADATA_SPARQL), sampleQuery);
ResultSet results = qexec.execSelect();
ResultSetRewindable resultsrw = ResultSetFactory.copyResults(results);
qexec.close();
List<String> sampleResult = new ArrayList<String>();
while (resultsrw.hasNext()) {
QuerySolution soln = resultsrw.next();
System.out.println("HERE IS THE SAMPLES*********" + soln.toString());
sampleResult.add(soln.get("s").toString());
System.out.println("THIS IS SUBROW*********" + sampleResult);
}
return sampleResult;
}
public static String findUser() {
String results = null;
final SysUser user = AuthApplication.getLocalUser(session());
if(null == user){
results = null;
}
else{
results = UserManagement.getUriByEmail(user.getEmail());
}
System.out.println("This is the current user's uri:" + results);
return results;
}
@Restrict(@Group(AuthApplication.DATA_OWNER_ROLE))
public static Result index(String study_uri, String subject_uri) {
Map<String, List<String>> indicatorValues = findSubjectIndicators(study_uri, subject_uri);
Map<String, List<String>> subjectResult = findBasic(subject_uri);
Map<String, List<String>> sampleResult = findSampleMap(subject_uri);
Map<String, String> indicatorUris = findSubjectIndicatorsUri(study_uri);
Map<String, String> showValues = new HashMap<String, String>();
showValues.put("subject", ValueCellProcessing.convertToWholeURI(subject_uri));
showValues.put("user", findUser());
showValues.put("study", study_uri);
return ok(viewSubject.render(subjectResult, sampleResult, indicatorValues, indicatorUris, showValues));
}
@Restrict(@Group(AuthApplication.DATA_OWNER_ROLE))
public static Result postIndex(String study_uri, String subject_uri) {
return index(study_uri, subject_uri);
}
}