package tr.com.srdc.mdr.core.impl.ai;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tr.com.srdc.mdr.core.api.ai.ValueDomain;
import tr.com.srdc.mdr.core.impl.composite.AdministrationRecordImpl;
import tr.com.srdc.mdr.core.model.MDRException;
import tr.com.srdc.mdr.core.model.iso11179.AdministeredItemResource;
import tr.com.srdc.mdr.core.model.iso11179.ConceptualDomainResource;
import tr.com.srdc.mdr.core.model.iso11179.DataElementConceptResource;
import tr.com.srdc.mdr.core.model.iso11179.ValueDomainResource;
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.ConceptualDomainRelationshipAssociationResource;
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;
/**
*
*
* A set of valid Value Meanings. The Value Meanings may either be enumerated or
* expressed via a description.
*
* @author anil
* @author serike
* @author alp
*
*/
public abstract class ConceptualDomainImpl extends AdministeredItemImpl
implements ConceptualDomainResource {
private static final Logger logger = LoggerFactory
.getLogger(ConceptualDomainImpl.class);
/**
*
* @param n
* Mostly created by <code>Node.createURI()</code>.
* @param g
* The graph which holds all triples.
* @param conceptualDomainAdministrationRecord
* The AdministrationRecord for a
* {@link ConceptualDomainResource}.
* @param dimensionality
* Optional. An expression of measurement without units.
* @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
* @param administretedBy
* An Administered Item is administered by an
* {@link OrganizationResource} represented by the
* {@link StewardshipRelationshipResource}.
*
*/
public ConceptualDomainImpl(Node n, EnhGraph g,
AdministrationRecordResource conceptualDomainAdministrationRecord,
String dimensionality,
StewardshipRelationshipResource administeredBy,
SubmissionRelationshipResource submittedBy,
RegistrationAuthorityResource registeredBy,
AdministeredItemContextResource having, MDRDatabase mdrDatabase) {
super(n, g, administeredBy, submittedBy, registeredBy, having,
mdrDatabase);
setSuperClass(mdrDatabase.getVocabulary().ConceptualDomain);
setAdministrationRecord(conceptualDomainAdministrationRecord);
setDimensionality(dimensionality);
}
public ConceptualDomainImpl(Resource resource, MDRDatabase mdrDatabase) {
super(resource, mdrDatabase);
}
@Override
public void setAdministrationRecord(
AdministrationRecordResource conceptualDomainAdministrationRecord) {
if (conceptualDomainAdministrationRecord == null) {
throw new IllegalArgumentException(
"Administration Record must be specified for Conceptual Domain.");
}
setPropertyValue(
mdrDatabase.getVocabulary().conceptualDomainAdministrationRecord,
conceptualDomainAdministrationRecord);
}
@Override
public AdministrationRecordResource getAdministrationRecord() {
return new AdministrationRecordImpl(
getPropertyResourceValue(mdrDatabase.getVocabulary().conceptualDomainAdministrationRecord),
mdrDatabase);
}
@Override
public void setDimensionality(String dimensionality) {
setPropertyValue(mdrDatabase.getVocabulary().dimensionality,
mdrDatabase.getUtil().createTypedLiteral(dimensionality));
}
@Override
public String getDimensionality() {
RDFNode dimensionality = getPropertyValue(mdrDatabase.getVocabulary().dimensionality);
if (dimensionality == null) {
logger.debug("ConceptualDomain does not have dimensionality");
return null;
}
return dimensionality.asLiteral().getString();
}
@Override
public void addSpecifyingDataElementConceptConceptualDomainRelationship(
DataElementConceptResource specifyingDataElementConceptConceptualDomainRelationship) {
if (specifyingDataElementConceptConceptualDomainRelationship == null) {
throw new IllegalArgumentException(
"Null is not allowed as the value of the property to be added.");
}
addProperty(
mdrDatabase.getVocabulary().specifyingDataElementConceptConceptualDomainRelationship,
specifyingDataElementConceptConceptualDomainRelationship);
}
@Override
public List<DataElementConceptResource> getSpecifyingDataElementConceptConceptualDomainRelationships()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().specifyingDataElementConceptConceptualDomainRelationship);
return mdrDatabase.getUtil().createList(it,
DataElementConceptResource.class);
}
@Override
public void removeSpecifyingDataElementConceptConceptualDomainRelationship(
DataElementConceptResource specifyingDataElementConceptConceptualDomainRelationship) {
if (specifyingDataElementConceptConceptualDomainRelationship == null) {
throw new IllegalArgumentException(
"Null is not allowed as the value of the property to be removed.");
}
removeProperty(
mdrDatabase.getVocabulary().specifyingDataElementConceptConceptualDomainRelationship,
specifyingDataElementConceptConceptualDomainRelationship);
}
@Override
public void addRelatedToConceptualDomainRelationship(
ConceptualDomainRelationshipAssociationResource relatedToConceptualDomainRelationship) {
if (relatedToConceptualDomainRelationship == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value of the property to be added.");
}
addProperty(
mdrDatabase.getVocabulary().relatedToConceptualDomainRelationship,
relatedToConceptualDomainRelationship);
}
@Override
public void removeRelatedToConceptualDomainRelationship(
ConceptualDomainRelationshipAssociationResource relatedToConceptualDomainRelationship) {
if (relatedToConceptualDomainRelationship == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value of the property to be removed.");
}
removeProperty(
mdrDatabase.getVocabulary().relatedToConceptualDomainRelationship,
relatedToConceptualDomainRelationship);
}
@Override
public List<ConceptualDomainRelationshipAssociationResource> getRelatedToConceptualDomainRelationships()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().relatedToConceptualDomainRelationship);
return mdrDatabase.getUtil().createList(it,
ConceptualDomainRelationshipAssociationResource.class);
}
@Override
public void addRepresentedByConceptualDomainRepresentation(
ValueDomainResource representedByConceptualDomainRepresentation) {
if (representedByConceptualDomainRepresentation == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value of the property to be added.");
}
addProperty(
mdrDatabase.getVocabulary().representedByConceptualDomainRepresentation,
representedByConceptualDomainRepresentation);
}
@Override
public void removeRepresentedByConceptualDomainRepresentation(
ValueDomainResource representedByConceptualDomainRepresentation) {
if (representedByConceptualDomainRepresentation == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value of the property to be removed.");
}
removeProperty(
mdrDatabase.getVocabulary().representedByConceptualDomainRepresentation,
representedByConceptualDomainRepresentation);
}
@Override
public List<ValueDomainResource> getRepresentedByConceptualDomainRepresentations()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().representedByConceptualDomainRepresentation);
return mdrDatabase.getUtil().createList(it, ValueDomainResource.class);
}
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// ///// High-Level Interface Methods////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
@Override
public ConceptualDomainResource asMDRResource() {
return this;
}
@SuppressWarnings("unchecked")
@Override
public List<ValueDomain> getValueDomains() {
return (List<ValueDomain>) mdrDatabase.getQueryFactory()
.getValueDomainsOfConceptualDomain(this.getURI());
}
@Override
public ValueDomain getValueDomain(String valueDomainID) {
Resource vdResource = mdrDatabase.getQueryFactory()
.getAdministeredItem(valueDomainID);
OntClass vd = mdrDatabase.getOntModel()
.getOntClass(vdResource.getURI());
if (vd.hasSuperClass(mdrDatabase.getVocabulary().EnumeratedValueDomain,
false)) {
return new EnumeratedValueDomainImpl(vd, mdrDatabase);
} else {
return new NonEnumeratedValueDomainImpl(vd, mdrDatabase);
}
}
}