Skip to content

Commit eef3bed

Browse files
ricardozaniniCopilotfjtirado
authored
Fix #1451 - Resolve duration expressions; Improve wait DSL contract (#1454)
* Fix #1449 - Resolve duration expressions; Improve wait DSL contract Signed-off-by: Ricardo Zanini <ricardozanini@gmail.com> * Consider co-pilot review Signed-off-by: Ricardo Zanini <ricardozanini@gmail.com> * Remove leftovers Signed-off-by: Ricardo Zanini <ricardozanini@gmail.com> * Clean up imports Signed-off-by: Ricardo Zanini <ricardozanini@gmail.com> * Formating Signed-off-by: Ricardo Zanini <ricardozanini@gmail.com> * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Consider co-pilot comments Signed-off-by: Ricardo Zanini <ricardozanini@gmail.com> * Review comments Reusing existing code to deal with TimeoutAfter and keep the test execution fast --------- Signed-off-by: Ricardo Zanini <ricardozanini@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: fjtirado <ftirados@ibm.com>
1 parent c75e958 commit eef3bed

9 files changed

Lines changed: 1120 additions & 24 deletions

File tree

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.serverlessworkflow.fluent.func.spi.FuncDoFluent;
2424
import io.serverlessworkflow.fluent.spec.BaseTaskItemListBuilder;
2525
import io.serverlessworkflow.fluent.spec.TaskItemListBuilder;
26+
import io.serverlessworkflow.fluent.spec.WaitTaskBuilder;
2627
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
2728
import java.util.List;
2829
import java.util.function.Consumer;
@@ -215,4 +216,15 @@ public FuncTaskItemListBuilder tryCatch(
215216
itemsConfigurer.accept(tryTaskBuilder);
216217
return this.addTaskItem(new TaskItem(name, new Task().withTryTask(tryTaskBuilder.build())));
217218
}
219+
220+
public FuncTaskItemListBuilder wait(Consumer<WaitTaskBuilder> itemsConfigurer) {
221+
return wait(null, itemsConfigurer);
222+
}
223+
224+
public FuncTaskItemListBuilder wait(String name, Consumer<WaitTaskBuilder> itemsConfigurer) {
225+
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_WAIT);
226+
final WaitTaskBuilder waitTaskBuilder = new WaitTaskBuilder();
227+
itemsConfigurer.accept(waitTaskBuilder);
228+
return this.addTaskItem(new TaskItem(name, new Task().withWaitTask(waitTaskBuilder.build())));
229+
}
218230
}

experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncDSL.java

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import io.serverlessworkflow.impl.TaskContextData;
5151
import io.serverlessworkflow.impl.WorkflowContextData;
5252
import java.net.URI;
53+
import java.time.Duration;
5354
import java.util.Collection;
5455
import java.util.List;
5556
import java.util.Map;
@@ -1087,6 +1088,221 @@ public static FuncTaskConfigurer tryCatch(String name, Consumer<FuncTryTaskBuild
10871088
return list -> list.tryCatch(name, configurer);
10881089
}
10891090

