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.ai.Context; import tr.com.srdc.mdr.core.api.composite.Contact; import tr.com.srdc.mdr.core.api.composite.Organization; import tr.com.srdc.mdr.core.impl.composite.RegistrationAuthorityImpl; import tr.com.srdc.mdr.core.impl.composite.StewardshipRelationshipImpl; import tr.com.srdc.mdr.core.impl.composite.SubmissionRelationshipImpl; import tr.com.srdc.mdr.core.model.AbstractMDRResource; import tr.com.srdc.mdr.core.model.MDRException; import tr.com.srdc.mdr.core.model.iso11179.AdministeredItemResource; 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.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.ReferenceDocumentResource; 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.TerminologicalEntryResource; 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; /** * The abstract class of Administered Item. An Administered Item may be any one * of those types listed in Figure 2 which is specified in ISO/IEC 11179-3. Each * instance of an Administered Item encapsulates its own Administration Record. * * @author anil * */ public abstract class AdministeredItemImpl extends AbstractMDRResource implements AdministeredItemResource { private static final Logger logger = LoggerFactory .getLogger(AdministeredItemImpl.class); @Override public abstract void setAdministrationRecord( AdministrationRecordResource administrationRecord); @Override public abstract AdministrationRecordResource getAdministrationRecord(); /** * Constructor for an {@link AdministeredItemResource} which extends * {@link AbstractMDRResource}. * * @param n * Mostly created by <code>Node.createURI()</code> * @param g * The graph which holds all triples. * @param administeredBy * An {@link AdministeredItemResource} is administered by an * {@link OrganizationResource} represented by the * {@link StewardshipRelationshipResource}. * @param submittedBy * An {@link AdministeredItemResource} 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 AdministeredItemImpl(Node n, EnhGraph g, StewardshipRelationshipResource administeredBy, SubmissionRelationshipResource submittedBy, RegistrationAuthorityResource registeredBy, AdministeredItemContextResource having, MDRDatabase mdrDatabase) { super(n, g, mdrDatabase); setAdministeredBy(administeredBy); setSubmittedBy(submittedBy); setRegisteredBy(registeredBy); addHaving(having); } /** * Constructor for an {@link AdministeredItemImpl} which extends * {@link AbstractMDRResource}. * * @param resource * An RDF Resource. * @param mdrDatabase */ public AdministeredItemImpl(Resource resource, MDRDatabase mdrDatabase) { super(resource, mdrDatabase); } @Override public void setSubmittedBy(SubmissionRelationshipResource submittedBy) { if (submittedBy == null) { throw new IllegalArgumentException( "Submitted By must be specified for AdministratedItem"); } setPropertyValue(mdrDatabase.getVocabulary().submittedBy, submittedBy); } @Override public SubmissionRelationshipResource getSubmittedBy() { return new SubmissionRelationshipImpl( getPropertyResourceValue(mdrDatabase.getVocabulary().submittedBy), mdrDatabase); } @Override public void addClassifiedBy( ClassificationSchemeItemResource classificationSchemeItem) { if (classificationSchemeItem == null) { throw new IllegalArgumentException( "Classification Scheme Item must be specified for AdministratedITem"); } addProperty(mdrDatabase.getVocabulary().classifiedBy, classificationSchemeItem); } @Override public List<ClassificationSchemeItemResource> getClassifiedBy() throws MDRException { NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().classifiedBy); return mdrDatabase.getUtil().createList(it, ClassificationSchemeItemResource.class); } @Override public void removeClassifiedBy( ClassificationSchemeItemResource classificationSchemeItem) { if (classificationSchemeItem == null) { throw new IllegalArgumentException( "Null is not allowed as the value of the property to be removed."); } removeProperty(mdrDatabase.getVocabulary().classifiedBy, classificationSchemeItem); } @Override public void setAdministeredBy(StewardshipRelationshipResource administeredBy) { if (administeredBy == null) { throw new IllegalArgumentException( "Administrated By must be specified for AdministratedItem"); } setPropertyValue(mdrDatabase.getVocabulary().administeredBy, administeredBy); } @Override public StewardshipRelationshipResource getAdministeredBy() { return new StewardshipRelationshipImpl( getPropertyResourceValue(mdrDatabase.getVocabulary().administeredBy), mdrDatabase); } @Override public void setRegisteredBy(RegistrationAuthorityResource registeredBy) { if (registeredBy == null) { throw new IllegalArgumentException( "Registration Authority must be specified for Administrated Item"); } setPropertyValue(mdrDatabase.getVocabulary().registeredBy, registeredBy); } @Override public RegistrationAuthorityResource getRegisteredBy() { return new RegistrationAuthorityImpl( getPropertyResourceValue(mdrDatabase.getVocabulary().registeredBy), mdrDatabase); } @Override public void addHaving(AdministeredItemContextResource having) { if (having == null) { throw new IllegalArgumentException( "Null is not allowed as the value of the property to be removed."); } addProperty(mdrDatabase.getVocabulary().having, having); } @Override public List<AdministeredItemContextResource> getHavings() throws MDRException { NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().having); return mdrDatabase.getUtil().createList(it, AdministeredItemContextResource.class); } @Override public void removeHaving(AdministeredItemContextResource having) { if (having == null) { throw new IllegalArgumentException( "Null is not allowed as the value of the property to be removed."); } removeProperty(mdrDatabase.getVocabulary().having, having); } @Override public void addDescribedBy(ReferenceDocumentResource describedBy) { if (describedBy == null) { throw new IllegalArgumentException( "Null is not allowed as the value of the property to be added."); } addProperty(mdrDatabase.getVocabulary().describedBy, describedBy); } @Override public void removeDescribedBY(ReferenceDocumentResource describedBy) { if (describedBy == null) { throw new IllegalArgumentException( "Null is not allowed as the value of the property to be removed."); } removeProperty(mdrDatabase.getVocabulary().describedBy, describedBy); } @Override public List<ReferenceDocumentResource> getDescribedBy() throws MDRException { NodeIterator it = listPropertyValues(mdrDatabase.getVocabulary().describedBy); return mdrDatabase.getUtil().createList(it, ReferenceDocumentResource.class); } // ////////////////////////////////////////////// // ////////////////////////////////////////////// // ////////////////////////////////////////////// // ///// High-Level Interface Methods//////////// // ////////////////////////////////////////////// // ////////////////////////////////////////////// // ////////////////////////////////////////////// @Override public AdministeredItemResource asMDRResource() { return this; } @Override public void delete() { AdministrationRecordResource ar = this.getAdministrationRecord(); ItemIdentifierResource ii = ar.getAdministeredItemIdentifier(); ii.delete(); ar.delete(); try { AdministeredItemContextResource aic = this.getHavings().get(0); TerminologicalEntryResource te = aic.getTerminologicalEntry(); LanguageSectionResource ls = te .getContaninigTerminologicalEntryLanguage().get(0); DefinitionResource def = ls.getContainigDefinitionEntry().get(0); DesignationResource name = ls.getContainingNameEntry().get(0); name.delete(); def.delete(); ls.delete(); te.delete(); aic.delete(); } catch (MDRException e) { logger.error("{}'s resources about Context could not be deleted"); } logger.debug("Only the first entries in name, definition, language section lists deleted form "); try { List<ClassificationSchemeItemResource> classifications = this .getClassifiedBy(); for (ClassificationSchemeItemResource csi : classifications) { csi.delete(); } } catch (MDRException e) { logger.error("{}'s resources about Classification Scheme could not be deleted"); } logger.debug("All the entries about classification scheme deleted form {}"); } @Override public String getUniqueID() { return this.getAdministrationRecord().getAdministeredItemIdentifier() .getDataIdentifier(); } private DesignationResource getDesignationResource() { TerminologicalEntryResource terminologicalEntry; try { // Since only one context per AdministeredItem is assumed, // first AIC selected terminologicalEntry = this.getHavings().get(0) .getTerminologicalEntry(); } catch (MDRException e) { String msg = "AIC List of AdministeredItem could not be obtained"; logger.error(msg); throw new IllegalStateException(msg); } DesignationResource designationResource; try { // Since one definition per context is assumed, first items // selected LanguageSectionResource languageSectionResource = terminologicalEntry .getContaninigTerminologicalEntryLanguage().get(0); List<DesignationResource> designationList = languageSectionResource .getContainingNameEntry(); if (designationList == null || designationList.isEmpty()) { // There is no Name Entry for this AdministeredItem return null; } designationResource = designationList.get(0); } catch (MDRException e) { String msg = "Designation List / LanguageSection List could not be obtained from AdministeredItem"; logger.error(msg); throw new IllegalStateException(msg); } return designationResource; } /** * Find a name in a depth-first manner. We know that this {@link Context} * has only one name. */ @Override public String getName() { DesignationResource designationResource = getDesignationResource(); if (designationResource == null) return null; return getDesignationResource().getName(); } @Override public void setName(String name) { DesignationResource designationResource = getDesignationResource(); designationResource.setName(name); } private DefinitionResource getDefinitionResource() { TerminologicalEntryResource terminologicalEntry; try { // Since only one context per AdministeredItem is assumed, // first AIC selected terminologicalEntry = this.getHavings().get(0) .getTerminologicalEntry(); } catch (MDRException e) { String msg = "AIC List of AdministeredItem could not be obtained"; logger.error(msg); throw new IllegalStateException(msg); } DefinitionResource definitionResource; try { // Since one definition per context is assumed, first items // selected LanguageSectionResource languageSectionResource = terminologicalEntry .getContaninigTerminologicalEntryLanguage().get(0); List<DefinitionResource> definitionList = languageSectionResource .getContainigDefinitionEntry(); if (definitionList == null || definitionList.isEmpty()) { // There is no Definition Entry for this AdministeredItem return null; } definitionResource = definitionList.get(0); } catch (MDRException e) { String msg = "Definition List / LanguageSection List could bot be obtained from AdministeredItem"; logger.error(msg); throw new IllegalStateException(msg); } return definitionResource; } @Override public String getDefinition() { DefinitionResource definitionResource = getDefinitionResource(); if (definitionResource == null) return null; return definitionResource.getDefinitionText(); } @Override public void setDefinition(String definition) { DefinitionResource definitionResource = getDefinitionResource(); if (definitionResource == null) { TerminologicalEntryResource terminologicalEntry; try { // Since only one context per AdministeredItem is assumed, // first AIC selected terminologicalEntry = this.getHavings().get(0) .getTerminologicalEntry(); } catch (MDRException e) { String msg = "AIC List of AdministeredItem could not be obtained"; logger.error(msg); throw new IllegalStateException(msg); } try { // Since one definition per context is assumed, first items // selected LanguageSectionResource languageSectionResource = terminologicalEntry .getContaninigTerminologicalEntryLanguage().get(0); definitionResource = mdrDatabase.getResourceFactory() .createDefinition(languageSectionResource, definition, null); languageSectionResource .addContainigDefinitionEntry(definitionResource); } catch (MDRException e) { String msg = "LanguageSection of AdministeredItem could not be obtained"; logger.error(msg); throw new IllegalStateException(msg); } } definitionResource.setDefinitionText(definition); } @Override public Context getContext() { List<AdministeredItemContextResource> aicList; try { // Assumed that AI registered in only one context aicList = this.getHavings(); } catch (MDRException e) { String msg = "Error at obtaining Context relationships from AdministeredItem, null returned"; logger.error(msg); throw new IllegalStateException(msg); } AdministeredItemContextResource aicr; try { aicr = aicList.get(0); } catch (Exception e) { String msg = "havings of the AI is null or empty"; logger.error(msg); throw new IllegalStateException(msg,e); } return aicr.getContext(); } @Override public Organization getAdministerOrganization() { StewardshipRelationshipResource stewardshipRelationship = this .getAdministeredBy(); logger.debug("StewardshipRelationship obtained from AdministeredItem"); return stewardshipRelationship.getStewardshipOrganization(); } @Override public Contact getAdministerPerson() { StewardshipRelationshipResource stewardshipRelationship = this .getAdministeredBy(); logger.debug("StewardshipRelationship obtained from AdministeredItem"); return stewardshipRelationship.getAdminister().getStewardshipContact(); } }