package tr.com.srdc.mdr.core.impl.composite;
import javax.xml.bind.DatatypeConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tr.com.srdc.mdr.core.model.AbstractMDRResource;
import tr.com.srdc.mdr.core.model.MDRResourceFactory;
import tr.com.srdc.mdr.core.model.Util;
import tr.com.srdc.mdr.core.model.iso11179.composite.DefinitionResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.DesignationResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.LanguageSectionResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.ReferenceDocumentResource;
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.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
/**
* The Definition class provides the defining entry of a Language Section in the
* Terminological Entry for an Administered Item in a particular Context. In
* other words, it is where the definition for an Administered Item is specified
* in a particular language for a particular Context. Where multiple Definitions
* are provided within the same Language Section, one of them may be specified
* as the preferred definition.
*
* @author anil
*
*/
public class DefinitionImpl extends AbstractMDRResource implements
DefinitionResource {
private static final Logger logger = LoggerFactory
.getLogger(DefinitionImpl.class);
/**
* Instead of calling the constructor of this class, use
* {@link MDRResourceFactory#createDefinition(LanguageSectionResource,String,boolean)}
* to avoid entering illegal states.
*
* @param n
* Mostly created by <code>Node.createURI()</code>
* @param g
* The graph which holds all triples.
* @param definingEntryOf
* Language section of which Definiton belongs to
* @param definitionText
* Definition Test
* @param preferredDefinition
* Optional. default value <code>false</code> if not given
* @param definitionSourceReference
* Optional.
* @param mdrDatabase
*/
public DefinitionImpl(Node n, EnhGraph g,
LanguageSectionResource definingEntryOf, String definitionText,
boolean preferredDefinition,
ReferenceDocumentResource definitionSourceReference,
MDRDatabase mdrDatabase) {
super(n, g, mdrDatabase);
setSuperClass(mdrDatabase.getVocabulary().Definition);
setDefiningEntryOf(definingEntryOf);
setDefinitionText(definitionText);
setPreferredDefinition(preferredDefinition);
setDefinitionSourceReference(definitionSourceReference);
}
public DefinitionImpl(Resource resource, MDRDatabase mdrDatabase) {
super(resource, mdrDatabase);
}
@Override
public void setDefiningEntryOf(LanguageSectionResource definingEntryOf) {
if (definingEntryOf == null) {
throw new IllegalArgumentException(
"Language Section must be specified for Definition");
}
setPropertyValue(mdrDatabase.getVocabulary().definingEntryOf,
definingEntryOf);
}
@Override
public LanguageSectionResource getDefiningEntryOf() {
return new LanguageSectionImpl(
getPropertyResourceValue(mdrDatabase.getVocabulary().definingEntryOf),
mdrDatabase);
}
@Override
public void setDefinitionText(String definitionText) {
if (Util.isNull(definitionText)) {
throw new IllegalArgumentException(
"Definition Text must be specified for Definition.");
}
setPropertyValue(mdrDatabase.getVocabulary().definitionText,
mdrDatabase.getUtil().createTypedLiteral(definitionText));
}
@Override
public String getDefinitionText() {
return getPropertyValue(mdrDatabase.getVocabulary().definitionText)
.asLiteral().getString();
}
@Override
public void setPreferredDefinition(boolean preferredDefinition) {
setPropertyValue(
mdrDatabase.getVocabulary().preferredDefinition,
mdrDatabase.getOntModel().createLiteral(
DatatypeConverter.printBoolean(preferredDefinition)));
}
@Override
public boolean isPreferredDefinition() {
RDFNode preferredDefinition = getPropertyValue(mdrDatabase
.getVocabulary().preferredDefinition);
if (preferredDefinition == null) {
logger.debug("Definition does not have preferredDefinition");
return false;
}
return preferredDefinition.asLiteral().getBoolean();
}
@Override
public void setDefinitionSourceReference(
ReferenceDocumentResource definitionSourceReference) {
setPropertyValue(mdrDatabase.getVocabulary().definitionSourceReference,
definitionSourceReference);
}
@Override
public ReferenceDocumentResource getDefinitionSourceReference() {
Resource definitionSourceReference = getPropertyResourceValue(mdrDatabase
.getVocabulary().definitionSourceReference);
if (definitionSourceReference == null) {
logger.debug("Definition does not have definitionSourceReference");
return null;
}
return new ReferenceDocumentImpl(definitionSourceReference, mdrDatabase);
}
@Override
public void setSpecificallyUsing(DesignationResource specificallyUsing) {
setPropertyValue(mdrDatabase.getVocabulary().specificallyUsing,
specificallyUsing);
}
@Override
public DesignationResource getSpecificallyUsing() {
Resource specificallyUsing = getPropertyResourceValue(mdrDatabase
.getVocabulary().specificallyUsing);
if (specificallyUsing == null) {
logger.debug("Definition is not specifically using Designation");
return null;
}
return new DesignationImpl(specificallyUsing, mdrDatabase);
}
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// ///// High-Level Interface Methods////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
@Override
public DefinitionResource asMDRResource() {
return this;
}
}