diff --git a/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java b/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java index ea6486cc8..01a2fda29 100644 --- a/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java +++ b/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java @@ -95,9 +95,7 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr return result; } - for (Object argument : invocation.getArguments()) { - eventMethod.publishEventsFrom(argument, publisher); - } + eventMethod.publishEventsFrom(result, publisher); return result; } @@ -166,12 +164,12 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr } for (Object aggregateRoot : asCollection(object)) { - Collection events = asCollection(ReflectionUtils.invokeMethod(publishingMethod, aggregateRoot)); - for (Object event : events) { + + for (Object event : asCollection(ReflectionUtils.invokeMethod(publishingMethod, aggregateRoot))) { publisher.publishEvent(event); } - if (clearingMethod != null && !events.isEmpty()) { + if (clearingMethod != null) { ReflectionUtils.invokeMethod(clearingMethod, aggregateRoot); } } diff --git a/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java index 1fa71e2b9..f3e5350ba 100644 --- a/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java @@ -105,40 +105,6 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { verify(publisher, times(0)).publishEvent(any()); } - @Test // DATACMNS-1067 - public void clearEventsDoesNotExposedByEntity() { - - EventsWithClearing entity = spy(EventsWithClearing.of(Collections.emptyList())); - - EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher); - - verify(entity, times(0)).clearDomainEvents(); - } - - @Test // DATACMNS-1067 - public void clearEventsExposedByEntity() { - - EventsWithClearing entity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent()))); - - EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher); - - verify(entity, times(1)).clearDomainEvents(); - } - - @Test // DATACMNS-1067 - public void clearEventsExposedByEntities() { - - EventsWithClearing firstEntity = spy(EventsWithClearing.of(Collections.emptyList())); - EventsWithClearing secondEntity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent()))); - - Collection entities = Arrays.asList(firstEntity, secondEntity); - - EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entities, publisher); - - verify(firstEntity, times(0)).clearDomainEvents(); - verify(secondEntity, times(1)).clearDomainEvents(); - } - @Test // DATACMNS-928 public void doesNotCreatePublishingMethodIfNoAnnotationDetected() { assertThat(EventPublishingMethod.of(Object.class), is(nullValue())); @@ -147,11 +113,9 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { @Test // DATACMNS-928 public void interceptsSaveMethod() throws Throwable { - doReturn(SampleRepository.class.getMethod("save", Object.class)).when(invocation).getMethod(); - SomeEvent event = new SomeEvent(); - MultipleEvents sample = MultipleEvents.of(Arrays.asList(event)); - doReturn(new Object[] { sample }).when(invocation).getArguments(); + MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event)); + mockInvocation(invocation, SampleRepository.class.getMethod("save", Object.class), sample); EventPublishingMethodInterceptor// .of(EventPublishingMethod.of(MultipleEvents.class), publisher)// @@ -202,10 +166,8 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { public void publishesEventsForCallToSaveWithIterable() throws Throwable { SomeEvent event = new SomeEvent(); - MultipleEvents sample = MultipleEvents.of(Arrays.asList(event)); - doReturn(new Object[] { Arrays.asList(sample) }).when(invocation).getArguments(); - - doReturn(SampleRepository.class.getMethod("save", Iterable.class)).when(invocation).getMethod(); + MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event)); + mockInvocation(invocation, SampleRepository.class.getMethod("save", Iterable.class), sample); EventPublishingMethodInterceptor// .of(EventPublishingMethod.of(MultipleEvents.class), publisher)// @@ -234,12 +196,9 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { @Test // DATACMNS-1113 public void invokesEventsForMethodsThatStartsWithSave() throws Throwable { - Method method = SampleRepository.class.getMethod("saveAndFlush", MultipleEvents.class); - doReturn(method).when(invocation).getMethod(); - SomeEvent event = new SomeEvent(); MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event)); - doReturn(new Object[] { sample }).when(invocation).getArguments(); + mockInvocation(invocation, SampleRepository.class.getMethod("saveAndFlush", MultipleEvents.class), sample); EventPublishingMethodInterceptor// .of(EventPublishingMethod.of(MultipleEvents.class), publisher)// @@ -248,6 +207,48 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { verify(publisher).publishEvent(event); } + @Test // DATACMNS-1067 + public void clearsEventsEvenIfNoneWereExposedToPublish() { + + EventsWithClearing entity = spy(EventsWithClearing.of(Collections.emptyList())); + + EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher); + + verify(entity, times(1)).clearDomainEvents(); + } + + @Test // DATACMNS-1067 + public void clearsEventsIfThereWereSomeToBePublished() { + + EventsWithClearing entity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent()))); + + EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entity, publisher); + + verify(entity, times(1)).clearDomainEvents(); + } + + @Test // DATACMNS-1067 + public void clearsEventsForOperationOnMutlipleAggregates() { + + EventsWithClearing firstEntity = spy(EventsWithClearing.of(Collections.emptyList())); + EventsWithClearing secondEntity = spy(EventsWithClearing.of(Collections.singletonList(new SomeEvent()))); + + Collection entities = Arrays.asList(firstEntity, secondEntity); + + EventPublishingMethod.of(EventsWithClearing.class).publishEventsFrom(entities, publisher); + + verify(firstEntity, times(1)).clearDomainEvents(); + verify(secondEntity, times(1)).clearDomainEvents(); + } + + private static void mockInvocation(MethodInvocation invocation, Method method, Object parameterAndReturnValue) + throws Throwable { + + doReturn(method).when(invocation).getMethod(); + doReturn(new Object[] { parameterAndReturnValue }).when(invocation).getArguments(); + doReturn(parameterAndReturnValue).when(invocation).proceed(); + } + @Value(staticConstructor = "of") static class MultipleEvents { @Getter(onMethod = @__(@DomainEvents)) Collection events;