mirror of
https://gitee.com/dcren/initializr.git
synced 2025-09-19 01:58:16 +08:00
Extend conditions that can apply to more than one value
This commit extends the build system and platform conditions to allow for several values to be specified. Those conditions match if any of the provided value matches. Closes gh-888
This commit is contained in:
@@ -38,6 +38,11 @@ import org.springframework.context.annotation.Conditional;
|
||||
@Conditional(OnBuildSystemCondition.class)
|
||||
public @interface ConditionalOnBuildSystem {
|
||||
|
||||
String value();
|
||||
/**
|
||||
* The {@link BuildSystem} that should be checked. The condition matches when at least
|
||||
* one build system matches.
|
||||
* @return the build systems to check
|
||||
*/
|
||||
String[] value();
|
||||
|
||||
}
|
||||
|
@@ -29,6 +29,7 @@ import org.springframework.context.annotation.Conditional;
|
||||
* platform.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Stephane Nicoll
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||
@@ -37,9 +38,10 @@ import org.springframework.context.annotation.Conditional;
|
||||
public @interface ConditionalOnPlatformVersion {
|
||||
|
||||
/**
|
||||
* The version range to match.
|
||||
* @return the version range
|
||||
* The version ranges to check. The condition matches when at least one range matches
|
||||
* the platform version.
|
||||
* @return the version ranges to check
|
||||
*/
|
||||
String value();
|
||||
String[] value();
|
||||
|
||||
}
|
||||
|
@@ -16,7 +16,8 @@
|
||||
|
||||
package io.spring.initializr.generator.condition;
|
||||
|
||||
import io.spring.initializr.generator.buildsystem.BuildSystem;
|
||||
import java.util.Arrays;
|
||||
|
||||
import io.spring.initializr.generator.project.ResolvedProjectDescription;
|
||||
|
||||
import org.springframework.context.annotation.ConditionContext;
|
||||
@@ -33,11 +34,11 @@ class OnBuildSystemCondition extends ProjectGenerationCondition {
|
||||
@Override
|
||||
protected boolean matches(ResolvedProjectDescription projectDescription,
|
||||
ConditionContext context, AnnotatedTypeMetadata metadata) {
|
||||
String buildSystemId = (String) metadata
|
||||
String[] buildSystemIds = (String[]) metadata
|
||||
.getAllAnnotationAttributes(ConditionalOnBuildSystem.class.getName())
|
||||
.getFirst("value");
|
||||
BuildSystem buildSystem = BuildSystem.forId(buildSystemId);
|
||||
return projectDescription.getBuildSystem().id().equals(buildSystem.id());
|
||||
return Arrays.asList(buildSystemIds)
|
||||
.contains(projectDescription.getBuildSystem().id());
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -16,9 +16,11 @@
|
||||
|
||||
package io.spring.initializr.generator.condition;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import io.spring.initializr.generator.project.ResolvedProjectDescription;
|
||||
import io.spring.initializr.generator.version.Version;
|
||||
import io.spring.initializr.generator.version.VersionParser;
|
||||
import io.spring.initializr.generator.version.VersionRange;
|
||||
|
||||
import org.springframework.context.annotation.ConditionContext;
|
||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
@@ -28,19 +30,25 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
* {@link ConditionalOnPlatformVersion}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Stephane Nicoll
|
||||
*/
|
||||
class OnPlatformVersionCondition extends ProjectGenerationCondition {
|
||||
|
||||
@Override
|
||||
protected boolean matches(ResolvedProjectDescription projectDescription,
|
||||
ConditionContext context, AnnotatedTypeMetadata metadata) {
|
||||
if (projectDescription.getPlatformVersion() == null) {
|
||||
Version platformVersion = projectDescription.getPlatformVersion();
|
||||
if (platformVersion == null) {
|
||||
return false;
|
||||
}
|
||||
VersionRange range = VersionParser.DEFAULT.parseRange((String) metadata
|
||||
.getAnnotationAttributes(ConditionalOnPlatformVersion.class.getName())
|
||||
.get("value"));
|
||||
return range.match(projectDescription.getPlatformVersion());
|
||||
return Arrays
|
||||
.stream((String[]) metadata
|
||||
.getAnnotationAttributes(
|
||||
ConditionalOnPlatformVersion.class.getName())
|
||||
.get("value"))
|
||||
.anyMatch((range) -> VersionParser.DEFAULT.parseRange(range)
|
||||
.match(platformVersion));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -16,6 +16,8 @@
|
||||
|
||||
package io.spring.initializr.generator.condition;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem;
|
||||
import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem;
|
||||
import io.spring.initializr.generator.project.ProjectDescription;
|
||||
@@ -34,32 +36,38 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
*/
|
||||
class ConditionalOnBuildSystemTests {
|
||||
|
||||
private final ProjectAssetTester projectTester = new ProjectAssetTester()
|
||||
.withConfiguration(BuildSystemTestConfiguration.class);
|
||||
private final ProjectAssetTester projectTester = new ProjectAssetTester();
|
||||
|
||||
@Test
|
||||
void outcomeWithMavenBuildSystem() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setBuildSystem(new MavenBuildSystem());
|
||||
String bean = outcomeFor(projectDescription);
|
||||
assertThat(bean).isEqualTo("testMaven");
|
||||
assertThat(candidatesFor(projectDescription, BuildSystemTestConfiguration.class))
|
||||
.containsOnlyKeys("maven");
|
||||
}
|
||||
|
||||
@Test
|
||||
void outcomeWithGradleBuildSystem() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setBuildSystem(new GradleBuildSystem());
|
||||
String bean = outcomeFor(projectDescription);
|
||||
assertThat(bean).isEqualTo("testGradle");
|
||||
assertThat(candidatesFor(projectDescription, BuildSystemTestConfiguration.class))
|
||||
.containsOnlyKeys("gradle");
|
||||
}
|
||||
|
||||
private String outcomeFor(ProjectDescription projectDescription) {
|
||||
return this.projectTester.generate(projectDescription,
|
||||
(projectGenerationContext) -> {
|
||||
assertThat(projectGenerationContext.getBeansOfType(String.class))
|
||||
.hasSize(1);
|
||||
return projectGenerationContext.getBean(String.class);
|
||||
});
|
||||
@Test
|
||||
void outcomeWithSeveralBuildSystemsAndMatchingId() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setBuildSystem(new MavenBuildSystem());
|
||||
assertThat(candidatesFor(projectDescription, BuildSystemTestConfiguration.class,
|
||||
MavenOrGradleBuildSystemTestConfiguration.class))
|
||||
.containsOnlyKeys("maven", "mavenOrGradle");
|
||||
}
|
||||
|
||||
private Map<String, String> candidatesFor(ProjectDescription projectDescription,
|
||||
Class<?>... extraConfigurations) {
|
||||
return this.projectTester.withConfiguration(extraConfigurations).generate(
|
||||
projectDescription, (projectGenerationContext) -> projectGenerationContext
|
||||
.getBeansOfType(String.class));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -77,6 +85,23 @@ class ConditionalOnBuildSystemTests {
|
||||
return "testMaven";
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBuildSystem("not-a-build-system")
|
||||
public String notABuildSystem() {
|
||||
return "testNone";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class MavenOrGradleBuildSystemTestConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBuildSystem({ "gradle", "maven" })
|
||||
public String mavenOrGradle() {
|
||||
return "testMavenOrGradle";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -16,6 +16,8 @@
|
||||
|
||||
package io.spring.initializr.generator.condition;
|
||||
|
||||
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;
|
||||
@@ -40,52 +42,71 @@ class ConditionalOnPlatformVersionTests {
|
||||
void outcomeWithMatchingRange() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setPlatformVersion(Version.parse("1.2.0.RELEASE"));
|
||||
String bean = outcomeFor(projectDescription);
|
||||
assertThat(bean).isEqualTo("one");
|
||||
assertThat(
|
||||
candidatesFor(projectDescription, PlatformVersionTestConfiguration.class))
|
||||
.containsOnlyKeys("first");
|
||||
}
|
||||
|
||||
@Test
|
||||
void outcomeWithMatchingOpenRange() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setPlatformVersion(Version.parse("2.0.1.RELEASE"));
|
||||
String bean = outcomeFor(projectDescription);
|
||||
assertThat(bean).isEqualTo("two");
|
||||
assertThat(
|
||||
candidatesFor(projectDescription, PlatformVersionTestConfiguration.class))
|
||||
.containsOnlyKeys("second");
|
||||
}
|
||||
|
||||
@Test
|
||||
void outcomeWithMatchingStartOfOpenRange() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setPlatformVersion(Version.parse("2.0.0.M1"));
|
||||
String bean = outcomeFor(projectDescription);
|
||||
assertThat(bean).isEqualTo("two");
|
||||
assertThat(
|
||||
candidatesFor(projectDescription, PlatformVersionTestConfiguration.class))
|
||||
.containsOnlyKeys("second");
|
||||
}
|
||||
|
||||
@Test
|
||||
void outcomeWithNoMatch() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setPlatformVersion(Version.parse("0.1.0"));
|
||||
this.projectTester.generate(projectDescription, (projectGenerationContext) -> {
|
||||
assertThat(projectGenerationContext.getBeansOfType(String.class)).isEmpty();
|
||||
return null;
|
||||
});
|
||||
assertThat(
|
||||
candidatesFor(projectDescription, PlatformVersionTestConfiguration.class))
|
||||
.isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
void outcomeWithNoAvailablePlatformVersion() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
this.projectTester.generate(projectDescription, (projectGenerationContext) -> {
|
||||
assertThat(projectGenerationContext.getBeansOfType(String.class)).isEmpty();
|
||||
return null;
|
||||
});
|
||||
assertThat(
|
||||
candidatesFor(projectDescription, PlatformVersionTestConfiguration.class))
|
||||
.isEmpty();
|
||||
}
|
||||
|
||||
private String outcomeFor(ProjectDescription projectDescription) {
|
||||
return this.projectTester.generate(projectDescription,
|
||||
(projectGenerationContext) -> {
|
||||
assertThat(projectGenerationContext.getBeansOfType(String.class))
|
||||
.hasSize(1);
|
||||
return projectGenerationContext.getBean(String.class);
|
||||
});
|
||||
@Test
|
||||
void outcomeWithSeveralRangesAndMatchingVersion() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setPlatformVersion(Version.parse("2.1.0.RELEASE"));
|
||||
assertThat(
|
||||
candidatesFor(projectDescription, PlatformVersionTestConfiguration.class,
|
||||
OneOrTwoPlatformVersionTestConfiguration.class))
|
||||
.containsOnlyKeys("second", "firstOrSecond");
|
||||
}
|
||||
|
||||
@Test
|
||||
void outcomeWithSeveralRangesAndNonMatchingVersion() {
|
||||
ProjectDescription projectDescription = new ProjectDescription();
|
||||
projectDescription.setPlatformVersion(Version.parse("2.0.0.M2"));
|
||||
assertThat(
|
||||
candidatesFor(projectDescription, PlatformVersionTestConfiguration.class,
|
||||
OneOrTwoPlatformVersionTestConfiguration.class))
|
||||
.containsOnlyKeys("second");
|
||||
}
|
||||
|
||||
private Map<String, String> candidatesFor(ProjectDescription projectDescription,
|
||||
Class<?>... extraConfigurations) {
|
||||
return this.projectTester.withConfiguration(extraConfigurations).generate(
|
||||
projectDescription, (projectGenerationContext) -> projectGenerationContext
|
||||
.getBeansOfType(String.class));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -105,4 +126,15 @@ class ConditionalOnPlatformVersionTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class OneOrTwoPlatformVersionTestConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnPlatformVersion({ "[1.0.0.RELEASE, 2.0.0.M1)", "2.0.0.RELEASE" })
|
||||
public String firstOrSecond() {
|
||||
return "oneOrTwo";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user