pl.chilldev.web.spring.config.HandlePageModelBeanDefinitionParser.java Source code

Java tutorial

Introduction

Here is the source code for pl.chilldev.web.spring.config.HandlePageModelBeanDefinitionParser.java

Source

/**
 * This file is part of the ChillDev-Web.
 *
 * @license http://mit-license.org/ The MIT license
 * @copyright 2014  by Rafa Wrzeszcz - Wrzasq.pl.
 */

package pl.chilldev.web.spring.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;

import org.springframework.web.context.WebApplicationContext;

import org.w3c.dom.Element;

import pl.chilldev.web.core.markup.Generator;
import pl.chilldev.web.core.page.PageMetaModel;

import pl.chilldev.web.spring.context.PageMetaModelFactoryBean;
import pl.chilldev.web.spring.context.SpringBeansFacesPageMetaModelResolver;
import pl.chilldev.web.spring.context.SpringBeansJspPageMetaModelResolver;

import pl.chilldev.web.tags.context.PageMetaModelContextUtils;

/**
 * `<handle-page-model>` element parser.
 *
 * @version 0.0.3
 * @since 0.0.1
 */
public class HandlePageModelBeanDefinitionParser implements BeanDefinitionParser {
    /**
     * `xhtml=""` attribute name.
     */
    public static final String ATTRIBUTE_XHTML = "xhtml";

    /**
     * Page model creation method name.
     */
    public static final String METHOD_CREATEPAGEMETAMODEL = "createPageMetaModel";

    /**
     * Logger.
     */
    protected Logger logger = LoggerFactory.getLogger(HandlePageModelBeanDefinitionParser.class);

    /**
     * Page meta model for aggregating all the info.
     */
    protected BeanDefinition pageMetaModelFactoryBean;

    /**
     * Assigns page meta model for aggregating all the info.
     *
     * @param pageMetaModelFactoryBean Page model bean definition.
     * @since 0.0.1
     */
    public HandlePageModelBeanDefinitionParser(BeanDefinition pageMetaModelFactoryBean) {
        this.pageMetaModelFactoryBean = pageMetaModelFactoryBean;
    }

    /**
     * {@inheritDoc}
     * @since 0.0.1
     */
    @Override
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        // page model bean prototype
        GenericBeanDefinition pageMetaModelBean = new GenericBeanDefinition();
        pageMetaModelBean.setBeanClass(PageMetaModel.class);
        pageMetaModelBean.setScope(WebApplicationContext.SCOPE_REQUEST);
        pageMetaModelBean.setFactoryBeanName(PageMetaModelFactoryBean.class.getName());
        pageMetaModelBean.setFactoryMethodName(HandlePageModelBeanDefinitionParser.METHOD_CREATEPAGEMETAMODEL);
        parserContext.getRegistry().registerBeanDefinition(PageMetaModel.class.getName(), pageMetaModelBean);

        parserContext.getRegistry().registerBeanDefinition(PageMetaModelFactoryBean.class.getName(),
                this.pageMetaModelFactoryBean);

        // XHTML switch needs to be handled with generator bean
        if (element.hasAttribute(HandlePageModelBeanDefinitionParser.ATTRIBUTE_XHTML)) {
            boolean xhtml = element.getAttribute(HandlePageModelBeanDefinitionParser.ATTRIBUTE_XHTML)
                    .equals("true");

            GenericBeanDefinition generatorBean = new GenericBeanDefinition();
            generatorBean.setBeanClass(Generator.class);

            this.logger.info("Setting markup generator XHTML mode to {}.", xhtml);
            ConstructorArgumentValues arguments = generatorBean.getConstructorArgumentValues();
            arguments.addGenericArgumentValue(xhtml);

            parserContext.getRegistry().registerBeanDefinition(Generator.class.getName(), generatorBean);

            arguments = pageMetaModelBean.getConstructorArgumentValues();
            arguments.addGenericArgumentValue(new RuntimeBeanReference(Generator.class.getName()));
        }

        // register new resolving strategy
        PageMetaModelContextUtils.setPageMetaModelResolver(new SpringBeansJspPageMetaModelResolver());
        pl.chilldev.web.faces.context.PageMetaModelContextUtils
                .setPageMetaModelResolver(new SpringBeansFacesPageMetaModelResolver());

        return null;
    }
}