1091+
/**
1092+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with a duration
1093+
* expression.
1094+
*
1095+
* <p>Example: {@code tasks(wait("PT5M"))}
1096+
*
1097+
* @param durationExpression duration expression or ISO 8601 literal
1098+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1099+
*/
1100+
public static FuncTaskConfigurer wait(String durationExpression) {
1101+
return taskList -> taskList.wait(w -> w.wait(durationExpression));
1102+
}
1103+
1104+
/**
1105+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with a
1106+
* duration expression.
1107+
*
1108+
* <p>Example: {@code tasks(wait("pause", "PT5M"))}
1109+
*
1110+
* @param name task name
1111+
* @param durationExpression duration expression or ISO 8601 literal
1112+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1113+
*/
1114+
public static FuncTaskConfigurer wait(String name, String durationExpression) {
1115+
return taskList -> taskList.wait(name, w -> w.wait(durationExpression));
1116+
}
1117+
1118+
/**
1119+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with an inline
1120+
* duration builder.
1121+
*
1122+
* <p>Example: {@code tasks(wait(timeoutSeconds(30)))}
1123+
*
1124+
* @param duration timeout builder consumer
1125+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1126+
*/
1127+
public static FuncTaskConfigurer wait(Consumer<TimeoutBuilder> duration) {
1128+
return taskList -> taskList.wait(w -> w.wait(duration));
1129+
}
1130+
1131+
/**
1132+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with an
1133+
* inline duration builder.
1134+
*
1135+
* <p>Example: {@code tasks(wait("pause", timeoutSeconds(30)))}
1136+
*
1137+
* @param name task name
1138+
* @param duration timeout builder consumer
1139+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1140+
*/
1141+
public static FuncTaskConfigurer wait(String name, Consumer<TimeoutBuilder> duration) {
1142+
return taskList -> taskList.wait(name, w -> w.wait(duration));
1143+
}
1144+
1145+
/**
1146+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with seconds.
1147+
*
1148+
* <p>Example: {@code tasks(waitSeconds(30))}
1149+
*
1150+
* @param seconds wait duration in seconds
1151+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1152+
*/
1153+
public static FuncTaskConfigurer waitSeconds(int seconds) {
1154+
return taskList -> taskList.wait(w -> w.wait(t -> t.duration(d -> d.seconds(seconds))));
1155+
}
1156+
1157+
/**
1158+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with
1159+
* seconds.
1160+
*
1161+
* <p>Example: {@code tasks(waitSeconds("pause", 30))}
1162+
*
1163+
* @param name task name
1164+
* @param seconds wait duration in seconds
1165+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1166+
*/
1167+
public static FuncTaskConfigurer waitSeconds(String name, int seconds) {
1168+
return taskList -> taskList.wait(name, w -> w.wait(t -> t.duration(d -> d.seconds(seconds))));
1169+
}
1170+
1171+
/**
1172+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with minutes.
1173+
*
1174+
* <p>Example: {@code tasks(waitMinutes(5))}
1175+
*
1176+
* @param minutes wait duration in minutes
1177+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1178+
*/
1179+
public static FuncTaskConfigurer waitMinutes(int minutes) {
1180+
return taskList -> taskList.wait(w -> w.wait(t -> t.duration(d -> d.minutes(minutes))));
1181+
}
1182+
1183+
/**
1184+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with
1185+
* minutes.
1186+
*
1187+
* <p>Example: {@code tasks(waitMinutes("pause", 5))}
1188+
*
1189+
* @param name task name
1190+
* @param minutes wait duration in minutes
1191+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1192+
*/
1193+
public static FuncTaskConfigurer waitMinutes(String name, int minutes) {
1194+
return taskList -> taskList.wait(name, w -> w.wait(t -> t.duration(d -> d.minutes(minutes))));
1195+
}
1196+
1197+
/**
1198+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with hours.
1199+
*
1200+
* <p>Example: {@code tasks(waitHours(2))}
1201+
*
1202+
* @param hours wait duration in hours
1203+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1204+
*/
1205+
public static FuncTaskConfigurer waitHours(int hours) {
1206+
return taskList -> taskList.wait(w -> w.wait(t -> t.duration(d -> d.hours(hours))));
1207+
}
1208+
1209+
/**
1210+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with hours.
1211+
*
1212+
* <p>Example: {@code tasks(waitHours("longPause", 2))}
1213+
*
1214+
* @param name task name
1215+
* @param hours wait duration in hours
1216+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1217+
*/
1218+
public static FuncTaskConfigurer waitHours(String name, int hours) {
1219+
return taskList -> taskList.wait(name, w -> w.wait(t -> t.duration(d -> d.hours(hours))));
1220+
}
1221+
1222+
/**
1223+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with days.
1224+
*
1225+
* <p>Example: {@code tasks(waitDays(1))}
1226+
*
1227+
* @param days wait duration in days
1228+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1229+
*/
1230+
public static FuncTaskConfigurer waitDays(int days) {
1231+
return taskList -> taskList.wait(w -> w.wait(t -> t.duration(d -> d.days(days))));
1232+
}
1233+
1234+
/**
1235+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with days.
1236+
*
1237+
* <p>Example: {@code tasks(waitDays("dailyDelay", 1))}
1238+
*
1239+
* @param name task name
1240+
* @param days wait duration in days
1241+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1242+
*/
1243+
public static FuncTaskConfigurer waitDays(String name, int days) {
1244+
return taskList -> taskList.wait(name, w -> w.wait(t -> t.duration(d -> d.days(days))));
1245+
}
1246+
1247+
/**
1248+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with milliseconds.
1249+
*
1250+
* <p>Example: {@code tasks(waitMillis(500))}
1251+
*
1252+
* @param milliseconds wait duration in milliseconds
1253+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1254+
*/
1255+
public static FuncTaskConfigurer waitMillis(int milliseconds) {
1256+
return taskList ->
1257+
taskList.wait(w -> w.wait(t -> t.duration(d -> d.milliseconds(milliseconds))));
1258+
}
1259+
1260+
/**
1261+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with
1262+
* milliseconds.
1263+
*
1264+
* <p>Example: {@code tasks(waitMillis("shortPause", 500))}
1265+
*
1266+
* @param name task name
1267+
* @param milliseconds wait duration in milliseconds
1268+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1269+
*/
1270+
public static FuncTaskConfigurer waitMillis(String name, int milliseconds) {
1271+
return taskList ->
1272+
taskList.wait(name, w -> w.wait(t -> t.duration(d -> d.milliseconds(milliseconds))));
1273+
}
1274+
1275+
/**
1276+
* Create a {@link FuncTaskConfigurer} that adds a {@code wait} task configured with a Java {@link
1277+
* java.time.Duration}.
1278+
*
1279+
* <p>The Duration is converted to DurationInline format.
1280+
*
1281+
* <p>Example: {@code tasks(wait(Duration.ofMinutes(5).plusSeconds(30)))}
1282+
*
1283+
* @param duration wait duration as a Java Duration
1284+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1285+
*/
1286+
public static FuncTaskConfigurer wait(Duration duration) {
1287+
return taskList -> taskList.wait(w -> w.wait(duration));
1288+
}
1289+
1290+
/**
1291+
* Create a {@link FuncTaskConfigurer} that adds a named {@code wait} task configured with a Java
1292+
* {@link java.time.Duration}.
1293+
*
1294+
* <p>The Duration is converted to DurationInline format.
1295+
*
1296+
* <p>Example: {@code tasks(wait("pause", Duration.ofMinutes(5)))}
1297+
*
1298+
* @param name task name
1299+
* @param duration wait duration as a Java Duration
1300+
* @return a {@link FuncTaskConfigurer} that adds a WaitTask
1301+
*/
1302+
public static FuncTaskConfigurer wait(String name, Duration duration) {
1303+
return taskList -> taskList.wait(name, w -> w.wait(duration));
1304+
}
1305+
10901306
/**
10911307
* Sugar for a single-case switch: if predicate matches, jump to {@code thenTask}.
10921308
*

0 commit comments

Comments
 (0)