Skip to content

Commit 0674bef

Browse files
committed
[Fix #412] Fixing problem with listen task
Signed-off-by: Francisco Javier Tirado Sarti <ftirados@redhat.com>
1 parent 51f4a3e commit 0674bef

File tree

5 files changed

+77
-38
lines changed

5 files changed

+77
-38
lines changed

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

Lines changed: 2 additions & 1 deletion
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);
Lines changed: 12 additions & 0 deletions
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

Lines changed: 41 additions & 22 deletions
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,
@@ -177,29 +202,23 @@ private JDefinedClass createUnionClass(
177202
ruleFactory.getNameHelper().getUniqueClassName(nodeName, null, container);
178203
try {
179204
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-
185205
return populateClass(definedClass, refType, unionTypes);
186206
} catch (JClassAlreadyExistsException e) {
187207
throw new IllegalArgumentException(e);
188208
}
189209
}
190210

191-
private void wrapIt(JDefinedClass definedClass, JFieldVar valueField, JType unionType) {
211+
private void wrapIt(JDefinedClass definedClass, Optional<JFieldVar> valueField, JType unionType) {
192212
final String name = unionType.name();
193213
JFieldVar instanceField =
194214
definedClass.field(
195215
JMod.PRIVATE, unionType, ruleFactory.getNameHelper().getPropertyName(name, null));
196216
GeneratorUtils.buildMethod(definedClass, instanceField, ruleFactory.getNameHelper(), name);
197217
JMethod constructor = definedClass.constructor(JMod.PUBLIC);
198218
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);
219+
JBlock body = constructor.body();
220+
valueField.ifPresent(v -> body.assign(JExpr._this().ref(v), instanceParam));
221+
body.assign(JExpr._this().ref(instanceField), instanceParam);
203222
}
204223

205224
private void unionType(

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

Lines changed: 10 additions & 11 deletions
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

Lines changed: 12 additions & 4 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy