diff --git a/api/src/main/java/org/openmrs/BaseCustomizableData.java b/api/src/main/java/org/openmrs/BaseCustomizableData.java
index 732615c5f..b584f5d95 100644
--- a/api/src/main/java/org/openmrs/BaseCustomizableData.java
+++ b/api/src/main/java/org/openmrs/BaseCustomizableData.java
@@ -14,6 +14,7 @@ import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import java.util.TreeSet;
import org.openmrs.attribute.Attribute;
import org.openmrs.customdatatype.CustomValueDescriptor;
@@ -26,7 +27,7 @@ import org.openmrs.customdatatype.Customizable;
*/
public abstract class BaseCustomizableData extends BaseChangeableOpenmrsData implements Customizable {
- private Set attributes = new LinkedHashSet<>();
+ private Set attributes = new TreeSet<>();
/**
* @see org.openmrs.customdatatype.Customizable#getAttributes()
diff --git a/api/src/main/java/org/openmrs/Person.java b/api/src/main/java/org/openmrs/Person.java
index 948e3480f..1024f69d8 100644
--- a/api/src/main/java/org/openmrs/Person.java
+++ b/api/src/main/java/org/openmrs/Person.java
@@ -53,11 +53,6 @@ public class Person extends BaseCustomizableData {
@ContainedIn
private Set names = null;
- @Override
- public Set getAttributes() {
- return super.getAttributes();
- }
-
@Field
private String gender;
@@ -395,18 +390,11 @@ public class Person extends BaseCustomizableData {
public void setNames(Set names) {
this.names = names;
}
-
- /**
- * @return all known attributes for person
- * @see org.openmrs.PersonAttribute
- * Should not get voided attributes
- * Should not fail with null attributes
- */
+
+ @ContainedIn
+ @Override
public Set getAttributes() {
- if (attributes == null) {
- attributes = new TreeSet<>();
- }
- return this.attributes;
+ return super.getAttributes();
}
/**
@@ -414,7 +402,7 @@ public class Person extends BaseCustomizableData {
* @see org.openmrs.PersonAttribute
*/
public void setAttributes(Set attributes) {
- this.attributes = attributes;
+ super.setAttributes(attributes);
attributeMap = null;
allAttributeMap = null;
}
@@ -465,8 +453,10 @@ public class Person extends BaseCustomizableData {
}
}
}
+
attributeMap = null;
allAttributeMap = null;
+ Set attributes = getAttributes();
if (!OpenmrsUtil.collectionContains(attributes, newAttribute) && !newIsNull) {
attributes.add(newAttribute);
}
@@ -482,6 +472,7 @@ public class Person extends BaseCustomizableData {
* Should remove attribute when exist
*/
public void removeAttribute(PersonAttribute attribute) {
+ Set attributes = getAttributes();
if (attributes != null && attributes.remove(attribute)) {
attributeMap = null;
allAttributeMap = null;
diff --git a/api/src/main/java/org/openmrs/VisitAttribute.java b/api/src/main/java/org/openmrs/VisitAttribute.java
index cd75bd2b7..3602f07c3 100644
--- a/api/src/main/java/org/openmrs/VisitAttribute.java
+++ b/api/src/main/java/org/openmrs/VisitAttribute.java
@@ -17,7 +17,7 @@ import org.openmrs.attribute.BaseAttribute;
* @see Attribute
* @since 1.9
*/
-public class VisitAttribute extends BaseAttribute implements Attribute {
+public class VisitAttribute extends BaseAttribute {
private Integer visitAttributeId;
diff --git a/api/src/main/java/org/openmrs/attribute/Attribute.java b/api/src/main/java/org/openmrs/attribute/Attribute.java
index 472797444..edc106ab8 100644
--- a/api/src/main/java/org/openmrs/attribute/Attribute.java
+++ b/api/src/main/java/org/openmrs/attribute/Attribute.java
@@ -27,7 +27,7 @@ import org.openmrs.customdatatype.SingleCustomValue;
* @see Customizable
* @since 1.9
*/
-public interface Attribute> extends OpenmrsData, SingleCustomValue {
+public interface Attribute> extends OpenmrsData, SingleCustomValue, Comparable {
/**
* @return the owner that this attribute belongs to