Skip to content

Commit f08ef22

Browse files
committed
Treat Page and Window as Collection for event publishing
repository.saveAll(Window<?>) will be handled properly after this commit. Fixes https://github.com/spring-projects/spring-data-jpa/issues/3153
1 parent e901923 commit f08ef22

File tree

2 files changed

+51
-3
lines changed

2 files changed

+51
-3
lines changed

Diff for: src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.springframework.context.ApplicationEventPublisher;
2929
import org.springframework.data.domain.AfterDomainEventPublication;
3030
import org.springframework.data.domain.DomainEvents;
31+
import org.springframework.data.domain.Page;
32+
import org.springframework.data.domain.Window;
3133
import org.springframework.data.repository.CrudRepository;
3234
import org.springframework.data.repository.core.RepositoryInformation;
3335
import org.springframework.data.util.AnnotationDetectionMethodCallback;
@@ -47,6 +49,7 @@
4749
* @author Christoph Strobl
4850
* @author Yuki Yoshida
4951
* @author Réda Housni Alaoui
52+
* @author Yanming Zhou
5053
* @since 1.13
5154
* @soundtrack Henrik Freischlader Trio - Master Plan (Openness)
5255
*/
@@ -268,15 +271,23 @@ private static Method getClearingMethod(AnnotationDetectionMethodCallback<?> cle
268271
* @param source can be {@literal null}.
269272
* @return
270273
*/
271-
@SuppressWarnings("unchecked")
274+
@SuppressWarnings({"unchecked", "rawtypes"})
272275
private static Collection<Object> asCollection(@Nullable Object source) {
273276

274277
if (source == null) {
275278
return Collections.emptyList();
276279
}
277280

278-
if (Collection.class.isInstance(source)) {
279-
return (Collection<Object>) source;
281+
if (source instanceof Collection collection) {
282+
return collection;
283+
}
284+
285+
if (source instanceof Window window) {
286+
return window.toList();
287+
}
288+
289+
if (source instanceof Page page) {
290+
return page.toList();
280291
}
281292

282293
return Collections.singletonList(source);

Diff for: src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java

+37
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@
3838
import org.springframework.context.ApplicationEventPublisher;
3939
import org.springframework.data.domain.AfterDomainEventPublication;
4040
import org.springframework.data.domain.DomainEvents;
41+
import org.springframework.data.domain.Page;
42+
import org.springframework.data.domain.PageImpl;
43+
import org.springframework.data.domain.PageRequest;
44+
import org.springframework.data.domain.Pageable;
45+
import org.springframework.data.domain.ScrollPosition;
46+
import org.springframework.data.domain.Window;
4147
import org.springframework.data.repository.CrudRepository;
4248
import org.springframework.data.repository.core.RepositoryInformation;
4349
import org.springframework.data.repository.core.support.EventPublishingRepositoryProxyPostProcessor.EventPublishingMethod;
@@ -50,6 +56,7 @@
5056
* @author Mark Paluch
5157
* @author Yuki Yoshida
5258
* @author Réda Housni Alaoui
59+
* @author Yanming Zhou
5360
* @soundtrack Henrik Freischlader Trio - Nobody Else To Blame (Openness)
5461
*/
5562
@ExtendWith(MockitoExtension.class)
@@ -199,6 +206,36 @@ void publishesEventsForCallToSaveWithIterable() throws Throwable {
199206
verify(publisher).publishEvent(any(SomeEvent.class));
200207
}
201208

209+
@Test
210+
void publishesEventsForCallToSaveWithIterableAndWindowAsParameter() throws Throwable {
211+
212+
var event = new SomeEvent();
213+
var sample = MultipleEvents.of(Collections.singletonList(event));
214+
Window<MultipleEvents> window = Window.from(List.of(sample), ScrollPosition::offset);
215+
mockInvocation(invocation, SampleRepository.class.getMethod("saveAll", Iterable.class), window);
216+
217+
EventPublishingMethodInterceptor//
218+
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
219+
.invoke(invocation);
220+
221+
verify(publisher).publishEvent(any(SomeEvent.class));
222+
}
223+
224+
@Test
225+
void publishesEventsForCallToSaveWithIterableAndPageAsParameter() throws Throwable {
226+
227+
var event = new SomeEvent();
228+
var sample = MultipleEvents.of(Collections.singletonList(event));
229+
Page<MultipleEvents> page = new PageImpl<>(List.of(sample), Pageable.ofSize(10), 1);
230+
mockInvocation(invocation, SampleRepository.class.getMethod("saveAll", Iterable.class), page);
231+
232+
EventPublishingMethodInterceptor//
233+
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
234+
.invoke(invocation);
235+
236+
verify(publisher).publishEvent(any(SomeEvent.class));
237+
}
238+
202239
@Test // DATACMNS-1663
203240
void publishesEventsForCallToDeleteWithIterable() throws Throwable {
204241

0 commit comments

Comments
 (0)