Skip to content

Commit

Permalink
DATACMNS-1663 - Support domain events for deletions.
Browse files Browse the repository at this point in the history
Domain events are now also published on calls to CrudRepository.delete(…) and ….deleteAll(…).

Original pull request: #436.
  • Loading branch information
reda-alaoui authored and odrotbohm committed Jul 13, 2020
1 parent 00d77d0 commit 889ae01
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,17 @@
import org.springframework.util.ReflectionUtils;

/**
* {@link RepositoryProxyPostProcessor} to register a {@link MethodInterceptor} to intercept the
* {@link CrudRepository#save(Object)} method and publish events potentially exposed via a method annotated with
* {@link DomainEvents}. If no such method can be detected on the aggregate root, no interceptor is added. Additionally,
* {@link RepositoryProxyPostProcessor} to register a {@link MethodInterceptor} to intercept
* {@link CrudRepository#save(Object)} and {@link CrudRepository#delete(Object)} methods and publish events potentially
* exposed via a method annotated with {@link DomainEvents}. If no such method can be detected on the aggregate root, no
* interceptor is added. Additionally,
* the aggregate root can expose a method annotated with {@link AfterDomainEventPublication}. If present, the method
* will be invoked after all events have been published.
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Yuki Yoshida
* @author Réda Housni Alaoui
* @since 1.13
* @soundtrack Henrik Freischlader Trio - Master Plan (Openness)
*/
Expand Down Expand Up @@ -75,7 +77,7 @@ public void postProcess(ProxyFactory factory, RepositoryInformation repositoryIn
}

/**
* {@link MethodInterceptor} to publish events exposed an aggregate on calls to a save method on the repository.
* {@link MethodInterceptor} to publish events exposed an aggregate on calls to a save or delete method on the repository.
*
* @author Oliver Gierke
* @since 1.13
Expand Down Expand Up @@ -106,12 +108,16 @@ public Object invoke(@SuppressWarnings("null") MethodInvocation invocation) thro
Object[] arguments = invocation.getArguments();
Object result = invocation.proceed();

if (!invocation.getMethod().getName().startsWith("save")) {
String methodName = invocation.getMethod().getName();
Object eventSource;
if (methodName.startsWith("save")) {
eventSource = arguments.length == 1 ? arguments[0] : result;
} else if ((methodName.equals("delete") || methodName.equals("deleteAll")) && arguments.length == 1) {
eventSource = arguments[0];
} else {
return result;
}

Object eventSource = arguments.length == 1 ? arguments[0] : result;

eventMethod.publishEventsFrom(eventSource, publisher);

return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
* @author Oliver Gierke
* @author Mark Paluch
* @author Yuki Yoshida
* @author Réda Housni Alaoui
* @soundtrack Henrik Freischlader Trio - Nobody Else To Blame (Openness)
*/
@ExtendWith(MockitoExtension.class)
Expand Down Expand Up @@ -124,7 +125,20 @@ void interceptsSaveMethod() throws Throwable {

verify(publisher).publishEvent(event);
}

@Test // DATACMNS-1663
public void interceptsDeleteMethod() throws Throwable {
SomeEvent event = new SomeEvent();
MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event));
mockInvocation(invocation, SampleRepository.class.getMethod("delete", Object.class), sample);

EventPublishingMethodInterceptor//
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
.invoke(invocation);

verify(publisher).publishEvent(event);
}

@Test // DATACMNS-928
void doesNotInterceptNonSaveMethod() throws Throwable {

Expand All @@ -137,6 +151,18 @@ void doesNotInterceptNonSaveMethod() throws Throwable {
verify(publisher, never()).publishEvent(any());
}

@Test // DATACMNS-1663
public void doesNotInterceptDeleteByIdMethod() throws Throwable {

doReturn(SampleRepository.class.getMethod("deleteById", Object.class)).when(invocation).getMethod();

EventPublishingMethodInterceptor//
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
.invoke(invocation);

verify(publisher, never()).publishEvent(any());
}

@Test // DATACMNS-928
void registersAdviceIfDomainTypeExposesEvents() {

Expand Down Expand Up @@ -177,6 +203,20 @@ void publishesEventsForCallToSaveWithIterable() throws Throwable {
verify(publisher).publishEvent(any(SomeEvent.class));
}

@Test // DATACMNS-1663
public void publishesEventsForCallToDeleteWithIterable() throws Throwable {

SomeEvent event = new SomeEvent();
MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event));
mockInvocation(invocation, SampleRepository.class.getMethod("deleteAll", Iterable.class), sample);

EventPublishingMethodInterceptor//
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
.invoke(invocation);

verify(publisher).publishEvent(any(SomeEvent.class));
}

@Test // DATACMNS-975
void publishesEventsAfterSaveInvocation() throws Throwable {

Expand Down

0 comments on commit 889ae01

Please sign in to comment.