From f73afd4d875af402942bee1cb9fceea0b9168551 Mon Sep 17 00:00:00 2001 From: Eric Bussieres Date: Sun, 17 May 2020 17:53:31 -0400 Subject: [PATCH] #512: Add beans access for reactive app --- .../PebbleServletWebConfiguration.java | 4 +-- .../pebble/boot/Controllers.java | 5 ++++ .../com/mitchellbosecke/pebble/boot/Foo.java | 9 +++++++ .../boot/autoconfigure/ReactiveAppTest.java | 11 ++++++++ .../boot/autoconfigure/ServletAppTest.java | 8 ++++++ .../src/test/resources/templates/beans.pebble | 1 + .../spring/reactive/PebbleReactiveView.java | 26 ++++++++++++------- .../reactive/PebbleReactiveViewResolver.java | 5 ---- .../spring/servlet/PebbleViewResolver.java | 12 +++------ .../pebble/spring/config/MVCConfig.java | 3 +-- 10 files changed, 55 insertions(+), 29 deletions(-) create mode 100644 pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Foo.java create mode 100644 pebble-spring/pebble-spring-boot-starter/src/test/resources/templates/beans.pebble diff --git a/pebble-spring/pebble-spring-boot-starter/src/main/java/com/mitchellbosecke/pebble/boot/autoconfigure/PebbleServletWebConfiguration.java b/pebble-spring/pebble-spring-boot-starter/src/main/java/com/mitchellbosecke/pebble/boot/autoconfigure/PebbleServletWebConfiguration.java index 9cf619577..122cdb680 100644 --- a/pebble-spring/pebble-spring-boot-starter/src/main/java/com/mitchellbosecke/pebble/boot/autoconfigure/PebbleServletWebConfiguration.java +++ b/pebble-spring/pebble-spring-boot-starter/src/main/java/com/mitchellbosecke/pebble/boot/autoconfigure/PebbleServletWebConfiguration.java @@ -17,10 +17,8 @@ class PebbleServletWebConfiguration extends AbstractPebbleConfiguration { @ConditionalOnMissingBean(name = "pebbleViewResolver") PebbleViewResolver pebbleViewResolver(PebbleProperties properties, PebbleEngine pebbleEngine) { - PebbleViewResolver pvr = new PebbleViewResolver(); + PebbleViewResolver pvr = new PebbleViewResolver(pebbleEngine); properties.applyToMvcViewResolver(pvr); - - pvr.setPebbleEngine(pebbleEngine); if (pebbleEngine.getLoader() instanceof ClasspathLoader) { // classpathloader doesn't like leading slashes in paths pvr.setPrefix(this.stripLeadingSlash(properties.getPrefix())); diff --git a/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Controllers.java b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Controllers.java index 52eb0afa7..7dda78d98 100644 --- a/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Controllers.java +++ b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Controllers.java @@ -26,4 +26,9 @@ public String extensions() { return "extensions"; } + @RequestMapping("/beans.action") + public String beans() { + return "beans"; + } + } \ No newline at end of file diff --git a/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Foo.java b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Foo.java new file mode 100644 index 000000000..f45315082 --- /dev/null +++ b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/Foo.java @@ -0,0 +1,9 @@ +package com.mitchellbosecke.pebble.boot; + +import org.springframework.stereotype.Component; + +@Component +public class Foo { + + public String value = "bar"; +} diff --git a/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ReactiveAppTest.java b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ReactiveAppTest.java index 210b4624d..c58fd63da 100644 --- a/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ReactiveAppTest.java +++ b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ReactiveAppTest.java @@ -74,5 +74,16 @@ void testAdditionalExtensions() throws Exception { assertThat(result).isEqualTo("Hola Boot! Tested!"); } + + @Test + void testBeansAccess() throws Exception { + String result = this.client.get().uri("/beans.action").exchange() + .expectStatus().isOk() + .expectHeader().contentTypeCompatibleWith(MediaType.TEXT_HTML) + .expectBody(String.class) + .returnResult().getResponseBody(); + + assertThat(result).isEqualTo("beans:bar"); + } } diff --git a/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ServletAppTest.java b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ServletAppTest.java index 431142b23..67ebf0be3 100644 --- a/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ServletAppTest.java +++ b/pebble-spring/pebble-spring-boot-starter/src/test/java/com/mitchellbosecke/pebble/boot/autoconfigure/ServletAppTest.java @@ -70,4 +70,12 @@ void testAdditionalExtensions() throws Exception { .andExpect(content().string("Hola Boot! Tested!")); } + @Test + void testBeansAccess() throws Exception { + this.mockMvc.perform(get("/beans.action")) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_HTML)) + .andExpect(content().string("beans:bar")); + } + } diff --git a/pebble-spring/pebble-spring-boot-starter/src/test/resources/templates/beans.pebble b/pebble-spring/pebble-spring-boot-starter/src/test/resources/templates/beans.pebble new file mode 100644 index 000000000..c0a95852f --- /dev/null +++ b/pebble-spring/pebble-spring-boot-starter/src/test/resources/templates/beans.pebble @@ -0,0 +1 @@ +beans:{{beans.foo.value}} \ No newline at end of file diff --git a/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveView.java b/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveView.java index c0809e716..9a4edc469 100644 --- a/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveView.java +++ b/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveView.java @@ -1,9 +1,17 @@ package com.mitchellbosecke.pebble.spring.reactive; +import static java.util.Optional.ofNullable; + import com.mitchellbosecke.pebble.PebbleEngine; import com.mitchellbosecke.pebble.error.PebbleException; +import com.mitchellbosecke.pebble.spring.context.Beans; import com.mitchellbosecke.pebble.template.PebbleTemplate; - +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.Locale; +import java.util.Map; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferUtils; @@ -12,20 +20,13 @@ import org.springframework.util.MimeType; import org.springframework.web.reactive.result.view.AbstractUrlBasedView; import org.springframework.web.server.ServerWebExchange; - -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.nio.charset.Charset; -import java.util.Locale; -import java.util.Map; - -import static java.util.Optional.ofNullable; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public class PebbleReactiveView extends AbstractUrlBasedView { + private static final String BEANS_VARIABLE_NAME = "beans"; + private PebbleEngine pebbleEngine; private String templateName; @@ -47,6 +48,7 @@ protected Mono renderInternal(Map renderAttributes, try { Charset charset = this.getCharset(contentType); Writer writer = new OutputStreamWriter(dataBuffer.asOutputStream(), charset); + this.addVariablesToModel(renderAttributes); this.evaluateTemplate(renderAttributes, locale, writer); } catch (Exception ex) { DataBufferUtils.release(dataBuffer); @@ -55,6 +57,10 @@ protected Mono renderInternal(Map renderAttributes, return exchange.getResponse().writeWith(Flux.just(dataBuffer)); } + private void addVariablesToModel(Map model) { + model.put(BEANS_VARIABLE_NAME, new Beans(this.getApplicationContext())); + } + private Charset getCharset(@Nullable MediaType mediaType) { return ofNullable(mediaType) .map(MimeType::getCharset) diff --git a/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveViewResolver.java b/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveViewResolver.java index 138e7ae73..3f4a4734d 100644 --- a/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveViewResolver.java +++ b/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/reactive/PebbleReactiveViewResolver.java @@ -1,7 +1,6 @@ package com.mitchellbosecke.pebble.spring.reactive; import com.mitchellbosecke.pebble.PebbleEngine; - import org.springframework.web.reactive.result.view.AbstractUrlBasedView; import org.springframework.web.reactive.result.view.UrlBasedViewResolver; @@ -27,8 +26,4 @@ protected AbstractUrlBasedView createView(String viewName) { protected Class requiredViewClass() { return PebbleReactiveView.class; } - - public PebbleEngine getPebbleEngine() { - return this.pebbleEngine; - } } diff --git a/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/servlet/PebbleViewResolver.java b/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/servlet/PebbleViewResolver.java index 0b7a66f44..01271123d 100644 --- a/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/servlet/PebbleViewResolver.java +++ b/pebble-spring/pebble-spring5/src/main/java/com/mitchellbosecke/pebble/spring/servlet/PebbleViewResolver.java @@ -8,18 +8,17 @@ import com.mitchellbosecke.pebble.PebbleEngine; import com.mitchellbosecke.pebble.loader.Loader; - import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Required; import org.springframework.web.servlet.view.AbstractTemplateViewResolver; import org.springframework.web.servlet.view.AbstractUrlBasedView; public class PebbleViewResolver extends AbstractTemplateViewResolver implements InitializingBean { private String characterEncoding = "UTF-8"; - private PebbleEngine pebbleEngine; + private final PebbleEngine pebbleEngine; - public PebbleViewResolver() { + public PebbleViewResolver(PebbleEngine pebbleEngine) { + this.pebbleEngine = pebbleEngine; this.setViewClass(this.requiredViewClass()); } @@ -34,11 +33,6 @@ public void setCharacterEncoding(String characterEncoding) { this.characterEncoding = characterEncoding; } - @Required - public void setPebbleEngine(PebbleEngine pebbleEngine) { - this.pebbleEngine = pebbleEngine; - } - @Override protected AbstractUrlBasedView buildView(String viewName) throws Exception { PebbleView view = (PebbleView) super.buildView(viewName); diff --git a/pebble-spring/pebble-spring5/src/test/java/com/mitchellbosecke/pebble/spring/config/MVCConfig.java b/pebble-spring/pebble-spring5/src/test/java/com/mitchellbosecke/pebble/spring/config/MVCConfig.java index 56d3a6615..10122412e 100644 --- a/pebble-spring/pebble-spring5/src/test/java/com/mitchellbosecke/pebble/spring/config/MVCConfig.java +++ b/pebble-spring/pebble-spring5/src/test/java/com/mitchellbosecke/pebble/spring/config/MVCConfig.java @@ -61,10 +61,9 @@ public Loader templateLoader() { @Bean public ViewResolver viewResolver(PebbleEngine pebbleEngine) { - PebbleViewResolver viewResolver = new PebbleViewResolver(); + PebbleViewResolver viewResolver = new PebbleViewResolver(pebbleEngine); viewResolver.setPrefix("com/mitchellbosecke/pebble/spring/template/"); viewResolver.setSuffix(".html"); - viewResolver.setPebbleEngine(pebbleEngine); viewResolver.setContentType("text/html"); return viewResolver; }