Skip to content
This repository was archived by the owner on Oct 6, 2025. It is now read-only.

Commit f97fbbd

Browse files
committed
Merge remote-tracking branch
'origin/issues/95_Validation_Result_Summary' into develop
2 parents b42c3d5 + 12877e1 commit f97fbbd

8 files changed

Lines changed: 165 additions & 7 deletions

File tree

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/ConstantsDataTransfer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public interface ConstantsDataTransfer
4444
String CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_DATA_REFERENCE = "data-reference";
4545
String CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_DRY_RUN = "dry-run";
4646
String CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_SIZE = "encrypted-bundle-size";
47+
String CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_LOCAL_VALIDATION_SUCCESSFUL = "local-validation-successful";
48+
String CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_RESOURCES_COUNT = "encrypted-bundle-resources-count";
4749

4850
String PROFILE_NUM_CODEX_TASK_DATA_TRIGGER_PROCESS_URI = "http://www.netzwerk-universitaetsmedizin.de/bpe/Process/dataTrigger/";
4951
String PROFILE_NUM_CODEX_TASK_DATA_TRIGGER_PROCESS_URI_AND_LATEST_VERSION = PROFILE_NUM_CODEX_TASK_DATA_TRIGGER_PROCESS_URI

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/service/send/EncryptData.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.BPMN_EXECUTION_VARIABLE_AES_RETURN_KEY;
44
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.BPMN_EXECUTION_VARIABLE_BUNDLE;
55
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.BPMN_EXECUTION_VARIABLE_PATIENT_REFERENCE;
6+
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.CODESYSTEM_NUM_CODEX_DATA_TRANSFER;
67
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.CODESYSTEM_NUM_CODEX_DATA_TRANSFER_ERROR_VALUE_ECRYPTION_OF_GECCO_DATA_FOR_CRR_FAILED;
8+
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_SIZE;
79
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.NAMING_SYSTEM_NUM_CODEX_CRR_PSEUDONYM;
810
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.NAMING_SYSTEM_NUM_CODEX_DIC_PSEUDONYM;
911
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.PSEUDONYM_PLACEHOLDER;
@@ -29,6 +31,8 @@
2931
import org.highmed.dsf.fhir.task.TaskHelper;
3032
import org.highmed.pseudonymization.crypto.AesGcmUtil;
3133
import org.hl7.fhir.r4.model.Bundle;
34+
import org.hl7.fhir.r4.model.Task;
35+
import org.hl7.fhir.r4.model.UnsignedIntType;
3236
import org.slf4j.Logger;
3337
import org.slf4j.LoggerFactory;
3438

@@ -82,6 +86,8 @@ protected void doExecute(DelegateExecution execution) throws BpmnError, Exceptio
8286

8387
execution.setVariable(BPMN_EXECUTION_VARIABLE_AES_RETURN_KEY, Variables.byteArrayValue(returnKey));
8488
execution.setVariable(BPMN_EXECUTION_VARIABLE_BUNDLE, Variables.byteArrayValue(encrypted));
89+
90+
addEncryptedBundleSizeToTask(execution, encrypted.length);
8591
}
8692
catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException
8793
| InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException
@@ -93,6 +99,15 @@ protected void doExecute(DelegateExecution execution) throws BpmnError, Exceptio
9399
}
94100
}
95101

102+
private void addEncryptedBundleSizeToTask(DelegateExecution execution, int encryptedSize)
103+
{
104+
Task task = getLeadingTaskFromExecutionVariables(execution);
105+
task.addOutput().setValue(new UnsignedIntType(encryptedSize)).getType().getCodingFirstRep()
106+
.setSystem(CODESYSTEM_NUM_CODEX_DATA_TRANSFER)
107+
.setCode(CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_SIZE);
108+
updateLeadingTaskInExecutionVariables(execution, task);
109+
}
110+
96111
private byte[] toByteArray(String pseudonym, Bundle bundle) throws IOException
97112
{
98113
String bundleString = fhirContext.newJsonParser().encodeResourceToString(bundle);

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/service/send/ValidateData.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.BPMN_EXECUTION_VARIABLE_BUNDLE;
44
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.BPMN_EXECUTION_VARIABLE_SOURCE_IDS_BY_BUNDLE_UUID;
5+
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.CODESYSTEM_NUM_CODEX_DATA_TRANSFER;
56
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.CODESYSTEM_NUM_CODEX_DATA_TRANSFER_ERROR_VALUE_VALIDATION_FAILED;
7+
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_RESOURCES_COUNT;
8+
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_LOCAL_VALIDATION_SUCCESSFUL;
69
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.HAPI_USER_DATA_SOURCE_ID_ELEMENT;
710

811
import java.util.HashMap;
@@ -16,6 +19,7 @@
1619
import org.highmed.dsf.fhir.client.FhirWebserviceClientProvider;
1720
import org.highmed.dsf.fhir.task.TaskHelper;
1821
import org.highmed.dsf.fhir.variables.FhirResourceValues;
22+
import org.hl7.fhir.r4.model.BooleanType;
1923
import org.hl7.fhir.r4.model.Bundle;
2024
import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent;
2125
import org.hl7.fhir.r4.model.Bundle.BundleEntryResponseComponent;
@@ -26,6 +30,7 @@
2630
import org.hl7.fhir.r4.model.ResourceType;
2731
import org.hl7.fhir.r4.model.StringType;
2832
import org.hl7.fhir.r4.model.Task;
33+
import org.hl7.fhir.r4.model.UnsignedIntType;
2934
import org.slf4j.Logger;
3035
import org.slf4j.LoggerFactory;
3136

@@ -75,6 +80,8 @@ protected void doExecute(DelegateExecution execution) throws BpmnError, Exceptio
7580
bundle);
7681
execution.setVariable(BPMN_EXECUTION_VARIABLE_SOURCE_IDS_BY_BUNDLE_UUID, sourceIdsByBundleUuid);
7782

