Support of multiple Gradle generations

This commit improves `@ConditionalOnGradleVersion` to support more than
one Gradle generation in case a bean should be declared for multiple
Gradle generations.

Closes gh-849
This commit is contained in:
Stephane Nicoll
2019-03-01 10:32:17 +01:00
parent 4ac8ab3d24
commit 590f3ad5ec
3 changed files with 49 additions and 5 deletions

View File

@@ -36,6 +36,11 @@ import org.springframework.context.annotation.Conditional;
@Conditional(OnGradleVersionCondition.class)
public @interface ConditionalOnGradleVersion {
String value();
/**
* The Gradle generations that should be checked. The condition matches when at least
* one gradle generation matches.
* @return the gradle generation to check
*/
String[] value();
}

View File

@@ -16,6 +16,8 @@
package io.spring.initializr.generator.spring.build.gradle;
import java.util.Arrays;
import io.spring.initializr.generator.condition.ProjectGenerationCondition;
import io.spring.initializr.generator.project.ResolvedProjectDescription;
import io.spring.initializr.generator.version.Version;
@@ -43,15 +45,15 @@ public class OnGradleVersionCondition extends ProjectGenerationCondition {
@Override
protected boolean matches(ResolvedProjectDescription projectDescription,
ConditionContext context, AnnotatedTypeMetadata metadata) {
String gradleVersion = determineGradleGeneration(
String gradleGeneration = determineGradleGeneration(
projectDescription.getPlatformVersion());
if (gradleVersion == null) {
if (gradleGeneration == null) {
return false;
}
String value = (String) metadata
String[] values = (String[]) metadata
.getAnnotationAttributes(ConditionalOnGradleVersion.class.getName())
.get("value");
return gradleVersion.equals(value);
return Arrays.asList(values).contains(gradleGeneration);
}
private String determineGradleGeneration(Version platformVersion) {

View File

@@ -16,6 +16,8 @@
package io.spring.initializr.generator.spring.build.gradle;
import java.util.Map;
import io.spring.initializr.generator.project.ProjectDescription;
import io.spring.initializr.generator.test.project.ProjectAssetTester;
import io.spring.initializr.generator.version.Version;
@@ -71,6 +73,24 @@ public class ConditionalOnGradleVersionTests {
});
}
@Test
void outcomeWithSpringBoot15AndMultipleGenerations() {
ProjectDescription projectDescription = new ProjectDescription();
projectDescription.setPlatformVersion(Version.parse("1.5.18.RELEASE"));
Map<String, String> candidates = candidatesFor(projectDescription,
Gradle3Or4TestConfiguration.class);
assertThat(candidates).containsOnlyKeys("gradle3", "gradle3AndLater");
}
@Test
void outcomeWithSpringBoot2AndMultipleGenerations() {
ProjectDescription projectDescription = new ProjectDescription();
projectDescription.setPlatformVersion(Version.parse("2.0.9.RELEASE"));
Map<String, String> candidates = candidatesFor(projectDescription,
Gradle3Or4TestConfiguration.class);
assertThat(candidates).containsOnlyKeys("gradle4", "gradle3AndLater");
}
private String outcomeFor(ProjectDescription projectDescription) {
return this.projectTester.generate(projectDescription,
(projectGenerationContext) -> {
@@ -80,6 +100,12 @@ public class ConditionalOnGradleVersionTests {
});
}
private Map<String, String> candidatesFor(ProjectDescription projectDescription,
Class<?>... extraConfigurations) {
return this.projectTester.withConfiguration(extraConfigurations).generate(
projectDescription, (context) -> context.getBeansOfType(String.class));
}
@Configuration
static class GradleVersionTestConfiguration {
@@ -97,4 +123,15 @@ public class ConditionalOnGradleVersionTests {
}
@Configuration
static class Gradle3Or4TestConfiguration {
@Bean
@ConditionalOnGradleVersion({ "3", "4" })
public String gradle3AndLater() {
return "testGradle3AndLater";
}
}
}