From 9bb842ed203d4e82147becd1e6ee7dc44267b961 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 15 Jun 2016 11:49:56 -0700 Subject: [PATCH] Special case 'entrySet' on Map fetcher. You can't normally reflectively access methods on Map because it has a special fetcher, but being able to reflectively access 'entrySet' is super useful when you want to iterate over the keys+values of a map, so we're going to hack it in there. Ha! --- src/main/java/com/samskivert/mustache/BasicCollector.java | 5 ++++- src/test/java/com/samskivert/mustache/SharedTests.java | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/samskivert/mustache/BasicCollector.java b/src/main/java/com/samskivert/mustache/BasicCollector.java index 0718917..ab760ab 100644 --- a/src/main/java/com/samskivert/mustache/BasicCollector.java +++ b/src/main/java/com/samskivert/mustache/BasicCollector.java @@ -71,7 +71,10 @@ public abstract class BasicCollector implements Mustache.Collector protected static final Mustache.VariableFetcher MAP_FETCHER = new Mustache.VariableFetcher() { public Object get (Object ctx, String name) throws Exception { Map map = (Map)ctx; - return map.containsKey(name) ? map.get(name) : Template.NO_FETCHER_FOUND; + if (map.containsKey(name)) return map.get(name); + // special case to allow map entry set to be iterated over + if (name == "entrySet") return map.entrySet(); + return Template.NO_FETCHER_FOUND; } @Override public String toString () { return "MAP_FETCHER"; diff --git a/src/test/java/com/samskivert/mustache/SharedTests.java b/src/test/java/com/samskivert/mustache/SharedTests.java index ca70583..6041685 100644 --- a/src/test/java/com/samskivert/mustache/SharedTests.java +++ b/src/test/java/com/samskivert/mustache/SharedTests.java @@ -70,6 +70,14 @@ public abstract class SharedTests extends GWTTestCase "foo", Arrays.asList(context("bar", "baz"), context("bar", "bif")))); } + @Test public void testMapEntriesSection () { + Map data = new HashMap(); + data.put("k1", "v1"); + data.put("k2", "v2"); + test("k1v1k2v2", "{{#map.entrySet}}{{key}}{{value}}{{/map.entrySet}}", + context("map", data)); + } + @Test public void testArraySection () { test("bazbif", "{{#foo}}{{bar}}{{/foo}}", context("foo", new Object[] { context("bar", "baz"), context("bar", "bif") }));