org.tinygroup.config.util.ConfigurationUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.tinygroup.config.util.ConfigurationUtil.java

Source

/**
 *  Copyright (c) 1997-2013, www.tinygroup.org (luo_guo@icloud.com).
 *
 *  Licensed under the GPL, Version 3.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.gnu.org/licenses/gpl.html
 *
 *  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.tinygroup.config.util;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.tinygroup.commons.io.StreamUtil;
import org.tinygroup.commons.tools.CollectionUtil;
import org.tinygroup.config.ConfigurationManager;
import org.tinygroup.config.impl.ConfigurationManagerImpl;
import org.tinygroup.parser.filter.NameFilter;
import org.tinygroup.vfs.FileObject;
import org.tinygroup.xmlparser.node.XmlNode;
import org.tinygroup.xmlparser.parser.XmlStringParser;

/**
 * ????
 * 
 * @author luoguo
 */
public final class ConfigurationUtil {

    private static ConfigurationManager configurationManager = new ConfigurationManagerImpl();

    // private static Logger logger =
    // LoggerFactory.getLogger(ConfigurationUtil.class);

    private ConfigurationUtil() {
    }

    public static ConfigurationManager getConfigurationManager() {
        return configurationManager;
    }

    /**
     * ??
     * 
     * @param applicationNode
     * @param componentNode
     * @param attributeName
     * @return
     */
    public static String getPropertyName(XmlNode applicationNode, XmlNode componentNode, String attributeName) {
        String value = null;
        checkNodeName(applicationNode, componentNode);
        if (applicationNode != null) {
            value = applicationNode.getAttribute(attributeName);
        }
        if (value == null && componentNode != null) {
            value = componentNode.getAttribute(attributeName);
        }
        return value;
    }

    /**
     * ??<br>
     * ?Null""
     * 
     * @param applicationNode
     * @param componentNode
     * @param attributeName
     * @param defaultValue
     * @return
     */
    public static String getPropertyName(XmlNode applicationNode, XmlNode componentNode, String attributeName,
            String defaultValue) {
        String value = getPropertyName(applicationNode, componentNode, attributeName);
        if (value == null || value.trim().length() == 0) {
            value = defaultValue;
        }
        return value;
    }

    private static void checkNodeName(XmlNode applicationNode, XmlNode componentNode) {
        if (applicationNode == null || componentNode == null) {// 
            return;
        }
        String applicationNodeName = applicationNode.getNodeName();
        String componentNodeName = componentNode.getNodeName();
        if (applicationNodeName != null && componentNodeName != null
                && !applicationNodeName.equals(componentNodeName)) {
            throw new RuntimeException(
                    applicationNodeName + "" + componentNodeName + "????");
        }
    }

    /**
     * ???
     * 
     * @param applicationNode
     * @param componentNode
     * @param keyPropertyName
     * @return
     */
    public static List<XmlNode> combineSubList(XmlNode applicationNode, XmlNode componentNode, String nodeName,
            String keyPropertyName) {
        checkNodeName(applicationNode, componentNode);
        List<XmlNode> result = new ArrayList<XmlNode>();
        if (applicationNode == null && componentNode == null) {
            return result;
        }
        List<XmlNode> applicationNodeList = getNodeList(applicationNode, nodeName);
        List<XmlNode> componentNodeList = getNodeList(componentNode, nodeName);
        if (componentNodeList.isEmpty()) {// ?
            result.addAll(applicationNodeList);
            return result;
        }
        if (applicationNodeList.isEmpty()) {// ?
            result.addAll(componentNodeList);
            return result;
        }
        combineSubList(keyPropertyName, result, applicationNodeList, componentNodeList);
        return result;
    }

    private static List<XmlNode> getNodeList(XmlNode node, String nodeName) {
        List<XmlNode> nodeList = new ArrayList<XmlNode>();
        if (node != null) {
            nodeList = node.getSubNodes(nodeName);
        }
        return nodeList;
    }

    private static void combineSubList(String keyPropertyName, List<XmlNode> result,
            List<XmlNode> applicationNodeList, List<XmlNode> componentNodeList) {
        Map<String, XmlNode> appConfigMap = nodeListToMap(applicationNodeList, keyPropertyName);
        Map<String, XmlNode> compConfigMap = nodeListToMap(componentNodeList, keyPropertyName);
        for (String key : appConfigMap.keySet()) {
            XmlNode compNode = compConfigMap.get(key);
            XmlNode appNode = appConfigMap.get(key);
            if (compNode == null) {
                result.add(appNode);
            } else {// ?
                result.add(combine(appNode, compNode));
            }
        }
        for (String key : compConfigMap.keySet()) {
            // ???
            XmlNode appNode = appConfigMap.get(key);
            // ???
            if (appNode == null) {
                result.add(compConfigMap.get(key));
            }
        }
    }

