001    
002    /*
003     * Copyright (C) 2011 Archie L. Cobbs. All rights reserved.
004     *
005     * $Id: AbstractBeanDefinitionParser.java 130 2011-09-17 14:21:00Z archie.cobbs $
006     */
007    
008    package org.dellroad.stuff.spring;
009    
010    import org.springframework.beans.factory.support.AbstractBeanDefinition;
011    import org.springframework.beans.factory.support.BeanDefinitionBuilder;
012    import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate;
013    import org.springframework.beans.factory.xml.ParserContext;
014    import org.w3c.dom.Element;
015    
016    /**
017     * Support superclass for {@link org.springframework.beans.factory.xml.BeanDefinitionParser} implementations.
018     */
019    public abstract class AbstractBeanDefinitionParser extends org.springframework.beans.factory.xml.AbstractBeanDefinitionParser {
020    
021        /**
022         * Create a new bean definition.
023         *
024         * @param beanClass bean type
025         * @param element the element that the new bean definition is associated with
026         * @param parserContext parser context
027         */
028        protected AbstractBeanDefinition createBeanDefinition(Class<?> beanClass, Element element, ParserContext parserContext) {
029            BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
030            builder.getRawBeanDefinition().setBeanClass(beanClass);
031            builder.getRawBeanDefinition().setSource(parserContext.extractSource(element));
032            if (parserContext.isNested())
033                builder.setScope(parserContext.getContainingBeanDefinition().getScope());
034            if (parserContext.isDefaultLazyInit())
035                builder.setLazyInit(true);
036            return builder.getBeanDefinition();
037        }
038    
039        /**
040         * Parse the standard Spring bean attributes such as {@code scope}, {@code depends-on}, {@code abstract}, etc.
041         *
042         * @param beanDefinition bean definition to modify
043         * @param element the XML element on which to look for attributes
044         * @param parserContext parser context
045         */
046        protected void parseStandardAttributes(AbstractBeanDefinition beanDefinition, Element element, ParserContext parserContext) {
047            BeanDefinitionParserDelegate delegate = new BeanDefinitionParserDelegate(parserContext.getReaderContext());
048            delegate.parseBeanDefinitionAttributes(element, "", null, beanDefinition);
049        }
050    
051        /**
052         * Report an error and throw an exception.
053         */
054        protected void error(Element element, ParserContext parserContext, String message) {
055            parserContext.getReaderContext().fatal(message, parserContext.extractSource(element));
056        }
057    }
058