83+
addValidationStatusAndBundleEntryCountToTask(execution, false, bundle);
84+
7885
return;
7986
}
8087

@@ -94,6 +101,8 @@ protected void doExecute(DelegateExecution execution) throws BpmnError, Exceptio
94101
{
95102
logger.warn(
96103
"Validation result bundle has entries wihout response.outcome instance of OperationOutcome");
104+
105+
addValidationStatusAndBundleEntryCountToTask(execution, false, bundle);
97106
}
98107
else
99108
{
@@ -108,6 +117,8 @@ protected void doExecute(DelegateExecution execution) throws BpmnError, Exceptio
108117
|| IssueSeverity.ERROR.equals(i.getSeverity())))
109118
.filter(b -> b).count();
110119

120+
addValidationStatusAndBundleEntryCountToTask(execution, resourcesWithErrorCount <= 0, bundle);
121+
111122
if (resourcesWithErrorCount > 0)
112123
{
113124
logger.error("Validation of transfer bundle failed, {} resource{} with error",
@@ -133,12 +144,15 @@ protected void doExecute(DelegateExecution execution) throws BpmnError, Exceptio
133144
else
134145
{
135146
logger.warn("Validation result bundle has no entries");
147+
addValidationStatusAndBundleEntryCountToTask(execution, false, bundle);
136148
}
137149
}, () ->
138150
{
139151
logger.warn(
140152
"{} not initialized, skipping validation. This is likely due to an error during startup of the process plugin",
141153
BundleValidatorFactory.class.getSimpleName());
154+
addValidationStatusAndBundleEntryCountToTask(execution, false,
155+
(Bundle) execution.getVariable(BPMN_EXECUTION_VARIABLE_BUNDLE));
142156
});
143157
}
144158

@@ -192,11 +206,24 @@ private void logValidationDetails(IdType sourceId, OperationOutcomeIssueComponen
192206
}
193207
}
194208

195-
private void addErrorsToTask(DelegateExecution execution, Bundle bundle)
209+
private void addValidationStatusAndBundleEntryCountToTask(DelegateExecution execution, boolean validationSuccessful,
210+
Bundle transferBundle)
211+
{
212+
Task task = getLeadingTaskFromExecutionVariables(execution);
213+
task.addOutput().setValue(new BooleanType(validationSuccessful)).getType().getCodingFirstRep()
214+
.setSystem(CODESYSTEM_NUM_CODEX_DATA_TRANSFER)
215+
.setCode(CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_LOCAL_VALIDATION_SUCCESSFUL);
216+
task.addOutput().setValue(new UnsignedIntType(transferBundle.getEntry().size())).getType().getCodingFirstRep()
217+
.setSystem(CODESYSTEM_NUM_CODEX_DATA_TRANSFER)
218+
.setCode(CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_RESOURCES_COUNT);
219+
updateLeadingTaskInExecutionVariables(execution, task);
220+
}
221+
222+
private void addErrorsToTask(DelegateExecution execution, Bundle validationBundle)
196223
{
197224
Task task = getLeadingTaskFromExecutionVariables(execution);
198225

199-
bundle.getEntry().stream()
226+
validationBundle.getEntry().stream()
200227
.filter(e -> e.hasResponse() && e.getResponse().hasOutcome()
201228
&& (e.getResponse().getOutcome() instanceof OperationOutcome)
202229
&& ((OperationOutcome) e.getResponse().getOutcome()).getIssue().stream()
@@ -210,6 +237,8 @@ private void addErrorsToTask(DelegateExecution execution, Bundle bundle)
210237
errorOutputParameterGenerator.createMeDicValidationError(sourceId, outcome)
211238
.forEach(task::addOutput);
212239
});
240+
241+
updateLeadingTaskInExecutionVariables(execution, task);
213242
}
214243

