/***********************************************************************************
* Copyright (c) 2013. Nickolay Gerilovich. Russia.
* Some Rights Reserved.
************************************************************************************/
package com.github.nickvl.xspring.core.log.aop.config;
import org.springframework.aop.config.AopNamespaceUtils;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import com.github.nickvl.xspring.core.log.aop.AOPLogger;
import com.github.nickvl.xspring.core.log.aop.SimpleLogAdapter;
import com.github.nickvl.xspring.core.log.aop.UniversalLogAdapter;
/**
* Implements {@link AbstractBeanDefinitionParser} which configures aop logger.
*/
public class AnnotationLoggerBeanDefinitionParser extends AbstractBeanDefinitionParser {
private static final String INTERNAL_AOPLOGGER_NAME = "net.ng.xspring.core.log.aop.internal.aoplogger.name";
private static final String CONFIG = "config";
private static final String TO_STRING = "to-string";
private static final String REFLECTION_TO_STRING = "reflection-to-string";
@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
// AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
if (parserContext.getRegistry().containsBeanDefinition(INTERNAL_AOPLOGGER_NAME)) {
return null;
}
return parseLoggerElement(element);
}
@Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) {
return INTERNAL_AOPLOGGER_NAME;
}
private AbstractBeanDefinition parseLoggerElement(Element element) {
BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(AOPLogger.class);
factory.addPropertyValue("logAdapter", parseLogAdapter(element));
return factory.getBeanDefinition();
}
private BeanDefinition parseLogAdapter(Element element) {
Element configElement = DomUtils.getChildElementByTagName(element, CONFIG);
if (configElement == null) {
return getUniversalLogAdapterBeanDefinition(null);
}
if (DomUtils.getChildElementByTagName(configElement, TO_STRING) != null) {
return getSimpleLogAdapterBeanDefinition();
}
Element universalLogAdapterElement = DomUtils.getChildElementByTagName(configElement, REFLECTION_TO_STRING);
return getUniversalLogAdapterBeanDefinition(universalLogAdapterElement);
}
private BeanDefinition getUniversalLogAdapterBeanDefinition(Element universalLogAdapterElement) {
BeanDefinitionBuilder logAdapter = BeanDefinitionBuilder.genericBeanDefinition(UniversalLogAdapter.class);
String skipNullFields = universalLogAdapterElement.getAttribute("skip-null-fields");
logAdapter.addConstructorArgValue(Boolean.valueOf(skipNullFields));
Attr crop = universalLogAdapterElement.getAttributeNode("multi-element-structure-crop-threshold");
if (crop != null) {
logAdapter.addConstructorArgValue(Integer.valueOf(crop.getValue()));
}
logAdapter.addConstructorArgValue(null);
return logAdapter.getBeanDefinition();
}
private BeanDefinition getSimpleLogAdapterBeanDefinition() {
BeanDefinitionBuilder logAdapter = BeanDefinitionBuilder.genericBeanDefinition(SimpleLogAdapter.class);
return logAdapter.getBeanDefinition();
}
}