From Null-pointer
package null-pointer.memcached.config;
import null-pointer.memcached.CacheManager;
import null-pointer.memcached.CacheStaticMethodMatcherPointcut;
import null-pointer.memcached.interceptor.MemcachedMethodInterceptor;
import org.apache.log4j.Logger;
import org.springframework.aop.config.AopNamespaceUtils;
import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.beans.factory.xml.XmlReaderContext;
import org.w3c.dom.Element;
/**
* @author Paul Kane
* @since 16-Sep-2010
*/
public class AnnotationDrivenMemcachedBeanDefinitionParser implements BeanDefinitionParser {
Logger logger = Logger.getLogger(this.getClass());
static final String MEMCACHED_CACHING_ADVISOR_BEAN_NAME =
AnnotationDrivenMemcachedBeanDefinitionParser.class.getPackage().getName() +
".internalMemcachedCachingAdvisor";
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
if (!parserContext.getRegistry().containsBeanDefinition(MEMCACHED_CACHING_ADVISOR_BEAN_NAME)) {
final Object elementSource = parserContext.extractSource(element);
final RuntimeBeanReference cacheManagerReference =
this.setupCacheManagerReference(element, parserContext, elementSource);
final RuntimeBeanReference interceptorReference =
this.setupInterceptor(parserContext, elementSource, cacheManagerReference);
final RuntimeBeanReference pointcutReference =
this.setupPointcut(element, parserContext, elementSource, cacheManagerReference);
this.setupPointcutAdvisor(element, parserContext, elementSource, pointcutReference, interceptorReference);
}
return null;
}
private RuntimeBeanReference setupCacheManagerReference(Element element, ParserContext parserContext,
Object elementSource) {
final RootBeanDefinition cacheAttributeSource = new RootBeanDefinition(CacheManager.class);
cacheAttributeSource.setSource(elementSource);
cacheAttributeSource.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
final MutablePropertyValues propertyValues = cacheAttributeSource.getPropertyValues();
RuntimeBeanReference cacheManagerReference = new RuntimeBeanReference(element.getAttribute("cache-manager"));
propertyValues.addPropertyValue("cacheFactory", cacheManagerReference);
final XmlReaderContext readerContext = parserContext.getReaderContext();
final String cacheAttributeSourceBeanName = readerContext.registerWithGeneratedName(cacheAttributeSource);
return new RuntimeBeanReference(cacheAttributeSourceBeanName);
}
protected RuntimeBeanReference setupPointcut(Element element, ParserContext parserContext, Object elementSource,
RuntimeBeanReference cacheManagerReference) {
final RootBeanDefinition pointcut = new RootBeanDefinition(CacheStaticMethodMatcherPointcut.class);
pointcut.setSource(elementSource);
pointcut.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
final MutablePropertyValues propertyValues = pointcut.getPropertyValues();
propertyValues.addPropertyValue("cacheManager", cacheManagerReference);
final XmlReaderContext readerContext = parserContext.getReaderContext();
final String pointcutBeanName = readerContext.registerWithGeneratedName(pointcut);
return new RuntimeBeanReference(pointcutBeanName);
}
protected RuntimeBeanReference setupInterceptor(ParserContext parserContext, Object elementSource,
RuntimeBeanReference cacheManagerReference) {
final RootBeanDefinition interceptor = new RootBeanDefinition(MemcachedMethodInterceptor.class);
interceptor.setSource(elementSource);
interceptor.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
final MutablePropertyValues propertyValues = interceptor.getPropertyValues();
propertyValues.addPropertyValue("cacheManager", cacheManagerReference);
final XmlReaderContext readerContext = parserContext.getReaderContext();
final String interceptorBeanName = readerContext.registerWithGeneratedName(interceptor);
return new RuntimeBeanReference(interceptorBeanName);
}
protected RuntimeBeanReference setupPointcutAdvisor(Element element, ParserContext parserContext,
Object elementSource,
RuntimeBeanReference cacheablePointcutBeanReference,
RuntimeBeanReference cachingInterceptorBeanReference) {
final RootBeanDefinition pointcutAdvisor = new RootBeanDefinition(DefaultBeanFactoryPointcutAdvisor.class);
pointcutAdvisor.setSource(elementSource);
pointcutAdvisor.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
final MutablePropertyValues propertyValues = pointcutAdvisor.getPropertyValues();
propertyValues.addPropertyValue("adviceBeanName", cachingInterceptorBeanReference.getBeanName());
propertyValues.addPropertyValue("pointcut", cacheablePointcutBeanReference);
if (element.hasAttribute("order")) {
propertyValues.addPropertyValue("order", element.getAttribute("order"));
}
final BeanDefinitionRegistry registry = parserContext.getRegistry();
registry.registerBeanDefinition(MEMCACHED_CACHING_ADVISOR_BEAN_NAME, pointcutAdvisor);
return new RuntimeBeanReference(MEMCACHED_CACHING_ADVISOR_BEAN_NAME);
}
}