/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;
import org.hibernate.search.annotations.ContainedIn;
/**
* Defines a Patient in the system. A patient is simply an extension of a person and all that that
* implies.
*
* @version 2.0
*/
public class Patient extends Person {
public static final long serialVersionUID = 93123L;
private Integer patientId;
private String allergyStatus = Allergies.UNKNOWN;
@ContainedIn
private Set<PatientIdentifier> identifiers;
// Constructors
/** default constructor */
public Patient() {
setPatient(true);
}
/**
* This constructor creates a new Patient object from the given {@link Person} object. All
* attributes are copied over to the new object. NOTE! All child collection objects are copied
* as pointers, each individual element is not copied. <br>
* <br>
*
* @param person the person object to copy onto a new Patient
* @see Person#Person(Person)
*/
public Patient(Person person) {
super(person);
if (person != null) {
this.patientId = person.getPersonId();
if (person.getUuid() != null) {
this.setUuid(person.getUuid());
}
}
setPatient(true);
}
/**
* Constructor with default patient id
*
* @param patientId
*/
public Patient(Integer patientId) {
super(patientId);
this.patientId = patientId;
setPatient(true);
}
// Property accessors
/**
* @return internal identifier for patient
*/
public Integer getPatientId() {
return this.patientId;
}
/**
* Sets the internal identifier for a patient. <b>This should never be called directly</b>. It
* exists only for the use of the supporting infrastructure.
*
* @param patientId
*/
public void setPatientId(Integer patientId) {
super.setPersonId(patientId);
this.patientId = patientId;
}
/**
* Returns allergy status maintained by the supporting infrastructure.
*
* @return current allargy status for patient
* @since 2.0
* @should return allergy status maintained by the supporting infrastructure
*/
public String getAllergyStatus() {
return this.allergyStatus;
}
/**
* Sets the allergy status for a patient. <b>This should never be called directly</b>.
* It should reflect allergy status maintained by the supporting infrastructure.
*
* @param allergyStatus
* @since 2.0
* @should not be called by service client
*/
public void setAllergyStatus(String allergyStatus) {
this.allergyStatus = allergyStatus;
}
/**
* Overrides the parent setPersonId(Integer) so that we can be sure patient id is also set
* correctly.
*
* @see org.openmrs.Person#setPersonId(java.lang.Integer)
*/
@Override
public void setPersonId(Integer personId) {
super.setPersonId(personId);
this.patientId = personId;
}
/**
* Get all of this patients identifiers -- both voided and non-voided ones. If you want only
* non-voided identifiers, use {@link #getActiveIdentifiers()}
*
* @return Set of all known identifiers for this patient
* @see org.openmrs.PatientIdentifier
* @see #getActiveIdentifiers()
* @should not return null
*/
public Set<PatientIdentifier> getIdentifiers() {
if (identifiers == null) {
identifiers = new TreeSet<PatientIdentifier>();
}
return this.identifiers;
}
/**
* Update all identifiers for patient
*
* @param identifiers Set<PatientIdentifier> to set as update all known identifiers for patient
* @see org.openmrs.PatientIdentifier
*/
public void setIdentifiers(Set<PatientIdentifier> identifiers) {
this.identifiers = identifiers;
}
/**
* Adds this PatientIdentifier if the patient doesn't contain it already
*
* @param patientIdentifier
*/
/**
* Will only add PatientIdentifiers in this list that this patient does not have already
*
* @param patientIdentifiers
*/
public void addIdentifiers(Collection<PatientIdentifier> patientIdentifiers) {
for (PatientIdentifier identifier : patientIdentifiers) {
addIdentifier(identifier);
}
}
/**
* Will add this PatientIdentifier if the patient doesn't contain it already
*
* @param patientIdentifier
* @should not fail with null identifiers list
* @should add identifier to current list
* @should not add identifier that is in list already
*/
public void addIdentifier(PatientIdentifier patientIdentifier) {
if (patientIdentifier != null) {
patientIdentifier.setPatient(this);
// make sure the set doesn't already contain an identifier with the same
// identifier, identifierType
for (PatientIdentifier currentId : getActiveIdentifiers()) {
if (currentId.equalsContent(patientIdentifier)) {
return; // fail silently if someone tries to add a duplicate
}
}
}
getIdentifiers().add(patientIdentifier);
}
/**
* Convenience method to remove the given identifier from this patient's list of identifiers. If
* <code>patientIdentifier</code> is null, nothing is done.
*
* @param patientIdentifier the identifier to remove
* @should remove identifier if exists
*/
public void removeIdentifier(PatientIdentifier patientIdentifier) {
if (patientIdentifier != null) {
getIdentifiers().remove(patientIdentifier);
}
}
/**
* Convenience method to get the first "preferred" identifier for a patient. Otherwise, returns
* the first non-voided identifier Otherwise, null
*
* @return Returns the "preferred" patient identifier.
*/
public PatientIdentifier getPatientIdentifier() {
// normally the DAO layer returns these in the correct order, i.e. preferred and non-voided first, but it's possible that someone
// has fetched a Patient, changed their identifiers around, and then calls this method, so we have to be careful.
if (!getIdentifiers().isEmpty()) {
for (PatientIdentifier id : getIdentifiers()) {
if (id.getPreferred() && !id.getVoided()) {
return id;
}
}
for (PatientIdentifier id : getIdentifiers()) {
if (!id.getVoided()) {
return id;
}
}
return null;
}
return null;
}
/**
* Returns the first (preferred) patient identifier matching a
* <code>PatientIdentifierType</code> Otherwise, returns the first non-voided identifier
* Otherwise, null
*
* @param pit The PatientIdentifierType of which to return the PatientIdentifier
* @return Returns a PatientIdentifier of the specified type.
*/
public PatientIdentifier getPatientIdentifier(PatientIdentifierType pit) {
if (!getIdentifiers().isEmpty()) {
for (PatientIdentifier id : getIdentifiers()) {
if (id.getPreferred() && !id.getVoided() && pit.equals(id.getIdentifierType())) {
return id;
}
}
for (PatientIdentifier id : getIdentifiers()) {
if (!id.getVoided() && pit.equals(id.getIdentifierType())) {
return id;
}
}
return null;
}
return null;
}
/**
* Returns the first (preferred) patient identifier matching <code>identifierTypeId</code>
*
* @param identifierTypeId
* @return preferred patient identifier
*/
public PatientIdentifier getPatientIdentifier(Integer identifierTypeId) {
if (!getIdentifiers().isEmpty()) {
for (PatientIdentifier id : getIdentifiers()) {
if (id.getPreferred() && !id.getVoided()
&& identifierTypeId.equals(id.getIdentifierType().getPatientIdentifierTypeId())) {
return id;
}
}
for (PatientIdentifier id : getIdentifiers()) {
if (!id.getVoided() && identifierTypeId.equals(id.getIdentifierType().getPatientIdentifierTypeId())) {
return id;
}
}
return null;
}
return null;
}
/**
* Returns the (preferred) patient identifier matching <code>identifierTypeName</code> Otherwise
* returns that last <code>PatientIdenitifer</code>
*
* @param identifierTypeName
* @return preferred patient identifier
*/
public PatientIdentifier getPatientIdentifier(String identifierTypeName) {
if (!getIdentifiers().isEmpty()) {
for (PatientIdentifier id : getIdentifiers()) {
if (id.getPreferred() && !id.getVoided() && identifierTypeName.equals(id.getIdentifierType().getName())) {
return id;
}
}
for (PatientIdentifier id : getIdentifiers()) {
if (!id.getVoided() && identifierTypeName.equals(id.getIdentifierType().getName())) {
return id;
}
}
return null;
}
return null;
}
/**
* Returns only the non-voided identifiers for this patient. If you want <u>all</u> identifiers,
* use {@link #getIdentifiers()}
*
* @return list of non-voided identifiers for this patient
* @see #getIdentifiers()
* @should return preferred identifiers first in the list
*/
public List<PatientIdentifier> getActiveIdentifiers() {
List<PatientIdentifier> ids = new Vector<PatientIdentifier>();
List<PatientIdentifier> nonPreferred = new LinkedList<PatientIdentifier>();
for (PatientIdentifier pi : getIdentifiers()) {
if (!pi.getVoided()) {
if (pi.getPreferred()) {
ids.add(pi);
} else {
nonPreferred.add(pi);
}
}
}
for (PatientIdentifier pi : nonPreferred) {
ids.add(pi);
}
return ids;
}
/**
* Returns only the non-voided identifiers for this patient. If you want <u>all</u> identifiers,
* use {@link #getIdentifiers()}
*
* @return list of non-voided identifiers for this patient
* @param pit PatientIdentifierType
* @see #getIdentifiers()
*/
public List<PatientIdentifier> getPatientIdentifiers(PatientIdentifierType pit) {
List<PatientIdentifier> ids = new Vector<PatientIdentifier>();
for (PatientIdentifier pi : getIdentifiers()) {
if (!pi.getVoided() && pit.equals(pi.getIdentifierType())) {
ids.add(pi);
}
}
return ids;
}
@Override
public String toString() {
return "Patient#" + patientId;
}
/**
* @since 1.5
* @see org.openmrs.OpenmrsObject#getId()
*/
@Override
public Integer getId() {
return getPatientId();
}
/**
* @since 1.5
* @see org.openmrs.OpenmrsObject#setId(java.lang.Integer)
*/
@Override
public void setId(Integer id) {
setPatientId(id);
}
/**
* Returns the person represented
*
* @return the person represented by this object
* @since 1.10.0
*/
public Person getPerson() {
return this;
}
}