/** * Dianping.com Inc. * Copyright (c) 2003-2013 All Rights Reserved. */ package com.dianping.pigeon.remoting.common.config; import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.lang.StringUtils; import com.dianping.pigeon.log.Logger; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.w3c.dom.Element; import com.dianping.pigeon.config.ConfigManager; import com.dianping.pigeon.config.ConfigManagerLoader; import com.dianping.pigeon.log.LoggerLoader; public class AnnotationBeanDefinitionParser implements BeanDefinitionParser { /** Default placeholder prefix: "${" */ public static final String DEFAULT_PLACEHOLDER_PREFIX = "${"; /** Default placeholder suffix: "}" */ public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}"; private static final Logger logger = LoggerLoader.getLogger(AnnotationBeanDefinitionParser.class); private final Class<?> beanClass; private final boolean required; private static AtomicInteger idCounter = new AtomicInteger(); private static ConfigManager configManager = ConfigManagerLoader.getConfigManager(); public AnnotationBeanDefinitionParser(Class<?> beanClass, boolean required) { this.beanClass = beanClass; this.required = required; } public BeanDefinition parse(Element element, ParserContext parserContext) { return parse(element, parserContext, beanClass, required); } private static BeanDefinition parse(Element element, ParserContext parserContext, Class<?> beanClass, boolean required) { RootBeanDefinition beanDefinition = new RootBeanDefinition(); beanDefinition.setLazyInit(false); String id = element.getAttribute("id"); if (StringUtils.isBlank(id)) { id = "pigeonAnnotation_" + idCounter.incrementAndGet(); } beanDefinition.setBeanClass(AnnotationBean.class); MutablePropertyValues properties = beanDefinition.getPropertyValues(); if (element.hasAttribute("package")) { properties.addPropertyValue("package", resolveReference(element, "package")); } parserContext.getRegistry().registerBeanDefinition(id, beanDefinition); return beanDefinition; } private static String resolveReference(Element element, String attribute) { String value = element.getAttribute(attribute); if (value.startsWith(DEFAULT_PLACEHOLDER_PREFIX) && value.endsWith(DEFAULT_PLACEHOLDER_SUFFIX)) { String valueInCache = configManager.getStringValue(value.substring(2, value.length() - 1)); if (valueInCache == null) { throw new IllegalStateException("undefined config property:" + element.getAttribute(attribute)); } else { value = valueInCache; } } return value; } }