org.jdal.beans.TableBeanDefinitionParser.java Source code

Java tutorial

Introduction

Here is the source code for org.jdal.beans.TableBeanDefinitionParser.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.List;

import org.apache.commons.lang.StringUtils;
import org.jdal.swing.ListTableModel;
import org.jdal.swing.PageableTable;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
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.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.core.Conventions;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * Parse swing:table elements. Create the ListTableModel, PageableTable and TablePanel 
 * BeanDefinitions.
 * 
 * @author Jose Luis Martin - (jlm@joseluismartin.info)
 */
public class TableBeanDefinitionParser implements BeanDefinitionParser {

    private static final String ENTITY = "entity";
    private static final String ID = "id";
    private static final String TABLE_PANEL_SUFFIX = "Table";
    private static final String TABLE_PANEL_CLASS = "table-panel-class";
    private static final String LIST_TABLE_MODEL_SUFFIX = "TableModel";
    private static final String PAGEABLE_TABLE_SUFFIX = "PageableTable";
    private static final String SERVICE_SUFFIX = "Service";
    private static final String EDITOR_SUFFIX = "Editor";
    private static final String EDITOR = "editor";
    private static final String EDITOR_NAME = "editorName";
    private static final String DATA_SOURCE = "dataSource";
    private static final String SERVICE_ATTRIBUTE = "service";
    private static final String PAGINATOR_VIEW = "paginatorView";
    private static final String PAGINATOR = "paginator";
    private static final String TABLE_MODEL = "tableModel";
    private static final String TABLE = "table";
    private static final String COLUMNS = "columns";
    private static final String ACTIONS = "actions";
    private static final String USE_ACTIONS = "use-actions";
    private static final String GUI_FACTORY = "guiFactory";
    private static final String PERSISTENT_SERVICE = "persistentService";
    private static final String FILTER = "filter";
    private static final String FILTER_VIEW = "filter-view";
    private static final String TABLE_SERVICE = "table-service";
    private static final String NAME = "name";
    private static final String SHOW_MENU = "show-menu";
    private static final String MESSAGE_SOURCE = "messageSource";
    private static final String SCOPE = "scope";

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("rawtypes")
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        // Defaults
        String entity = null;

        if (element.hasAttribute(ENTITY))
            entity = element.getAttribute(ENTITY);

        String name = StringUtils.uncapitalize(StringUtils.substringAfterLast(entity, "."));

        if (element.hasAttribute(ID))
            name = element.getAttribute(ID);

        parserContext.pushContainingComponent(
                new CompositeComponentDefinition(name, parserContext.extractSource(element)));

        // Bean names
        String tableModelBeanName = name + LIST_TABLE_MODEL_SUFFIX;
        String tablePanelBeanName = name + TABLE_PANEL_SUFFIX;
        String pageableTableBeanName = name + PAGEABLE_TABLE_SUFFIX;
        String dataSource = name + SERVICE_SUFFIX;
        String paginator = PAGINATOR_VIEW;
        String editor = name + EDITOR_SUFFIX;
        String actions = DefaultsBeanDefinitionParser.DEFAULT_TABLE_ACTIONS;
        String guiFactory = DefaultsBeanDefinitionParser.DEFAULT_GUI_FACTORY;
        String scope = BeanDefinition.SCOPE_PROTOTYPE;

        if (element.hasAttribute(SERVICE_ATTRIBUTE))
            dataSource = element.getAttribute(SERVICE_ATTRIBUTE);

        if (element.hasAttribute(PAGINATOR))
            paginator = element.getAttribute(PAGINATOR);

        if (element.hasAttribute(ACTIONS))
            actions = element.getAttribute(ACTIONS);

        if (element.hasAttribute(GUI_FACTORY))
            guiFactory = element.getAttribute(GUI_FACTORY);

        if (element.hasAttribute(EDITOR))
            editor = element.getAttribute(EDITOR);

        if (element.hasAttribute(SCOPE))
            scope = element.getAttribute(SCOPE);

        // create ListTableModel
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(ListTableModel.class);
        bdb.setScope(scope);
        bdb.addPropertyValue("modelClass", entity);
        NodeList nl = element.getElementsByTagNameNS(element.getNamespaceURI(), COLUMNS);

        if (nl.getLength() > 0) {
            List columns = parserContext.getDelegate().parseListElement((Element) nl.item(0),
                    bdb.getRawBeanDefinition());
            bdb.addPropertyValue(COLUMNS, columns);
        }
        registerBeanDefinition(element, parserContext, tableModelBeanName, bdb);

        // create PageableTable
        bdb = BeanDefinitionBuilder.genericBeanDefinition(PageableTable.class);
        bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        bdb.addPropertyReference(DATA_SOURCE, dataSource);
        bdb.addPropertyReference(PAGINATOR_VIEW, paginator);
        bdb.addPropertyReference(TABLE_MODEL, tableModelBeanName);
        bdb.addPropertyValue(NAME, pageableTableBeanName);

        if (element.hasAttribute(TABLE_SERVICE))
            bdb.addPropertyReference(Conventions.attributeNameToPropertyName(TABLE_SERVICE),
                    element.getAttribute(TABLE_SERVICE));

        if (element.hasAttribute(FILTER))
            bdb.addPropertyReference(FILTER, element.getAttribute(FILTER));

        if (element.hasAttribute(SHOW_MENU))
            bdb.addPropertyValue(Conventions.attributeNameToPropertyName(SHOW_MENU),
                    element.getAttribute(SHOW_MENU));

        if (element.hasAttribute(MESSAGE_SOURCE))
            bdb.addPropertyReference(MESSAGE_SOURCE, element.getAttribute(MESSAGE_SOURCE));

        registerBeanDefinition(element, parserContext, pageableTableBeanName, bdb);

        // create TablePanel
        String tablePanelClassName = "org.jdal.swing.table.TablePanel";
        if (element.hasAttribute(TABLE_PANEL_CLASS))
            tablePanelClassName = element.getAttribute(TABLE_PANEL_CLASS);

        bdb = BeanDefinitionBuilder.genericBeanDefinition(tablePanelClassName);
        bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
        bdb.addPropertyReference(TABLE, pageableTableBeanName);
        bdb.addPropertyReference(GUI_FACTORY, guiFactory);
        bdb.addPropertyValue(EDITOR_NAME, editor);
        bdb.addPropertyReference(PERSISTENT_SERVICE, dataSource);

        if (element.hasAttribute(FILTER_VIEW))
            bdb.addPropertyReference(Conventions.attributeNameToPropertyName(FILTER_VIEW),
                    element.getAttribute(FILTER_VIEW));

        if (!element.hasAttribute(USE_ACTIONS) || "true".equals(element.getAttribute(USE_ACTIONS)))
            bdb.addPropertyReference(ACTIONS, actions);

        registerBeanDefinition(element, parserContext, tablePanelBeanName, bdb);

        parserContext.popAndRegisterContainingComponent();

        return null;
    }

    /**
     * Register BeanDefinition and apply default bean attributes.
     * @param element
     * @param parserContext
     * @param beanName
     * @param bdb
     */
    private void registerBeanDefinition(Element element, ParserContext parserContext, String beanName,
            BeanDefinitionBuilder bdb) {
        AbstractBeanDefinition bd = bdb.getBeanDefinition();
        parserContext.getDelegate().parseBeanDefinitionAttributes(element, beanName, null, bd);
        BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), beanName);
        parserContext.registerBeanComponent(bcd);
    }

}