All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yammer.metrics.spring.config.AnnotationDrivenBeanDefinitionParser Maven / Gradle / Ivy

The newest version!
package com.yammer.metrics.spring.config;

import org.springframework.aop.framework.ProxyConfig;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

import com.yammer.metrics.HealthChecks;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.spring.ExceptionMeteredAnnotationBeanPostProcessor;
import com.yammer.metrics.spring.GaugeAnnotationBeanPostProcessor;
import com.yammer.metrics.spring.HealthCheckBeanPostProcessor;
import com.yammer.metrics.spring.MeteredAnnotationBeanPostProcessor;
import com.yammer.metrics.spring.TimedAnnotationBeanPostProcessor;

import static org.springframework.beans.factory.config.BeanDefinition.*;

public class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {

    public BeanDefinition parse(Element element, ParserContext parserContext) {
        final Object source = parserContext.extractSource(element);

        final CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(),
                                                                                             source);
        parserContext.pushContainingComponent(compDefinition);

        String metricsBeanName = element.getAttribute("metrics-registry");
        if (!StringUtils.hasText(metricsBeanName)) {
            metricsBeanName = registerComponent(parserContext,
                                                build(Metrics.class,
                                                      source,
                                                      ROLE_APPLICATION)
                                                .setFactoryMethod("defaultRegistry"));
        }

        String healthCheckBeanName = element.getAttribute("health-check-registry");
        if (!StringUtils.hasText(healthCheckBeanName)) {
            healthCheckBeanName = registerComponent(parserContext,
                                                    build(HealthChecks.class,
                                                          source,
                                                          ROLE_APPLICATION)
                                                    .setFactoryMethod("defaultRegistry"));
        }

        String scope = element.getAttribute("scope");
        if (!StringUtils.hasText(scope)) {
            scope = null;
        }

        ProxyConfig proxyConfig = new ProxyConfig();

        if (StringUtils.hasText(element.getAttribute("expose-proxy"))) {
            proxyConfig.setExposeProxy(Boolean.valueOf(element.getAttribute("expose-proxy")));
        }

        if (StringUtils.hasText(element.getAttribute("proxy-target-class"))) {
            proxyConfig.setProxyTargetClass(Boolean.valueOf(element.getAttribute("proxy-target-class")));
        }

        registerComponent(parserContext,
                          build(ExceptionMeteredAnnotationBeanPostProcessor.class,
                                source,
                                ROLE_INFRASTRUCTURE
                          )
                          .addConstructorArgReference(metricsBeanName)
                          .addConstructorArgValue(proxyConfig)
                          .addConstructorArgValue(scope));

        registerComponent(parserContext,
                          build(MeteredAnnotationBeanPostProcessor.class,
                                source,
                                ROLE_INFRASTRUCTURE
                          )
                          .addConstructorArgReference(metricsBeanName)
                          .addConstructorArgValue(proxyConfig)
                          .addConstructorArgValue(scope));

        registerComponent(parserContext,
                          build(TimedAnnotationBeanPostProcessor.class,
                                source,
                                ROLE_INFRASTRUCTURE
                          )
                          .addConstructorArgReference(metricsBeanName)
                          .addConstructorArgValue(proxyConfig)
                          .addConstructorArgValue(scope));

        registerComponent(parserContext,
                          build(GaugeAnnotationBeanPostProcessor.class,
                                source,
                                ROLE_INFRASTRUCTURE
                          )
                          .addConstructorArgReference(metricsBeanName)
                          .addConstructorArgValue(scope));

        registerComponent(parserContext,
                          build(HealthCheckBeanPostProcessor.class,
                                source,
                                ROLE_INFRASTRUCTURE
                          )
                          .addConstructorArgReference(healthCheckBeanName));

        parserContext.popAndRegisterContainingComponent();

        return null;
    }

    private BeanDefinitionBuilder build(Class klazz, Object source, int role) {
        final BeanDefinitionBuilder beanDefBuilder = BeanDefinitionBuilder.rootBeanDefinition(klazz);
        beanDefBuilder.setRole(role);
        beanDefBuilder.getRawBeanDefinition().setSource(source);
        return beanDefBuilder;
    }

    private String registerComponent(ParserContext parserContext, BeanDefinitionBuilder beanDefBuilder) {
    	final BeanDefinition beanDef = beanDefBuilder.getBeanDefinition();
        final String beanName = parserContext.getReaderContext().registerWithGeneratedName(beanDef);
        parserContext.registerComponent(new BeanComponentDefinition(beanDef, beanName));
        return beanName;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy