package org.mindswap.swoop.locality;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.io.StringWriter;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.mindswap.pellet.debug.owlapi.Reasoner;
import org.mindswap.pellet.debug.utils.Timer;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.racer.JRacer;
import org.mindswap.swoop.reasoner.PelletReasoner;
import org.mindswap.swoop.refactoring.LocalityChecker;
import org.mindswap.swoop.refactoring.LocalityCheckerExtended;
import org.mindswap.swoop.utils.SetUtils;
import org.mindswap.swoop.utils.owlapi.CorrectedRDFRenderer;
import org.mindswap.swoop.utils.owlapi.OWLOntBuilder;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLClassAxiom;
import org.semanticweb.owl.model.OWLDataProperty;
import org.semanticweb.owl.model.OWLDescription;
import org.semanticweb.owl.model.OWLDifferentIndividualsAxiom;
import org.semanticweb.owl.model.OWLDisjointClassesAxiom;
import org.semanticweb.owl.model.OWLEntity;
import org.semanticweb.owl.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLObject;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLObjectPropertyInstance;
import org.semanticweb.owl.model.OWLObjectPropertyRangeAxiom;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLProperty;
import org.semanticweb.owl.model.OWLPropertyDomainAxiom;
import org.semanticweb.owl.model.OWLSameIndividualsAxiom;
import org.semanticweb.owl.model.OWLSubClassAxiom;
import org.semanticweb.owl.model.change.AddEntity;
import org.semanticweb.owl.model.change.AddEquivalentClass;
import org.semanticweb.owl.model.change.AddIndividualClass;
import org.semanticweb.owl.model.change.ChangeVisitor;
import org.semanticweb.owl.model.change.OntologyChange;
import org.semanticweb.owl.model.change.RemoveClassAxiom;
import org.semanticweb.owl.model.change.RemoveDomain;
import org.semanticweb.owl.model.change.RemoveEntity;
import org.semanticweb.owl.model.change.RemoveEquivalentClass;
import org.semanticweb.owl.model.change.RemoveIndividualAxiom;
import org.semanticweb.owl.model.change.RemoveIndividualClass;
import org.semanticweb.owl.model.change.RemoveObjectPropertyInstance;
import org.semanticweb.owl.model.change.RemoveObjectPropertyRange;
import org.semanticweb.owl.model.change.RemoveSuperClass;
import org.semanticweb.owl.model.helper.OntologyHelper;
public class testLocalityExtendedURI{
SwoopModel swoopModel = new SwoopModel();
boolean DEBUG = true;
Map entTest = new HashMap();
String NEWLINE = System.getProperty("line.separator");
Timer testTimer;
String logFile = "";
List testOnt;
public testLocalityExtendedURI() throws Exception {
// load ontologies
this.testOnt = new ArrayList();
// read URIs
String loc = "C:/ontologies/ontologies4.txt";
File f = new File( loc );
StringBuffer contents = new StringBuffer();
BufferedReader input = null;
try {
input = new BufferedReader( new FileReader(f) );
String line = null;
while (( line = input.readLine()) != null){
if(DEBUG){
System.out.println("Reading Ontology " + line);
}
OWLOntology ont = swoopModel.loadOntology(new URI(line));
testOnt.add(ont);
}
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
}
catch (IOException ex){
ex.printStackTrace();
}
finally {
try {
if (input!= null) {
//flush and close both "input" and its underlying FileReader
input.close();
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
System.out.println("DONE: Ontologies Loaded");
}
public void runTest() throws Exception{
Iterator iter = testOnt.iterator();
int loc = 0;
int nloc = 0;
int total = 0;
int cycle = 0;
int imported =0;
while(iter.hasNext()){
OWLOntology ontology = (OWLOntology)iter.next();
System.out.println("-------------------------------------------");
System.out.println("Testing Ontology " + ontology.getURI().toString());
LocalityCheckerExtended checker = new LocalityCheckerExtended(ontology);
Set foreign = new HashSet();
foreign = swoopModel.getEntitySet(ontology, swoopModel.IMPORTED_ONT, swoopModel.ALL);
trans = swoopModel.getEntitySet(ontology, swoopModel.IMPORTED_ONT, swoopModel.ALL);
int importedEntities = foreign.size();
if(DEBUG){
//System.out.println("Total number of entities in transitive closure: " + totalEntities);
System.out.println("number of foreign entities: " + foreign.size());
if(foreign.size()>0){
imported = imported +1;
}
//if(!ontology.getIncludedOntologies().isEmpty()){
//imported = imported +1;
//}
}
if(!checker.isHierarchical(ontology)){
System.out.println("The importing structure contains a CYCLE");
cycle = cycle +1;
}
else{
if (checker.isLocal(ontology,foreign)){
System.out.println("The ontology is Local");
loc = loc + 1;
}
else{
System.out.println("The ontology is non-local");
Set nlocal = checker.getNonLocalAxioms(foreign);
nloc = nloc + 1;
OWLOntology ont = checker.createNonLocalPart(nlocal);
String result = checker.renderNonLocal(ont);
String usedForeign = checker.renderForeignInNonLocal(ont,foreign);
System.out.println(result);
System.out.println("The ontology has " + nlocal.size() + " non-local axioms") ;
System.out.println("The foreign entities in the non-local part are " + usedForeign);
}
}
System.out.println("-------------------------------------------");
}
total = loc + nloc;
System.out.println("Total number of ontologies: " + total);
System.out.println("Total number of ontologies importing other ontologies: " + imported);
System.out.println("Total number of LOCAL ontologies: " + loc);
System.out.println("Total number of NON-LOCAL ontologies: " + nloc);
System.out.println("Total number of NON-HIERARCHICAL integrations: " + cycle);
}
public void writeLogFile() throws Exception {
FileWriter fw = new FileWriter(new File("debugEvalLog.txt"));
fw.write(logFile);
fw.close();
System.out.println("Written log: debugEvalLog.txt");
}
public void cleanLog() throws Exception {
BufferedReader in = new BufferedReader(new FileReader(new File("LocalityTest.txt")));
String line = null;
String newLog = "";
swoopModel.setShowQNames(false);
while (( line = in.readLine()) != null) {
if (line.indexOf("(")!=-1) {
String token1 = line.substring(line.indexOf("(")+1, line.indexOf(","));
String token2 = line.substring(line.indexOf(",")+1, line.indexOf(")"));
line = line.replaceAll(token1, swoopModel.shortForm(new URI(token1)));
line = line.replaceAll(token2, swoopModel.shortForm(new URI(token2)));
}
newLog += line + NEWLINE;
}
logFile = newLog;
System.out.print("Cleant file..");
this.writeLogFile();
}
public static void main(String[] args) {
try {
testLocalityExtendedURI t = new testLocalityExtendedURI();
t.runTest();
// System.out.println(t.logFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
}