215244
private Map<String, String> removeValidationResultsCollectSourceIdsIntoMap(DelegateExecution execution,

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/service/translate/DownloadDataFromDic.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232
import org.hl7.fhir.r4.model.Endpoint;
3333
import org.hl7.fhir.r4.model.IdType;
3434
import org.hl7.fhir.r4.model.Identifier;
35-
import org.hl7.fhir.r4.model.IntegerType;
3635
import org.hl7.fhir.r4.model.Reference;
3736
import org.hl7.fhir.r4.model.Task;
3837
import org.hl7.fhir.r4.model.Type;
38+
import org.hl7.fhir.r4.model.UnsignedIntType;
3939
import org.slf4j.Logger;
4040
import org.slf4j.LoggerFactory;
4141

@@ -85,7 +85,7 @@ protected void doExecute(DelegateExecution execution) throws BpmnError, Exceptio
8585
byte[] encrypted = binary.readAllBytes();
8686
execution.setVariable(BPMN_EXECUTION_VARIABLE_BUNDLE, Variables.byteArrayValue(encrypted));
8787

88-
task.addOutput().setValue(new IntegerType(encrypted.length)).getType().getCodingFirstRep()
88+
task.addOutput().setValue(new UnsignedIntType(encrypted.length)).getType().getCodingFirstRep()
8989
.setSystem(CODESYSTEM_NUM_CODEX_DATA_TRANSFER)
9090
.setCode(CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_SIZE);
9191
}

codex-process-data-transfer/src/main/resources/fhir/CodeSystem/num-codex-data-transfer.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,14 @@
5656
<display value="Encrypted Bundle Size" />
5757
<definition value="Output parameter describing the encrypted transfer bundle size in byte" />
5858
</concept>
59+
<concept>
60+
<code value="local-validation-successful" />
61+
<display value="Local Validation Successful" />
62+
<definition value="Output parameter documenting if the local validation was sucessful" />
63+
</concept>
64+
<concept>
65+
<code value="encrypted-bundle-resources-count" />
66+
<display value="Encrypted Bundle Resources Count" />
67+
<definition value="Output parameter describing the number of resources included in the encrypted transfer bundle" />
68+
</concept>
5969
</CodeSystem>

