/*
* OInstanceImpl.java
*
* Niraj Aswani, 09/March/07
*
* $Id: OInstanceImpl.java 11598 2009-10-13 13:44:17Z johann_p $
*/
package gate.creole.ontology.owlim;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import gate.creole.ontology.DataType;
import gate.creole.ontology.DatatypeProperty;
import gate.creole.ontology.GateOntologyException;
import gate.creole.ontology.InvalidValueException;
import gate.creole.ontology.Literal;
import gate.creole.ontology.OClass;
import gate.creole.ontology.OConstants;
import gate.creole.ontology.OConstants.Closure;
import gate.creole.ontology.OInstance;
import gate.creole.ontology.OResource;
import gate.creole.ontology.OURI;
import gate.creole.ontology.ObjectProperty;
import gate.creole.ontology.Ontology;
import gate.creole.ontology.RDFProperty;
import gate.creole.ontology.URI;
/**
* Implementation of the OInstance
*
* @author niraj
*
*/
public class OInstanceImpl extends OResourceImpl implements OInstance {
/**
* Constructor
*
* @param aURI
* @param ontology
* @param repositoryID
* @param owlimPort
*/
public OInstanceImpl(URI aURI, Ontology ontology, String repositoryID,
OWLIM owlimPort) {
super(aURI, ontology, repositoryID, owlimPort);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#getOClasses(byte)
*/
public Set<OClass> getOClasses(byte closure) {
ResourceInfo[] oClasses = owlim.getClassesOfIndividual(this.repositoryID,
this.uri.toString(), closure);
Set<OClass> set = new HashSet<OClass>();
for(int i = 0; i < oClasses.length; i++) {
set.add(Utils.createOClass(this.repositoryID, this.ontology,
this.owlim, oClasses[i].getUri(), oClasses[i].getClassType()));
}
return set;
}
public Set<OClass> getOClasses(Closure closure) {
throw new UnsupportedOperationException("Not supported in this implementation");
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#isInstanceOf(gate.creole.ontology.OClass,
* byte)
*/
public boolean isInstanceOf(OClass aClass, byte closure) {
return owlim.hasIndividual(this.repositoryID, aClass.getURI().toString(),
this.uri.toString(), closure);
}
public boolean isInstanceOf(OClass aClass, Closure closure) {
throw new UnsupportedOperationException("Not supported in this implementation");
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#setDifferentFrom(gate.creole.ontology.OInstance)
*/
public void setDifferentFrom(OInstance theInstance) {
if(this == theInstance) {
Utils
.warning("setDifferentFrom(theInstance) : the source and the argument instances refer to the same instance and therefore cannot be set as different from each other");
return;
}
owlim.setDifferentIndividualFrom(this.repositoryID, this.uri.toString(),
theInstance.getURI().toString());
ontology.fireResourceRelationChanged(this, theInstance, OConstants.DIFFERENT_INSTANCE_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#getDifferentInstances()
*/
public Set<OInstance> getDifferentInstances() {
String[] oInsts = owlim.getDifferentIndividualFrom(this.repositoryID,
this.uri.toString());
Set<OInstance> set = new HashSet<OInstance>();
for(int i = 0; i < oInsts.length; i++) {
set.add(Utils.createOInstance(this.repositoryID, this.ontology,
this.owlim, oInsts[i]));
}
return set;
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#isDifferentFrom(gate.creole.ontology.OInstance)
*/
public boolean isDifferentFrom(OInstance theInstance) {
return owlim.isDifferentIndividualFrom(this.repositoryID, this.uri
.toString(), theInstance.getURI().toString());
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#setSameInstanceAs(gate.creole.ontology.OInstance)
*/
public void setSameInstanceAs(OInstance theInstance) {
if(this == theInstance) {
Utils
.warning("setDifferentFrom(theInstance) : the source and the argument instances refer to the same instance and therefore cannot be set as same");
return;
}
owlim.setSameIndividualAs(this.repositoryID, this.uri.toString(),
theInstance.getURI().toString());
ontology.fireResourceRelationChanged(this, theInstance, OConstants.SAME_INSTANCE_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#getSameInstance()
*/
public Set<OInstance> getSameInstance() {
String[] oInsts = owlim.getSameIndividualAs(this.repositoryID, this.uri
.toString());
Set<OInstance> set = new HashSet<OInstance>();
for(int i = 0; i < oInsts.length; i++) {
set.add(Utils.createOInstance(this.repositoryID, this.ontology,
this.owlim, oInsts[i]));
}
return set;
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#isSameInstanceAs(gate.creole.ontology.OInstance)
*/
public boolean isSameInstanceAs(OInstance theInstance) {
return owlim.isSameIndividualAs(this.repositoryID, this.uri.toString(),
theInstance.getURI().toString());
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#addRDFPropertyValue(gate.creole.ontology.RDFProperty,
* gate.creole.ontology.OResource)
*/
public void addRDFPropertyValue(RDFProperty aProperty, OResource value)
throws InvalidValueException {
// we need to check if the current instance is a valid domain for
// the property
if(!aProperty.isValidDomain(this)) {
Utils.error(this.getURI().toString()
+ " is not a valid domain for the property "
+ aProperty.getURI().toString());
return;
}
// we need to check if the current instance is a valid domain for
// the property
if(!aProperty.isValidRange(value)) {
Utils.error(value.getURI().toString()
+ " is not a valid range for the property "
+ aProperty.getURI().toString());
return;
}
owlim.addRDFPropertyValue(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString(), value.getURI().toString());
ontology.fireResourcePropertyValueChanged(this, aProperty, value, OConstants.RDF_PROPERTY_VALUE_ADDED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#removeRDFPropertyValue(gate.creole.ontology.RDFProperty,
* gate.creole.ontology.OResource)
*/
public void removeRDFPropertyValue(RDFProperty aProperty, OResource value) {
owlim.removeRDFPropertyValue(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString(), value.getURI().toString());
ontology.fireResourcePropertyValueChanged(this, aProperty, value, OConstants.RDF_PROPERTY_VALUE_REMOVED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#getRDFPropertyValues(gate.creole.ontology.RDFProperty)
*/
public List<OResource> getRDFPropertyValues(RDFProperty aProperty) {
System.out.println(aProperty.getURI().toString());
ResourceInfo[] list = owlim.getRDFPropertyValues(this.repositoryID, uri
.toString(), aProperty.getURI().toString());
List<OResource> values = new ArrayList<OResource>();
List<String> individuals = Arrays.asList(owlim
.getIndividuals(this.repositoryID));
// these resources can be anything - an instance, a property, or a
// class
for(int i = 0; i < list.length; i++) {
// lets first search if it is available in ontology cache
OResource resource = ontology.getOResourceFromMap(list[i].getUri());
if(resource != null) {
values.add(resource);
continue;
}
// is it an individual
if(individuals.contains(list[i])) {
values.add(Utils.createOInstance(this.repositoryID, this.ontology,
this.owlim, list[i].getUri()));
continue;
}
// is it a class
if(owlim.hasClass(this.repositoryID, list[i].getUri())) {
values.add(Utils.createOClass(this.repositoryID, this.ontology,
this.owlim, list[i].getUri(), list[i].getClassType()));
continue;
}
Property prop = owlim.getPropertyFromOntology(this.repositoryID,
list[i].getUri());
values.add(Utils.createOProperty(this.repositoryID, this.ontology,
this.owlim, prop.getUri(), prop.getType()));
}
return values;
}
/**
* This method returns the RDF properties set on this resource.
*
* @return
*/
public Set<RDFProperty> getSetRDFProperties() {
Property[] properties = owlim.getRDFProperties(this.repositoryID,
this.uri.toString());
Set<RDFProperty> rdfProps = new HashSet<RDFProperty>();
for(int i = 0; i < properties.length; i++) {
if(properties[i].getType() != OConstants.RDF_PROPERTY) {
throw new GateOntologyException("The property :"
+ properties[i].getUri()
+ " returned from the repository is not an RDFProperty");
}
String propUri = properties[i].getUri();
OResource resource = ontology.getOResourceFromMap(propUri);
if(resource == null) {
resource = new RDFPropertyImpl(new URI(propUri, false),
this.ontology, this.repositoryID, owlim);
ontology.addOResourceToMap(propUri, resource);
}
rdfProps.add((RDFProperty)resource);
}
return rdfProps;
}
/**
* Checks if the resource has the provided RDF property set on it with
* the specified value.
*
* @param aProperty
* @param aResource
* @return
*/
public boolean hasRDFPropertyWithValue(RDFProperty aProperty,
OResource aResource) {
List<OResource> resources = getRDFPropertyValues(aProperty);
for(OResource r : resources) {
if(r.equals(aResource)) return true;
}
return false;
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#removeRDFPropertyValues(gate.creole.ontology.RDFProperty)
*/
public void removeRDFPropertyValues(RDFProperty aProperty) {
owlim.removeRDFPropertyValues(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString());
ontology.fireResourcePropertyValueChanged(this, aProperty, null, OConstants.RDF_PROPERTY_VALUE_REMOVED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#addDatatypePropertyValue(gate.creole.ontology.DatatypeProperty,
* gate.creole.ontology.Literal)
*/
public void addDatatypePropertyValue(DatatypeProperty aProperty, Literal value)
throws InvalidValueException {
// we need to check if the current instance is a valid domain for
// the property
if(!aProperty.isValidDomain(this)) {
Utils.error(this.getURI().toString()
+ " is not a valid domain for the property "
+ aProperty.getURI().toString());
return;
}
DataType type = aProperty.getDataType();
if(value.getDataType() == null) {
type = aProperty.getDataType();
}
else {
if(!type.getXmlSchemaURIString().equals(
value.getDataType().getXmlSchemaURIString()))
throw new GateOntologyException("Datatype :"
+ value.getDataType().getXmlSchemaURIString()
+ " doesn't match with the property's datatype :"
+ type.getXmlSchemaURIString());
}
owlim.addDatatypePropertyValue(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString(), type.getXmlSchemaURIString(),
value.getValue());
ontology.fireResourcePropertyValueChanged(this, aProperty, value, OConstants.DATATYPE_PROPERTY_VALUE_ADDED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#removeDatatypePropertyValue(gate.creole.ontology.DatatypeProperty,
* gate.creole.ontology.Literal)
*/
public void removeDatatypePropertyValue(DatatypeProperty aProperty,
Literal value) {
owlim.removeDatatypePropertyValue(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString(), value.getDataType()
.getXmlSchemaURIString(), value.getValue());
ontology.fireResourcePropertyValueChanged(this, aProperty, value, OConstants.DATATYPE_PROPERTY_VALUE_REMOVED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#getDatatypePropertyValues(gate.creole.ontology.DatatypeProperty)
*/
public List<Literal> getDatatypePropertyValues(DatatypeProperty aProperty) {
try {
PropertyValue[] values = owlim.getDatatypePropertyValues(
this.repositoryID, this.uri.toString(), aProperty.getURI()
.toString());
List<Literal> list = new ArrayList<Literal>();
for(int i = 0; i < values.length; i++) {
list.add(new Literal(values[i].getValue(), OntologyUtilities
.getDataType(values[i].getDatatype())));
}
return list;
}
catch(InvalidValueException ive) {
throw new GateOntologyException(ive);
}
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#removeDatatypePropertyValues(gate.creole.ontology.DatatypeProperty)
*/
public void removeDatatypePropertyValues(DatatypeProperty aProperty) {
owlim.removeDatatypePropertyValues(this.repositoryID,
this.uri.toString(), aProperty.getURI().toString());
ontology.fireResourcePropertyValueChanged(this, aProperty, null, OConstants.DATATYPE_PROPERTY_VALUE_REMOVED_EVENT);
}
/**
* This method returns the datatype properties set on this resource.
*
* @return
*/
public Set<DatatypeProperty> getSetDatatypeProperties() {
Property[] properties = owlim.getDatatypeProperties(this.repositoryID,
this.uri.toString());
Set<DatatypeProperty> dataProps = new HashSet<DatatypeProperty>();
for(int i = 0; i < properties.length; i++) {
if(properties[i].getType() != OConstants.DATATYPE_PROPERTY) {
throw new GateOntologyException("The property :"
+ properties[i].getUri()
+ " returned from the repository is not an DatatypeProperty");
}
String propUri = properties[i].getUri();
OResource resource = ontology.getOResourceFromMap(propUri);
if(resource == null) {
resource = new DatatypePropertyImpl(new URI(propUri, false),
this.ontology, this.repositoryID, owlim);
ontology.addOResourceToMap(propUri, resource);
}
dataProps.add((DatatypeProperty)resource);
}
return dataProps;
}
/**
* Checks if the resource has the provided datatype property set on it
* with the specified value.
*
* @param aProperty
* @param aValue
* @return
*/
public boolean hasDatatypePropertyWithValue(DatatypeProperty aProperty,
Literal aValue) {
List<Literal> literals = getDatatypePropertyValues(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;
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#addObjectPropertyValue(gate.creole.ontology.ObjectProperty,
* gate.creole.ontology.OInstance)
*/
public void addObjectPropertyValue(ObjectProperty aProperty, OInstance value)
throws InvalidValueException {
// we need to check if the current instance is a valid domain for
// the property
if(!aProperty.isValidDomain(this)) {
Utils.error(this.getURI().toString()
+ " is not a valid domain for the property "
+ aProperty.getURI().toString());
return;
}
// we need to check if the current instance is a valid domain for
// the property
if(!aProperty.isValidRange(value)) {
Utils.error(value.getURI().toString()
+ " is not a valid range for the property "
+ aProperty.getURI().toString());
return;
}
owlim.addObjectPropertyValue(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString(), value.getURI().toString());
ontology.fireResourcePropertyValueChanged(this, aProperty, value, OConstants.OBJECT_PROPERTY_VALUE_ADDED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#removeObjectPropertyValue(gate.creole.ontology.ObjectProperty,
* gate.creole.ontology.OInstance)
*/
public void removeObjectPropertyValue(ObjectProperty aProperty,
OInstance value) {
owlim.removeObjectPropertyValue(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString(), value.getURI().toString());
ontology.fireResourcePropertyValueChanged(this, aProperty, value, OConstants.OBJECT_PROPERTY_VALUE_REMOVED_EVENT);
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#getObjectPropertyValues(gate.creole.ontology.ObjectProperty)
*/
public List<OInstance> getObjectPropertyValues(ObjectProperty aProperty) {
String[] list = owlim.getObjectPropertyValues(this.repositoryID, uri
.toString(), aProperty.getURI().toString());
List<OInstance> values = new ArrayList<OInstance>();
for(int i = 0; i < list.length; i++) {
values.add(Utils.createOInstance(this.repositoryID, this.ontology,
this.owlim, list[i]));
}
return values;
}
/*
* (non-Javadoc)
*
* @see gate.creole.ontology.OInstance#removeObjectPropertyValues(gate.creole.ontology.ObjectProperty)
*/
public void removeObjectPropertyValues(ObjectProperty aProperty) {
owlim.removeObjectPropertyValues(this.repositoryID, this.uri.toString(),
aProperty.getURI().toString());
ontology.fireResourcePropertyValueChanged(this, aProperty, null, OConstants.OBJECT_PROPERTY_VALUE_REMOVED_EVENT);
}
/**
* This method returns the object properties set on this resource.
*
* @return
*/
public Set<ObjectProperty> getSetObjectProperties() {
Property[] properties = owlim.getObjectProperties(this.repositoryID,
this.uri.toString());
Set<ObjectProperty> objectProps = new HashSet<ObjectProperty>();
for(int i = 0; i < properties.length; i++) {
if(properties[i].getType() != OConstants.OBJECT_PROPERTY) {
throw new GateOntologyException("The property :"
+ properties[i].getUri()
+ " returned from the repository is not an ObjectProperty");
}
String propUri = properties[i].getUri();
OResource resource = ontology.getOResourceFromMap(propUri);
if(resource == null) {
resource = new ObjectPropertyImpl(new URI(propUri, false),
this.ontology, this.repositoryID, owlim);
ontology.addOResourceToMap(propUri, resource);
}
objectProps.add((ObjectProperty)resource);
}
return objectProps;
}
/**
* Checks if the resource has the provided object property set on it
* with the specified value.
*
* @param aProperty
* @param aValue
* @return
*/
public boolean hasObjectPropertyWithValue(ObjectProperty aProperty,
OInstance aValue) {
List<OInstance> instances = getObjectPropertyValues(aProperty);
for(OInstance i : instances) {
if(i.equals(aValue)) {
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());
toReturn.addAll(getSetDatatypeProperties());
toReturn.addAll(getSetObjectProperties());
toReturn.addAll(getSetRDFProperties());
return toReturn;
}
public OURI getOURI() {
throw new UnsupportedOperationException("Not supported in this implementation");
}
}