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 +