/**
* 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 static org.apache.commons.lang.StringUtils.defaultString;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.openmrs.util.OpenmrsUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class is the representation of a person's address. This class is many-to-one to the Person
* class, so a Person/Patient/User can have zero to n addresses
*/
public class PersonAddress extends BaseOpenmrsData implements java.io.Serializable, Cloneable, Comparable<PersonAddress>, Address {
public static final long serialVersionUID = 343333L;
private static final Logger log = LoggerFactory.getLogger(PersonAddress.class);
// Fields
private Integer personAddressId;
private Person person;
private Boolean preferred = false;
private String address1;
private String address2;
private String address3;
private String address4;
private String address5;
private String address6;
private String address7;
private String address8;
private String address9;
private String address10;
private String address11;
private String address12;
private String address13;
private String address14;
private String address15;
private String cityVillage;
private String countyDistrict;
private String stateProvince;
private String country;
private String postalCode;
private String latitude;
private String longitude;
private Date startDate;
private Date endDate;
// Constructors
/** default constructor */
public PersonAddress() {
}
/** constructor with id */
public PersonAddress(Integer personAddressId) {
this.personAddressId = personAddressId;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return new StringBuilder().append("a1:").append(getAddress1()).append(", a2:").append(getAddress2()).append(", cv:")
.append(getCityVillage()).append(", sp:").append(getStateProvince()).append(", c:").append(getCountry())
.append(", cd:").append(getCountyDistrict()).append(", nc:").append(getAddress3()).append(", pc:").append(
getPostalCode()).append(", lat:").append(getLatitude()).append(", long:").append(getLongitude())
.toString();
}
/**
* Compares this PersonAddress object to the given otherAddress. This method differs from
* {@link #equals(Object)} in that this method compares the inner fields of each address for
* equality. Note: Null/empty fields on <code>otherAddress</code> /will not/ cause a false value
* to be returned
*
* @param otherAddress PersonAddress with which to compare
* @return boolean true/false whether or not they are the same addresses
*/
public boolean equalsContent(PersonAddress otherAddress) {
return new EqualsBuilder().append(defaultString(otherAddress.getAddress1()), defaultString(address1)).append(
defaultString(otherAddress.getAddress2()), defaultString(address2)).append(
defaultString(otherAddress.getAddress3()), defaultString(address3)).append(
defaultString(otherAddress.getAddress4()), defaultString(address4)).append(
defaultString(otherAddress.getAddress5()), defaultString(address5)).append(
defaultString(otherAddress.getAddress6()), defaultString(address6)).append(
defaultString(otherAddress.getAddress7()), defaultString(address7)).append(
defaultString(otherAddress.getAddress8()), defaultString(address8)).append(
defaultString(otherAddress.getAddress9()), defaultString(address9)).append(
defaultString(otherAddress.getAddress10()), defaultString(address10)).append(
defaultString(otherAddress.getAddress11()), defaultString(address11)).append(
defaultString(otherAddress.getAddress12()), defaultString(address12)).append(
defaultString(otherAddress.getAddress13()), defaultString(address13)).append(
defaultString(otherAddress.getAddress14()), defaultString(address14)).append(
defaultString(otherAddress.getAddress15()), defaultString(address15)).append(
defaultString(otherAddress.getCityVillage()), defaultString(cityVillage)).append(
defaultString(otherAddress.getCountyDistrict()), defaultString(countyDistrict)).append(
defaultString(otherAddress.getStateProvince()), defaultString(stateProvince)).append(
defaultString(otherAddress.getCountry()), defaultString(country)).append(
defaultString(otherAddress.getPostalCode()), defaultString(postalCode)).append(
defaultString(otherAddress.getLatitude()), defaultString(latitude)).append(
defaultString(otherAddress.getLongitude()), defaultString(longitude)).append(otherAddress.getStartDate(),
startDate).append(otherAddress.getEndDate(), endDate).isEquals();
}
/**
* bitwise copy of the personAddress object. NOTICE: THIS WILL NOT COPY THE PATIENT OBJECT. The
* PersonAddress.person object in this object AND the cloned object will point at the same
* person
*
* @return New PersonAddress object
*/
@Override
public Object clone() {
try {
return super.clone();
}
catch (CloneNotSupportedException e) {
throw new InternalError("PersonAddress should be cloneable");
}
}
/**
* @return Returns the address1.
*/
@Override
public String getAddress1() {
return address1;
}
/**
* @param address1 The address1 to set.
*/
@Override
public void setAddress1(String address1) {
this.address1 = address1;
}
/**
* @return Returns the address2.
*/
@Override
public String getAddress2() {
return address2;
}
/**
* @param address2 The address2 to set.
*/
@Override
public void setAddress2(String address2) {
this.address2 = address2;
}
/**
* @return Returns the cityVillage.
*/
@Override
public String getCityVillage() {
return cityVillage;
}
/**
* @param cityVillage The cityVillage to set.
*/
@Override
public void setCityVillage(String cityVillage) {
this.cityVillage = cityVillage;
}
/**
* @return Returns the country.
*/
@Override
public String getCountry() {
return country;
}
/**
* @param country The country to set.
*/
@Override
public void setCountry(String country) {
this.country = country;
}
/**
* @return Returns the preferred.
*
* @deprecated as of 2.0, use {@link #getPreferred()}
*/
@Deprecated
@JsonIgnore
public Boolean isPreferred() {
return getPreferred();
}
public Boolean getPreferred() {
return preferred == null ? Boolean.FALSE : preferred;
}
/**
* @param preferred The preferred to set.
*/
public void setPreferred(Boolean preferred) {
this.preferred = preferred;
}
/**
* @return Returns the latitude.
*/
@Override
public String getLatitude() {
return latitude;
}
/**
* @param latitude The latitude to set.
*/
@Override
public void setLatitude(String latitude) {
this.latitude = latitude;
}
/**
* @return Returns the longitude.
*/
@Override
public String getLongitude() {
return longitude;
}
/**
* @param longitude The longitude to set.
*/
@Override
public void setLongitude(String longitude) {
this.longitude = longitude;
}
/**
* @return Returns the person.
*/
public Person getPerson() {
return person;
}
/**
* @param person The person to set.
*/
public void setPerson(Person person) {
this.person = person;
}
/**
* @return Returns the personAddressId.
*/
public Integer getPersonAddressId() {
return personAddressId;
}
/**
* @param personAddressId The personAddressId to set.
*/
public void setPersonAddressId(Integer personAddressId) {
this.personAddressId = personAddressId;
}
/**
* @return Returns the postalCode.
*/
@Override
public String getPostalCode() {
return postalCode;
}
/**
* @param postalCode The postalCode to set.
*/
@Override
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
/**
* @return Returns the stateProvince.
*/
@Override
public String getStateProvince() {
return stateProvince;
}
/**
* @param stateProvince The stateProvince to set.
*/
@Override
public void setStateProvince(String stateProvince) {
this.stateProvince = stateProvince;
}
/**
* @return Returns the countyDistrict.
*/
@Override
public String getCountyDistrict() {
return countyDistrict;
}
/**
* @param countyDistrict The countyDistrict to set.
*/
@Override
public void setCountyDistrict(String countyDistrict) {
this.countyDistrict = countyDistrict;
}
/**
* Convenience method to test whether any of the fields in this address are set
*
* @return whether any of the address fields (address1, address2, cityVillage, stateProvince,
* country, countyDistrict, neighborhoodCell, postalCode, latitude, longitude, etc) are
* whitespace, empty ("") or null.
*/
public boolean isBlank() {
return StringUtils.isBlank(getAddress1()) && StringUtils.isBlank(getAddress2())
&& StringUtils.isBlank(getAddress3()) && StringUtils.isBlank(getAddress4())
&& StringUtils.isBlank(getAddress5()) && StringUtils.isBlank(getAddress6())
&& StringUtils.isBlank(getCityVillage()) && StringUtils.isBlank(getStateProvince())
&& StringUtils.isBlank(getCountry()) && StringUtils.isBlank(getCountyDistrict())
&& StringUtils.isBlank(getPostalCode()) && StringUtils.isBlank(getLatitude())
&& StringUtils.isBlank(getLongitude());
}
/**
* @see java.lang.Comparable#compareTo(java.lang.Object)
* Note: this comparator imposes orderings that are inconsistent with equals.
*/
@Override
@SuppressWarnings("squid:S1210")
public int compareTo(PersonAddress other) {
int retValue = 0;
if (other != null) {
retValue = getVoided().compareTo(other.getVoided());
if (retValue == 0) {
retValue = other.isPreferred().compareTo(isPreferred());
}
if (retValue == 0 && getDateCreated() != null) {
retValue = OpenmrsUtil.compareWithNullAsLatest(getDateCreated(), other.getDateCreated());
}
if (retValue == 0) {
retValue = OpenmrsUtil.compareWithNullAsGreatest(getPersonAddressId(), other.getPersonAddressId());
}
// if we've gotten this far, just check all address values. If they are
// equal, leave the objects at 0. If not, arbitrarily pick retValue=1
// and return that (they are not equal).
if (retValue == 0 && !equalsContent(other)) {
retValue = 1;
}
}
return retValue;
}
/**
* @since 1.8
* @return the address3
*/
@Override
public String getAddress3() {
return address3;
}
/**
* @since 1.8
* @param address3 the address3 to set
*/
@Override
public void setAddress3(String address3) {
this.address3 = address3;
}
/**
* @since 1.8
* @return the address4
*/
@Override
public String getAddress4() {
return address4;
}
/**
* @since 1.8
* @param address4 the address4 to set
*/
@Override
public void setAddress4(String address4) {
this.address4 = address4;
}
/**
* @since 1.8
* @return the address6
*/
@Override
public String getAddress6() {
return address6;
}
/**
* @since 1.8
* @param address6 the address6 to set
*/
@Override
public void setAddress6(String address6) {
this.address6 = address6;
}
/**
* @since 1.8
* @return the address5
*/
@Override
public String getAddress5() {
return address5;
}
/**
* @since 1.8
* @param address5 the address5 to set
*/
@Override
public void setAddress5(String address5) {
this.address5 = address5;
}
/**
* @since 1.5
* @see org.openmrs.OpenmrsObject#getId()
*/
@Override
public Integer getId() {
return getPersonAddressId();
}
/**
* @since 1.5
* @see org.openmrs.OpenmrsObject#setId(java.lang.Integer)
*/
@Override
public void setId(Integer id) {
setPersonAddressId(id);
}
/**
* @return the startDate
* @since 1.9
*/
public Date getStartDate() {
return startDate;
}
/**
* @param startDate to set to
* @since 1.9
*/
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
/**
* @return the endDate
* @since 1.9
*/
public Date getEndDate() {
return this.endDate;
}
/**
* @param endDate to set to
* @since 1.9
*/
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
/**
* Returns true if the address' endDate is null
*
* @return true or false
* @since 1.9
*/
public Boolean isActive() {
return this.endDate == null;
}
/**
* Makes an address inactive by setting its endDate to the current time
*
* @since 1.9
*/
public void deactivate() {
setEndDate(Calendar.getInstance().getTime());
}
/**
* Makes an address active by setting its endDate to null
*
* @since 1.9
*/
public void activate() {
setEndDate(null);
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress7() {
return address7;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress7(String address7) {
this.address7 = address7;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress8() {
return address8;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress8(String address8) {
this.address8 = address8;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress9() {
return address9;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress9(String address9) {
this.address9 = address9;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress10() {
return address10;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress10(String address10) {
this.address10 = address10;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress11() {
return address11;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress11(String address11) {
this.address11 = address11;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress12() {
return address12;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress12(String address12) {
this.address12 = address12;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress13() {
return address13;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress13(String address13) {
this.address13 = address13;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress14() {
return address14;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress14(String address14) {
this.address14 = address14;
}
/**
* {@inheritDoc}
*/
@Override
public String getAddress15() {
return address15;
}
/**
* {@inheritDoc}
*/
@Override
public void setAddress15(String address15) {
this.address15 = address15;
}
}