/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.foundation.ontology.owl; import java.text.Collator; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.logging.Logger; import org.openflexo.foundation.ontology.OntologyObject; import org.openflexo.foundation.ontology.OntologyProperty; import com.hp.hpl.jena.ontology.ConversionException; import com.hp.hpl.jena.ontology.OntProperty; public abstract class OWLProperty extends OWLObject<OntProperty> implements OntologyProperty { private static final Logger logger = Logger.getLogger(OntologyProperty.class.getPackage().getName()); private OntProperty ontProperty; private DomainStatement domainStatement; private RangeStatement rangeStatement; private List<DomainStatement> domainStatementList; private List<RangeStatement> rangeStatementList; private List<OWLObject<?>> domainList; private List<OWLObject<?>> rangeList; private boolean superDomainStatementWereAppened = false; private boolean superRangeStatementWereAppened = false; private final Vector<OWLProperty> superProperties; protected OWLProperty(OntProperty anOntProperty, OWLOntology ontology) { super(anOntProperty, ontology); ontProperty = anOntProperty; superProperties = new Vector<OWLProperty>(); domainStatementList = new ArrayList<DomainStatement>(); rangeStatementList = new ArrayList<RangeStatement>(); domainList = null; rangeList = null; } /** * Init this OntologyProperty, given base OntProperty */ protected void init() { updateOntologyStatements(ontProperty); updateSuperProperties(ontProperty); } /** * Update this OntologyProperty, given base OntProperty */ @Override protected void update() { updateOntologyStatements(ontProperty); updateSuperProperties(ontProperty); } /** * Update this OntologyProperty given a new OntProperty which is assumed to extends base OntProperty * * @param anOntProperty */ protected void update(OntProperty anOntProperty) { updateOntologyStatements(anOntProperty); updateSuperProperties(anOntProperty); } @Override public void setName(String aName) { ontProperty = renameURI(aName, ontProperty, OntProperty.class); } @Override protected void _setOntResource(OntProperty r) { ontProperty = r; } public static final Comparator<OntologyProperty> COMPARATOR = new Comparator<OntologyProperty>() { @Override public int compare(OntologyProperty o1, OntologyProperty o2) { return Collator.getInstance().compare(o1.getName(), o2.getName()); } }; public OntProperty getOntProperty() { return ontProperty; } @Override public OntProperty getOntResource() { return getOntProperty(); } private void updateSuperProperties(OntProperty anOntProperty) { // superClasses.clear(); try { Iterator it = anOntProperty.listSuperProperties(true); while (it.hasNext()) { OntProperty father = (OntProperty) it.next(); OWLProperty fatherProp = getOntology().getProperty(father.getURI()); if (fatherProp != null) { if (!superProperties.contains(fatherProp)) { superProperties.add(fatherProp); } } } } catch (ConversionException e) { logger.warning("Unexpected " + e.getMessage() + " while processing " + getURI()); // Petit hack en attendant de mieux comprendre le probleme if (getURI().equals("http://www.w3.org/2004/02/skos/core#altLabel") || getURI().equals("http://www.w3.org/2004/02/skos/core#prefLabel") || getURI().equals("http://www.w3.org/2004/02/skos/core#hiddenLabel")) { OWLProperty label = getOntology().getProperty("http://www.w3.org/2000/01/rdf-schema#label"); if (!superProperties.contains(label)) { superProperties.add(label); } } } } @Override public Vector<OWLProperty> getSuperProperties() { return superProperties; } /*private boolean isRequired(OntologyProperty aProperty, FlexoOntology context) { if (aProperty.getFlexoOntology() == context) { return true; } for (OntologyProperty aSubProperty : aProperty.getSubProperties()) { if (isRequired(aSubProperty, context)) { return true; } } return false; }*/ @Override public boolean isAnnotationProperty() { return getOntResource().isAnnotationProperty();// isAnnotationProperty; } @Override public void updateOntologyStatements(OntProperty anOntResource) { super.updateOntologyStatements(anOntResource); superDomainStatementWereAppened = false; superRangeStatementWereAppened = false; domainStatementList.clear(); rangeStatementList.clear(); domainList = null; rangeList = null; for (OWLStatement s : getSemanticStatements()) { if (s instanceof DomainStatement) { domainStatement = (DomainStatement) s; domainStatementList.add(domainStatement); } if (s instanceof RangeStatement) { rangeStatement = (RangeStatement) s; rangeStatementList.add(rangeStatement); } } } /** * Return domain statement, asserting there is only one domain statement * * @return */ public DomainStatement getDomainStatement() { if (domainStatement == null) { for (OWLProperty p : getSuperProperties()) { DomainStatement d = p.getDomainStatement(); if (d != null) { return d; } } return null; } return domainStatement; } /** * Return range statement, asserting there is only one range statement * * @return */ public RangeStatement getRangeStatement() { if (rangeStatement == null) { for (OWLProperty p : getSuperProperties()) { RangeStatement r = p.getRangeStatement(); if (r != null) { return r; } } return null; } return rangeStatement; } /** * Return domain as ontology object, asserting there is only one domain statement * * @return */ @Override public OntologyObject getDomain() { /* if (getURI().equals("http://www.w3.org/2000/01/rdf-schema#label")) { // System.out.println("Pour "+getURI()+" le domain statement est "+getDomainStatement()); // return getOntologyLibrary().getOntologyObject("http://www.w3.org/2000/01/rdf-schema#Resource"); return getOntologyLibrary().THING; } if (getURI().equals("http://www.w3.org/2004/02/skos/core#prefLabel")) { System.out.println("Pour "+getURI()+" le domain statement est "+getDomainStatement()); if (getDomainStatement() == null) { for (OntologyProperty p : getSuperProperties()) { System.out.println("Examining "+p); OntologyObject o = p.getDomain(); if (o != null) { System.out.println("Je retourne "+o); return o; } } return null; } // return getOntologyLibrary().getOntologyObject("http://www.w3.org/2000/01/rdf-schema#Resource"); return getOntologyLibrary().THING; }*/ if (getDomainStatement() == null) { for (OWLProperty p : getSuperProperties()) { OntologyObject o = p.getDomain(); if (o != null) { return o; } } return null; } return getDomainStatement().getDomain(); } /** * Return range as ontology object, asserting there is only one range statement * * @return */ public OntologyObject getRange() { /* if (getURI().equals("http://www.w3.org/2000/01/rdf-schema#label")) { System.out.println("Pour "+getURI()+" le range statement est "+getRangeStatement()); }*/ if (getRangeStatement() == null) { return null; } return getRangeStatement().getRange(); } /** * Return list of DomainStatement * * @return */ public List<DomainStatement> getDomainStatementList() { if (!superDomainStatementWereAppened) { for (OWLProperty p : getSuperProperties()) { domainStatementList.addAll(p.getDomainStatementList()); } superDomainStatementWereAppened = true; } return domainStatementList; } public List<RangeStatement> getRangeStatementList() { if (!superRangeStatementWereAppened) { for (OWLProperty p : getSuperProperties()) { rangeStatementList.addAll(p.getRangeStatementList()); } superRangeStatementWereAppened = true; } return rangeStatementList; } public List<OWLObject<?>> getDomainList() { if (domainList == null) { domainList = new ArrayList<OWLObject<?>>(); for (DomainStatement s : getDomainStatementList()) { if (s.getDomain() != null) { domainList.add(s.getDomain()); } } } return domainList; } public List<OWLObject<?>> getRangeList() { if (rangeList == null) { rangeList = new ArrayList<OWLObject<?>>(); for (RangeStatement s : getRangeStatementList()) { if (s.getRange() != null) { rangeList.add(s.getRange()); } } } return rangeList; } }