21
21
import java .util .Collections ;
22
22
import java .util .List ;
23
23
import java .util .Map ;
24
+ import java .util .Objects ;
24
25
import java .util .Optional ;
25
26
import java .util .Set ;
26
27
import java .util .stream .Collectors ;
@@ -62,14 +63,11 @@ public ReferenceResolver(CompartmentManager compartmentManager,
62
63
*/
63
64
public Mono <ResourceBundle > resolveCoreBundle (ResourceBundle coreBundle , Map <String , AnnotatedAttributeGroup > groupMap ) {
64
65
return Mono .just (coreBundle .getValidResourceGroups ())
65
- .map (groups -> groups .stream ()
66
- .filter (resourceGroup -> !compartmentManager .isInCompartment (resourceGroup )) // your custom filter logic
66
+ .map (groups -> groups .stream ().filter (resourceGroup -> !compartmentManager .isInCompartment (resourceGroup ))
67
67
.collect (Collectors .toSet ()))
68
68
.expand (currentGroupSet ->
69
69
processResourceGroups (currentGroupSet , null , coreBundle , false , groupMap )
70
- .onErrorResume (e -> {
71
- return Mono .empty (); // Skip this resource group on error
72
- }))
70
+ .onErrorResume (e -> Mono .empty ()))
73
71
.then (Mono .just (coreBundle ));
74
72
}
75
73
@@ -85,7 +83,11 @@ public Mono<ResourceBundle> resolveCoreBundle(ResourceBundle coreBundle, Map<Str
85
83
Mono <PatientBatchWithConsent > processSinglePatientBatch (
86
84
PatientBatchWithConsent batch , ResourceBundle coreBundle , Map <String , AnnotatedAttributeGroup > groupMap ) {
87
85
return Flux .fromIterable (batch .bundles ().entrySet ())
88
- .concatMap (entry -> resolvePatient (entry .getValue (), coreBundle , batch .applyConsent (), groupMap )
86
+ .concatMap (entry -> resolvePatient (entry .getValue (), coreBundle , batch .applyConsent (), groupMap ).doOnNext (bundle -> {
87
+ if (bundle == null ) {
88
+ logger .warn ("Resolved PatientResourceBundle for key {} is null" , entry .getKey ());
89
+ }
90
+ }).filter (Objects ::nonNull )
89
91
.map (updatedBundle -> Map .entry (entry .getKey (), updatedBundle )))
90
92
.collectMap (Map .Entry ::getKey , Map .Entry ::getValue )
91
93
.map (updatedBundles -> new PatientBatchWithConsent (updatedBundles , batch .applyConsent ()));
@@ -116,9 +118,7 @@ public Mono<PatientResourceBundle> resolvePatient(
116
118
.onErrorResume (e -> {
117
119
logger .warn ("Error processing resource group set {} in PatientBundle: {}" , currentGroupSet , e .getMessage ());
118
120
return Mono .empty (); // Skip this group on error
119
- })
120
- )
121
- .then (Mono .just (patientBundle ));
121
+ })).then (Mono .just (patientBundle ));
122
122
}
123
123
124
124
/**
@@ -143,27 +143,18 @@ public Mono<Set<ResourceGroup>> processResourceGroups(
143
143
144
144
return bundleLoader .fetchUnknownResources (referencesGroupedByResourceGroup , patientBundle , coreBundle , applyConsent )
145
145
.thenMany (
146
- Flux .fromIterable (referencesGroupedByResourceGroup .entrySet ())
146
+ Flux .fromIterable (referencesGroupedByResourceGroup .entrySet ()).filter (Objects ::nonNull )
147
+ .filter (entry -> entry .getKey () != null && entry .getValue () != null && !entry .getValue ().isEmpty ())
147
148
.concatMap (entry ->
148
- {
149
- try {
150
- return referenceHandler .handleReferences (
151
- entry .getValue (),
152
- patientBundle ,
153
- coreBundle ,
154
- groupMap
155
- );
156
- } catch (MustHaveViolatedException e ) {
157
- return Flux .empty ();
158
- }
159
- }
160
- )
161
- )
149
+ Flux .fromIterable (referenceHandler .handleReferences (
150
+ entry .getValue (),
151
+ patientBundle ,
152
+ coreBundle ,
153
+ groupMap ))))
162
154
.collect (Collectors .toSet ())
163
155
.flatMap (set -> set .isEmpty () ? Mono .empty () : Mono .just (set ));
164
156
}
165
157
166
-
167
158
/**
168
159
* Extracts for every ResourceGroup the ReferenceWrappers and collects them ordered by
169
160
*
@@ -179,9 +170,18 @@ public Map<ResourceGroup, List<ReferenceWrapper>> loadReferencesByResourceGroup(
179
170
ResourceBundle coreBundle ,
180
171
Map <String , AnnotatedAttributeGroup > groupMap ) {
181
172
182
- return resourceGroups .parallelStream ()
183
- .map (resourceGroup -> processResourceGroup (resourceGroup , patientBundle , coreBundle , groupMap ))
184
- .filter (entry -> !entry .getValue ().isEmpty ())
173
+ return resourceGroups .stream ()
174
+ .map (resourceGroup -> processResourceGroup (resourceGroup , patientBundle , coreBundle , groupMap )).map (entry -> {
175
+ if (entry == null ) {
176
+ logger .warn ("Null entry returned by processResourceGroup" );
177
+ } else if (entry .getKey () == null ) {
178
+ logger .warn ("Entry with null key for resource group {}" , entry );
179
+ } else if (entry .getValue () == null || entry .getValue ().isEmpty ()) {
180
+ logger .info ("No references extracted for resource group {}" , entry .getKey ());
181
+ }
182
+ return entry ;
183
+ }).filter (Objects ::nonNull )
184
+ .filter (entry -> entry .getKey () != null && entry .getValue () != null && !entry .getValue ().isEmpty ())
185
185
.collect (Collectors .toMap (
186
186
Map .Entry ::getKey ,
187
187
Map .Entry ::getValue ,
@@ -219,11 +219,7 @@ private Map.Entry<ResourceGroup, List<ReferenceWrapper>> processResourceGroup(
219
219
? patientBundle .bundle ().get (resourceGroup .resourceId ())
220
220
: coreBundle .get (resourceGroup .resourceId ());
221
221
222
- if (resource .isPresent ()) {
223
- return extractReferences (resourceGroup , resource .get (), groupMap , processingBundle );
224
- } else {
225
- return handleMissingResource (resourceGroup , processingBundle );
226
- }
222
+ return resource .map (value -> extractReferences (resourceGroup , value , groupMap , processingBundle )).orElseGet (() -> handleMissingResource (resourceGroup , processingBundle ));
227
223
}
228
224
229
225
/**
@@ -253,9 +249,7 @@ private Map.Entry<ResourceGroup, List<ReferenceWrapper>> extractReferences(
253
249
List <ReferenceWrapper > extracted = referenceExtractor .extract (resource , groupMap , resourceGroup .groupId ());
254
250
return Map .entry (resourceGroup , extracted );
255
251
} catch (MustHaveViolatedException e ) {
256
- synchronized (processingBundle ) {
257
- processingBundle .addResourceGroupValidity (resourceGroup , false );
258
- }
252
+ processingBundle .addResourceGroupValidity (resourceGroup , false );
259
253
return Map .entry (resourceGroup , Collections .emptyList ());
260
254
}
261
255
}
@@ -270,11 +264,8 @@ private Map.Entry<ResourceGroup, List<ReferenceWrapper>> extractReferences(
270
264
private Map .Entry <ResourceGroup , List <ReferenceWrapper >> handleMissingResource (
271
265
ResourceGroup resourceGroup ,
272
266
ResourceBundle processingBundle ) {
273
-
274
- synchronized (processingBundle ) {
275
- logger .warn ("Empty resource marked as valid for group {}" , resourceGroup );
276
- processingBundle .addResourceGroupValidity (resourceGroup , false );
277
- }
267
+ logger .warn ("Empty resource marked as valid for group {}" , resourceGroup );
268
+ processingBundle .addResourceGroupValidity (resourceGroup , false );
278
269
return Map .entry (resourceGroup , Collections .emptyList ());
279
270
}
280
271
0 commit comments