package com.emf4sw.owl.resource.impl; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import com.emf4sw.owl.ClassExpression; import com.emf4sw.owl.DataAllValuesFrom; import com.emf4sw.owl.DataExactCardinality; import com.emf4sw.owl.DataMaxCardinality; import com.emf4sw.owl.DataMinCardinality; import com.emf4sw.owl.DataProperty; import com.emf4sw.owl.DataRange; import com.emf4sw.owl.Individual; import com.emf4sw.owl.OWLClass; import com.emf4sw.owl.OWLDatatype; import com.emf4sw.owl.OWLFactory; import com.emf4sw.owl.ObjectAllValuesFrom; import com.emf4sw.owl.ObjectComplementOf; import com.emf4sw.owl.ObjectExactCardinality; import com.emf4sw.owl.ObjectIntersectionOf; import com.emf4sw.owl.ObjectMaxCardinality; import com.emf4sw.owl.ObjectMinCardinality; import com.emf4sw.owl.ObjectOneOf; import com.emf4sw.owl.ObjectUnionOf; import com.emf4sw.owl.jena.utils.OntModelSwitch; import com.emf4sw.owl.resource.OWLFormats; import com.emf4sw.owl.resource.OWLReader; import com.emf4sw.owl.resource.OWLResource; import com.emf4sw.rdf.vocabulary.XSD; import com.hp.hpl.jena.ontology.AllValuesFromRestriction; import com.hp.hpl.jena.ontology.CardinalityQRestriction; import com.hp.hpl.jena.ontology.CardinalityRestriction; import com.hp.hpl.jena.ontology.ComplementClass; import com.hp.hpl.jena.ontology.DatatypeProperty; import com.hp.hpl.jena.ontology.EnumeratedClass; import com.hp.hpl.jena.ontology.IntersectionClass; import com.hp.hpl.jena.ontology.MaxCardinalityQRestriction; import com.hp.hpl.jena.ontology.MaxCardinalityRestriction; import com.hp.hpl.jena.ontology.MinCardinalityQRestriction; import com.hp.hpl.jena.ontology.MinCardinalityRestriction; import com.hp.hpl.jena.ontology.ObjectProperty; 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.OntProperty; import com.hp.hpl.jena.ontology.OntResource; import com.hp.hpl.jena.ontology.Ontology; import com.hp.hpl.jena.ontology.UnionClass; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.RDFReader; import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.util.iterator.ExtendedIterator; /** * * @author ehilgui * */ public class OWLJenaReader implements OWLReader { @Override public void read(InputStream inputStream, OWLResource resource, OWLFormats format) { final OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); final RDFReader aReader = model.getReader(format.value()); try { aReader.read(model, inputStream, ""); } catch (Exception e) { e.printStackTrace(); } doInject(resource, model); } protected OWLResource doInject(final OWLResource resource, OntModel model) { if (resource == null) { throw new IllegalArgumentException(); } for (ExtendedIterator<Ontology> it = model.listOntologies(); it.hasNext();) { com.emf4sw.owl.Ontology ontology = doCreateAxioms(model, it.next()); if (ontology != null) { resource.getContents().add(ontology); } } return resource; } private com.emf4sw.owl.Ontology doCreateAxioms(OntModel ontModel, Ontology ontology) { final com.emf4sw.owl.Ontology onto = doOntology(ontology); final OntModelReaderSwitch swtch = new OntModelReaderSwitch(ontModel, onto); for (ResIterator it = ontModel.listSubjects(); it.hasNext();) { com.hp.hpl.jena.rdf.model.Resource res = it.next(); swtch.doSwitch(res); } return onto; } private com.emf4sw.owl.Ontology doOntology(Ontology ontology) { final com.emf4sw.owl.Ontology target = OWLFactory.eINSTANCE.createOntology(); target.setURI(ontology.getURI()); return target; } private static class OntModelReaderSwitch extends OntModelSwitch<Object> { private final static OWLFactory factory = OWLFactory.eINSTANCE; private final Map<OntResource, Object> registry; private final Map<String, OWLDatatype> datatypes; private final com.emf4sw.owl.Ontology target; public OntModelReaderSwitch(OntModel model, com.emf4sw.owl.Ontology target) { this.target = target; this.registry = new HashMap<OntResource, Object>(); this.datatypes = new HashMap<String, OWLDatatype>(); } private OWLDatatype createDatatype(String uri) { if (datatypes.containsKey(uri)) return datatypes.get(uri); else { final OWLDatatype datatype = OWLFactory.eINSTANCE.createOWLDatatype(); datatype.setURI(uri); datatypes.put(uri, datatype); target.getDatatypes().add(datatype); return datatype; } } @Override public Object caseOntClass(OntClass object) { if (datatype(object)) { if (object.canAs(com.hp.hpl.jena.ontology.DataRange.class)) { return caseDatatype(object.asDataRange()); } else { return createDatatype(object.getURI()); } } final ClassExpression entity; if (registry.containsKey(object)) { entity = (ClassExpression) registry.get(object); } else { entity = factory.createOWLClass(); ((OWLClass) entity).setURI(object.getURI()); registry.put(object, entity); target.getClasses().add((OWLClass) entity); if (object.getLabel(null) != null) entity.setLabel(object.getLabel(null)); if (object.getComment(null) != null) entity.setComment(object.getComment(null)); completeClassExpression(entity, object); } return entity; } private static Boolean datatype(OntResource res) { if (res != null && res.getURI() != null) if (!res.isDataRange()) return res.getURI().startsWith(XSD.NS); else return true; else return false; } private void completeClassExpression(final ClassExpression entity, final OntClass object) { for (OntClass sup: object.listSuperClasses().toList()) { Object ce = (ClassExpression) doSwitch(sup); if (ce instanceof ClassExpression) { entity.getSubClassOf().add((ClassExpression) ce); } } for (OntClass sup: object.listEquivalentClasses().toList()) { Object ce = (ClassExpression) doSwitch(sup); if (ce instanceof ClassExpression) { entity.getEquivalentClasses().add((ClassExpression) ce); } } for (OntClass sup: object.listDisjointWith().toList()) { Object ce = (ClassExpression) doSwitch(sup); if (ce instanceof ClassExpression) { entity.getDisjointClasses().add((ClassExpression) ce); } } } @Override public Object caseUnionClass(UnionClass object) { final ClassExpression expression; if (registry.containsKey(object)) { expression = (ClassExpression) registry.get(object); } else { expression = factory.createObjectUnionOf(); registry.put(object, expression); target.getClassExpressions().add(expression); final ExtendedIterator<? extends OntClass> it = object.listOperands(); for(;it.hasNext();) { final OntClass ontClass = it.next(); try { final Object switched = this.doSwitch(ontClass); if (switched instanceof ClassExpression) { ((ObjectUnionOf) expression).getUnionOf().add( (ClassExpression) switched ); } } catch (ClassCastException e) { e.printStackTrace(); } } completeClassExpression(expression, object); } return expression; } @Override public Object caseIntersectionClass(IntersectionClass object) { final ClassExpression expression; if (registry.containsKey(object)) { expression = (ClassExpression) registry.get(object); } else { expression = factory.createObjectIntersectionOf(); registry.put(object, expression); target.getClassExpressions().add(expression); final ExtendedIterator<? extends OntClass> it = object.listOperands(); for(;it.hasNext();) { final OntClass ontClass = it.next(); try { final Object switched = this.doSwitch(ontClass); if (switched instanceof ClassExpression) { ((ObjectIntersectionOf) expression).getIntersectionOf().add( (ClassExpression) switched ); } } catch (ClassCastException e) { e.printStackTrace(); } } completeClassExpression(expression, object); } return expression; } @Override public Object caseComplementClass(ComplementClass object) { final ClassExpression expression; if (registry.containsKey(object)) { expression = (ClassExpression) registry.get(object); } else { expression = factory.createObjectComplementOf(); registry.put(object, expression); target.getClassExpressions().add(expression); if (object.getOperand().canAs(OntClass.class)) { Object operand = caseOntClass(object.as(OntClass.class)); ((ObjectComplementOf) expression).getComplementOf().add((ClassExpression) operand); } completeClassExpression(expression, object); } return expression; } @Override public Object caseEnumeratedClass(EnumeratedClass object) { final ObjectOneOf expression; if (registry.containsKey(object)) { expression = (ObjectOneOf) registry.get(object); } else { expression = factory.createObjectOneOf(); target.getClassExpressions().add(expression); registry.put(object, expression); for (ExtendedIterator<RDFNode> it = object.getOneOf().iterator(); it.hasNext();) { Object node = doSwitch(it.next()); if (node instanceof Individual) { expression.getOneOf().add((Individual) node); } } } return expression; } @Override public Object caseCardinalityRestriction(CardinalityRestriction object) { ClassExpression aExpression = null; final Object switchedP = doSwitch( object.getOnProperty() ); int card = object.getCardinality(); if (switchedP instanceof DataProperty) { aExpression = factory.createDataExactCardinality(); ((DataExactCardinality) aExpression).setCardinality( card ); ((DataExactCardinality) aExpression).setProperty((DataProperty) switchedP); } else if (switchedP instanceof com.emf4sw.owl.ObjectProperty) { aExpression = factory.createObjectExactCardinality(); ((ObjectExactCardinality) aExpression).setCardinality( card ); ((ObjectExactCardinality) aExpression).setProperty((com.emf4sw.owl.ObjectProperty) switchedP); } target.getClassExpressions().add(aExpression); registry.put(object, aExpression); return aExpression; } @Override public Object caseCardinalityQRestriction(CardinalityQRestriction object) { ClassExpression aExpression = null; final Object switchedQ = doSwitch( object.getHasClassQ() ); final Object switchedP = doSwitch( object.getOnProperty() ); int card = object.getCardinalityQ(); if (switchedP instanceof DataProperty) { aExpression = factory.createDataExactCardinality(); ((DataExactCardinality) aExpression).setCardinality( card ); ((DataExactCardinality) aExpression).setProperty((DataProperty) switchedP); if (switchedQ instanceof DataRange) { ((DataExactCardinality) aExpression).setDataRange(((DataRange) switchedQ)); } } else if (switchedP instanceof com.emf4sw.owl.ObjectProperty) { aExpression = factory.createObjectExactCardinality(); ((ObjectExactCardinality) aExpression).setCardinality( card ); ((ObjectExactCardinality) aExpression).setProperty( (com.emf4sw.owl.ObjectProperty) switchedP); if (switchedQ instanceof ClassExpression) { ((ObjectExactCardinality) aExpression).setOnClass( (ClassExpression) switchedQ); } } target.getClassExpressions().add(aExpression); registry.put(object, aExpression); return aExpression; } @Override public Object caseMinCardinalityRestriction(MinCardinalityRestriction object) { ClassExpression aExpression = null; final Object switchedP = doSwitch( object.getOnProperty() ); int card = object.getMinCardinality(); if (switchedP instanceof DataProperty) { aExpression = factory.createDataMinCardinality(); ((DataMinCardinality) aExpression).setCardinality( card ); ((DataMinCardinality) aExpression).setProperty((DataProperty) switchedP); } else if (switchedP instanceof com.emf4sw.owl.ObjectProperty) { aExpression = factory.createObjectMinCardinality(); ((ObjectMinCardinality) aExpression).setCardinality( card ); ((ObjectMinCardinality) aExpression).setProperty( (com.emf4sw.owl.ObjectProperty) switchedP); } target.getClassExpressions().add(aExpression); registry.put(object, aExpression); return aExpression; } @Override public Object caseMinCardinalityQRestriction(MinCardinalityQRestriction object) { ClassExpression aExpression = null; final Object switchedQ = doSwitch( object.getHasClassQ() ); final Object switchedP = doSwitch( object.getOnProperty() ); int card = object.getMinCardinalityQ(); if (switchedP instanceof DataProperty) { aExpression = factory.createDataMinCardinality(); ((DataMinCardinality) aExpression).setCardinality( card ); ((DataMinCardinality) aExpression).setProperty((DataProperty) switchedP); if (switchedQ instanceof DataRange) { ((DataMinCardinality) aExpression).setDataRange((DataRange) switchedQ); } } else if (switchedP instanceof com.emf4sw.owl.ObjectProperty) { aExpression = factory.createObjectMinCardinality(); ((ObjectMinCardinality) aExpression).setCardinality( card ); ((ObjectMinCardinality) aExpression).setProperty( (com.emf4sw.owl.ObjectProperty) switchedP); if (switchedQ instanceof ClassExpression) { ((ObjectMinCardinality) aExpression).setOnClass((ClassExpression) switchedQ); } } target.getClassExpressions().add(aExpression); registry.put(object, aExpression); return aExpression; } @Override public Object caseMaxCardinalityRestriction(MaxCardinalityRestriction object) { ClassExpression aExpression = null; final Object switchedP = doSwitch( object.getOnProperty() ); int card = object.getMaxCardinality(); if (switchedP instanceof DataProperty) { aExpression = factory.createDataMaxCardinality(); ((DataMaxCardinality) aExpression).setCardinality( card ); ((DataMaxCardinality) aExpression).setProperty((DataProperty) switchedP); } else if (switchedP instanceof com.emf4sw.owl.ObjectProperty) { aExpression = factory.createObjectMaxCardinality(); ((ObjectMaxCardinality) aExpression).setCardinality( card ); ((ObjectMaxCardinality) aExpression).setProperty( (com.emf4sw.owl.ObjectProperty) switchedP); } target.getClassExpressions().add(aExpression); registry.put(object, aExpression); return aExpression; } @Override public Object caseMaxCardinalityQRestriction(MaxCardinalityQRestriction object) { ClassExpression aExpression = null; final Object switchedQ = doSwitch( object.getHasClassQ() ); final Object switchedP = doSwitch( object.getOnProperty() ); int card = object.getMaxCardinalityQ(); if (switchedP instanceof DataProperty) { aExpression = factory.createDataMaxCardinality(); ((DataMaxCardinality) aExpression).setCardinality( card ); ((DataMaxCardinality) aExpression).setProperty((DataProperty) switchedP); if (switchedQ instanceof DataRange) { ((DataMaxCardinality) aExpression).setDataRange((DataRange) switchedQ); } } else if (switchedP instanceof com.emf4sw.owl.ObjectProperty) { aExpression = factory.createObjectMaxCardinality(); ((ObjectMaxCardinality) aExpression).setCardinality( card ); ((ObjectMaxCardinality) aExpression).setProperty( (com.emf4sw.owl.ObjectProperty) switchedP); if (switchedQ instanceof ClassExpression) { ((ObjectMaxCardinality) aExpression).setOnClass((ClassExpression) switchedQ); } } target.getClassExpressions().add(aExpression); registry.put(object, aExpression); return aExpression; } @Override public Object caseAllValuesFromRestriction(AllValuesFromRestriction object) { ClassExpression all = null; final OntProperty property = object.getOnProperty(); if (property.isObjectProperty()) { all = createObjectAllValuesFrom(object); } else if (property.isDatatypeProperty()) { all = createDataAllValuesFrom(object); } target.getClassExpressions().add(all); registry.put(object, all); return all; } private ClassExpression createDataAllValuesFrom(AllValuesFromRestriction object) { final DataAllValuesFrom all = factory.createDataAllValuesFrom(); final Object switched = doSwitch(object.getOnProperty()); if (switched instanceof DataProperty) { all.getProperties().add((DataProperty) switched); Object aExpression = doSwitch(object.getAllValuesFrom()); if (aExpression instanceof DataRange) { all.setAllValuesFrom((DataRange) aExpression); } } return all; } private ClassExpression createObjectAllValuesFrom(AllValuesFromRestriction object) { final ObjectAllValuesFrom all = factory.createObjectAllValuesFrom(); final Object switched = doSwitch(object.getOnProperty()); if (switched instanceof com.emf4sw.owl.ObjectProperty) { all.setProperty((com.emf4sw.owl.ObjectProperty) switched); Object aExpression = doSwitch(object.getAllValuesFrom()); if (aExpression instanceof ClassExpression) { all.setAllValuesFrom((ClassExpression) aExpression); } } return all; } @Override public Object caseDatatypeProperty(DatatypeProperty object) { final DataProperty entity; if (registry.containsKey(object)) { entity = (DataProperty) registry.get(object); } else { entity = factory.createDataProperty(); entity.setURI(object.getURI()); if (object.getLabel(null) != null) entity.setLabel(object.getLabel(null)); if (object.getComment(null) != null) entity.setComment(object.getComment(null)); for (OntResource res: object.listDomain().toList()) { if (doSwitch(res) != null) { entity.getDomain().add((ClassExpression) doSwitch(res)); } } for (OntResource res: object.listRange().toList()) { if (doSwitch(res) != null && doSwitch(res) instanceof DataRange) { entity.getRange().add((DataRange) doSwitch(res)); } } target.getDataProperties().add(entity); registry.put(object, entity); } return entity; } @Override public Object caseObjectProperty(ObjectProperty object) { final com.emf4sw.owl.ObjectProperty entity; if (registry.containsKey(object)) { entity = (com.emf4sw.owl.ObjectProperty) registry.get(object); } else { entity = factory.createObjectProperty(); entity.setURI(object.getURI()); if (object.getLabel(null) != null) entity.setLabel(object.getLabel(null)); if (object.getComment(null) != null) entity.setComment(object.getComment(null)); for (OntResource res: object.listDomain().toList()) { if (doSwitch(res) != null) { entity.getDomain().add((ClassExpression) doSwitch(res)); } } for (OntResource res: object.listRange().toList()) { if (doSwitch(res) != null) { entity.getRange().add((ClassExpression) doSwitch(res)); } } target.getObjectProperties().add(entity); registry.put(object, entity); } return entity; } @Override public Object caseDatatype(com.hp.hpl.jena.ontology.DataRange object) { return createDatatype(object.getURI()); } } }