Skip to content

Commit fbadbfd

Browse files
authored
Merge pull request #635 from fjtirado/Fix_#634
[Fix #634] Generated classes to not depend on jackson
2 parents b92d7be + 7f62ffd commit fbadbfd

File tree

24 files changed

+827
-251
lines changed

24 files changed

+827
-251
lines changed

api/pom.xml

Lines changed: 51 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,28 @@
1414

1515
<dependencies>
1616
<dependency>
17-
<groupId>org.slf4j</groupId>
18-
<artifactId>slf4j-api</artifactId>
17+
<groupId>io.serverlessworkflow</groupId>
18+
<artifactId>serverlessworkflow-types</artifactId>
19+
<version>${project.version}</version>
1920
</dependency>
2021
<dependency>
21-
<groupId>com.fasterxml.jackson.core</groupId>
22-
<artifactId>jackson-core</artifactId>
22+
<groupId>io.serverlessworkflow</groupId>
23+
<artifactId>serverlessworkflow-serialization</artifactId>
24+
<version>${project.version}</version>
2325
</dependency>
2426
<dependency>
25-
<groupId>com.networknt</groupId>
26-
<artifactId>json-schema-validator</artifactId>
27+
<groupId>org.slf4j</groupId>
28+
<artifactId>slf4j-api</artifactId>
2729
</dependency>
2830
<dependency>
29-
<groupId>com.fasterxml.jackson.core</groupId>
30-
<artifactId>jackson-databind</artifactId>
31+
<groupId>com.networknt</groupId>
32+
<artifactId>json-schema-validator</artifactId>
3133
</dependency>
3234
<dependency>
3335
<groupId>com.fasterxml.jackson.dataformat</groupId>
3436
<artifactId>jackson-dataformat-yaml</artifactId>
3537
</dependency>
36-
<dependency>
37-
<groupId>jakarta.validation</groupId>
38-
<artifactId>jakarta.validation-api</artifactId>
39-
</dependency>
38+
4039
<dependency>
4140
<groupId>org.hibernate.validator</groupId>
4241
<artifactId>hibernate-validator</artifactId>
@@ -79,54 +78,46 @@
7978
<scope>test</scope>
8079
</dependency>
8180
</dependencies>
82-
83-
8481
<build>
85-
<plugins>
86-
<plugin>
87-
<groupId>org.jsonschema2pojo</groupId>
88-
<artifactId>jsonschema2pojo-maven-plugin</artifactId>
82+
<plugins>
83+
84+
<plugin>
85+
<groupId>io.serverlessworkflow</groupId>
86+
<artifactId>jackson-generator</artifactId>
87+
<version>${project.version}</version>
88+
<dependencies/>
89+
<configuration>
90+
<targetPackage>io.serverlessworkflow.api.types</targetPackage>
91+
</configuration>
92+
<executions>
93+
<execution>
94+
<goals>
95+
<goal>generate</goal>
96+
</goals>
97+
<phase>generate-sources</phase>
98+
</execution>
99+
</executions>
100+
</plugin>
101+
<plugin>
102+
<!-- a hint for IDE's to add the java sources to the classpath -->
103+
<groupId>org.codehaus.mojo</groupId>
104+
<artifactId>build-helper-maven-plugin</artifactId>
105+
<version>3.3.0</version>
106+
<executions>
107+
<execution>
108+
<id>add-mixin</id>
109+
<phase>generate-sources</phase>
110+
<goals>
111+
<goal>add-source</goal>
112+
</goals>
89113
<configuration>
90-
<sourceDirectory>${basedir}/src/main/resources/schema</sourceDirectory>
91-
<!--The comment below is left intentionally in case jsonschema2pojo one day accepts https urls. That day we can remove the file from schema dir and use directly the real schema-->
92-
<!-- <sourcePaths>
93-
<sourcePath>https://raw.githubusercontent.com/serverlessworkflow/specification/main/schema/workflow.yaml</sourcePath>
94-
</sourcePaths> -->
95-
<sourceType>yamlschema</sourceType>
96-
<targetPackage>io.serverlessworkflow.api.types</targetPackage>
97-
<outputDirectory>${project.build.directory}/generated-sources/src/main/java</outputDirectory>
98-
<includeJsr303Annotations>true</includeJsr303Annotations>
99-
<generateBuilders>true</generateBuilders>
100-
<initializeCollections>true</initializeCollections>
101-
<includeAdditionalProperties>true</includeAdditionalProperties>
102-
<includeToString>false</includeToString>
103-
<includeHashcodeAndEquals>false</includeHashcodeAndEquals>
104-
<includeConstructors>true</includeConstructors>
105-
<constructorsRequiredPropertiesOnly>true</constructorsRequiredPropertiesOnly>
106-
<useTitleAsClassname>true</useTitleAsClassname>
107-
<serializable>true</serializable>
108-
<targetVersion>${java.version}</targetVersion>
109-
<usePrimitives>true</usePrimitives>
110-
<useJakartaValidation>true</useJakartaValidation>
111-
<customRuleFactory>io.serverlessworkflow.generator.UnreferencedFactory</customRuleFactory>
112-
<customAnnotator>io.serverlessworkflow.generator.ConstAnnotator</customAnnotator>
114+
<sources>
115+
<source>${project.build.directory}/generated-sources/jacksonmixinpojo</source>
116+
</sources>
113117
</configuration>
114-
<dependencies>
115-
<dependency>
116-
<groupId>io.serverlessworkflow</groupId>
117-
<artifactId>serverless-workflow-custom-generator</artifactId>
118-
<version>${project.version}</version>
119-
</dependency>
120-
</dependencies>
121-
<executions>
122-
<execution>
123-
<goals>
124-
<goal>generate</goal>
125-
</goals>
126-
<phase>generate-sources</phase>
127-
</execution>
128-
</executions>
129-
</plugin>
130-
</plugins>
131-
</build>
132-
</project>
118+
</execution>
119+
</executions>
120+
</plugin>
121+
</plugins>
122+
</build>
123+
</project>

api/src/main/java/io/serverlessworkflow/api/ObjectMapperFactory.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
*/
1616
package io.serverlessworkflow.api;
1717

18+
import com.fasterxml.jackson.annotation.JsonInclude.Include;
1819
import com.fasterxml.jackson.databind.ObjectMapper;
1920
import com.fasterxml.jackson.databind.SerializationFeature;
2021
import com.fasterxml.jackson.databind.module.SimpleModule;
2122
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
2223
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
24+
import io.serverlessworkflow.api.types.JacksonMixInModule;
2325
import io.serverlessworkflow.serialization.BeanDeserializerModifierWithValidation;
2426
import io.serverlessworkflow.serialization.URIDeserializer;
2527
import io.serverlessworkflow.serialization.URISerializer;
@@ -47,10 +49,12 @@ private static ObjectMapper configure(ObjectMapper mapper) {
4749
validationModule.setDeserializerModifier(new BeanDeserializerModifierWithValidation());
4850

4951
return mapper
52+
.setSerializationInclusion(Include.NON_NULL)
5053
.configure(SerializationFeature.INDENT_OUTPUT, true)
5154
.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, false)
5255
.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false)
53-
.registerModule(validationModule);
56+
.registerModule(validationModule)
57+
.registerModule(new JacksonMixInModule());
5458
}
5559

