Created
February 9, 2013 04:46
-
-
Save raniejade/7c059dea7a9c76cc1f6b to your computer and use it in GitHub Desktop.
DATAJPA-265 - Make it possible to configure auditing with Java Config
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.springframework.data.auditing.config; | |
public interface AnnotationAuditingConfiguration { | |
String getAuditorAwareRef(); | |
boolean isSetDates(); | |
String getDateTimeProviderRef(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ""; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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