Skip to content

Commit

Permalink
Merge pull request #1228 from odrotbohm
Browse files Browse the repository at this point in the history
* pr/1228:
  Polish "Add support for Spring Modulith"
  Add support for Spring Modulith

Closes gh-1228
  • Loading branch information
snicoll committed Jul 10, 2023
2 parents 2472268 + 75fc90e commit 6894b54
Show file tree
Hide file tree
Showing 6 changed files with 240 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

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

import java.util.Collection;
import java.util.List;

import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.Dependency;
import io.spring.initializr.generator.buildsystem.Dependency.Builder;
import io.spring.initializr.generator.buildsystem.DependencyContainer;
import io.spring.initializr.generator.buildsystem.DependencyScope;
import io.spring.initializr.generator.spring.build.BuildCustomizer;

/**
* Registers Spring Modulith dependencies to the build file of the project to be created,
* in particular registering integration dependencies depending on others registered for
* inclusion as well (observability and persistence).
*
* @author Oliver Drotbohm
* @author Stephane Nicoll
*/
class SpringModulithBuildCustomizer implements BuildCustomizer<Build> {

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();
if (dependencies.has("actuator")) {
dependencies.add("modulith-actuator", modulithDependency("actuator").scope(DependencyScope.RUNTIME));
}
if (OBSERVABILITY_DEPENDENCIES.stream().anyMatch(dependencies::has)) {
dependencies.add("modulith-observability",
modulithDependency("observability").scope(DependencyScope.RUNTIME));
}
addEventPublicationRegistryBackend(build);
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", modulithDependency("starter-mongodb"));
}
if (dependencies.has("data-jdbc")) {
dependencies.add("modulith-starter-jdbc", modulithDependency("starter-jdbc"));
}
if (dependencies.has("data-jpa")) {
dependencies.add("modulith-starter-jpa", modulithDependency("starter-jpa"));
}
}

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

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

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

import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency;
import io.spring.initializr.generator.project.ProjectGenerationConfiguration;

import org.springframework.context.annotation.Bean;

/**
* Registers {@link SpringModulithBuildCustomizer} with the context to allow selecting
* Spring Modulith dependencies.
*
* @author Oliver Drotbohm
*/
@ProjectGenerationConfiguration
@ConditionalOnRequestedDependency("modulith")
class SpringModulithProjectGenerationConfiguration {

@Bean
SpringModulithBuildCustomizer springModulithBuildCustomizer() {
return new SpringModulithBuildCustomizer();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
* Extensions for generation of projects that depend on Spring Modulith.
*/
package io.spring.start.site.extension.dependency.springmodulith;
1 change: 1 addition & 0 deletions start-site/src/main/resources/META-INF/spring.factories
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ io.spring.start.site.extension.dependency.springboot.SpringBootProjectGeneration
io.spring.start.site.extension.dependency.springcloud.SpringCloudProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springdata.SpringDataProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springintegration.SpringIntegrationProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springmodulith.SpringModulithProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springpulsar.SpringPulsarProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.springrestdocs.SpringRestDocsProjectGenerationConfiguration,\
io.spring.start.site.extension.dependency.sqlserver.SqlServerProjectGenerationConfiguration,\
Expand Down
20 changes: 20 additions & 0 deletions start-site/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,13 @@ initializr:
version: 3.5.0
- compatibilityRange: "[3.0.0,3.1.0-M1)"
version: 4.0.0
spring-modulith:
groupId: org.springframework.modulith
artifactId: spring-modulith-bom
mappings:
- compatibility-range: "[3.1.0,3.2.0-M1)"
version: 1.0.0-M1
repositories: spring-milestones
spring-shell:
groupId: org.springframework.shell
artifactId: spring-shell-dependencies
Expand Down Expand Up @@ -252,6 +259,19 @@ initializr:
links:
- rel: reference
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.
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
@@ -0,0 +1,86 @@
/*
* Copyright 2012-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

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

import java.util.Arrays;

import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.maven.MavenBuild;
import io.spring.initializr.generator.version.Version;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.metadata.support.MetadataBuildItemResolver;
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.ValueSource;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Tests for {@link SpringModulithBuildCustomizer}.
*
* @author Oliver Drotbohm
*/
class SpringModulithBuildCustomizerTests extends AbstractExtensionTests {

private final SpringModulithBuildCustomizer customizer = new SpringModulithBuildCustomizer();

@Test
void registersTestStarterWhenModulithIsSelected() {
Build build = createBuild("modulith");
this.customizer.customize(build);
assertThat(build.dependencies().ids()).contains("modulith-starter-test");
}

@Test
void registersActuatorStarterIfActuatorsIsPresent() {
Build build = createBuild("modulith", "actuator");
this.customizer.customize(build);
assertThat(build.dependencies().ids()).contains("modulith-actuator");
}

@ParameterizedTest
@ValueSource(
strings = { "actuator", "datadog", "graphite", "influx", "new-relic", "prometheus", "wavefront", "zipkin" })
void registersObservabilityStarterIfObservabilityDependencyIsPresent(String dependency) {
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("modulith");
build.dependencies().add("data-" + store);
this.customizer.customize(build);
assertThat(build.dependencies().ids()).contains("modulith-starter-" + store);
}

private Build createBuild(String... dependencies) {
InitializrMetadata metadata = getMetadata();
MavenBuild build = new MavenBuild(new MetadataBuildItemResolver(metadata, getDefaultPlatformVersion(metadata)));
Arrays.stream(dependencies).forEach(build.dependencies()::add);
return build;
}

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

}

0 comments on commit 6894b54

Please sign in to comment.