com.inspiresoftware.lib.dto.geda.config.XmlDrivenGeDABeanDefinitionParser.java Source code

Java tutorial

Introduction

Here is the source code for com.inspiresoftware.lib.dto.geda.config.XmlDrivenGeDABeanDefinitionParser.java

Source

/*
 * This code is distributed under The GNU Lesser General Public License (LGPLv3)
 * Please visit GNU site for LGPLv3 http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright Denis Pavlov 2009
 * Web: http://www.genericdtoassembler.org
 * SVN: https://svn.code.sf.net/p/geda-genericdto/code/trunk/
 * SVN (mirror): http://geda-genericdto.googlecode.com/svn/trunk/
 */

package com.inspiresoftware.lib.dto.geda.config;

import com.inspiresoftware.lib.dto.geda.impl.DTOSupportImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
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 org.w3c.dom.Node;

/**
 * .
 * <p/>
 * User: denispavlov
 * Date: Jan 25, 2012
 * Time: 4:12:57 PM
 */
public class XmlDrivenGeDABeanDefinitionParser implements BeanDefinitionParser, BeanDefinitionDecorator {

    private static final Logger LOG = LoggerFactory.getLogger(XmlDrivenGeDABeanDefinitionParser.class);

    private static final String XSD_ATTR__DTO_SUPPORT = "dto-support";
    private static final String XSD_ATTR__DTO_FACTORY = "dto-factory";
    private static final String XSD_ATTR__DTO_ADAPTERS_REGISTRAR = "dto-adapters-registrar";
    private static final String XSD_ATTR__DTO_DSL_REGISTRAR = "dto-dsl-registrar";
    private static final String XSD_ATTR__ON_DTO_ASSEMBLY = "on-dto-assembly";
    private static final String XSD_ATTR__ON_DTO_ASSEMBLED = "on-dto-assembled";
    private static final String XSD_ATTR__ON_DTO_FAILED = "on-dto-failed";
    private static final String XSD_ATTR__ON_ENTITY_ASSEMBLY = "on-entity-assembly";
    private static final String XSD_ATTR__ON_ENTITY_ASSEMBLED = "on-entity-assembled";
    private static final String XSD_ATTR__ON_ENTITY_FAILED = "on-entity-failed";

    private static final String XSD_ATTR__PROPERTY = "property";

    private String dtoSupportBeanName = null;

    public BeanDefinition parse(final Element element, final ParserContext parserContext) {

        dtoSupportBeanName = element.getAttribute(XSD_ATTR__DTO_SUPPORT);

        final BeanDefinitionRegistry registry = parserContext.getRegistry();
        final Object elementSource = parserContext.extractSource(element);

        if (!registry.containsBeanDefinition(dtoSupportBeanName)) {

            final String dtoFactoryBeanName = element.getAttribute(XSD_ATTR__DTO_FACTORY);
            final RuntimeBeanReference dtoFactoryRef = new RuntimeBeanReference(dtoFactoryBeanName);

            final String dtoVcrBeanName = element.getAttribute(XSD_ATTR__DTO_ADAPTERS_REGISTRAR);
            final RuntimeBeanReference dtoVcrRef;
            if (StringUtils.hasLength(dtoVcrBeanName)) {
                dtoVcrRef = new RuntimeBeanReference(dtoVcrBeanName);
            } else {
                dtoVcrRef = null;
            }

            final String dtoDslBeanName = element.getAttribute(XSD_ATTR__DTO_DSL_REGISTRAR);
            final RuntimeBeanReference dtoDslRef;
            if (StringUtils.hasLength(dtoDslBeanName)) {
                dtoDslRef = new RuntimeBeanReference(dtoDslBeanName);
            } else {
                dtoDslRef = null;
            }

            this.setupDtoSupport(element, dtoSupportBeanName, registry, elementSource, dtoFactoryRef, dtoVcrRef,
                    dtoDslRef);

        }

        return null;
    }

    public BeanDefinitionHolder decorate(final Node node, final BeanDefinitionHolder definition,
            final ParserContext parserContext) {

        final BeanDefinition beanDefinition = definition.getBeanDefinition();

        final String dtoSupportProperty = node.getAttributes().getNamedItem(XSD_ATTR__PROPERTY).getNodeValue();

        final MutablePropertyValues properties = beanDefinition.getPropertyValues();
        properties.add(dtoSupportProperty, new RuntimeBeanReference(dtoSupportBeanName));

        return definition;
    }

    protected RuntimeBeanReference setupDtoSupport(final Element element, final String dtoSupportBeanName,
            final BeanDefinitionRegistry registry, final Object elementSource,
            final RuntimeBeanReference dtoFactoryRef, final RuntimeBeanReference dtoVcrRef,
            final RuntimeBeanReference dtoDslRef) {

        final RootBeanDefinition dtoSupportDef = new RootBeanDefinition(DTOSupportImpl.class);
        dtoSupportDef.setSource(elementSource);
        dtoSupportDef.setRole(BeanDefinition.ROLE_APPLICATION);

        final MutablePropertyValues valuesArgs = dtoSupportDef.getPropertyValues();
        valuesArgs.addPropertyValue("beanFactory", dtoFactoryRef);
        if (dtoVcrRef != null) {
            valuesArgs.addPropertyValue("adaptersRegistrar", dtoVcrRef);
        }
        if (dtoDslRef != null) {
            valuesArgs.addPropertyValue("dslRegistrar", dtoDslRef);
        }
        setupListenerProperty(valuesArgs, "onDtoAssembly", element.getAttribute(XSD_ATTR__ON_DTO_ASSEMBLY));
        setupListenerProperty(valuesArgs, "onDtoAssembled", element.getAttribute(XSD_ATTR__ON_DTO_ASSEMBLED));
        setupListenerProperty(valuesArgs, "onDtoFailed", element.getAttribute(XSD_ATTR__ON_DTO_FAILED));
        setupListenerProperty(valuesArgs, "onEntityAssembly", element.getAttribute(XSD_ATTR__ON_ENTITY_ASSEMBLY));
        setupListenerProperty(valuesArgs, "onEntityAssembled", element.getAttribute(XSD_ATTR__ON_ENTITY_ASSEMBLED));
        setupListenerProperty(valuesArgs, "onEntityFailed", element.getAttribute(XSD_ATTR__ON_ENTITY_FAILED));

        registry.registerBeanDefinition(dtoSupportBeanName, dtoSupportDef);

        return new RuntimeBeanReference(dtoSupportBeanName);
    }

    protected void setupListenerProperty(final MutablePropertyValues valuesArgs, final String property,
            final String listenerName) {
        if (StringUtils.hasLength(listenerName)) {
            valuesArgs.addPropertyValue(property, new RuntimeBeanReference(listenerName));
        }

    }

}