diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java index c781faf4..4adab3a8 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java @@ -467,6 +467,11 @@ public class ProjectGenerator { // Java versions model.put("java8OrLater", isJava8OrLater(request)); + // Has JPA facet + if (request.hasJpaFacet()) { + model.put("jpaFacet", true); + } + // Append the project request to the model BeanWrapperImpl bean = new BeanWrapperImpl(request); for (PropertyDescriptor descriptor : bean.getPropertyDescriptors()) { diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java index cccc78be..4341ba94 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectRequest.java @@ -312,6 +312,14 @@ public class ProjectRequest extends BasicProjectRequest { return hasFacet("web"); } + /** + * Specify if this request has the jpa facet enabled. + * @return {@code true} if the project has the jpa facet + */ + public boolean hasJpaFacet() { + return hasFacet("jpa"); + } + /** * Specify if this request has the specified facet enabled. * @param facet the facet to check diff --git a/initializr-generator/src/main/resources/templates/starter-build.gradle b/initializr-generator/src/main/resources/templates/starter-build.gradle index 59850a25..6c3c1a98 100644 --- a/initializr-generator/src/main/resources/templates/starter-build.gradle +++ b/initializr-generator/src/main/resources/templates/starter-build.gradle @@ -19,6 +19,9 @@ buildscript { {{#kotlin}} classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}") classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}") + {{#jpaFacet}} + classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}") + {{/jpaFacet}} {{/kotlin}} } } @@ -26,6 +29,9 @@ buildscript { apply plugin: '{{language}}' {{#kotlin}} apply plugin: 'kotlin-spring' +{{#jpaFacet}} +apply plugin: 'kotlin-jpa' +{{/jpaFacet}} {{/kotlin}} {{#war}} apply plugin: 'eclipse-wtp' diff --git a/initializr-generator/src/main/resources/templates/starter-pom.xml b/initializr-generator/src/main/resources/templates/starter-pom.xml index 5636da6e..95c9fa45 100644 --- a/initializr-generator/src/main/resources/templates/starter-pom.xml +++ b/initializr-generator/src/main/resources/templates/starter-pom.xml @@ -195,6 +195,9 @@ spring + {{#jpaFacet}} + jpa + {{/jpaFacet}} {{^kotlinSupport}} {{#java8OrLater}} diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java index ce7838d3..2ce15680 100755 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorTests.java @@ -960,4 +960,92 @@ public class ProjectGeneratorTests extends AbstractProjectGeneratorTests { } } + @Test + public void kotlinWithMavenUseJpaFacetHasJpaKotlinPlugin() { + Dependency jpa = Dependency.withId("data-jpa"); + jpa.setFacets(Collections.singletonList("jpa")); + InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() + .addDependencyGroup("data-jpa", jpa).build(); + applyMetadata(metadata); + + ProjectRequest request = createProjectRequest("data-jpa"); + request.setType("maven-project"); + request.setLanguage("kotlin"); + assertThat(generateMavenPom(request).getMavenPom()) + .contains("jpa"); + } + + @Test + public void kotlinWithMavenWithoutJpaFacetDoesNotHaveJpaKotlinPlugin() { + Dependency jpa = Dependency.withId("data-jpa"); + InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() + .addDependencyGroup("data-jpa", jpa).build(); + applyMetadata(metadata); + + ProjectRequest request = createProjectRequest("data-jpa"); + request.setType("maven-project"); + request.setLanguage("kotlin"); + assertThat(generateMavenPom(request).getMavenPom()) + .doesNotContain("jpa"); + } + + @Test + public void javaWithMavenUseJpaFacetDoesNotHaveJpaKotlinPlugin() { + Dependency jpa = Dependency.withId("data-jpa"); + jpa.setFacets(Collections.singletonList("jpa")); + InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() + .addDependencyGroup("data-jpa", jpa).build(); + applyMetadata(metadata); + + ProjectRequest request = createProjectRequest("data-jpa"); + request.setType("maven-project"); + request.setLanguage("java"); + assertThat(generateMavenPom(request).getMavenPom()) + .doesNotContain("jpa"); + } + + @Test + public void kotlinWithGradleUseJpaFacetHasJpaKotlinPlugin() { + Dependency jpa = Dependency.withId("data-jpa"); + jpa.setFacets(Collections.singletonList("jpa")); + InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() + .addDependencyGroup("data-jpa", jpa).build(); + applyMetadata(metadata); + + ProjectRequest request = createProjectRequest("data-jpa"); + request.setType("gradle-project"); + request.setLanguage("kotlin"); + assertThat(generateGradleBuild(request).getGradleBuild()) + .contains("apply plugin: 'kotlin-jpa'"); + } + + @Test + public void kotlinWithGradleWithoutJpaFacetDoesNotHaveJpaKotlinPlugin() { + Dependency jpa = Dependency.withId("data-jpa"); + InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() + .addDependencyGroup("data-jpa", jpa).build(); + applyMetadata(metadata); + + ProjectRequest request = createProjectRequest("data-jpa"); + request.setType("gradle-project"); + request.setLanguage("kotlin"); + assertThat(generateGradleBuild(request).getGradleBuild()) + .doesNotContain("apply plugin: 'kotlin-jpa'"); + } + + @Test + public void javaWithGradleUseJpaFacetDoesNotHaveJpaKotlinPlugin() { + Dependency jpa = Dependency.withId("data-jpa"); + jpa.setFacets(Collections.singletonList("jpa")); + InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() + .addDependencyGroup("data-jpa", jpa).build(); + applyMetadata(metadata); + + ProjectRequest request = createProjectRequest("data-jpa"); + request.setType("gradle-project"); + request.setLanguage("java"); + assertThat(generateGradleBuild(request).getGradleBuild()) + .doesNotContain("apply plugin: 'kotlin-jpa'"); + } + } diff --git a/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java b/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java index fb0b943d..1ea3693a 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java +++ b/initializr-generator/src/test/java/io/spring/initializr/test/generator/PomAssert.java @@ -46,6 +46,8 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class PomAssert { + private final String content; + private final XpathEngine eng; private final Document doc; @@ -61,6 +63,7 @@ public class PomAssert { private final Map repositories = new LinkedHashMap<>(); public PomAssert(String content) { + this.content = content; this.eng = XMLUnit.newXpathEngine(); Map context = new LinkedHashMap<>(); context.put("pom", "http://maven.apache.org/POM/4.0.0"); @@ -298,6 +301,10 @@ public class PomAssert { return this; } + public String getMavenPom() { + return this.content; + } + private PomAssert hasPluginRepository(String name) { NodeList nodes; try { diff --git a/initializr-service/src/main/resources/application.yml b/initializr-service/src/main/resources/application.yml index 2864e043..764152fc 100644 --- a/initializr-service/src/main/resources/application.yml +++ b/initializr-service/src/main/resources/application.yml @@ -481,6 +481,8 @@ initializr: id: data-jpa description: Java Persistence API including spring-data-jpa, spring-orm and Hibernate weight: 100 + facets: + - jpa aliases: - jpa links: