/* * OResourceImpl.java * * Niraj Aswani, 09/March/07 * * $Id: OResourceImpl.java 11600 2009-10-13 17:13:22Z johann_p $ */ package gate.creole.ontology.impl; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; import org.openrdf.model.vocabulary.RDFS; import gate.creole.ontology.AnnotationProperty; import gate.creole.ontology.GateOntologyException; import gate.creole.ontology.Literal; import gate.creole.ontology.OConstants; import gate.creole.ontology.ONodeID; import gate.creole.ontology.OResource; import gate.creole.ontology.Ontology; import gate.creole.ontology.RDFProperty; import gate.creole.ontology.URI; /** * Constructor * * @author niraj * */ public class OResourceImpl implements OResource, Comparable<OResource> { /** * instance of the OWLIMServices */ protected OntologyService ontologyService; /** * URI of the resource */ protected ONodeID nodeId; /** * The ontology the current resource belongs to */ protected Ontology ontology; /** * Constructor * * @param aURI * @param repositoryID * @param owlimPort */ public OResourceImpl(ONodeID aURI, Ontology ontology, OntologyService owlimPort) { this.nodeId = aURI; this.ontologyService = owlimPort; this.ontology = ontology; } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#getURI() */ @SuppressWarnings("deprecation") public URI getURI() { // we have to keep this around for making the ontology editor work // with both the new and old implementation as long as the old one // is around return new URI(this.nodeId.toString(),this.nodeId.isAnonymousResource()); } public ONodeID getONodeID() { return this.nodeId; } public void setONodeID(ONodeID id) { this.nodeId = id; } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#getURI() */ public void setURI(URI uri) { throw new GateOntologyException( "This operation is not allowed in this version!"); } /** * This method returns a set of labels specified on this resource. * * @return */ public Set<Literal> getLabels() { PropertyValue[] pvalues = ontologyService.getAnnotationPropertyValues( this.nodeId.toString(), RDFS.LABEL.toString()); Set<Literal> toReturn = new HashSet<Literal>(); for(PropertyValue pv : pvalues) { toReturn.add(new Literal(pv.getValue(), OntologyUtilities.getLocale(pv .getDatatype()))); } return toReturn; } /** * This method returns a set of comments specified on this resource. * * @return */ public Set<Literal> getComments() { PropertyValue[] pvalues = ontologyService.getAnnotationPropertyValues( this.nodeId.toString(), RDFS.COMMENT.toString()); Set<Literal> toReturn = new HashSet<Literal>(); for(PropertyValue pv : pvalues) { toReturn.add(new Literal(pv.getValue(), OntologyUtilities.getLocale(pv .getDatatype()))); } return toReturn; } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#getComment(java.lang.String) */ public String getComment(Locale language) { return ontologyService.getAnnotationPropertyValue(this.nodeId .toString(), RDFS.COMMENT.toString(), language != null ? language .getLanguage() : null); } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#setComment(java.lang.String, * java.lang.String) */ public void setComment(String aComment, Locale language) { ontologyService.addAnnotationPropertyValue(this.nodeId.toString(), RDFS.COMMENT.toString(), aComment, language != null ? language.getLanguage() : null); Literal l = new Literal(aComment, language); // TODO: !!!!! do something about the map here!!! AnnotationProperty annp = ontology.getAnnotationProperty(ontology.createOURI(OConstants.RDFS.COMMENT)); ontology.fireResourcePropertyValueChanged(this, (RDFProperty) annp, (Object)l, OConstants.ANNOTATION_PROPERTY_VALUE_ADDED_EVENT); } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#getLabel(java.lang.String) */ public String getLabel(Locale language) { return ontologyService.getAnnotationPropertyValue(this.nodeId .toString(), RDFS.LABEL.toString(), language != null ? language.getLanguage() : null); } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#setLabel(java.lang.String, * java.lang.String) */ public void setLabel(String aLabel, Locale language) { ontologyService.addAnnotationPropertyValue(this.nodeId.toString(), RDFS.LABEL.toString(), aLabel, language != null ? language.getLanguage() : null); Literal l = new Literal(aLabel, language); // TODO: TEST ontology.fireResourcePropertyValueChanged(this, Utils.createOProperty(ontology, ontologyService, RDFS.LABEL.toString(), OConstants.ANNOTATION_PROPERTY), (Object)l, OConstants.ANNOTATION_PROPERTY_VALUE_ADDED_EVENT); } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#getName() */ public String getName() { return this.nodeId.getResourceName(); } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#getOntology() */ public Ontology getOntology() { return this.ontology; } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#addAnnotationPropertyValue(gate.creole.ontology.AnnotationProperty, * gate.creole.ontology.Literal) */ public void addAnnotationPropertyValue( AnnotationProperty theAnnotationProperty, Literal literal) { //OResource res = ontology.getOResourceFromMap(theAnnotationProperty.getOURI() // .toString()); RDFProperty res = ontology.getProperty(theAnnotationProperty.getOURI()); if(res == null) { Utils .error(theAnnotationProperty.getOURI().toTurtle() + " does not exist"); return; } if(!(res instanceof AnnotationProperty)) { Utils.error(theAnnotationProperty.getOURI().toTurtle() + " is not a registered annotation property"); return; } ontologyService.addAnnotationPropertyValue(this.nodeId.toString(), theAnnotationProperty.getOURI().toString(), literal.getValue(), literal.getLanguage() != null ? literal.getLanguage().getLanguage() : null); ontology.fireResourcePropertyValueChanged(this, theAnnotationProperty, literal, OConstants.ANNOTATION_PROPERTY_VALUE_ADDED_EVENT); } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#getAnnotationPropertyValues(gate.creole.ontology.AnnotationProperty) */ public List<Literal> getAnnotationPropertyValues( AnnotationProperty theAnnotationProperty) { PropertyValue[] propValues = ontologyService.getAnnotationPropertyValues( this.nodeId.toString(), theAnnotationProperty .getOURI().toString()); List<Literal> list = new ArrayList<Literal>(); for(int i = 0; i < propValues.length; i++) { Literal l = new Literal(propValues[i].getValue(), OntologyUtilities .getLocale(propValues[i].getDatatype())); list.add(l); } return list; } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#removeAnnotationPropertyValue(gate.creole.ontology.AnnotationProperty, * gate.creole.ontology.Literal) */ public void removeAnnotationPropertyValue( AnnotationProperty theAnnotationProperty, Literal literal) { ontologyService.removeAnnotationPropertyValue(this.nodeId.toString(), theAnnotationProperty.getOURI().toString(), literal.getValue(), literal.getLanguage() != null ? literal.getLanguage().getLanguage() : null); ontology.fireResourcePropertyValueChanged(this, theAnnotationProperty, literal, OConstants.ANNOTATION_PROPERTY_VALUE_REMOVED_EVENT); } /* * (non-Javadoc) * * @see gate.creole.ontology.OResource#removeAnnotationPropertyValues(gate.creole.ontology.AnnotationProperty) */ public void removeAnnotationPropertyValues( AnnotationProperty theAnnotationProperty) { ontologyService.removeAnnotationPropertyValues( this.nodeId.toString(), theAnnotationProperty.getOURI().toString()); ontology.fireResourcePropertyValueChanged(this, theAnnotationProperty, null, OConstants.ANNOTATION_PROPERTY_VALUE_REMOVED_EVENT); } /** * This method returns the annotation properties set on this resource. * * @return */ public Set<AnnotationProperty> getSetAnnotationProperties() { Property[] properties = ontologyService.getAnnotationProperties( this.nodeId.toString()); Set<AnnotationProperty> annotProps = new HashSet<AnnotationProperty>(); for(int i = 0; i < properties.length; i++) { if(properties[i].getType() != OConstants.ANNOTATION_PROPERTY) { throw new GateOntologyException("The property :" + properties[i].getUri() + " returned from the repository is not an AnnotationProperty"); } String propUri = properties[i].getUri(); OResource resource = null; //ontology.getOResourceFromMap(propUri); if(resource == null) { resource = new AnnotationPropertyImpl(ontology.createOURI(propUri), this.ontology, ontologyService); //ontology.addOResourceToMap(propUri, resource); } annotProps.add((AnnotationProperty)resource); } return annotProps; } /** * Checks if the resource has the provided annotation property set on * it with the specified value. * * @param aProperty * @param aValue * @return */ public boolean hasAnnotationPropertyWithValue(AnnotationProperty aProperty, Literal aValue) { List<Literal> literals = getAnnotationPropertyValues(aProperty); for(Literal l : literals) { if(l.getValue().equals(aValue.getValue())) { if(l.getDataType() != null && aValue.getDataType() != null) { if(!aValue.getDataType().getXmlSchemaURIString().equals( l.getDataType().getXmlSchemaURIString())) continue; } if(l.getLanguage() != null && aValue.getLanguage() != null) { if(!aValue.getLanguage().toString().equals(l.getLanguage().toString())) continue; } return true; } } return false; } /** * This method returns all the set properties set on this resource. * * @return */ public Set<RDFProperty> getAllSetProperties() { Set<RDFProperty> toReturn = new HashSet<RDFProperty>(); toReturn.addAll(getSetAnnotationProperties()); return toReturn; } /** * This method returns a set of all properties where the current * resource has been specified as one of the domain resources. Please * note that this method is different from the getAllSetProperties() * method which returns a set of properties set on the resource. For * each property in the ontology, this method checks if the current * resource is valid domain. If so, the property is said to be * applicable, and otherwise not.. * * @return */ public Set<RDFProperty> getPropertiesWithResourceAsDomain() { Set<RDFProperty> toReturn = new HashSet<RDFProperty>(); Property[] properties = this.ontologyService.getPropertiesWithResourceAsDomain( this.getONodeID().toString()); for(int i = 0; i < properties.length; i++) { toReturn.add((RDFProperty)Utils.createOProperty( this.ontology, ontologyService, properties[i].getUri(), properties[i] .getType())); } return toReturn; } /** * This method returns a set of all properties where the current * resource has been specified as one of the range resources. Please * note that this method is different from the getAllSetProperties() * method which returns a set of properties set on the resource. For * each property in the ontology, this method checks if the current * resource is valid range. If so, the property is said to be * applicable, and otherwise not. * * @return */ public Set<RDFProperty> getPropertiesWithResourceAsRange() { Set<RDFProperty> toReturn = new HashSet<RDFProperty>(); Property[] properties = this.ontologyService.getPropertiesWithResourceAsRange( this.getONodeID().toString()); for(int i = 0; i < properties.length; i++) { toReturn.add((RDFProperty)Utils.createOProperty( this.ontology, ontologyService, properties[i].getUri(), properties[i] .getType())); } return toReturn; } /** * String representation of the resource: its name and not the URI. */ public String toString() { return this.getName(); } /** * HashCode for this resource. */ public int hashCode() { return this.getONodeID().toString().hashCode(); } /** * equals method overriden tocompare URIs */ public boolean equals(Object a) { if(a instanceof OResource) { return this.getONodeID().toString().equals(((OResource)a).getONodeID().toString()); } return false; } public int compareTo(OResource other) { return this.getONodeID().toString().compareTo(other.getONodeID().toString()); } }