com.bstek.dorado.view.loader.PackagesConfigParser.java Source code

Java tutorial

Introduction

Here is the source code for com.bstek.dorado.view.loader.PackagesConfigParser.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.view.loader;

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

import net.sf.cglib.beans.BeanMap;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.bstek.dorado.config.ParseContext;
import com.bstek.dorado.config.xml.ConfigurableDispatchableXmlParser;
import com.bstek.dorado.util.xml.DomUtils;

/**
 * ????
 * 
 * @author Benny Bao (mailto:benny.bao@bstek.com)
 * @since Sep 23, 2008
 */
public class PackagesConfigParser extends ConfigurableDispatchableXmlParser {

    @Override
    @SuppressWarnings("unchecked")
    protected Object doParse(Node node, ParseContext context) throws Exception {
        PackagesConfig packagesConfig = ((PackagesConfigParseContext) context).getPackagesConfig();

        Element element = (Element) node;
        Map<String, Object> properties = parseProperties(element, context);
        ((Map<String, Object>) BeanMap.create(packagesConfig)).putAll(properties);

        Element patternsElem = DomUtils.getChildByTagName(element, "Patterns");
        if (patternsElem != null) {
            Map<String, Pattern> patterns = packagesConfig.getPatterns();
            List<?> list = dispatchChildElements(patternsElem, context);
            for (Object e : list) {
                Pattern pattern = (Pattern) e;
                patterns.put(pattern.getName(), pattern);
            }
        }

        Element packagesElem = DomUtils.getChildByTagName(element, "Packages");
        if (packagesElem != null) {
            dispatchChildElements(packagesElem, context);
        }

        neatenPackagesConfig(packagesConfig);
        return null;
    }

    protected void neatenPackagesConfig(PackagesConfig packagesConfig) throws Exception {
        Map<String, Pattern> patterns = packagesConfig.getPatterns();
        Map<String, Pattern> patternMap = new HashMap<String, Pattern>();
        for (Package pkg : packagesConfig.getPackages().values()) {
            Pattern pattern = null;
            String patternName = pkg.getPattern(), baseUri = pkg.getBaseUri(), patternBaseUri = null;
            if (StringUtils.isNotEmpty(patternName)) {
                pattern = patterns.get(patternName);
                if (pattern != null) {
                    patternBaseUri = pattern.getBaseUri();

                    if (pattern != null && baseUri != null && !baseUri.equals(patternBaseUri)) {
                        String key = patternName + '$' + baseUri;
                        Pattern pattern2 = patternMap.get(key);
                        if (pattern2 == null) {
                            String newPatternName;
                            int i = 2;
                            do {
                                newPatternName = pattern.getName() + '$' + i;
                                i++;
                            } while (patterns.containsKey(newPatternName));

                            pattern2 = new Pattern(newPatternName);
                            PropertyUtils.copyProperties(pattern2, pattern);
                            pattern2.setBaseUri(baseUri);
                            patternMap.put(key, pattern2);
                            patterns.put(newPatternName, pattern2);
                        }
                        pkg.setPattern(pattern2.getName());
                    }
                }
            }
        }
    }
}