package tr.com.srdc.mdr.core.impl.ai;
import java.util.ArrayList;
import java.util.List;
import tr.com.srdc.mdr.core.api.ai.ObjectClass;
import tr.com.srdc.mdr.core.model.MDRException;
import tr.com.srdc.mdr.core.model.MDRResourceFactory;
import tr.com.srdc.mdr.core.model.Vocabulary;
import tr.com.srdc.mdr.core.model.iso11179.AdministeredItemResource;
import tr.com.srdc.mdr.core.model.iso11179.ConceptRelationshipResource;
import tr.com.srdc.mdr.core.model.iso11179.ConceptResource;
import tr.com.srdc.mdr.core.model.iso11179.ObjectClassResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.AdministeredItemContextResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.AdministrationRecordResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.OrganizationResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.RegistrationAuthorityResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.StewardshipRelationshipResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.SubmissionRelationshipResource;
import tr.com.srdc.mdr.core.store.MDRDatabase;
import com.hp.hpl.jena.enhanced.EnhGraph;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.rdf.model.NodeIterator;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.vocabulary.RDFS;
/**
*
* An Object Class is a set of ideas, abstractions, or things in the real world
* that can be identified with explicit boundaries and meaning and whose
* properties and behavior follow the same rules. It may be either a single or a
* group of associated concepts, abstractions, or things. An Object Class may be
* a single unit of thought (i.e., Concept) or a set of Concepts in a
* relationship with each other to form a more complex concept (i.e., Concept
* Relationship). A Concept and a Concept Relationship are subtypes of an Object
* Class.
*
* @author anil
*
*/
public class ConceptImpl extends ObjectClassImpl implements ConceptResource {
/**
* Instead of calling the constructor of this class, use
* {@link MDRResourceFactory#createConcept(AdministrationRecordResource)} to
* avoid entering illegal states.
*
* @param n
* Mostly created by <code>Node.createURI()</code>.
* @param g
* The graph which holds all triples.
* @param objectClassAdministrationRecord
* The Administration Record for an {@link ObjectClassResource}.
* @param administeredBy
* An Administered Item is administered by an
* {@link OrganizationResource} represented by the
* {@link StewardshipRelationshipResource}.
* @param submittedBy
* An Administered Item is submitted by an
* {@link OrganizationResource} represented by the
* {@link SubmissionRelationshipResource}.
* @param registeredBy
* An {@link AdministeredItemResource} is registered by a
* {@link RegistrationAuthorityResource}.
* @param having
* An {@link AdministeredItemResource} has to have at least one
* {@link AdministeredItemContextResource}.
* @param mdrDatabase
*/
public ConceptImpl(Node n, EnhGraph g,
AdministrationRecordResource objectClassAdministrationRecord,
StewardshipRelationshipResource administeredBy,
SubmissionRelationshipResource submittedBy,
RegistrationAuthorityResource registeredBy,
AdministeredItemContextResource having, MDRDatabase mdrDatabase) {
super(n, g, objectClassAdministrationRecord, administeredBy,
submittedBy, registeredBy, having, mdrDatabase);
setSuperClass(mdrDatabase.getVocabulary().Concept);
}
public ConceptImpl(Resource resource, MDRDatabase mdrDatabase) {
super(resource, mdrDatabase);
}
/**
* Adds {@link Vocabulary#usedInConceptRelationship} property with given
* value
*
* @param usedInConceptRelationship
*/
@Override
public void addUsedInConceptRelationship(
ConceptRelationshipResource usedInConceptRelationship) {
if (usedInConceptRelationship == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value of the property to be added.");
}
addProperty(mdrDatabase.getVocabulary().usedInConceptRelationship,
usedInConceptRelationship);
}
/**
* Removes {@link Vocabulary#usedInConceptRelationship} property with given
* value
*
* @param usedInConceptRelationship
*/
@Override
public void removeUsedInConceptRelationship(
ConceptRelationshipResource usedInConceptRelationship) {
if (usedInConceptRelationship == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value of the property to be removed.");
}
removeProperty(mdrDatabase.getVocabulary().usedInConceptRelationship,
usedInConceptRelationship);
}
/**
*
* @return {@link List} of all {@link Vocabulary#usedInConceptRelationship}
* property values
* @throws MDRException
*/
@Override
public List<ConceptRelationshipResource> getUsedInConceptRelationships()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().usedInConceptRelationship);
return mdrDatabase.getUtil().createList(it,
ConceptRelationshipResource.class);
}
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// ///// High-Level Interface Methods////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
@Override
public ConceptResource asMDRResource() {
return this;
}
@Override
public void setParentConcept(ObjectClass parent) {
if (parent != null) {
this.addProperty(RDFS.subClassOf, parent.asMDRResource());
} else {
ExtendedIterator<OntClass> l = this.listSuperClasses();
OntClass found = null;
while (l.hasNext()) {
OntClass ontClass = l.next();
if (ontClass.hasSuperClass(mdrDatabase.getVocabulary().Concept)) {
found = ontClass;
}
}
if (found != null) {
this.removeProperty(RDFS.subClassOf, found);
}
}
}
@Override
public ObjectClass getParentConcept() {
NodeIterator l = this.listPropertyValues(RDFS.subClassOf);
while (l.hasNext()) {
RDFNode res = l.nextNode();
if (res.canAs(OntClass.class)) {
OntClass ontClass = res.as(OntClass.class);
if (ontClass.hasSuperClass(mdrDatabase.getVocabulary().Concept)) {
return new ConceptImpl(res.asResource(), mdrDatabase);
}
}
}
return null;
}
@Override
public void addSubConcept(ObjectClass oc) {
oc.setParentConcept(this);
}
@Override
public List<ObjectClass> getSubConcepts() {
ExtendedIterator<OntClass> l = this.listSubClasses();
List<ObjectClass> ocList = new ArrayList<ObjectClass>();
while (l.hasNext()) {
OntClass res = l.next();
ocList.add(new ConceptImpl(res, mdrDatabase));
}
return ocList;
}
}