Skip to content

Commit 6f097e1

Browse files
committed
Use safe null-check for collection values
JAVA-3635
1 parent 7c755ce commit 6f097e1

File tree

7 files changed

+32
-10
lines changed

7 files changed

+32
-10
lines changed

driver-core/src/main/com/mongodb/assertions/Assertions.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import com.mongodb.internal.async.SingleResultCallback;
2121

22+
import java.util.Collection;
23+
2224
/**
2325
* <p>Design by contract assertions.</p> <p>This class is not part of the public API and may be removed or changed at any time.</p>
2426
*/
@@ -100,6 +102,23 @@ public static void isTrueArgument(final String name, final boolean condition) {
100102
}
101103
}
102104

105+
/**
106+
* Throw IllegalArgumentException if the collection contains a null value.
107+
*
108+
* @param name the name of the collection
109+
* @param collection the collection
110+
* @throws java.lang.IllegalArgumentException if the collection contains a null value
111+
*/
112+
public static void doesNotContainNull(final String name, final Collection<?> collection) {
113+
// Use a loop instead of the contains method, as some implementations of that method will throw an exception if passed null as a
114+
// parameter (in particular, lists returned by List.of methods)
115+
for (Object o : collection) {
116+
if (o == null) {
117+
throw new IllegalArgumentException(name + " can not contain a null value");
118+
}
119+
}
120+
}
121+
103122
private Assertions() {
104123
}
105124
}

driver-core/src/main/com/mongodb/client/model/geojson/GeometryCollection.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.util.Collections;
2222
import java.util.List;
2323

24-
import static com.mongodb.assertions.Assertions.isTrueArgument;
24+
import static com.mongodb.assertions.Assertions.doesNotContainNull;
2525
import static com.mongodb.assertions.Assertions.notNull;
2626

2727
/**
@@ -51,7 +51,7 @@ public GeometryCollection(@Nullable final CoordinateReferenceSystem coordinateRe
5151
final List<? extends Geometry> geometries) {
5252
super(coordinateReferenceSystem);
5353
notNull("geometries", geometries);
54-
isTrueArgument("geometries contains only non-null elements", !geometries.contains(null));
54+
doesNotContainNull("geometries", geometries);
5555
this.geometries = Collections.unmodifiableList(geometries);
5656
}
5757

driver-core/src/main/com/mongodb/client/model/geojson/LineString.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Collections;
2222
import java.util.List;
2323

24+
import static com.mongodb.assertions.Assertions.doesNotContainNull;
2425
import static com.mongodb.assertions.Assertions.isTrueArgument;
2526
import static com.mongodb.assertions.Assertions.notNull;
2627

@@ -53,7 +54,7 @@ public LineString(@Nullable final CoordinateReferenceSystem coordinateReferenceS
5354
super(coordinateReferenceSystem);
5455
notNull("coordinates", coordinates);
5556
isTrueArgument("coordinates must contain at least two positions", coordinates.size() >= 2);
56-
isTrueArgument("coordinates contains only non-null positions", !coordinates.contains(null));
57+
doesNotContainNull("coordinates", coordinates);
5758

5859
this.coordinates = Collections.unmodifiableList(coordinates);
5960
}

driver-core/src/main/com/mongodb/client/model/geojson/MultiLineString.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.util.Collections;
2222
import java.util.List;
2323

24-
import static com.mongodb.assertions.Assertions.isTrueArgument;
24+
import static com.mongodb.assertions.Assertions.doesNotContainNull;
2525
import static com.mongodb.assertions.Assertions.notNull;
2626

2727
/**
@@ -55,7 +55,7 @@ public MultiLineString(@Nullable final CoordinateReferenceSystem coordinateRefer
5555

5656
for (List<Position> line : coordinates) {
5757
notNull("line", line);
58-
isTrueArgument("line contains only non-null positions", !line.contains(null));
58+
doesNotContainNull("line", line);
5959
}
6060

6161
this.coordinates = Collections.unmodifiableList(coordinates);

driver-core/src/main/com/mongodb/client/model/geojson/MultiPolygon.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.util.Collections;
2222
import java.util.List;
2323

24-
import static com.mongodb.assertions.Assertions.isTrueArgument;
24+
import static com.mongodb.assertions.Assertions.doesNotContainNull;
2525
import static com.mongodb.assertions.Assertions.notNull;
2626

2727
/**
@@ -51,7 +51,7 @@ public MultiPolygon(final List<PolygonCoordinates> coordinates) {
5151
public MultiPolygon(@Nullable final CoordinateReferenceSystem coordinateReferenceSystem, final List<PolygonCoordinates> coordinates) {
5252
super(coordinateReferenceSystem);
5353
notNull("coordinates", coordinates);
54-
isTrueArgument("coordinates has no null elements", !coordinates.contains(null));
54+
doesNotContainNull("coordinates", coordinates);
5555
this.coordinates = Collections.unmodifiableList(coordinates);
5656
}
5757

driver-core/src/main/com/mongodb/client/model/geojson/PolygonCoordinates.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Collections;
2121
import java.util.List;
2222

23+
import static com.mongodb.assertions.Assertions.doesNotContainNull;
2324
import static com.mongodb.assertions.Assertions.isTrueArgument;
2425
import static com.mongodb.assertions.Assertions.notNull;
2526

@@ -41,7 +42,7 @@ public final class PolygonCoordinates {
4142
@SafeVarargs
4243
public PolygonCoordinates(final List<Position> exterior, final List<Position>... holes) {
4344
notNull("exteriorRing", exterior);
44-
isTrueArgument("ring contains only non-null positions", !exterior.contains(null));
45+
doesNotContainNull("exterior", exterior);
4546
isTrueArgument("ring must contain at least four positions", exterior.size() >= 4);
4647
isTrueArgument("first and last position must be the same", exterior.get(0).equals(exterior.get(exterior.size() - 1)));
4748

@@ -50,7 +51,7 @@ public PolygonCoordinates(final List<Position> exterior, final List<Position>...
5051
List<List<Position>> holesList = new ArrayList<List<Position>>(holes.length);
5152
for (List<Position> hole : holes) {
5253
notNull("interiorRing", hole);
53-
isTrueArgument("ring contains only non-null positions", !hole.contains(null));
54+
doesNotContainNull("hole", hole);
5455
isTrueArgument("ring must contain at least four positions", hole.size() >= 4);
5556
isTrueArgument("first and last position must be the same", hole.get(0).equals(hole.get(hole.size() - 1)));
5657
holesList.add(Collections.unmodifiableList(hole));

driver-core/src/main/com/mongodb/client/model/geojson/Position.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Collections;
2323
import java.util.List;
2424

25+
import static com.mongodb.assertions.Assertions.doesNotContainNull;
2526
import static com.mongodb.assertions.Assertions.isTrueArgument;
2627
import static com.mongodb.assertions.Assertions.notNull;
2728

@@ -41,7 +42,7 @@ public final class Position {
4142
*/
4243
public Position(final List<Double> values) {
4344
notNull("values", values);
44-
isTrueArgument("value contains only non-null elements", !values.contains(null));
45+
doesNotContainNull("values", values);
4546
isTrueArgument("value must contain at least two elements", values.size() >= 2);
4647
this.values = Collections.unmodifiableList(values);
4748
}

0 commit comments

Comments
 (0)