Skip to content

Commit 7a19665

Browse files
committed
Merge branch 'feature/jspecify' into feature/sdk-fixes
# Conflicts: # pom.xml
2 parents 404ec63 + 15a667a commit 7a19665

File tree

17 files changed

+445
-41
lines changed

17 files changed

+445
-41
lines changed

plugins/backend-application-default/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Visit https://www.zenwave360.io/docs/zenwave-sdk/backend-application for complet
4141
| `style` | Programming Style | ProgrammingStyle | imperative | imperative, reactive |
4242
| `useLombok` | Use @Getter and @Setter annotations from Lombok | boolean | false | |
4343
| `useSpringModulith` | Whether to use Spring Modulith annotations and features | boolean | false | |
44+
| `useJSpecify` | Whether to use JSpecify for nullability annotations | boolean | false | |
4445
| `addRelationshipsById` | Controls whether to add a read/write relationship by id when mapping relationships between aggregate (not recommended) keeping the relationship by object readonly. | boolean | false | |
4546
| `idJavaType` | Specifies the Java data type for the ID fields of entities. Defaults to Long for JPA and String for MongoDB if not explicitly set. | String | | |
4647
| `includeEmitEventsImplementation` | Whether to add AsyncAPI/ApplicationEventPublisher as service dependencies. Depends on the naming convention of zenwave-asyncapi plugin to work. | boolean | true | |

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import io.zenwave360.sdk.doc.DocumentedOption;
44
import io.zenwave360.sdk.generators.Generator;
55
import io.zenwave360.sdk.options.PersistenceType;
6+
import io.zenwave360.sdk.plugins.annotators.AnnotationHelper;
7+
import io.zenwave360.sdk.plugins.annotators.JSpecifyAnnotator;
68
import io.zenwave360.sdk.utils.JSONPath;
79
import io.zenwave360.sdk.zdl.ProjectTemplates;
810
import io.zenwave360.sdk.zdl.layouts.CleanArchitectureProjectLayout;
911
import io.zenwave360.sdk.zdl.layouts.CleanHexagonalProjectLayout;
1012
import io.zenwave360.sdk.zdl.layouts.ProjectLayout;
13+
import io.zenwave360.sdk.zdl.utils.ZDLAnnotator;
1114
import io.zenwave360.sdk.zdl.utils.ZDLFindUtils;
1215

