From 70639d0d4b8909e418a8868a3d4627f0d72089ae Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 26 Nov 2012 17:36:39 +0100 Subject: [PATCH] DATACMNS-137 - Added configuration support for AuditingHandlers. Added attribute group to namespace XSD to define common attributes used to set up an AuditingHandler. Added BeanDefinitionParser that will create a BeanDefinition for an AuditingHandler based on these properties. Store-specific namespace implementations can use that to simplify the configuration setup. Added an IsNewAwareAuditingHandlerBeanDefinitionParser to do the same for an IsNewAwareAuditingHandler. --- .../data/auditing/AuditingHandler.java | 2 +- .../AuditingHandlerBeanDefinitionParser.java | 85 +++++++++++++++++++ ...reAuditingHandlerBeanDefinitionParser.java | 64 ++++++++++++++ .../config/spring-repository-1.5.xsd | 38 ++++++++- 4 files changed, 186 insertions(+), 3 deletions(-) create mode 100644 spring-data-commons-core/src/main/java/org/springframework/data/config/AuditingHandlerBeanDefinitionParser.java create mode 100644 spring-data-commons-core/src/main/java/org/springframework/data/config/IsNewAwareAuditingHandlerBeanDefinitionParser.java diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/auditing/AuditingHandler.java b/spring-data-commons-core/src/main/java/org/springframework/data/auditing/AuditingHandler.java index e91ba9bc3..33ec5c8ce 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/auditing/AuditingHandler.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/auditing/AuditingHandler.java @@ -67,7 +67,7 @@ public class AuditingHandler implements InitializingBean { * * @param modifyOnCreation if modification information shall be set on creation, too */ - public void setModifyOnCreation(final boolean modifyOnCreation) { + public void setModifyOnCreation(boolean modifyOnCreation) { this.modifyOnCreation = modifyOnCreation; } diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/config/AuditingHandlerBeanDefinitionParser.java b/spring-data-commons-core/src/main/java/org/springframework/data/config/AuditingHandlerBeanDefinitionParser.java new file mode 100644 index 000000000..cb00f06ab --- /dev/null +++ b/spring-data-commons-core/src/main/java/org/springframework/data/config/AuditingHandlerBeanDefinitionParser.java @@ -0,0 +1,85 @@ +/* + * Copyright 2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.config; + +import static org.springframework.beans.factory.support.BeanDefinitionBuilder.*; + +import org.springframework.aop.framework.ProxyFactoryBean; +import org.springframework.aop.target.LazyInitTargetSource; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.xml.BeanDefinitionParser; +import org.springframework.data.auditing.AuditingHandler; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +/** + * {@link BeanDefinitionParser} that parses an {@link AuditingHandler} {@link BeanDefinition} + * + * @author Oliver Gierke + * @since 1.5 + */ +public class AuditingHandlerBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { + + private static final String AUDITOR_AWARE_REF = "auditor-aware-ref"; + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser#getBeanClass(org.w3c.dom.Element) + */ + @Override + protected Class getBeanClass(Element element) { + return AuditingHandler.class; + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#shouldGenerateId() + */ + @Override + protected boolean shouldGenerateId() { + return true; + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser#doParse(org.w3c.dom.Element, org.springframework.beans.factory.support.BeanDefinitionBuilder) + */ + @Override + protected void doParse(Element element, BeanDefinitionBuilder builder) { + + String auditorAwareRef = element.getAttribute(AUDITOR_AWARE_REF); + if (StringUtils.hasText(auditorAwareRef)) { + builder.addPropertyValue("auditorAware", createLazyInitTargetSourceBeanDefinition(auditorAwareRef)); + } + + ParsingUtils.setPropertyValue(builder, element, "set-dates", "dateTimeForNow"); + ParsingUtils.setPropertyReference(builder, element, "date-time-provider-ref", "dateTimeProvider"); + + } + + private BeanDefinition createLazyInitTargetSourceBeanDefinition(String auditorAwareRef) { + + BeanDefinitionBuilder targetSourceBuilder = rootBeanDefinition(LazyInitTargetSource.class); + targetSourceBuilder.addPropertyValue("targetBeanName", auditorAwareRef); + + BeanDefinitionBuilder builder = rootBeanDefinition(ProxyFactoryBean.class); + builder.addPropertyValue("targetSource", targetSourceBuilder.getBeanDefinition()); + + return builder.getBeanDefinition(); + } +} diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/config/IsNewAwareAuditingHandlerBeanDefinitionParser.java b/spring-data-commons-core/src/main/java/org/springframework/data/config/IsNewAwareAuditingHandlerBeanDefinitionParser.java new file mode 100644 index 000000000..8dbf35984 --- /dev/null +++ b/spring-data-commons-core/src/main/java/org/springframework/data/config/IsNewAwareAuditingHandlerBeanDefinitionParser.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.config; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.data.auditing.IsNewAwareAuditingHandler; +import org.springframework.util.Assert; +import org.w3c.dom.Element; + +/** + * {@link AuditingHandlerBeanDefinitionParser} that will register am {@link IsNewAwareAuditingHandler}. Needs to get the + * bean id of the + * + * @author Oliver Gierke + */ +public class IsNewAwareAuditingHandlerBeanDefinitionParser extends AuditingHandlerBeanDefinitionParser { + + private final String isNewStrategyFactoryBeanId; + + /** + * Creates a new {@link IsNewAwareAuditingHandlerBeanDefinitionParser}. + * + * @param isNewStrategyFactoryBeanId must not be {@literal null} or empty. + */ + public IsNewAwareAuditingHandlerBeanDefinitionParser(String isNewStrategyFactoryBeanId) { + + Assert.hasText(isNewStrategyFactoryBeanId); + this.isNewStrategyFactoryBeanId = isNewStrategyFactoryBeanId; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.config.AuditingHandlerBeanDefinitionParser#getBeanClass(org.w3c.dom.Element) + */ + @Override + protected Class getBeanClass(Element element) { + return IsNewAwareAuditingHandler.class; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.config.AuditingHandlerBeanDefinitionParser#doParse(org.w3c.dom.Element, org.springframework.beans.factory.support.BeanDefinitionBuilder) + */ + @Override + protected void doParse(Element element, BeanDefinitionBuilder builder) { + + builder.addConstructorArgReference(isNewStrategyFactoryBeanId); + + super.doParse(element, builder); + } +} diff --git a/spring-data-commons-core/src/main/resources/org/springframework/data/repository/config/spring-repository-1.5.xsd b/spring-data-commons-core/src/main/resources/org/springframework/data/repository/config/spring-repository-1.5.xsd index c5b522cb2..4a0c289df 100644 --- a/spring-data-commons-core/src/main/resources/org/springframework/data/repository/config/spring-repository-1.5.xsd +++ b/spring-data-commons-core/src/main/resources/org/springframework/data/repository/config/spring-repository-1.5.xsd @@ -12,8 +12,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +