package com.emf4sw.owl.resource.impl; import com.emf4sw.owl.DataComplementOf; import com.emf4sw.owl.DataIntersectionOf; import com.emf4sw.owl.DataOneOf; import com.emf4sw.owl.DataRange; import com.emf4sw.owl.DataUnionOf; import com.emf4sw.owl.DatatypeRestriction; import com.emf4sw.owl.FacetRestriction; import com.emf4sw.owl.OWLDatatype; import com.emf4sw.owl.util.OWLSwitch; import com.emf4sw.owl.vocabulary.OWL; import com.emf4sw.rdf.vocabulary.RDF; import com.emf4sw.rdf.vocabulary.RDFS; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.rdf.model.RDFList; import com.hp.hpl.jena.rdf.model.Resource; class DataRangeFactory { static Resource createDataRange(DataRange range, OntModel model) { return range != null ? new DataRangeVisitorExtractor(model).doSwitch(range) : null; } // static Resource createDatatypeDefinition(DatatypeDefinition axiom, OntModel model) { // final Resource aDatatype = model.createResource( getURI(axiom.getDatatype()) ); // final Resource aRestriction = createDatatypeRestriction(axiom.getRestriction(), model); // // model.createStatement(aDatatype, // model.createProperty(OWL.equivalentClass), aRestriction); // // return aDatatype; // } static Resource createDatatype(DataRange datatype, OntModel model) { return (datatype != null && getURI(datatype) != null) ? model.createResource(getURI(datatype)) : model.createResource(); } static Resource createDatatypeRestriction(DatatypeRestriction restriction, OntModel model) { // _:x rdf:type rdfs:Datatype . // _:x owl:onDatatype T(DT) . // _:x owl:withRestrictions T(SEQ _:y1 ... _:yn) . // _:y1 F1 lt1 . // ... // _:yn Fn ltn final Resource aDatatype = model.createResource(); model.add(aDatatype, model.createProperty(RDF.type), model.createResource(RDFS.Datatype)); model.add(aDatatype, model.createProperty(OWL.onDatatype), createDatatype(restriction.getDatatype(), model)); RDFList list = model.createList(); for (FacetRestriction facet: restriction.getRestrictions()) { com.hp.hpl.jena.rdf.model.Literal literal = model.createLiteral(facet.getValue().getLexicalForm()); Resource aResource = model.createResource(); model.add(aResource, model.createProperty( facet.getDatatype() == null ? RDFS.Literal : getURI( facet.getDatatype() ) ), literal); list = list.cons(aResource); } model.add(aDatatype, model.createProperty(OWL.withRestrictions), list); return aDatatype; } private static String getURI(DataRange dataRange) { if (dataRange instanceof OWLDatatype) { return ((OWLDatatype) dataRange).getURI(); } return RDFS.Literal; } static class DataRangeVisitorExtractor extends OWLSwitch<Resource> { private OntModel model; DataRangeVisitorExtractor(OntModel model) { this.model = model; } @Override public Resource caseDataComplementOf(DataComplementOf range) { final Resource aResource = model.createResource(); model.createStatement(aResource, model.createProperty(RDF.type), model.createResource(RDFS.Datatype)); final Resource dataRange = createDataRange(range.getDataRange(), model); model.createStatement(aResource, model.createProperty(OWL.datatypeComplementOf), dataRange); return aResource; } @Override public Resource caseDataIntersectionOf(DataIntersectionOf range) { final Resource aResource = model.createResource(); model.createStatement(aResource, model.createProperty(RDF.type), model.createResource(RDFS.Datatype)); RDFList list = model.createList(); for (DataRange value: range.getDataRanges()) { Resource dataRange = createDataRange(value, model); if (dataRange != null) { list = list.cons( dataRange ); } } model.createStatement(aResource, model.createProperty(OWL.intersectionOf), list); return aResource; } @Override public Resource caseDataOneOf(DataOneOf range) { RDFList list = model.createList(); for (com.emf4sw.rdf.Literal value: range.getOneOf()) { com.hp.hpl.jena.rdf.model.Literal literal = model.createLiteral(value.getLexicalForm()); if (literal != null) { list = list.cons( literal ); } } return model.createDataRange(list); } @Override public Resource caseDataUnionOf(DataUnionOf range) { final Resource aResource = model.createResource(); model.createStatement(aResource, model.createProperty(RDF.type), model.createResource(RDFS.Datatype)); RDFList list = model.createList(); for (DataRange value: range.getDataRanges()) { Resource dataRange = createDataRange(value, model); if (dataRange != null) { list = list.cons( dataRange ); } } model.createStatement(aResource, model.createProperty(OWL.unionOf), list); return aResource; } @Override public Resource caseOWLDatatype(OWLDatatype range) { return (range != null && getURI(range) != null) ? model.createResource(getURI(range)) : model.createResource(); } @Override public Resource caseDatatypeRestriction(DatatypeRestriction range) { return createDatatypeRestriction(range, model); } } }