diff --git a/initializr/src/main/groovy/io/spring/initializr/InitializrMetadataJsonMapper.groovy b/initializr/src/main/groovy/io/spring/initializr/InitializrMetadataJsonMapper.groovy index f8b6334c..5817dfac 100644 --- a/initializr/src/main/groovy/io/spring/initializr/InitializrMetadataJsonMapper.groovy +++ b/initializr/src/main/groovy/io/spring/initializr/InitializrMetadataJsonMapper.groovy @@ -34,6 +34,7 @@ class InitializrMetadataJsonMapper { InitializrMetadataJsonMapper() { this.templateVariables = new TemplateVariables( + new TemplateVariable('dependencies', TemplateVariable.VariableType.REQUEST_PARAM), new TemplateVariable('type', TemplateVariable.VariableType.REQUEST_PARAM), new TemplateVariable('packaging', TemplateVariable.VariableType.REQUEST_PARAM), new TemplateVariable('javaVersion', TemplateVariable.VariableType.REQUEST_PARAM), @@ -85,7 +86,7 @@ class InitializrMetadataJsonMapper { private generateTemplatedUri(appUrl, action) { String uri = appUrl != null ? appUrl + action : action - UriTemplate uriTemplate = new UriTemplate(uri + '?style={dependencies}', this.templateVariables) + UriTemplate uriTemplate = new UriTemplate(uri, this.templateVariables) uriTemplate.toString() } diff --git a/initializr/src/main/groovy/io/spring/initializr/ProjectGenerationMetricsListener.groovy b/initializr/src/main/groovy/io/spring/initializr/ProjectGenerationMetricsListener.groovy index ff12e350..fc084157 100644 --- a/initializr/src/main/groovy/io/spring/initializr/ProjectGenerationMetricsListener.groovy +++ b/initializr/src/main/groovy/io/spring/initializr/ProjectGenerationMetricsListener.groovy @@ -48,7 +48,7 @@ class ProjectGenerationMetricsListener implements ProjectGenerationListener { } protected void handleDependencies(ProjectRequest request) { - request.dependencies.each { + request.resolvedDependencies.each { def id = sanitize(it.id) increment(key("dependency.$id")) } diff --git a/initializr/src/main/groovy/io/spring/initializr/ProjectGenerator.groovy b/initializr/src/main/groovy/io/spring/initializr/ProjectGenerator.groovy index 3477571f..b7db3506 100644 --- a/initializr/src/main/groovy/io/spring/initializr/ProjectGenerator.groovy +++ b/initializr/src/main/groovy/io/spring/initializr/ProjectGenerator.groovy @@ -158,7 +158,7 @@ class ProjectGenerator { request.resolve(metadata) // request resolved so we can log what has been requested - def dependencies = request.dependencies.collect { it.id } + def dependencies = request.resolvedDependencies.collect { it.id } log.info("Processing request{type=$request.type, dependencies=$dependencies}") request.properties.each { model[it.key] = it.value } diff --git a/initializr/src/main/groovy/io/spring/initializr/ProjectRequest.groovy b/initializr/src/main/groovy/io/spring/initializr/ProjectRequest.groovy index 46e1ce20..3f6d3718 100644 --- a/initializr/src/main/groovy/io/spring/initializr/ProjectRequest.groovy +++ b/initializr/src/main/groovy/io/spring/initializr/ProjectRequest.groovy @@ -28,8 +28,8 @@ import groovy.util.logging.Slf4j @Slf4j class ProjectRequest { - def style = [] - + List style = [] + List dependencies = [] String name String type String description @@ -42,7 +42,9 @@ class ProjectRequest { String packageName String javaVersion - def dependencies = [] + // Resolved dependencies based on the ids provided by either "style" or "dependencies" + List resolvedDependencies + def facets = [] def build @@ -50,11 +52,8 @@ class ProjectRequest { * Resolve this instance against the specified {@link InitializrMetadata} */ void resolve(InitializrMetadata metadata) { - style = style ?: [] - if (!style.class.isArray() && !(style instanceof Collection)) { - style = [style] - } - dependencies = style.collect { + List depIds = style ? style : dependencies + resolvedDependencies = depIds.collect { def dependency = metadata.getDependency(it) if (dependency == null) { if (it.contains(':')) { @@ -66,7 +65,7 @@ class ProjectRequest { } dependency } - dependencies.each { + resolvedDependencies.each { it.facets.each { if (!facets.contains(it)) { facets.add(it) @@ -93,10 +92,10 @@ class ProjectRequest { protected afterResolution(InitializrMetadata metadata) { if (packaging == 'war' && !hasWebFacet()) { // Need to be able to bootstrap the web app - dependencies << metadata.getDependency('web') + resolvedDependencies << metadata.getDependency('web') facets << 'web' } - if (dependencies.isEmpty()) { + if (resolvedDependencies.isEmpty()) { addDefaultDependency() } } @@ -109,7 +108,7 @@ class ProjectRequest { def root = new InitializrMetadata.Dependency() root.id = 'root_starter' root.asSpringBootStarter('') - dependencies << root + resolvedDependencies << root } diff --git a/initializr/src/main/resources/templates/starter-build.gradle b/initializr/src/main/resources/templates/starter-build.gradle index 9480a296..f5f039b8 100644 --- a/initializr/src/main/resources/templates/starter-build.gradle +++ b/initializr/src/main/resources/templates/starter-build.gradle @@ -39,7 +39,7 @@ repositories { providedRuntime } <% } %> -dependencies {<% dependencies.each { %> +dependencies {<% resolvedDependencies.each { %> compile("${it.groupId}:${it.artifactId}")<% } %><% if (language=='groovy') { %> compile("org.codehaus.groovy:groovy")<% } %><% if (packaging=='war') { %> providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")<% } %> diff --git a/initializr/src/main/resources/templates/starter-pom.xml b/initializr/src/main/resources/templates/starter-pom.xml index 1b817d4b..00752a17 100644 --- a/initializr/src/main/resources/templates/starter-pom.xml +++ b/initializr/src/main/resources/templates/starter-pom.xml @@ -18,7 +18,7 @@ - <% dependencies.each { %> + <% resolvedDependencies.each { %> ${it.groupId} ${it.artifactId}<% if (it.version != null) { %> diff --git a/initializr/src/test/groovy/io/spring/initializr/InitializrMetadataJsonMapperTests.groovy b/initializr/src/test/groovy/io/spring/initializr/InitializrMetadataJsonMapperTests.groovy index c6a0d4ed..c8c79ed2 100644 --- a/initializr/src/test/groovy/io/spring/initializr/InitializrMetadataJsonMapperTests.groovy +++ b/initializr/src/test/groovy/io/spring/initializr/InitializrMetadataJsonMapperTests.groovy @@ -36,7 +36,7 @@ class InitializrMetadataJsonMapperTests { .addDependencyGroup('foo', 'one', 'two').validateAndGet() def json = jsonMapper.write(metadata, null) def result = slurper.parseText(json) - assertEquals '/foo.zip?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,' + + assertEquals '/foo.zip{?dependencies,type,packaging,javaVersion,language,bootVersion,' + 'groupId,artifactId,version,name,description,packageName}', result._links.foo.href } @@ -46,7 +46,7 @@ class InitializrMetadataJsonMapperTests { .addDependencyGroup('foo', 'one', 'two').validateAndGet() def json = jsonMapper.write(metadata, 'http://server:8080/my-app') def result = slurper.parseText(json) - assertEquals 'http://server:8080/my-app/foo.zip?style={dependencies}{&type,packaging,javaVersion,' + + assertEquals 'http://server:8080/my-app/foo.zip{?dependencies,type,packaging,javaVersion,' + 'language,bootVersion,groupId,artifactId,version,name,description,packageName}', result._links.foo.href } diff --git a/initializr/src/test/groovy/io/spring/initializr/ProjectRequestTests.groovy b/initializr/src/test/groovy/io/spring/initializr/ProjectRequestTests.groovy index b9d6daa0..81545a7c 100644 --- a/initializr/src/test/groovy/io/spring/initializr/ProjectRequestTests.groovy +++ b/initializr/src/test/groovy/io/spring/initializr/ProjectRequestTests.groovy @@ -42,8 +42,22 @@ class ProjectRequestTests { request.style << 'web' << 'spring-data' request.resolve(metadata) assertEquals 'Build type not detected', 'maven', request.build - assertBootStarter(request.dependencies[0], 'web') - assertBootStarter(request.dependencies[1], 'spring-data') + assertBootStarter(request.resolvedDependencies[0], 'web') + assertBootStarter(request.resolvedDependencies[1], 'spring-data') + } + + @Test + void resolveWithDependencies() { + def request = new ProjectRequest() + def metadata = InitializrMetadataBuilder.withDefaults() + .addDependencyGroup('code', 'web', 'security', 'spring-data').validateAndGet() + + request.type = 'maven-project' + request.dependencies << 'web' << 'spring-data' + request.resolve(metadata) + assertEquals 'Build type not detected', 'maven', request.build + assertBootStarter(request.resolvedDependencies[0], 'web') + assertBootStarter(request.resolvedDependencies[1], 'spring-data') } @Test @@ -53,7 +67,7 @@ class ProjectRequestTests { .addDependencyGroup('code', createDependency('org.foo', 'acme', '1.2.0')).validateAndGet() request.style << 'org.foo:acme' request.resolve(metadata) - assertDependency(request.dependencies[0], 'org.foo', 'acme', '1.2.0') + assertDependency(request.resolvedDependencies[0], 'org.foo', 'acme', '1.2.0') } @Test @@ -64,8 +78,8 @@ class ProjectRequestTests { request.style << 'org.foo:bar' << 'foo-bar' request.resolve(metadata) - assertDependency(request.dependencies[0], 'org.foo', 'bar', null) - assertBootStarter(request.dependencies[1], 'foo-bar') + assertDependency(request.resolvedDependencies[0], 'org.foo', 'bar', null) + assertBootStarter(request.resolvedDependencies[1], 'foo-bar') } @Test diff --git a/initializr/src/test/groovy/io/spring/initializr/web/MainControllerIntegrationTests.groovy b/initializr/src/test/groovy/io/spring/initializr/web/MainControllerIntegrationTests.groovy index 914cf62f..e053d1b8 100644 --- a/initializr/src/test/groovy/io/spring/initializr/web/MainControllerIntegrationTests.groovy +++ b/initializr/src/test/groovy/io/spring/initializr/web/MainControllerIntegrationTests.groovy @@ -76,6 +76,26 @@ class MainControllerIntegrationTests extends AbstractInitializrControllerIntegra .hasSpringBootStarterDependency('test') } + @Test + void dependenciesIsAnAliasOfStyle() { + downloadZip('/starter.zip?dependencies=web&dependencies=jpa').isJavaProject().isMavenProject() + .hasStaticAndTemplatesResources(true).pomAssert() + .hasDependenciesCount(3) + .hasSpringBootStarterDependency('web') + .hasSpringBootStarterDependency('data-jpa') // alias jpa -> data-jpa + .hasSpringBootStarterDependency('test') + } + + @Test + void dependenciesIsAnAliasOfStyleCommaSeparated() { + downloadZip('/starter.zip?dependencies=web,jpa').isJavaProject().isMavenProject() + .hasStaticAndTemplatesResources(true).pomAssert() + .hasDependenciesCount(3) + .hasSpringBootStarterDependency('web') + .hasSpringBootStarterDependency('data-jpa') // alias jpa -> data-jpa + .hasSpringBootStarterDependency('test') + } + @Test void gradleWarProject() { downloadZip('/starter.zip?style=web&style=security&packaging=war&type=gradle.zip') diff --git a/initializr/src/test/resources/metadata/test-default-2.0.0.json b/initializr/src/test/resources/metadata/test-default-2.0.0.json index de896065..d0ee851f 100644 --- a/initializr/src/test/resources/metadata/test-default-2.0.0.json +++ b/initializr/src/test/resources/metadata/test-default-2.0.0.json @@ -1,19 +1,19 @@ { "_links": { "maven-build": { - "href": "http://localhost:@port@/pom.xml?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "href": "http://localhost:@port@/pom.xml{?dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true }, "maven-project": { - "href": "http://localhost:@port@/starter.zip?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "href": "http://localhost:@port@/starter.zip{?dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true }, "gradle-build": { - "href": "http://localhost:@port@/build.gradle?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "href": "http://localhost:@port@/build.gradle{?dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true }, "gradle-project": { - "href": "http://localhost:@port@/starter.zip?style={dependencies}{&type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "href": "http://localhost:@port@/starter.zip{?dependencies,type,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true } },