Skip to content

Commit 8cc6363

Browse files
committed
Fix NullPointerExceptions in
org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder - Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.equalTo(A) - Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.greaterThan(A).</action> - Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.greaterThanOrEqualTo(A).</action> - Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.lessThan(A).</action> - Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.lessThanOrEqualTo(A)
1 parent f71459b commit 8cc6363

File tree

3 files changed

+101
-41
lines changed

3 files changed

+101
-41
lines changed

src/changes/changes.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ The <action> type attribute can be add,update,fix,remove.
103103
<action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.lang3.EnumUtils.getFirstEnumIgnoreCase(Class, String, Function, E) now returns the given default enum on null enumClass input.</action>
104104
<action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.lang3.EnumUtils.getEnumIgnoreCase(Class, String, E) now returns the given default enum on null enumClass input.</action>
105105
<action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.lang3.EnumUtils.getEnumIgnoreCase(Class, String) now returns the given default enum on null enumClass input.</action>
106+
<action type="fix" dev="ggregory" due-to="Gary Gregory">Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.equalTo(A).</action>
107+
<action type="fix" dev="ggregory" due-to="Gary Gregory">Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.greaterThan(A).</action>
108+
<action type="fix" dev="ggregory" due-to="Gary Gregory">Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.greaterThanOrEqualTo(A).</action>
109+
<action type="fix" dev="ggregory" due-to="Gary Gregory">Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.lessThan(A).</action>
110+
<action type="fix" dev="ggregory" due-to="Gary Gregory">Fix NullPointerException in org.apache.commons.lang3.compare.ComparableUtils.ComparableCheckBuilder.lessThanOrEqualTo(A).</action>
106111
<!-- ADD -->
107112
<action type="add" dev="ggregory" due-to="Gary Gregory">Add Strings and refactor StringUtils.</action>
108113
<action issue="LANG-1747" type="add" dev="ggregory" due-to="Oliver B. Fischer, Gary Gregory">Add StopWatch.run([Failable]Runnable) and get([Failable]Supplier).</action>

src/main/java/org/apache/commons/lang3/compare/ComparableUtils.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
import org.apache.commons.lang3.ObjectUtils;
2222

2323
/**
24-
* Utility library to provide helper methods for translating {@link Comparable#compareTo} result into a boolean.
24+
* Helper translating {@link Comparable#compareTo} results to booleans.
2525
*
26-
* <p>Example: {@code boolean x = is(myComparable).lessThanOrEqualTo(otherComparable)}</p>
26+
* <p>Example: {@code boolean x = ComparableUtils.is(myComparable).lessThanOrEqualTo(otherComparable)}</p>
2727
*
2828
* <p>#ThreadSafe#</p>
2929
*
@@ -81,7 +81,7 @@ private boolean betweenOrderedExclusive(final A b, final A c) {
8181
* @return true if the value returned by {@link Comparable#compareTo} is equal to {@code 0}
8282
*/
8383
public boolean equalTo(final A b) {
84-
return a.compareTo(b) == 0;
84+
return a != null && a.compareTo(b) == 0;
8585
}
8686

8787
/**
@@ -91,7 +91,7 @@ public boolean equalTo(final A b) {
9191
* @return true if the value returned by {@link Comparable#compareTo} is greater than {@code 0}
9292
*/
9393
public boolean greaterThan(final A b) {
94-
return a.compareTo(b) > 0;
94+
return a != null && a.compareTo(b) > 0;
9595
}
9696

9797
/**
@@ -101,7 +101,7 @@ public boolean greaterThan(final A b) {
101101
* @return true if the value returned by {@link Comparable#compareTo} is greater than or equal to {@code 0}
102102
*/
103103
public boolean greaterThanOrEqualTo(final A b) {
104-
return a.compareTo(b) >= 0;
104+
return a != null && a.compareTo(b) >= 0;
105105
}
106106

107107
/**
@@ -111,7 +111,7 @@ public boolean greaterThanOrEqualTo(final A b) {
111111
* @return true if the value returned by {@link Comparable#compareTo} is less than {@code 0}
112112
*/
113113
public boolean lessThan(final A b) {
114-
return a.compareTo(b) < 0;
114+
return a != null && a.compareTo(b) < 0;
115115
}
116116

