Add jackson-module-kotlin when json facet and kotlin is in use

Closes gh-957
This commit is contained in:
Madhura Bhave
2019-07-16 12:37:40 -07:00
parent 70ae145694
commit 7cfb0c23e9
4 changed files with 176 additions and 2 deletions

View File

@@ -0,0 +1,56 @@
/*
* Copyright 2012-2019 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.initializr.generator.spring.code.kotlin;
import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.DependencyScope;
import io.spring.initializr.generator.language.kotlin.KotlinLanguage;
import io.spring.initializr.generator.project.ResolvedProjectDescription;
import io.spring.initializr.generator.spring.build.BuildCustomizer;
import io.spring.initializr.generator.spring.build.BuildMetadataResolver;
import io.spring.initializr.metadata.InitializrMetadata;
import org.springframework.util.ClassUtils;
/**
* A {@link BuildCustomizer} that automatically adds "jackson-module-kotlin" when Kotlin
* is used and a dependency has the "json" facet.
*
* @author Sebastien Deleuze
* @author Madhura Bhave
*/
public class KotlinJacksonBuildCustomizer implements BuildCustomizer<Build> {
private final BuildMetadataResolver buildMetadataResolver;
private final ResolvedProjectDescription description;
public KotlinJacksonBuildCustomizer(InitializrMetadata metadata, ResolvedProjectDescription description) {
this.buildMetadataResolver = new BuildMetadataResolver(metadata);
this.description = description;
}
@Override
public void customize(Build build) {
boolean isKotlin = ClassUtils.isAssignableValue(KotlinLanguage.class, this.description.getLanguage());
if (this.buildMetadataResolver.hasFacet(build, "json") && isKotlin) {
build.dependencies().add("jackson-module-kotlin", "com.fasterxml.jackson.module", "jackson-module-kotlin",
DependencyScope.COMPILE);
}
}
}

View File

@@ -32,6 +32,7 @@ import io.spring.initializr.generator.spring.code.MainSourceCodeProjectContribut
import io.spring.initializr.generator.spring.code.TestApplicationTypeCustomizer;
import io.spring.initializr.generator.spring.code.TestSourceCodeCustomizer;
import io.spring.initializr.generator.spring.code.TestSourceCodeProjectContributor;
import io.spring.initializr.metadata.InitializrMetadata;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.Bean;
@@ -83,4 +84,9 @@ public class KotlinProjectGenerationConfiguration {
return new SimpleKotlinProjectSettings(kotlinVersionResolver.resolveKotlinVersion(this.projectDescription));
}
@Bean
public KotlinJacksonBuildCustomizer kotlinJacksonBuildCustomizer(InitializrMetadata metadata) {
return new KotlinJacksonBuildCustomizer(metadata, this.projectDescription);
}
}

View File

@@ -0,0 +1,89 @@
/*
* Copyright 2012-2019 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.initializr.generator.spring.code.kotlin;
import java.util.Collections;
import io.spring.initializr.generator.buildsystem.maven.MavenBuild;
import io.spring.initializr.generator.language.java.JavaLanguage;
import io.spring.initializr.generator.language.kotlin.KotlinLanguage;
import io.spring.initializr.generator.project.ProjectDescription;
import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder;
import io.spring.initializr.generator.version.Version;
import io.spring.initializr.metadata.Dependency;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.metadata.support.MetadataBuildItemResolver;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link KotlinJacksonBuildCustomizer}.
*
* @author Sebastien Deleuze
* @author Stephane Nicoll
* @author Madhura Bhave
*/
class KotlinJacksonBuildCustomizerTests {
@Test
void customizeWhenJsonFacetPresentShouldAddJacksonKotlinModule() {
Dependency dependency = Dependency.withId("foo");
dependency.setFacets(Collections.singletonList("json"));
ProjectDescription description = new ProjectDescription();
description.setLanguage(new KotlinLanguage());
MavenBuild build = getCustomizedBuild(dependency, description);
io.spring.initializr.generator.buildsystem.Dependency jacksonKotlin = build.dependencies()
.get("jackson-module-kotlin");
assertThat(jacksonKotlin.getArtifactId()).isEqualTo("jackson-module-kotlin");
assertThat(jacksonKotlin.getGroupId()).isEqualTo("com.fasterxml.jackson.module");
}
@Test
void jacksonModuleKotlinIsNotAddedWithoutKotlin() {
Dependency dependency = Dependency.withId("foo");
dependency.setFacets(Collections.singletonList("json"));
ProjectDescription description = new ProjectDescription();
description.setLanguage(new JavaLanguage());
MavenBuild build = getCustomizedBuild(dependency, description);
io.spring.initializr.generator.buildsystem.Dependency jacksonKotlin = build.dependencies()
.get("jackson-module-kotlin");
assertThat(jacksonKotlin).isNull();
}
@Test
void jacksonModuleKotlinIsNotAddedWithoutJsonFacet() {
Dependency dependency = Dependency.withId("foo");
ProjectDescription description = new ProjectDescription();
description.setLanguage(new KotlinLanguage());
MavenBuild build = getCustomizedBuild(dependency, description);
io.spring.initializr.generator.buildsystem.Dependency jacksonKotlin = build.dependencies()
.get("jackson-module-kotlin");
assertThat(jacksonKotlin).isNull();
}
private MavenBuild getCustomizedBuild(Dependency dependency, ProjectDescription description) {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.addDependencyGroup("test", dependency).build();
KotlinJacksonBuildCustomizer customizer = new KotlinJacksonBuildCustomizer(metadata, description.resolve());
MavenBuild build = new MavenBuild(new MetadataBuildItemResolver(metadata, Version.parse("2.0.0.RELEASE")));
build.dependencies().add("foo");
customizer.customize(build);
return build;
}
}