    /**
     * ??
     * 
     * @param applicationNode
     * @param componentNode
     * @return
     */
    public static XmlNode combineXmlNode(XmlNode applicationNode, XmlNode componentNode) {
        checkNodeName(applicationNode, componentNode);
        if (applicationNode == null && componentNode == null) {
            return null;
        }
        XmlNode result = null;
        if (applicationNode != null && componentNode == null) {
            result = applicationNode;
        } else if (applicationNode == null && componentNode != null) {
            result = componentNode;
        } else {
            result = combine(applicationNode, componentNode);
        }
        return result;
    }

    private static XmlNode combine(XmlNode appNode, XmlNode compNode) {
        XmlNode result = new XmlNode(appNode.getNodeName());
        result.setAttribute(compNode.getAttributes());
        result.setAttribute(appNode.getAttributes());
        if (!CollectionUtil.isEmpty(compNode.getSubNodes())) {
            result.addAll(compNode.getSubNodes());
        }
        if (!CollectionUtil.isEmpty(appNode.getSubNodes())) {
            result.addAll(appNode.getSubNodes());
        }
        return result;
    }

    private static Map<String, XmlNode> nodeListToMap(List<XmlNode> subNodes, String keyPropertyName) {
        Map<String, XmlNode> nodeMap = new HashMap<String, XmlNode>();
        for (XmlNode node : subNodes) {
            String value = node.getAttribute(keyPropertyName);
            nodeMap.put(value, node);
        }
        return nodeMap;
    }

    /**
     * ??
     * 
     * @param applicationNode
     * @param componentNode
     * @return
     */
    public static List<XmlNode> combineSubList(XmlNode applicationNode, XmlNode componentNode) {

        checkNodeName(applicationNode, componentNode);
        List<XmlNode> result = new ArrayList<XmlNode>();
        if (applicationNode == null && componentNode == null) {
            return result;
        }
        if (componentNode != null && componentNode.getSubNodes() != null) {
            result.addAll(componentNode.getSubNodes());
        }
        if (applicationNode != null && applicationNode.getSubNodes() != null) {
            result.addAll(applicationNode.getSubNodes());
        }
        return result;
    }

    /**
     * ??
     * 
     * @param nodeName
     * @param applicationNode
     * @param componentNode
     * @return
     */
    public static List<XmlNode> combineSubList(String nodeName, XmlNode applicationNode, XmlNode componentNode) {
        checkNodeName(applicationNode, componentNode);
        List<XmlNode> result = new ArrayList<XmlNode>();
        if (applicationNode == null && componentNode == null) {
            return result;
        }
        if (componentNode != null && componentNode.getSubNodes(nodeName) != null) {
            result.addAll(componentNode.getSubNodes(nodeName));
        }
        if (applicationNode != null && applicationNode.getSubNodes(nodeName) != null) {
            result.addAll(applicationNode.getSubNodes(nodeName));
        }
        return result;
    }

    /**
     * ??
     * 
     * @param nodeName
     * @param applicationNode
     * @param componentNode
     * @return
     */
    public static List<XmlNode> combineFindNodeList(String nodeName, XmlNode applicationNode,
            XmlNode componentNode) {
        checkNodeName(applicationNode, componentNode);
        List<XmlNode> result = new ArrayList<XmlNode>();
        if (applicationNode == null && componentNode == null) {
            return result;
        }
        if (componentNode != null) {
            NameFilter<XmlNode> nameFilter = new NameFilter<XmlNode>(componentNode);
            List<XmlNode> nodes = nameFilter.findNodeList(nodeName);
            if (nodes != null) {
                result.addAll(nodes);
            }
        }
        if (applicationNode != null) {
            NameFilter<XmlNode> nameFilter = new NameFilter<XmlNode>(applicationNode);
            List<XmlNode> nodes = nameFilter.findNodeList(nodeName);
            if (nodes != null) {
                result.addAll(nodes);
            }
        }
        return result;
    }

    public static String replace(String content, String name, String value) {

        Pattern pattern = Pattern.compile("[{]" + name + "[}]");
        Matcher matcher = pattern.matcher(content);
        StringBuilder buf = new StringBuilder();
        int curpos = 0;
        while (matcher.find()) {
            buf.append(content.substring(curpos, matcher.start()));
            curpos = matcher.end();
            buf.append(value);
            continue;
        }
        buf.append(content.substring(curpos));
        return buf.toString();
    }

    public static XmlNode parseXmlFromFileObject(FileObject fileObject) throws IOException {
        String config = StreamUtil.readText(fileObject.getInputStream(), "UTF-8", true);
        return new XmlStringParser().parse(config).getRoot();
    }

    /**
     * ???
     * 
     * @param value
     * @param proMap
     * @return
     */
    public static String replace(String value, Map<String, String> proMap) {
        Pattern pattern = Pattern.compile("(\\{[^\\}]*\\})");
        Matcher matcher = pattern.matcher(value);
        int curpos = 0;
        StringBuilder buf = new StringBuilder();
        while (matcher.find()) {
            buf.append(value.substring(curpos, matcher.start()));
            curpos = matcher.end();
            String var = value.substring(matcher.start(), curpos);
            buf.append(proMap.get(StringUtils.substring(var, 1, var.length() - 1)));
            continue;
        }
        buf.append(value.substring(curpos));
        return buf.toString();
    }
}