5660
private ObjectMapperFactory() {}

custom-generator/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
<groupId>org.jsonschema2pojo</groupId>
1313
<artifactId>jsonschema2pojo-core</artifactId>
1414
</dependency>
15+
<dependency>
16+
<groupId>io.serverlessworkflow</groupId>
17+
<artifactId>serverlessworkflow-annotations</artifactId>
18+
<version>${project.version}</version>
19+
</dependency>
20+
1521
</dependencies>
1622
<build>
1723
<plugins>

custom-generator/src/main/java/io/serverlessworkflow/generator/AllAnyOneOfSchemaRule.java

Lines changed: 8 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
package io.serverlessworkflow.generator;
1717

1818
import com.fasterxml.jackson.databind.JsonNode;
19-
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
20-
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
2119
import com.fasterxml.jackson.databind.node.ArrayNode;
20+
import com.sun.codemodel.JAnnotationArrayMember;
2221
import com.sun.codemodel.JBlock;
2322
import com.sun.codemodel.JClass;
2423
import com.sun.codemodel.JClassAlreadyExistsException;
@@ -33,6 +32,9 @@
3332
import com.sun.codemodel.JPackage;
3433
import com.sun.codemodel.JType;
3534
import com.sun.codemodel.JVar;
35+
import io.serverlessworkflow.annotations.OneOfSetter;
36+
import io.serverlessworkflow.annotations.OneOfValueProvider;
37+
import io.serverlessworkflow.annotations.Union;
3638
import jakarta.validation.ConstraintViolationException;
3739
import java.io.UnsupportedEncodingException;
3840
import java.net.URI;
@@ -316,28 +318,11 @@ private JDefinedClass populateOneOf(
316318
commonType.orElse(definedClass.owner().ref(Object.class)),
317319
ruleFactory.getNameHelper().getPropertyName("value", null),
318320
null);
319-
320321
definedClass._implements(
321-
definedClass
322-
.owner()
323-
.ref(GeneratorUtils.ONE_OF_VALUE_PROVIDER_INTERFACE_NAME)
324-
.narrow(valueField.type()));
322+
definedClass.owner().ref(OneOfValueProvider.class).narrow(valueField.type()));
325323
GeneratorUtils.implementInterface(definedClass, valueField);
326-
try {
327-
JDefinedClass serializer = generateSerializer(definedClass);
328-
definedClass.annotate(JsonSerialize.class).param("using", serializer);
329-
} catch (JClassAlreadyExistsException ex) {
330-
// already serialized aware
331-
}
332-
333-
try {
334-
JDefinedClass deserializer =
335-
generateDeserializer(definedClass, oneOfTypes, "deserializeOneOf");
336-
definedClass.annotate(JsonDeserialize.class).param("using", deserializer);
337-
} catch (JClassAlreadyExistsException ex) {
338-
// already deserialized aware
339-
}
340-
324+
JAnnotationArrayMember unionAnnotation = definedClass.annotate(Union.class).paramArray("value");
325+
oneOfTypes.forEach(t -> unionAnnotation.param(t.getType()));
341326
return wrapAll(parentSchema, definedClass, commonType, oneOfTypes, Optional.of(valueField));
342327
}
343328

