/**
* 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.api.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.openmrs.GlobalProperty;
import org.openmrs.Person;
import org.openmrs.PersonAddress;
import org.openmrs.PersonAttribute;
import org.openmrs.PersonAttributeType;
import org.openmrs.PersonName;
import org.openmrs.Relationship;
import org.openmrs.RelationshipType;
import org.openmrs.api.APIException;
import org.openmrs.api.AdministrationService;
import org.openmrs.api.PersonAttributeTypeLockedException;
import org.openmrs.api.PersonService;
import org.openmrs.api.context.Context;
import org.openmrs.api.db.PersonDAO;
import org.openmrs.person.PersonMergeLog;
import org.openmrs.person.PersonMergeLogData;
import org.openmrs.serialization.SerializationException;
import org.openmrs.util.OpenmrsConstants;
import org.openmrs.util.OpenmrsConstants.PERSON_TYPE;
import org.openmrs.validator.ValidateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MarkerFactory;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
/**
* Default implementation of the PersonService
* <p>
* Which implementation to use is determined by Spring. See the spring application context file in
* /metadata/api/spring/applicatContext-service.xml
*
* @see PersonService
* @see org.openmrs.api.context.Context
*/
@Transactional
public class PersonServiceImpl extends BaseOpenmrsService implements PersonService {
private Logger log = LoggerFactory.getLogger(this.getClass());
private PersonDAO dao;
/**
* @see org.openmrs.api.PersonService#setPersonDAO(org.openmrs.api.db.PersonDAO)
*/
@Override
public void setPersonDAO(PersonDAO dao) {
this.dao = dao;
}
/**
* @see org.openmrs.api.PersonService#getSimilarPeople(java.lang.String, java.lang.Integer,
* java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public Set<Person> getSimilarPeople(String name, Integer birthyear, String gender) throws APIException {
return dao.getSimilarPeople(name, birthyear, gender);
}
/**
* @see org.openmrs.api.PersonService#getPeople(String, Boolean)
*/
@Override
@Transactional(readOnly = true)
public List<Person> getPeople(String searchPhrase, Boolean dead) throws APIException {
return dao.getPeople(searchPhrase, dead);
}
@Override
public List<Person> getPeople(String searchPhrase, Boolean dead, Boolean voided) throws APIException {
return dao.getPeople(searchPhrase, dead, voided);
}
/**
* @see org.openmrs.api.PersonService#getAllPersonAttributeTypes()
*/
@Override
@Transactional(readOnly = true)
public List<PersonAttributeType> getAllPersonAttributeTypes() throws APIException {
return Context.getPersonService().getAllPersonAttributeTypes(true);
}
/**
* @see org.openmrs.api.PersonService#getAllPersonAttributeTypes(boolean)
*/
@Override
@Transactional(readOnly = true)
public List<PersonAttributeType> getAllPersonAttributeTypes(boolean includeRetired) throws APIException {
return dao.getAllPersonAttributeTypes(includeRetired);
}
/**
* @see org.openmrs.api.PersonService#getPersonAttributeTypeByName(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public PersonAttributeType getPersonAttributeTypeByName(String typeName) throws APIException {
List<PersonAttributeType> types = Context.getPersonService().getPersonAttributeTypes(typeName, null, null, null);
if (types.isEmpty()) {
return null;
} else {
return types.get(0);
}
}
/**
* @see org.openmrs.api.PersonService#purgePersonAttributeType(org.openmrs.PersonAttributeType)
*/
@Override
public void purgePersonAttributeType(PersonAttributeType type) throws APIException {
checkIfPersonAttributeTypesAreLocked();
dao.deletePersonAttributeType(type);
}
/**
* @see org.openmrs.api.PersonService#savePersonAttributeType(org.openmrs.PersonAttributeType)
*/
@Override
public PersonAttributeType savePersonAttributeType(PersonAttributeType type) throws APIException {
checkIfPersonAttributeTypesAreLocked();
if (type.getSortWeight() == null) {
List<PersonAttributeType> allTypes = Context.getPersonService().getAllPersonAttributeTypes();
if (!allTypes.isEmpty()) {
type.setSortWeight(allTypes.get(allTypes.size() - 1).getSortWeight() + 1);
} else {
type.setSortWeight(1.0);
}
}
boolean updateExisting = false;
if (type.getId() != null) {
updateExisting = true;
String oldTypeName = dao.getSavedPersonAttributeTypeName(type);
String newTypeName = type.getName();
if (!oldTypeName.equals(newTypeName)) {
List<GlobalProperty> props = new ArrayList<GlobalProperty>();
AdministrationService as = Context.getAdministrationService();
for (String propName : OpenmrsConstants.GLOBAL_PROPERTIES_OF_PERSON_ATTRIBUTES) {
props.add(as.getGlobalPropertyObject(propName));
}
for (GlobalProperty prop : props) {
if (prop != null) {
String propVal = prop.getPropertyValue();
if (propVal != null && propVal.indexOf(oldTypeName) != -1) {
prop.setPropertyValue(propVal.replaceFirst(oldTypeName, newTypeName));
as.saveGlobalProperty(prop);
}
}
}
}
}
PersonAttributeType attributeType = dao.savePersonAttributeType(type);
if (updateExisting) {
//we need to update index in case searchable property has changed
Context.updateSearchIndexForType(PersonAttribute.class);
}
return attributeType;
}
/**
* @see org.openmrs.api.PersonService#retirePersonAttributeType(PersonAttributeType, String)
*/
@Override
public PersonAttributeType retirePersonAttributeType(PersonAttributeType type, String retiredReason)
throws APIException {
checkIfPersonAttributeTypesAreLocked();
if (retiredReason == null || retiredReason.length() < 1) {
throw new APIException("Person.retiring.reason.required", (Object[]) null);
}
type.setRetired(true);
type.setRetiredBy(Context.getAuthenticatedUser());
type.setRetireReason(retiredReason);
type.setDateRetired(new Date());
return dao.savePersonAttributeType(type);
}
/**
* @see org.openmrs.api.PersonService#getPersonAttributeTypes(java.lang.String,
* java.lang.String, java.lang.Integer, java.lang.Boolean)
*/
@Override
@Transactional(readOnly = true)
public List<PersonAttributeType> getPersonAttributeTypes(String exactName, String format, Integer foreignKey,
Boolean searchable) throws APIException {
return dao.getPersonAttributeTypes(exactName, format, foreignKey, searchable);
}
@Override
public void unretirePersonAttributeType(PersonAttributeType type) throws APIException {
checkIfPersonAttributeTypesAreLocked();
type.setRetired(false);
type.setDateRetired(null);
type.setRetiredBy(null);
type.setRetireReason(null);
Context.getPersonService().savePersonAttributeType(type);
}
/**
* @see org.openmrs.api.PersonService#getPersonAttributeType(java.lang.Integer)
*/
@Override
@Transactional(readOnly = true)
public PersonAttributeType getPersonAttributeType(Integer typeId) {
return dao.getPersonAttributeType(typeId);
}
/**
* @see org.openmrs.api.PersonService#getPersonAttribute(java.lang.Integer)
*/
@Override
@Transactional(readOnly = true)
public PersonAttribute getPersonAttribute(Integer id) {
return dao.getPersonAttribute(id);
}
/**
* @see org.openmrs.api.PersonService#getRelationship(java.lang.Integer)
*/
@Override
@Transactional(readOnly = true)
public Relationship getRelationship(Integer relationshipId) throws APIException {
return dao.getRelationship(relationshipId);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipType(java.lang.Integer)
*/
@Override
@Transactional(readOnly = true)
public RelationshipType getRelationshipType(Integer relationshipTypeId) throws APIException {
return dao.getRelationshipType(relationshipTypeId);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipTypeByName(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public RelationshipType getRelationshipTypeByName(String relationshipTypeName) throws APIException {
List<RelationshipType> types = dao.getRelationshipTypes(relationshipTypeName, null);
if (types.isEmpty()) {
return null;
} else {
return types.get(0);
}
}
/**
* @see org.openmrs.api.PersonService#purgePerson(org.openmrs.Person)
*/
@Override
public void purgePerson(Person person) throws APIException {
dao.deletePerson(person);
}
/**
* @see org.openmrs.api.PersonService#savePerson(org.openmrs.Person)
*/
@Override
public Person savePerson(Person person) throws APIException {
setPreferredPersonName(person);
setPreferredPersonAddress(person);
return dao.savePerson(person);
}
private void setPreferredPersonName(Person person) {
PersonName preferredName = null;
PersonName possiblePreferredName = person.getPersonName();
if (possiblePreferredName != null && possiblePreferredName.getPreferred() && !possiblePreferredName.getVoided()) {
preferredName = possiblePreferredName;
}
for (PersonName name : person.getNames()) {
if (preferredName == null && !name.getVoided()) {
name.setPreferred(true);
preferredName = name;
continue;
}
if (!name.equals(preferredName)) {
name.setPreferred(false);
}
}
}
private void setPreferredPersonAddress(Person person) {
PersonAddress preferredAddress = null;
PersonAddress possiblePreferredAddress = person.getPersonAddress();
if (possiblePreferredAddress != null && possiblePreferredAddress.getPreferred()
&& !possiblePreferredAddress.getVoided()) {
preferredAddress = possiblePreferredAddress;
}
for (PersonAddress address : person.getAddresses()) {
if (preferredAddress == null && !address.getVoided()) {
address.setPreferred(true);
preferredAddress = address;
continue;
}
if (!address.equals(preferredAddress)) {
address.setPreferred(false);
}
}
}
/**
* @see org.openmrs.api.PersonService#voidPerson(org.openmrs.Person, java.lang.String)
*/
@Override
public Person voidPerson(Person person, String reason) throws APIException {
if (person == null) {
return null;
}
return dao.savePerson(person);
}
/**
* @see org.openmrs.api.PersonService#unvoidPerson(org.openmrs.Person)
*/
@Override
public Person unvoidPerson(Person person) throws APIException {
if (person == null) {
return null;
}
return Context.getPersonService().savePerson(person);
}
/**
* @see org.openmrs.api.PersonService#getPerson(java.lang.Integer)
*/
@Override
@Transactional(readOnly = true)
public Person getPerson(Integer personId) throws APIException {
if (personId == null) {
return null;
}
return dao.getPerson(personId);
}
/**
* @see org.openmrs.api.PersonService#getAllRelationships()
*/
@Override
@Transactional(readOnly = true)
public List<Relationship> getAllRelationships() throws APIException {
return Context.getPersonService().getAllRelationships(false);
}
/**
* @see org.openmrs.api.PersonService#getAllRelationships(boolean)
*/
@Override
@Transactional(readOnly = true)
public List<Relationship> getAllRelationships(boolean includeVoided) throws APIException {
return dao.getAllRelationships(includeVoided);
}
/**
* @see org.openmrs.api.PersonService#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType)
*/
@Override
@Transactional(readOnly = true)
public List<Relationship> getRelationships(Person fromPerson, Person toPerson, RelationshipType relType)
throws APIException {
return dao.getRelationships(fromPerson, toPerson, relType);
}
/**
* @see org.openmrs.api.PersonService#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType, java.util.Date)
*/
@Override
@Transactional(readOnly = true)
public List<Relationship> getRelationships(Person fromPerson, Person toPerson, RelationshipType relType,
Date effectiveDate) throws APIException {
return dao.getRelationships(fromPerson, toPerson, relType, effectiveDate, null);
}
/**
* @see org.openmrs.api.PersonService#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType, java.util.Date, java.util.Date)
*/
@Override
@Transactional(readOnly = true)
public List<Relationship> getRelationships(Person fromPerson, Person toPerson, RelationshipType relType,
Date startEffectiveDate, Date endEffectiveDate) throws APIException {
return dao.getRelationships(fromPerson, toPerson, relType, startEffectiveDate, endEffectiveDate);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipsByPerson(org.openmrs.Person)
*/
@Override
@Transactional(readOnly = true)
public List<Relationship> getRelationshipsByPerson(Person p) throws APIException {
// search both the left side and the right side of the relationship
// for this person
List<Relationship> rels = Context.getPersonService().getRelationships(p, null, null);
rels.addAll(Context.getPersonService().getRelationships(null, p, null));
return rels;
}
/**
* @see org.openmrs.api.PersonService#getRelationshipsByPerson(org.openmrs.Person,
* java.util.Date)
*/
@Override
@Transactional(readOnly = true)
public List<Relationship> getRelationshipsByPerson(Person p, Date effectiveDate) throws APIException {
// search both the left side and the right side of the relationship
// for this person
List<Relationship> rels = Context.getPersonService().getRelationships(p, null, null, effectiveDate);
rels.addAll(Context.getPersonService().getRelationships(null, p, null, effectiveDate));
return rels;
}
/**
* @see org.openmrs.api.PersonService#purgeRelationship(org.openmrs.Relationship)
*/
@Override
public void purgeRelationship(Relationship relationship) throws APIException {
dao.deleteRelationship(relationship);
}
/**
* @see org.openmrs.api.PersonService#saveRelationship(org.openmrs.Relationship)
*/
@Override
public Relationship saveRelationship(Relationship relationship) throws APIException {
if (relationship.getPersonA().equals(relationship.getPersonB())) {
throw new APIException("Person.cannot.same", (Object[]) null);
}
return dao.saveRelationship(relationship);
}
/**
* @see org.openmrs.api.PersonService#voidRelationship(org.openmrs.Relationship,
* java.lang.String)
*/
@Override
public Relationship voidRelationship(Relationship relationship, String voidReason) throws APIException {
if (relationship.getVoided()) {
return relationship;
}
relationship.setVoided(true);
if (relationship.getVoidedBy() == null) {
relationship.setVoidedBy(Context.getAuthenticatedUser());
}
if (voidReason != null) {
relationship.setVoidReason(voidReason);
}
relationship.setDateVoided(new Date());
return Context.getPersonService().saveRelationship(relationship);
}
/**
* @see org.openmrs.api.PersonService#unvoidRelationship(org.openmrs.Relationship)
*/
@Override
public Relationship unvoidRelationship(Relationship relationship) throws APIException {
relationship.setVoided(false);
relationship.setVoidedBy(null);
relationship.setDateVoided(null);
relationship.setVoidReason(null);
return Context.getPersonService().saveRelationship(relationship);
}
/**
* @see org.openmrs.api.PersonService#getAllRelationshipTypes()
*/
@Override
@Transactional(readOnly = true)
public List<RelationshipType> getAllRelationshipTypes() throws APIException {
return Context.getPersonService().getAllRelationshipTypes(false);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipTypes(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public List<RelationshipType> getRelationshipTypes(String searchString) throws APIException {
return Context.getPersonService().getRelationshipTypes(searchString, null);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipTypes(java.lang.String, java.lang.Boolean)
*/
@Override
@Transactional(readOnly = true)
public List<RelationshipType> getRelationshipTypes(String relationshipTypeName, Boolean preferred) throws APIException {
Assert.hasText(relationshipTypeName, "The search string cannot be empty");
return dao.getRelationshipTypes(relationshipTypeName, preferred);
}
/**
* @see org.openmrs.api.PersonService#purgeRelationshipType(org.openmrs.RelationshipType)
*/
@Override
public void purgeRelationshipType(RelationshipType relationshipType) throws APIException {
dao.deleteRelationshipType(relationshipType);
}
/**
* @see org.openmrs.api.PersonService#saveRelationshipType(org.openmrs.RelationshipType)
*/
@Override
public RelationshipType saveRelationshipType(RelationshipType relationshipType) throws APIException {
if (StringUtils.isBlank(relationshipType.getDescription())) {
throw new APIException("error.required",
new Object[] { Context.getMessageSourceService().getMessage("general.description") });
}
return dao.saveRelationshipType(relationshipType);
}
/**
* @see org.openmrs.api.PersonService#getPersonAttributeTypes(org.openmrs.util.OpenmrsConstants.PERSON_TYPE,
* org.openmrs.api.PersonService.ATTR_VIEW_TYPE)
*/
@Override
@Transactional(readOnly = true)
public List<PersonAttributeType> getPersonAttributeTypes(PERSON_TYPE personType, ATTR_VIEW_TYPE viewType)
throws APIException {
if (viewType == null) {
return Context.getPersonService().getAllPersonAttributeTypes();
}
List<String> attrNames = getAttributeTypesFromGlobalProperties(viewType, personType);
List<PersonAttributeType> result = new ArrayList<>();
for (String nameOrId : attrNames) {
if (nameOrId.matches("\\d")) {
result.add(getPersonAttributeType(Integer.valueOf(nameOrId)));
} else {
result.add(getPersonAttributeTypeByName(nameOrId));
}
}
return result;
}
private List<String> getAttributeTypesFromGlobalProperties(ATTR_VIEW_TYPE viewType, PERSON_TYPE personType) {
List<String> result = new ArrayList<>();
if (viewType == ATTR_VIEW_TYPE.LISTING) {
result = combineAttributes(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_LISTING_ATTRIBUTES, OpenmrsConstants.GLOBAL_PROPERTY_USER_LISTING_ATTRIBUTES, personType);
} else if (viewType == ATTR_VIEW_TYPE.VIEWING) {
result = combineAttributes(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_VIEWING_ATTRIBUTES, OpenmrsConstants.GLOBAL_PROPERTY_USER_VIEWING_ATTRIBUTES, personType);
} else if (viewType == ATTR_VIEW_TYPE.HEADER) {
result = combineAttributes(OpenmrsConstants.GLOBAL_PROPERTY_PATIENT_HEADER_ATTRIBUTES, OpenmrsConstants.GLOBAL_PROPERTY_USER_HEADER_ATTRIBUTES, personType);
} else {
log.error(MarkerFactory.getMarker("FATAL"), "Should not be here.");
}
return result;
}
private List<String> combineAttributes(String patientAttributeProperty, String userAttributeProperty, PERSON_TYPE personType) {
List<String> result = new ArrayList<>();
if (personType == null || personType == PERSON_TYPE.PERSON) {
result = getGlobalProperties(patientAttributeProperty, userAttributeProperty);
} else if (personType == PERSON_TYPE.PATIENT) {
result = getGlobalProperties(patientAttributeProperty);
} else if (personType == PERSON_TYPE.USER) {
result = getGlobalProperties(userAttributeProperty);
} else {
log.error(MarkerFactory.getMarker("FATAL"), "Should not be here.");
}
return result;
}
private List<String> getGlobalProperties(String... properties) {
List<String> result = new ArrayList<>();
AdministrationService as = Context.getAdministrationService();
for (String p : properties) {
String id = as.getGlobalProperty(p, "");
if (StringUtils.isNotBlank(id)) {
result.add(id.trim());
}
}
return result;
}
/**
* @see org.openmrs.api.PersonService#parsePersonName(java.lang.String)
*/
@Override
public PersonName parsePersonName(String name) throws APIException {
// strip beginning/ending whitespace
name = name.trim();
// trim off all trailing commas
while (name.endsWith(",")) {
name = name.substring(0, name.length() - 1);
}
String firstName = name;
String middleName = "";
String lastName = "";
String lastName2 = null;
if (name.contains(",")) {
String[] names = name.split(",");
// trim whitespace on each part of the name
for (int x = 0; x < names.length; x++) {
names[x] = names[x].trim();
}
String[] firstNames = names[1].split(" ");
if (firstNames.length == 2) {
// user entered "Smith, John Adam"
lastName = names[0];
firstName = firstNames[0];
middleName = firstNames[1];
} else {
// user entered "Smith, John"
firstName = names[1];
lastName = names[0];
}
} else if (name.contains(" ")) {
String[] names = name.split(" ");
if (names.length == 4) {
// user entered "John Adam Smith"
firstName = names[0];
middleName = names[1];
lastName = names[2];
lastName2 = names[3];
} else if (names.length == 3) {
// user entered "John Adam Smith"
firstName = names[0];
middleName = names[1];
lastName = names[2];
} else {
// user entered "John Smith"
firstName = names[0];
lastName = names[1];
}
}
PersonName pn = new PersonName(firstName, middleName, lastName);
pn.setFamilyName2(lastName2);
return pn;
}
/**
* @see org.openmrs.api.PersonService#voidPersonName(org.openmrs.PersonName, String)
*/
@Override
public PersonName voidPersonName(PersonName personName, String voidReason) throws APIException {
return Context.getPersonService().savePersonName(personName);
}
/**
* @see org.openmrs.api.PersonService#unvoidPersonName(org.openmrs.PersonName)
*/
@Override
public PersonName unvoidPersonName(PersonName personName) throws APIException {
return Context.getPersonService().savePersonName(personName);
}
/**
* @see org.openmrs.api.PersonService#savePersonName(org.openmrs.PersonName)
*/
@Override
public PersonName savePersonName(PersonName personName) throws APIException {
ValidateUtil.validate(personName.getPerson());
return dao.savePersonName(personName);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipMap(org.openmrs.RelationshipType)
*/
@Override
@Transactional(readOnly = true)
public Map<Person, List<Person>> getRelationshipMap(RelationshipType relType) throws APIException {
// get all relationships with this type
List<Relationship> relationships = Context.getPersonService().getRelationships(null, null, relType);
// the map to return
Map<Person, List<Person>> ret = new HashMap<Person, List<Person>>();
if (relationships != null) {
for (Relationship rel : relationships) {
Person from = rel.getPersonA();
Person to = rel.getPersonB();
List<Person> relList = ret.get(from);
if (relList == null) {
relList = new ArrayList<Person>();
}
relList.add(to);
ret.put(from, relList);
}
}
return ret;
}
/**
* @see org.openmrs.api.PersonService#getPersonAttributeTypeByUuid(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public PersonAttributeType getPersonAttributeTypeByUuid(String uuid) {
return dao.getPersonAttributeTypeByUuid(uuid);
}
/**
* @see org.openmrs.api.PersonService#getPersonByUuid(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public Person getPersonByUuid(String uuid) throws APIException {
return dao.getPersonByUuid(uuid);
}
@Override
@Transactional(readOnly = true)
public PersonAddress getPersonAddressByUuid(String uuid) throws APIException {
return dao.getPersonAddressByUuid(uuid);
}
@Override
@Transactional(readOnly = true)
public PersonAttribute getPersonAttributeByUuid(String uuid) throws APIException {
return dao.getPersonAttributeByUuid(uuid);
}
/**
* @see org.openmrs.api.PersonService#getPersonName(java.lang.Integer)
*/
@Override
@Transactional(readOnly = true)
public PersonName getPersonName(Integer personNameId) {
return dao.getPersonName(personNameId);
}
/**
* @see org.openmrs.api.PersonService#getPersonNameByUuid(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public PersonName getPersonNameByUuid(String uuid) throws APIException {
return dao.getPersonNameByUuid(uuid);
}
/**
* @see org.openmrs.api.PersonService#savePersonMergeLog(PersonMergeLog)
*/
@Override
public PersonMergeLog savePersonMergeLog(PersonMergeLog personMergeLog) throws SerializationException, APIException {
//verify required fields
if (Context.getSerializationService().getDefaultSerializer() == null) {
throw new APIException("serializer.default.not.found", (Object[]) null);
}
log.debug("Auditing merging of non-preferred person " + personMergeLog.getLoser().getUuid()
+ " with preferred person " + personMergeLog.getWinner().getId());
//populate the mergedData XML from the PersonMergeLogData object
String serialized = Context.getSerializationService().getDefaultSerializer()
.serialize(personMergeLog.getPersonMergeLogData());
personMergeLog.setSerializedMergedData(serialized);
log.debug(serialized);
//save the bean to the database
return dao.savePersonMergeLog(personMergeLog);
}
/**
* @see org.openmrs.api.PersonService#getPersonMergeLogByUuid(String, boolean)
*/
@Override
@Transactional(readOnly = true)
public PersonMergeLog getPersonMergeLogByUuid(String uuid, boolean deserialize)
throws SerializationException, APIException {
if (uuid == null) {
throw new APIException("uuid.cannot.null", (Object[]) null);
}
PersonMergeLog personMergeLog = dao.getPersonMergeLogByUuid(uuid);
//deserialize if requested
if (deserialize) {
deserialize(personMergeLog);
}
return personMergeLog;
}
/**
* Deserializes a List of <code>PersonMErgeLog</code> objects
*
* @param lst the List of <code> PersonMergeLog</code> objects to deserialize
* @throws SerializationException
*/
private void deserializeList(List<PersonMergeLog> lst) throws SerializationException {
for (PersonMergeLog personMergeLog : lst) {
deserialize(personMergeLog);
}
}
/**
* Deserializes a <code>PersonMErgeLog</code> object
*
* @param personMergeLog the <code> PersonMergeLog</code> object to deserialize
* @throws SerializationException
*/
private void deserialize(PersonMergeLog personMergeLog) throws SerializationException {
PersonMergeLogData data = Context.getSerializationService().getDefaultSerializer()
.deserialize(personMergeLog.getSerializedMergedData(), PersonMergeLogData.class);
personMergeLog.setPersonMergeLogData(data);
}
/**
* @see org.openmrs.api.PersonService#getAllPersonMergeLogs(boolean)
*/
@Override
@Transactional(readOnly = true)
public List<PersonMergeLog> getAllPersonMergeLogs(boolean deserialize) throws SerializationException {
List<PersonMergeLog> lst = dao.getAllPersonMergeLogs();
//deserialize if requested
if (deserialize) {
deserializeList(lst);
}
return lst;
}
/**
* @see org.openmrs.api.PersonService#getWinningPersonMergeLogs(Person, boolean)
*/
@Override
@Transactional(readOnly = true)
public List<PersonMergeLog> getWinningPersonMergeLogs(Person person, boolean deserialize) throws SerializationException {
List<PersonMergeLog> lst = dao.getWinningPersonMergeLogs(person);
if (deserialize) {
deserializeList(lst);
}
return lst;
}
/**
* @see org.openmrs.api.PersonService#getLosingPersonMergeLog(Person, boolean)
*/
@Override
@Transactional(readOnly = true)
public PersonMergeLog getLosingPersonMergeLog(Person person, boolean deserialize) throws SerializationException {
PersonMergeLog personMergeLog = dao.getLosingPersonMergeLogs(person);
if (deserialize) {
deserialize(personMergeLog);
}
return personMergeLog;
}
/**
* @see org.openmrs.api.PersonService#getRelationshipByUuid(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public Relationship getRelationshipByUuid(String uuid) throws APIException {
return dao.getRelationshipByUuid(uuid);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipTypeByUuid(java.lang.String)
*/
@Override
@Transactional(readOnly = true)
public RelationshipType getRelationshipTypeByUuid(String uuid) throws APIException {
return dao.getRelationshipTypeByUuid(uuid);
}
/**
* @see org.openmrs.api.PersonService#getAllRelationshipTypes(boolean)
*/
@Override
@Transactional(readOnly = true)
public List<RelationshipType> getAllRelationshipTypes(boolean includeRetired) throws APIException {
return dao.getAllRelationshipTypes(includeRetired);
}
/**
* @see org.openmrs.api.PersonService#retireRelationshipType(org.openmrs.RelationshipType,
* java.lang.String)
*/
@Override
public RelationshipType retireRelationshipType(RelationshipType type, String retiredReason) throws APIException {
if (retiredReason == null || retiredReason.length() < 1) {
throw new APIException("Relationship.retiring.reason.required", (Object[]) null);
}
type.setRetired(true);
type.setRetiredBy(Context.getAuthenticatedUser());
type.setDateRetired(new Date());
type.setRetireReason(retiredReason);
return Context.getPersonService().saveRelationshipType(type);
}
/**
* @see org.openmrs.api.PersonService#unretireRelationshipType(org.openmrs.RelationshipType)
*/
@Override
public RelationshipType unretireRelationshipType(RelationshipType relationshipType) {
relationshipType.setRetired(false);
relationshipType.setRetiredBy(null);
relationshipType.setDateRetired(null);
relationshipType.setRetireReason(null);
return Context.getPersonService().saveRelationshipType(relationshipType);
}
/**
* @see org.openmrs.api.PersonService#voidPersonAddress(org.openmrs.PersonAddress, String)
*/
@Override
public PersonAddress voidPersonAddress(PersonAddress personAddress, String voidReason) {
return Context.getPersonService().savePersonAddress(personAddress);
}
/**
* @see org.openmrs.api.PersonService#unvoidPersonAddress(org.openmrs.PersonAddress)
*/
@Override
public PersonAddress unvoidPersonAddress(PersonAddress personAddress) throws APIException {
return Context.getPersonService().savePersonAddress(personAddress);
}
/**
* @see org.openmrs.api.PersonService#savePersonAddress(org.openmrs.PersonAddress)
*/
@Override
public PersonAddress savePersonAddress(PersonAddress personAddress) {
return dao.savePersonAddress(personAddress);
}
@Override
public void checkIfPersonAttributeTypesAreLocked() {
String locked = Context.getAdministrationService()
.getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_ATRIBUTE_TYPES_LOCKED, "false");
if (Boolean.valueOf(locked)) {
throw new PersonAttributeTypeLockedException();
}
}
}