From af2ae44b8d7f45a4e93980da7ce3612d7c9975d1 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 9 Jun 2016 13:17:31 +0200 Subject: [PATCH] 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 --- .../actuate/stat/BasicAuthRestTemplate.groovy | 82 ------------------- .../ProjectGenerationStatPublisher.groovy | 5 +- ...MainControllerStatsIntegrationTests.groovy | 4 +- .../initializr/metadata/Dependency.groovy | 1 + initializr-service/pom.xml | 28 +++++++ .../src/main/resources/application.yml | 14 ++-- initializr-web/pom.xml | 8 +- .../InitializrAutoConfiguration.groovy | 13 +-- ...nitializrControllerIntegrationTests.groovy | 17 ++-- ...ProjectGenerationPostProcessorTests.groovy | 4 +- pom.xml | 30 ++----- 11 files changed, 69 insertions(+), 137 deletions(-) delete mode 100644 initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/BasicAuthRestTemplate.groovy diff --git a/initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/BasicAuthRestTemplate.groovy b/initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/BasicAuthRestTemplate.groovy deleted file mode 100644 index 32d9c5c4..00000000 --- a/initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/BasicAuthRestTemplate.groovy +++ /dev/null @@ -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. - *

- * 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 interceptors = Collections - . 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) - } - - } - -} diff --git a/initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/ProjectGenerationStatPublisher.groovy b/initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/ProjectGenerationStatPublisher.groovy index 88243a04..11fffb32 100644 --- a/initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/ProjectGenerationStatPublisher.groovy +++ b/initializr-actuator/src/main/groovy/io/spring/initializr/actuate/stat/ProjectGenerationStatPublisher.groovy @@ -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 } diff --git a/initializr-actuator/src/test/groovy/io/spring/initializr/actuate/stat/MainControllerStatsIntegrationTests.groovy b/initializr-actuator/src/test/groovy/io/spring/initializr/actuate/stat/MainControllerStatsIntegrationTests.groovy index 6db0a7a9..6638cf51 100644 --- a/initializr-actuator/src/test/groovy/io/spring/initializr/actuate/stat/MainControllerStatsIntegrationTests.groovy +++ b/initializr-actuator/src/test/groovy/io/spring/initializr/actuate/stat/MainControllerStatsIntegrationTests.groovy @@ -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 { diff --git a/initializr-generator/src/main/groovy/io/spring/initializr/metadata/Dependency.groovy b/initializr-generator/src/main/groovy/io/spring/initializr/metadata/Dependency.groovy index 7943eb75..ae253dd1 100644 --- a/initializr-generator/src/main/groovy/io/spring/initializr/metadata/Dependency.groovy +++ b/initializr-generator/src/main/groovy/io/spring/initializr/metadata/Dependency.groovy @@ -83,6 +83,7 @@ class Dependency extends MetadataElement { String repository + @JsonInclude(JsonInclude.Include.NON_DEFAULT) int weight /** diff --git a/initializr-service/pom.xml b/initializr-service/pom.xml index f2c4e783..f85414ab 100644 --- a/initializr-service/pom.xml +++ b/initializr-service/pom.xml @@ -33,15 +33,43 @@ org.codehaus.gmavenplus gmavenplus-plugin + + pl.project13.maven + git-commit-id-plugin + + + + revision + + + + + yyyy-MM-dd'T'HH:mm:ssZ + true + ${project.build.outputDirectory}/git.properties + + org.springframework.boot spring-boot-maven-plugin + repackage repackage + + build information + + build-info + + + + ${spring.boot.version} + + + diff --git a/initializr-service/src/main/resources/application.yml b/initializr-service/src/main/resources/application.yml index 4b5deb26..f828fd25 100644 --- a/initializr-service/src/main/resources/application.yml +++ b/initializr-service/src/main/resources/application.yml @@ -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 + diff --git a/initializr-web/pom.xml b/initializr-web/pom.xml index de65b196..01df944a 100644 --- a/initializr-web/pom.xml +++ b/initializr-web/pom.xml @@ -20,6 +20,10 @@ org.springframework.boot spring-boot-autoconfigure + + org.springframework + spring-context-support + org.springframework spring-webmvc @@ -29,8 +33,8 @@ spring-hateoas - com.google.guava - guava + com.github.ben-manes.caffeine + caffeine diff --git a/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy b/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy index 158f5d58..2f17b7db 100644 --- a/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy +++ b/initializr-web/src/main/groovy/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.groovy @@ -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()) } } diff --git a/initializr-web/src/test/groovy/io/spring/initializr/web/AbstractInitializrControllerIntegrationTests.groovy b/initializr-web/src/test/groovy/io/spring/initializr/web/AbstractInitializrControllerIntegrationTests.groovy index ba5948fd..a5f9000f 100644 --- a/initializr-web/src/test/groovy/io/spring/initializr/web/AbstractInitializrControllerIntegrationTests.groovy +++ b/initializr-web/src/test/groovy/io/spring/initializr/web/AbstractInitializrControllerIntegrationTests.groovy @@ -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() diff --git a/initializr-web/src/test/groovy/io/spring/initializr/web/project/ProjectGenerationPostProcessorTests.groovy b/initializr-web/src/test/groovy/io/spring/initializr/web/project/ProjectGenerationPostProcessorTests.groovy index cfc7a372..ffbb7855 100644 --- a/initializr-web/src/test/groovy/io/spring/initializr/web/project/ProjectGenerationPostProcessorTests.groovy +++ b/initializr-web/src/test/groovy/io/spring/initializr/web/project/ProjectGenerationPostProcessorTests.groovy @@ -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 { diff --git a/pom.xml b/pom.xml index 449750ef..dbcec3a8 100644 --- a/pom.xml +++ b/pom.xml @@ -38,9 +38,8 @@ UTF-8 - 2.43.1 - 1.3.6.RELEASE - 1.7 + 1.4.0.RELEASE + 1.8 @@ -86,21 +85,11 @@ pom import - - com.google.guava - guava - 16.0 - xmlunit xmlunit 1.5 - - org.skyscreamer - jsonassert - 1.2.3 - org.gebish geb-core @@ -112,16 +101,6 @@ - - org.seleniumhq.selenium - selenium-support - ${selenium.version} - - - org.seleniumhq.selenium - selenium-firefox-driver - ${selenium.version} - @@ -195,6 +174,11 @@ spring-boot-maven-plugin ${spring.boot.version} + + pl.project13.maven + git-commit-id-plugin + 2.1.11 +