Skip to content

Commit bd81ad6

Browse files
Improvements on the DSL to make it more extensible (#672)
Signed-off-by: Ricardo Zanini <[email protected]>
1 parent 5549c5a commit bd81ad6

File tree

18 files changed

+584
-176
lines changed

18 files changed

+584
-176
lines changed

experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void testJavaFunction() throws InterruptedException, ExecutionException {
3434
try (WorkflowApplication app = WorkflowApplication.builder().build()) {
3535
final Workflow workflow =
3636
FuncWorkflowBuilder.workflow("testJavaCall")
37-
.tasks(tasks -> tasks.callFn(f -> f.fn(JavaFunctions::getName)))
37+
.tasks(tasks -> tasks.callFn(f -> f.function(JavaFunctions::getName)))
3838
.build();
3939
assertThat(
4040
app.workflowDefinition(workflow)
@@ -85,7 +85,7 @@ void testSwitch() throws InterruptedException, ExecutionException {
8585
switchOdd.items(
8686
item ->
8787
item.when(CallTest::isOdd).then(FlowDirectiveEnum.END)))
88-
.callFn(callJava -> callJava.fn(CallTest::zero)))
88+
.callFn(callJava -> callJava.function(CallTest::zero)))
8989
.build();
9090

9191
WorkflowDefinition definition = app.workflowDefinition(workflow);
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.fluent.func;
17+
18+
import io.serverlessworkflow.fluent.spec.HasDelegate;
19+
import java.util.function.Consumer;
20+
21+
/**
22+
* Mixin that implements {@link FuncDoTaskFluent} by forwarding to another instance.
23+
*
24+
* @param <SELF> concrete builder type
25+
*/
26+
public interface DelegatingFuncDoTaskFluent<SELF extends DelegatingFuncDoTaskFluent<SELF>>
27+
extends FuncDoTaskFluent<SELF>, HasDelegate {
28+
29+
@SuppressWarnings("unchecked")
30+
default SELF self() {
31+
return (SELF) this;
32+
}
33+
34+
@SuppressWarnings("unchecked")
35+
private FuncDoTaskFluent<SELF> d() {
36+
return (FuncDoTaskFluent<SELF>) this.delegate();
37+
}
38+
39+
@Override
40+
default SELF callFn(String name, Consumer<FuncCallTaskBuilder> cfg) {
41+
d().callFn(name, cfg);
42+
return self();
43+
}
44+
45+
@Override
46+
default SELF callFn(Consumer<FuncCallTaskBuilder> cfg) {
47+
d().callFn(cfg);
48+
return self();
49+
}
50+
51+
@Override
52+
default SELF forFn(String name, Consumer<FuncForTaskBuilder> cfg) {
53+
d().forFn(name, cfg);
54+
return self();
55+
}
56+
57+
@Override
58+
default SELF forFn(Consumer<FuncForTaskBuilder> cfg) {
59+
d().forFn(cfg);
60+
return self();
61+
}
62+
63+
@Override
64+
default SELF switchFn(String name, Consumer<FuncSwitchTaskBuilder> cfg) {
65+
d().switchFn(name, cfg);
66+
return self();
67+
}
68+
69+
@Override
70+
default SELF switchFn(Consumer<FuncSwitchTaskBuilder> cfg) {
71+
d().switchFn(cfg);
72+
return self();
73+
}
74+
75+
@Override
76+
default SELF forkFn(String name, Consumer<FuncForkTaskBuilder> cfg) {
77+
d().forkFn(name, cfg);
78+
return self();
79+
}
80+
81+
@Override
82+
default SELF forkFn(Consumer<FuncForkTaskBuilder> cfg) {
83+
d().forkFn(cfg);
84+
return self();
85+
}
86+
}

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ protected FuncCallTaskBuilder self() {
3535
return this;
3636
}
3737

38-
public <T, V> FuncCallTaskBuilder fn(Function<T, V> function) {
38+
public <T, V> FuncCallTaskBuilder function(Function<T, V> function) {
3939
this.callTaskJava = new CallTaskJava(CallJava.function(function));
4040
super.setTask(this.callTaskJava.getCallJava());
4141
return this;

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskBuilder.java

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,47 +16,17 @@
1616
package io.serverlessworkflow.fluent.func;
1717

1818
import io.serverlessworkflow.fluent.spec.BaseDoTaskBuilder;
19-
import java.util.function.Consumer;
2019

2120
public class FuncDoTaskBuilder extends BaseDoTaskBuilder<FuncDoTaskBuilder, FuncTaskItemListBuilder>
22-
implements FuncTransformations<FuncDoTaskBuilder> {
21+
implements FuncTransformations<FuncDoTaskBuilder>,
22+
DelegatingFuncDoTaskFluent<FuncDoTaskBuilder> {
2323

24-
FuncDoTaskBuilder() {
24+
public FuncDoTaskBuilder() {
2525
super(new FuncTaskItemListBuilder());
2626
}
2727

2828
@Override
29-
protected FuncDoTaskBuilder self() {
30-
return this;
31-
}
32-
33-
public FuncDoTaskBuilder callFn(String name, Consumer<FuncCallTaskBuilder> consumer) {
34-
this.innerListBuilder().callJava(name, consumer);
35-
return this;
36-
}
37-
38-
public FuncDoTaskBuilder callFn(Consumer<FuncCallTaskBuilder> consumer) {
39-
this.innerListBuilder().callJava(consumer);
40-
return this;
41-
}
42-
43-
public FuncDoTaskBuilder forFn(String name, Consumer<FuncForTaskBuilder> consumer) {
44-
this.innerListBuilder().forFn(name, consumer);
45-
return this;
46-
}
47-
48-
public FuncDoTaskBuilder forFn(Consumer<FuncForTaskBuilder> consumer) {
49-
this.innerListBuilder().forFn(consumer);
50-
return this;
51-
}
52-
53-
public FuncDoTaskBuilder switchFn(String name, Consumer<FuncSwitchTaskBuilder> consumer) {
54-
this.innerListBuilder().switchFn(name, consumer);
55-
return this;
56-
}
57-
58-
public FuncDoTaskBuilder switchFn(Consumer<FuncSwitchTaskBuilder> consumer) {
59-
this.innerListBuilder().switchFn(consumer);
29+
public FuncDoTaskBuilder self() {
6030
return this;
6131
}
6232
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.fluent.func;
17+
18+
import java.util.function.Consumer;
19+
20+
public interface FuncDoTaskFluent<SELF extends FuncDoTaskFluent<SELF>> {
21+
22+
SELF callFn(String name, Consumer<FuncCallTaskBuilder> cfg);
23+
24+
SELF callFn(Consumer<FuncCallTaskBuilder> cfg);
25+
26+
SELF forFn(String name, Consumer<FuncForTaskBuilder> cfg);
27+
28+
SELF forFn(Consumer<FuncForTaskBuilder> cfg);
29+
30+
SELF switchFn(String name, Consumer<FuncSwitchTaskBuilder> cfg);
31+
32+
SELF switchFn(Consumer<FuncSwitchTaskBuilder> cfg);
33+
34+
SELF forkFn(String name, Consumer<FuncForkTaskBuilder> cfg);
35+
36+
SELF forkFn(Consumer<FuncForkTaskBuilder> cfg);
37+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.fluent.func;
17+
18+
import io.serverlessworkflow.api.types.ForkTask;
19+
import io.serverlessworkflow.api.types.ForkTaskConfiguration;
20+
import io.serverlessworkflow.api.types.Task;
21+
import io.serverlessworkflow.api.types.TaskItem;
22+
import io.serverlessworkflow.api.types.func.CallJava;
23+
import io.serverlessworkflow.api.types.func.CallTaskJava;
24+
import io.serverlessworkflow.fluent.spec.TaskBaseBuilder;
25+
import java.util.ArrayList;
26+
import java.util.List;
27+
import java.util.UUID;
28+
import java.util.function.Consumer;
29+
import java.util.function.Function;
30+
31+
public class FuncForkTaskBuilder extends TaskBaseBuilder<FuncForkTaskBuilder>
32+
implements FuncTransformations<FuncForkTaskBuilder> {
33+
34+
private final ForkTask forkTask;
35+
private final List<TaskItem> items;
36+
37+
FuncForkTaskBuilder() {
38+
this.forkTask = new ForkTask();
39+
this.forkTask.setFork(new ForkTaskConfiguration());
40+
this.items = new ArrayList<>();
41+
}
42+
43+
@Override
44+
protected FuncForkTaskBuilder self() {
45+
return this;
46+
}
47+
48+
public <T, V> FuncForkTaskBuilder branch(String name, Function<T, V> function) {
49+
this.items.add(
50+
new TaskItem(name, new Task().withCallTask(new CallTaskJava(CallJava.function(function)))));
51+
return this;
52+
}
53+
54+
public <T, V> FuncForkTaskBuilder branch(Function<T, V> function) {
55+
return this.branch(UUID.randomUUID().toString(), function);
56+
}
57+
58+
public FuncForkTaskBuilder branches(Consumer<FuncTaskItemListBuilder> consumer) {
59+
final FuncTaskItemListBuilder builder = new FuncTaskItemListBuilder();
60+
consumer.accept(builder);
61+
this.items.addAll(builder.build());
62+
return this;
63+
}
64+
65+
public FuncForkTaskBuilder compete(boolean compete) {
66+
this.forkTask.getFork().setCompete(compete);
67+
return this;
68+
}
69+
70+
public ForkTask build() {
71+
this.forkTask.getFork().setBranches(this.items);
72+
return forkTask;
73+
}
74+
}

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTaskItemListBuilder.java

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,21 @@
1818
import io.serverlessworkflow.api.types.Task;
1919
import io.serverlessworkflow.api.types.TaskItem;
2020
import io.serverlessworkflow.fluent.spec.BaseTaskItemListBuilder;
21+
import java.util.List;
2122
import java.util.UUID;
2223
import java.util.function.Consumer;
2324

24-
public class FuncTaskItemListBuilder extends BaseTaskItemListBuilder<FuncTaskItemListBuilder> {
25+
public class FuncTaskItemListBuilder extends BaseTaskItemListBuilder<FuncTaskItemListBuilder>
26+
implements FuncDoTaskFluent<FuncTaskItemListBuilder> {
2527

26-
FuncTaskItemListBuilder() {
28+
public FuncTaskItemListBuilder() {
2729
super();
2830
}
2931

32+
public FuncTaskItemListBuilder(final List<TaskItem> list) {
33+
super(list);
34+
}
35+
3036
@Override
3137
protected FuncTaskItemListBuilder self() {
3238
return this;
@@ -37,28 +43,33 @@ protected FuncTaskItemListBuilder newItemListBuilder() {
3743
return new FuncTaskItemListBuilder();
3844
}
3945

40-
public FuncTaskItemListBuilder callJava(String name, Consumer<FuncCallTaskBuilder> consumer) {
46+
@Override
47+
public FuncTaskItemListBuilder callFn(String name, Consumer<FuncCallTaskBuilder> consumer) {
4148
this.requireNameAndConfig(name, consumer);
4249
final FuncCallTaskBuilder callTaskJavaBuilder = new FuncCallTaskBuilder();
4350
consumer.accept(callTaskJavaBuilder);
4451
return addTaskItem(new TaskItem(name, new Task().withCallTask(callTaskJavaBuilder.build())));
4552
}
4653

47-
public FuncTaskItemListBuilder callJava(Consumer<FuncCallTaskBuilder> consumer) {
48-
return this.callJava(UUID.randomUUID().toString(), consumer);
54+
@Override
55+
public FuncTaskItemListBuilder callFn(Consumer<FuncCallTaskBuilder> consumer) {
56+
return this.callFn(UUID.randomUUID().toString(), consumer);
4957
}
5058

59+
@Override
5160
public FuncTaskItemListBuilder forFn(String name, Consumer<FuncForTaskBuilder> consumer) {
5261
this.requireNameAndConfig(name, consumer);
5362
final FuncForTaskBuilder forTaskJavaBuilder = new FuncForTaskBuilder();
5463
consumer.accept(forTaskJavaBuilder);
5564
return this.addTaskItem(new TaskItem(name, new Task().withForTask(forTaskJavaBuilder.build())));
5665
}
5766

67+
@Override
5868
public FuncTaskItemListBuilder forFn(Consumer<FuncForTaskBuilder> consumer) {
5969
return this.forFn(UUID.randomUUID().toString(), consumer);
6070
}
6171

72+
@Override
6273
public FuncTaskItemListBuilder switchFn(String name, Consumer<FuncSwitchTaskBuilder> consumer) {
6374
this.requireNameAndConfig(name, consumer);
6475
final FuncSwitchTaskBuilder funcSwitchTaskBuilder = new FuncSwitchTaskBuilder();
@@ -67,7 +78,22 @@ public FuncTaskItemListBuilder switchFn(String name, Consumer<FuncSwitchTaskBuil
6778
new TaskItem(name, new Task().withSwitchTask(funcSwitchTaskBuilder.build())));
6879
}
6980

81+
@Override
7082
public FuncTaskItemListBuilder switchFn(Consumer<FuncSwitchTaskBuilder> consumer) {
7183
return this.switchFn(UUID.randomUUID().toString(), consumer);
7284
}
85+
86+
@Override
87+
public FuncTaskItemListBuilder forkFn(Consumer<FuncForkTaskBuilder> cfg) {
88+
return this.forkFn(UUID.randomUUID().toString(), cfg);
89+
}
90+
91+
@Override
92+
public FuncTaskItemListBuilder forkFn(String name, Consumer<FuncForkTaskBuilder> cfg) {
93+
this.requireNameAndConfig(name, cfg);
94+
final FuncForkTaskBuilder forkTaskJavaBuilder = new FuncForkTaskBuilder();
95+
cfg.accept(forkTaskJavaBuilder);
96+
return this.addTaskItem(
97+
new TaskItem(name, new Task().withForkTask(forkTaskJavaBuilder.build())));
98+
}
7399
}

fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncWorkflowBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class FuncWorkflowBuilder
2222
extends BaseWorkflowBuilder<FuncWorkflowBuilder, FuncDoTaskBuilder, FuncTaskItemListBuilder>
2323
implements FuncTransformations<FuncWorkflowBuilder> {
2424

25-
private FuncWorkflowBuilder(final String name, final String namespace, final String version) {
25+
protected FuncWorkflowBuilder(final String name, final String namespace, final String version) {
2626
super(name, namespace, version);
2727
}
2828

0 commit comments

Comments
 (0)