Skip to content

Commit 6e6557c

Browse files
authored
[Fix #1317] Setting stack trace to details and filling instance (#1318)
Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent dcc8f61 commit 6e6557c

File tree

8 files changed

+55
-64
lines changed

8 files changed

+55
-64
lines changed

impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowError.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
*/
1616
package io.serverlessworkflow.impl;
1717

18+
import io.serverlessworkflow.impl.lifecycle.TaskFailedEvent;
19+
import io.serverlessworkflow.impl.lifecycle.WorkflowFailedEvent;
1820
import io.serverlessworkflow.types.Errors;
21+
import java.io.PrintWriter;
22+
import java.io.StringWriter;
1923

20-
public record WorkflowError(
21-
String type, int status, String instance, String title, String details) {
24+
public record WorkflowError(String type, int status, String instance, String title, String detail) {
2225

2326
public static Builder error(String type, int status) {
2427
return new Builder(type, status);
@@ -65,6 +68,38 @@ public static Builder timeout() {
6568
return error(Errors.TIMEOUT.toString(), Errors.TIMEOUT.status());
6669
}
6770

71+
public static WorkflowError error(TaskFailedEvent ev) {
72+
return error(ev.cause(), ev.taskContext().position());
73+
}
74+
75+
public static WorkflowError error(WorkflowFailedEvent ev) {
76+
return error(ev.cause(), null);
77+
}
78+
79+
private static WorkflowError error(Throwable cause, WorkflowPosition position) {
80+
return cause instanceof WorkflowException ex
81+
? ex.getWorkflowError()
82+
: commonError(cause, position);
83+
}
84+
85+
private static WorkflowError commonError(Throwable cause, WorkflowPosition position) {
86+
StringWriter stackTrace = new StringWriter();
87+
try (PrintWriter writer = new PrintWriter(stackTrace)) {
88+
cause.printStackTrace(writer);
89+
return new WorkflowError(
90+
cause.getClass().getTypeName(),
91+
500,
92+
position == null ? null : position.jsonPointer(),
93+
cause.getMessage(),
94+
stackTrace.toString());
95+
}
96+
}
97+
98+
@Deprecated
99+
public String details() {
100+
return detail;
101+
}
102+
68103
public static class Builder {
69104

70105
private final String type;

impl/core/src/main/java/io/serverlessworkflow/impl/executors/TryExecutor.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ private CompletableFuture<WorkflowModel> handleException(
180180
taskContext,
181181
workflow.definition().application().modelFactory().fromAny(error))) {
182182
if (errorVariable != null) {
183-
taskContext.variables().put(errorVariable, error);
183+
taskContext.variables().put(errorVariable, WorkflowErrorExpr.from(error));
184184
}
185185
if (catchTaskExecutor.isPresent()) {
186186
completable =
@@ -206,6 +206,14 @@ private CompletableFuture<WorkflowModel> handleException(
206206
return CompletableFuture.failedFuture(e);
207207
}
208208

209+
private static record WorkflowErrorExpr(
210+
String type, int status, String instance, String title, String details) {
211+
static WorkflowErrorExpr from(WorkflowError error) {
212+
return new WorkflowErrorExpr(
213+
error.type(), error.status(), error.instance(), error.title(), error.detail());
214+
}
215+
}
216+
209217
private static Optional<Predicate<WorkflowError>> buildErrorFilter(CatchErrors errors) {
210218
return errors != null
211219
? Optional.of(error -> filterError(error, errors.getWith()))
@@ -217,7 +225,7 @@ private static boolean filterError(WorkflowError error, ErrorFilter errorFilter)
217225
&& (errorFilter.getStatus() <= 0 || error.status() == errorFilter.getStatus())
218226
&& compareString(errorFilter.getInstance(), error.instance())
219227
&& compareString(errorFilter.getTitle(), error.title())
220-
&& compareString(errorFilter.getDetails(), error.details());
228+
&& compareString(errorFilter.getDetails(), error.detail());
221229
}
222230

223231
private static boolean compareString(String one, String other) {

impl/core/src/main/java/io/serverlessworkflow/impl/lifecycle/ce/AbstractLifeCyclePublisher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
*/
1616
package io.serverlessworkflow.impl.lifecycle.ce;
1717

18+
import static io.serverlessworkflow.impl.WorkflowError.error;
1819
import static io.serverlessworkflow.impl.lifecycle.ce.WorkflowDefinitionCEData.ref;
19-
import static io.serverlessworkflow.impl.lifecycle.ce.WorkflowErrorCEData.error;
2020

2121
import io.cloudevents.CloudEvent;
2222
import io.cloudevents.CloudEventData;

impl/core/src/main/java/io/serverlessworkflow/impl/lifecycle/ce/TaskFailedCEData.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
*/
1616
package io.serverlessworkflow.impl.lifecycle.ce;
1717

18+
import io.serverlessworkflow.impl.WorkflowError;
1819
import java.time.OffsetDateTime;
1920

2021
public record TaskFailedCEData(
2122
String workflow,
2223
String task,
2324
WorkflowDefinitionCEData definition,
2425
OffsetDateTime faultedAt,
25-
WorkflowErrorCEData error) {}
26+
WorkflowError error) {}

impl/core/src/main/java/io/serverlessworkflow/impl/lifecycle/ce/WorkflowErrorCEData.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

impl/core/src/main/java/io/serverlessworkflow/impl/lifecycle/ce/WorkflowFailedCEData.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
*/
1616
package io.serverlessworkflow.impl.lifecycle.ce;
1717

18+
import io.serverlessworkflow.impl.WorkflowError;
1819
import java.time.OffsetDateTime;
1920

2021
public record WorkflowFailedCEData(
2122
String name,
2223
WorkflowDefinitionCEData definition,
2324
OffsetDateTime faultedAt,
24-
WorkflowErrorCEData error) {}
25+
WorkflowError error) {}

impl/test/src/test/java/io/serverlessworkflow/impl/test/LifeCycleEventsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io.serverlessworkflow.impl.WorkflowApplication;
2929
import io.serverlessworkflow.impl.WorkflowDefinition;
3030
import io.serverlessworkflow.impl.WorkflowDefinitionId;
31+
import io.serverlessworkflow.impl.WorkflowError;
3132
import io.serverlessworkflow.impl.WorkflowInstance;
3233
import io.serverlessworkflow.impl.WorkflowModel;
3334
import io.serverlessworkflow.impl.WorkflowStatus;
@@ -38,7 +39,6 @@
3839
import io.serverlessworkflow.impl.lifecycle.ce.TaskStartedCEData;
3940
import io.serverlessworkflow.impl.lifecycle.ce.WorkflowCancelledCEData;
4041
import io.serverlessworkflow.impl.lifecycle.ce.WorkflowCompletedCEData;
41-
import io.serverlessworkflow.impl.lifecycle.ce.WorkflowErrorCEData;
4242
import io.serverlessworkflow.impl.lifecycle.ce.WorkflowFailedCEData;
4343
import io.serverlessworkflow.impl.lifecycle.ce.WorkflowResumedCEData;
4444
import io.serverlessworkflow.impl.lifecycle.ce.WorkflowStartedCEData;
@@ -225,7 +225,7 @@ void testError() throws IOException {
225225
CompletionException.class,
226226
() -> appl.workflowDefinition(workflow).instance(Map.of()).start().join()))
227227
.isNotNull();
228-
WorkflowErrorCEData error =
228+
WorkflowError error =
229229
assertPojoInCE("io.serverlessworkflow.workflow.faulted.v1", WorkflowFailedCEData.class)
230230
.error();
231231
assertThat(error.type()).isEqualTo("https://serverlessworkflow.io/errors/not-implemented");

impl/test/src/test/java/io/serverlessworkflow/impl/test/WorkflowDefinitionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private static void checkWorkflowException(WorkflowException ex) {
204204
.isEqualTo("https://serverlessworkflow.io/errors/not-implemented");
205205
assertThat(ex.getWorkflowError().status()).isEqualTo(500);
206206
assertThat(ex.getWorkflowError().title()).isEqualTo("Not Implemented");
207-
assertThat(ex.getWorkflowError().details()).contains("raise-not-implemented");
207+
assertThat(ex.getWorkflowError().detail()).contains("raise-not-implemented");
208208
assertThat(ex.getWorkflowError().instance()).isEqualTo("do/0/notImplemented");
209209
}
210210

0 commit comments

Comments
 (0)