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 17e7c5bfb54..2dff6de83b2 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -108,7 +108,13 @@ public class MustacheViewResolver extends UrlBasedViewResolver { } private Template createTemplate(Resource resource) throws IOException { - return this.compiler.compile(getReader(resource)); + Reader reader = getReader(resource); + try { + return this.compiler.compile(reader); + } + finally { + reader.close(); + } } private Reader getReader(Resource resource) throws IOException { 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 8c3955d3e3c..7ed58b45448 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,14 @@ package org.springframework.boot.autoconfigure.mustache.web; +import java.io.InputStream; import java.util.Locale; +import org.fusesource.hawtbuf.ByteArrayInputStream; import org.junit.Before; import org.junit.Test; +import org.springframework.core.io.Resource; import org.springframework.mock.web.MockServletContext; import org.springframework.web.context.support.StaticWebApplicationContext; import org.springframework.web.servlet.View; @@ -29,11 +32,16 @@ import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; /** * Tests for {@link MustacheViewResolver}. * * @author Dave Syer + * @author Andy Wilkinson */ public class MustacheViewResolverTests { @@ -85,4 +93,24 @@ public class MustacheViewResolverTests { } + @Test + public void templateResourceInputStreamIsClosed() throws Exception { + final Resource resource = mock(Resource.class); + given(resource.exists()).willReturn(true); + InputStream inputStream = new ByteArrayInputStream(new byte[0]); + InputStream spyInputStream = spy(inputStream); + given(resource.getInputStream()).willReturn(spyInputStream); + this.resolver = new MustacheViewResolver(); + this.resolver.setApplicationContext(new StaticWebApplicationContext() { + + @Override + public Resource getResource(String location) { + return resource; + } + + }); + this.resolver.loadView("foo", null); + verify(spyInputStream).close(); + } + }