codex-process-data-transfer/src/main/resources/fhir/StructureDefinition/num-codex-task-start-data-send.xml

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,5 +203,107 @@
203203
</type>
204204
<isModifier value="false" />
205205
</element>
206+
<element id="Task.output:localValidationSuccessful">
207+
<path value="Task.output" />
208+
<sliceName value="localValidationSuccessful" />
209+
<min value="0" />
210+
<max value="1" />
211+
</element>
212+
<element id="Task.output:localValidationSuccessful.type">
213+
<path value="Task.output.type" />
214+
<binding>
215+
<strength value="required" />
216+
<valueSet value="http://www.netzwerk-universitaetsmedizin.de/fhir/ValueSet/data-transfer|#{version}" />
217+
</binding>
218+
</element>
219+
<element id="Task.output:localValidationSuccessful.type.coding">
220+
<path value="Task.output.type.coding" />
221+
<min value="1" />
222+
<max value="1" />
223+
</element>
224+
<element id="Task.output:localValidationSuccessful.type.coding.system">
225+
<path value="Task.output.type.coding.system" />
226+
<min value="1" />
227+
<fixedUri value="http://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/data-transfer" />
228+
</element>
229+
<element id="Task.output:localValidationSuccessful.type.coding.code">
230+
<path value="Task.output.type.coding.code" />
231+
<min value="1" />
232+
<fixedCode value="local-validation-successful" />
233+
</element>
234+
<element id="Task.output:localValidationSuccessful.value[x]">
235+
<path value="Task.output.value[x]" />
236+
<type>
237+
<code value="boolean" />
238+
</type>
239+
</element>
240+
<element id="Task.output:encryptedBundleResourcesCount">
241+
<path value="Task.output" />
242+
<sliceName value="encryptedBundleResourcesCount" />
243+
<min value="0" />
244+
<max value="1" />
245+
</element>
246+
<element id="Task.output:encryptedBundleResourcesCount.type">
247+
<path value="Task.output.type" />
248+
<binding>
249+
<strength value="required" />
250+
<valueSet value="http://www.netzwerk-universitaetsmedizin.de/fhir/ValueSet/data-transfer|#{version}" />
251+
</binding>
252+
</element>
253+
<element id="Task.output:encryptedBundleResourcesCount.type.coding">
254+
<path value="Task.output.type.coding" />
255+
<min value="1" />
256+
<max value="1" />
257+
</element>
258+
<element id="Task.output:encryptedBundleResourcesCount.type.coding.system">
259+
<path value="Task.output.type.coding.system" />
260+
<min value="1" />
261+
<fixedUri value="http://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/data-transfer" />
262+
</element>
263+
<element id="Task.output:encryptedBundleResourcesCount.type.coding.code">
264+
<path value="Task.output.type.coding.code" />
265+
<min value="1" />
266+
<fixedCode value="encrypted-bundle-resources-count" />
267+
</element>
268+
<element id="Task.output:encryptedBundleResourcesCount.value[x]">
269+
<path value="Task.output.value[x]" />
270+
<type>
271+
<code value="unsignedInt" />
272+
</type>
273+
</element>
274+
<element id="Task.output:encryptedBundleSize">
275+
<path value="Task.output" />
276+
<sliceName value="encryptedBundleSize" />
277+
<min value="0" />
278+
<max value="1" />
279+
</element>
280+
<element id="Task.output:encryptedBundleSize.type">
281+
<path value="Task.output.type" />
282+
<binding>
283+
<strength value="required" />
284+
<valueSet value="http://www.netzwerk-universitaetsmedizin.de/fhir/ValueSet/data-transfer|#{version}" />
285+
</binding>
286+
</element>
287+
<element id="Task.output:encryptedBundleSize.type.coding">
288+
<path value="Task.output.type.coding" />
289+
<min value="1" />
290+
<max value="1" />
291+
</element>
292+
<element id="Task.output:encryptedBundleSize.type.coding.system">
293+
<path value="Task.output.type.coding.system" />
294+
<min value="1" />
295+
<fixedUri value="http://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/data-transfer" />
296+
</element>
297+
<element id="Task.output:encryptedBundleSize.type.coding.code">
298+
<path value="Task.output.type.coding.code" />
299+
<min value="1" />
300+
<fixedCode value="encrypted-bundle-size" />
301+
</element>
302+
<element id="Task.output:encryptedBundleSize.value[x]">
303+
<path value="Task.output.value[x]" />
304+
<type>
305+
<code value="unsignedInt" />
306+
</type>
307+
</element>
206308
</differential>
207309
</StructureDefinition>

codex-process-data-transfer/src/main/resources/fhir/StructureDefinition/num-codex-task-start-data-translate.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@
190190
<element id="Task.output:encryptedBundleSize.value[x]">
191191
<path value="Task.output.value[x]" />
192192
<type>
193-
<code value="integer" />
193+
<code value="unsignedInt" />
194194
</type>
195195
</element>
196196
</differential>

codex-process-data-transfer/src/test/java/de/netzwerk_universitaetsmedizin/codex/processes/fhir/profile/TaskProfileTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
import org.hl7.fhir.r4.model.IdType;
6161
import org.hl7.fhir.r4.model.Identifier;
6262
import org.hl7.fhir.r4.model.InstantType;
63-
import org.hl7.fhir.r4.model.IntegerType;
6463
import org.hl7.fhir.r4.model.OperationOutcome;
6564
import org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity;
6665
import org.hl7.fhir.r4.model.Reference;
@@ -70,6 +69,7 @@
7069
import org.hl7.fhir.r4.model.Task.ParameterComponent;
7170
import org.hl7.fhir.r4.model.Task.TaskIntent;
7271
import org.hl7.fhir.r4.model.Task.TaskStatus;
72+
import org.hl7.fhir.r4.model.UnsignedIntType;
7373
import org.junit.ClassRule;
7474
import org.junit.Test;
7575
import org.slf4j.Logger;
@@ -373,7 +373,7 @@ public void testTaskStartDataTranslateValidWithEncryptedBundleSizeOutput() throw
373373
{
374374
Task task = createValidTaskStartDataTranslate();
375375

376-
task.addOutput().setValue(new IntegerType(12345678)).getType().getCodingFirstRep()
376+
task.addOutput().setValue(new UnsignedIntType(12345678)).getType().getCodingFirstRep()
377377
.setSystem(CODESYSTEM_NUM_CODEX_DATA_TRANSFER)
378378
.setCode(CODESYSTEM_NUM_CODEX_DATA_TRANSFER_VALUE_ENCRYPTED_BUNDLE_SIZE);
379379

0 commit comments

Comments
 (0)