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.DefaultCollector;
|
||||||
import com.samskivert.mustache.Mustache.Collector;
|
import com.samskivert.mustache.Mustache.Collector;
|
||||||
import com.samskivert.mustache.Mustache.VariableFetcher;
|
import com.samskivert.mustache.Mustache.VariableFetcher;
|
||||||
|
import com.samskivert.mustache.Template;
|
||||||
|
|
||||||
import org.springframework.context.EnvironmentAware;
|
import org.springframework.context.EnvironmentAware;
|
||||||
import org.springframework.core.env.ConfigurableEnvironment;
|
import org.springframework.core.env.ConfigurableEnvironment;
|
||||||
|
@ -35,8 +36,6 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En
|
||||||
|
|
||||||
private ConfigurableEnvironment environment;
|
private ConfigurableEnvironment environment;
|
||||||
|
|
||||||
private final VariableFetcher propertyFetcher = new PropertyVariableFetcher();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setEnvironment(Environment environment) {
|
public void setEnvironment(Environment environment) {
|
||||||
this.environment = (ConfigurableEnvironment) environment;
|
this.environment = (ConfigurableEnvironment) environment;
|
||||||
|
@ -44,20 +43,49 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VariableFetcher createFetcher(Object ctx, String name) {
|
public VariableFetcher createFetcher(Object ctx, String name) {
|
||||||
VariableFetcher fetcher = super.createFetcher(ctx, name);
|
VariableFetcher nativeFetcher = super.createFetcher(ctx, name);
|
||||||
if (fetcher != null) {
|
if (nativeFetcher != null) {
|
||||||
return fetcher;
|
return new PropertyVariableFetcher(nativeFetcher);
|
||||||
}
|
}
|
||||||
if (this.environment.containsProperty(name)) {
|
if (this.environment.containsProperty(name)) {
|
||||||
return this.propertyFetcher;
|
return new PropertyVariableFetcher();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link VariableFetcher} that also checks the {@link Environment}.
|
||||||
|
*/
|
||||||
private class PropertyVariableFetcher implements VariableFetcher {
|
private class PropertyVariableFetcher implements VariableFetcher {
|
||||||
|
|
||||||
|
private final VariableFetcher nativeFetcher;
|
||||||
|
|
||||||
|
PropertyVariableFetcher() {
|
||||||
|
this.nativeFetcher = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyVariableFetcher(VariableFetcher delegate) {
|
||||||
|
this.nativeFetcher = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object get(Object ctx, String name) {
|
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);
|
return MustacheEnvironmentCollector.this.environment.getProperty(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
* @author Dave Syer
|
* @author Dave Syer
|
||||||
*/
|
*/
|
||||||
@DirtiesContext
|
@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 {
|
class MustacheStandaloneIntegrationTests {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
@ -60,15 +60,53 @@ class MustacheStandaloneIntegrationTests {
|
||||||
.isEqualTo("Hello: There");
|
.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
|
@Test
|
||||||
void environmentCollectorSimpleKey() {
|
void environmentCollectorSimpleKey() {
|
||||||
assertThat(this.compiler.compile("Hello: {{foo}}").execute(new Object())).isEqualTo("Hello: World");
|
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)
|
@Configuration(proxyBeanMethods = false)
|
||||||
@Import({ MustacheAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class })
|
@Import({ MustacheAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class })
|
||||||
static class Application {
|
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