/**
* 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;
}
}