Skip to content

Commit

Permalink
Polish "Add support for Spring Modulith"
Browse files Browse the repository at this point in the history
  • Loading branch information
snicoll committed Jul 10, 2023
1 parent 8e54024 commit 75fc90e
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,73 +32,43 @@
* inclusion as well (observability and persistence).
*
* @author Oliver Drotbohm
* @author Stephane Nicoll
*/
class SpringModulithBuildCustomizer implements BuildCustomizer<Build> {

static final String GROUP_ID = "org.springframework.experimental";
static final String BOM_ARTIFACT_ID = "spring-modulith-bom";

static final Collection<String> OBSERVABILITY_DEPENDENCIES = List.of("datadog", "graphite", "influx", "new-relic",
"prometheus", "wavefront", "zipkin");

private static final String ARTIFACT_PREFIX = "spring-modulith-";

private static final Builder<?> ACTUATOR = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "actuator")
.scope(DependencyScope.RUNTIME);

private static final Builder<?> OBSERVABILITY = Dependency
.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "observability")
.scope(DependencyScope.RUNTIME);

private static final Builder<?> STARTER_JDBC = Dependency.withCoordinates(GROUP_ID,
ARTIFACT_PREFIX + "starter-jdbc");

private static final Builder<?> STARTER_JPA = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "starter-jpa");

private static final Builder<?> STARTER_MONGODB = Dependency.withCoordinates(GROUP_ID,
ARTIFACT_PREFIX + "starter-mongodb");

private static final Builder<?> TEST = Dependency.withCoordinates(GROUP_ID, ARTIFACT_PREFIX + "starter-test")
.scope(DependencyScope.TEST_COMPILE);
private static final Collection<String> OBSERVABILITY_DEPENDENCIES = List.of("actuator", "datadog", "graphite",
"influx", "new-relic", "prometheus", "wavefront", "zipkin");

@Override
public void customize(Build build) {
DependencyContainer dependencies = build.dependencies();

// Actuator

if (dependencies.has("actuator")) {
dependencies.add("modulith-actuator", ACTUATOR);
dependencies.add("modulith-actuator", modulithDependency("actuator").scope(DependencyScope.RUNTIME));
}

// Observability

if (OBSERVABILITY_DEPENDENCIES.stream().anyMatch(dependencies::has)) {
dependencies.add("modulith-observability", OBSERVABILITY);
dependencies.add("modulith-observability",
modulithDependency("observability").scope(DependencyScope.RUNTIME));
}

// Event publication registry support

addEventPublicationRegistryBackend(build);

dependencies.add("modulith-starter-test", TEST);
dependencies.add("modulith-starter-test",
modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE));
}

private void addEventPublicationRegistryBackend(Build build) {

DependencyContainer dependencies = build.dependencies();

if (dependencies.has("data-mongodb")) {
dependencies.add("modulith-starter-mongodb", STARTER_MONGODB);
dependencies.add("modulith-starter-mongodb", modulithDependency("starter-mongodb"));
}

if (dependencies.has("data-jdbc")) {
dependencies.add("modulith-starter-jdbc", STARTER_JDBC);
dependencies.add("modulith-starter-jdbc", modulithDependency("starter-jdbc"));
}

if (dependencies.has("data-jpa")) {
dependencies.add("modulith-starter-jpa", STARTER_JPA);
dependencies.add("modulith-starter-jpa", modulithDependency("starter-jpa"));
}
}

private Builder<?> modulithDependency(String name) {
return Dependency.withCoordinates("org.springframework.modulith", "spring-modulith-" + name);
}

}
6 changes: 5 additions & 1 deletion start-site/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -261,13 +261,17 @@ initializr:
href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#features.docker-compose
- name: Spring Modulith
id: modulith
bom: spring-modulith
compatibility-range: "[3.1.0,3.2.0-M1)"
group-id: org.springframework.modulith
artifact-id: spring-modulith-starter-core
description: Support for building modular monolithic applications.
bom: spring-modulith
links:
- rel: reference
href: https://docs.spring.io/spring-modulith/docs/current/reference/html/
mappings:
- compatibilityRange: "[3.1.0,3.2.0-M1)"
starter: false
- name: Web
content:
- name: Spring Web
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package io.spring.start.site.extension.dependency.springmodulith;

import java.util.Collection;
import java.util.Arrays;

import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.maven.MavenBuild;
Expand All @@ -26,7 +26,6 @@
import io.spring.start.site.extension.AbstractExtensionTests;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;

import static org.assertj.core.api.Assertions.assertThat;
Expand All @@ -41,69 +40,47 @@ class SpringModulithBuildCustomizerTests extends AbstractExtensionTests {
private final SpringModulithBuildCustomizer customizer = new SpringModulithBuildCustomizer();

@Test
void registersCoreStarterByDefault() {
Build build = createBuild();
void registersTestStarterWhenModulithIsSelected() {
Build build = createBuild("modulith");
this.customizer.customize(build);

assertThat(build.dependencies().ids()).contains("modulith");
}

@Test
void registersTestStarterByDefault() {
Build build = createBuild();
this.customizer.customize(build);

assertThat(build.dependencies().ids()).contains("modulith-starter-test");
}

@Test
void registersActuatorStarterIfActuatorsIsPresent() {
Build build = createBuild();
build.dependencies().add("actuator");

Build build = createBuild("modulith", "actuator");
this.customizer.customize(build);

assertThat(build.dependencies().ids()).contains("modulith-actuator");
}

@ParameterizedTest
@MethodSource("observabilityDependencies")
@ValueSource(
strings = { "actuator", "datadog", "graphite", "influx", "new-relic", "prometheus", "wavefront", "zipkin" })
void registersObservabilityStarterIfObservabilityDependencyIsPresent(String dependency) {
Build build = createBuild();
Build build = createBuild("modulith");
build.dependencies().add(dependency);

this.customizer.customize(build);

assertThat(build.dependencies().ids()).contains("modulith-observability");
}

@ParameterizedTest
@ValueSource(strings = { "jdbc", "jpa", "mongodb" })
void presenceOfSpringDataModuleAddsModuleEventStarter(String store) {
Build build = createBuild();
Build build = createBuild("modulith");
build.dependencies().add("data-" + store);

this.customizer.customize(build);

assertThat(build.dependencies().ids()).contains("modulith-starter-" + store);
assertThat(build.boms().has("spring-modulith"));
}

private Build createBuild() {
private Build createBuild(String... dependencies) {
InitializrMetadata metadata = getMetadata();

Build build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata)));
build.dependencies().add("modulith");

MavenBuild build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata)));
Arrays.stream(dependencies).forEach(build.dependencies()::add);
return build;
}

private static Version getDefaultPlatformVersion(InitializrMetadata metadata) {
private Version getDefaultPlatformVersion(InitializrMetadata metadata) {
return Version.parse(metadata.getBootVersions().getDefault().getId());
}

private static Collection<String> observabilityDependencies() {
return SpringModulithBuildCustomizer.OBSERVABILITY_DEPENDENCIES;
}

}

0 comments on commit 75fc90e

Please sign in to comment.