Commit 4398c71d authored by Andy Wilkinson's avatar Andy Wilkinson

Merge branch '2.3.x'

Closes gh-22938
parents 81ae24e5 8c4e6f76
...@@ -19,7 +19,6 @@ package org.springframework.boot.autoconfigure.mustache; ...@@ -19,7 +19,6 @@ 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;
...@@ -36,6 +35,8 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En ...@@ -36,6 +35,8 @@ 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;
...@@ -43,49 +44,20 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En ...@@ -43,49 +44,20 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En
@Override @Override
public VariableFetcher createFetcher(Object ctx, String name) { public VariableFetcher createFetcher(Object ctx, String name) {
VariableFetcher nativeFetcher = super.createFetcher(ctx, name); VariableFetcher fetcher = super.createFetcher(ctx, name);
if (nativeFetcher != null) { if (fetcher != null) {
return new PropertyVariableFetcher(nativeFetcher); return fetcher;
} }
if (this.environment.containsProperty(name)) { if (this.environment.containsProperty(name)) {
return new PropertyVariableFetcher(); return this.propertyFetcher;
} }
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; ...@@ -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", "bar.name=Bar" }) @SpringBootTest(webEnvironment = WebEnvironment.NONE, properties = { "env.FOO=There", "foo=World" })
class MustacheStandaloneIntegrationTests { class MustacheStandaloneIntegrationTests {
@Autowired @Autowired
...@@ -60,53 +60,15 @@ class MustacheStandaloneIntegrationTests { ...@@ -60,53 +60,15 @@ 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;
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment