Skip to content

Commit 5260f51

Browse files
committed
Error messages are no longer stored as a simple string in Task inputs and outputs. Instead, they are now a construct consisting of the process, process step, action, link to potential fix(es) and detailed error/exception message.
E-Mails now include all errors that occurred throughout one process execution instead of sending one e-mail for each error. This also fixes #14
1 parent d830513 commit 5260f51

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1650
-587
lines changed

src/main/java/dev/dsf/bpe/ConstantsPing.java

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,43 @@ private ConstantsPing()
5555
public static final String CODESYSTEM_DSF_PING_VALUE_DOWNLOADED_DURATION_MILLIS = "downloaded-duration-millis";
5656
public static final String CODESYSTEM_DSF_PING_VALUE_DOWNLOADED_BYTES = "downloaded-bytes";
5757
public static final String CODESYSTEM_DSF_PING_VALUE_DOWNLOAD_RESOURCE_REFERENCE = "download-resource-reference";
58-
public static final String CODESYSTEM_DSF_PING_VALUE_ERROR_MESSAGE = "error-message";
58+
public static final String CODESYSTEM_DSF_PING_VALUE_ERROR = "error";
5959

6060
public static final String CODESYSTEM_DSF_PING_STATUS = "http://dsf.dev/fhir/CodeSystem/ping-status-v2";
6161
public static final String CODESYSTEM_DSF_PING_STATUS_VALUE_COMPLETED = "completed";
6262
public static final String CODESYSTEM_DSF_PING_STATUS_VALUE_PENDING = "pending";
6363
public static final String CODESYSTEM_DSF_PING_STATUS_VALUE_ERROR = "error";
6464

65+
public static final String CODESYSTEM_DSF_PING_PROCESSES = "http://dsf.dev/fhir/CodeSystem/ping-processes-v2";
66+
public static final String CODESYSTEM_DSF_PING_PROCESSES_VALUE_PING = "ping";
67+
public static final String CODESYSTEM_DSF_PING_PROCESSES_VALUE_PONG = "pong";
68+
69+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS = "http://dsf.dev/fhir/CodeSystem/ping-process-steps-v2";
70+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_SET_DOWNLOAD_RESOURCE_SIZE = "set-download-resource-size";
71+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_GENERATE_AND_STORE_RESOURCE = "generate-and-store-resource";
72+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_LOG_AND_SAVE_ERROR = "log-and-save-error";
73+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_SELECT_TARGETS = "select-targets";
74+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_PING = "ping";
75+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_LOG_AND_SAVE_SEND_ERROR = "log-and-save-send-error";
76+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_LOG_AND_SAVE_NO_RESPONSE = "log-and-save-no-response";
77+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_SAVE_PONG = "save-pong";
78+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_DOWNLOAD_RESOURCE_AND_MEASURE_SPEED = "download-resource-and-measure-speed";
79+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_CLEANUP_PONG = "cleanup-pong";
80+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_CLEANUP = "cleanup";
81+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_STORE_RESULTS = "store-results";
82+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_LOG_PING = "log-ping";
83+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_SET_ENDPOINT_IDENTIFIER = "set-endpoint-identifier";
84+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_SELECT_PONG_TARGET = "select-pong-target";
85+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_STORE_DOWNLOAD_SPEED = "store-download-speed";
86+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_LOG_AND_SAVE_AND_STORE_ERROR = "log-and-save-and-store-error";
87+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_ESTIMATE_CLEANUP_TIMER_DURATION = "estimate-cleanup-timer-duration";
88+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_PONG = "pong";
89+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_STORE_UPLOAD_SPEED = "store-upload-speed";
90+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_SAVE_TIMEOUT_ERROR = "save-timeout-error";
91+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_STORE_ERRORS = "store-errors";
92+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_CLEANUP_TIMER_CATCH_EVENT = "cleanup-timer-catch-event";
93+
public static final String CODESYSTEM_DSF_PING_PROCESS_STEPS_VALUE_PONG_MESSAGE_TIMEOUT_TIMER_CATCH_EVENT = "pong-timer-catch-event";
94+
6595
public static final String CODESYSTEM_DSF_PING_UNITS = "http://dsf.dev/fhir/CodeSystem/ping-units-v2";
6696
public static final String CODESYSTEM_DSF_PING_UNITS_VALUE_BITS_PER_SECOND = "bits-per-second";
6797
public static final String CODESYSTEM_DSF_PING_UNITS_VALUE_BYTES_PER_SECOND = "bytes-per-second";
@@ -75,32 +105,41 @@ private ConstantsPing()
75105
public static final String CODESYSTEM_READ_ACCESS_TAG = "http://dsf.dev/fhir/CodeSystem/read-access-tag";
76106
public static final String CODESYSTEM_READ_ACCESS_TAG_VALUE_ALL = "ALL";
77107

78-
public static final String EXTENSION_URL_PING_STATUS = "http://dsf.dev/fhir/StructureDefinition/extension-ping-status-v2";
79-
public static final String EXTENSION_URL_NETWORK_SPEED = "http://dsf.dev/fhir/StructureDefinition/extension-network-speed";
108+
public static final String STRUCTURE_DEFINITION_URL_EXTENSION_PING_STATUS = "http://dsf.dev/fhir/StructureDefinition/extension-ping-status-v2";
109+
public static final String STRUCTURE_DEFINITION_URL_EXTENSION_NETWORK_SPEED = "http://dsf.dev/fhir/StructureDefinition/extension-network-speed";
110+
public static final String STRUCTURE_DEFINITION_URL_EXTENSION_EXTENSION_ERROR = "http://dsf.dev/fhir/StructureDefinition/extension-extension-error";
111+
public static final String STRUCTURE_DEFINITION_URL_INPUT_EXTENSION_ERROR = "http://dsf.dev/fhir/StructureDefinition/input-extension-error";
112+
public static final String STRUCTURE_DEFINITION_URL_OUTPUT_EXTENSION_ERROR = "http://dsf.dev/fhir/StructureDefinition/output-extension-error";
113+
80114
public static final String EXTENSION_URL_CORRELATION_KEY = "correlation-key";
81115
public static final String EXTENSION_URL_ORGANIZATION_IDENTIFIER = "organization-identifier";
82116
public static final String EXTENSION_URL_ENDPOINT_IDENTIFIER = "endpoint-identifier";
83-
public static final String EXTENSION_URL_ERROR_MESSAGE = "error-message";
84117
public static final String EXTENSION_URL_DOWNLOAD_SPEED = "download-speed";
85118
public static final String EXTENSION_URL_UPLOAD_SPEED = "upload-speed";
86119
public static final String EXTENSION_URL_NETWORK_SPEED_UNIT = "unit";
87120
public static final String EXTENSION_URL_NETWORK_SPEED_VALUE = "network-speed";
121+
public static final String EXTENSION_URL_ERROR = "error";
122+
public static final String EXTENSION_URL_PROCESS = "process";
123+
public static final String EXTENSION_URL_PROCESS_STEP = "process-step";
124+
public static final String EXTENSION_URL_ACTION = "action";
125+
public static final String EXTENSION_URL_POTENTIAL_FIX = "potential-fix";
126+
public static final String EXTENSION_URL_MESSAGE = "message";
88127

89128
public static final String BPMN_EXECUTION_VARIABLE_TIMER_INTERVAL = "timerInterval";
90129
public static final String BPMN_EXECUTION_VARIABLE_STOP_TIMER = "stopTimer";
91130
public static final String BPMN_EXECUTION_VARIABLE_DOWNLOAD_RESOURCE_SIZE_BYTES = "downloadResourceSizeBytes";
92131
public static final String BPMN_EXECUTION_VARIABLE_DOWNLOAD_RESOURCE = "downloadResource";
93132
public static final String BPMN_EXECUTION_VARIABLE_DOWNLOAD_RESOURCE_REFERENCE = "downloadResourceReference";
94133
private static final String BPMN_EXECUTION_VARIABLE_STATUS_CODE = "statusCode";
95-
private static final String BPMN_EXECUTION_VARIABLE_ERROR_MESSAGE = "errorMessage";
96-
private static final String BPMN_EXECUTION_VARIABLE_ERROR_MESSAGE_LIST = "errorMessages";
134+
private static final String BPMN_EXECUTION_VARIABLE_ERROR = "error";
135+
private static final String BPMN_EXECUTION_VARIABLE_ERROR_LIST = "errors";
97136
private static final String BPMN_EXECUTION_VARIABLE_DOWNLOADED_BYTES = "downloadedBytes";
98137
private static final String BPMN_EXECUTION_VARIABLE_DOWNLOADED_DURATION_MILLIS = "downloadedDurationMillis";
99138
public static final String BPMN_EXECUTION_VARIABLE_PONG_TARGET_ENDPOINT_IDENTIFIER = "targetEndpointIdentifier";
100139
private static final String BPMN_EXECUTION_VARIABLE_UPLOADED_BYTES = "uploadedBytes";
101140
private static final String BPMN_EXECUTION_VARIABLE_UPLOADED_DURATION_MILLIS = "uploadedDurationMillis";
102-
public static final String BPMN_EXECUTION_VARIABLE_RESOURCE_DOWNLOAD_ERROR_MESSAGE = "resourceDownloadErrorMessage";
103-
public static final String BPMN_EXECUTION_VARIABLE_RESOURCE_UPLOAD_ERROR_MESSAGE = "resourceUploadErrorMessage";
141+
public static final String BPMN_EXECUTION_VARIABLE_RESOURCE_DOWNLOAD_ERROR = "resourceDownloadError";
142+
public static final String BPMN_EXECUTION_VARIABLE_RESOURCE_UPLOAD_ERROR = "resourceUploadError";
104143

105144
public static final String BPMN_ERROR_CODE_RESOURCE_DOWNLOAD_ERROR = "resourceDownloadError";
106145
public static final String BPMN_ERROR_CODE_RESOURCE_UPLOAD_ERROR = "resourceUploadError";
@@ -113,6 +152,8 @@ private ConstantsPing()
113152

114153
public static final String TIMER_INTERVAL_DEFAULT_VALUE = "PT24H";
115154

155+
public static final String POTENTIAL_FIX_URL_DUMMY = "dsf.dev";
156+
116157
public static String getBpmnExecutionVariableStatusCode()
117158
{
118159
return BPMN_EXECUTION_VARIABLE_STATUS_CODE;
@@ -123,14 +164,14 @@ public static String getBpmnExecutionVariableStatusCode(String correlationKey)
123164
return BPMN_EXECUTION_VARIABLE_STATUS_CODE + "_" + correlationKey;
124165
}
125166

126-
public static String getBpmnExecutionVariableErrorMessage()
167+
public static String getBpmnExecutionVariableError()
127168
{
128-
return BPMN_EXECUTION_VARIABLE_ERROR_MESSAGE;
169+
return BPMN_EXECUTION_VARIABLE_ERROR;
129170
}
130171

131172
public static String getBpmnExecutionVariableErrorMessage(String correlationKey)
132173
{
133-
return BPMN_EXECUTION_VARIABLE_ERROR_MESSAGE + "_" + correlationKey;
174+
return BPMN_EXECUTION_VARIABLE_ERROR + "_" + correlationKey;
134175
}
135176

136177
public static String getBpmnExecutionVariableDownloadedBytes()
@@ -173,13 +214,13 @@ public static String getBpmnExecutionVariableUploadedDurationMillis(String corre
173214
return BPMN_EXECUTION_VARIABLE_UPLOADED_DURATION_MILLIS + "_" + correlationKey;
174215
}
175216

176-
public static String getBpmnExecutionVariableErrorMessageList()
217+
public static String getBpmnExecutionVariableErrorList()
177218
{
178-
return BPMN_EXECUTION_VARIABLE_ERROR_MESSAGE_LIST;
219+
return BPMN_EXECUTION_VARIABLE_ERROR_LIST;
179220
}
180221

181222
public static String getBpmnExecutionVariableErrorMessageList(String correlationKey)
182223
{
183-
return getBpmnExecutionVariableErrorMessageList() + "_" + correlationKey;
224+
return getBpmnExecutionVariableErrorList() + "_" + correlationKey;
184225
}
185226
}