1316
import java.util.ArrayList;
@@ -24,6 +27,9 @@ public class BackendApplicationProjectTemplates extends ProjectTemplates {
2427
@DocumentedOption(description = "Whether to use Spring Modulith annotations and features")
2528
public boolean useSpringModulith = false;
2629

30+
@DocumentedOption(description = "Whether to use JSpecify for nullability annotations")
31+
public boolean useJSpecify = false;
32+
2733
public PersistenceType persistence = PersistenceType.mongodb;
2834

2935
public boolean includeEmitEventsImplementation = true;
@@ -54,9 +60,19 @@ public List<Object> getTemplateHelpers(Generator generator) {
5460
var helpers = new ArrayList<>(super.getTemplateHelpers(generator));
5561
helpers.add(new BackendApplicationDefaultHelpers((BackendApplicationDefaultGenerator) generator));
5662
helpers.add(new BackendApplicationDefaultJpaHelpers((BackendApplicationDefaultGenerator) generator));
63+
helpers.add(AnnotationHelper.class);
5764
return helpers;
5865
}
5966

67+
@Override
68+
public List<ZDLAnnotator> getZDLAnnotators() {
69+
var annotators = new ArrayList<>(super.getZDLAnnotators());
70+
if(useJSpecify) {
71+
annotators.add(new JSpecifyAnnotator());
72+
}
73+
return annotators;
74+
}
75+
6076
public BackendApplicationProjectTemplates() {
6177
setTemplatesFolder("io/zenwave360/sdk/plugins/BackendApplicationDefaultGenerator");
6278

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.zenwave360.sdk.plugins.annotators;
2+
3+
import com.github.jknack.handlebars.Options;
4+
import io.zenwave360.sdk.zdl.model.JavaZdlModel;
5+
6+
import java.util.Map;
7+
import java.util.stream.Collectors;
8+
9+
public class AnnotationHelper {
10+
public static String annotate(Object javaModel, Options options) {
11+
var zdl = (Map) options.get("zdl");
12+
var model = options.param(0);
13+
if(javaModel instanceof JavaZdlModel.Service) {
14+
return annotate((JavaZdlModel.Service) javaModel, (Map) model, zdl);
15+
}
16+
if(javaModel instanceof JavaZdlModel.ServiceMethod) {
17+
return annotate((JavaZdlModel.ServiceMethod) javaModel, (Map) model, zdl);
18+
}
19+
return "";
20+
}
21+
22+
public static String addImports(Object javaModel, Options options) {
23+
var zdl = (Map) options.get("zdl");
24+
var model = options.param(0);
25+
if(javaModel instanceof JavaZdlModel.Service) {
26+
return addImports((JavaZdlModel.Service) javaModel, (Map) model, zdl);
27+
}
28+
return "";
29+
}
30+
31+
private static String addImports(JavaZdlModel.Service service, Map<String, Object> zdlService, Map<String, Object> zdl) {
32+
return service.annotations().stream().map(a -> "import " + a.name()).collect(Collectors.joining(";\n"));
33+
}
34+
35+
36+
private static String annotate(JavaZdlModel.Service service, Map<String, Object> zdlService, Map<String, Object> zdl) {
37+
return service.annotations().stream().map(a -> "@" + a.name()).collect(Collectors.joining("\n"));
38+
}
39+
40+
private static String annotate(JavaZdlModel.ServiceMethod serviceMethod, Map<String, Object> zdlMethod, Map<String, Object> zdl) {
41+
return "// todo";
42+
}
43+
44+
private static String annotate(JavaZdlModel.MethodParameter methodParameter, Map<String, Object> zdlService, Map<String, Object> zdl) {
45+
return methodParameter.annotations().stream().map(a -> "@" + a.name()).collect(Collectors.joining("\n"));
46+
}
47+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.zenwave360.sdk.plugins.annotators;
2+
3+
import io.zenwave360.sdk.zdl.model.JavaZdlModel;
4+
import io.zenwave360.sdk.zdl.utils.ZDLAnnotator;
5+
6+
import java.util.Map;
7+
8+
public class JSpecifyAnnotator implements ZDLAnnotator {
9+
10+
@Override
11+
public void annotate(JavaZdlModel.Service service, Map<String, Object> zdlService, Map<String, Object> zdl) {
12+
service.annotations().add(new JavaZdlModel.Annotation("org.jspecify.annotations.NullMarked", null, null));
13+
}
14+
15+
@Override
16+
public void annotate(JavaZdlModel.MethodParameter methodParameter, Map<String, Object> method, Map<String, Object> zdl) {
17+
if(methodParameter.isOptional()) {
18+
methodParameter.annotations().add(new JavaZdlModel.Annotation("org.jspecify.annotations.Nullable", null, null));
19+
}
20+
}
21+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ import org.springframework.transaction.annotation.Transactional;
3939
{{~#if useLombok}}
4040
@lombok.AllArgsConstructor
4141
{{~/if}}
42+
{{~#if useSpringModulith}}
43+
@org.springframework.modulith.NamedInterface("{{service.name}}")
44+
{{~/if}}
45+
{{annotate service.javaService service}}
4246
public class {{service.name}}Impl implements {{service.name}} {
4347

4448
private final Logger log = LoggerFactory.getLogger(getClass());

plugins/backend-application-default/src/main/resources/io/zenwave360/sdk/plugins/BackendApplicationDefaultGenerator/src/main/java/core/inbound/Service.java.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import org.springframework.data.domain.Pageable;
1717
{{~#if useSpringModulith}}
1818
@org.springframework.modulith.NamedInterface("{{service.name}}")
1919
{{~/if}}
20+
{{annotate service.javaService service}}
2021
public interface {{service.name}} {
2122

2223
{{#each service.methods as |method|}}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@
128128
<version>${lombok.version}</version>
129129
<optional>true</optional>
130130
</dependency>
131+
<dependency>
132+
<groupId>org.jspecify</groupId>
133+
<artifactId>jspecify</artifactId>
134+
<version>1.0.0</version>
135+
</dependency>
131136

132137
<dependency>
133138
<groupId>org.mariadb.jdbc</groupId>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@
114114
<version>${lombok.version}</version>
115115
<optional>true</optional>
116116
</dependency>
117+
<dependency>
118+
<groupId>org.jspecify</groupId>
119+
<artifactId>jspecify</artifactId>
120+
<version>1.0.0</version>
121+
</dependency>
117122

118123
<dependency>
119124
<groupId>org.springframework.boot</groupId>

zenwave-sdk-cli/src/main/java/io/zenwave360/sdk/generators/ZDLProjectGenerator.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
package io.zenwave360.sdk.generators;
22

33
import com.fasterxml.jackson.annotation.JsonAnySetter;
4-
import com.fasterxml.jackson.databind.DeserializationFeature;
5-
import com.fasterxml.jackson.databind.JsonMappingException;
6-
import com.fasterxml.jackson.databind.ObjectMapper;
7-
import io.zenwave360.sdk.templating.HandlebarsEngine;
84
import io.zenwave360.sdk.templating.TemplateInput;
95
import io.zenwave360.sdk.templating.TemplateOutput;
10-
import io.zenwave360.sdk.utils.CommaSeparatedCollectionDeserializationHandler;
116
import io.zenwave360.sdk.utils.JSONPath;
127
import io.zenwave360.sdk.zdl.GeneratedProjectFiles;
138
import io.zenwave360.sdk.zdl.ProjectTemplates;
149
import io.zenwave360.sdk.zdl.layouts.ProjectLayout;
10+
import io.zenwave360.sdk.zdl.model.JavaZdlModel;
11+
import io.zenwave360.sdk.zdl.utils.ZDLAnnotator;
1512
import io.zenwave360.sdk.zdl.utils.ZDLFindUtils;
1613

1714
import java.util.*;
@@ -45,6 +42,10 @@ public GeneratedProjectFiles generateProjectFiles(Map<String, Object> contextMod
4542
var generatedProjectFiles = new GeneratedProjectFiles();
4643
var apiModel = getZDLModel(contextModel);
4744

45+
for (ZDLAnnotator zdlAnnotator : templates.getZDLAnnotators()) {
46+
zdlAnnotator.annotate((JavaZdlModel) apiModel.get("javaModel"), apiModel);
47+
}
48+
4849
Map<String, Map<String, Object>> aggregates = (Map) apiModel.get("aggregates");
4950
Set<Map<String, Object>> domainEvents = new HashSet<>();
5051
for (Map<String, Object> aggregate : aggregates.values()) {
@@ -139,11 +140,10 @@ public GeneratedProjectFiles generateProjectFiles(Map<String, Object> contextMod
139140
}
140141
}
141142

142-
Map<String, Map<String, Object>> services = JSONPath.get(apiModel, "$.options.options.service", Collections.emptyMap());
143+
Map<String, Map<String, Object>> services = JSONPath.get(apiModel, "$.services", Collections.emptyMap());
143144
List<Map<String, Object>> servicesList = new ArrayList<>();
144145
for (Map<String, Object> service : services.values()) {
145-
String serviceName = ((String) service.get("value"));
146-
service.put("name", serviceName);
146+
String serviceName = ((String) service.get("name"));
147147
List<Map<String, Object>> entitiesByService = getEntitiesByService(service, apiModel);
148148
service.put("entities", entitiesByService);
149149
// boolean isGenerateService = entitiesByService.stream().anyMatch(entity -> isGenerateEntity(entity));

zenwave-sdk-cli/src/main/java/io/zenwave360/sdk/plugins/ZdlToJsonPlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ public ZdlToJsonPlugin() {
2020

2121
@Override
2222
public Map<String, Object> process(Map<String, Object> contextModel) {
23-
var zdl = contextModel.get("zdl");
23+
var zdl = (Map) contextModel.get("zdl");
24+
zdl.remove("javaModel");
2425
ObjectMapper objectMapper = new ObjectMapper();
2526
try {
2627
var json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(zdl);

0 commit comments

Comments
 (0)