Skip to content

Commit ca5a9de

Browse files
Merge pull request #414 from fjtirado/Adding_listen_to_test
Fix #412 Adding OneOf support to EventConsumptionStrategy
2 parents 51f4a3e + 56cab35 commit ca5a9de

File tree

5 files changed

+82
-42
lines changed

5 files changed

+82
-42
lines changed

api/src/test/java/io/serverlessworkflow/api/FeaturesTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ public class FeaturesTest {
4242
"features/raise.yaml",
4343
"features/set.yaml",
4444
"features/switch.yaml",
45-
"features/try.yaml"
45+
"features/try.yaml",
46+
"features/listen.yaml"
4647
})
4748
public void testSpecFeaturesParsing(String workflowLocation) throws IOException {
4849
Workflow workflow = readWorkflowFromClasspath(workflowLocation);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
document:
2+
dsl: 1.0.0-alpha1
3+
namespace: default
4+
name: listen-task
5+
do:
6+
- listenToSomething:
7+
listen:
8+
to:
9+
any:
10+
- with:
11+
source: pepe
12+
type: pepe

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

+46-26
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,41 @@ private JDefinedClass populateClass(
105105
JDefinedClass definedClass, Optional<JType> refType, Collection<JType> unionTypes) {
106106
JType clazzClass = definedClass.owner()._ref(Object.class);
107107

108-
JFieldVar valueField =
109-
definedClass.field(
110-
JMod.PRIVATE,
111-
clazzClass,
112-
ruleFactory.getNameHelper().getPropertyName("value", null),
113-
null);
108+
Optional<JFieldVar> valueField;
109+
if (!unionTypes.isEmpty()) {
110+
valueField =
111+
Optional.of(
112+
definedClass.field(
113+
JMod.PRIVATE,
114+
clazzClass,
115+
ruleFactory.getNameHelper().getPropertyName("value", null),
116+
null));
117+
118+
definedClass._implements(
119+
definedClass.owner().ref(GeneratorUtils.ONE_OF_VALUE_PROVIDER_INTERFACE_NAME));
114120

115-
definedClass._implements(
116-
definedClass.owner().ref(GeneratorUtils.ONE_OF_VALUE_PROVIDER_INTERFACE_NAME));
121+
GeneratorUtils.implementInterface(definedClass, valueField.orElseThrow());
117122

118-
GeneratorUtils.implementInterface(definedClass, valueField);
123+
try {
124+
JDefinedClass serializer = generateSerializer(definedClass);
125+
definedClass.annotate(JsonSerialize.class).param("using", serializer);
126+
} catch (JClassAlreadyExistsException ex) {
127+
// already serialized aware
128+
}
129+
130+
try {
131+
JDefinedClass deserializer = generateDeserializer(definedClass, unionTypes);
132+
definedClass.annotate(JsonDeserialize.class).param("using", deserializer);
133+
} catch (JClassAlreadyExistsException ex) {
134+
// already deserialized aware
135+
}
136+
for (JType unionType : unionTypes) {
137+
wrapIt(definedClass, valueField, unionType);
138+
}
139+
} else {
140+
valueField = Optional.empty();
141+
}
119142

120-
unionTypes.forEach(unionType -> wrapIt(definedClass, valueField, unionType));
121143
refType.ifPresent(
122144
type -> {
123145
if (type instanceof JClass) {
@@ -126,14 +148,16 @@ private JDefinedClass populateClass(
126148
wrapIt(definedClass, valueField, type);
127149
}
128150
});
151+
129152
if (definedClass.constructors().hasNext()
130153
&& definedClass.getConstructor(new JType[0]) == null) {
131154
definedClass.constructor(JMod.PUBLIC);
132155
}
133156
return definedClass;
134157
}
135158

136-
private JDefinedClass generateSerializer(JDefinedClass relatedClass) {
159+
private JDefinedClass generateSerializer(JDefinedClass relatedClass)
160+
throws JClassAlreadyExistsException {
137161
JDefinedClass definedClass = GeneratorUtils.serializerClass(relatedClass);
138162
GeneratorUtils.fillSerializer(
139163
definedClass,
@@ -150,7 +174,8 @@ private JDefinedClass generateSerializer(JDefinedClass relatedClass) {
150174
}
151175

152176
private JDefinedClass generateDeserializer(
153-
JDefinedClass relatedClass, Collection<JType> unionTypes) {
177+
JDefinedClass relatedClass, Collection<JType> unionTypes)
178+
throws JClassAlreadyExistsException {
154179
JDefinedClass definedClass = GeneratorUtils.deserializerClass(relatedClass);
155180
GeneratorUtils.fillDeserializer(
156181
definedClass,
@@ -173,33 +198,28 @@ private JDefinedClass generateDeserializer(
173198

174199
private JDefinedClass createUnionClass(
175200
String nodeName, JPackage container, Optional<JType> refType, Collection<JType> unionTypes) {
176-
final String className =
177-
ruleFactory.getNameHelper().getUniqueClassName(nodeName, null, container);
178201
try {
179-
JDefinedClass definedClass = container._class(className);
180-
definedClass.annotate(JsonSerialize.class).param("using", generateSerializer(definedClass));
181-
definedClass
182-
.annotate(JsonDeserialize.class)
183-
.param("using", generateDeserializer(definedClass, unionTypes));
184-
185-
return populateClass(definedClass, refType, unionTypes);
202+
return populateClass(
203+
container._class(
204+
ruleFactory.getNameHelper().getUniqueClassName(nodeName, null, container)),
205+
refType,
206+
unionTypes);
186207
} catch (JClassAlreadyExistsException e) {
187208
throw new IllegalArgumentException(e);
188209
}
189210
}
190211

191-
private void wrapIt(JDefinedClass definedClass, JFieldVar valueField, JType unionType) {
212+
private void wrapIt(JDefinedClass definedClass, Optional<JFieldVar> valueField, JType unionType) {
192213
final String name = unionType.name();
193214
JFieldVar instanceField =
194215
definedClass.field(
195216
JMod.PRIVATE, unionType, ruleFactory.getNameHelper().getPropertyName(name, null));
196217
GeneratorUtils.buildMethod(definedClass, instanceField, ruleFactory.getNameHelper(), name);
197218
JMethod constructor = definedClass.constructor(JMod.PUBLIC);
198219
JVar instanceParam = constructor.param(unionType, instanceField.name());
199-
constructor
200-
.body()
201-
.assign(JExpr._this().ref(valueField), instanceParam)
202-
.assign(JExpr._this().ref(instanceField), instanceParam);
220+
JBlock body = constructor.body();
221+
valueField.ifPresent(v -> body.assign(JExpr._this().ref(v), instanceParam));
222+
body.assign(JExpr._this().ref(instanceField), instanceParam);
203223
}
204224

205225
private void unionType(

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

+10-11
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,13 @@ public interface DeserializerFiller {
4949
void accept(JMethod method, JVar parserParam);
5050
}
5151

52-
public static JDefinedClass serializerClass(JDefinedClass relatedClass) {
52+
public static JDefinedClass serializerClass(JDefinedClass relatedClass)
53+
throws JClassAlreadyExistsException {
5354
return createClass(relatedClass, JsonSerializer.class, "Serializer");
5455
}
5556

56-
public static JDefinedClass deserializerClass(JDefinedClass relatedClass) {
57+
public static JDefinedClass deserializerClass(JDefinedClass relatedClass)
58+
throws JClassAlreadyExistsException {
5759
return createClass(relatedClass, JsonDeserializer.class, "Deserializer");
5860
}
5961

@@ -97,15 +99,12 @@ public static void fillDeserializer(
9799
}
98100

99101
private static JDefinedClass createClass(
100-
JDefinedClass relatedClass, Class<?> serializerClass, String suffix) {
101-
try {
102-
JDefinedClass definedClass =
103-
relatedClass._package()._class(JMod.NONE, relatedClass.name() + suffix);
104-
definedClass._extends(definedClass.owner().ref(serializerClass).narrow(relatedClass));
105-
return definedClass;
106-
} catch (JClassAlreadyExistsException ex) {
107-
throw new IllegalArgumentException(ex);
108-
}
102+
JDefinedClass relatedClass, Class<?> serializerClass, String suffix)
103+
throws JClassAlreadyExistsException {
104+
JDefinedClass definedClass =
105+
relatedClass._package()._class(JMod.NONE, relatedClass.name() + suffix);
106+
definedClass._extends(definedClass.owner().ref(serializerClass).narrow(relatedClass));
107+
return definedClass;
109108
}
110109

111110
private GeneratorUtils() {}

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

+12-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
2121
import com.sun.codemodel.JBlock;
2222
import com.sun.codemodel.JClass;
23+
import com.sun.codemodel.JClassAlreadyExistsException;
2324
import com.sun.codemodel.JDefinedClass;
2425
import com.sun.codemodel.JExpr;
2526
import com.sun.codemodel.JFieldVar;
@@ -52,14 +53,19 @@ public JDefinedClass apply(
5253
} else if (node != null
5354
&& checkIntValue(parent, "maxProperties", 1)
5455
&& checkIntValue(parent, "minProperties", 1)) {
55-
return addKeyValueFields(jclass, node, parent, nodeName, schema);
56+
try {
57+
return addKeyValueFields(jclass, node, parent, nodeName, schema);
58+
} catch (JClassAlreadyExistsException e) {
59+
throw new IllegalArgumentException(e);
60+
}
5661
} else {
5762
return super.apply(nodeName, node, parent, jclass, schema);
5863
}
5964
}
6065

6166
private JDefinedClass addKeyValueFields(
62-
JDefinedClass jclass, JsonNode node, JsonNode parent, String nodeName, Schema schema) {
67+
JDefinedClass jclass, JsonNode node, JsonNode parent, String nodeName, Schema schema)
68+
throws JClassAlreadyExistsException {
6369
NameHelper nameHelper = ruleFactory.getNameHelper();
6470
JType stringClass = jclass.owner()._ref(String.class);
6571
JFieldVar nameField =
@@ -107,7 +113,8 @@ private JDefinedClass addKeyValueFields(
107113
return jclass;
108114
}
109115

110-
private JDefinedClass generateDeserializer(JDefinedClass relatedClass, JType propertyType) {
116+
private JDefinedClass generateDeserializer(JDefinedClass relatedClass, JType propertyType)
117+
throws JClassAlreadyExistsException {
111118
JDefinedClass definedClass = GeneratorUtils.deserializerClass(relatedClass);
112119
GeneratorUtils.fillDeserializer(
113120
definedClass,
@@ -127,7 +134,8 @@ private JDefinedClass generateDeserializer(JDefinedClass relatedClass, JType pro
127134
}
128135

129136
private JDefinedClass generateSerializer(
130-
JDefinedClass relatedClass, JMethod nameMethod, JMethod valueMethod) {
137+
JDefinedClass relatedClass, JMethod nameMethod, JMethod valueMethod)
138+
throws JClassAlreadyExistsException {
131139
JDefinedClass definedClass = GeneratorUtils.serializerClass(relatedClass);
132140
GeneratorUtils.fillSerializer(
133141
definedClass,

0 commit comments

Comments
 (0)