src/main/java/dev/dsf/bpe/PingProcessPluginDefinition.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public Map<String, List<String>> getFhirResourcesByProcessId()
6262
var sStopPingAutostart = "fhir/StructureDefinition/dsf-task-stop-ping-autostart.xml";
6363
var sCleanupPong = "fhir/StructureDefinition/dsf-task-cleanup-pong.xml";
6464
var sNetworkSpeedExtension = "fhir/StructureDefinition/dsf-extension-network-speed.xml";
65+
var sErrorExtensionExtension = "fhir/StructureDefinition/dsf-extension-extension-error.xml";
66+
var sErrorInputExtension = "fhir/StructureDefinition/dsf-input-extension-error.xml";
67+
var sErrorOutputExtension = "fhir/StructureDefinition/dsf-output-extension-error.xml";
6568

6669
var tStartPing = "fhir/Task/dsf-task-start-ping.xml";
6770
var tStartPingAutoStart = "fhir/Task/dsf-task-start-ping-autostart.xml";
@@ -72,13 +75,15 @@ public Map<String, List<String>> getFhirResourcesByProcessId()
7275
var vPingStatus = "fhir/ValueSet/dsf-ping-status.xml";
7376
var vPongStatus = "fhir/ValueSet/dsf-pong-status.xml";
7477

