Skip to content

Commit 87e0336

Browse files
authored
Merge pull request #1148 from HubSpot/fix-no-such-element
Fix no such element issue.
2 parents 88e1449 + 3b400c5 commit 87e0336

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

src/main/java/com/hubspot/jinjava/el/ext/CollectionMembershipOperator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public Object apply(TypeConverter converter, Object o1, Object o2) {
4848

4949
if (Map.class.isAssignableFrom(o2.getClass())) {
5050
Map map = (Map) o2;
51-
if (map.isEmpty()) {
51+
// An implementation of Map can override isEmpty() to false, but return empty keySet.
52+
if (map.isEmpty() || map.keySet().isEmpty()) {
5253
return Boolean.FALSE;
5354
}
5455
Iterator iterator = map.keySet().iterator();

src/test/java/com/hubspot/jinjava/el/ext/CollectionMembershipOperatorTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,34 @@
44

55
import com.hubspot.jinjava.Jinjava;
66
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
7+
import java.util.AbstractMap;
8+
import java.util.Collections;
79
import java.util.HashMap;
810
import java.util.Map;
11+
import java.util.Set;
912
import org.junit.Before;
1013
import org.junit.Test;
1114

1215
public class CollectionMembershipOperatorTest {
1316

17+
static class NoKeySetMap<K, V> extends AbstractMap<K, V> {
18+
19+
@Override
20+
public boolean isEmpty() {
21+
return false;
22+
}
23+
24+
@Override
25+
public Set<K> keySet() {
26+
return Collections.emptySet();
27+
}
28+
29+
@Override
30+
public Set<Entry<K, V>> entrySet() {
31+
return Collections.emptySet();
32+
}
33+
}
34+
1435
private JinjavaInterpreter interpreter;
1536

1637
@Before
@@ -49,4 +70,12 @@ public void itChecksIfDictionaryContainsNullKey() {
4970
assertThat(interpreter.resolveELExpression("null in map", -1)).isEqualTo(true);
5071
assertThat(interpreter.resolveELExpression("'b' in map", -1)).isEqualTo(false);
5172
}
73+
74+
@Test
75+
public void itCheckEmptyKeySet() {
76+
// The map is "not" empty, but keySet() is empty.
77+
Map<String, Object> map = new NoKeySetMap<>();
78+
interpreter.getContext().put("map", map);
79+
assertThat(interpreter.resolveELExpression("'a' in map", -1)).isEqualTo(false);
80+
}
5281
}

0 commit comments

Comments
 (0)