Skip to content

Instantly share code, notes, and snippets.

@raniejade
Created February 9, 2013 04:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raniejade/7c059dea7a9c76cc1f6b to your computer and use it in GitHub Desktop.
Save raniejade/7c059dea7a9c76cc1f6b to your computer and use it in GitHub Desktop.
DATAJPA-265 - Make it possible to configure auditing with Java Config
package org.springframework.data.auditing.config;
public interface AnnotationAuditingConfiguration {
String getAuditorAwareRef();
boolean isSetDates();
String getDateTimeProviderRef();
}
package org.springframework.data.auditing.config;
import java.lang.annotation.Annotation;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
public class AnnotationAuditingConfigurationSupport implements AnnotationAuditingConfiguration {
protected AnnotationAttributes attributes;
public AnnotationAuditingConfigurationSupport(AnnotationMetadata metadata, Class<? extends Annotation> annotation) {
attributes = new AnnotationAttributes(metadata.getAnnotationAttributes(annotation.getName()));
}
public String getAuditorAwareRef() {
return attributes.getString("auditorAwareRef");
}
public boolean isSetDates() {
return attributes.getBoolean("setDates");
}
public String getDateTimeProviderRef() {
return attributes.getString("dateTimeProviderRef");
}
}
package org.springframework.data.auditing.config;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.auditing.AuditingHandler;
import org.springframework.data.auditing.CurrentDateTimeProvider;
import org.springframework.util.StringUtils;
public abstract class AuditingBeanDefinitionRegistrarSupport implements ImportBeanDefinitionRegistrar {
private final String AUDITOR_AWARE = "auditorAware";
private final String DATE_TIME_PROVIDER = "dateTimeProvider";
private final String SET_DATES = "dateForNow";
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(AuditingHandler.class);
AnnotationAuditingConfiguration configuration = getConfiguration(annotationMetadata);
builder.addPropertyReference(AUDITOR_AWARE, configuration.getAuditorAwareRef());
builder.addPropertyValue(SET_DATES, configuration.isSetDates());
if (StringUtils.hasText(configuration.getDateTimeProviderRef())) {
builder.addPropertyReference(DATE_TIME_PROVIDER, configuration.getDateTimeProviderRef());
} else {
builder.addPropertyValue(DATE_TIME_PROVIDER, CurrentDateTimeProvider.INSTANCE);
}
BeanDefinition auditingHandlerDefinition = builder.getBeanDefinition();
registry.registerBeanDefinition(BeanDefinitionReaderUtils.generateBeanName(auditingHandlerDefinition, registry),
auditingHandlerDefinition);
postProcess(configuration, auditingHandlerDefinition, registry);
}
protected abstract void postProcess(AnnotationAuditingConfiguration configuration,
BeanDefinition auditingHandlerDefinition,
BeanDefinitionRegistry registry);
protected abstract AnnotationAuditingConfiguration getConfiguration(AnnotationMetadata annotationMetadata);
}
package org.springframework.data.jpa.auditing;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
@Documented
@Inherited
@Import(JpaAuditingRegistrar.class)
public @interface EnableJpaAuditing {
String auditorAwareRef() default "";
boolean setDates() default true;
String dateTimeProviderRef() default "";
}
package org.springframework.data.jpa.auditing;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.auditing.config.AnnotationAuditingConfiguration;
import org.springframework.data.auditing.config.AnnotationAuditingConfigurationSupport;
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
public class JpaAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
private static final String AUDITING_ENTITY_LISTENER_CLASS_NAME = "org.springframework.data.jpa.domain.support.AuditingEntityListener";
private static final String AUDITING_BFPP_CLASS_NAME = "org.springframework.data.jpa.domain.support.AuditingBeanFactoryPostProcessor";
@Override
protected AnnotationAuditingConfiguration getConfiguration(AnnotationMetadata annotationMetadata) {
return new AnnotationAuditingConfigurationSupport(annotationMetadata, EnableJpaAuditing.class);
}
@Override
protected void postProcess(AnnotationAuditingConfiguration configuration, BeanDefinition auditingHandlerDefinition, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(AUDITING_ENTITY_LISTENER_CLASS_NAME);
builder.addPropertyValue("auditingHandler", auditingHandlerDefinition);
builder.setScope("prototype");
registerInfrastructureBeans(builder.getBeanDefinition(), AUDITING_ENTITY_LISTENER_CLASS_NAME, registry);
RootBeanDefinition def = new RootBeanDefinition(AUDITING_BFPP_CLASS_NAME);
registerInfrastructureBeans(def, AUDITING_BFPP_CLASS_NAME, registry);
}
private void registerInfrastructureBeans(AbstractBeanDefinition definition, String id, BeanDefinitionRegistry registry) {
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(id, definition);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment