com.bstek.dorado.idesupport.initializer.ViewConfigRuleTemplateInitializer.java Source code

Java tutorial

Introduction

Here is the source code for com.bstek.dorado.idesupport.initializer.ViewConfigRuleTemplateInitializer.java

Source

/*
 * This file is part of Dorado 7.x (http://dorado7.bsdn.org).
 * 
 * Copyright (c) 2002-2012 BSTEK Corp. All rights reserved.
 * 
 * This file is dual-licensed under the AGPLv3 (http://www.gnu.org/licenses/agpl-3.0.html) 
 * and BSDN commercial (http://www.bsdn.org/licenses) licenses.
 * 
 * If you are unsure which license is appropriate for your use, please contact the sales department
 * at http://www.bstek.com/contact.
 */

package com.bstek.dorado.idesupport.initializer;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.bstek.dorado.common.ClientType;
import com.bstek.dorado.idesupport.RuleTemplateBuilder;
import com.bstek.dorado.idesupport.RuleTemplateBuilderAware;
import com.bstek.dorado.idesupport.RuleTemplateManager;
import com.bstek.dorado.idesupport.model.ClientEvent;
import com.bstek.dorado.idesupport.template.AutoChildTemplate;
import com.bstek.dorado.idesupport.template.AutoPropertyTemplate;
import com.bstek.dorado.idesupport.template.AutoRuleTemplate;
import com.bstek.dorado.idesupport.template.LazyReferenceTemplate;
import com.bstek.dorado.idesupport.template.PropertyTemplate;
import com.bstek.dorado.idesupport.template.RuleTemplate;
import com.bstek.dorado.view.config.definition.ComponentDefinition;
import com.bstek.dorado.view.registry.AssembledComponentTypeRegisterInfo;
import com.bstek.dorado.view.registry.ComponentTypeRegisterInfo;
import com.bstek.dorado.view.registry.ComponentTypeRegistry;
import com.bstek.dorado.view.registry.LayoutTypeRegisterInfo;
import com.bstek.dorado.view.registry.LayoutTypeRegistry;
import com.bstek.dorado.view.registry.VirtualEventDescriptor;
import com.bstek.dorado.view.registry.VirtualPropertyAvialableAt;
import com.bstek.dorado.view.registry.VirtualPropertyDescriptor;
import com.bstek.dorado.view.widget.Component;
import com.bstek.dorado.view.widget.Control;

/**
 * @author Benny Bao (mailto:benny.bao@bstek.com)
 * @since 2011-12-9
 */
public class ViewConfigRuleTemplateInitializer implements RuleTemplateInitializer, RuleTemplateBuilderAware {
    private static final int DEFAULT_INVISIBLE_COMPONENT_CLIENT_TYPE = ClientType
            .parseClientTypes(new int[] { ClientType.DESKTOP, ClientType.TOUCH });

    private LayoutTypeRegistry layoutTypeRegistry;
    private ComponentTypeRegistry componentTypeRegistry;
    private RuleTemplateBuilder ruleTemplateBuilder;

    public void setRuleTemplateBuilder(RuleTemplateBuilder ruleTemplateBuilder) {
        this.ruleTemplateBuilder = ruleTemplateBuilder;
    }

    public void setLayoutTypeRegistry(LayoutTypeRegistry layoutTypeRegistry) {
        this.layoutTypeRegistry = layoutTypeRegistry;
    }

    public void setComponentTypeRegistry(ComponentTypeRegistry componentTypeRegistry) {
        this.componentTypeRegistry = componentTypeRegistry;
    }

