Polish 'Fix Mustache to not ignore native fetcher'

See gh-21060
pull/21793/head
Phillip Webb 5 years ago
parent 5199c11e37
commit ddbecf62b3

@ -43,9 +43,9 @@ 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 new PropertyVariableFetcher(fetcher);
VariableFetcher nativeFetcher = super.createFetcher(ctx, name);
if (nativeFetcher != null) {
return new PropertyVariableFetcher(nativeFetcher);
}
if (this.environment.containsProperty(name)) {
return new PropertyVariableFetcher();
@ -53,6 +53,9 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En
return null;
}
/**
* {@link VariableFetcher} that also checks the {@link Environment}.
*/
private class PropertyVariableFetcher implements VariableFetcher {
private final VariableFetcher nativeFetcher;
@ -61,29 +64,29 @@ public class MustacheEnvironmentCollector extends DefaultCollector implements En
this.nativeFetcher = null;
}
PropertyVariableFetcher(VariableFetcher nativeFetcher) {
this.nativeFetcher = nativeFetcher;
PropertyVariableFetcher(VariableFetcher delegate) {
this.nativeFetcher = delegate;
}
@Override
public Object get(Object ctx, String name) {
Object result;
if (this.nativeFetcher != null) {
try {
result = this.nativeFetcher.get(ctx, name);
if (result != null && result != Template.NO_FETCHER_FOUND) {
return result;
}
}
catch (Exception ex) {
// fall through
}
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;
}
result = MustacheEnvironmentCollector.this.environment.getProperty(name);
if (result == null) {
return Template.NO_FETCHER_FOUND;
catch (Exception ex) {
return null;
}
return result;
}
private Object getFromEnvironment(String name) {
return MustacheEnvironmentCollector.this.environment.getProperty(name);
}
}

@ -68,14 +68,14 @@ class MustacheStandaloneIntegrationTests {
@Test
void environmentCollectorCompoundKeyWithBean() {
assertThat(this.compiler.compile("Hello: {{foo.name}}")
.execute(Collections.singletonMap("foo", new Foo()))).isEqualTo("Hello: Foo");
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");
assertThat(this.compiler.compile("Hello: {{bar.name}}").execute(Collections.singletonMap("bar", new Foo())))
.isEqualTo("Hello: Bar");
}
@Test
@ -94,17 +94,19 @@ class MustacheStandaloneIntegrationTests {
static class Application {
}
static class Foo {
private String name = "Foo";
public String getName() {
return name;
String getName() {
return this.name;
}
public void setName(String name) {
void setName(String name) {
this.name = name;
}
}
}

Loading…
Cancel
Save