diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java index 059ffa9e0e..ebaa9d55cf 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java @@ -183,7 +183,7 @@ public class AuthenticationManagerConfiguration { ReflectionUtils.makeAccessible(field); ReflectionUtils.setField(field, target, value); } - catch (Exception e) { + catch (Exception ex) { logger.info("Could not set " + name); } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/MultipartProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/MultipartProperties.java index c1e15fc9ac..eba3f97821 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/MultipartProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/MultipartProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * 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. @@ -50,6 +50,11 @@ import org.springframework.util.StringUtils; @ConfigurationProperties(prefix = "multipart", ignoreUnknownFields = false) public class MultipartProperties { + /** + * Enable multipart upload handling. + */ + private boolean enabled; + /** * Intermediate location of uploaded files. */ @@ -73,32 +78,40 @@ public class MultipartProperties { */ private String fileSizeThreshold = "0"; - public String getMaxFileSize() { - return this.maxFileSize; + public boolean getEnabled() { + return this.enabled; } - public String getMaxRequestSize() { - return this.maxRequestSize; - } - - public String getFileSizeThreshold() { - return this.fileSizeThreshold; + public void setEnabled(boolean enabled) { + this.enabled = enabled; } public String getLocation() { return this.location; } + public void setLocation(String location) { + this.location = location; + } + + public String getMaxFileSize() { + return this.maxFileSize; + } + public void setMaxFileSize(String maxFileSize) { this.maxFileSize = maxFileSize; } + public String getMaxRequestSize() { + return this.maxRequestSize; + } + public void setMaxRequestSize(String maxRequestSize) { this.maxRequestSize = maxRequestSize; } - public void setLocation(String location) { - this.location = location; + public String getFileSizeThreshold() { + return this.fileSizeThreshold; } public void setFileSizeThreshold(String fileSizeThreshold) { diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/MultipartAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/MultipartAutoConfigurationTests.java index 307dde8ed9..1b7deeaafb 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/MultipartAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/MultipartAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * 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. @@ -17,6 +17,8 @@ package org.springframework.boot.autoconfigure.web; import java.net.URI; +import java.util.LinkedHashMap; +import java.util.Map; import javax.servlet.MultipartConfigElement; @@ -24,14 +26,16 @@ import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext; import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.core.env.PropertySource; +import org.springframework.core.env.MapPropertySource; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpRequest; @@ -196,22 +200,27 @@ public class MultipartAutoConfigurationTests { @Test public void containerWithMultipartConfigDisabled() { + testContainerWithCustomMultipartConfigEnabledSetting("false", 0); + } + @Test + public void containerWithMultipartConfigEnabled() { + testContainerWithCustomMultipartConfigEnabledSetting("true", 1); + } + + private void testContainerWithCustomMultipartConfigEnabledSetting( + final String propertyValue, int expectedNumberOfMultipartConfigElementBeans) { this.context = new AnnotationConfigEmbeddedWebApplicationContext(); - this.context.getEnvironment().getPropertySources() - .addFirst(new PropertySource("test") { - @Override - public Object getProperty(String name) { - if (name.toLowerCase().contains("multipart.enabled")) { - return "false"; - } - return null; - } - }); + Map poperties = new LinkedHashMap(); + poperties.put("multipart.enabled", propertyValue); + MapPropertySource propertySource = new MapPropertySource("test", poperties); + this.context.getEnvironment().getPropertySources().addFirst(propertySource); this.context.register(ContainerWithNoMultipartTomcat.class, BaseConfiguration.class); this.context.refresh(); - assertEquals(0, this.context.getBeansOfType(MultipartConfigElement.class).size()); + this.context.getBean(MultipartProperties.class); + assertEquals(expectedNumberOfMultipartConfigElementBeans, this.context + .getBeansOfType(MultipartConfigElement.class).size()); } @Test @@ -245,8 +254,12 @@ public class MultipartAutoConfigurationTests { @Import({ EmbeddedServletContainerAutoConfiguration.class, DispatcherServletAutoConfiguration.class, MultipartAutoConfiguration.class, ServerPropertiesAutoConfiguration.class }) + @EnableConfigurationProperties(MultipartProperties.class) protected static class BaseConfiguration { + @Autowired + private MultipartProperties properties; + @Bean public ServerProperties serverProperties() { ServerProperties properties = new ServerProperties(); diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index ec19fae62a..ffdccee48e 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -53,7 +53,7 @@ content into your application; rather pick only the properties that you need. spring.output.ansi.enabled=detect # Configure the ANSI output ("detect", "always", "never") # LOGGING - logging.path=/var/logs + logging.path=/var/log logging.file=myapp.log logging.config= # location of config file (default classpath:logback.xml for logback) logging.level.*= # levels for loggers, e.g. "logging.level.org.springframework=DEBUG" (TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF) diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java index 240befd11a..7216110841 100644 --- a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java +++ b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java @@ -213,11 +213,9 @@ public class RepackageMojo extends AbstractDependencyFilterMojo { if (classifier.length() > 0 && !classifier.startsWith("-")) { classifier = "-" + classifier; } - if (!this.outputDirectory.exists()) { this.outputDirectory.mkdirs(); } - return new File(this.outputDirectory, this.finalName + classifier + "." + this.project.getArtifact().getArtifactHandler().getExtension()); } diff --git a/spring-boot/src/main/java/org/springframework/boot/cloudfoundry/VcapApplicationListener.java b/spring-boot/src/main/java/org/springframework/boot/cloudfoundry/VcapApplicationListener.java index 8043b3c02d..8144c8f467 100644 --- a/spring-boot/src/main/java/org/springframework/boot/cloudfoundry/VcapApplicationListener.java +++ b/spring-boot/src/main/java/org/springframework/boot/cloudfoundry/VcapApplicationListener.java @@ -193,41 +193,34 @@ public class VcapApplicationListener implements } } + @SuppressWarnings("unchecked") private void flatten(Properties properties, Map input, String path) { for (Entry entry : input.entrySet()) { - String key = entry.getKey(); - if (StringUtils.hasText(path)) { - if (key.startsWith("[")) { - key = path + key; - } - else { - key = path + "." + key; + String key = getFullKey(path, entry.getKey()); + Object value = entry.getValue(); + if (value instanceof Map) { + // Need a compound key + flatten(properties, (Map) value, key); + } + else if (value instanceof Collection) { + // Need a compound key + Collection collection = (Collection) value; + properties.put(key, + StringUtils.collectionToCommaDelimitedString(collection)); + int count = 0; + for (Object item : collection) { + String itemKey = "[" + (count++) + "]"; + flatten(properties, Collections.singletonMap(itemKey, item), key); } } - Object value = entry.getValue(); - if (value instanceof String) { + else if (value instanceof String) { properties.put(key, value); } else if (value instanceof Number) { properties.put(key, value.toString()); } - else if (value instanceof Map) { - // Need a compound key - @SuppressWarnings("unchecked") - Map map = (Map) value; - flatten(properties, map, key); - } - else if (value instanceof Collection) { - // Need a compound key - @SuppressWarnings("unchecked") - Collection collection = (Collection) value; - properties.put(key, - StringUtils.collectionToCommaDelimitedString(collection)); - int count = 0; - for (Object object : collection) { - flatten(properties, - Collections.singletonMap("[" + (count++) + "]", object), key); - } + else if (value instanceof Boolean) { + properties.put(key, value.toString()); } else { properties.put(key, value == null ? "" : value); @@ -235,4 +228,14 @@ public class VcapApplicationListener implements } } + private String getFullKey(String path, String key) { + if (!StringUtils.hasText(path)) { + return key; + } + if (key.startsWith("[")) { + return path + key; + } + return path + "." + key; + } + } diff --git a/spring-boot/src/test/java/org/springframework/boot/cloudfoundry/VcapApplicationListenerTests.java b/spring-boot/src/test/java/org/springframework/boot/cloudfoundry/VcapApplicationListenerTests.java index 6e1e9986d2..74b9a75c2f 100644 --- a/spring-boot/src/test/java/org/springframework/boot/cloudfoundry/VcapApplicationListenerTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/cloudfoundry/VcapApplicationListenerTests.java @@ -111,12 +111,15 @@ public class VcapApplicationListenerTests { + "\"plan\":\"10mb\",\"credentials\":{" + "\"name\":\"d04fb13d27d964c62b267bbba1cffb9da\"," + "\"hostname\":\"mysql-service-public.clqg2e2w3ecf.us-east-1.rds.amazonaws.com\"," + + "\"ssl\":true,\"location\":null," + "\"host\":\"mysql-service-public.clqg2e2w3ecf.us-east-1.rds.amazonaws.com\"," + "\"port\":3306,\"user\":\"urpRuqTf8Cpe6\",\"username\":" + "\"urpRuqTf8Cpe6\",\"password\":\"pxLsGVpsC9A5S\"}}]}"); this.initializer.onApplicationEvent(this.event); assertEquals("mysql", getProperty("vcap.services.mysql.name")); assertEquals("3306", getProperty("vcap.services.mysql.credentials.port")); + assertEquals("true", getProperty("vcap.services.mysql.credentials.ssl")); + assertEquals("", getProperty("vcap.services.mysql.credentials.location")); } @Test