package edu.gatech.i3l.fhir.dstu2.entities; import static ca.uhn.fhir.model.dstu2.resource.Medication.SP_CODE; import java.util.Date; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import org.hibernate.envers.Audited; import org.hibernate.envers.RelationTargetAuditMode; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt; import ca.uhn.fhir.model.dstu2.composite.NarrativeDt; import ca.uhn.fhir.model.dstu2.resource.Medication; import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.InstantDt; import edu.gatech.i3l.fhir.jpa.entity.BaseResourceEntity; import edu.gatech.i3l.fhir.jpa.entity.IResourceEntity; @Entity @Table(name="concept") @Audited(targetAuditMode=RelationTargetAuditMode.NOT_AUDITED) public final class MedicationConcept extends BaseResourceEntity{ private static final String RES_TYPE = "Medication"; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="concept_id", updatable=false) @Access(AccessType.PROPERTY) private Long id; @Column(name="concept_name", updatable=false) private String name; @ManyToOne @JoinColumn(name="domain_id", referencedColumnName="domain_id") private Domain domain; @ManyToOne(cascade={CascadeType.MERGE}) @JoinColumn(name="vocabulary_id", insertable=false, updatable=false) private Vocabulary vocabulary; @Column(name="concept_class_id", updatable=false) private String conceptClassId; @Column(name="standard_concept", updatable=false) private Character standardConcept; @Column(name="concept_code", updatable=false) private String conceptCode; @Column(name="valid_start_date", updatable=false) private Date validStartDate; @Column(name="valid_end_date", updatable=false) private Date validEndDate; @Column(name="invalid_reason", updatable=false) private String invalidReason; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Domain getDomainId() { return domain; } public void setDomainId(Domain domain) { this.domain = domain; } public String getConceptClassId() { return conceptClassId; } public void setConceptClassId(String conceptClassId) { this.conceptClassId = conceptClassId; } public Vocabulary getVocabulary() { return vocabulary; } public void setVocabulary(Vocabulary vocabulary) { this.vocabulary = vocabulary; } public Character getStandardConcept() { return standardConcept; } public void setStandardConcept(Character standardConcept) { this.standardConcept = standardConcept; } public String getConceptCode() { return conceptCode; } public void setConceptCode(String conceptCode) { this.conceptCode = conceptCode; } public Date getValidStartDate() { return validStartDate; } public void setValidStartDate(Date validStartDate) { this.validStartDate = validStartDate; } public Date getValidEndDate() { return validEndDate; } public void setValidEndDate(Date validEndDate) { this.validEndDate = validEndDate; } public String getInvalidReason() { return invalidReason; } public void setInvalidReason(String invalidReason) { this.invalidReason = invalidReason; } @Override public String toString() { //Since this is an omop v.5 based model, all the information below is expected to be not null. return this.getId() + ", " + this.getName() + ", " + this.getDomainId() + ", " + this.getConceptClassId() + ", " + this.getStandardConcept() + ", " + this.getVocabulary().getId() + ", " + this.getConceptCode() + ", " + this.getValidStartDate() + ", " + this.getValidEndDate(); } @Override public FhirVersionEnum getFhirVersion() { return FhirVersionEnum.DSTU2; } @Override public String getResourceType() { return RES_TYPE; } @Override public InstantDt getUpdated() { // TODO Auto-generated method stub return null; } @Override public String translateSearchParam(String theSearchParam) { switch (theSearchParam) { case SP_CODE: return "conceptCode"; default: break; } return theSearchParam; } @Override public IResource getRelatedResource() { Medication resource = new Medication(); resource.setId(new IdDt(this.getId())); CodeableConceptDt code = new CodeableConceptDt(this.getVocabulary().getSystemUri(), this.getConceptCode()); code.getCodingFirstRep().setDisplay(this.getName()); resource.setCode(code); NarrativeDt narrative = new NarrativeDt(); narrative.setDiv(this.toString()); resource.setText(narrative); return resource; } /** * This entity relates to a omop concept registry and is not supposed to be created/updated. */ //TODO somehow we should be able to send message back in an OperationOutcome @Override public IResourceEntity constructEntityFromResource(IResource resource) { return null; } }