package net.i2geo.onto.updates;
import org.semanticweb.owl.model.*;
import org.jdom.input.SAXBuilder;
import org.jdom.*;
import java.net.URL;
import java.net.URI;
import java.util.*;
import net.i2geo.onto.GeoSkillsAccess;
import net.i2geo.onto.updates.actions.OntologyActionBase;
/** Object to describe the update.
*/
public class OntoUpdateChange extends OntologyActionBase {
private static final Namespace ontoUpdateNS = Namespace.getNamespace("http://www.inter2geo.eu/2008/ontology/ontoUpdates.owl#"),
rdfNS = Namespace.getNamespace("rdf","http://www.w3.org/1999/02/22-rdf-syntax-ns#");
private static String base = GeoSkillsAccess.ontBaseU + "#";
private List<OWLOntologyChange> owlChange;
private URL xmlChangeUrl;
private OWLOntologyManager manager;
private OWLDataFactory factory;
private List<OWLAxiom> additionAxioms, deletionsAxioms, updatesAxioms;
public OntoUpdateChange(List<OWLOntologyChange> owlChange, OWLOntologyManager manager) {
this.owlChange = owlChange;
this.xmlChangeUrl = null;
this.manager = manager;
this.factory = manager.getOWLDataFactory();
}
public OntoUpdateChange(URL xmlChangeUrl, OWLOntologyManager manager) {
this.xmlChangeUrl = xmlChangeUrl;
this.owlChange = null;
this.manager = manager;
this.factory = manager.getOWLDataFactory();
}
// public void operate(OWLOntology ont) throws OWLOntologyChangeException {
public void operate() throws OWLOntologyChangeException {
// check for existing ontologies in the manager
if (manager.getOntologies().isEmpty())
throw new OntoUpdateException("No Ontology given!", new Exception());
// get the ontology contained in the manager
OWLOntology ont = manager.getOntologies().iterator().next();
if(additionAxioms==null)
parseOWLchange();
for(OWLAxiom axiom:additionAxioms) {
manager.applyChange(new AddAxiom(ont,axiom));
}
}
private void parseOWLchange() {
try {
// make it jdom
Document changeDoc = new SAXBuilder().build(xmlChangeUrl);
this.parseOWLchange(changeDoc);
} catch (Exception e) {
throw new OntoUpdateException("can't parse onto-update",e);
}
}
private void parseOWLchange(String XMLstring) {
try {
// make it jdom
Document changeDoc = new SAXBuilder().build(XMLstring);
this.parseOWLchange(changeDoc);
} catch (Exception e) {
throw new OntoUpdateException("can't parse onto-update",e);
}
}
private void parseOWLchange(Document changeDoc) {
try {
List additionsElements =
changeDoc.getRootElement().getChild("Additions",ontoUpdateNS).getChildren();
additionAxioms = new ArrayList<OWLAxiom>(10*additionsElements.size());
for(Object e:additionsElements) {
Element elt = (Element) e;
String id = elt.getAttributeValue("ID",rdfNS);
OWLIndividual i = factory.getOWLIndividual(URI.create(base + id));
// TODO: treat null-cases
//OWLIndividual individual = new OWLIndividual(id);
for(Object f : elt.getChildren()) {
Element child = (Element) f;
OWLAxiom axiom = convertChangeToAxiomAssertion(i,child);
additionAxioms.add(axiom);
}
}
} catch (Exception e) {
throw new OntoUpdateException("can't parse onto-update",e);
}
}
private OWLAxiom convertChangeToAxiomAssertion(OWLIndividual subject, Element elt) {
if(elt.getAttribute("lang", Namespace.XML_NAMESPACE)!=null) {
return factory.getOWLDataPropertyAssertionAxiom(subject,
factory.getOWLDataProperty(URI.create(base+elt.getName())),
getI18nTextConstant(elt));
}
return null;
}
private OWLConstant getI18nTextConstant(Element elt) {
OWLConstant constant = factory.getOWLUntypedConstant(
elt.getAttributeValue("lang", Namespace.XML_NAMESPACE),
elt.getText()
);
return constant;
}
public String getActionId()
{
// TODO Auto-generated method stub
return null;
}
public String getInitiatorID()
{
// TODO Auto-generated method stub
return null;
}
public URL getResultNotificationURL()
{
// TODO Auto-generated method stub
return null;
}
public void perform() throws OWLOntologyChangeException
{
operate();
}
}