From a89139c06b34c4ff893528ac1d96eb7e818c4c42 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 30 Jun 2015 13:49:45 -0700 Subject: [PATCH 1/3] Allow case insensitive logging.level properties Fixes gh-3356 --- .../boot/logging/LoggingApplicationListener.java | 2 +- .../logging/LoggingApplicationListenerTests.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java index f62a040a491..6c7bfa44646 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java @@ -246,7 +246,7 @@ public class LoggingApplicationListener implements SmartApplicationListener { name = null; } level = environment.resolvePlaceholders(level); - system.setLogLevel(name, LogLevel.valueOf(level)); + system.setLogLevel(name, LogLevel.valueOf(level.toUpperCase())); } catch (RuntimeException ex) { this.logger.error("Cannot set level: " + level + " for '" + name + "'"); diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java index d2d1548b13b..7eceeb3dbb9 100644 --- a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java @@ -210,6 +210,18 @@ public class LoggingApplicationListenerTests { assertThat(this.outputCapture.toString(), containsString("testattrace")); } + @Test + public void parseLevelsCaseInsensitive() throws Exception { + EnvironmentTestUtils.addEnvironment(this.context, + "logging.level.org.springframework.boot=TrAcE"); + this.initializer.initialize(this.context.getEnvironment(), + this.context.getClassLoader()); + this.logger.debug("testatdebug"); + this.logger.trace("testattrace"); + assertThat(this.outputCapture.toString(), containsString("testatdebug")); + assertThat(this.outputCapture.toString(), containsString("testattrace")); + } + @Test public void parseLevelsWithPlaceholder() throws Exception { EnvironmentTestUtils.addEnvironment(this.context, "foo=TRACE", From 1ecc9c8a8b80a61e81f16672d94ab8a1d4c98382 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 30 Jun 2015 13:51:19 -0700 Subject: [PATCH 2/3] Upgrade to Spring Framework 4.1.7.RELEASE Fixes gh-3276 --- spring-boot-dependencies/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index e4afafbe7ad..d475f158b46 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -111,7 +111,7 @@ 1.14 4.7.2 0.7-groovy-2.0 - 4.1.7.BUILD-SNAPSHOT + 4.1.7.RELEASE 1.4.5.RELEASE 1.1.1.RELEASE 3.0.4.RELEASE @@ -1686,4 +1686,4 @@ integration-test - \ No newline at end of file + From 8ec10c84257d5565930d5f6a254c29f59b0f6a2c Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 30 Jun 2015 14:49:08 -0700 Subject: [PATCH 3/3] Use buildView() to create MustacheView Update MustacheViewResolver so that buildView() is called to create the MustacheView. This sets fields such as `contentType` and allows us to remove explicit setApplicationContext() and setServletContext() calls. Fixes gh-3265 --- .../mustache/web/MustacheView.java | 28 +++++++++- .../mustache/web/MustacheViewResolver.java | 51 +++++++++++-------- .../web/MustacheViewResolverTests.java | 12 ++++- 3 files changed, 68 insertions(+), 23 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheView.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheView.java index 8c2d72b273c..4d8b9ff0f4d 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheView.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheView.java @@ -30,20 +30,44 @@ import com.samskivert.mustache.Template; * Spring MVC {@link View} using the Mustache template engine. * * @author Dave Syer + * @author Phillip Webb * @since 1.2.2 */ public class MustacheView extends AbstractTemplateView { - private final Template template; + private Template template; + /** + * Create a new {@link MustacheView} instance. + * @see #setTemplate(Template) + * @since 1.2.5 + */ + public MustacheView() { + } + + /** + * Create a new {@link MustacheView} with the specified template. + * @param template the source template + */ public MustacheView(Template template) { this.template = template; } + /** + * Set the Mustache template that should actually be rendered. + * @param template the mustache template + * @since 1.2.5 + */ + public void setTemplate(Template template) { + this.template = template; + } + @Override protected void renderMergedTemplateModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { - this.template.execute(model, response.getWriter()); + if (this.template != null) { + this.template.execute(model, response.getWriter()); + } } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolver.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolver.java index 022c55c8cf8..da4a705ee40 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolver.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolver.java @@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.mustache.web; import java.io.IOException; import java.io.InputStreamReader; +import java.io.Reader; import java.util.Locale; import org.springframework.beans.propertyeditors.LocaleEditor; @@ -35,6 +36,7 @@ import com.samskivert.mustache.Template; * * @author Dave Syer * @author Andy Wilkinson + * @author Phillip Webb * @since 1.2.2 */ public class MustacheViewResolver extends UrlBasedViewResolver { @@ -44,7 +46,12 @@ public class MustacheViewResolver extends UrlBasedViewResolver { private String charset; public MustacheViewResolver() { - setViewClass(MustacheView.class); + setViewClass(requiredViewClass()); + } + + @Override + protected Class requiredViewClass() { + return MustacheView.class; } /** @@ -67,31 +74,15 @@ public class MustacheViewResolver extends UrlBasedViewResolver { if (resource == null) { return null; } - MustacheView view = new MustacheView(createTemplate(resource)); - view.setApplicationContext(getApplicationContext()); - view.setServletContext(getServletContext()); - return view; - } - - private Template createTemplate(Resource resource) throws IOException { - return this.charset == null ? this.compiler.compile(new InputStreamReader( - resource.getInputStream())) : this.compiler - .compile(new InputStreamReader(resource.getInputStream(), this.charset)); + MustacheView mustacheView = (MustacheView) super.loadView(viewName, locale); + mustacheView.setTemplate(createTemplate(resource)); + return mustacheView; } private Resource resolveResource(String viewName, Locale locale) { return resolveFromLocale(viewName, getLocale(locale)); } - private String getLocale(Locale locale) { - if (locale == null) { - return ""; - } - LocaleEditor localeEditor = new LocaleEditor(); - localeEditor.setValue(locale); - return "_" + localeEditor.getAsText(); - } - private Resource resolveFromLocale(String viewName, String locale) { Resource resource = getApplicationContext().getResource( getPrefix() + viewName + locale + getSuffix()); @@ -105,4 +96,24 @@ public class MustacheViewResolver extends UrlBasedViewResolver { return resource; } + private String getLocale(Locale locale) { + if (locale == null) { + return ""; + } + LocaleEditor localeEditor = new LocaleEditor(); + localeEditor.setValue(locale); + return "_" + localeEditor.getAsText(); + } + + private Template createTemplate(Resource resource) throws IOException { + return this.compiler.compile(getReader(resource)); + } + + private Reader getReader(Resource resource) throws IOException { + if (this.charset != null) { + return new InputStreamReader(resource.getInputStream(), this.charset); + } + return new InputStreamReader(resource.getInputStream()); + } + } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolverTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolverTests.java index 8df86ea06d4..2d065f20eba 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolverTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/web/MustacheViewResolverTests.java @@ -20,12 +20,14 @@ import java.util.Locale; import org.junit.Before; import org.junit.Test; -import org.springframework.boot.autoconfigure.mustache.web.MustacheViewResolver; import org.springframework.mock.web.MockServletContext; import org.springframework.web.context.support.StaticWebApplicationContext; +import org.springframework.web.servlet.View; +import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; /** * Tests for {@link MustacheViewResolver}. @@ -74,4 +76,12 @@ public class MustacheViewResolverTests { assertNotNull(this.resolver.resolveViewName("foo", new Locale("de"))); } + @Test + public void setsContentType() throws Exception { + this.resolver.setContentType("application/octet-stream"); + View view = this.resolver.resolveViewName("foo", null); + assertThat(view.getContentType(), equalTo("application/octet-stream")); + + } + }