org.jdal.beans.DefaultsBeanDefinitionParser.java Source code

Java tutorial

Introduction

Here is the source code for org.jdal.beans.DefaultsBeanDefinitionParser.java

Source

/*
 * Copyright 2009-2012 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jdal.beans;

import java.util.HashMap;
import java.util.Map;

import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JToggleButton;
import javax.swing.text.JTextComponent;

import org.jdal.swing.ApplicationContextGuiFactory;
import org.jdal.swing.PaginatorView;
import org.jdal.swing.Selector;
import org.jdal.swing.bind.AnnotationControlInitializer;
import org.jdal.swing.bind.ComboAccessor;
import org.jdal.swing.bind.LabelAccessor;
import org.jdal.swing.bind.ListAccessor;
import org.jdal.swing.bind.SelectorAccessor;
import org.jdal.swing.bind.TablePanelAccessor;
import org.jdal.swing.bind.TextComponentAccessor;
import org.jdal.swing.bind.ToggleButtonAccessor;
import org.jdal.swing.table.AddAction;
import org.jdal.swing.table.ApplyFilterAction;
import org.jdal.swing.table.ClearFilterAction;
import org.jdal.swing.table.CollectionTableCellRenderer;
import org.jdal.swing.table.DeselectAllAction;
import org.jdal.swing.table.HideShowFilterAction;
import org.jdal.swing.table.RemoveAllAction;
import org.jdal.swing.table.SelectAllAction;
import org.jdal.swing.table.TablePanel;
import org.jdal.ui.View;
import org.jdal.ui.bind.ConfigurableBinderFactory;
import org.jdal.ui.bind.ConfigurableControlAccessorFactory;
import org.jdal.ui.bind.ControlAccessor;
import org.jdal.ui.bind.ViewAccessor;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.CustomEditorConfigurer;
import org.springframework.beans.factory.config.ListFactoryBean;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.parsing.ComponentDefinition;
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

/**
 * Register Swing defaults BeanDefinitions
 * 
 * @author Jose Luis Martin - (jlm@joseluismartin.info)
 */
public class DefaultsBeanDefinitionParser implements BeanDefinitionParser {

    public static final String PAGINATOR_VIEW_BEAN_NAME = "paginatorView";
    public static final String ACCESSOR_FACTORY_BEAN_NAME = "controlAccessorFactory";
    public static final String BINDER_FACTORY_BEAN_NAME = "binderFactory";
    public static final String CUSTOM_EDITOR_CONFIGURER_BEAN_NAME = "customEditorConfigurer";
    public static final String DEFAULT_TABLE_ACTIONS = "defaultTableActions";
    public static final String INIT_METHOD_NAME = "init";
    public static final String DEFAULT_GUI_FACTORY = "defaultGuiFactory";
    public static final String CONTROL_INITIALIZER = "controlInitializer";
    public static final String PERSISTENT_SERVICE = "persistentService";
    public static final String COLLECTION_TABLE_CELL_RENDERER_BEAN_NAME = "collectionTableCellRenderer";

    /**
     * {@inheritDoc}
     */
    public BeanDefinition parse(Element element, ParserContext parserContext) {

        Object source = parserContext.extractSource(element);
        CompositeComponentDefinition ccd = new CompositeComponentDefinition("jdal-swing", source);

        ccd.addNestedComponent(registerPropertyEditors(element, parserContext));
        ccd.addNestedComponent(registerAccessorFactory(element, parserContext));
        ccd.addNestedComponent(registerBinderFactory(element, parserContext));
        ccd.addNestedComponent(registerPaginatorView(element, parserContext));
        ccd.addNestedComponent(registerDefaultTableActions(element, parserContext));
        ccd.addNestedComponent(registerDefaultGuiFactory(element, parserContext));
        ccd.addNestedComponent(registerCollectionTableCellRenderer(element, parserContext));
        //      ccd.addNestedComponent(registerControlInitializer(element, parserContext));

        parserContext.getReaderContext().fireComponentRegistered(ccd);

        return null;
    }

