package tr.com.srdc.mdr.core.impl.composite;
import java.util.Calendar;
import java.util.List;
import javax.xml.bind.DatatypeConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tr.com.srdc.mdr.core.api.composite.PermissibleValue;
import tr.com.srdc.mdr.core.model.AbstractMDRResource;
import tr.com.srdc.mdr.core.model.MDRException;
import tr.com.srdc.mdr.core.model.MDRResourceFactory;
import tr.com.srdc.mdr.core.model.Util;
import tr.com.srdc.mdr.core.model.iso11179.EnumeratedConceptualDomainResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.PermissibleValueResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.ValueMeaningResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.ValueResource;
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.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
/**
*
* Each member of an Enumerated Conceptual Domain has a Value Meaning that
* provides its distinction from other members. In the example of ISO 3166, the
* notion of each country as specified would be the Value Meanings. The
* representation of Value Meanings in a registry shall be independent of (and
* shall not constrain) their representation in any corresponding Value Domain.
* A particular Value Meaning may have more than one means of representation by
* Permissible Values — each from a distinct Enumerated Value Domain.
*
* @author anil
*
*/
public class ValueMeaningImpl extends AbstractMDRResource implements
ValueMeaningResource {
private static final Logger logger = LoggerFactory
.getLogger(ValueMeaningImpl.class);
/**
* Instead of calling the constructor of this class, use
* {@link MDRResourceFactory#createValue(String, String, Calendar, Calendar, EnumeratedConceptualDomainResource)}
* to avoid entering illegal states.
*
* @param n
* Mostly created by <code>Node.createURI()</code>.
* @param g
* The graph which holds all triples.
* @param valueMeaningIdentifier
* @param valueMeaningDescription
* Optional.
* @param valueMeaningBeginDate
* @param valueMeaningEndDate
* Optional.
* @param containedInValueMeaningSet
* @param mdrDatabase
*/
public ValueMeaningImpl(Node n, EnhGraph g, String valueMeaningIdentifier,
String valueMeaningDescription, Calendar valueMeaningBeginDate,
Calendar valueMeaningEndDate,
EnumeratedConceptualDomainResource containedInValueMeaningSet,
MDRDatabase mdrDatabase) {
super(n, g, mdrDatabase);
setSuperClass(mdrDatabase.getVocabulary().ValueMeaning);
setValueMeaningIdentifier(valueMeaningIdentifier);
setValueMeaningDescription(valueMeaningDescription);
setValueMeaningBeginDate(valueMeaningBeginDate);
setValueMeaningEndDate(valueMeaningEndDate);
addContainedInValueMeaningSet(containedInValueMeaningSet);
}
public ValueMeaningImpl(Resource resource, MDRDatabase mdrDatabase) {
super(resource, mdrDatabase);
}
@Override
public void setValueMeaningIdentifier(String valueMeaningIdentifier) {
if (Util.isNull(valueMeaningIdentifier)) {
throw new IllegalArgumentException(
"Identifier should be specified for ValueMeaning.");
}
setPropertyValue(mdrDatabase.getVocabulary().valueMeaningIdentifier,
mdrDatabase.getUtil()
.createTypedLiteral(valueMeaningIdentifier));
}
@Override
public String getValueMeaningIdentifier() {
RDFNode valueMeaningIdentifier = getPropertyValue(mdrDatabase
.getVocabulary().valueMeaningIdentifier);
return valueMeaningIdentifier.asLiteral().getString();
}
@Override
public void setValueMeaningDescription(String valueMeaningDescription) {
setPropertyValue(
mdrDatabase.getVocabulary().valueMeaningDescription,
mdrDatabase.getUtil().createTypedLiteral(
valueMeaningDescription));
}
@Override
public String getValueMeaningDescription() {
RDFNode valueMeaningDescription = getPropertyValue(mdrDatabase
.getVocabulary().valueMeaningDescription);
if (valueMeaningDescription == null) {
logger.debug("ValueMeaning does not have description");
return null;
}
return valueMeaningDescription.asLiteral().getString();
}
@Override
public void setValueMeaningBeginDate(Calendar valueMeaningBeginDate) {
if (valueMeaningBeginDate == null) {
throw new IllegalArgumentException(
"Begin Date should be specified for ValueMeaning");
}
setPropertyValue(
mdrDatabase.getVocabulary().valueMeaningBeginDate,
mdrDatabase.getOntModel().createTypedLiteral(
DatatypeConverter.printDateTime(valueMeaningBeginDate)));
}
@Override
public Calendar getValueMeaningBeginDate() {
RDFNode valueMeaningBeginDate = getPropertyValue(mdrDatabase
.getVocabulary().valueMeaningBeginDate);
return DatatypeConverter.parseDateTime(valueMeaningBeginDate
.asLiteral().getLexicalForm());
}
@Override
public void setValueMeaningEndDate(Calendar valueMeaningEndDate) {
if (valueMeaningEndDate == null) {
setPropertyValue(mdrDatabase.getVocabulary().valueMeaningEndDate,
mdrDatabase.getUtil().createTypedLiteral(null));
} else {
setPropertyValue(
mdrDatabase.getVocabulary().valueMeaningEndDate,
mdrDatabase.getOntModel().createTypedLiteral(
DatatypeConverter
.printDateTime(valueMeaningEndDate)));
}
}
@Override
public Calendar getValueMeaningEndDate() {
RDFNode valueMeaningEndDate = getPropertyValue(mdrDatabase
.getVocabulary().valueMeaningEndDate);
if (valueMeaningEndDate == null) {
logger.debug("ValueMeaning does not have endDate");
return null;
}
return DatatypeConverter.parseDateTime(valueMeaningEndDate.asLiteral()
.getLexicalForm());
}
@Override
public void addContainedInValueMeaningSet(
EnumeratedConceptualDomainResource containedInValueMeaningSet) {
if (containedInValueMeaningSet == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value for the property to be added.");
}
addProperty(mdrDatabase.getVocabulary().containedInValueMeaningSet,
containedInValueMeaningSet);
}
@Override
public void removeContainedInValueMeaningSet(
EnumeratedConceptualDomainResource containedInValueMeaningSet) {
if (containedInValueMeaningSet == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value for the property to be removed.");
}
if (listPropertyValues(
mdrDatabase.getVocabulary().containedInValueMeaningSet)
.toList().size() <= 1) {
throw new IllegalStateException(
"There should be at least 1 value for the property");
}
removeProperty(mdrDatabase.getVocabulary().containedInValueMeaningSet,
containedInValueMeaningSet);
}
@Override
public List<EnumeratedConceptualDomainResource> getContainedInValueMeaningSets()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().containedInValueMeaningSet);
return mdrDatabase.getUtil().createList(it,
EnumeratedConceptualDomainResource.class);
}
@Override
public void addUsedInPermissibleValueMeaning(
PermissibleValueResource usedInPermissibleValueMeaning) {
if (usedInPermissibleValueMeaning == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value for the property to be added.");
}
addProperty(mdrDatabase.getVocabulary().usedInPermissibleValueMeaning,
usedInPermissibleValueMeaning);
}
@Override
public void removeUsedInPermissibleValueMeaning(
PermissibleValueResource usedInPermissibleValueMeaning) {
if (usedInPermissibleValueMeaning == null) {
throw new IllegalArgumentException(
"Null is not allowed as a value for the property to be removed.");
}
removeProperty(
mdrDatabase.getVocabulary().usedInPermissibleValueMeaning,
usedInPermissibleValueMeaning);
}
@Override
public List<PermissibleValueResource> getUsedInPermissibleValueMeanings()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().usedInPermissibleValueMeaning);
return mdrDatabase.getUtil().createList(it,
PermissibleValueResource.class);
}
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// ///// High-Level Interface Methods////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
@Override
public ValueMeaningResource asMDRResource() {
return this;
}
@Override
public String getDescription() {
return this.getValueMeaningDescription();
}
@Override
public String getIdentifier() {
return this.getValueMeaningIdentifier();
}
@Override
public PermissibleValue createPermissibleValue(String valueItem) {
ValueResource vr = mdrDatabase.getResourceFactory().createValue(
valueItem);
PermissibleValueResource pvr = mdrDatabase.getResourceFactory()
.createPermissibleValue(Calendar.getInstance(), null, vr, this);
vr.addUsedInPermittedValue(pvr);
this.addUsedInPermissibleValueMeaning(pvr);
return pvr;
}
}