diff --git a/src/main/java/org/springframework/data/jdbc/core/JdbcEntityTemplate.java b/src/main/java/org/springframework/data/jdbc/core/JdbcEntityTemplate.java index 7a3c1d8a..b58958cc 100644 --- a/src/main/java/org/springframework/data/jdbc/core/JdbcEntityTemplate.java +++ b/src/main/java/org/springframework/data/jdbc/core/JdbcEntityTemplate.java @@ -23,8 +23,8 @@ import org.springframework.data.jdbc.core.conversion.AggregateChange.Kind; import org.springframework.data.jdbc.core.conversion.Interpreter; import org.springframework.data.jdbc.core.conversion.JdbcEntityDeleteWriter; import org.springframework.data.jdbc.core.conversion.JdbcEntityWriter; -import org.springframework.data.jdbc.mapping.event.AfterCreation; import org.springframework.data.jdbc.mapping.event.AfterDelete; +import org.springframework.data.jdbc.mapping.event.AfterLoadEvent; import org.springframework.data.jdbc.mapping.event.AfterSave; import org.springframework.data.jdbc.mapping.event.BeforeDelete; import org.springframework.data.jdbc.mapping.event.BeforeSave; @@ -37,6 +37,7 @@ import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntityInformati * {@link JdbcEntityOperations} implementation, storing aggregates in and obtaining them from a JDBC data store. * * @author Jens Schauder + * @author Mark Paluch */ public class JdbcEntityTemplate implements JdbcEntityOperations { @@ -94,7 +95,7 @@ public class JdbcEntityTemplate implements JdbcEntityOperations { T entity = accessStrategy.findById(id, domainType); if (entity != null) { - publishAfterCreation(id, entity); + publishAfterLoad(id, entity); } return entity; } @@ -108,7 +109,7 @@ public class JdbcEntityTemplate implements JdbcEntityOperations { public Iterable findAll(Class domainType) { Iterable all = accessStrategy.findAll(domainType); - publishAfterCreation(all); + publishAfterLoad(all); return all; } @@ -116,7 +117,7 @@ public class JdbcEntityTemplate implements JdbcEntityOperations { public Iterable findAllById(Iterable ids, Class domainType) { Iterable allById = accessStrategy.findAllById(ids, domainType); - publishAfterCreation(allById); + publishAfterLoad(allById); return allById; } @@ -153,35 +154,38 @@ public class JdbcEntityTemplate implements JdbcEntityOperations { publisher.publishEvent(new AfterDelete(specifiedId, optionalEntity, change)); } + @SuppressWarnings("unchecked") private AggregateChange createChange(T instance) { - AggregateChange aggregateChange = new AggregateChange(Kind.SAVE, instance.getClass(), instance); + AggregateChange aggregateChange = new AggregateChange(Kind.SAVE, instance.getClass(), instance); jdbcEntityWriter.write(instance, aggregateChange); return aggregateChange; } + @SuppressWarnings("unchecked") private AggregateChange createDeletingChange(Object id, Object entity, Class domainType) { - AggregateChange aggregateChange = new AggregateChange(Kind.DELETE, domainType, entity); + AggregateChange aggregateChange = new AggregateChange(Kind.DELETE, domainType, entity); jdbcEntityDeleteWriter.write(id, aggregateChange); return aggregateChange; } private AggregateChange createDeletingChange(Class domainType) { - AggregateChange aggregateChange = new AggregateChange(Kind.DELETE, domainType, null); + AggregateChange aggregateChange = new AggregateChange<>(Kind.DELETE, domainType, null); jdbcEntityDeleteWriter.write(null, aggregateChange); return aggregateChange; } - private void publishAfterCreation(Iterable all) { + @SuppressWarnings("unchecked") + private void publishAfterLoad(Iterable all) { - all.forEach(e -> { - publishAfterCreation(context.getRequiredPersistentEntityInformation((Class) e.getClass()).getRequiredId(e), e); - }); + for (T e : all) { + publishAfterLoad(context.getRequiredPersistentEntityInformation((Class) e.getClass()).getRequiredId(e), e); + } } - private void publishAfterCreation(Object id, T entity) { - publisher.publishEvent(new AfterCreation(Identifier.of(id), entity)); + private void publishAfterLoad(Object id, T entity) { + publisher.publishEvent(new AfterLoadEvent(Identifier.of(id), entity)); } } diff --git a/src/main/java/org/springframework/data/jdbc/mapping/event/AfterCreation.java b/src/main/java/org/springframework/data/jdbc/mapping/event/AfterLoadEvent.java similarity index 89% rename from src/main/java/org/springframework/data/jdbc/mapping/event/AfterCreation.java rename to src/main/java/org/springframework/data/jdbc/mapping/event/AfterLoadEvent.java index a8e6a6f1..22ae1c21 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/event/AfterCreation.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/event/AfterLoadEvent.java @@ -22,9 +22,8 @@ import org.springframework.data.jdbc.mapping.event.Identifier.Specified; * postprocessing of entities. * * @author Jens Schauder - * @since 2.0 */ -public class AfterCreation extends JdbcEventWithIdAndEntity { +public class AfterLoadEvent extends JdbcEventWithIdAndEntity { private static final long serialVersionUID = -4185777271143436728L; @@ -32,7 +31,7 @@ public class AfterCreation extends JdbcEventWithIdAndEntity { * @param id of the entity * @param entity the newly instantiated entity. */ - public AfterCreation(Specified id, Object entity) { + public AfterLoadEvent(Specified id, Object entity) { super(id, entity, null); } } diff --git a/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java b/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java index 306722fe..6eed8c56 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java +++ b/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java @@ -4,10 +4,12 @@ import static java.util.Arrays.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; import junit.framework.AssertionFailedError; -import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.Value; import java.util.ArrayList; import java.util.HashMap; @@ -21,8 +23,8 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.annotation.Id; import org.springframework.data.jdbc.core.DefaultDataAccessStrategy; import org.springframework.data.jdbc.core.SqlGeneratorSource; -import org.springframework.data.jdbc.mapping.event.AfterCreation; import org.springframework.data.jdbc.mapping.event.AfterDelete; +import org.springframework.data.jdbc.mapping.event.AfterLoadEvent; import org.springframework.data.jdbc.mapping.event.AfterSave; import org.springframework.data.jdbc.mapping.event.BeforeDelete; import org.springframework.data.jdbc.mapping.event.BeforeSave; @@ -36,11 +38,14 @@ import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.support.KeyHolder; /** + * Unit tests for application events via {@link SimpleJdbcRepository}. + * * @author Jens Schauder + * @author Mark Paluch */ public class SimpleJdbcRepositoryEventsUnitTests { - FakePublisher publisher = new FakePublisher(); + CollectingEventPublisher publisher = new CollectingEventPublisher(); DummyEntityRepository repository; DefaultDataAccessStrategy dataAccessStrategy; @@ -48,7 +53,7 @@ public class SimpleJdbcRepositoryEventsUnitTests { @Before public void before() { - final JdbcMappingContext context = new JdbcMappingContext(createIdGeneratingOperations()); + JdbcMappingContext context = new JdbcMappingContext(createIdGeneratingOperations()); dataAccessStrategy = spy(new DefaultDataAccessStrategy( // new SqlGeneratorSource(context), // @@ -105,7 +110,7 @@ public class SimpleJdbcRepositoryEventsUnitTests { repository.delete(entity); assertThat(publisher.events).extracting( // - e -> (Class) e.getClass(), // + JdbcEvent::getClass, // e -> e.getOptionalEntity().orElseGet(AssertionFailedError::new), // JdbcEvent::getId // ).containsExactly( // @@ -140,8 +145,8 @@ public class SimpleJdbcRepositoryEventsUnitTests { assertThat(publisher.events) // .extracting(e -> (Class) e.getClass()) // .containsExactly( // - AfterCreation.class, // - AfterCreation.class // + AfterLoadEvent.class, // + AfterLoadEvent.class // ); } @@ -158,8 +163,8 @@ public class SimpleJdbcRepositoryEventsUnitTests { assertThat(publisher.events) // .extracting(e -> (Class) e.getClass()) // .containsExactly( // - AfterCreation.class, // - AfterCreation.class // + AfterLoadEvent.class, // + AfterLoadEvent.class // ); } @@ -174,7 +179,7 @@ public class SimpleJdbcRepositoryEventsUnitTests { assertThat(publisher.events) // .extracting(e -> (Class) e.getClass()) // .containsExactly( // - AfterCreation.class // + AfterLoadEvent.class // ); } @@ -198,12 +203,13 @@ public class SimpleJdbcRepositoryEventsUnitTests { interface DummyEntityRepository extends CrudRepository {} - @Data + @Value + @RequiredArgsConstructor static class DummyEntity { - private final @Id Long id; + @Id Long id; } - static class FakePublisher implements ApplicationEventPublisher { + static class CollectingEventPublisher implements ApplicationEventPublisher { List events = new ArrayList<>();