diff --git a/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperPropertyDefaultsPostProcessor.java b/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperPropertyDefaultsPostProcessor.java new file mode 100644 index 0000000000..971be717c3 --- /dev/null +++ b/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperPropertyDefaultsPostProcessor.java @@ -0,0 +1,68 @@ +/* + * Copyright 2012-2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.developertools.autoconfigure; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.PropertySource; + +/** + * {@link BeanFactoryPostProcessor} to add properties that make sense when working + * locally. + * + * @author Phillip Webb + */ +class LocalDeveloperPropertyDefaultsPostProcessor implements BeanFactoryPostProcessor, + EnvironmentAware { + + private static final Map PROPERTIES; + static { + Map properties = new HashMap(); + properties.put("spring.thymeleaf.cache", "false"); + PROPERTIES = Collections.unmodifiableMap(properties); + } + + private Environment environment; + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) + throws BeansException { + if (this.environment instanceof ConfigurableEnvironment) { + postProcessEnvironment((ConfigurableEnvironment) this.environment); + } + } + + private void postProcessEnvironment(ConfigurableEnvironment environment) { + PropertySource propertySource = new MapPropertySource("refresh", PROPERTIES); + environment.getPropertySources().addFirst(propertySource); + } + +} diff --git a/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperToolsAutoConfiguration.java b/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperToolsAutoConfiguration.java new file mode 100644 index 0000000000..bf74e52b3e --- /dev/null +++ b/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperToolsAutoConfiguration.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.developertools.autoconfigure; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for local development support. + * + * @author Phillip Webb + * @since 1.3.0 + */ +@Configuration +public class LocalDeveloperToolsAutoConfiguration { + + @Bean + public static LocalDeveloperPropertyDefaultsPostProcessor localDeveloperPropertyDefaultsPostProcessor() { + return new LocalDeveloperPropertyDefaultsPostProcessor(); + } + +} diff --git a/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/package-info.java b/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/package-info.java new file mode 100644 index 0000000000..cb92f58568 --- /dev/null +++ b/spring-boot-developer-tools/src/main/java/org/springframework/boot/developertools/autoconfigure/package-info.java @@ -0,0 +1,21 @@ +/* + * Copyright 2012-2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Auto-configuration for {@code spring-boot-developer-tools}. + */ +package org.springframework.boot.developertools.autoconfigure; + diff --git a/spring-boot-developer-tools/src/main/resources/META-INF/spring.factories b/spring-boot-developer-tools/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..f8bcd39934 --- /dev/null +++ b/spring-boot-developer-tools/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configure +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.springframework.boot.developertools.autoconfigure.LocalDeveloperToolsAutoConfiguration diff --git a/spring-boot-developer-tools/src/test/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperToolsAutoConfigurationTests.java b/spring-boot-developer-tools/src/test/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperToolsAutoConfigurationTests.java new file mode 100644 index 0000000000..fecd38cb42 --- /dev/null +++ b/spring-boot-developer-tools/src/test/java/org/springframework/boot/developertools/autoconfigure/LocalDeveloperToolsAutoConfigurationTests.java @@ -0,0 +1,96 @@ +/* + * Copyright 2012-2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.developertools.autoconfigure; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.junit.After; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.util.SocketUtils; +import org.thymeleaf.templateresolver.TemplateResolver; + +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Tests for {@link LocalDeveloperToolsAutoConfiguration}. + * + * @author Phillip Webb + */ +public class LocalDeveloperToolsAutoConfigurationTests { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private int liveReloadPort = SocketUtils.findAvailableTcpPort(); + + private ConfigurableApplicationContext context; + + @After + public void cleanup() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void thymeleafCacheIsFalse() throws Exception { + this.context = initializeAndRun(Config.class); + TemplateResolver resolver = this.context.getBean(TemplateResolver.class); + resolver.initialize(); + assertThat(resolver.isCacheable(), equalTo(false)); + } + + private ConfigurableApplicationContext initializeAndRun(Class config) { + return initializeAndRun(config, Collections. emptyMap()); + } + + private ConfigurableApplicationContext initializeAndRun(Class config, + Map properties) { + SpringApplication application = new SpringApplication(config); + application.setDefaultProperties(getDefaultProperties(properties)); + application.setWebEnvironment(false); + ConfigurableApplicationContext context = application.run(); + return context; + } + + private Map getDefaultProperties( + Map specifiedProperties) { + Map properties = new HashMap(); + properties.put("spring.thymeleaf.check-template-location", false); + properties.put("spring.developertools.livereload.port", this.liveReloadPort); + properties.putAll(specifiedProperties); + return properties; + } + + @Configuration + @Import({ LocalDeveloperToolsAutoConfiguration.class, + ThymeleafAutoConfiguration.class }) + public static class Config { + + } + +}