Skip to content

Commit 6eb8880

Browse files
committed
feat: add support for Kotlin+SpringBoot ProjectTemplates
1 parent 5bd4005 commit 6eb8880

File tree

31 files changed

+246
-134
lines changed

31 files changed

+246
-134
lines changed

.github/workflows/publish-maven-central.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ jobs:
5454
./plugins/java-to-jdl/target/site/jacoco/jacoco.csv
5555
./plugins/java-to-asyncapi/target/site/jacoco/jacoco.csv
5656
./plugins/backend-application-default/target/site/jacoco/jacoco.csv
57+
./plugins/backend-application-kotlin/target/site/jacoco/jacoco.csv
5758
./plugins/openapi-controllers/target/site/jacoco/jacoco.csv
5859
./plugins/zdl-to-openapi/target/site/jacoco/jacoco.csv
5960
./plugins/jdl-to-asyncapi/target/site/jacoco/jacoco.csv

.github/workflows/publish-maven-snapshots.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ jobs:
4747
./plugins/java-to-jdl/target/site/jacoco/jacoco.csv
4848
./plugins/java-to-asyncapi/target/site/jacoco/jacoco.csv
4949
./plugins/backend-application-default/target/site/jacoco/jacoco.csv
50+
./plugins/backend-application-kotlin/target/site/jacoco/jacoco.csv
5051
./plugins/openapi-controllers/target/site/jacoco/jacoco.csv
5152
./plugins/zdl-to-openapi/target/site/jacoco/jacoco.csv
5253
./plugins/jdl-to-asyncapi/target/site/jacoco/jacoco.csv

