Browse Source

DATAJDBC-216 - Polishing.

Simplified code by using constructor injection plus Lombok.
Removed superfluous handling of BeforeSave events with null entity.

Original pull request: #71.
pull/72/head
Jens Schauder 8 years ago
parent
commit
fe98964d72
  1. 61
      src/main/java/org/springframework/data/jdbc/domain/support/JdbcAuditingEventListener.java
  2. 18
      src/main/java/org/springframework/data/jdbc/repository/config/JdbcAuditingRegistrar.java
  3. 1
      src/test/java/org/springframework/data/jdbc/repository/config/EnableJdbcAuditingHsqlIntegrationTests.java

61
src/main/java/org/springframework/data/jdbc/domain/support/JdbcAuditingEventListener.java

@ -15,15 +15,14 @@
*/ */
package org.springframework.data.jdbc.domain.support; package org.springframework.data.jdbc.domain.support;
import org.springframework.beans.factory.ObjectFactory; import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.data.auditing.AuditingHandler; import org.springframework.data.auditing.AuditingHandler;
import org.springframework.data.jdbc.mapping.event.BeforeSaveEvent; import org.springframework.data.jdbc.mapping.event.BeforeSaveEvent;
import org.springframework.data.jdbc.mapping.model.JdbcMappingContext; import org.springframework.data.jdbc.mapping.model.JdbcMappingContext;
import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntityInformation; import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntityInformation;
import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing; import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/** /**
* Spring JDBC event listener to capture auditing information on persisting and updating entities. * Spring JDBC event listener to capture auditing information on persisting and updating entities.
@ -31,36 +30,15 @@ import org.springframework.util.Assert;
* An instance of this class gets registered when you apply {@link EnableJdbcAuditing} to your Spring config. * An instance of this class gets registered when you apply {@link EnableJdbcAuditing} to your Spring config.
* *
* @author Kazuki Shimizu * @author Kazuki Shimizu
* @author Jens Schauder
* @see EnableJdbcAuditing * @see EnableJdbcAuditing
* @since 1.0 * @since 1.0
*/ */
@RequiredArgsConstructor
public class JdbcAuditingEventListener implements ApplicationListener<BeforeSaveEvent> { public class JdbcAuditingEventListener implements ApplicationListener<BeforeSaveEvent> {
@Nullable private AuditingHandler handler; private final AuditingHandler handler;
private JdbcMappingContext context; private final JdbcMappingContext context;
/**
* Configures the {@link AuditingHandler} to be used to set the current auditor on the domain types touched.
*
* @param auditingHandler must not be {@literal null}.
*/
public void setAuditingHandler(ObjectFactory<AuditingHandler> auditingHandler) {
Assert.notNull(auditingHandler, "AuditingHandler must not be null!");
this.handler = auditingHandler.getObject();
}
/**
* Configures a {@link JdbcMappingContext} that use for judging whether new object or not.
* @param context must not be {@literal null}
*/
public void setJdbcMappingContext(JdbcMappingContext context) {
Assert.notNull(context, "JdbcMappingContext must not be null!");
this.context = context;
}
/** /**
* {@inheritDoc} * {@inheritDoc}
@ -70,19 +48,22 @@ public class JdbcAuditingEventListener implements ApplicationListener<BeforeSave
@Override @Override
public void onApplicationEvent(BeforeSaveEvent event) { public void onApplicationEvent(BeforeSaveEvent event) {
if (handler != null) { Object entity = event.getEntity();
@SuppressWarnings("unchecked")
Class<Object> entityType = event.getChange().getEntityType();
JdbcPersistentEntityInformation<Object, ?> entityInformation = context
.getRequiredPersistentEntityInformation(entityType);
invokeHandler(entity, entityInformation);
}
private <T> void invokeHandler(T entity, JdbcPersistentEntityInformation<T, ?> entityInformation) {
event.getOptionalEntity().ifPresent(entity -> { if (entityInformation.isNew(entity)) {
@SuppressWarnings("unchecked") handler.markCreated(entity);
Class<Object> entityType = event.getChange().getEntityType(); } else {
JdbcPersistentEntityInformation<Object, ?> entityInformation = handler.markModified(entity);
context.getRequiredPersistentEntityInformation(entityType);
if (entityInformation.isNew(entity)) {
handler.markCreated(entity);
} else {
handler.markModified(entity);
}
});
} }
} }
} }

18
src/main/java/org/springframework/data/jdbc/repository/config/JdbcAuditingRegistrar.java

@ -17,14 +17,12 @@ package org.springframework.data.jdbc.repository.config;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport; import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
import org.springframework.data.auditing.config.AuditingConfiguration; import org.springframework.data.auditing.config.AuditingConfiguration;
import org.springframework.data.config.ParsingUtils;
import org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener; import org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener;
/** /**
@ -33,10 +31,14 @@ import org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener;
* *
* @see EnableJdbcAuditing * @see EnableJdbcAuditing
* @author Kazuki Shimizu * @author Kazuki Shimizu
* @author Jens Schauder
* @since 1.0 * @since 1.0
*/ */
class JdbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport { class JdbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
private static final String AUDITING_HANDLER_BEAN_NAME = "jdbcAuditingHandler";
private static final String JDBC_MAPPING_CONTEXT_BEAN_NAME = "jdbcMappingContext";
/** /**
* {@inheritDoc} * {@inheritDoc}
* *
@ -56,7 +58,7 @@ class JdbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
*/ */
@Override @Override
protected String getAuditingHandlerBeanName() { protected String getAuditingHandlerBeanName() {
return "jdbcAuditingHandler"; return AUDITING_HANDLER_BEAN_NAME;
} }
/* /*
@ -67,7 +69,7 @@ class JdbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) { protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingConfiguration configuration) {
BeanDefinitionBuilder builder = super.getAuditHandlerBeanDefinitionBuilder(configuration); BeanDefinitionBuilder builder = super.getAuditHandlerBeanDefinitionBuilder(configuration);
return builder.addConstructorArgReference("jdbcMappingContext"); return builder.addConstructorArgReference(JDBC_MAPPING_CONTEXT_BEAN_NAME);
} }
/** /**
@ -81,10 +83,10 @@ class JdbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
BeanDefinitionRegistry registry) { BeanDefinitionRegistry registry) {
Class<?> listenerClass = JdbcAuditingEventListener.class; Class<?> listenerClass = JdbcAuditingEventListener.class;
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(listenerClass); BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(listenerClass) //
builder.addPropertyValue("auditingHandler", .addConstructorArgReference(AUDITING_HANDLER_BEAN_NAME) //
ParsingUtils.getObjectFactoryBeanDefinition(getAuditingHandlerBeanName(), null)); .addConstructorArgReference(JDBC_MAPPING_CONTEXT_BEAN_NAME);
builder.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE);
registerInfrastructureBeanWithId(builder.getRawBeanDefinition(), listenerClass.getName(), registry); registerInfrastructureBeanWithId(builder.getRawBeanDefinition(), listenerClass.getName(), registry);
} }

1
src/test/java/org/springframework/data/jdbc/repository/config/EnableJdbcAuditingHsqlIntegrationTests.java

@ -183,7 +183,6 @@ public class EnableJdbcAuditingHsqlIntegrationTests {
}; };
} }
private void sleepMillis(int timeout) { private void sleepMillis(int timeout) {
try { try {

Loading…
Cancel
Save