/* * 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.vaadin.beans; import java.util.HashMap; import java.util.Map; import org.jdal.vaadin.ui.ApplicationContextGuiFactory; import org.jdal.vaadin.ui.table.AddAction; import org.jdal.vaadin.ui.table.ClearFilterAction; import org.jdal.vaadin.ui.table.FindAction; import org.jdal.vaadin.ui.table.RefreshAction; import org.jdal.vaadin.ui.table.RemoveAction; import org.jdal.vaadin.ui.table.VaadinPaginator; 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.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.w3c.dom.Element; /** * @author Jose Luis Martin - (jlm@joseluismartin.info) * */ public class DefaultsBeanDefinitionParser implements BeanDefinitionParser { public static final String PAGINATOR_VIEW_BEAN_NAME = "paginator"; 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"; /** * {@inheritDoc} */ public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); CompositeComponentDefinition ccd = new CompositeComponentDefinition("jdal-vaadin", source); ccd.addNestedComponent(registerPropertyEditors(element, parserContext)); ccd.addNestedComponent(registerPaginatorView(element, parserContext)); ccd.addNestedComponent(registerDefaultTableActions(element, parserContext)); ccd.addNestedComponent(registerDefaultGuiFactory(element, parserContext)); parserContext.getReaderContext().fireComponentRegistered(ccd); return null; } /** * Register a BeanComponentDefinition * @param element * @param parserContext * @param BeanComponentDefinition */ 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(VaadinPaginator.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; } /** * Register default CustomEditorConfigurer * @return default CustomEditorComfigurer ComponentDefinition */ private ComponentDefinition registerPropertyEditors(Element element, ParserContext parserContext) { BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition( CustomEditorConfigurer.class); Map<String, String> map = new HashMap<String, String>(); map.put("com.vaadin.server.Resource", "org.jdal.vaadin.beans.VaadinResourcePropertyEditor"); 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(RefreshAction.class, parserContext)); actions.add(createBeanDefinition(RemoveAction.class, parserContext)); actions.add(createBeanDefinition(FindAction.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; } }