Skip to content

Commit 5fc7e4f

Browse files
committed
Treat 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 5fc7e4f

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

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

+9-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
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.Window;
3132
import org.springframework.data.repository.CrudRepository;
3233
import org.springframework.data.repository.core.RepositoryInformation;
3334
import org.springframework.data.util.AnnotationDetectionMethodCallback;
@@ -47,6 +48,7 @@
4748
* @author Christoph Strobl
4849
* @author Yuki Yoshida
4950
* @author Réda Housni Alaoui
51+
* @author Yanming Zhou
5052
* @since 1.13
5153
* @soundtrack Henrik Freischlader Trio - Master Plan (Openness)
5254
*/
@@ -268,15 +270,19 @@ private static Method getClearingMethod(AnnotationDetectionMethodCallback<?> cle
268270
* @param source can be {@literal null}.
269271
* @return
270272
*/
271-
@SuppressWarnings("unchecked")
273+
@SuppressWarnings({"unchecked", "rawtypes"})
272274
private static Collection<Object> asCollection(@Nullable Object source) {
273275

274276
if (source == null) {
275277
return Collections.emptyList();
276278
}
277279

278-
if (Collection.class.isInstance(source)) {
279-
return (Collection<Object>) source;
280+
if (source instanceof Collection collection) {
281+
return collection;
282+
}
283+
284+
if (source instanceof Window window) {
285+
return window.toList();
280286
}
281287

282288
return Collections.singletonList(source);

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

+18
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
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.ScrollPosition;
42+
import org.springframework.data.domain.Window;
4143
import org.springframework.data.repository.CrudRepository;
4244
import org.springframework.data.repository.core.RepositoryInformation;
4345
import org.springframework.data.repository.core.support.EventPublishingRepositoryProxyPostProcessor.EventPublishingMethod;
@@ -50,6 +52,7 @@
5052
* @author Mark Paluch
5153
* @author Yuki Yoshida
5254
* @author Réda Housni Alaoui
55+
* @author Yanming Zhou
5356
* @soundtrack Henrik Freischlader Trio - Nobody Else To Blame (Openness)
5457
*/
5558
@ExtendWith(MockitoExtension.class)
@@ -199,6 +202,21 @@ void publishesEventsForCallToSaveWithIterable() throws Throwable {
199202
verify(publisher).publishEvent(any(SomeEvent.class));
200203
}
201204

205+
@Test
206+
void publishesEventsForCallToSaveWithIterableAndWindowAsParameter() throws Throwable {
207+
208+
var event = new SomeEvent();
209+
var sample = MultipleEvents.of(Collections.singletonList(event));
210+
Window<MultipleEvents> window = Window.from(List.of(sample), ScrollPosition::offset);
211+
mockInvocation(invocation, SampleRepository.class.getMethod("saveAll", Iterable.class), window);
212+
213+
EventPublishingMethodInterceptor//
214+
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
215+
.invoke(invocation);
216+
217+
verify(publisher).publishEvent(any(SomeEvent.class));
218+
}
219+
202220
@Test // DATACMNS-1663
203221
void publishesEventsForCallToDeleteWithIterable() throws Throwable {
204222

0 commit comments

Comments
 (0)