View File

@@ -17,16 +17,22 @@
package io.spring.initializr.generator.spring.code.kotlin;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import io.spring.initializr.generator.buildsystem.Dependency;
import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem;
import io.spring.initializr.generator.language.kotlin.KotlinLanguage;
import io.spring.initializr.generator.packaging.war.WarPackaging;
import io.spring.initializr.generator.project.ProjectDescription;
import io.spring.initializr.generator.spring.build.BuildProjectGenerationConfiguration;
import io.spring.initializr.generator.spring.build.maven.MavenProjectGenerationConfiguration;
import io.spring.initializr.generator.spring.code.SourceCodeProjectGenerationConfiguration;
import io.spring.initializr.generator.spring.test.InitializrMetadataTestBuilder;
import io.spring.initializr.generator.test.project.ProjectAssetTester;
import io.spring.initializr.generator.test.project.ProjectStructure;
import io.spring.initializr.generator.version.Version;
import io.spring.initializr.metadata.InitializrMetadata;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@@ -46,10 +52,16 @@ class KotlinProjectGenerationConfigurationTests {
void setup(@TempDir Path directory) {
this.projectTester = new ProjectAssetTester().withIndentingWriterFactory()
.withConfiguration(SourceCodeProjectGenerationConfiguration.class,
KotlinProjectGenerationConfiguration.class)
KotlinProjectGenerationConfiguration.class, BuildProjectGenerationConfiguration.class,
MavenProjectGenerationConfiguration.class)
.withDirectory(directory)
.withBean(KotlinProjectSettings.class, () -> new SimpleKotlinProjectSettings("1.2.70"))
.withDescriptionCustomizer((description) -> {
.withBean(InitializrMetadata.class, () -> {
io.spring.initializr.metadata.Dependency dependency = io.spring.initializr.metadata.Dependency
.withId("foo");
dependency.setFacets(Collections.singletonList("json"));
return InitializrMetadataTestBuilder.withDefaults().addDependencyGroup("test", dependency).build();
}).withDescriptionCustomizer((description) -> {
description.setLanguage(new KotlinLanguage());
if (description.getPlatformVersion() == null) {
description.setPlatformVersion(Version.parse("2.1.0.RELEASE"));
@@ -110,4 +122,15 @@ class KotlinProjectGenerationConfigurationTests {
" return application.sources(KotlinDemoApplication::class.java)", " }", "", "}");
}
@Test
void jacksonKotlinModuleShouldBeAddedWhenJsonFacetPresent() {
ProjectDescription description = new ProjectDescription();
description.addDependency("foo", Dependency.withCoordinates("com.example", "foo").build());
ProjectStructure projectStructure = this.projectTester.generate(description);
List<String> lines = projectStructure.readAllLines("pom.xml");
assertThat(lines).contains(" <dependency>",
" <groupId>com.fasterxml.jackson.module</groupId>",
" <artifactId>jackson-module-kotlin</artifactId>", " </dependency>");
}
}