Upgrade to Spring Boot 1.4.0.RELEASE

This commit upgrades to Spring Boot 1.4.0.RELEASE and bumps to Java8. It
also migrate the cache library from Guava to Caffeeine.

The git and build information are now exposed via the `info` endpoint.

Closes gh-251
This commit is contained in:
Stephane Nicoll
2016-06-09 13:17:31 +02:00
parent d018782726
commit af2ae44b8d
11 changed files with 69 additions and 137 deletions

View File

@@ -1,82 +0,0 @@
/*
* 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.
* 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 io.spring.initializr.actuate.stat
import java.nio.charset.StandardCharsets
import org.springframework.http.HttpRequest
import org.springframework.http.client.ClientHttpRequestExecution
import org.springframework.http.client.ClientHttpRequestInterceptor
import org.springframework.http.client.ClientHttpResponse
import org.springframework.http.client.InterceptingClientHttpRequestFactory
import org.springframework.util.Base64Utils
import org.springframework.web.client.RestTemplate
/**
* A simple {@link RestTemplate} extension that automatically provides the
* {@code Authorization} header if credentials are provided.
* <p>
* Largely inspired from Spring Boot's {@code TestRestTemplate}.
*
* @author Stephane Nicoll
* @since 1.0
*/
class BasicAuthRestTemplate extends RestTemplate {
/**
* Create a new instance. {@code username} and {@code password} can be
* {@code null} if no authentication is necessary.
*/
BasicAuthRestTemplate(String username, String password) {
addAuthentication(username, password)
}
private void addAuthentication(String username, String password) {
if (!username) {
return;
}
List<ClientHttpRequestInterceptor> interceptors = Collections
.<ClientHttpRequestInterceptor> singletonList(
new BasicAuthorizationInterceptor(username, password))
setRequestFactory(new InterceptingClientHttpRequestFactory(getRequestFactory(),
interceptors))
}
private static class BasicAuthorizationInterceptor
implements ClientHttpRequestInterceptor {
private final String username
private final String password
BasicAuthorizationInterceptor(String username, String password) {
this.username = username;
this.password = (password == null ? "" : password)
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
String token = Base64Utils.encodeToString(
(this.username + ":" + this.password).getBytes(StandardCharsets.UTF_8))
request.getHeaders().add("Authorization", "Basic " + token)
return execution.execute(request, body)
}
}
}

View File

@@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
import io.spring.initializr.generator.ProjectRequestEvent import io.spring.initializr.generator.ProjectRequestEvent
import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.context.event.EventListener import org.springframework.context.event.EventListener
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.http.RequestEntity import org.springframework.http.RequestEntity
@@ -51,8 +52,8 @@ class ProjectGenerationStatPublisher {
this.documentFactory = documentFactory this.documentFactory = documentFactory
this.statsProperties = statsProperties this.statsProperties = statsProperties
this.objectMapper = createObjectMapper() this.objectMapper = createObjectMapper()
this.restTemplate = new BasicAuthRestTemplate( this.restTemplate = new RestTemplateBuilder().basicAuthorization(
statsProperties.elastic.username, statsProperties.elastic.password) statsProperties.elastic.username, statsProperties.elastic.password).build()
this.retryTemplate = retryTemplate this.retryTemplate = retryTemplate
} }

View File

