1717
1818import static java .util .stream .Collectors .toList ;
1919
20- import java .util .*;
20+ import java .util .ArrayList ;
21+ import java .util .Collections ;
22+ import java .util .Date ;
23+ import java .util .LinkedHashMap ;
24+ import java .util .List ;
25+ import java .util .Map ;
26+ import java .util .Objects ;
27+ import java .util .Optional ;
28+ import java .util .Set ;
2129import java .util .concurrent .ExecutionException ;
2230import java .util .stream .Collectors ;
2331import java .util .stream .Stream ;
3341import javax .persistence .EntityManager ;
3442import javax .persistence .PersistenceContext ;
3543import javax .persistence .Tuple ;
36- import javax .persistence .criteria .*;
44+ import javax .persistence .criteria .CriteriaBuilder ;
45+ import javax .persistence .criteria .CriteriaQuery ;
46+ import javax .persistence .criteria .Expression ;
47+ import javax .persistence .criteria .Join ;
48+ import javax .persistence .criteria .JoinType ;
49+ import javax .persistence .criteria .Order ;
50+ import javax .persistence .criteria .Predicate ;
51+ import javax .persistence .criteria .Root ;
52+ import javax .persistence .criteria .Selection ;
3753import javax .validation .Valid ;
3854import javax .validation .constraints .NotNull ;
3955
5571import de .symeda .sormas .api .customizableenum .CustomEnumNotFoundException ;
5672import de .symeda .sormas .api .customizableenum .CustomizableEnumType ;
5773import de .symeda .sormas .api .event .EventParticipantReferenceDto ;
58- import de .symeda .sormas .api .externalmessage .*;
74+ import de .symeda .sormas .api .externalmessage .ExternalMessageAdapterFacade ;
75+ import de .symeda .sormas .api .externalmessage .ExternalMessageCriteria ;
76+ import de .symeda .sormas .api .externalmessage .ExternalMessageDto ;
77+ import de .symeda .sormas .api .externalmessage .ExternalMessageFacade ;
78+ import de .symeda .sormas .api .externalmessage .ExternalMessageFetchResult ;
79+ import de .symeda .sormas .api .externalmessage .ExternalMessageIndexDto ;
80+ import de .symeda .sormas .api .externalmessage .ExternalMessageReferenceDto ;
81+ import de .symeda .sormas .api .externalmessage .ExternalMessageResult ;
82+ import de .symeda .sormas .api .externalmessage .ExternalMessageStatus ;
83+ import de .symeda .sormas .api .externalmessage .ExternalMessageType ;
84+ import de .symeda .sormas .api .externalmessage .NewMessagesState ;
5985import de .symeda .sormas .api .externalmessage .labmessage .SampleReportDto ;
6086import de .symeda .sormas .api .externalmessage .processing .ExternalMessageProcessingResult ;
61- import de .symeda .sormas .api .externalmessage .survey .*;
87+ import de .symeda .sormas .api .externalmessage .survey .ExternalMessageSurveyResponseRequest ;
88+ import de .symeda .sormas .api .externalmessage .survey .ExternalMessageSurveyResponseWrapper ;
89+ import de .symeda .sormas .api .externalmessage .survey .ExternalSurveyResponseData ;
90+ import de .symeda .sormas .api .externalmessage .survey .PatchDictionary ;
91+ import de .symeda .sormas .api .externalmessage .survey .PatchField ;
92+ import de .symeda .sormas .api .externalmessage .survey .SurveyAsExternalMessageAdapterFacade ;
6293import de .symeda .sormas .api .feature .FeatureType ;
6394import de .symeda .sormas .api .feature .FeatureTypeProperty ;
6495import de .symeda .sormas .api .i18n .Captions ;
102133import de .symeda .sormas .backend .systemevent .sync .SyncFacadeEjb ;
103134import de .symeda .sormas .backend .user .User ;
104135import de .symeda .sormas .backend .user .UserService ;
105- import de .symeda .sormas .backend .util .*;
136+ import de .symeda .sormas .backend .util .DtoHelper ;
137+ import de .symeda .sormas .backend .util .IterableHelper ;
138+ import de .symeda .sormas .backend .util .ModelConstants ;
139+ import de .symeda .sormas .backend .util .QueryHelper ;
140+ import de .symeda .sormas .backend .util .RightsAllowed ;
106141
107142@ Stateless (name = "ExternalMessageFacade" )
108143@ RightsAllowed ({
@@ -308,44 +343,48 @@ public List<ExternalMessageDto> saveAndProcessSurveyResponses(Date since) {
308343
309344 ExternalMessageAdapterFacade externalLabResultsFacade = getExternalSurveyProviderFacade ();
310345 ExternalMessageResult <List <ExternalMessageDto >> externalMessagesResult = externalLabResultsFacade .getExternalMessages (since );
311- List <ExternalMessageDto > surveyResponses = externalMessagesResult .getValue ();
312346
313- List <String > reportIds = surveyResponses .stream ().map (ExternalMessageDto ::getReportId ).filter (Objects ::nonNull ).collect (toList ());
347+ List <ExternalMessageDto > filteredSurveyResponses = externalMessagesResult .getValue ().stream ().filter (Objects ::nonNull ).collect (toList ());
348+ List <String > reportIds = filteredSurveyResponses .stream ().map (ExternalMessageDto ::getReportId ).filter (Objects ::nonNull ).collect (toList ());
314349
315- if (!reportIds .isEmpty ()) {
316- logger .debug ("ReportIds that will be processed: [{}]" , reportIds );
317- Map <String , de .symeda .sormas .api .utils .Tuple <ExternalMessageStatus , String >> statusUuidTuplesByReportId =
318- externalMessageService .getUuidsByReportIds (reportIds );
319-
320- Set <String > unProcessedMessagesReportIds = statusUuidTuplesByReportId .entrySet ()
321- .stream ()
322- .filter (tuple -> tuple .getValue ().getFirst () == ExternalMessageStatus .UNPROCESSED )
323- .map (Map .Entry ::getKey )
324- .collect (Collectors .toSet ());
350+ if (CollectionUtils .isEmpty (reportIds )) {
351+ logger .info ("No reportIds found, this means there is no new external survey responses. Stopping processing" );
352+ return List .of ();
353+ }
325354
326- Set <String > alreadyPresentReportIds = statusUuidTuplesByReportId .keySet ();
355+ logger .debug ("ReportIds that will be processed: [{}]" , reportIds );
356+ Map <String , de .symeda .sormas .api .utils .Tuple <ExternalMessageStatus , String >> statusUuidTuplesByReportId =
357+ externalMessageService .getUuidsByReportIds (reportIds );
327358
328- surveyResponses .forEach (dto -> {
329- de .symeda .sormas .api .utils .Tuple <ExternalMessageStatus , String > tuple = statusUuidTuplesByReportId .get (dto .getReportId ());
330- if (tuple != null && tuple .getFirst () == ExternalMessageStatus .UNPROCESSED ) {
331- dto .setUuid (tuple .getSecond ());
332- }
333- });
359+ Set <String > unProcessedMessagesReportIds = statusUuidTuplesByReportId .entrySet ()
360+ .stream ()
361+ .filter (tuple -> tuple .getValue ().getFirst () == ExternalMessageStatus .UNPROCESSED )
362+ .map (Map .Entry ::getKey )
363+ .collect (Collectors .toSet ());
334364
335- surveyResponses = surveyResponses .stream ()
336- .filter (
337- externalMessage -> !alreadyPresentReportIds .contains (externalMessage .getReportId ())
338- || unProcessedMessagesReportIds .contains (externalMessage .getReportId ()))
339- .collect (toList ());
365+ Set <String > alreadyPresentReportIds = statusUuidTuplesByReportId .keySet ();
340366
341- if (logger .isTraceEnabled ()) {
342- logger .trace ("Computed survey responses: \n {}" , ObjectMapperProvider .writeValueAsStringFailSafe (surveyResponses ));
367+ // to replace existing messages and NOT creating new ones for same survey responses
368+ filteredSurveyResponses .forEach (dto -> {
369+ de .symeda .sormas .api .utils .Tuple <ExternalMessageStatus , String > tuple = statusUuidTuplesByReportId .get (dto .getReportId ());
370+ if (tuple != null && tuple .getFirst () == ExternalMessageStatus .UNPROCESSED ) {
371+ dto .setUuid (tuple .getSecond ());
343372 }
373+ });
374+
375+ filteredSurveyResponses = filteredSurveyResponses .stream ()
376+ .filter (
377+ externalMessage -> !alreadyPresentReportIds .contains (externalMessage .getReportId ())
378+ || unProcessedMessagesReportIds .contains (externalMessage .getReportId ()))
379+ .collect (toList ());
380+
381+ if (logger .isTraceEnabled ()) {
382+ logger .trace ("Computed survey responses: \n {}" , ObjectMapperProvider .writeValueAsStringFailSafe (filteredSurveyResponses ));
344383 }
345384
346385 List <ExternalMessageDto > savedDtos ;
347386 try {
348- List <SurveyResponseProcessingResult > processingResults = automaticSurveyResponseProcessor .processSurveyResponses (surveyResponses );
387+ List <SurveyResponseProcessingResult > processingResults = automaticSurveyResponseProcessor .processSurveyResponses (filteredSurveyResponses );
349388
350389 processingResults .forEach (wrapper -> {
351390 ProcessingResultStatus result = wrapper .getResultStatus ();
@@ -354,12 +393,12 @@ public List<ExternalMessageDto> saveAndProcessSurveyResponses(Date since) {
354393 }
355394 });
356395 } catch (InterruptedException e ) {
357- logger .error ("Could not process lab message with UUID [{}]" , extractUuids (surveyResponses ), e );
396+ logger .error ("Could not process lab message with UUID [{}]" , extractUuids (filteredSurveyResponses ), e );
358397 Thread .currentThread ().interrupt ();
359398 } catch (ExecutionException e ) {
360- logger .error ("Could not process survey responses with UUID [{}]" , extractUuids (surveyResponses ), e );
399+ logger .error ("Could not process survey responses with UUID [{}]" , extractUuids (filteredSurveyResponses ), e );
361400 } finally {
362- savedDtos = surveyResponses .stream ().map (this ::save ).collect (toList ());
401+ savedDtos = filteredSurveyResponses .stream ().map (this ::save ).collect (toList ());
363402 }
364403
365404 if (logger .isTraceEnabled ()) {
@@ -913,7 +952,7 @@ private SurveyAsExternalMessageAdapterFacade getExternalSurveyProviderFacade() {
913952 String jndiName =
914953 Optional .ofNullable (systemConfigurationValueFacade .getValue (SURVEY_AS_EXTERNAL_MESSAGE_ADAPTER_JNDI_CONFIG_KEY )).orElseGet (() -> {
915954 String defaultName = "java:global/sormas-esante-adapter/SurveyExternalMessageAdapterFacadeEjb" ;
916- logger .info ("External Survey Provider JNDI Key not found, using default: [{}]" , defaultName );
955+ logger .debug ("External Survey Provider JNDI Key not found, using default: [{}]" , defaultName );
917956 return defaultName ;
918957 });
919958 try {
@@ -1020,23 +1059,27 @@ public ExternalMessageDto overwriteSurveyResponse(String uuid, PatchDictionary c
10201059 .setAllowFallbackValues (latestRequest .isAllowFallbackValues ())
10211060 .setSkipIfAlreadyProcessed (latestRequest .isSkipIfAlreadyProcessed ())
10221061 .setPatchedInCaseOfFailures (latestRequest .isPatchedInCaseOfFailures ())
1023- .setPatchDictionary (correctedDictionary );
1062+ .setPatchDictionary (correctedDictionary )
1063+ .setExcludedPatchDictionary (latestRequest .getExcludedPatchDictionary ());
10241064
10251065 logger .debug ("Request after transformation: [{}]" , correctedRequest );
10261066
10271067 ExternalMessageSurveyResponseWrapper updatedWrapper = new ExternalMessageSurveyResponseWrapper ().setRequest (correctedRequest );
10281068 externalMessage .getSurveyResponseData ().setUpdated (updatedWrapper );
10291069
1070+ ExternalMessageDto result ;
10301071 try {
1031- automaticSurveyResponseProcessor .processSurveyResponses (java . util . List .of (externalMessage ));
1072+ automaticSurveyResponseProcessor .processSurveyResponses (List .of (externalMessage ));
10321073 } catch (InterruptedException e ) {
10331074 Thread .currentThread ().interrupt ();
10341075 throw new RuntimeException ("Interrupted while reprocessing survey response" , e );
10351076 } catch (java .util .concurrent .ExecutionException e ) {
10361077 throw new RuntimeException ("Error while reprocessing survey response" , e );
1078+ } finally {
1079+ result = save (externalMessage );
10371080 }
10381081
1039- return save ( externalMessage ) ;
1082+ return result ;
10401083 }
10411084
10421085 @ Override
0 commit comments