From addeb79bca47d42632621b9a0420c523ec743573 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 19 Nov 2014 15:16:31 +0100 Subject: [PATCH] Alias style to dependencies Style is the only parameter that deviates from the default names in the metadata. As 'dependencies' is the name used in the metadata, it can be used as an alias of style. This simplifies the HAL-generated URLs Fixes gh-50 --- .../InitializrMetadataJsonMapper.groovy | 3 ++- .../ProjectGenerationMetricsListener.groovy | 2 +- .../spring/initializr/ProjectGenerator.groovy | 2 +- .../spring/initializr/ProjectRequest.groovy | 23 +++++++++--------- .../resources/templates/starter-build.gradle | 2 +- .../main/resources/templates/starter-pom.xml | 2 +- .../InitializrMetadataJsonMapperTests.groovy | 4 ++-- .../initializr/ProjectRequestTests.groovy | 24 +++++++++++++++---- .../web/MainControllerIntegrationTests.groovy | 20 ++++++++++++++++ .../metadata/test-default-2.0.0.json | 8 +++---- 10 files changed, 62 insertions(+), 28 deletions(-) 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 } },