package tr.com.srdc.mdr.core.impl;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tr.com.srdc.mdr.core.api.ai.ConceptualDomain;
import tr.com.srdc.mdr.core.api.ai.Context;
import tr.com.srdc.mdr.core.api.ai.DataElement;
import tr.com.srdc.mdr.core.api.ai.DataElementConcept;
import tr.com.srdc.mdr.core.api.ai.EnumeratedConceptualDomain;
import tr.com.srdc.mdr.core.api.ai.NonEnumeratedConceptualDomain;
import tr.com.srdc.mdr.core.api.ai.ObjectClass;
import tr.com.srdc.mdr.core.api.ai.ValueDomain;
import tr.com.srdc.mdr.core.api.composite.Contact;
import tr.com.srdc.mdr.core.api.composite.Datatype;
import tr.com.srdc.mdr.core.api.composite.Organization;
import tr.com.srdc.mdr.core.impl.ai.ConceptImpl;
import tr.com.srdc.mdr.core.impl.ai.DataElementConceptImpl;
import tr.com.srdc.mdr.core.impl.ai.DataElementImpl;
import tr.com.srdc.mdr.core.impl.ai.EnumeratedConceptualDomainImpl;
import tr.com.srdc.mdr.core.impl.ai.EnumeratedValueDomainImpl;
import tr.com.srdc.mdr.core.impl.ai.NonEnumeratedConceptualDomainImpl;
import tr.com.srdc.mdr.core.impl.ai.NonEnumeratedValueDomainImpl;
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.ContextResource;
import tr.com.srdc.mdr.core.model.iso11179.EnumeratedConceptualDomainResource;
import tr.com.srdc.mdr.core.model.iso11179.NonEnumeratedConceptualDomainResource;
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.ContactResource;
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.ItemIdentifierResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.LanguageSectionResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.OrganizationResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.RegistrarResource;
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.SubmissionResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.TerminologicalEntryResource;
import tr.com.srdc.mdr.core.store.MDRDatabase;
import tr.com.srdc.mdr.core.store.query.ResourceQueryFactory;
import tr.com.srdc.mdr.core.store.query.ResourceQueryFactory.TextSearchType;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.rdf.model.Resource;
/**
* @author anil
*
*/
public class Repository {
private static final Logger logger = LoggerFactory
.getLogger(Repository.class);
private final MDRDatabase mdrDatabase;
private final RepositoryDefaults repositoryDefaults;
private final MDRResourceFactory mdrResourceFactory;
private ResourceQueryFactory resourceQueryFactory;
/**
* Creates a Repository instance by using given {@link MDRDatabase} as a RDF
* Backend
*
* @param mdrDatabase
* {@link MDRDatabase} instance which will be used as a RDF
* Backend for the Repository
* @throws MDRException
*/
public Repository(MDRDatabase mdrDatabase) throws MDRException {
if (mdrDatabase == null) {
throw new MDRException(
"MDRdatabase can not be given null for creating repository.");
}
this.mdrDatabase = mdrDatabase;
this.repositoryDefaults = new RepositoryDefaults(this);
this.mdrResourceFactory = mdrDatabase.getResourceFactory();
this.resourceQueryFactory = mdrDatabase.getQueryFactory();
logger.info("A new Repository is created successfully");
}
public MDRDatabase getMDRDatabase() {
return this.mdrDatabase;
}
public RepositoryDefaults getDefaults() {
return this.repositoryDefaults;
}
public Contact getContact(String fullName) {
return resourceQueryFactory.getContactResource(fullName);
}
public Organization getOrganization(String organizationName) {
return resourceQueryFactory.getOrganizationResource(organizationName);
}
/**
* Create a {@link ContextResource} on the underlying Ontology and then
* return the {@link Context} object.
*
* @param name
* @param definition
* @param contactResource
* @param organizationResource
* @return
*/
public Context createContext(String name, String definition,
Contact contact, Organization organization) {
ContactResource contactResource = contact.asMDRResource();
OrganizationResource organizationResource = organization
.asMDRResource();
ItemIdentifierResource itemIdentifierResource = repositoryDefaults
.createItemIdentifierResource(null);
AdministrationRecordResource administrationRecordResource = repositoryDefaults
.createAdministrationRecordResource(itemIdentifierResource);
StewardshipRelationshipResource stewardshipRelationshipResource = mdrResourceFactory
.createStewardshipRelationship(organizationResource,
mdrResourceFactory.createStewardship(contactResource));
SubmissionResource submissionResource = mdrResourceFactory
.createSubmission(contactResource);
SubmissionRelationshipResource submissionRelationshipResource = mdrResourceFactory
.createSubmissionRelationship(organizationResource,
submissionResource);
RegistrarResource registrarResource = mdrResourceFactory
.createRegistrar(contactResource.getContactInformation(),
contactResource);
RegistrationAuthorityResource registrationAuthorityResource = mdrResourceFactory
.createRegistrationAuthority(repositoryDefaults
.getRegistrationAuthorityIdentifierResource(),
repositoryDefaults.getLanguageIdentificationResource(),
organizationResource.getName(), organizationResource
.getMailAddress(), registrarResource);
LanguageSectionResource languageSectionResource = mdrResourceFactory
.createLanguageSection(repositoryDefaults
.getLanguageIdentificationResource());
DesignationResource designationResource = mdrResourceFactory
.createDesignation(languageSectionResource, name, true);
if (!Util.isNull(definition)) {
DefinitionResource definitionResource = mdrResourceFactory
.createDefinition(languageSectionResource, definition,
true, null);
languageSectionResource
.addContainigDefinitionEntry(definitionResource);
}
languageSectionResource.addContainingNameEntry(designationResource);
TerminologicalEntryResource terminologicalEntryResource = mdrResourceFactory
.createTerminologicalEntry(languageSectionResource);
AdministeredItemContextResource administeredItemContextResource = mdrResourceFactory
.createAdministeredItemContext(
repositoryDefaults.getParentContextResource(),
terminologicalEntryResource);
Context context = mdrResourceFactory.createContext(
administrationRecordResource, definition,
repositoryDefaults.getLanguageIdentificationResource(),
stewardshipRelationshipResource,
submissionRelationshipResource, registrationAuthorityResource,
administeredItemContextResource);
logger.info("Context created successfully: {}", name);
return context;
}
/**
* @return A list of {@link Context}s available in the {@link MDRDatabase}.
*/
public List<Context> getContexts() {
@SuppressWarnings("unchecked")
List<Context> contextList = (List<Context>) resourceQueryFactory
.getContextsOfContext(repositoryDefaults
.getParentContextResource().getURI());
logger.info("List of Contexts are retrieved");
return contextList;
}
/**
* @param contextID
* Unique ID of the {@link Context} in the {@link MDRDatabase}.
* @return The {@link Context}
*/
public Context getContext(String contextID) {
return resourceQueryFactory.getContextResource(contextID);
}
// TODO
// Asagidaki get* leri Context'e almak lazim consistency acisindan.
/**
* @return List of all {@link ConceptualDomain}s which have name and
* definition on parent Context
*/
@SuppressWarnings("unchecked")
public List<ConceptualDomain> getConceptualDomains() {
ContextResource contextResource = this.getDefaults()
.getParentContextResource();
return (List<ConceptualDomain>) mdrDatabase.getQueryFactory()
.getConceptualDomainsOfContext(contextResource.getURI(), null,
null);
}
/**
*
* @param limit
* Total number of results to be returned
* @param offset
* The initial point of the results
* @return List of {@link ConceptualDomain}s which have name and definition
* on parent Context
*/
@SuppressWarnings("unchecked")
public List<ConceptualDomain> getConceptualDomains(Integer limit,
Integer offset) {
ContextResource contextResource = this.getDefaults()
.getParentContextResource();
return (List<ConceptualDomain>) mdrDatabase.getQueryFactory()
.getConceptualDomainsOfContext(contextResource.getURI(), limit,
offset);
}
/**
* @param cid
* Unique ID of the {@link ConceptualDomain} in the
* {@link MDRDatabase}
* @return The {@link ConceptualDomain}
*/
public ConceptualDomain getConceptualDomain(String uniqueID) {
Resource cdResource = mdrDatabase.getQueryFactory()
.getAdministeredItem(uniqueID);
OntClass cd = mdrDatabase.getOntModel()
.getOntClass(cdResource.getURI());
if (cd.hasSuperClass(mdrDatabase.getVocabulary().EnumeratedConceptualDomain)) {
return new EnumeratedConceptualDomainImpl(cd, mdrDatabase);
} else {
return new NonEnumeratedConceptualDomainImpl(cd, mdrDatabase);
}
}
/**
* Creates a {@link EnumeratedConceptualDomain} named and defined over
* parent Context with given arguments
*/
public EnumeratedConceptualDomain createEnumeratedConceptualDomain(
String name, String oid, String definition, String dimensionality) {
RepositoryDefaults defaults = this.getDefaults();
ContextResource contextResource = defaults.getParentContextResource();
MDRResourceFactory mdrResourceFactory = this.mdrDatabase
.getResourceFactory();
ItemIdentifierResource itemIdentifierResource = defaults
.createItemIdentifierResource(oid);
AdministrationRecordResource administrationRecordResource = defaults
.createAdministrationRecordResource(itemIdentifierResource);
ContactResource contactResource = contextResource.getAdministerPerson()
.asMDRResource();
OrganizationResource organizationResource = contextResource
.getAdministerOrganization().asMDRResource();
StewardshipRelationshipResource stewardshipRelationshipResource = mdrResourceFactory
.createStewardshipRelationship(organizationResource,
mdrResourceFactory.createStewardship(contactResource));
SubmissionResource submissionResource = mdrResourceFactory
.createSubmission(contactResource);
SubmissionRelationshipResource submissionRelationshipResource = mdrResourceFactory
.createSubmissionRelationship(organizationResource,
submissionResource);
RegistrarResource registrarResource = mdrResourceFactory
.createRegistrar(contactResource.getContactInformation(),
contactResource);
RegistrationAuthorityResource registrationAuthorityResource = mdrResourceFactory
.createRegistrationAuthority(
defaults.getRegistrationAuthorityIdentifierResource(),
defaults.getLanguageIdentificationResource(),
organizationResource.getName(),
organizationResource.getMailAddress(),
registrarResource);
LanguageSectionResource languageSectionResource = mdrResourceFactory
.createLanguageSection(defaults
.getLanguageIdentificationResource());
DesignationResource designationResource = mdrResourceFactory
.createDesignation(languageSectionResource, name, true);
languageSectionResource.addContainingNameEntry(designationResource);
if (!Util.isNull(definition)) {
DefinitionResource definitionResource = mdrResourceFactory
.createDefinition(languageSectionResource, definition,
true, null);
languageSectionResource
.addContainigDefinitionEntry(definitionResource);
}
TerminologicalEntryResource terminologicalEntryResource = mdrResourceFactory
.createTerminologicalEntry(languageSectionResource);
AdministeredItemContextResource administeredItemContextResource = mdrResourceFactory
.createAdministeredItemContext(contextResource,
terminologicalEntryResource);
contextResource
.addAdministeredItemContext(administeredItemContextResource);
EnumeratedConceptualDomainResource enumeratedConceptualDomainResource = mdrResourceFactory
.createEnumeratedConceptualDomain(administrationRecordResource,
dimensionality, stewardshipRelationshipResource,
submissionRelationshipResource,
registrationAuthorityResource,
administeredItemContextResource);
administeredItemContextResource
.addGrouping(enumeratedConceptualDomainResource);
logger.info("EnumeratedConceptualDomain created successfully: {}", name);
return enumeratedConceptualDomainResource;
}
/**
* Creates a {@link NonEnumeratedConceptualDomain} named and defined over
* parent Context with given arguments
*/
public NonEnumeratedConceptualDomain createNonEnumeratedConceptualDomain(
String name, String definition, String dimensionality) {
RepositoryDefaults defaults = this.getDefaults();
ContextResource contextResource = defaults.getParentContextResource();
MDRResourceFactory mdrResourceFactory = this.mdrDatabase
.getResourceFactory();
ItemIdentifierResource itemIdentifierResource = defaults
.createItemIdentifierResource(null);
AdministrationRecordResource administrationRecordResource = defaults
.createAdministrationRecordResource(itemIdentifierResource);
ContactResource contactResource = contextResource.getAdministerPerson()
.asMDRResource();
OrganizationResource organizationResource = contextResource
.getAdministerOrganization().asMDRResource();
StewardshipRelationshipResource stewardshipRelationshipResource = mdrResourceFactory
.createStewardshipRelationship(organizationResource,
mdrResourceFactory.createStewardship(contactResource));
SubmissionResource submissionResource = mdrResourceFactory
.createSubmission(contactResource);
SubmissionRelationshipResource submissionRelationshipResource = mdrResourceFactory
.createSubmissionRelationship(organizationResource,
submissionResource);
RegistrarResource registrarResource = mdrResourceFactory
.createRegistrar(contactResource.getContactInformation(),
contactResource);
RegistrationAuthorityResource registrationAuthorityResource = mdrResourceFactory
.createRegistrationAuthority(
defaults.getRegistrationAuthorityIdentifierResource(),
defaults.getLanguageIdentificationResource(),
organizationResource.getName(),
organizationResource.getMailAddress(),
registrarResource);
LanguageSectionResource languageSectionResource = mdrResourceFactory
.createLanguageSection(defaults
.getLanguageIdentificationResource());
DesignationResource designationResource = mdrResourceFactory
.createDesignation(languageSectionResource, name, true);
languageSectionResource.addContainingNameEntry(designationResource);
if (!Util.isNull(definition)) {
DefinitionResource definitionResource = mdrResourceFactory
.createDefinition(languageSectionResource, definition,
true, null);
languageSectionResource
.addContainigDefinitionEntry(definitionResource);
}
TerminologicalEntryResource terminologicalEntryResource = mdrResourceFactory
.createTerminologicalEntry(languageSectionResource);
AdministeredItemContextResource administeredItemContextResource = mdrResourceFactory
.createAdministeredItemContext(contextResource,
terminologicalEntryResource);
contextResource
.addAdministeredItemContext(administeredItemContextResource);
// Copy the definition of this resource as the description of this
// NonEnumeratedConceptualDomain
NonEnumeratedConceptualDomainResource nonEnumeratedConceptualDomainResource = mdrResourceFactory
.createNonEnumeratedConceptualDomain(
administrationRecordResource, dimensionality,
stewardshipRelationshipResource,
submissionRelationshipResource,
registrationAuthorityResource,
administeredItemContextResource, definition);
administeredItemContextResource
.addGrouping(nonEnumeratedConceptualDomainResource);
logger.info("NonEnumeratedConceptualDomain created successfully: {}",
name);
return nonEnumeratedConceptualDomainResource;
}
@SuppressWarnings("unchecked")
/**
* Executes a full text search over the Repository to find Conceptual domain by name
* @param keyword keyword to be matched with designation of Conceptual Domains
* @param searchType Exact / AllWords / AtLeastOne. If given <code>nuull</code> default value is Exact
* @return
*/
public List<ConceptualDomain> searchConceptualDomain(String keyword,
TextSearchType searchType) {
return (List<ConceptualDomain>) mdrDatabase.getQueryFactory()
.searchConceptualDomain(keyword,
repositoryDefaults.getParentContextResource().getURI(),
searchType);
}
/**
* Executes a text search on the whole Repository to find DataElement whose
* name mathes with given keyword
*
* @param keyword
* @param searchType
* Optional. Exact / AtLeastOne / AllWords
* @return
*/
@SuppressWarnings("unchecked")
public List<DataElement> searchDataElement(String keyword,
TextSearchType searchType, int limit, int offset) {
return (List<DataElement>) mdrDatabase.getQueryFactory()
.searchDataElement(keyword, null, searchType, limit, offset);
}
/**
* Calculates the number of total results to be returned from free text
* Query
*
* @param keyword
* keyword to be matched with the names of {@link DataElement}s
* @param searchType
* Exact, Wildcard, AllWords
* @return
*/
public int getNumberOfDataElementSearch(String keyword,
TextSearchType searchType) {
return mdrDatabase.getQueryFactory().getNumberOfDataElementSearch(
keyword, null, searchType);
}
/**
* Given the unique ID, return the {@link ObjectClass}.
*
* @param ocID
* @return
*/
public ObjectClass getObjectClass(String ocID) {
return new ConceptImpl(mdrDatabase.getQueryFactory()
.getAdministeredItem(ocID), mdrDatabase);
}
/**
* Gets the data element with the given unique id. If no data element exists
* with the given id, returns null.
*
* @param id
* data element unique id
* @return
*/
public DataElement getDataElement(String id) {
Resource ai = mdrDatabase.getQueryFactory().getAdministeredItem(id);
if (ai == null) {
return null;
}
return new DataElementImpl(ai, mdrDatabase);
}
/**
* Given the identifier and the registration authority, return the
* {@link DataElement}.
*
* @param id
* data element unique id
* @param registrationAuthorityOrganizastionID
* organizationIdentifier of the RegistrationAuthority who
* authors the requested Data Element.
* @param version
* @return
*/
public DataElement getDataElement(String id,
String registrationAuthorityOrganizationID, String version) {
Resource ai = mdrDatabase.getQueryFactory().getAdministeredItem(id,
registrationAuthorityOrganizationID, version);
if (ai == null) {
return null;
}
return new DataElementImpl(ai, mdrDatabase);
}
public DataElementConcept getDataElementConcept(String decID) {
return new DataElementConceptImpl(mdrDatabase.getQueryFactory()
.getAdministeredItem(decID), mdrDatabase);
}
public ValueDomain getValueDomain(String valueDomainID) {
Resource resource = mdrDatabase.getQueryFactory().getAdministeredItem(
valueDomainID);
OntClass res = mdrDatabase.getOntModel().getOntClass(resource.getURI());
if (res == null) {
return null;
}
ValueDomain vd = null;
if (res.hasSuperClass(
mdrDatabase.getVocabulary().EnumeratedValueDomain, false)) {
vd = new EnumeratedValueDomainImpl(res, mdrDatabase);
} else {
vd = new NonEnumeratedValueDomainImpl(res, mdrDatabase);
}
return vd;
}
public int getNumberOfConceptualDomains() {
ContextResource contextResource = this.getDefaults()
.getParentContextResource();
return mdrDatabase.getQueryFactory().getNumberOfConceptualDomains(
contextResource.getURI());
}
@SuppressWarnings("unchecked")
public List<Datatype> getDataTypes() {
return (List<Datatype>) mdrDatabase.getQueryFactory().getDatatypes();
}
}