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

Commit 833765b

Browse files
committed
add support for Specimen and contained resources
1 parent e21f00f commit 833765b

1 file changed

Lines changed: 49 additions & 3 deletions

File tree

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

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

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.camunda.bpm.engine.delegate.BpmnError;
2727
import org.camunda.bpm.engine.delegate.DelegateExecution;
28+
import org.hl7.fhir.instance.model.api.IBaseResource;
2829
import org.hl7.fhir.r4.model.*;
2930
import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent;
3031
import org.hl7.fhir.r4.model.Bundle.BundleType;
@@ -155,6 +156,7 @@ protected Bundle toBundle(String pseudonym, Stream<DomainResource> resourcesStre
155156
.collect(Collectors.toMap(r -> r.getIdElement().toUnqualifiedVersionless().getValue(),
156157
r -> "urn:uuid:" + UUID.randomUUID().toString()));
157158

159+
158160
List<DomainResource> resourcesWithTemporaryReferences = fixReferences(resources, resourcesById, uuidsById);
159161
List<BundleEntryComponent> entries = resourcesWithTemporaryReferences.stream().map(r ->
160162
{
@@ -219,12 +221,20 @@ else if (resource instanceof Observation o)
219221
Observation::setEncounter);
220222
fixReferences(o, uuidsById, "Observation.hasMember", Observation::hasHasMember, Observation::getHasMember,
221223
Observation::setHasMember);
224+
fixReference(o, uuidsById, "Observation.specimen", Observation::hasSpecimen, Observation::getSpecimen,
225+
Observation::setSpecimen);
222226
}
223227
else if (resource instanceof Procedure p)
224228
{
225229
fixReference(p, uuidsById, "Procedure.encounter", Procedure::hasEncounter, Procedure::getEncounter,
226230
Procedure::setEncounter);
227231
}
232+
else if (resource instanceof Specimen s)
233+
{
234+
fixReferences(s, uuidsById, "Specimen.parent", Specimen::hasParent, Specimen::getParent,
235+
Specimen::setParent);
236+
}
237+
228238

229239
return resource;
230240
}
@@ -248,6 +258,18 @@ else if (oldReference.hasReference() && oldReference.getReference() == null && o
248258
{
249259
logger.debug("Not removing empty reference at {} with data-absent-reason extension", path);
250260
}
261+
else if (!oldReference.getResource().isEmpty())
262+
{
263+
String internalId = "#" + UUID.randomUUID();
264+
Reference fixedReference = new Reference(internalId);
265+
IBaseResource oldContainedResource = clean((DomainResource) oldReference.getResource());
266+
oldContainedResource.setId(internalId);
267+
fixedReference.setResource(oldContainedResource);
268+
setReference.apply(resource, fixedReference);
269+
logger.debug(
270+
"Replacing reference to contained resource at {} from resource {} with bundle temporary id in transport bundle",
271+
path, getAbsoluteId(resource).getValue());
272+
}
251273
else
252274
{
253275
logger.warn("Removing reference at {} from resource {} in transport bundle", path,
@@ -286,6 +308,18 @@ else if (oldReference.hasReference() && oldReference.getReference() == null
286308
logger.debug("Not removing empty reference at {}[{}] with data-absent-reason extension", path, i);
287309
fixedReferences.add(oldReference);
288310
}
311+
else if (!oldReference.getResource().isEmpty())
312+
{
313+
String internalId = "#" + UUID.randomUUID();
314+
Reference fixedReference = new Reference(internalId);
315+
IBaseResource oldContainedResource = clean((DomainResource) oldReference.getResource());
316+
oldContainedResource.setId(internalId);
317+
fixedReference.setResource(oldContainedResource);
318+
fixedReferences.add(fixedReference);
319+
logger.debug(
320+
"Replacing reference to contained resource at {}[{}] from resource {} with bundle temporary id in transport bundle",
321+
path, i, getAbsoluteId(resource).getValue());
322+
}
289323
else
290324
{
291325
logger.warn("Removing reference at {}[{}] from resource {} in transport bundle", path, i,
@@ -321,9 +355,10 @@ private <R extends DomainResource, C> R fixReferenceFromComponents(R resource, M
321355
i, getAbsoluteId(resource).getValue());
322356
setReference.apply(component, new Reference(uuidsById.get(oldReference.getReference())));
323357
}
324-
else if (oldReference.hasReference() && oldReference.getReference() == null
358+
else if ((oldReference.hasReference() && oldReference.getReference() == null
325359
&& oldReference.getReferenceElement_()
326360
.hasExtension("http://hl7.org/fhir/StructureDefinition/data-absent-reason"))
361+
|| oldReference.hasExtension("http://hl7.org/fhir/StructureDefinition/data-absent-reason"))
327362
{
328363
logger.debug("Not removing empty reference at " + path + " with data-absent-reason extension", i);
329364
}
@@ -654,8 +689,17 @@ else if (resource instanceof Procedure p)
654689
}
655690
else if (resource instanceof Specimen s)
656691
{
657-
// todo
658-
692+
cleanUnsupportedReferences(s, "Specimen.request", Specimen::hasRequest, Specimen::setRequest);
693+
cleanUnsupportedReferenceFromComponent(s, "Specimen.collection.collector", Specimen::hasCollection,
694+
Specimen::getCollection, Specimen.SpecimenCollectionComponent::hasCollector,
695+
Specimen.SpecimenCollectionComponent::setCollector);
696+
cleanUnsupportedReferencesFromComponents(s, "Specimen.processing[{}].additive", Specimen::hasProcessing,
697+
Specimen::getProcessing, Specimen.SpecimenProcessingComponent::hasAdditive,
698+
Specimen.SpecimenProcessingComponent::setAdditive);
699+
cleanUnsupportedReferenceFromComponents(s, "Specimen.container[{}].additiveReference",
700+
Specimen::hasContainer, Specimen::getContainer,
701+
Specimen.SpecimenContainerComponent::hasAdditiveReference,
702+
Specimen.SpecimenContainerComponent::setAdditive);
659703
}
660704
else
661705
throw new RuntimeException("Resource of type " + resource.getResourceType().name() + " not supported");
@@ -734,6 +778,8 @@ else if (resource instanceof Specimen s)
734778
throw new RuntimeException("Resource of type " + resource.getResourceType().name() + " not supported");
735779
}
736780

781+
((DomainResource) resource).getContained().forEach(r -> setSubjectOrIdentifier(r, pseudonym));
782+
737783
return resource;
738784
}
739785

0 commit comments

Comments
 (0)