package com.emf4sw.owl.resource.impl; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import com.emf4sw.owl.ClassExpression; import com.emf4sw.owl.DataAllValuesFrom; import com.emf4sw.owl.DataExactCardinality; import com.emf4sw.owl.DataHasValue; import com.emf4sw.owl.DataMaxCardinality; import com.emf4sw.owl.DataMinCardinality; import com.emf4sw.owl.DataProperty; import com.emf4sw.owl.DataRange; import com.emf4sw.owl.DataSomeValuesFrom; import com.emf4sw.owl.OWLClass; import com.emf4sw.owl.ObjectAllValuesFrom; import com.emf4sw.owl.ObjectComplementOf; import com.emf4sw.owl.ObjectExactCardinality; import com.emf4sw.owl.ObjectHasSelf; import com.emf4sw.owl.ObjectHasValue; import com.emf4sw.owl.ObjectIntersectionOf; import com.emf4sw.owl.ObjectMaxCardinality; import com.emf4sw.owl.ObjectMinCardinality; import com.emf4sw.owl.ObjectOneOf; import com.emf4sw.owl.ObjectProperty; import com.emf4sw.owl.ObjectPropertyChain; import com.emf4sw.owl.ObjectSomeValuesFrom; import com.emf4sw.owl.ObjectUnionOf; import com.emf4sw.owl.Ontology; import com.emf4sw.owl.resource.OWLFormats; import com.emf4sw.owl.resource.OWLResource; import com.emf4sw.owl.resource.OWLWriter; import com.emf4sw.owl.util.OWLSwitch; import com.emf4sw.owl.vocabulary.OWL; import com.emf4sw.rdf.Resource; import com.hp.hpl.jena.datatypes.xsd.XSDDatatype; import com.hp.hpl.jena.ontology.ComplementClass; import com.hp.hpl.jena.ontology.EnumeratedClass; import com.hp.hpl.jena.ontology.IntersectionClass; import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.ontology.OntResource; import com.hp.hpl.jena.ontology.Restriction; import com.hp.hpl.jena.ontology.UnionClass; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFList; public class OWLJenaWriter implements OWLWriter { public OWLJenaWriter() { } @Override public OntModel write(OWLResource resource, OWLFormats format) { final OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); final Ontology ontology = resource.getOntology(); final OWLSwitchImpl cswitch = new OWLSwitchImpl(model); extract(ontology.getClasses(), cswitch, model); extract(ontology.getObjectProperties(), cswitch, model); extract(ontology.getDataProperties(), cswitch, model); extract(ontology.getClassExpressions(), cswitch, model); model.createOntology(ontology.getURI()); return model; } private Model extract(EList<? extends EObject> list, OWLSwitchImpl cswitch, OntModel model) { for (EObject ce: list) { if (!cache.containsKey(ce)) cswitch.doSwitch(ce); } return model; } private final static Map<EObject, OntResource> cache = new HashMap<EObject, OntResource>(); private class OWLSwitchImpl extends OWLSwitch<OntResource> { private final OntModel model; public OWLSwitchImpl(OntModel model) { this.model = model; cache.clear(); } private void doClass(OntClass aClass, ClassExpression object) { for (ClassExpression ce: object.getSubClassOf()) { OntResource superClass = this.doSwitch(ce); if (superClass != null) { aClass.addSuperClass(superClass); } } for (ClassExpression ce: object.getEquivalentClasses()) { OntResource equiClass = this.doSwitch(ce); if (equiClass != null) { aClass.addEquivalentClass(equiClass); } } for (ClassExpression ce: object.getDisjointClasses()) { OntResource disjClass = this.doSwitch(ce); if (disjClass != null) { aClass.addDisjointWith(disjClass); } } } @Override public OntResource caseOWLClass(OWLClass object) { if (cache.containsKey(object)) return cache.get(object); final OntClass aClass; if (object.getURI() != null) aClass = model.createClass(object.getURI()); else aClass = model.createClass(); cache.put(object, aClass); doClass(aClass, object); return aClass; } @Override public OntResource caseObjectUnionOf(ObjectUnionOf object) { if (cache.containsKey(object)) return cache.get(object); RDFList list = model.createList(); for (ClassExpression ce: object.getUnionOf()) { OntResource c = this.doSwitch(ce); if (c != null) { list = list.cons( c ); } } UnionClass uClass = model.createUnionClass(null, list); cache.put(object, uClass); doClass(uClass, object); return uClass; } @Override public OntResource caseObjectIntersectionOf(ObjectIntersectionOf object) { if (cache.containsKey(object)) return cache.get(object); RDFList list = model.createList(); for (ClassExpression ce: object.getIntersectionOf()) { OntResource c = this.doSwitch(ce); if (c != null) { list = list.cons( c ); } } IntersectionClass iClass = model.createIntersectionClass(null, list); cache.put(object, iClass); doClass(iClass, object); return iClass; } @Override public OntResource caseObjectComplementOf(ObjectComplementOf object) { if (cache.containsKey(object)) return cache.get(object); boolean addSelfLater = false; RDFList list = model.createList(); for (ClassExpression ce: object.getComplementOf()) { if (ce == object) { addSelfLater = true; } else { OntResource c = this.doSwitch(ce); if (c != null) { list = list.cons( c ); } } } ComplementClass cClass = model.createComplementClass(null, list); cache.put(object, cClass); if (addSelfLater) { // cClass.addOperand(cClass); // list = list.cons( cClass ); } doClass(cClass, object); return cClass; } @Override public OntResource caseObjectOneOf(ObjectOneOf object) { if (cache.containsKey(object)) return cache.get(object); RDFList list = model.createList(); for (Resource individual: object.getOneOf()) { com.hp.hpl.jena.ontology.Individual ind = model.createIndividual( model.getResource(individual.getURI())); if (ind != null) { list = list.cons( ind ); } } EnumeratedClass ec = model.createEnumeratedClass(null, list); cache.put(object, ec); return ec; } @Override public OntResource caseObjectAllValuesFrom(ObjectAllValuesFrom object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; final OntResource values = this.doSwitch(object.getAllValuesFrom()); final Property property = model.getProperty(object.getProperty().getURI()); if (property != null && values != null) { ret = model.createSomeValuesFromRestriction(null, property, values); cache.put(object, ret); } return ret; } @Override public OntResource caseObjectSomeValuesFrom(ObjectSomeValuesFrom object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; final OntResource values = this.doSwitch(object.getSomeValuesFrom()); final Property property = model.getProperty(object.getProperty().getURI()); if (property != null && values != null) { ret = model.createSomeValuesFromRestriction(null, property, values); cache.put(object, ret); } return ret; } @Override public OntResource caseObjectHasValue(ObjectHasValue object) { if (cache.containsKey(object)) return cache.get(object); OntClass ret = null; final com.hp.hpl.jena.ontology.Individual ind = model.createIndividual( model.getResource(object.getHasValue().getURI())); final Property property = model.getProperty(object.getProperty().getURI()); if (property != null && ind != null) { ret = model.createHasValueRestriction(null, property, ind); cache.put(object, ret); } return ret; } @Override public OntResource caseObjectHasSelf(ObjectHasSelf object) { if (cache.containsKey(object)) return cache.get(object); OntClass ret = model.createOntResource(null).as(Restriction.class); final Property property = model.getProperty(object.getProperty().getURI()); if (property != null) { model.add(model.createStatement(ret, model.getProperty(OWL.onProperty), property.getURI())); Literal lit = model.createTypedLiteral("true", XSDDatatype.XSDboolean); model.add(model.createStatement(ret, model.getProperty(OWL.hasSelf), lit)); cache.put(object, ret); } return ret; } @Override public OntResource caseObjectExactCardinality(ObjectExactCardinality object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; if (object.getOnClass() == null) { ret = model.createCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); } else { ret = model.createCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); OntResource aClass = doSwitch(object.getOnClass()); if (aClass != null) { model.add(model.createStatement(ret, model.getProperty(OWL.onClass), aClass)); } } cache.put(object, ret); return ret; } @Override public OntResource caseObjectMaxCardinality(ObjectMaxCardinality object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; if (object.getOnClass() == null) { ret = model.createMaxCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); } else { ret = model.createMaxCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); OntResource aClass = doSwitch(object.getOnClass()); if (aClass != null) { model.add(model.createStatement(ret, model.getProperty(OWL.onClass), aClass)); } } cache.put(object, ret); return ret; } @Override public OntResource caseObjectMinCardinality(ObjectMinCardinality object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; if (object.getOnClass() == null) { ret = model.createMinCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); } else { ret = model.createMinCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); OntResource aClass = doSwitch(object.getOnClass()); if (aClass != null) { model.add(model.createStatement(ret, model.getProperty(OWL.onClass), aClass)); } } cache.put(object, ret); return ret; } @Override public OntResource caseDataSomeValuesFrom(DataSomeValuesFrom object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; com.hp.hpl.jena.rdf.model.Resource dataRange = DataRangeFactory.createDataRange(object.getSomeValuesFrom(), model); if (dataRange != null) { for (DataProperty aExpression: object.getProperties()) { Property property = model.createProperty(aExpression.getURI()); if (property != null) { ret = model.createSomeValuesFromRestriction(null, property, dataRange); cache.put(object, ret); } } } return ret; } @Override public OntResource caseDataAllValuesFrom(DataAllValuesFrom object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; com.hp.hpl.jena.rdf.model.Resource dataRange = DataRangeFactory.createDataRange(object.getAllValuesFrom(), model); if (dataRange != null) { for (DataProperty aExpression: object.getProperties()) { Property property = model.createProperty(aExpression.getURI()); if (property != null) { ret = model.createAllValuesFromRestriction(null, property, dataRange); cache.put(object, ret); } } } return ret; } @Override public OntResource caseDataHasValue(DataHasValue object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; final Literal literal = model.createLiteral(object.getHasValue().getLexicalForm()); final Property property = model.createProperty(object.getProperty().getURI()); if (property != null && literal != null) { ret = model.createHasValueRestriction(null, property, literal); cache.put(object, ret); } return ret; } @Override public OntResource caseDataExactCardinality(DataExactCardinality object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; if (object.getDataRange() == null) { ret = model.createCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); } else { ret = model.createCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); com.hp.hpl.jena.rdf.model.Resource res = DataRangeFactory.createDataRange(object.getDataRange(), model); if (res != null) { model.add(model.createStatement(ret, model.getProperty(OWL.onDataRange) ,res)); } } cache.put(object, ret); return ret; } @Override public OntResource caseDataMaxCardinality(DataMaxCardinality object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; if (object.getDataRange() == null) { ret = model.createCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); } else { ret = model.createCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); com.hp.hpl.jena.rdf.model.Resource res = DataRangeFactory.createDataRange(object.getDataRange(), model); if (res != null) { model.add(model.createStatement(ret, model.getProperty(OWL.onDataRange) ,res)); } } cache.put(object, ret); return ret; } @Override public OntResource caseDataMinCardinality(DataMinCardinality object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.OntClass ret = null; if (object.getDataRange() == null) { ret = model.createMinCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); } else { ret = model.createMinCardinalityRestriction(null, model.getProperty(object.getProperty().getURI()), object.getCardinality() ); com.hp.hpl.jena.rdf.model.Resource res = DataRangeFactory.createDataRange(object.getDataRange(), model); if (res != null) { model.add(model.createStatement(ret, model.getProperty(OWL.onDataRange) ,res)); } } cache.put(object, ret); return ret; } @Override public OntResource caseObjectProperty(ObjectProperty object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.ObjectProperty oProperty = model.createObjectProperty(object.getURI()); cache.put(object, oProperty); for (ClassExpression ce: object.getDomain()) { oProperty.addDomain(doSwitch(ce)); } for (ClassExpression ce: object.getRange()) { oProperty.addRange(doSwitch(ce)); } for (ObjectProperty property: object.getSubPropertyOf()) { oProperty.addSuperProperty((Property) doSwitch(property)); } return oProperty; } @Override public OntResource caseObjectPropertyChain(ObjectPropertyChain object) { if (cache.containsKey(object)) return cache.get(object); return super.caseObjectPropertyChain(object); } @Override public OntResource caseDataProperty(DataProperty object) { if (cache.containsKey(object)) return cache.get(object); com.hp.hpl.jena.ontology.DatatypeProperty oProperty = model.createDatatypeProperty(object.getURI()); cache.put(object, oProperty); for (ClassExpression ce: object.getDomain()) { oProperty.addDomain(doSwitch(ce)); } for (DataRange ce: object.getRange()) { oProperty.addRange(doSwitch(ce)); } for (DataProperty property: object.getSubPropertyOf()) { oProperty.addSuperProperty((Property) doSwitch(property)); } return oProperty; } } }