Skip to content

Commit 56cab35

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

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

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: 46 additions & 26 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,
@@ -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

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