Add project request post processing

This commit introduces `ProjectRequestPostProcessor` as a mean to modify
an incoming `ProjectRequest` before and after its resolution against the
meta-data.

By default, all beans of that type are invoked automatically and they
are ordered against their `@Order` or `Ordered` settings.

Closes gh-260
This commit is contained in:
Stephane Nicoll
2016-07-19 11:37:38 +02:00
parent fb7b8eb5cb
commit 56210d9bf2
9 changed files with 307 additions and 3 deletions

View File

@@ -20,6 +20,8 @@ import java.util.concurrent.TimeUnit
import com.google.common.cache.CacheBuilder
import io.spring.initializr.generator.ProjectGenerator
import io.spring.initializr.generator.ProjectRequestPostProcessor
import io.spring.initializr.generator.ProjectRequestResolver
import io.spring.initializr.generator.ProjectResourceLocator
import io.spring.initializr.metadata.DependencyMetadataProvider
import io.spring.initializr.metadata.InitializrMetadataBuilder
@@ -30,6 +32,7 @@ import io.spring.initializr.web.support.DefaultDependencyMetadataProvider
import io.spring.initializr.web.support.DefaultInitializrMetadataProvider
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.CacheManager
@@ -56,6 +59,9 @@ import org.springframework.context.annotation.Configuration
@EnableConfigurationProperties(InitializrProperties)
class InitializrAutoConfiguration {
@Autowired(required = false)
List<ProjectRequestPostProcessor> postProcessors = []
@Bean
WebConfig webConfig() {
new WebConfig()
@@ -79,6 +85,12 @@ class InitializrAutoConfiguration {
new ProjectGenerator()
}
@Bean
@ConditionalOnMissingBean
ProjectRequestResolver projectRequestResolver() {
new ProjectRequestResolver(postProcessors)
}
@Bean
ProjectResourceLocator projectResourceLocator() {
return new ProjectResourceLocator()

View File

@@ -0,0 +1,59 @@
package io.spring.initializr.web.project
import io.spring.initializr.generator.ProjectRequest
import io.spring.initializr.generator.ProjectRequestPostProcessor
import io.spring.initializr.generator.ProjectRequestPostProcessorAdapter
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.core.annotation.Order
import org.springframework.test.context.ActiveProfiles
@ActiveProfiles('test-default')
@SpringApplicationConfiguration(classes = [Config, ProjectRequestPostProcessorConfiguration])
class ProjectGenerationPostProcessorTests extends AbstractInitializrControllerIntegrationTests {
@Test
void postProcessorsInvoked() {
downloadZip('/starter.zip?bootVersion=1.2.4.RELEASE&javaVersion=1.6')
.isJavaProject()
.isMavenProject().pomAssert()
.hasSpringBootParent('1.2.3.RELEASE')
.hasProperty('java.version', '1.7')
}
@Configuration
static class ProjectRequestPostProcessorConfiguration {
@Bean
@Order(2)
ProjectRequestPostProcessor secondPostProcessor() {
new ProjectRequestPostProcessorAdapter() {
@Override
void postProcessBeforeResolution(ProjectRequest request, InitializrMetadata metadata) {
request.javaVersion = '1.7'
}
}
}
@Bean
@Order(1)
ProjectRequestPostProcessor firstPostProcessor() {
new ProjectRequestPostProcessorAdapter() {
@Override
void postProcessBeforeResolution(ProjectRequest request, InitializrMetadata metadata) {
request.javaVersion = '1.2'
request.bootVersion = '1.2.3.RELEASE'
}
}
}
}
}