From b7334823678f3888a1c9b773b9ee9a81984d1dc3 Mon Sep 17 00:00:00 2001 From: Cameron Fieber Date: Wed, 23 Sep 2015 08:35:05 -0700 Subject: [PATCH] fixes NullPointerException when handling a List with a null item --- .../aws/SpectatorRequestMetricCollector.java | 20 +++++++++++++++++-- .../SpectatorRequestMetricCollectorTest.java | 9 +++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/spectator-ext-aws/src/main/java/com/netflix/spectator/aws/SpectatorRequestMetricCollector.java b/spectator-ext-aws/src/main/java/com/netflix/spectator/aws/SpectatorRequestMetricCollector.java index b67538afc..467a7edbb 100644 --- a/spectator-ext-aws/src/main/java/com/netflix/spectator/aws/SpectatorRequestMetricCollector.java +++ b/spectator-ext-aws/src/main/java/com/netflix/spectator/aws/SpectatorRequestMetricCollector.java @@ -153,8 +153,24 @@ private static Optional> notEmpty(List properties) { return Optional.ofNullable(properties).filter(v -> !v.isEmpty()); } - private static Optional firstValue(List properties, Function transform) { - return notEmpty(properties).map(v -> transform.apply(v.get(0))); + /** + * Extracts and transforms the first item from a list. + * + * @param properties + * The list of properties to filter, may be null or empty + * @param transform + * The transform to apply to the extracted list item. The + * transform is only applied if the list contains a non-null + * item at index 0. + * @param + * The transform return type + * @return + * The transformed value, or Optional.empty() if there is no + * non-null item at index 0 of the list. + */ + //VisibleForTesting + static Optional firstValue(List properties, Function transform) { + return notEmpty(properties).map(v -> v.get(0)).map(transform::apply); } private static boolean isError(AWSRequestMetrics metrics) { diff --git a/spectator-ext-aws/src/test/java/com/netflix/spectator/aws/SpectatorRequestMetricCollectorTest.java b/spectator-ext-aws/src/test/java/com/netflix/spectator/aws/SpectatorRequestMetricCollectorTest.java index 5424eb555..71ee735b2 100644 --- a/spectator-ext-aws/src/test/java/com/netflix/spectator/aws/SpectatorRequestMetricCollectorTest.java +++ b/spectator-ext-aws/src/test/java/com/netflix/spectator/aws/SpectatorRequestMetricCollectorTest.java @@ -29,6 +29,7 @@ import java.net.URI; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -88,4 +89,12 @@ public void testMetricCollection() { assertTrue(expectedCounter.isPresent()); assertEquals(12345L, expectedCounter.get().count()); } + + @Test + public void testListFiltering() { + assertEquals(Optional.empty(), SpectatorRequestMetricCollector.firstValue(null, Object::toString)); + assertEquals(Optional.empty(), SpectatorRequestMetricCollector.firstValue(Collections.emptyList(), Object::toString)); + assertEquals(Optional.of("1"), SpectatorRequestMetricCollector.firstValue(Collections.singletonList(1L), Object::toString)); + assertEquals(Optional.empty(), SpectatorRequestMetricCollector.firstValue(Collections.singletonList(null), Object::toString)); + } } \ No newline at end of file