package tr.com.srdc.mdr.core.impl;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.salusproject.securityprivacy.authentication.Organization;
import eu.salusproject.securityprivacy.authentication.User;
import eu.salusproject.securityprivacy.authentication.db.Database;
import eu.salusproject.securityprivacy.authentication.db.DatabaseException;
import tr.com.srdc.mdr.core.api.ai.ConceptualDomain;
import tr.com.srdc.mdr.core.api.composite.Datatype;
import tr.com.srdc.mdr.core.model.ISODataType;
import tr.com.srdc.mdr.core.model.MDRException;
import tr.com.srdc.mdr.core.model.MDRResourceFactory;
import tr.com.srdc.mdr.core.model.iso11179.ContextResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.AdministrationRecordResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.DatatypeResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.ItemIdentifierResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.LanguageIdentificationResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.RegistrationAuthorityIdentifierResource;
import tr.com.srdc.mdr.core.store.query.ResourceQueryFactory;
import tr.com.srdc.mdr.core.store.query.ResourceQueryFactory.TextSearchType;
import tr.com.srdc.mdr.core.util.Status;
public class RepositoryDefaults {
private static final Logger logger = LoggerFactory
.getLogger(Repository.class);
private final Repository repository;
private final MDRResourceFactory resourceFactory;
private static final String ISO_21090 = "ISO21090";
private static final String ISO_11404 = "ISO11404";
private Map<ISODataType, Datatype> isoDatatypes;
private HashMap<ISODataType, ConceptualDomain> isoDatatypesConceptualDomains;
public RepositoryDefaults(Repository repository) throws MDRException {
this.repository = repository;
this.resourceFactory = this.repository.getMDRDatabase()
.getResourceFactory();
// initDefaultResources();
}
public void initDefaultResources() throws MDRException {
initOrganizations();
initUsers();
boolean initialized = initDatatypes();
initConceptualDomains(initialized);
}
/**
* @param initialized
* indicates whether conceptual domains should be created or
* retrieved, if true conceptual domains are created, if false
* they are just retrieved
*/
private void initConceptualDomains(boolean initialized) {
isoDatatypesConceptualDomains = new HashMap<ISODataType, ConceptualDomain>();
if (initialized) {
isoDatatypesConceptualDomains
.put(ISODataType.BOOLEAN,
repository.createNonEnumeratedConceptualDomain(
ISODataType.BOOLEAN.toString(),
"Non Enumerated Conceptual Domain for Boolean",
""));
isoDatatypesConceptualDomains.put(ISODataType.CHARACTER, repository
.createNonEnumeratedConceptualDomain(
ISODataType.CHARACTER.toString(),
"Non Enumerated Conceptual Domain for Character",
""));
isoDatatypesConceptualDomains.put(ISODataType.STRING, repository
.createNonEnumeratedConceptualDomain(
ISODataType.STRING.toString(),
"Non Enumerated Conceptual Domain for String", ""));
isoDatatypesConceptualDomains.put(ISODataType.TIME, repository
.createNonEnumeratedConceptualDomain(
ISODataType.TIME.toString(),
"Non Enumerated Conceptual Domain for Time", ""));
isoDatatypesConceptualDomains
.put(ISODataType.INTEGER,
repository.createNonEnumeratedConceptualDomain(
ISODataType.INTEGER.toString(),
"Non Enumerated Conceptual Domain for Integer",
""));
isoDatatypesConceptualDomains.put(ISODataType.REAL, repository
.createNonEnumeratedConceptualDomain(
ISODataType.REAL.toString(),
"Non Enumerated Conceptual Domain for Real", ""));
isoDatatypesConceptualDomains
.put(ISODataType.CD,
repository.createNonEnumeratedConceptualDomain(
ISODataType.CD.toString(),
"Enumerated Conceptual Domain for Concept Descriptor",
""));
isoDatatypesConceptualDomains
.put(ISODataType.CD_CV,
repository.createNonEnumeratedConceptualDomain(
ISODataType.CD_CV.toString(),
"Non Enumerated Conceptual Domain for Coded Description",
""));
isoDatatypesConceptualDomains
.put(ISODataType.TS_DATE,
repository.createNonEnumeratedConceptualDomain(
ISODataType.TS_DATE.toString(),
"Non Enumerated Conceptual Domain for TS Date",
""));
isoDatatypesConceptualDomains.put(ISODataType.TS_DATETIME,
repository.createNonEnumeratedConceptualDomain(
ISODataType.TS_DATETIME.toString(),
"Non Enumerated Conceptual Domain for TS Datetime",
""));
isoDatatypesConceptualDomains
.put(ISODataType.II,
repository.createNonEnumeratedConceptualDomain(
ISODataType.II.toString(),
"Non Enumerated Conceptual Domain for Item Identifier",
""));
isoDatatypesConceptualDomains
.put(ISODataType.INT_NONNEG,
repository.createNonEnumeratedConceptualDomain(
ISODataType.INT_NONNEG.toString(),
"Non Enumerated Conceptual Domain for Non Negative Integer",
""));
isoDatatypesConceptualDomains
.put(ISODataType.PQ,
repository.createNonEnumeratedConceptualDomain(
ISODataType.PQ.toString(),
"Non Enumerated Conceptual Domain for Dimensioned quantity expressing the result of measuring.",
""));
isoDatatypesConceptualDomains
.put(ISODataType.PQ_TIME,
repository.createNonEnumeratedConceptualDomain(
ISODataType.PQ_TIME.toString(),
"Non Enumerated Conceptual Domain for Dimensioned quantity expressing the result of time measuring",
""));
isoDatatypesConceptualDomains
.put(ISODataType.IVL_TS,
repository.createNonEnumeratedConceptualDomain(
ISODataType.IVL_TS.toString(),
"Non Enumerated Conceptual Domain for consecutive values of TS Datetime",
""));
isoDatatypesConceptualDomains
.put(ISODataType.IVL_PQ,
repository.createNonEnumeratedConceptualDomain(
ISODataType.IVL_PQ.toString(),
"Non Enumerated Conceptual Domain for consecutive values of ordered physical quantity",
""));
isoDatatypesConceptualDomains
.put(ISODataType.PIVL_TS,
repository.createNonEnumeratedConceptualDomain(
ISODataType.PIVL_TS.toString(),
"Non Enumerated Conceptual Domain for periodic consecutive values of TS Datetime",
""));
} else {
isoDatatypesConceptualDomains.put(
ISODataType.BOOLEAN,
repository.searchConceptualDomain(
ISODataType.BOOLEAN.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.CHARACTER,
repository.searchConceptualDomain(
ISODataType.CHARACTER.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.STRING,
repository
.searchConceptualDomain(
ISODataType.STRING.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.TIME,
repository.searchConceptualDomain(
ISODataType.TIME.toString(), TextSearchType.Exact)
.get(0));
isoDatatypesConceptualDomains.put(
ISODataType.INTEGER,
repository.searchConceptualDomain(
ISODataType.INTEGER.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.REAL,
repository.searchConceptualDomain(
ISODataType.REAL.toString(), TextSearchType.Exact)
.get(0));
isoDatatypesConceptualDomains.put(
ISODataType.CD,
repository.searchConceptualDomain(
ISODataType.CD.toString(), TextSearchType.Exact)
.get(0));
isoDatatypesConceptualDomains.put(
ISODataType.CD_CV,
repository.searchConceptualDomain(
ISODataType.CD_CV.toString(), TextSearchType.Exact)
.get(0));
isoDatatypesConceptualDomains.put(
ISODataType.TS_DATETIME,
repository.searchConceptualDomain(
ISODataType.TS_DATETIME.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.TS_DATE,
repository.searchConceptualDomain(
ISODataType.TS_DATE.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.II,
repository.searchConceptualDomain(
ISODataType.II.toString(), TextSearchType.Exact)
.get(0));
isoDatatypesConceptualDomains.put(
ISODataType.INT_NONNEG,
repository.searchConceptualDomain(
ISODataType.INT_NONNEG.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.PQ,
repository.searchConceptualDomain(
ISODataType.PQ.toString(), TextSearchType.Exact)
.get(0));
isoDatatypesConceptualDomains.put(
ISODataType.PQ_TIME,
repository.searchConceptualDomain(
ISODataType.PQ_TIME.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.IVL_TS,
repository
.searchConceptualDomain(
ISODataType.IVL_TS.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.IVL_PQ,
repository
.searchConceptualDomain(
ISODataType.IVL_PQ.toString(),
TextSearchType.Exact).get(0));
isoDatatypesConceptualDomains.put(
ISODataType.PIVL_TS,
repository.searchConceptualDomain(
ISODataType.PIVL_TS.toString(),
TextSearchType.Exact).get(0));
}
repository.getMDRDatabase().sync();
logger.info("NonEnumeratedConceptualDomain's for default ISO Datatypes are created successfully");
}
private boolean initDatatypes() {
// TODO: We can put these datatypes directly to the ISO11179 ontology.
isoDatatypes = new HashMap<ISODataType, Datatype>();
List<Datatype> datatypeList = repository.getDataTypes();
isoDatatypes.put(ISODataType.BOOLEAN,
createDatatype(ISODataType.BOOLEAN.toString(), ISO_11404));
isoDatatypes.put(ISODataType.CHARACTER,
createDatatype(ISODataType.CHARACTER.toString(), ISO_11404));
isoDatatypes.put(ISODataType.STRING,
createDatatype(ISODataType.STRING.toString(), ISO_11404));
isoDatatypes.put(ISODataType.TIME,
createDatatype(ISODataType.TIME.toString(), ISO_11404));
isoDatatypes.put(ISODataType.INTEGER,
createDatatype(ISODataType.INTEGER.toString(), ISO_11404));
isoDatatypes.put(ISODataType.REAL,
createDatatype(ISODataType.REAL.toString(), ISO_21090));
isoDatatypes.put(ISODataType.CD,
createDatatype(ISODataType.CD.toString(), ISO_21090));
isoDatatypes.put(ISODataType.CD_CV,
createDatatype(ISODataType.CD_CV.toString(), ISO_21090));
isoDatatypes.put(ISODataType.TS_DATE,
createDatatype(ISODataType.TS_DATE.toString(), ISO_21090));
isoDatatypes.put(ISODataType.TS_DATETIME,
createDatatype(ISODataType.TS_DATETIME.toString(), ISO_21090));
isoDatatypes.put(ISODataType.II,
createDatatype(ISODataType.II.toString(), ISO_21090));
isoDatatypes.put(ISODataType.INT_NONNEG,
createDatatype(ISODataType.INT_NONNEG.toString(), ISO_21090));
isoDatatypes.put(ISODataType.PQ,
createDatatype(ISODataType.PQ.toString(), ISO_21090));
isoDatatypes.put(ISODataType.PQ_TIME,
createDatatype(ISODataType.PQ_TIME.toString(), ISO_21090));
isoDatatypes.put(ISODataType.IVL_TS,
createDatatype(ISODataType.IVL_TS.toString(), ISO_21090));
isoDatatypes.put(ISODataType.IVL_PQ,
createDatatype(ISODataType.IVL_PQ.toString(), ISO_21090));
isoDatatypes.put(ISODataType.PIVL_TS,
createDatatype(ISODataType.PIVL_TS.toString(), ISO_21090));
repository.getMDRDatabase().sync();
logger.info("Default Datatypes from ISO 11404 and ISO 21090 are created.");
if (datatypeList.containsAll(isoDatatypes.values())) {
return false;
}
return true;
}
private void initOrganizations() throws MDRException {
List<Organization> organizationList = null;
try {
organizationList = Database.getInstance().getAllOrganizations();
} catch (DatabaseException e) {
throw new MDRException(
"Cannot init the Organization resources from the Auth database",
e);
}
for (Organization organization : organizationList) {
resourceFactory.createOrganization(organization.getName(),
organization.getEmail());
}
logger.info("Default OrganizationResources are created successfully for the default users.");
}
private void initUsers() throws MDRException {
List<User> userList = null;
try {
userList = Database.getInstance().getAllUsers();
} catch (DatabaseException e) {
throw new MDRException(
"Cannot init the User resources from the Auth database", e);
}
for (User user : userList) {
resourceFactory.createContact(user.getEmail(), user.getFullName(),
user.getTitle());
}
logger.info("Default ContactResources are created successfully for the default users.");
}
private final Status registrationStatus = Status.Qualified;
private final Status administrativeStatus = Status.Qualified;
/**
* @return ItemIdentifier with given ID
*/
public ItemIdentifierResource createItemIdentifierResource(String uniqueID) {
if (uniqueID == null) {
return resourceFactory.createItemIdentifier();
} else {
return resourceFactory.createItemIdentifier(uniqueID);
}
}
public RegistrationAuthorityIdentifierResource getRegistrationAuthorityIdentifierResource() {
return this.resourceFactory.getVocabulary().mdrRegistrationAuthorityIdentifier;
}
public LanguageIdentificationResource getLanguageIdentificationResource() {
return this.resourceFactory.getVocabulary().mdrLanguageIdentificationResource;
}
public ContextResource getParentContextResource() {
return this.resourceFactory.getVocabulary().mdrContextResource;
}
public AdministrationRecordResource createAdministrationRecordResource(
ItemIdentifierResource itemIdentifierResource) {
return resourceFactory.createAdministrationRecord(
itemIdentifierResource, registrationStatus.toString(),
administrativeStatus.toString(), Calendar.getInstance(), null,
null, null, null, null, null, null, null);
}
public Status getRegistrationStatus() {
return registrationStatus;
}
public Status getAdministrativeStatus() {
return administrativeStatus;
}
/**
* @return The map of the {@link Datatype}s created for ISO11404 and
* ISO21090
*/
public Map<ISODataType, Datatype> getISODatatypes() {
return isoDatatypes;
}
/**
* @return Map of {@link ConceptualDomain}s created for ISO11404 and
* ISO21090 Datatypes
*/
public HashMap<ISODataType, ConceptualDomain> getISOConceptualDomains() {
return isoDatatypesConceptualDomains;
}
/**
* Creates a new {@link Datatype} with given name from given schema, if
* exist one wit given name and scheme, return existing one
*
* @param name
* Name of the Datatype to be created
* @param schemeReference
* Reference to scheme where datatype is retrieved
*/
public Datatype createDatatype(String name, String schemeReference) {
return resourceFactory.createDatatype(name, "ISO 11179 Datatype for "
+ name, schemeReference, null);
}
/**
* Executes a full text query on the MDR to find a datatype
*
* @param name
* Exact name of the Datatype to be looked for
* @return Result of the search, if not matches, return <code>null</code>
*/
public Datatype searchDatatype(String name) {
ResourceQueryFactory queryFactory = repository.getMDRDatabase()
.getQueryFactory();
List<? super DatatypeResource> dtList = queryFactory
.searchDatatype(name);
if (dtList.isEmpty()) {
logger.error("There is no datatype matching with {}", name);
return null;
}
return (Datatype) dtList.get(0);
}
}