package com.google.gwt.ricordo.server;
//import org.semanticweb.HermiT.Reasoner;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.coode.owlapi.manchesterowlsyntax.ManchesterOWLSyntaxEditorParser;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.expression.OWLEntityChecker;
import org.semanticweb.owlapi.expression.ParserException;
import org.semanticweb.owlapi.expression.ShortFormEntityChecker;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLClassExpression;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import org.semanticweb.owlapi.owllink.OWLlinkHTTPXMLReasonerFactory;
import org.semanticweb.owlapi.owllink.OWLlinkReasoner;
import org.semanticweb.owlapi.owllink.OWLlinkReasonerConfiguration;
import org.semanticweb.owlapi.owllink.OWLlinkReasonerIOException;
import org.semanticweb.owlapi.owllink.Request;
import org.semanticweb.owlapi.owllink.Response;
import org.semanticweb.owlapi.owllink.builtin.requests.CreateKB;
import org.semanticweb.owlapi.owllink.builtin.requests.GetEquivalentClasses;
import org.semanticweb.owlapi.owllink.builtin.requests.GetSubClasses;
import org.semanticweb.owlapi.owllink.builtin.requests.LoadOntologies;
import org.semanticweb.owlapi.owllink.builtin.requests.Tell;
import org.semanticweb.owlapi.owllink.builtin.response.KB;
import org.semanticweb.owlapi.owllink.builtin.response.OK;
import org.semanticweb.owlapi.owllink.builtin.response.OWLlinkErrorResponseException;
import org.semanticweb.owlapi.owllink.builtin.response.SetOfClassSynsets;
import org.semanticweb.owlapi.owllink.builtin.response.SetOfClasses;
import org.semanticweb.owlapi.owllink.server.OWLlinkServer;
import org.semanticweb.owlapi.owllink.server.serverfactory.PelletServerFactory;
import org.semanticweb.owlapi.reasoner.Node;
import org.semanticweb.owlapi.util.BidirectionalShortFormProvider;
import org.semanticweb.owlapi.util.BidirectionalShortFormProviderAdapter;
import org.semanticweb.owlapi.util.ShortFormProvider;
import org.semanticweb.owlapi.util.SimpleShortFormProvider;
import com.google.gwt.ricordo.client.exception.ManchesterQueryException;
import com.google.gwt.ricordo.shared.OntologyTermData;
public class OntologyHandler {
public static final String DOCUMENT_IRI = "WEB-INF\\resources\\ontologies\\ricordo.owl";
// public static final String DOCUMENT_IRI = "/home/sarala/ricordo/resources/ricordo.owl";
private OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
private OWLOntology ontology = null;//Create/use an OWLOntology;
private OWLlinkReasoner reasoner = null;
private String ou = "http://bioonto.uk/ricordo.owl";
private OWLOntology oldOntology=null;//for creating manchester queries
private KB kbResponse;
private ConfigHandler configHandler;
private IRI docIRI;
public OntologyHandler(String file, ConfigHandler configHandler){
this.configHandler = configHandler;
docIRI=IRI.create(new File(file));
try {
ontology = manager.createOntology();
oldOntology = manager.loadOntology(docIRI);
} catch (OWLOntologyCreationException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
setUpReasoner();
}
public void setUpReasoner(){
URL url = null;//Configure the server end-point
try {
url = new URL("http://bioonto.gen.cam.ac.uk:8081");
} catch (MalformedURLException e) {
e.printStackTrace();
}
OWLlinkReasonerConfiguration reasonerConfiguration = new OWLlinkReasonerConfiguration(url);
OWLlinkHTTPXMLReasonerFactory factory = new OWLlinkHTTPXMLReasonerFactory();
try{
reasoner = factory.createNonBufferingReasoner(ontology, reasonerConfiguration);
}catch (OWLlinkReasonerIOException e){
System.out.println(e.getMessage());
startPelletServer();
reasoner = factory.createNonBufferingReasoner(ontology, reasonerConfiguration);
}
createKB();
}
public void createKB(){
try {
CreateKB createKBRequest = new CreateKB(IRI.create(ou));
kbResponse = reasoner.answer(createKBRequest);
System.out.println("Created KB: "+kbResponse.getKB());
LoadOntologies loadOntologies = new LoadOntologies(kbResponse.getKB(),IRI.create(new File(DOCUMENT_IRI)));
// Tell tellRequest = new Tell(kbResponse.getKB(), oldOntology.getAxioms());
OK okResponse = reasoner.answer(loadOntologies);
} catch (OWLlinkErrorResponseException e) {
System.out.println(e.getMessage());
}
}
public void startPelletServer(){
int port = 8081;//HTTP port for the server, e.g., 8081
PelletServerFactory pellet = new PelletServerFactory();
OWLlinkServer server = pellet.createServer(port);//
server.run();
}
/* public void stopPelletServer(){
if(server!=null) {
try {
server.stop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}*/
private Response executeReasoner(Request request){
try{
return reasoner.answer(request);
}catch(OWLlinkReasonerIOException ex){
setUpReasoner();
return reasoner.answer(request);
}
}
public SetOfClasses equivalentClasses(OWLClassExpression classExp){
GetEquivalentClasses getEquivalentClasses = new GetEquivalentClasses(IRI.create(ou),classExp);
SetOfClasses eqclasses = (SetOfClasses)executeReasoner(getEquivalentClasses);//reasoner.answer(getEquivalentClasses);
return eqclasses;
}
public OWLClass addNewClass(OWLClassExpression classExp){
String ricordoid = configHandler.readAndUpdate(ConfigHandler.RICORDOID);
OWLClass newowlclass = manager.getOWLDataFactory().getOWLClass(IRI.create("http://www.ricordo.eu/ricordo.owl#RICORDO_"+ricordoid));
OWLAxiom axiom = manager.getOWLDataFactory().getOWLEquivalentClassesAxiom(newowlclass, classExp);
Set<OWLAxiom> axiomSet = new HashSet<OWLAxiom>();
axiomSet.add(axiom);
Tell tellRequest = new Tell(IRI.create(ou),axiomSet);
OK okResponse = (OK)executeReasoner(tellRequest);//reasoner.answer(tellRequest);
//add to owlfile
manager.addAxioms(oldOntology, axiomSet);
writeToOWLFile();
return newowlclass;
}
public OWLClassExpression runManchesterQuery(String manchesterQuery) throws ManchesterQueryException{
ManchesterOWLSyntaxEditorParser parser = new ManchesterOWLSyntaxEditorParser(manager.getOWLDataFactory(), manchesterQuery);
parser.setDefaultOntology(oldOntology);
ShortFormProvider shortFormProvider = new SimpleShortFormProvider();
Set<OWLOntology> importsClosure = oldOntology.getImportsClosure();
BidirectionalShortFormProvider bidiShortFormProvider = new BidirectionalShortFormProviderAdapter(manager, importsClosure, shortFormProvider);
// Specify an entity checker that wil be used to check a class expression contains the correct names.
OWLEntityChecker entityChecker = new ShortFormEntityChecker(bidiShortFormProvider);
parser.setOWLEntityChecker(entityChecker);
OWLClassExpression classExp=null;
try {
classExp = parser.parseClassExpression();
} catch (ParserException e) {
e.printStackTrace();
throw new ManchesterQueryException("Invalid manchester query",e.getMessage());
}
return classExp;
}
public ArrayList<OntologyTermData> getOntologyTerms(OWLClassExpression classExp){
ArrayList<OntologyTermData> idList = new ArrayList<OntologyTermData>();
if(classExp==null){
return idList;
}
GetSubClasses getSubClasses = new GetSubClasses(IRI.create(ou), classExp);
SetOfClassSynsets synsets = (SetOfClassSynsets)executeReasoner(getSubClasses); //reasoner.answer(getSubClasses);
Iterator<Node<OWLClass>> it = synsets.iterator();
while (it.hasNext()) {
Node<OWLClass> owlClassNode = it.next();
populateidList(owlClassNode.getEntities().iterator().next().toStringID(), idList);
}
GetEquivalentClasses getEquivalentClasses = new GetEquivalentClasses(IRI.create(ou),classExp);
SetOfClasses eqclasses = (SetOfClasses)executeReasoner(getEquivalentClasses);//reasoner.answer(getEquivalentClasses);
Iterator<OWLClass> eqiIterator = eqclasses.iterator();
while(eqiIterator.hasNext()){
OWLClass eqClass = eqiIterator.next();
populateidList(eqClass.toStringID(), idList);
}
return idList;
}
private void populateidList(String cls, ArrayList<OntologyTermData> idList){
String term = cls.substring(cls.indexOf("#")+1);
String [] termData = term.split("_");
if(termData.length==2){
OntologyTermData ontologyTermData = new OntologyTermData(termData[0], termData[0]+":"+termData[1]);
idList.add(ontologyTermData);
}
}
private void writeToOWLFile(){
try {
manager.saveOntology(oldOntology, docIRI);
} catch (OWLOntologyStorageException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}