117117
/**
@@ -121,7 +121,7 @@ public boolean lessThan(final A b) {
121121
* @return true if the value returned by {@link Comparable#compareTo} is less than or equal to {@code 0}
122122
*/
123123
public boolean lessThanOrEqualTo(final A b) {
124-
return a.compareTo(b) <= 0;
124+
return a != null && a.compareTo(b) <= 0;
125125
}
126126
}
127127

src/test/java/org/apache/commons/lang3/compare/ComparableUtilsTest.java

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717
package org.apache.commons.lang3.compare;
1818

19-
import static org.apache.commons.lang3.compare.ComparableUtils.is;
19+
import static org.apache.commons.lang3.LangAssertions.assertNullPointerException;
2020
import static org.junit.jupiter.api.Assertions.assertEquals;
2121
import static org.junit.jupiter.api.Assertions.assertFalse;
2222
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -46,12 +46,12 @@ final class C_is_0 {
4646

4747
@Test
4848
void between_returns_false() {
49-
assertFalse(is(a).between(b, c));
49+
assertFalse(ComparableUtils.is(a).between(b, c));
5050
}
5151

5252
@Test
5353
void betweenExclusive_returns_false() {
54-
assertFalse(is(a).betweenExclusive(b, c));
54+
assertFalse(ComparableUtils.is(a).betweenExclusive(b, c));
5555
}
5656

5757
@Test
@@ -74,12 +74,12 @@ final class C_is_1 {
7474

7575
@Test
7676
void between_returns_true() {
77-
assertTrue(is(a).between(b, c));
77+
assertTrue(ComparableUtils.is(a).between(b, c));
7878
}
7979

8080
@Test
8181
void betweenExclusive_returns_false() {
82-
assertFalse(is(a).betweenExclusive(b, c));
82+
assertFalse(ComparableUtils.is(a).betweenExclusive(b, c));
8383
}
8484

8585
@Test
@@ -101,12 +101,12 @@ final class C_is_10 {
101101

102102
@Test
103103
void between_returns_true() {
104-
assertTrue(is(a).between(b, c));
104+
assertTrue(ComparableUtils.is(a).between(b, c));
105105
}
106106

107107
@Test
108108
void betweenExclusive_returns_true() {
109-
assertTrue(is(a).betweenExclusive(b, c));
109+
assertTrue(ComparableUtils.is(a).betweenExclusive(b, c));
110110
}
111111

112112
@Test
@@ -124,27 +124,27 @@ void static_betweenExclusive_returns_true() {
124124

125125
@Test
126126
void equalTo_returns_false() {
127-
assertFalse(is(a).equalTo(b));
127+
assertFalse(ComparableUtils.is(a).equalTo(b));
128128
}
129129

130130
@Test
131131
void greaterThan_returns_true() {
132-
assertTrue(is(a).greaterThan(b));
132+
assertTrue(ComparableUtils.is(a).greaterThan(b));
133133
}
134134

135135
@Test
136136
void greaterThanOrEqualTo_returns_true() {
137-
assertTrue(is(a).greaterThanOrEqualTo(b));
137+
assertTrue(ComparableUtils.is(a).greaterThanOrEqualTo(b));
138138
}
139139

140140
@Test
141141
void lessThan_returns_false() {
142-
assertFalse(is(a).lessThan(b));
142+
assertFalse(ComparableUtils.is(a).lessThan(b));
143143
}
144144

145145
@Test
146146
void lessThanOrEqualTo_returns_false() {
147-
assertFalse(is(a).lessThanOrEqualTo(b));
147+
assertFalse(ComparableUtils.is(a).lessThanOrEqualTo(b));
148148
}
149149

150150
@Test
@@ -180,12 +180,12 @@ final class C_is_0 {
180180

181181
@Test
182182
void between_returns_true() {
183-
assertTrue(is(a).between(b, c));
183+
assertTrue(ComparableUtils.is(a).between(b, c));
184184
}
185185

186186
@Test
187187
void betweenExclusive_returns_false() {
188-
assertFalse(is(a).betweenExclusive(b, c));
188+
assertFalse(ComparableUtils.is(a).betweenExclusive(b, c));
189189
}
190190

191191
@Test
@@ -207,12 +207,12 @@ final class C_is_1 {
207207

208208
@Test
209209
void between_returns_true() {
210-
assertTrue(is(a).between(b, c));
210+
assertTrue(ComparableUtils.is(a).between(b, c));
211211
}
212212

213213
@Test
214214
void betweenExclusive_returns_false() {
215-
assertFalse(is(a).betweenExclusive(b, c));
215+
assertFalse(ComparableUtils.is(a).betweenExclusive(b, c));
216216
}
217217

218218
@Test
@@ -234,12 +234,12 @@ final class C_is_10 {
234234

235235
@Test
236236
void between_returns_true() {
237-
assertTrue(is(a).between(b, c));
237+
assertTrue(ComparableUtils.is(a).between(b, c));
238238
}
239239

240240
@Test
241241
void betweenExclusive_returns_false() {
242-
assertFalse(is(a).betweenExclusive(b, c));
242+
assertFalse(ComparableUtils.is(a).betweenExclusive(b, c));
243243
}
244244

245245
@Test
@@ -257,27 +257,27 @@ void static_betweenExclusive_returns_false() {
257257

258258
@Test
259259
void equalTo_returns_true() {
260-
assertTrue(is(a).equalTo(b));
260+
assertTrue(ComparableUtils.is(a).equalTo(b));
261261
}
262262

263263
@Test
264264
void greaterThan_returns_false() {
265-
assertFalse(is(a).greaterThan(b));
265+
assertFalse(ComparableUtils.is(a).greaterThan(b));
266266
}
267267

268268
@Test
269269
void greaterThanOrEqualTo_returns_true() {
270-
assertTrue(is(a).greaterThanOrEqualTo(b));
270+
assertTrue(ComparableUtils.is(a).greaterThanOrEqualTo(b));
271271
}
272272

273273
@Test
274274
void lessThan_returns_false() {
275-
assertFalse(is(a).lessThan(b));
275+
assertFalse(ComparableUtils.is(a).lessThan(b));
276276
}
277277

278278
@Test
279279
void lessThanOrEqualTo_returns_true() {
280-
assertTrue(is(a).lessThanOrEqualTo(b));
280+
assertTrue(ComparableUtils.is(a).lessThanOrEqualTo(b));
281281
}
282282

283283
@Test
@@ -313,12 +313,12 @@ final class C_is_0 {
313313

314314
@Test
315315
void between_returns_true() {
316-
assertTrue(is(a).between(b, c));
316+
assertTrue(ComparableUtils.is(a).between(b, c));
317317
}
318318

319319
@Test
320320
void betweenExclusive_returns_true() {
321-
assertTrue(is(a).betweenExclusive(b, c));
321+
assertTrue(ComparableUtils.is(a).betweenExclusive(b, c));
322322
}
323323

324324
@Test
@@ -340,12 +340,12 @@ final class C_is_1 {
340340

341341
@Test
342342
void between_returns_true() {
343-
assertTrue(is(a).between(b, c));
343+
assertTrue(ComparableUtils.is(a).between(b, c));
344344
}
345345

346346
@Test
347347
void betweenExclusive_returns_false() {
348-
assertFalse(is(a).betweenExclusive(b, c));
348+
assertFalse(ComparableUtils.is(a).betweenExclusive(b, c));
349349
}
350350

351351
@Test
@@ -367,12 +367,12 @@ final class C_is_10 {
367367

368368
@Test
369369
void between_returns_false() {
370-
assertFalse(is(a).between(b, c));
370+
assertFalse(ComparableUtils.is(a).between(b, c));
371371
}
372372

373373
@Test
374374
void betweenExclusive_returns_false() {
375-
assertFalse(is(a).betweenExclusive(b, c));
375+
assertFalse(ComparableUtils.is(a).betweenExclusive(b, c));
376376
}
377377

378378
@Test
@@ -390,27 +390,27 @@ void static_betweenExclusive_returns_false() {
390390

391391
@Test
392392
void equalTo_returns_false() {
393-
assertFalse(is(a).equalTo(b));
393+
assertFalse(ComparableUtils.is(a).equalTo(b));
394394
}
395395

396396
@Test
397397
void greaterThan_returns_false() {
398-
assertFalse(is(a).greaterThan(b));
398+
assertFalse(ComparableUtils.is(a).greaterThan(b));
399399
}
400400

401401
@Test
402402
void greaterThanOrEqualTo_returns_false() {
403-
assertFalse(is(a).greaterThanOrEqualTo(b));
403+
assertFalse(ComparableUtils.is(a).greaterThanOrEqualTo(b));
404404
}
405405

406406
@Test
407407
void lessThan_returns_true() {
408-
assertTrue(is(a).lessThan(b));
408+
assertTrue(ComparableUtils.is(a).lessThan(b));
409409
}
410410

411411
@Test
412412
void lessThanOrEqualTo_returns_true() {
413-
assertTrue(is(a).lessThanOrEqualTo(b));
413+
assertTrue(ComparableUtils.is(a).lessThanOrEqualTo(b));
414414
}
415415

416416
@Test
@@ -437,6 +437,61 @@ void static_lt_returns_true() {
437437
BigDecimal a = BigDecimal.ONE;
438438
}
439439

440+
private static class MyComparable implements Comparable<MyComparable> {
441+
442+
private final int i;
443+
444+
MyComparable(final int i) {
445+
this.i = i;
446+
}
447+
448+
@Override
449+
public int compareTo(final MyComparable o) {
450+
return Integer.compare(i, o != null ? o.i : 0);
451+
}
452+
453+
}
454+
455+
@Test
456+
void testIsEqualTo() {
457+
assertNullPointerException(() -> ComparableUtils.is("a").equalTo(null));
458+
assertFalse(ComparableUtils.is(new MyComparable(1)).equalTo(null));
459+
assertFalse(ComparableUtils.is((String) null).equalTo("a"));
460+
assertTrue(ComparableUtils.is("a").equalTo("a"));
461+
}
462+
463+
@Test
464+
void testIsGreaterThan() {
465+
assertNullPointerException(() -> ComparableUtils.is("a").greaterThan(null));
466+
assertTrue(ComparableUtils.is(new MyComparable(1)).greaterThan(null));
467+
assertFalse(ComparableUtils.is((String) null).greaterThan("a"));
468+
assertFalse(ComparableUtils.is("a").greaterThan("a"));
469+
}
470+
471+
@Test
472+
void testIsGreaterThanOrEqualTo() {
473+
assertNullPointerException(() -> ComparableUtils.is("a").greaterThanOrEqualTo(null));
474+
assertTrue(ComparableUtils.is(new MyComparable(1)).greaterThanOrEqualTo(null));
475+
assertFalse(ComparableUtils.is((String) null).greaterThanOrEqualTo("a"));
476+
assertTrue(ComparableUtils.is("a").greaterThanOrEqualTo("a"));
477+
}
478+
479+
@Test
480+
void testIsLessThan() {
481+
assertNullPointerException(() -> ComparableUtils.is("a").lessThan(null));
482+
assertFalse(ComparableUtils.is(new MyComparable(1)).lessThan(null));
483+
assertFalse(ComparableUtils.is((String) null).lessThan("a"));
484+
assertFalse(ComparableUtils.is("a").lessThan("a"));
485+
}
486+
487+
@Test
488+
void testIsLessThanOrEqualTo() {
489+
assertNullPointerException(() -> ComparableUtils.is("a").greaterThanOrEqualTo(null));
490+
assertTrue(ComparableUtils.is(new MyComparable(1)).greaterThanOrEqualTo(null));
491+
assertFalse(ComparableUtils.is((String) null).lessThanOrEqualTo("a"));
492+
assertTrue(ComparableUtils.is("a").lessThanOrEqualTo("a"));
493+
}
494+
440495
@Test
441496
void testMax() {
442497
assertEquals(Instant.MAX, ComparableUtils.max(Instant.MAX, Instant.MAX));

0 commit comments

Comments
 (0)