    public void initRuleTemplate(RuleTemplate ruleTemplate, InitializerContext initializerContext)
            throws Exception {
        RuleTemplateManager ruleTemplateManager = initializerContext.getRuleTemplateManager();

        int sortFactor = 1000;
        RuleTemplate layoutHolderTemplate = ruleTemplateManager.getRuleTemplate("LayoutHolder");
        for (LayoutTypeRegisterInfo registerInfo : layoutTypeRegistry.getRegisterInfos()) {
            String type = registerInfo.getType();
            RuleTemplate layoutRuleTemplate = new RuleTemplate(StringUtils.capitalize(type) + "Layout");
            layoutRuleTemplate.setNodeName(type);
            if (registerInfo.getClassType() != null) {
                layoutRuleTemplate.setType(registerInfo.getClassType().getName());
            }

            if (registerInfo.getClientTypes() != 0) {
                layoutRuleTemplate.setClientTypes(registerInfo.getClientTypes());
            }

            layoutRuleTemplate.setSortFactor(++sortFactor);
            ruleTemplateManager.addRuleTemplate(layoutRuleTemplate);
            layoutHolderTemplate.addChild(new AutoChildTemplate(type, layoutRuleTemplate, null));

            RuleTemplate layoutConstraintRuleTemplate = new RuleTemplate(
                    StringUtils.capitalize(type) + "LayoutConstraint");
            layoutConstraintRuleTemplate.setGlobal(true);
            if (registerInfo.getConstraintClassType() != null) {
                layoutConstraintRuleTemplate.setType(registerInfo.getConstraintClassType().getName());
            }
            ruleTemplateManager.addRuleTemplate(layoutConstraintRuleTemplate);
        }

        sortFactor = 2000;
        List<RuleTemplate> componentRuleTemplates = new ArrayList<RuleTemplate>();
        for (ComponentTypeRegisterInfo registerInfo : componentTypeRegistry.getRegisterInfos()) {
            boolean isAssembledComponent = registerInfo instanceof AssembledComponentTypeRegisterInfo;
            String name = registerInfo.getName();
            Class<? extends Component> classType = registerInfo.getClassType();

            boolean isNew = false;
            RuleTemplate componentRuleTemplate = ruleTemplateManager.getRuleTemplate(name);
            if (componentRuleTemplate == null) {
                componentRuleTemplate = new AutoRuleTemplate(name,
                        (isAssembledComponent) ? null : classType.getName());
                componentRuleTemplate.setLabel(name);
                componentRuleTemplate.setGlobal(true);
                componentRuleTemplate.setAutoInitialize(false);
                componentRuleTemplates.add(componentRuleTemplate);
                isNew = true;
            }

            if (!Control.class.isAssignableFrom(classType) && componentRuleTemplate.getClientTypes() == 0) {
                componentRuleTemplate.setClientTypes(DEFAULT_INVISIBLE_COMPONENT_CLIENT_TYPE);
            }

            componentRuleTemplate.setSortFactor(++sortFactor);
            componentRuleTemplate.setCategory(registerInfo.getCategory());

            if (isAssembledComponent) {
                componentRuleTemplate.setScope("public");
                componentRuleTemplate.setNodeName(name);

                AssembledComponentTypeRegisterInfo assembledComponentTypeRegisterInfo = (AssembledComponentTypeRegisterInfo) registerInfo;
                ComponentDefinition superComponentDefinition = assembledComponentTypeRegisterInfo
                        .getSuperComponentDefinition();
                if (superComponentDefinition != null) {
                    String superRuleName = superComponentDefinition.getComponentType();
                    componentRuleTemplate
                            .setParents(new RuleTemplate[] { ruleTemplateManager.getRuleTemplate(superRuleName) });

                    Map<String, VirtualPropertyDescriptor> virtualProperties = assembledComponentTypeRegisterInfo
                            .getVirtualProperties();
                    if (virtualProperties != null) {
                        for (VirtualPropertyDescriptor propertyDescriptor : virtualProperties.values()) {
                            VirtualPropertyAvialableAt avialableAt = propertyDescriptor.getAvialableAt();
                            if (!VirtualPropertyAvialableAt.client.equals(avialableAt)) {
                                PropertyTemplate propertyTemplate = new AutoPropertyTemplate(
                                        propertyDescriptor.getName());
                                if (propertyDescriptor.getType() != null) {
                                    propertyTemplate.setType(propertyDescriptor.getType().getName());
                                }
                                propertyTemplate.setDefaultValue(propertyDescriptor.getDefaultValue());
                                if (StringUtils.isNotEmpty(propertyDescriptor.getReferenceComponentType())) {
                                    propertyTemplate.setReference(new LazyReferenceTemplate(ruleTemplateManager,
                                            propertyDescriptor.getReferenceComponentType(), "id"));
                                }
                                propertyTemplate.setHighlight(1);
                                componentRuleTemplate.addProperty(propertyTemplate);
                            }
                        }
                    }

                    Map<String, VirtualEventDescriptor> virtualEvents = assembledComponentTypeRegisterInfo
                            .getVirtualEvents();
                    if (virtualEvents != null) {
                        for (VirtualEventDescriptor eventDescriptor : virtualEvents.values()) {
                            ClientEvent event = new ClientEvent();
                            event.setName(eventDescriptor.getName());
                            componentRuleTemplate.addClientEvent(event);
                        }
                    }
                } else if (classType != null) {
                    componentRuleTemplate.setType(classType.getName());
                }
            } else if (classType != null) {
                componentRuleTemplate.setType(classType.getName());
            }

            if (isNew) {
                ruleTemplateManager.addRuleTemplate(componentRuleTemplate);
            }
        }

        for (RuleTemplate componentRuleTemplate : componentRuleTemplates) {
            ruleTemplateBuilder.initRuleTemplate(initializerContext, componentRuleTemplate);
        }
    }
}