@@ -388,51 +373,6 @@ private static boolean isStringType(JType type) {
388373
return type.name().equals("String");
389374
}
390375

391-
private JDefinedClass generateSerializer(JDefinedClass relatedClass)
392-
throws JClassAlreadyExistsException {
393-
JDefinedClass definedClass = GeneratorUtils.serializerClass(relatedClass);
394-
GeneratorUtils.fillSerializer(
395-
definedClass,
396-
relatedClass,
397-
(method, valueParam, genParam) ->
398-
method
399-
.body()
400-
.staticInvoke(
401-
definedClass.owner().ref(GeneratorUtils.SERIALIZE_HELPER_NAME),
402-
"serializeOneOf")
403-
.arg(genParam)
404-
.arg(valueParam));
405-
return definedClass;
406-
}
407-
408-
private JDefinedClass generateDeserializer(
409-
JDefinedClass relatedClass, Collection<JTypeWrapper> oneOfTypes, String methodName)
410-
throws JClassAlreadyExistsException {
411-
JDefinedClass definedClass = GeneratorUtils.deserializerClass(relatedClass);
412-
GeneratorUtils.fillDeserializer(
413-
definedClass,
414-
relatedClass,
415-
(method, parserParam) -> {
416-
JBlock body = method.body();
417-
418-
body._return(
419-
definedClass
420-
.owner()
421-
.ref(GeneratorUtils.DESERIALIZE_HELPER_NAME)
422-
.staticInvoke(methodName)
423-
.arg(parserParam)
424-
.arg(relatedClass.dotclass())
425-
.arg(list(definedClass, oneOfTypes)));
426-
});
427-
return definedClass;
428-
}
429-
430-
private JInvocation list(JDefinedClass definedClass, Collection<JTypeWrapper> list) {
431-
JInvocation result = definedClass.owner().ref(List.class).staticInvoke("of");
432-
list.forEach(c -> result.arg(((JClass) c.getType()).dotclass()));
433-
return result;
434-
}
435-
436376
private void wrapIt(
437377
Schema parentSchema,
438378
JDefinedClass definedClass,
@@ -460,7 +400,7 @@ private JVar setupMethod(
460400
v -> {
461401
method.body().assign(JExpr._this().ref(v), methodParam);
462402
method
463-
.annotate(definedClass.owner().ref(GeneratorUtils.SETTER_ANNOTATION_NAME))
403+
.annotate(definedClass.owner().ref(OneOfSetter.class))
464404
.param("value", instanceField.type());
465405
});
466406
return methodParam;

custom-generator/src/main/java/io/serverlessworkflow/generator/ConstAnnotator.java renamed to custom-generator/src/main/java/io/serverlessworkflow/generator/CustomAnnotator.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,24 @@
1818
import com.fasterxml.jackson.databind.JsonNode;
1919
import com.sun.codemodel.JDefinedClass;
2020
import com.sun.codemodel.JFieldVar;
21+
import io.serverlessworkflow.annotations.AdditionalProperties;
2122
import jakarta.validation.constraints.Pattern;
2223
import org.jsonschema2pojo.AbstractAnnotator;
2324
import org.jsonschema2pojo.GenerationConfig;
2425

25-
public class ConstAnnotator extends AbstractAnnotator {
26+
public class CustomAnnotator extends AbstractAnnotator {
2627

2728
private static final String CONST = "const";
2829

29-
public ConstAnnotator(GenerationConfig generationConfig) {
30+
public CustomAnnotator(GenerationConfig generationConfig) {
3031
super(generationConfig);
3132
}
3233

34+
@Override
35+
public void additionalPropertiesField(JFieldVar field, JDefinedClass clazz, String propertyName) {
36+
clazz.annotate(AdditionalProperties.class);
37+
}
38+
3339
@Override
3440
public void propertyField(
3541
JFieldVar field, JDefinedClass clazz, String propertyName, JsonNode propertyNode) {

0 commit comments

Comments
 (0)