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
This commit is contained in:
Stephane Nicoll
2014-11-19 15:16:31 +01:00
parent 6116ca94aa
commit addeb79bca
10 changed files with 62 additions and 28 deletions

View File

@@ -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()
}

View File

@@ -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"))
}

View File

@@ -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 }

View File

@@ -28,8 +28,8 @@ import groovy.util.logging.Slf4j
@Slf4j
class ProjectRequest {
def style = []
List<String> style = []
List<String> 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<InitializrMetadata.Dependency> 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<String> 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
}

View File

@@ -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")<% } %>

View File

@@ -18,7 +18,7 @@
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies><% dependencies.each { %>
<dependencies><% resolvedDependencies.each { %>
<dependency>
<groupId>${it.groupId}</groupId>
<artifactId>${it.artifactId}</artifactId><% if (it.version != null) { %>

View File

@@ -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
}

View File

@@ -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

View File

@@ -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')

View File

@@ -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
}
},