package tr.com.srdc.mdr.core.impl.ai;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tr.com.srdc.mdr.core.api.ai.EnumeratedValueDomain;
import tr.com.srdc.mdr.core.api.composite.Datatype;
import tr.com.srdc.mdr.core.api.composite.PermissibleValue;
import tr.com.srdc.mdr.core.api.composite.ValueMeaning;
import tr.com.srdc.mdr.core.impl.composite.ValueMeaningImpl;
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.EnumeratedConceptualDomainResource;
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.model.iso11179.composite.ValueMeaningResource;
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.rdf.model.NodeIterator;
import com.hp.hpl.jena.rdf.model.Resource;
/**
*
* A Conceptual Domain sometimes contains a finite allowed inventory of notions
* that can be enumerated. Such a Conceptual Domain is referred to as an
* Enumerated Conceptual Domain. An example of an Enumerated Conceptual Domain
* is the notion of countries that is specified in ISO 3166, Codes for the
* representation of names of countries. As a sub-type of Conceptual Domain, an
* Enumerated Conceptual Domain inherits the attributes and relationships of the
* former.
*
* @author anil
*/
public class EnumeratedConceptualDomainImpl extends ConceptualDomainImpl
implements EnumeratedConceptualDomainResource {
private static final Logger logger = LoggerFactory
.getLogger(EnumeratedConceptualDomainImpl.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 EnumeratedConceptualDomainImpl(Node n, EnhGraph g,
AdministrationRecordResource conceptualDomainAdministrationRecord,
String dimensionality,
StewardshipRelationshipResource administeredBy,
SubmissionRelationshipResource submittedBy,
RegistrationAuthorityResource registeredBy,
AdministeredItemContextResource having, MDRDatabase mdrDatabase) {
super(n, g, conceptualDomainAdministrationRecord, dimensionality,
administeredBy, submittedBy, registeredBy, having, mdrDatabase);
setSuperClass(mdrDatabase.getVocabulary().EnumeratedConceptualDomain);
}
public EnumeratedConceptualDomainImpl(Resource resource,
MDRDatabase mdrDatabase) {
super(resource, mdrDatabase);
}
@Override
public void addContainingValueMeaningSet(
ValueMeaningResource containingValueMeaningSet) {
if (containingValueMeaningSet == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value of the property to be added.");
}
addProperty(mdrDatabase.getVocabulary().containingValueMeaningSet,
containingValueMeaningSet);
}
@Override
public void removeContainingValueMeaningSet(
ValueMeaningResource containingValueMeaningSet) {
if (containingValueMeaningSet == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value ıf the property to be removed.");
}
removeProperty(mdrDatabase.getVocabulary().containingValueMeaningSet,
containingValueMeaningSet);
}
@Override
public List<ValueMeaningResource> getContainingValueMeaningSets()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().containingValueMeaningSet);
return mdrDatabase.getUtil().createList(it, ValueMeaningResource.class);
}
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// ///// High-Level Interface Methods////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
@Override
public EnumeratedConceptualDomainResource asMDRResource() {
return this;
}
@Override
public EnumeratedValueDomain createEnumeratedValueDomain(String name,
String definition, Datatype dataType,
List<PermissibleValue> permissibleValues) {
return getContext().createEnumeratedValueDomain(this, name, definition,
dataType, permissibleValues);
}
@Override
public List<ValueMeaning> getValueMeanings() {
List<ValueMeaningResource> vmResourceList = null;
try {
vmResourceList = this.getContainingValueMeaningSets();
}
catch (MDRException e) {
logger.error("ValueMeaningList of {} could not be obtained",
this.getName(), e);
vmResourceList = new ArrayList<ValueMeaningResource>();
}
List<ValueMeaning> vmList = new ArrayList<ValueMeaning>();
for (ValueMeaningResource vmr : vmResourceList) {
vmList.add(new ValueMeaningImpl(vmr, mdrDatabase));
}
return vmList;
}
@SuppressWarnings("unchecked")
@Override
public List<ValueMeaning> getValueMeanings(int limit, int offset) {
List<ValueMeaningResource> vmResourceList = null;
vmResourceList = (List<ValueMeaningResource>) this.mdrDatabase
.getQueryFactory().listValueMeningsOfCD(this.getURI(), limit,
offset);
List<ValueMeaning> vmList = new ArrayList<ValueMeaning>();
for (ValueMeaningResource vmr : vmResourceList) {
vmList.add(new ValueMeaningImpl(vmr, mdrDatabase));
}
return vmList;
}
@Override
public ValueMeaning addValueMeaning(String identifier, String description) {
ValueMeaningResource vm = mdrDatabase.getResourceFactory()
.createValueMeaning(identifier, description,
Calendar.getInstance(), Calendar.getInstance(),
this.asMDRResource());
this.addContainingValueMeaningSet(vm);
return vm;
}
@Override
public ValueMeaning getValueMeaning(String identifier) {
// TODO : this function should obviously be changed, performance is too
// bad
List<ValueMeaningResource> vmList = null;
try {
vmList = getContainingValueMeaningSets();
}
catch (MDRException e) {
logger.error("ValueMeanings of {} could not be obtained");
return null;
}
for (ValueMeaningResource vm : vmList) {
if (vm.getValueMeaningIdentifier().equals(identifier)) {
return vm;
}
}
return null;
}
@Override
public void addValueMeaning(Collection<ValueMeaning> valueMeaningCollection) {
for (ValueMeaning vm : valueMeaningCollection) {
this.addContainingValueMeaningSet(vm.asMDRResource());
vm.asMDRResource().addContainedInValueMeaningSet(this);
}
}
@Override
public int getNumberOfValueMeanings() {
return mdrDatabase.getQueryFactory().getNumberOfValueMeanings(
this.getURI());
}
@Override
public boolean isEnumeratedConceptualDomain() {
return true;
}
}