AnnotationDrivenMemcachedBeanDefinitionParser.java

From Null-pointer

Jump to: navigation, search
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);
    }
}
Personal tools