From ddbecf62b3ed07422ab8863b12fd01b85c432180 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 8 Jun 2020 11:06:01 -0700 Subject: [PATCH] Polish 'Fix Mustache to not ignore native fetcher' See gh-21060 --- .../MustacheEnvironmentCollector.java | 43 ++++++++++--------- .../MustacheStandaloneIntegrationTests.java | 18 ++++---- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheEnvironmentCollector.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheEnvironmentCollector.java index 1abe4e3a57..c9d0cebfbd 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheEnvironmentCollector.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheEnvironmentCollector.java @@ -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); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/MustacheStandaloneIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/MustacheStandaloneIntegrationTests.java index 620fe0efb2..7c1efa729c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/MustacheStandaloneIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/MustacheStandaloneIntegrationTests.java @@ -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; } + } }