2525
2626import org .camunda .bpm .engine .delegate .BpmnError ;
2727import org .camunda .bpm .engine .delegate .DelegateExecution ;
28+ import org .hl7 .fhir .instance .model .api .IBaseResource ;
2829import org .hl7 .fhir .r4 .model .*;
2930import org .hl7 .fhir .r4 .model .Bundle .BundleEntryComponent ;
3031import 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