Skip to content

Commit efbc908

Browse files
author
Matthew Coley
committed
More gracefully handle null keys/values in map resolver
1 parent ddcc97d commit efbc908

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

src/main/java/com/hubspot/jinjava/el/TypeConvertingMapELResolver.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,18 @@ public Object getValue(ELContext context, Object base, Object property) {
2323

2424
if (base instanceof Map && !((Map) base).isEmpty()) {
2525
Iterator<?> iterator = ((Map) base).keySet().iterator();
26-
if (iterator.hasNext()) {
27-
Class<?> keyClass = iterator.next().getClass();
26+
Class<?> keyClass = null;
27+
while (iterator.hasNext()) {
28+
Object nextObject = iterator.next();
29+
if (nextObject != null) {
30+
keyClass = nextObject.getClass();
31+
break;
32+
}
33+
}
34+
35+
if (keyClass == null) {
36+
value = ((Map) base).get(property);
37+
} else {
2838
try {
2939
value = ((Map) base).get(TYPE_CONVERTER.convert(property, keyClass));
3040
if (value != null) {
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.hubspot.jinjava.el;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.google.common.collect.ImmutableMap;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
import org.junit.Before;
9+
import org.junit.Test;
10+
11+
public class TypeConvertingMapELResolverTest {
12+
private TypeConvertingMapELResolver typeConvertingMapELResolver;
13+
14+
@Before
15+
public void setup() {
16+
typeConvertingMapELResolver = new TypeConvertingMapELResolver(false);
17+
}
18+
19+
@Test
20+
public void itResolvesProperties() {
21+
Map<String, String> values = ImmutableMap.of("1", "value1", "2", "value2");
22+
assertThat(typeConvertingMapELResolver.getValue(new JinjavaELContext(), values, "2"))
23+
.isEqualTo("value2");
24+
}
25+
26+
@Test
27+
public void itConvertsPropertyClassWhenResolvingProperty() {
28+
Map<String, String> values = ImmutableMap.of("1", "value1", "2", "value2");
29+
assertThat(typeConvertingMapELResolver.getValue(new JinjavaELContext(), values, 1))
30+
.isEqualTo("value1");
31+
}
32+
33+
@Test
34+
public void itHandlesNullKeyValuesWhenResolvingProperty() {
35+
Map<String, String> values = new HashMap<>();
36+
values.put(null, "nullValue");
37+
values.put("1", "value1");
38+
values.put("2", "value2");
39+
assertThat(typeConvertingMapELResolver.getValue(new JinjavaELContext(), values, 1))
40+
.isEqualTo("value1");
41+
}
42+
43+
@Test
44+
public void itHandlesMapWithOnlyNullKey() {
45+
Map<String, String> values = new HashMap<>();
46+
values.put(null, "nullValue");
47+
assertThat(typeConvertingMapELResolver.getValue(new JinjavaELContext(), values, 1))
48+
.isEqualTo(null);
49+
}
50+
51+
@Test
52+
public void itResolvesNullPropertyValue() {
53+
Map<String, String> values = new HashMap<>();
54+
values.put(null, "nullValue");
55+
values.put("1", "value1");
56+
values.put("2", "value2");
57+
assertThat(typeConvertingMapELResolver.getValue(new JinjavaELContext(), values, null))
58+
.isEqualTo("nullValue");
59+
}
60+
}

0 commit comments

Comments
 (0)