75-
return Map.of(ConstantsPing.PROCESS_NAME_FULL_PING,
76-
Arrays.asList(aPing, cPing, cPingStatus, cPingUnits, sPingStatus, sStartPing, sPong, sCleanupPong,
78+
return Map.of(
79+
ConstantsPing.PROCESS_NAME_FULL_PING, Arrays.asList(aPing, cPing, cPingStatus, cPingUnits,
80+
sErrorExtensionExtension, sErrorOutputExtension, sPingStatus, sStartPing, sPong, sCleanupPong,
7781
sNetworkSpeedExtension, tStartPing, vPing, vPingStatus, vPingUnits),
78-
ConstantsPing.PROCESS_NAME_FULL_PING_AUTOSTART,
79-
Arrays.asList(aPingAutostart, cPing, sStartPingAutostart, sStopPingAutostart, tStartPingAutoStart,
80-
tStopPingAutoStart, vPing),
81-
ConstantsPing.PROCESS_NAME_FULL_PONG, Arrays.asList(aPong, cPing, cPingStatus, cPingUnits, sPingStatus,
82-
sPing, sNetworkSpeedExtension, vPing, vPongStatus, vPingUnits));
82+
ConstantsPing.PROCESS_NAME_FULL_PING_AUTOSTART, Arrays.asList(aPingAutostart, cPing,
83+
sStartPingAutostart, sStopPingAutostart, tStartPingAutoStart, tStopPingAutoStart, vPing),
84+
ConstantsPing.PROCESS_NAME_FULL_PONG,
85+
Arrays.asList(aPong, cPing, cPingStatus, cPingUnits, sErrorExtensionExtension, sErrorInputExtension,
86+
sErrorOutputExtension, sPingStatus, sPing, sNetworkSpeedExtension, vPing, vPongStatus,
87+
vPingUnits));
8388
}
8489
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package dev.dsf.bpe;
2+
3+
import java.util.List;
4+
5+
import org.hl7.fhir.r4.model.Coding;
6+
import org.hl7.fhir.r4.model.Extension;
7+
import org.hl7.fhir.r4.model.StringType;
8+
import org.hl7.fhir.r4.model.UrlType;
9+
10+
import com.fasterxml.jackson.core.JsonProcessingException;
11+
import com.fasterxml.jackson.core.type.TypeReference;
12+
import com.fasterxml.jackson.databind.ObjectMapper;
13+
14+
public record ProcessError(String process, String processStep, String action, String potentialFixUrl, String message)
15+
{
16+
@Override
17+
public boolean equals(Object obj)
18+
{
19+
return obj instanceof ProcessError error && process.equals(error.process())
20+
&& processStep.equals(error.processStep()) && action.equals(error.action())
21+
&& message.equals(error.message());
22+
23+
}
24+
25+
public static Extension toExtensionExtension(ProcessError error)
26+
{
27+
Extension errorExtension = new Extension();
28+
errorExtension.setUrl(ConstantsPing.EXTENSION_URL_ERROR);
29+
Extension errorExtensionExtension = new Extension();
30+
31+
errorExtensionExtension.setUrl(ConstantsPing.STRUCTURE_DEFINITION_URL_EXTENSION_EXTENSION_ERROR);
32+
errorExtensionExtension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_PROCESS)
33+
.setValue(new Coding(ConstantsPing.CODESYSTEM_DSF_PING_PROCESSES, error.process(), null));
34+
errorExtensionExtension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_PROCESS_STEP)
35+
.setValue(new Coding(ConstantsPing.CODESYSTEM_DSF_PING_PROCESS_STEPS, error.process(), null));
36+
errorExtensionExtension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_ACTION)
37+
.setValue(new StringType(error.action()));
38+
errorExtensionExtension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_POTENTIAL_FIX)
39+
.setValue(new UrlType(error.potentialFixUrl()));
40+
errorExtensionExtension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_MESSAGE)
41+
.setValue(new StringType(error.message()));
42+
43+
errorExtension.addExtension(errorExtensionExtension);
44+
return errorExtension;
45+
}
46+
47+
public static Extension toInputExtension(ProcessError error)
48+
{
49+
return toParameterExtension(error, ConstantsPing.STRUCTURE_DEFINITION_URL_INPUT_EXTENSION_ERROR);
50+
}
51+
52+
public static Extension toOutputExtension(ProcessError error)
53+
{
54+
return toParameterExtension(error, ConstantsPing.STRUCTURE_DEFINITION_URL_OUTPUT_EXTENSION_ERROR);
55+
}
56+
57+
private static Extension toParameterExtension(ProcessError error, String structureDefinitionUrl)
58+
{
59+
Extension extension = new Extension();
60+
61+
extension.setUrl(structureDefinitionUrl);
62+
extension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_PROCESS)
63+
.setValue(new Coding(ConstantsPing.CODESYSTEM_DSF_PING_PROCESSES, error.process(), null));
64+
extension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_PROCESS_STEP)
65+
.setValue(new Coding(ConstantsPing.CODESYSTEM_DSF_PING_PROCESS_STEPS, error.process(), null));
66+
extension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_ACTION).setValue(new StringType(error.action()));
67+
extension.addExtension().setUrl(ConstantsPing.EXTENSION_URL_POTENTIAL_FIX)
68+
.setValue(new UrlType(error.potentialFixUrl()));
69+
70+
return extension;
71+
}
72+
73+
public static ProcessError toError(Extension extension)
74+
{
75+
String process = ((Coding) extension.getExtensionByUrl(ConstantsPing.EXTENSION_URL_PROCESS).getValue())
76+
.getCode();
77+
String processStep = ((Coding) extension.getExtensionByUrl(ConstantsPing.EXTENSION_URL_PROCESS_STEP).getValue())
78+
.getCode();
79+
String action = ((StringType) extension.getExtensionByUrl(ConstantsPing.EXTENSION_URL_ACTION).getValue())
80+
.getValue();
81+
String potentialFixUrl = ((StringType) extension.getExtensionByUrl(ConstantsPing.EXTENSION_URL_POTENTIAL_FIX)
82+
.getValue()).getValue();
83+
String message = ((StringType) extension.getExtensionByUrl(ConstantsPing.EXTENSION_URL_MESSAGE).getValue())
84+
.getValue();
85+
86+
return new ProcessError(process, processStep, action, potentialFixUrl, message);
87+
}
88+
89+
public static String toString(List<ProcessError> errors) throws JsonProcessingException
90+
{
91+
ObjectMapper objectMapper = new ObjectMapper();
92+
return objectMapper.writeValueAsString(errors);
93+
}
94+
95+
public static String toString(ProcessError error) throws JsonProcessingException
96+
{
97+
ObjectMapper objectMapper = new ObjectMapper();
98+
return objectMapper.writeValueAsString(error);
99+
}
100+
101+
public static List<ProcessError> parseList(String json) throws JsonProcessingException
102+
{
103+
ObjectMapper objectMapper = new ObjectMapper();
104+
return objectMapper.readValue(json, new TypeReference<List<ProcessError>>()
105+
{
106+
});
107+
}
108+
109+
public static ProcessError parse(String json) throws JsonProcessingException
110+
{
111+
ObjectMapper objectMapper = new ObjectMapper();
112+
return objectMapper.readValue(json, ProcessError.class);
113+
}
114+
}

0 commit comments

Comments
 (0)