Is there any way to get what field wasn't equal using EqualBuilder

Viewed 105

Is there any way to get what field and the corresponding value that caused the inequality when using EqualBuilder

@Override
    public boolean equals(Object o) {
    Meeting meeting = (Meeting) o;
    EqualsBuilder equalsBuilder = new EqualsBuilder();
            return equalsBuilder.append(basicMeetingInformation, meeting.basicMeetingInformation).append(subject, meeting.subject)
                    .append(emailParticipants, meeting.emailParticipants).append(ownerEmail, meeting.ownerEmail).append(timeZone, meeting.timeZone)
                    .append(start, meeting.start).append(end, meeting.end).append(notes, meeting.notes).append(recurrence, meeting.recurrence)
                    .append(recurrenceEnd, meeting.recurrenceEnd).append(recurrentInstanceId, meeting.recurrentInstanceId)
                    .append(scheduledMeetingRooms, meeting.scheduledMeetingRooms).isEquals();
}
1 Answers

No, You could have easily a custom extension (with 1 additional (String) parameter, like: myAppend(T lhs, T rhs, String name)). But basing on EqualsBuilder (it is quite intelligent, and stops comparing, once inequality is detected), you can get only the first field and value, which violates equation, like:

import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.lang3.builder.EqualsBuilder;

public class MyEqualsBuilder extends EqualsBuilder {

    private final Map<String, Object> violatedFieldValues = new TreeMap<>();

    /**
    * @param name - the name of appended property.
    * @see #append
    **/
    public <T> EqualsBuilder myAppend(T lhs, T rhs, String name) {
        assert (null != name);
        append(lhs, rhs);
        if (violatedFieldValues.isEmpty() && !isEquals()) {
            violatedFieldValues.put(name, rhs);
        }
        return this;
    }

    /** 
    * Gets the Map of field name to (right hand) value,
    * which first violated the equality of this equals builder.
    * Contains 0 - 1 entries.
    **/  
    public Map<String, Object> getViolatedFieldValues() {
        return violatedFieldValues;
    }

}
Related