Merge pull request #21060 from dsyer
* pr/21060: Polish 'Fix Mustache to not ignore native fetcher' Fix Mustache to not ignore native fetcher Closes gh-21060
This commit is contained in:
commit
6547ea56f9
|
@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.mustache;
|
|||
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;
|
||||
|
@ -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;
|
||||
|
@ -44,20 +43,49 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En
|
|||
|
||||
@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);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
* @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
|
||||
|
@ -60,15 +60,53 @@ class MustacheStandaloneIntegrationTests {
|
|||
.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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue