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.composite.ClassificationSchemeItem;
import tr.com.srdc.mdr.core.impl.composite.AdministrationRecordImpl;
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.AdministeredItemResource;
import tr.com.srdc.mdr.core.model.iso11179.ClassificationSchemeResource;
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.ClassificationSchemeItemResource;
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.rdf.model.NodeIterator;
import com.hp.hpl.jena.rdf.model.Resource;
/**
* A Classification Scheme may be a taxonomy, a network, an ontology, or any
* other terminological system. The classification may also be just a list of
* controlled jenaDatabase of property words (or terms). The list might be taken
* from the "leaf level" of a taxonomy.<br>
* <br>
*
* @author anil
*
*/
public class ClassificationSchemeImpl extends AdministeredItemImpl implements
ClassificationSchemeResource {
private static final Logger logger = LoggerFactory
.getLogger(ClassificationSchemeImpl.class);
/**
* Instead of calling the constructor of this class, use
* {@link MDRResourceFactory#createClassificationScheme(AdministrationRecordResource,String)}
* to avoid entering illegal states.
*
* @param n
* Mostly created by <code>Node.createURI()</code>
* @param g
* The graph which holds all triples.
* @param classificationSchemeAdministrationRecord
* The Administration Record for a Classification Scheme
* @param classificationSchemeTypeName
* The name of the type of Classification Scheme
* @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 ClassificationSchemeImpl(
Node n,
EnhGraph g,
AdministrationRecordResource classificationSchemeAdministrationRecord,
String classificationSchemeTypeName,
StewardshipRelationshipResource administeredBy,
SubmissionRelationshipResource submittedBy,
RegistrationAuthorityResource registeredBy,
AdministeredItemContextResource having, MDRDatabase mdrDatabase) {
super(n, g, administeredBy, submittedBy, registeredBy, having,
mdrDatabase);
setSuperClass(mdrDatabase.getVocabulary().ClassificationScheme);
setAdministrationRecord(classificationSchemeAdministrationRecord);
setClassificationSchemeTypeName(classificationSchemeTypeName);
}
/**
* Constructor for {@link ClassificationSchemeImpl} which constructs the
* class from a given {@link Resource}.
*
* @param resource
* @param mdrDatabase
*/
public ClassificationSchemeImpl(Resource resource, MDRDatabase mdrDatabase) {
super(resource, mdrDatabase);
}
@Override
public void setAdministrationRecord(
AdministrationRecordResource classificationSchemeAdministrationRecord) {
if (classificationSchemeAdministrationRecord == null) {
throw new IllegalArgumentException(
"Administration Record must be specified for ClassificationScheme.");
}
setPropertyValue(
mdrDatabase.getVocabulary().classificationSchemeAdministrationRecord,
classificationSchemeAdministrationRecord);
}
@Override
public AdministrationRecordResource getAdministrationRecord() {
return new AdministrationRecordImpl(
getPropertyResourceValue(mdrDatabase.getVocabulary().classificationSchemeAdministrationRecord),
mdrDatabase);
}
@Override
public void setClassificationSchemeTypeName(
String classificationSchemeTypeName) {
if (Util.isNull(classificationSchemeTypeName)) {
throw new IllegalArgumentException(
"Classification Scheme Type Name must be specified for ClassificationScheme.");
}
setPropertyValue(
mdrDatabase.getVocabulary().classificationSchemeTypeName,
mdrDatabase.getUtil().createTypedLiteral(
classificationSchemeTypeName));
}
@Override
public String getClassificationSchemeTypeName() {
return getPropertyValue(
mdrDatabase.getVocabulary().classificationSchemeTypeName)
.asLiteral().getString();
}
@Override
public void addContaining(
ClassificationSchemeItemResource classificationSchemeItem) {
addProperty(mdrDatabase.getVocabulary().containing,
classificationSchemeItem);
}
@Override
public void removeContaining(
ClassificationSchemeItemResource classificationSchemeItem) {
if (classificationSchemeItem == null) {
throw new IllegalArgumentException(
"Null is not allowed as the value of the property to be removed.");
}
removeProperty(mdrDatabase.getVocabulary().containing,
classificationSchemeItem);
}
@Override
public List<ClassificationSchemeItemResource> getContanining()
throws MDRException {
NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().containing);
return mdrDatabase.getUtil().createList(it,
ClassificationSchemeItemResource.class);
}
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// ///// High-Level Interface Methods////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
// //////////////////////////////////////////////
@Override
public ClassificationSchemeResource asMDRResource() {
return this;
}
// @Override
// public String getSchemeName() {
// return this.getClassificationSchemeTypeName();
// }
//
// @Override
// public void setSchemeName(String name) {
// this.setClassificationSchemeTypeName(name);
// }
@Override
public ClassificationSchemeItem createClassificationSchemeItem(
String typeName, String itemValue) {
ClassificationSchemeItemResource item = this.mdrDatabase.getResourceFactory()
.createClassificationSchemeItem(this, typeName, itemValue);
logger.debug("ClassificationSchemeItem created: {} ", typeName);
this.addClassifiedBy(item);
return item;
}
// @Override
// public List<ClassificationSchemeItem> getContainedSchemeItems()
// throws MDRException {
// List<ClassificationSchemeItem> itemList;
// try {
// itemList = Collections
// .<ClassificationSchemeItem> unmodifiableList(this
// .getContanining());
// } catch (MDRException e) {
// logger.error(
// "ClassificationSchemeItems of {} could not be obtained",
// this.getClassificationSchemeTypeName());
// throw e;
// }
// return itemList;
// }
}