@@ -22,7 +22,7 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.SpringApplicationConfiguration import org.springframework.context.annotation.Import
import org.springframework.http.HttpHeaders import org.springframework.http.HttpHeaders
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.http.RequestEntity import org.springframework.http.RequestEntity
@@ -44,7 +44,7 @@ import static org.junit.Assert.fail
* *
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
@SpringApplicationConfiguration(StatsMockController.class) @Import(StatsMockController)
@ActiveProfiles(['test-default', 'test-custom-stats']) @ActiveProfiles(['test-default', 'test-custom-stats'])
class MainControllerStatsIntegrationTests extends AbstractInitializrControllerIntegrationTests { class MainControllerStatsIntegrationTests extends AbstractInitializrControllerIntegrationTests {

View File

@@ -83,6 +83,7 @@ class Dependency extends MetadataElement {
String repository String repository
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
int weight int weight
/** /**

View File

@@ -33,15 +33,43 @@
<groupId>org.codehaus.gmavenplus</groupId> <groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId> <artifactId>gmavenplus-plugin</artifactId>
</plugin> </plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
<generateGitPropertiesFile>true</generateGitPropertiesFile>
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<executions> <executions>
<execution> <execution>
<id>repackage</id>
<goals> <goals>
<goal>repackage</goal> <goal>repackage</goal>
</goals> </goals>
</execution> </execution>
<execution>
<id>build information</id>
<goals>
<goal>build-info</goal>
</goals>
<configuration>
<additionalProperties>
<versions.spring-boot>${spring.boot.version}</versions.spring-boot>
</additionalProperties>
</configuration>
</execution>
</executions> </executions>
</plugin> </plugin>
</plugins> </plugins>

View File

@@ -1,11 +1,3 @@
info:
project:
name: Spring Start
version: 0.4.0
# remember to update static/install.sh as well:
spring-boot:
version: 1.3.6.RELEASE
logging: logging:
level: level:
org.springframework.core.env: warn org.springframework.core.env: warn
@@ -17,6 +9,11 @@ server:
mime-types: application/json,text/css,text/html mime-types: application/json,text/css,text/html
min-response-size: 2048 min-response-size: 2048
spring:
jackson:
serialization:
write-dates-as-timestamps: false
initializr: initializr:
env: env:
boms: boms:
@@ -753,3 +750,4 @@ initializr:
- name: 1.1.12 - name: 1.1.12
id: 1.1.12.RELEASE id: 1.1.12.RELEASE
default: false default: false

View File

@@ -20,6 +20,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId> <artifactId>spring-boot-autoconfigure</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId> <artifactId>spring-webmvc</artifactId>
@@ -29,8 +33,8 @@
<artifactId>spring-hateoas</artifactId> <artifactId>spring-hateoas</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>guava</artifactId> <artifactId>caffeine</artifactId>
</dependency> </dependency>
<dependency> <dependency>

View File

@@ -18,7 +18,7 @@ package io.spring.initializr.web.autoconfigure
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import com.google.common.cache.CacheBuilder import com.github.benmanes.caffeine.cache.Caffeine
import io.spring.initializr.generator.ProjectGenerator import io.spring.initializr.generator.ProjectGenerator
import io.spring.initializr.generator.ProjectRequestPostProcessor import io.spring.initializr.generator.ProjectRequestPostProcessor
import io.spring.initializr.generator.ProjectRequestResolver import io.spring.initializr.generator.ProjectRequestResolver
@@ -35,8 +35,10 @@ import io.spring.initializr.web.ui.UiController
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.cache.Cache
import org.springframework.cache.CacheManager import org.springframework.cache.CacheManager
import org.springframework.cache.annotation.EnableCaching import org.springframework.cache.annotation.EnableCaching
import org.springframework.cache.caffeine.CaffeineCache
import org.springframework.cache.concurrent.ConcurrentMapCache import org.springframework.cache.concurrent.ConcurrentMapCache
import org.springframework.cache.support.SimpleCacheManager import org.springframework.cache.support.SimpleCacheManager
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
@@ -121,12 +123,11 @@ class InitializrAutoConfiguration {
cacheManager cacheManager
} }
private static ConcurrentMapCache createConcurrentMapCache(Long timeToLive, String name) { private static Cache createConcurrentMapCache(Long timeToLive, String name) {
def cacheBuilder = CacheBuilder.newBuilder() new CaffeineCache(name, Caffeine
.newBuilder()
.expireAfterWrite(timeToLive, TimeUnit.SECONDS) .expireAfterWrite(timeToLive, TimeUnit.SECONDS)
.build())
def map = cacheBuilder.build().asMap()
new ConcurrentMapCache(name, map, false)
} }
} }

View File

@@ -32,10 +32,9 @@ import org.junit.runner.RunWith
import org.skyscreamer.jsonassert.JSONAssert import org.skyscreamer.jsonassert.JSONAssert
import org.skyscreamer.jsonassert.JSONCompareMode import org.skyscreamer.jsonassert.JSONCompareMode
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.autoconfigure.EnableAutoConfiguration import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.boot.test.IntegrationTest import org.springframework.boot.context.embedded.LocalServerPort
import org.springframework.boot.test.SpringApplicationConfiguration import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.core.io.ClassPathResource import org.springframework.core.io.ClassPathResource
import org.springframework.http.HttpEntity import org.springframework.http.HttpEntity
@@ -43,20 +42,18 @@ import org.springframework.http.HttpHeaders
import org.springframework.http.HttpMethod import org.springframework.http.HttpMethod
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner import org.springframework.test.context.junit4.SpringRunner
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.util.StreamUtils import org.springframework.util.StreamUtils
import org.springframework.web.client.RestTemplate import org.springframework.web.client.RestTemplate
import static org.junit.Assert.assertTrue import static org.junit.Assert.assertTrue
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT
/** /**
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringRunner.class)
@SpringApplicationConfiguration(classes = Config.class) @SpringBootTest(classes = Config.class, webEnvironment = RANDOM_PORT)
@WebAppConfiguration
@IntegrationTest('server.port=0')
abstract class AbstractInitializrControllerIntegrationTests { abstract class AbstractInitializrControllerIntegrationTests {
static final MediaType CURRENT_METADATA_MEDIA_TYPE = InitializrMetadataVersion.V2_1.mediaType static final MediaType CURRENT_METADATA_MEDIA_TYPE = InitializrMetadataVersion.V2_1.mediaType
@@ -65,7 +62,7 @@ abstract class AbstractInitializrControllerIntegrationTests {
@Rule @Rule
public final TemporaryFolder folder = new TemporaryFolder() public final TemporaryFolder folder = new TemporaryFolder()
@Value('${local.server.port}') @LocalServerPort
protected int port protected int port
final RestTemplate restTemplate = new RestTemplate() final RestTemplate restTemplate = new RestTemplate()

View File

@@ -7,14 +7,14 @@ import io.spring.initializr.metadata.InitializrMetadata
import io.spring.initializr.web.AbstractInitializrControllerIntegrationTests import io.spring.initializr.web.AbstractInitializrControllerIntegrationTests
import org.junit.Test import org.junit.Test
import org.springframework.boot.test.SpringApplicationConfiguration
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Import
import org.springframework.core.annotation.Order import org.springframework.core.annotation.Order
import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ActiveProfiles
@ActiveProfiles('test-default') @ActiveProfiles('test-default')
@SpringApplicationConfiguration(classes = [Config, ProjectRequestPostProcessorConfiguration]) @Import(ProjectRequestPostProcessorConfiguration)
class ProjectGenerationPostProcessorTests extends AbstractInitializrControllerIntegrationTests { class ProjectGenerationPostProcessorTests extends AbstractInitializrControllerIntegrationTests {

30
pom.xml
View File

@@ -38,9 +38,8 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<selenium.version>2.43.1</selenium.version> <spring.boot.version>1.4.0.RELEASE</spring.boot.version>
<spring.boot.version>1.3.6.RELEASE</spring.boot.version> <java.version>1.8</java.version>
<java.version>1.7</java.version>
</properties> </properties>
<modules> <modules>
@@ -86,21 +85,11 @@
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0</version>
</dependency>
<dependency> <dependency>
<groupId>xmlunit</groupId> <groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId> <artifactId>xmlunit</artifactId>
<version>1.5</version> <version>1.5</version>
</dependency> </dependency>
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<version>1.2.3</version>
</dependency>
<dependency> <dependency>
<groupId>org.gebish</groupId> <groupId>org.gebish</groupId>
<artifactId>geb-core</artifactId> <artifactId>geb-core</artifactId>
@@ -112,16 +101,6 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-support</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
@@ -195,6 +174,11 @@
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version> <version>${spring.boot.version}</version>
</plugin> </plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>2.1.11</version>
</plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>
</build> </build>