Skip to content

Commit 1d5e2cd

Browse files
committed
Add MessageFilter.equals(MessageFilter) and tests
Signed-off-by: Mitch Gaffigan <mitch.gaffigan@comcast.net>
1 parent c7331a0 commit 1d5e2cd

4 files changed

Lines changed: 244 additions & 1 deletion

File tree

server/src/com/mirth/connect/model/filters/MessageFilter.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
*/
3737
@XStreamAlias("messageFilter")
3838
public class MessageFilter implements Serializable {
39+
private static final MessageFilter EMPTY_FILTER = new MessageFilter();
40+
3941
/*
4042
* Note that any filter criteria that is an int must be represented using Integer otherwise it
4143
* will default to 0 and not pass the isNotNull check in the SQL mapping.
@@ -59,6 +61,10 @@ public class MessageFilter implements Serializable {
5961
private List<String> textSearchMetaDataColumns;
6062
private Integer sendAttemptsLower;
6163
private Integer sendAttemptsUpper;
64+
/*
65+
* Despite the comment above, "false" for attachment and error actually mean "not set".
66+
* There's no way to search for messages that don't have attachments/errors.
67+
*/
6268
private Boolean attachment;
6369
private Boolean error;
6470

@@ -230,6 +236,50 @@ public void setError(Boolean error) {
230236
this.error = error;
231237
}
232238

239+
@Override
240+
public boolean equals(Object obj) {
241+
return obj instanceof MessageFilter
242+
&& equals((MessageFilter) obj);
243+
}
244+
245+
public boolean equals(MessageFilter filter) {
246+
return filter != null
247+
&& Objects.equals(maxMessageId, filter.maxMessageId)
248+
&& Objects.equals(minMessageId, filter.minMessageId)
249+
&& Objects.equals(originalIdUpper, filter.originalIdUpper)
250+
&& Objects.equals(originalIdLower, filter.originalIdLower)
251+
&& Objects.equals(importIdUpper, filter.importIdUpper)
252+
&& Objects.equals(importIdLower, filter.importIdLower)
253+
&& Objects.equals(startDate, filter.startDate)
254+
&& Objects.equals(endDate, filter.endDate)
255+
&& Objects.equals(textSearch, filter.textSearch)
256+
&& Objects.equals(textSearchRegex, filter.textSearchRegex)
257+
&& Objects.equals(statuses, filter.statuses)
258+
&& Objects.equals(
259+
(includedMetaDataIds == null || includedMetaDataIds.isEmpty()) ? null : includedMetaDataIds,
260+
(filter.includedMetaDataIds == null || filter.includedMetaDataIds.isEmpty()) ? null : filter.includedMetaDataIds)
261+
&& Objects.equals(
262+
(excludedMetaDataIds == null || excludedMetaDataIds.isEmpty()) ? null : excludedMetaDataIds,
263+
(filter.excludedMetaDataIds == null || filter.excludedMetaDataIds.isEmpty()) ? null : filter.excludedMetaDataIds)
264+
&& Objects.equals(serverId, filter.serverId)
265+
&& Objects.equals(contentSearch, filter.contentSearch)
266+
&& Objects.equals(metaDataSearch, filter.metaDataSearch)
267+
&& Objects.equals(textSearchMetaDataColumns, filter.textSearchMetaDataColumns)
268+
&& Objects.equals(sendAttemptsLower, filter.sendAttemptsLower)
269+
&& Objects.equals(sendAttemptsUpper, filter.sendAttemptsUpper)
270+
&& Objects.equals(Boolean.TRUE.equals(attachment), Boolean.TRUE.equals(filter.attachment))
271+
&& Objects.equals(Boolean.TRUE.equals(error), Boolean.TRUE.equals(filter.error));
272+
}
273+
274+
@Override
275+
public int hashCode() {
276+
return Objects.hash(maxMessageId, startDate, endDate, textSearch);
277+
}
278+
279+
public boolean isEmpty() {
280+
return this.equals(EMPTY_FILTER);
281+
}
282+
233283
@Override
234284
public String toString() {
235285
return toString(Map.of(), "\n", false);

server/src/com/mirth/connect/model/filters/elements/ContentSearchElement.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.io.Serializable;
88
import java.util.List;
9+
import java.util.Objects;
910

1011
import org.apache.commons.lang3.builder.ToStringBuilder;
1112

@@ -41,4 +42,21 @@ public void setSearches(List<String> searches) {
4142
public String toString() {
4243
return ToStringBuilder.reflectionToString(this, ContentSearchElementToStringStyle.instance());
4344
}
45+
46+
@Override
47+
public boolean equals(Object obj) {
48+
return obj instanceof ContentSearchElement
49+
&& equals((ContentSearchElement) obj);
50+
}
51+
52+
public boolean equals(ContentSearchElement element) {
53+
return element != null
54+
&& contentCode == element.contentCode
55+
&& Objects.equals(searches, element.searches);
56+
}
57+
58+
@Override
59+
public int hashCode() {
60+
return Objects.hash(contentCode, searches);
61+
}
4462
}

server/src/com/mirth/connect/model/filters/elements/MetaDataSearchElement.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package com.mirth.connect.model.filters.elements;
55

6+
import java.util.Objects;
67
import java.io.Serializable;
78

89
import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -61,4 +62,23 @@ public void setIgnoreCase(Boolean ignoreCase) {
6162
public String toString() {
6263
return ToStringBuilder.reflectionToString(this, SearchElementToStringStyle.instance());
6364
}
65+
66+
@Override
67+
public boolean equals(Object obj) {
68+
return obj instanceof MetaDataSearchElement
69+
&& equals((MetaDataSearchElement) obj);
70+
}
71+
72+
public boolean equals(MetaDataSearchElement element) {
73+
return element != null
74+
&& Objects.equals(columnName, element.columnName)
75+
&& Objects.equals(operator, element.operator)
76+
&& Objects.equals(value, element.value)
77+
&& Objects.equals(ignoreCase, element.ignoreCase);
78+
}
79+
80+
@Override
81+
public int hashCode() {
82+
return Objects.hash(columnName, operator, value, ignoreCase);
83+
}
6484
}

server/test/com/mirth/connect/model/MessageFilterModelTest.java

Lines changed: 156 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,30 +26,138 @@ public class MessageFilterModelTest {
2626
@Test
2727
public void testMessageFilterEqualityAndToString() {
2828
var left = new MessageFilter();
29+
var right = new MessageFilter();
2930

31+
assertTrue(left.isEmpty());
32+
assertEquals(left, right);
3033
assertEquals("(no criteria)", left.toString());
34+
assertFalse(left.equals((Object) null));
3135

3236
left.setMaxMessageId(200L);
37+
assertNotEquals(left, right);
38+
assertNotNull(left.toString());
39+
right.setMaxMessageId(200L);
40+
assertEquals(left, right);
41+
3342
left.setMinMessageId(100L);
43+
assertNotEquals(left, right);
44+
assertNotNull(left.toString());
45+
right.setMinMessageId(100L);
46+
assertEquals(left, right);
47+
3448
left.setOriginalIdLower(10L);
49+
assertNotEquals(left, right);
50+
assertNotNull(left.toString());
51+
right.setOriginalIdLower(10L);
52+
assertEquals(left, right);
53+
3554
left.setOriginalIdUpper(20L);
55+
assertNotEquals(left, right);
56+
assertNotNull(left.toString());
57+
right.setOriginalIdUpper(20L);
58+
assertEquals(left, right);
59+
3660
left.setImportIdLower(25L);
61+
assertNotEquals(left, right);
62+
assertNotNull(left.toString());
63+
right.setImportIdLower(25L);
64+
assertEquals(left, right);
65+
3766
left.setImportIdUpper(30L);
67+
assertNotEquals(left, right);
68+
assertNotNull(left.toString());
69+
right.setImportIdUpper(30L);
70+
assertEquals(left, right);
71+
3872
left.setStartDate(calendar(2024, 1, 2, 3, 4, 0));
73+
assertNotEquals(left, right);
74+
assertNotNull(left.toString());
75+
right.setStartDate(calendar(2024, 1, 2, 3, 4, 0));
76+
assertEquals(left, right);
77+
3978
left.setEndDate(calendar(2024, 2, 3, 4, 5, 0));
79+
assertNotEquals(left, right);
80+
assertNotNull(left.toString());
81+
right.setEndDate(calendar(2024, 2, 3, 4, 5, 0));
82+
assertEquals(left, right);
83+
4084
left.setTextSearch("alpha");
85+
assertNotEquals(left, right);
86+
assertNotNull(left.toString());
87+
right.setTextSearch("alpha");
88+
assertEquals(left, right);
89+
4190
left.setTextSearchRegex(false);
91+
assertNotEquals(left, right);
92+
assertNotNull(left.toString());
93+
right.setTextSearchRegex(false);
94+
assertEquals(left, right);
95+
4296
left.setStatuses(EnumSet.of(Status.RECEIVED, Status.ERROR));
97+
assertNotEquals(left, right);
98+
assertNotNull(left.toString());
99+
right.setStatuses(EnumSet.of(Status.RECEIVED, Status.ERROR));
100+
assertEquals(left, right);
101+
43102
left.setIncludedMetaDataIds(List.of(1, 2));
103+
assertNotEquals(left, right);
104+
assertNotNull(left.toString());
105+
right.setIncludedMetaDataIds(List.of(1, 2));
106+
assertEquals(left, right);
107+
44108
left.setExcludedMetaDataIds(List.of(3));
109+
assertNotEquals(left, right);
110+
assertNotNull(left.toString());
111+
right.setExcludedMetaDataIds(List.of(3));
112+
assertEquals(left, right);
113+
45114
left.setServerId("server-1");
115+
assertNotEquals(left, right);
116+
assertNotNull(left.toString());
117+
right.setServerId("server-1");
118+
assertEquals(left, right);
119+
46120
left.setContentSearch(List.of(new ContentSearchElement(ContentType.RAW.getContentTypeCode(), List.of("needle", "haystack"))));
121+
assertNotEquals(left, right);
122+
assertNotNull(left.toString());
123+
right.setContentSearch(List.of(new ContentSearchElement(ContentType.RAW.getContentTypeCode(), List.of("needle", "haystack"))));
124+
assertEquals(left, right);
125+
47126
left.setMetaDataSearch(List.of(new MetaDataSearchElement("mirth_type", "EQUAL", "asdf", null)));
127+
assertNotEquals(left, right);
128+
assertNotNull(left.toString());
129+
right.setMetaDataSearch(List.of(new MetaDataSearchElement("mirth_type", "EQUAL", "asdf", null)));
130+
assertEquals(left, right);
131+
48132
left.setTextSearchMetaDataColumns(List.of("columnA", "columnB"));
133+
assertNotEquals(left, right);
134+
assertNotNull(left.toString());
135+
right.setTextSearchMetaDataColumns(List.of("columnA", "columnB"));
136+
assertEquals(left, right);
137+
49138
left.setSendAttemptsLower(1);
139+
assertNotEquals(left, right);
140+
assertNotNull(left.toString());
141+
right.setSendAttemptsLower(1);
142+
assertEquals(left, right);
143+
50144
left.setSendAttemptsUpper(5);
145+
assertNotEquals(left, right);
146+
assertNotNull(left.toString());
147+
right.setSendAttemptsUpper(5);
148+
assertEquals(left, right);
149+
51150
left.setAttachment(true);
151+
assertNotEquals(left, right);
152+
assertNotNull(left.toString());
153+
right.setAttachment(true);
154+
assertEquals(left, right);
155+
52156
left.setError(true);
157+
assertNotEquals(left, right);
158+
assertNotNull(left.toString());
159+
right.setError(true);
160+
assertEquals(left, right);
53161

54162
var expected = String.join("\n",
55163
"Max Message Id: 200",
@@ -70,8 +178,55 @@ public void testMessageFilterEqualityAndToString() {
70178
);
71179

72180
assertEquals(expected, left.toString(Map.of(1, "Source", 2, "Destination", 3, "Filtered"), "\n", false));
181+
assertEquals(left, right);
182+
assertFalse(left.isEmpty());
183+
}
184+
185+
@Test
186+
public void testMessageFilterEmptyUiSelectionsRemainEmpty() {
187+
var filter = new MessageFilter();
188+
var empty = new MessageFilter();
189+
190+
// False is handled the same as null by the server and message browser
191+
filter.setAttachment(false);
192+
filter.setError(false);
193+
194+
assertEquals("Unchecked advanced checkboxes should compare equal to an empty filter", empty, filter);
195+
assertTrue("Unchecked advanced checkboxes should not make the filter non-empty", filter.isEmpty());
196+
assertEquals("(no criteria)", filter.toString());
197+
198+
filter.setIncludedMetaDataIds(List.of());
199+
assertEquals("An empty included connector list should compare equal to an empty filter", empty, filter);
200+
assertTrue("An empty included connector list should not make the filter non-empty", filter.isEmpty());
201+
202+
filter.setIncludedMetaDataIds(null);
203+
filter.setExcludedMetaDataIds(List.of());
204+
assertEquals("An empty excluded connector list should compare equal to an empty filter", empty, filter);
205+
assertTrue("An empty excluded connector list should not make the filter non-empty", filter.isEmpty());
73206
}
74-
207+
208+
@Test
209+
public void testMetaDataSearchElementEqualsHashCodeAndToString() {
210+
var element = new MetaDataSearchElement("status", "EQUAL", "OK", true);
211+
var same = new MetaDataSearchElement("status", "EQUAL", "OK", true);
212+
var different = new MetaDataSearchElement("status", "EQUAL", "FAIL", true);
213+
214+
assertEquals(element, same);
215+
assertEquals(element.hashCode(), same.hashCode());
216+
assertNotEquals(element, different);
217+
}
218+
219+
@Test
220+
public void testContentSearchElementEqualsHashCodeAndToString() {
221+
var element = new ContentSearchElement(ContentType.RAW.getContentTypeCode(), List.of("foo", "bar"));
222+
var same = new ContentSearchElement(ContentType.RAW.getContentTypeCode(), List.of("foo", "bar"));
223+
var different = new ContentSearchElement(ContentType.RESPONSE.getContentTypeCode(), List.of("foo"));
224+
225+
assertEquals(element, same);
226+
assertEquals(element.hashCode(), same.hashCode());
227+
assertNotEquals(element, different);
228+
}
229+
75230
@Test
76231
public void testMessageFilterToStringFallsBackToConnectorIds() {
77232
var filter = new MessageFilter();

0 commit comments

Comments
 (0)