Skip to content

Commit

Permalink
Fix MustacheEnvironmentCollector to not ignore native fetcher
Browse files Browse the repository at this point in the history
When the context is a map (as it is in a web View for instance)
you can't assume a non-null fetcher actually contains the property
you are searching for. This change alters the logic so that the
native fetcher is always consulted if it exists, but there is
always a fallback.

Fixes gh-21045
  • Loading branch information
dsyer committed Apr 21, 2020
1 parent eeda0a0 commit b5f1bd4
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.samskivert.mustache.DefaultCollector;
import com.samskivert.mustache.Mustache.Collector;
import com.samskivert.mustache.Mustache.VariableFetcher;
import com.samskivert.mustache.Template;

import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.ConfigurableEnvironment;
Expand All @@ -35,8 +36,6 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En

private ConfigurableEnvironment environment;

private final VariableFetcher propertyFetcher = new PropertyVariableFetcher();

@Override
public void setEnvironment(Environment environment) {
this.environment = (ConfigurableEnvironment) environment;
Expand All @@ -46,18 +45,40 @@ public void setEnvironment(Environment environment) {
public VariableFetcher createFetcher(Object ctx, String name) {
VariableFetcher fetcher = super.createFetcher(ctx, name);
if (fetcher != null) {
return fetcher;
return new PropertyVariableFetcher(fetcher);
}
if (this.environment.containsProperty(name)) {
return this.propertyFetcher;
return new PropertyVariableFetcher();
}
return null;
}

private class PropertyVariableFetcher implements VariableFetcher {

private final VariableFetcher nativeFetcher;

PropertyVariableFetcher() {
this.nativeFetcher = null;
}

PropertyVariableFetcher(VariableFetcher nativeFetcher) {
this.nativeFetcher = nativeFetcher;
}

@Override
public Object get(Object ctx, String name) {
if (this.nativeFetcher != null) {
Object result;
try {
result = this.nativeFetcher.get(ctx, name);
if (result != null && result != Template.NO_FETCHER_FOUND) {
return result;
}
}
catch (Exception ex) {
// fall through
}
}
return MustacheEnvironmentCollector.this.environment.getProperty(name);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,23 @@ void environmentCollectorCompoundKeyStandard() {
.isEqualTo("Hello: There");
}

@Test
void environmentCollectorCompoundKeyStandardMap() {
assertThat(this.compiler.standardsMode(true).compile("Hello: {{env.foo}}")
.execute(Collections.singletonMap("world", "World"))).isEqualTo("Hello: There");
}

@Test
void environmentCollectorSimpleKey() {
assertThat(this.compiler.compile("Hello: {{foo}}").execute(new Object())).isEqualTo("Hello: World");
}

@Test
void environmentCollectorSimpleKeyMap() {
assertThat(this.compiler.compile("Hello: {{foo}}").execute(Collections.singletonMap("world", "Foo")))
.isEqualTo("Hello: World");
}

@Configuration(proxyBeanMethods = false)
@Import({ MustacheAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class })
static class Application {
Expand Down

0 comments on commit b5f1bd4

Please sign in to comment.