package org.isatools.isacreator.ontologymanager.bioportal.jsonresulthandlers;
import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import net.minidev.json.JSONValue;
import org.isatools.isacreator.ontologymanager.OntologyManager;
import org.isatools.isacreator.ontologymanager.OntologySourceRefObject;
import org.isatools.isacreator.ontologymanager.bioportal.io.AcceptedOntologies;
import org.isatools.isacreator.ontologymanager.bioportal.model.AnnotatorResult;
import org.isatools.isacreator.ontologymanager.common.OntologyTerm;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class BioPortalAnnotatorResultHandler {
BioPortalSearchResultHandler searchHandler;
public BioPortalAnnotatorResultHandler() {
this(new BioPortalSearchResultHandler());
}
public BioPortalAnnotatorResultHandler(BioPortalSearchResultHandler searchHandler) {
this.searchHandler = searchHandler;
}
public Map<String, Map<String, AnnotatorResult>> getSearchResults(String queryContents, String originalText, Set<String> originalTerms) {
// map from search term to a map of full id to the ontology term.
Map<String, Map<String, AnnotatorResult>> result = new HashMap<String, Map<String, AnnotatorResult>>();
// for each token, we wan to find the matches and add them to the list
JSONArray obj = (JSONArray) JSONValue.parse(queryContents);
for (Object annotationItem : obj) {
AnnotatorResult annotatorResult = extractAnnotatorResult((JSONObject) annotationItem);
if (annotatorResult != null) {
String originalTerm = originalText.substring(annotatorResult.getStartIndex() - 1, annotatorResult.getEndIndex());
if (originalTerms.contains(originalTerm)) {
if (!result.containsKey(originalTerm)) {
result.put(originalTerm, new HashMap<String, AnnotatorResult>());
}
String ontologySource = annotatorResult.getOntologySource().getOntologyAbbreviation();
if (!result.get(originalTerm).containsKey(ontologySource)) {
result.get(originalTerm).put(ontologySource, annotatorResult);
}
}
}
}
return result;
}
private AnnotatorResult extractAnnotatorResult(JSONObject resultItem) {
JSONObject annotatedClass = (JSONObject) resultItem.get("annotatedClass");
JSONObject links = (JSONObject) annotatedClass.get("links");
String ontologyId = links.get("ontology").toString();
if (AcceptedOntologies.getOntologyAbbreviationFromId(ontologyId) != null) {
OntologySourceRefObject sourceRefObject = OntologyManager.getOntologySourceReferenceObjectByAbbreviation(AcceptedOntologies.getOntologyAbbreviationFromId(ontologyId));
OntologyTerm ontologyTerm = new OntologyTerm(
annotatedClass.get("prefLabel").toString(), annotatedClass.get("@id").toString(), annotatedClass.get("@id").toString(), sourceRefObject);
int from = -1, to = -1;
for (Object annotation : (JSONArray) resultItem.get("annotations")) {
JSONObject annotationObject = (JSONObject) annotation;
from = Integer.valueOf(annotationObject.get("from").toString());
to = Integer.valueOf(annotationObject.get("to").toString());
}
if (from != -1 && to != -1) {
return new AnnotatorResult(ontologyTerm, AcceptedOntologies.getAcceptedOntologies().get(ontologyId), 1,
from, to);
}
}
return null;
}
}