    /**
     * Register CollectionTableCellRenderer
     * @param element
     * @param parserContext
     * @return
     */
    private ComponentDefinition registerCollectionTableCellRenderer(Element element, ParserContext parserContext) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(CollectionTableCellRenderer.class);
        bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
                COLLECTION_TABLE_CELL_RENDERER_BEAN_NAME);
        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

    /**
     * @param registry
     * @param bcd
     */
    private void registerBeanComponentDefinition(Element element, ParserContext parserContext,
            BeanComponentDefinition bcd) {
        parserContext.getDelegate().parseBeanDefinitionAttributes(element, bcd.getBeanName(), null,
                (AbstractBeanDefinition) bcd.getBeanDefinition());
        BeanDefinitionRegistry registry = parserContext.getRegistry();
        registry.registerBeanDefinition(bcd.getBeanName(), bcd.getBeanDefinition());
    }

    /**
     * @return
     */
    private ComponentDefinition registerPaginatorView(Element element, ParserContext parserContext) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(PaginatorView.class);
        bdb.addPropertyValue("pageSizes", "10,20,30,40,50,100,All");
        bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
                PAGINATOR_VIEW_BEAN_NAME);
        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

    /**
     * @return
     */
    private ComponentDefinition registerBinderFactory(Element element, ParserContext parserContext) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(ConfigurableBinderFactory.class);
        bdb.addPropertyReference(ACCESSOR_FACTORY_BEAN_NAME, ACCESSOR_FACTORY_BEAN_NAME);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
                BINDER_FACTORY_BEAN_NAME);
        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

    /**
     * @return
     */
    private ComponentDefinition registerAccessorFactory(Element element, ParserContext parserContext) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder
                .genericBeanDefinition(ConfigurableControlAccessorFactory.class);

        Map<Class<?>, Class<? extends ControlAccessor>> accessors = new ManagedMap<Class<?>, Class<? extends ControlAccessor>>();
        accessors.put(JTextComponent.class, TextComponentAccessor.class);
        accessors.put(JList.class, ListAccessor.class);
        accessors.put(Selector.class, SelectorAccessor.class);
        accessors.put(JToggleButton.class, ToggleButtonAccessor.class);
        accessors.put(JComboBox.class, ComboAccessor.class);
        accessors.put(View.class, ViewAccessor.class);
        accessors.put(JLabel.class, LabelAccessor.class);
        accessors.put(TablePanel.class, TablePanelAccessor.class);
        bdb.addPropertyValue("accessors", accessors);

        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
                ACCESSOR_FACTORY_BEAN_NAME);

        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

    /**
     * @return
     */
    private ComponentDefinition registerPropertyEditors(Element element, ParserContext parserContext) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(CustomEditorConfigurer.class);
        Map<String, String> map = new HashMap<String, String>();
        map.put("java.awt.Image", "org.jdal.beans.ImagePropertyEditor");
        map.put("javax.swing.Icon", "org.jdal.beans.IconPropertyEditor");
        bdb.addPropertyValue("customEditors", map);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
                CUSTOM_EDITOR_CONFIGURER_BEAN_NAME);
        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

    /**
     * Register default TablePanel Actions
     * @param element current element
     * @param parserContext parserContext
     * @return a new ComponentDefinition with default table action list.
     */
    private ComponentDefinition registerDefaultTableActions(Element element, ParserContext parserContext) {
        ManagedList<Object> actions = new ManagedList<Object>(7);
        actions.add(createBeanDefinition(AddAction.class, parserContext));
        actions.add(createBeanDefinition(SelectAllAction.class, parserContext));
        actions.add(createBeanDefinition(DeselectAllAction.class, parserContext));
        actions.add(createBeanDefinition(RemoveAllAction.class, parserContext));
        actions.add(createBeanDefinition(HideShowFilterAction.class, parserContext));
        actions.add(createBeanDefinition(ApplyFilterAction.class, parserContext));
        actions.add(createBeanDefinition(ClearFilterAction.class, parserContext));

        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(ListFactoryBean.class);
        bdb.getRawBeanDefinition().setSource(parserContext.extractSource(element));
        bdb.addPropertyValue("sourceList", actions);
        bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), DEFAULT_TABLE_ACTIONS);
        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

    /**
     * @param clazz
     * @return
     */
    @SuppressWarnings("rawtypes")
    private BeanDefinitionHolder createBeanDefinition(Class clazz, ParserContext parserContext) {
        GenericBeanDefinition gbd = new GenericBeanDefinition();
        gbd.setBeanClass(clazz);
        gbd.setInitMethodName(INIT_METHOD_NAME);
        BeanDefinitionHolder holder = new BeanDefinitionHolder(gbd,
                parserContext.getReaderContext().generateBeanName(gbd));

        return holder;
    }

    /**
     * @param element
     * @param parserContext
     * @return
     */
    private ComponentDefinition registerDefaultGuiFactory(Element element, ParserContext parserContext) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(ApplicationContextGuiFactory.class);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), DEFAULT_GUI_FACTORY);
        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

    /**
     * @param element
     * @param parserContext
     * @return
     */
    @SuppressWarnings("unused")
    private ComponentDefinition registerControlInitializer(Element element, ParserContext parserContext) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(AnnotationControlInitializer.class);

        bdb.addPropertyReference(PERSISTENT_SERVICE, PERSISTENT_SERVICE);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), CONTROL_INITIALIZER);

        registerBeanComponentDefinition(element, parserContext, bcd);
        return bcd;
    }

}