diff --git a/api/src/main/java/org/openmrs/module/patientflags/api/impl/FlagServiceImpl.java b/api/src/main/java/org/openmrs/module/patientflags/api/impl/FlagServiceImpl.java index 743df347..45131877 100755 --- a/api/src/main/java/org/openmrs/module/patientflags/api/impl/FlagServiceImpl.java +++ b/api/src/main/java/org/openmrs/module/patientflags/api/impl/FlagServiceImpl.java @@ -95,24 +95,27 @@ public List generateFlagsForPatient(Patient patient, Map c /** * @see org.openmrs.module.patientflags.api.FlagService#generateFlagsForPatient(Patient, Filter, Map) */ - public List generateFlagsForPatient(Patient patient, Filter filter, Map context) { - List results = new ArrayList(); - + public List generateFlagsForPatient(final Patient patient, Filter filter, final Map context) { + final List results = Collections.synchronizedList(new ArrayList<>()); + // we can get rid of this once onStartup is implemented if (!isInitialized) refreshCache(); - + // test each Flag in the cache against the specific Patient - for (Flag flag : filter.filter(flagCache)) { - // trap bad flags so that they don't hang the system + filter.filter(flagCache).parallelStream().forEach(flag -> { try { - if (flag.eval(patient, context)) + Context.openSession(); + if (flag.eval(patient, context)) { results.add(flag); - } - catch (Exception e) { + } + } catch (Exception e) { log.error("Unable to test flag " + flag.getName() + " on patient #" + patient.getId(), e); + } finally { + Context.closeSession(); } - } + }); + return results; }