Compare commits

...

3 Commits

Author SHA1 Message Date
Jake Gillberg def5c45817
Merge 199dccb2c5 into 20d3e6bb25 2024-09-25 14:05:41 +00:00
Jake Gillberg 199dccb2c5 add side-effect link updates to link event 2024-09-16 15:06:19 -05:00
Jake Gillberg b803817e98 add failing test 2024-09-16 14:37:45 -05:00
2 changed files with 56 additions and 0 deletions

View File

@ -188,6 +188,12 @@ public class MdmLinkUpdaterSvcImpl implements IMdmLinkUpdaterSvc {
// pointcut for MDM_POST_UPDATE_LINK // pointcut for MDM_POST_UPDATE_LINK
MdmLinkEvent event = new MdmLinkEvent(); MdmLinkEvent event = new MdmLinkEvent();
event.addMdmLink(myModelConverter.toJson(mdmLink)); event.addMdmLink(myModelConverter.toJson(mdmLink));
// add any link updates from side effects
mdmContext.getMdmLinks().stream().forEach(link -> {
event.addMdmLink(myModelConverter.toJson(link));
});
HookParams hookParams = new HookParams(); HookParams hookParams = new HookParams();
hookParams.add(RequestDetails.class, theParams.getRequestDetails()).add(MdmLinkEvent.class, event); hookParams.add(RequestDetails.class, theParams.getRequestDetails()).add(MdmLinkEvent.class, event);
myInterceptorBroadcaster.callHooks(Pointcut.MDM_POST_UPDATE_LINK, hookParams); myInterceptorBroadcaster.callHooks(Pointcut.MDM_POST_UPDATE_LINK, hookParams);

View File

@ -601,5 +601,55 @@ public class MdmOperationPointcutsIT extends BaseProviderR4Test {
assertFalse(retval.isEmpty()); assertFalse(retval.isEmpty());
} }
@Test
public void updateLink_NoMatch_LinkEvent_allUpdates() {
// When a Link is set to "NO_MATCH", it can cause other link updates.
// If a source record would be left unlinked to any
// golden record, a new link / golden record would be created.
// setup
String inputState = """
GP1, AUTO, MATCH, P1
""";
MDMState<Patient, JpaPid> state = new MDMState<>();
state.setInputState(inputState);
// we won't use for validation, just setup
myMdmLinkHelper.setup(state);
Patient patient = state.getParameter("P1");
Patient originalPatientGolden = state.getParameter("GP1");
AtomicBoolean called = new AtomicBoolean(false);
Object interceptor = new Object() {
@Hook(Pointcut.MDM_POST_UPDATE_LINK)
void onUpdate(RequestDetails theDetails, MdmLinkEvent theEvent) {
called.getAndSet(true);
assertThat(theEvent.getMdmLinks()).hasSize(2);
MdmLinkJson originalLink = theEvent.getMdmLinks().get(0);
MdmLinkJson newLink = theEvent.getMdmLinks().get(1);
String original_target = "Patient/" + originalPatientGolden.getIdPart();
assertThat(originalLink.getGoldenResourceId()).isEqualTo(original_target);
assertThat(newLink.getGoldenResourceId()).isNotEqualTo(original_target);
}
};
myInterceptors.add(interceptor);
myInterceptorService.registerInterceptor(interceptor);
// test
myMdmProvider.updateLink(
new StringType("Patient/" + originalPatientGolden.getIdPart()),
new StringType("Patient/" + patient.getIdPart()),
new StringType("NO_MATCH"),
new ServletRequestDetails()
);
// verify
assertTrue(called.get());
}
} }