Skip to content

Commit

Permalink
Merge pull request #21060 from dsyer
Browse files Browse the repository at this point in the history
* pr/21060:
  Polish 'Fix Mustache to not ignore native fetcher'
  Fix Mustache to not ignore native fetcher

Closes gh-21060
  • Loading branch information
philwebb committed Jun 8, 2020
2 parents e9e4a34 + ddbecf6 commit 6547ea5
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 7 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,29 +36,56 @@ 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;
}

@Override
public VariableFetcher createFetcher(Object ctx, String name) {
VariableFetcher fetcher = super.createFetcher(ctx, name);
if (fetcher != null) {
return fetcher;
VariableFetcher nativeFetcher = super.createFetcher(ctx, name);
if (nativeFetcher != null) {
return new PropertyVariableFetcher(nativeFetcher);
}
if (this.environment.containsProperty(name)) {
return this.propertyFetcher;
return new PropertyVariableFetcher();
}
return null;
}

/**
* {@link VariableFetcher} that also checks the {@link Environment}.
*/
private class PropertyVariableFetcher implements VariableFetcher {

private final VariableFetcher nativeFetcher;

PropertyVariableFetcher() {
this.nativeFetcher = null;
}

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

@Override
public Object get(Object ctx, String name) {
Object result = getFromNativeFetcher(ctx, name);
result = (result != null) ? result : getFromEnvironment(name);
return (result != null) ? result : Template.NO_FETCHER_FOUND;
}

private Object getFromNativeFetcher(Object ctx, String name) {
try {
Object result = (this.nativeFetcher != null) ? this.nativeFetcher.get(ctx, name) : null;
return (result != Template.NO_FETCHER_FOUND) ? result : null;
}
catch (Exception ex) {
return null;
}
}

private Object getFromEnvironment(String name) {
return MustacheEnvironmentCollector.this.environment.getProperty(name);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
* @author Dave Syer
*/
@DirtiesContext
@SpringBootTest(webEnvironment = WebEnvironment.NONE, properties = { "env.FOO=There", "foo=World" })
@SpringBootTest(webEnvironment = WebEnvironment.NONE, properties = { "env.FOO=There", "foo=World", "bar.name=Bar" })
class MustacheStandaloneIntegrationTests {

@Autowired
Expand All @@ -60,15 +60,53 @@ 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 environmentCollectorCompoundKeyWithBean() {
assertThat(this.compiler.compile("Hello: {{foo.name}}").execute(Collections.singletonMap("foo", new Foo())))
.isEqualTo("Hello: Foo");
}

@Test
void environmentCollectorCompoundKeyWithBeanPrefersEnvironment() {
assertThat(this.compiler.compile("Hello: {{bar.name}}").execute(Collections.singletonMap("bar", new Foo())))
.isEqualTo("Hello: Bar");
}

@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 {

}

static class Foo {

private String name = "Foo";

String getName() {
return this.name;
}

void setName(String name) {
this.name = name;
}

}

}

0 comments on commit 6547ea5

Please sign in to comment.