/**
*
*/
package net.i2geo.onto.updates.actions;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jdom.Attribute;
import org.jdom.Element;
import org.jdom.Namespace;
import org.semanticweb.owl.model.AddAxiom;
import org.semanticweb.owl.model.OWLAnnotationAxiom;
import org.semanticweb.owl.model.OWLAxiom;
import org.semanticweb.owl.model.OWLConstant;
import org.semanticweb.owl.model.OWLDataFactory;
import org.semanticweb.owl.model.OWLDataPropertyExpression;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLObjectPropertyExpression;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLOntologyChange;
import org.semanticweb.owl.model.OWLOntologyChangeException;
import org.semanticweb.owl.model.OWLOntologyManager;
import org.semanticweb.owl.model.RemoveAxiom;
/**
* @author Arndt Faulhaber
* @author Martin Homik
*
*/
public class OntoChangeAction extends OntologyActionBase {
private static final Namespace rdfNS = Namespace.getNamespace(
"rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
/* (non-Javadoc)
* @see net.i2geo.onto.updates.actions.OntologyActionBase#perform()
*/
@SuppressWarnings("unchecked")
public void perform() throws OWLOntologyChangeException {
log.debug("Performing ontology update for: " + getElementId());
// helper instance
OntologyHelper helper = OntologyHelper.getInstance();
OWLDataFactory factory = helper.getFactory();
OWLOntologyManager manager = helper.getManager();
OWLIndividual individual = factory.getOWLIndividual(
URI.create(helper.getBase() + this.getElementId()));
// get the ontology
OWLOntology ont;
try {
ont = helper.getOWLOntology();
} catch (Exception ex) {
throw new OWLOntologyChangeException(null, ex){
private static final long serialVersionUID = -5568393047392754030L;};
}
// ===================================== create remove axiom =========
log.debug("Collecting deletion axioms.");
List<OWLOntologyChange> deletionAxioms = new ArrayList<OWLOntologyChange>();
/*
OWLClass oldOwlClass = factory.getOWLClass(
URI.create(helper.getBase() + this.getElementClass()));
OWLAxiom classAxiom = factory.getOWLClassAssertionAxiom(individual, oldOwlClass);
deletionAxioms.add(new RemoveAxiom(ont, classAxiom));
*/
// delete all annotations
Set<OWLAnnotationAxiom> annotations = individual.getAnnotationAxioms(ont);
for (OWLAnnotationAxiom annotAxiom : annotations) {
deletionAxioms.add(new RemoveAxiom(ont, annotAxiom));
}
// ===================================== delete all properties =========
Map<OWLDataPropertyExpression, Set<OWLConstant>> props
= individual.getDataPropertyValues(ont);
for (OWLDataPropertyExpression propExpr : props.keySet()) {
for (OWLConstant propConst : props.get(propExpr)) {
deletionAxioms.add(new RemoveAxiom(ont,
factory.getOWLDataPropertyAssertionAxiom(
individual, propExpr, propConst) ));
}
}
Map<OWLObjectPropertyExpression, Set<OWLIndividual>> objectProps
= individual.getObjectPropertyValues(ont);
for (OWLObjectPropertyExpression propExpr : objectProps.keySet()) {
for (OWLIndividual i : objectProps.get(propExpr)) {
deletionAxioms.add(new RemoveAxiom(ont,
factory.getOWLObjectPropertyAssertionAxiom(
individual, propExpr, i) ));
}
}
log.debug("Applying deletion axioms.");
manager.applyChanges(deletionAxioms);
// ===================================== add new properties =========
log.debug("Collecting update properties.");
List<OWLAxiom> additionAxioms = new ArrayList<OWLAxiom>();
/*
OWLIndividual newIndividual = factory.getOWLIndividual(
URI.create(helper.getBase() + this.getElementId()));
OWLClass owlClass = factory.getOWLClass( // ???needed???
URI.create(helper.getBase() + this.getElementClass())
);
OWLClassAssertionAxiom newClassAxiom =
factory.getOWLClassAssertionAxiom(newIndividual, owlClass);
additionAxioms.add(newClassAxiom);
*/
for (Element subElement : this.getSubelements()) {
log.debug("Checking sub element: " + subElement);
OWLAxiom axiom = null;
// get the name of the property
OWLDataPropertyExpression property = factory.getOWLDataProperty(
URI.create(helper.getBase() + subElement.getName()));
OWLConstant object;
// try to get a property of type "resource", "id", and "about"
Attribute ref = subElement.getAttribute("resource", rdfNS);
if (ref == null) {subElement.getAttribute("ID", rdfNS);}
if (ref == null) {subElement.getAttribute("about", rdfNS);}
// test if the property is a reference
boolean isRef = (ref != null);
if (isRef) {
log.debug("... subElement is a reference.\n ... " + ref);
try {
// relation can be rdfs:subClassOf
OWLObjectProperty prop = factory.getOWLObjectProperty(
URI.create(helper.getBase() + subElement.getName()));
// the item to which the relation points to
OWLIndividual obj = factory.getOWLIndividual(
URI.create(helper.getBase() + ref.getValue()));
axiom = factory.getOWLObjectPropertyAssertionAxiom(individual, prop, obj);
if (axiom != null) {
log.debug("... adding axiom ..." + axiom);
additionAxioms.add(axiom);
}
log.debug("... created axiom for subElement by factory: " + axiom);
//TODO: Make this be an Attribute...
} catch (Exception ex) {
log.error("Cannot interpret reference for subElement..." + subElement
+ "\n" + ex);
}
} else {
// Check for internationalization
if (subElement.getAttribute("lang", Namespace.XML_NAMESPACE) != null) {
// get the internationalized text (value)
object = helper.getI18nTextConstant(subElement);
} else {
// get the text (value)
object = factory.getOWLUntypedConstant(subElement.getValue());
}
axiom = factory.getOWLDataPropertyAssertionAxiom(individual, property, object);
if (axiom != null) {
log.debug("... adding axiom ..." + axiom);
additionAxioms.add(axiom);
}
}
}
//**********************************
// apply add actions to the ontology
//**********************************
log.debug("Applying addition axioms.");
for (OWLAxiom axiom : additionAxioms) {
manager.applyChange(new AddAxiom(ont, axiom));
}
}
}