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 io.spring.initializr.generator.ProjectRequestEvent
import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.context.event.EventListener
import org.springframework.http.MediaType
import org.springframework.http.RequestEntity
@ -51,8 +52,8 @@ class ProjectGenerationStatPublisher {
this.documentFactory = documentFactory
this.statsProperties = statsProperties
this.objectMapper = createObjectMapper()
this.restTemplate = new BasicAuthRestTemplate(
statsProperties.elastic.username, statsProperties.elastic.password)
this.restTemplate = new RestTemplateBuilder().basicAuthorization(
statsProperties.elastic.username, statsProperties.elastic.password).build()
this.retryTemplate = retryTemplate
}

View File

@ -22,7 +22,7 @@ import org.junit.Before
import org.junit.Test
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.HttpStatus
import org.springframework.http.RequestEntity
@ -44,7 +44,7 @@ import static org.junit.Assert.fail
*
* @author Stephane Nicoll
*/
@SpringApplicationConfiguration(StatsMockController.class)
@Import(StatsMockController)
@ActiveProfiles(['test-default', 'test-custom-stats'])
class MainControllerStatsIntegrationTests extends AbstractInitializrControllerIntegrationTests {

View File

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

View File

@ -33,15 +33,43 @@
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
</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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</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>
</plugin>
</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:
level:
org.springframework.core.env: warn
@ -17,6 +9,11 @@ server:
mime-types: application/json,text/css,text/html
min-response-size: 2048
spring:
jackson:
serialization:
write-dates-as-timestamps: false
initializr:
env:
boms:
@ -753,3 +750,4 @@ initializr:
- name: 1.1.12
id: 1.1.12.RELEASE
default: false

View File

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

View File

@ -18,7 +18,7 @@ package io.spring.initializr.web.autoconfigure
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.ProjectRequestPostProcessor
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.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.cache.Cache
import org.springframework.cache.CacheManager
import org.springframework.cache.annotation.EnableCaching
import org.springframework.cache.caffeine.CaffeineCache
import org.springframework.cache.concurrent.ConcurrentMapCache
import org.springframework.cache.support.SimpleCacheManager
import org.springframework.context.annotation.Bean
@ -121,12 +123,11 @@ class InitializrAutoConfiguration {
cacheManager
}
private static ConcurrentMapCache createConcurrentMapCache(Long timeToLive, String name) {
def cacheBuilder = CacheBuilder.newBuilder()
private static Cache createConcurrentMapCache(Long timeToLive, String name) {
new CaffeineCache(name, Caffeine
.newBuilder()
.expireAfterWrite(timeToLive, TimeUnit.SECONDS)
def map = cacheBuilder.build().asMap()
new ConcurrentMapCache(name, map, false)
.build())
}
}

View File

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

View File

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

30
pom.xml
View File

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