/*
* OResourceImpl.java
*
* Niraj Aswani, 09/March/07
*
* $Id: OResourceImpl.java 11724 2009-10-22 10:47:30Z markagreenwood $
*/
package gate.creole.ontology.owlim;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.openrdf.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 {
/**
* ID of the repository
*/
protected String repositoryID;
/**
* instance of the OWLIMServices
*/
protected OWLIM owlim;
/**
* URI of the resource
*/
protected URI uri;
/**
* The ontology the current resource belongs to
*/
protected Ontology ontology;
/**
* Constructor
*
* @param aURI
* @param repositoryID
* @param owlimPort
*/
public OResourceImpl(URI aURI, Ontology ontology, String repositoryID,
OWLIM owlimPort) {
this.uri = aURI;
this.repositoryID = repositoryID;
this.owlim = owlimPort;
this.ontology = ontology;
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OResource#getURI()
*/
public URI getURI() {
return this.uri;
}
/*
* (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 = owlim.getAnnotationPropertyValues(
this.repositoryID, this.uri.toString(), RDFS.LABEL);
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 = owlim.getAnnotationPropertyValues(
this.repositoryID, this.uri.toString(), RDFS.COMMENT);
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 owlim.getAnnotationPropertyValue(this.repositoryID, this.uri
.toString(), RDFS.COMMENT, 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) {
owlim.addAnnotationPropertyValue(this.repositoryID, this.uri.toString(),
RDFS.COMMENT, aComment, language != null
? language.getLanguage()
: null);
Literal l = new Literal(aComment, language);
ontology.fireResourcePropertyValueChanged(this, (RDFProperty) ontology.getOResourceFromMap(RDFS.COMMENT), (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 owlim.getAnnotationPropertyValue(this.repositoryID, this.uri
.toString(), RDFS.LABEL, 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) {
owlim.addAnnotationPropertyValue(this.repositoryID, this.uri.toString(),
RDFS.LABEL, aLabel, language != null
? language.getLanguage()
: null);
Literal l = new Literal(aLabel, language);
ontology.fireResourcePropertyValueChanged(this, (RDFProperty) ontology.getOResourceFromMap(RDFS.LABEL), (Object)l, OConstants.ANNOTATION_PROPERTY_VALUE_ADDED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OResource#getName()
*/
public String getName() {
return this.uri.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.getURI()
.toString());
if(res == null) {
Utils
.error(theAnnotationProperty.getURI().toString()
+ " does not exist");
return;
}
if(!(res instanceof AnnotationProperty)) {
Utils.error(theAnnotationProperty.getURI().toString()
+ " is not a registered annotation property");
return;
}
owlim.addAnnotationPropertyValue(this.repositoryID, this.uri.toString(),
theAnnotationProperty.getURI().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 = owlim.getAnnotationPropertyValues(
this.repositoryID, this.uri.toString(), theAnnotationProperty
.getURI().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) {
owlim.removeAnnotationPropertyValue(this.repositoryID, this.uri.toString(),
theAnnotationProperty.getURI().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) {
owlim.removeAnnotationPropertyValues(this.repositoryID,
this.uri.toString(), theAnnotationProperty.getURI().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 = owlim.getAnnotationProperties(this.repositoryID,
this.uri.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 = ontology.getOResourceFromMap(propUri);
if(resource == null) {
resource = new AnnotationPropertyImpl(new URI(propUri, false),
this.ontology, this.repositoryID, owlim);
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.owlim.getPropertiesWithResourceAsDomain(
this.repositoryID, this.getURI().toString());
for(int i = 0; i < properties.length; i++) {
toReturn.add((RDFProperty)Utils.createOProperty(this.repositoryID,
this.ontology, owlim, 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.owlim.getPropertiesWithResourceAsRange(
this.repositoryID, this.getURI().toString());
for(int i = 0; i < properties.length; i++) {
toReturn.add((RDFProperty)Utils.createOProperty(this.repositoryID,
this.ontology, owlim, 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.getURI().toString().hashCode();
}
/**
* equals method overriden tocompare URIs
*/
public boolean equals(Object a) {
if(a instanceof OResource) {
return ((OResource)a).getURI().toString()
.equals(this.getURI().toString());
}
return false;
}
public ONodeID getONodeID() {
throw new UnsupportedOperationException("Not supported in this implementation");
}
}