plugins/backend-application-default/src/main/java/io/zenwave360/sdk/plugins/BackendApplicationDefaultPlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.zenwave360.sdk.Plugin;
44
import io.zenwave360.sdk.doc.DocumentedPlugin;
55
import io.zenwave360.sdk.formatters.JavaFormatter;
6+
import io.zenwave360.sdk.formatters.KotlinFormatter;
67
import io.zenwave360.sdk.parsers.ZDLParser;
78
import io.zenwave360.sdk.processors.ZDLProcessor;
89
import io.zenwave360.sdk.writers.TemplateFileWriter;
@@ -40,7 +41,7 @@ public class BackendApplicationDefaultPlugin extends Plugin {
4041

4142
public BackendApplicationDefaultPlugin() {
4243
super();
43-
withChain(ZDLParser.class, ZDLProcessor.class, BackendApplicationDefaultGenerator.class, JavaFormatter.class, TemplateFileWriter.class);
44+
withChain(ZDLParser.class, ZDLProcessor.class, BackendApplicationDefaultGenerator.class, JavaFormatter.class, KotlinFormatter.class, TemplateFileWriter.class);
4445
}
4546

4647
@Override

plugins/backend-application-default/src/test/resources/jpa-elasticsearch-scs3-pom.xml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>3.3.1</version>
8+
<version>3.5.0</version>
99
<relativePath/> <!-- lookup parent from repository -->
1010
</parent>
1111
<groupId>tests</groupId>
@@ -19,7 +19,7 @@
1919
<spring-boot.version>${project.parent.version}</spring-boot.version>
2020
<archunit-junit5.version>1.0.1</archunit-junit5.version>
2121
<mapstruct.version>1.5.1.Final</mapstruct.version>
22-
<spring-cloud.version>2021.0.3</spring-cloud.version>
22+
<spring-cloud.version>2025.0.0</spring-cloud.version>
2323
<avro.version>1.11.1</avro.version>
2424
<testcontainers.version>1.17.2</testcontainers.version>
2525
<commons-lang3.version>3.12.0</commons-lang3.version>
@@ -132,13 +132,6 @@
132132
<artifactId>spring-boot-starter-test</artifactId>
133133
<scope>test</scope>
134134
</dependency>
135-
<dependency>
136-
<groupId>org.springframework.cloud</groupId>
137-
<artifactId>spring-cloud-stream</artifactId>
138-
<scope>test</scope>
139-
<classifier>test-binder</classifier>
140-
<type>test-jar</type>
141-
</dependency>
142135
<dependency>
143136
<groupId>org.springframework.security</groupId>
144137
<artifactId>spring-security-test</artifactId>

plugins/backend-application-default/src/test/resources/mongodb-elasticsearch-scs3-pom.xml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>3.3.1</version>
8+
<version>3.5.0</version>
99
<relativePath/> <!-- lookup parent from repository -->
1010
</parent>
1111
<groupId>tests</groupId>
@@ -19,7 +19,7 @@
1919
<spring-boot.version>${project.parent.version}</spring-boot.version>
2020
<archunit-junit5.version>1.0.1</archunit-junit5.version>
2121
<mapstruct.version>1.5.1.Final</mapstruct.version>
22-
<spring-cloud.version>2021.0.3</spring-cloud.version>
22+
<spring-cloud.version>2025.0.0</spring-cloud.version>
2323
<avro.version>1.11.1</avro.version>
2424
<testcontainers.version>1.17.2</testcontainers.version>
2525
<commons-lang3.version>3.12.0</commons-lang3.version>
@@ -126,13 +126,6 @@
126126
<artifactId>spring-boot-starter-test</artifactId>
127127
<scope>test</scope>
128128
</dependency>
129-
<dependency>
130-
<groupId>org.springframework.cloud</groupId>
131-
<artifactId>spring-cloud-stream</artifactId>
132-
<scope>test</scope>
133-
<classifier>test-binder</classifier>
134-
<type>test-jar</type>
135-
</dependency>
136129
<dependency>
137130
<groupId>org.springframework.security</groupId>
138131
<artifactId>spring-security-test</artifactId>

plugins/backend-application-kotlin/src/main/java/io/zenwave360/sdk/plugins/BackendApplicationKotlinHelpers.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package io.zenwave360.sdk.plugins;
22

33
import com.github.jknack.handlebars.Options;
4+
import io.zenwave360.sdk.options.PersistenceType;
45
import io.zenwave360.sdk.utils.JSONPath;
6+
import io.zenwave360.sdk.zdl.utils.ZDLFindUtils;
57
import io.zenwave360.sdk.zdl.utils.ZDLJavaSignatureUtils;
68

79
import java.util.*;
10+
import java.util.stream.Collectors;
811

912
public class BackendApplicationKotlinHelpers {
1013

@@ -19,6 +22,12 @@ public String methodParametersSignature(Map<String, Object> method, Options opti
1922
return ZDLJavaSignatureUtils.kotlinMethodParametersSignature(generator.getIdJavaType(), method, zdl);
2023
}
2124

25+
public String mapperInputSignature(String inputType, Options options) {
26+
var zdl = (Map) options.get("zdl");
27+
var signature = ZDLJavaSignatureUtils.mapperInputSignature(inputType, zdl);
28+
return ZDLJavaSignatureUtils.toKotlinMethodSignature(signature);
29+
}
30+
2231
public String returnType(Map<String, Object> method, Options options) {
2332
return ZDLJavaSignatureUtils.methodReturnType(method).replace("void", "Unit");
2433
}
@@ -37,13 +46,42 @@ public String relationshipFieldType(Map field, Options options) {
3746
};
3847

3948
public String relationshipFieldTypeInitializer(Map field, Options options) {
40-
return fixKotlinTypeInitializers(ZDLJavaSignatureUtils.relationshipFieldTypeInitializer(field));
49+
var typeInitializer = ZDLJavaSignatureUtils.relationshipFieldTypeInitializer(field);
50+
if(typeInitializer.trim().isEmpty()) {
51+
return " = null";
52+
}
53+
return fixKotlinTypeInitializers(typeInitializer);
4154
};
4255

4356
public String fieldTypeInitializer(Map field, Options options) {
44-
return fixKotlinTypeInitializers(ZDLJavaSignatureUtils.fieldTypeInitializer(field));
57+
var typeInitializer = fixKotlinTypeInitializers(ZDLJavaSignatureUtils.fieldTypeInitializer(field));
58+
if(typeInitializer.trim().isEmpty()) {
59+
return " = null";
60+
}
61+
return typeInitializer;
4562
};
4663

64+
public String idFieldInitialization(Map method, Options options) {
65+
var zdl = options.get("zdl");
66+
var hasNaturalId = JSONPath.get(method, "$.naturalId", false);
67+
if(hasNaturalId) {
68+
var entity = (Map) JSONPath.get(zdl, "$.allEntitiesAndEnums." + method.get("entity"));
69+
List<Map> fields = ZDLFindUtils.naturalIdFields(entity);
70+
return fields.stream().map(field -> String.format("val %s = %s;", field.get("name"), ZDLJavaSignatureUtils.populateField(field)))
71+
.collect(Collectors.joining("\n"));
72+
}
73+
return "val id: " + generator.getIdJavaType() + " = " + idInitialization(generator.getIdJavaType());
74+
}
75+
76+
private String idInitialization(String idJavaType) {
77+
return switch (idJavaType) {
78+
case "Long" -> "1L";
79+
case "Integer" -> "1";
80+
case "String" -> "\"1\"";
81+
default -> "";
82+
};
83+
}
84+
4785
private String fixKotlinTypeInitializers(String type) {
4886
return type
4987
.replaceAll("new HashSet<>\\(\\)", "mutableSetOf()")

plugins/backend-application-kotlin/src/main/resources/io/zenwave360/sdk/plugins/BackendApplicationDefaultGenerator/src/main/kotlin/core/domain/jpa/Entity.kt.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener
3434
data class {{entity.className}}(
3535
{{#unless (skipEntityId entity)~}}
3636
{{~> (partial 'partials/id' databaseType)}}
37-
var id: {{idJavaType}}?,
37+
var id: {{idJavaType}}? = null,
3838

3939
@Version
40-
var version: Int?,
40+
var version: Int? = null,
4141
{{/unless~}}
4242

4343
{{#each entity.fields as |field|}}

plugins/backend-application-kotlin/src/main/resources/io/zenwave360/sdk/plugins/BackendApplicationDefaultGenerator/src/main/kotlin/core/domain/vo/Entity.kt.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ data class {{entity.className}}(
1414
{{#each field.validations as |validation|~}}
1515
// @{{validation.name}}("{{validation.value}}")
1616
{{~/each}}
17-
var {{field.name}}: {{{fieldType field}}}{{#unless @last}},{{/unless}}
17+
var {{field.name}}: {{{fieldType field}}}?{{#unless @last}},{{/unless}}
1818
{{/each}}
1919
) {{addExtends entity}} : Serializable {
2020

@@ -30,4 +30,4 @@ data class {{entity.className}}(
3030
}
3131
{{~/if}}
3232
{{/each}}
33-
}
33+
}

plugins/backend-application-kotlin/src/main/resources/io/zenwave360/sdk/plugins/BackendApplicationDefaultGenerator/src/main/kotlin/core/implementation/imperative/ServiceImpl.kt.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import java.util.Optional
3535
*/
3636
@Service
3737
@Transactional(readOnly = true)
38-
class {{service.name}}Impl(
38+
open class {{service.name}}Impl(
3939
{{#each entities as |entity|}}
4040
{{~#unless (skipEntityRepository this)}}
4141
private val {{entity.instanceName}}Repository: {{entity.className}}Repository{{#unless @last}},{{/unless}}

plugins/backend-application-kotlin/src/main/resources/io/zenwave360/sdk/plugins/BackendApplicationDefaultGenerator/src/main/kotlin/core/implementation/mappers/ServiceMapper.kt.hbs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ interface {{service.name}}Mapper {
2525
fun as{{entity.className}}({{mapperInputSignature input.className}}): {{entity.className}}
2626
{{~/if}}
2727
{{#unless (skipEntityId entity)~}}@Mapping(target = "id", ignore = true){{/unless~}}
28-
fun update(entity: {{entity.className}}, {{mapperInputSignature input.className}}): {{entity.className}}
28+
fun update(@MappingTarget entity: {{entity.className}}, {{mapperInputSignature input.className}}): {{entity.className}}
2929
{{~/each}}
3030
// output mappings
3131
{{~#each (serviceEntityReturnTypePairs service) as |entry|}}
@@ -48,8 +48,8 @@ interface {{service.name}}Mapper {
4848
@AfterMapping
4949
fun manageRelationships(entity: {{entity.className}}) {
5050
{{~#each relationships as |relationship|}}
51-
entity.get{{capitalize relationship.fieldName}}()?.forEach { {{relationship.fieldName}} ->
52-
{{relationship.fieldName}}.set{{capitalize relationship.otherEntityFieldName}}(entity)
51+
entity.{{relationship.fieldName}}?.forEach { {{relationship.fieldName}} ->
52+
{{relationship.fieldName}}.{{relationship.otherEntityFieldName}} = entity
5353
}
5454
{{~/each}}
5555
}

0 commit comments

Comments
 (0)