com.wabacus.config.xml.XmlAssistant.java Source code

Java tutorial

Introduction

Here is the source code for com.wabacus.config.xml.XmlAssistant.java

Source

/* 
 * Copyright (C) 2010---2014 (wuweixing)<349446658@qq.com>
 * 
 * This file is part of Wabacus 
 * 
 * Wabacus is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.wabacus.config.xml;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import com.wabacus.config.Config;
import com.wabacus.config.ConfigLoadManager;
import com.wabacus.exception.WabacusConfigLoadingException;
import com.wabacus.system.assistant.WabacusAssistant;
import com.wabacus.util.Consts;
import com.wabacus.util.Tools;

public class XmlAssistant {
    private final static XmlAssistant instance = new XmlAssistant();

    private XmlAssistant() {
    }

    public static XmlAssistant getInstance() {
        return instance;
    }

    public Document loadXmlDocument(String configfilepath) {
        if (Tools.isDefineKey("classpath", Config.configpath)) {
            if (configfilepath.startsWith("/")) {
                configfilepath = configfilepath.substring(1);
            }
            BufferedInputStream bis = null;
            try {
                bis = new BufferedInputStream(ConfigLoadManager.currentDynClassLoader.getResourceAsStream(
                        WabacusAssistant.getInstance().getRealFilePath(Config.configpath, configfilepath)));
                Document doc = loadXmlDocument(bis);
                return doc;
            } catch (DocumentException e) {
                throw new WabacusConfigLoadingException("?" + configfilepath
                        + "?????XML", e);
            } finally {
                try {
                    if (bis != null)
                        bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            return loadXmlDocument(
                    new File(WabacusAssistant.getInstance().getRealFilePath(Config.configpath, configfilepath)));
        }
    }

    public Document loadXmlDocument(File file) {
        BufferedInputStream bis = null;
        try {
            SAXReader saxReader = new SAXReader();
            Map map = new HashMap();
            map.put(Consts.XML_NAMESPACE_KEY, Consts.XML_NAMESPACE_VALUE);
            saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
            bis = new BufferedInputStream(new FileInputStream(file));
            //            ConfigLoadAssistant.getInstance().addOpenedInputFileObj(inputstreamKey,bis);//??
            Document doc = saxReader.read(bis);
            return doc;
        } catch (FileNotFoundException fnfe) {
            throw new WabacusConfigLoadingException(
                    "?" + file.getName() + "?", fnfe);
        } catch (DocumentException de) {
            throw new WabacusConfigLoadingException(
                    "?" + file.getName() + "??XML?", de);
        } finally {
            try {
                if (bis != null)
                    bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public Document loadXmlDocument(InputStream in) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        Map map = new HashMap();
        map.put(Consts.XML_NAMESPACE_KEY, Consts.XML_NAMESPACE_VALUE);
        saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
        return saxReader.read(new BufferedInputStream(in));
    }

    public List getElementsByName(Element parent, String nodename) {
        if (parent == null || nodename == null || nodename.trim().equals(""))
            return null;
        return parent.selectNodes(Consts.XML_NAMESPACE_KEY + ":" + nodename);
    }

    public Element getSingleElementByName(Element parent, String nodename) {
        if (parent == null || nodename == null || nodename.trim().equals(""))
            return null;
        List lstChildren = parent.selectNodes(Consts.XML_NAMESPACE_KEY + ":" + nodename);
        if (lstChildren == null || lstChildren.size() == 0)
            return null;
        Element ele = (Element) lstChildren.get(0);
        if (ele == null)
            return null;
        if (!isLegalNamespaceElement(ele)) {
            throw new WabacusConfigLoadingException(
                    "namespace" + ele.getNamespacePrefix() + "???");
        }
        return ele;
    }

    public String addNamespaceToXpath(String xpath) {
        if (xpath == null || xpath.trim().equals(""))
            return xpath;
        if (Consts.XML_NAMESPACE_KEY == null || Consts.XML_NAMESPACE_KEY.trim().equals(""))
            return xpath;
        StringBuffer resultBuf = new StringBuffer();
        for (int i = 0; i < xpath.length(); i++) {
            if (xpath.charAt(i) == '/') {
                resultBuf.append("/");
                for (i = i + 1; i < xpath.length(); i++) {
                    if (xpath.charAt(i) == ' ')
                        continue;
                    if (xpath.charAt(i) == '/') {
                        resultBuf.append("/");
                    } else {
                        break;
                    }
                }
                if (i < xpath.length()) {
                    resultBuf.append(Consts.XML_NAMESPACE_KEY).append(":");
                    resultBuf.append(xpath.charAt(i));
                }
            } else {
                resultBuf.append(xpath.charAt(i));
            }
        }
        return resultBuf.toString();
    }

    public boolean isLegalNamespaceElement(Element element) {
        if (element == null)
            return false;
        String prex = element.getNamespacePrefix();
        if (prex == null)
            return false;
        prex = prex.trim();
        if (!prex.equals("") && !prex.equals("wx")) {
            return false;
        }
        return true;
    }

    public void saveDocumentToXmlFile(String configfilepath, Document doc) throws IOException {
        XMLWriter xwriter = null;
        try {
            File f = null;
            if (Tools.isDefineKey("classpath", Config.configpath)) {
                f = WabacusAssistant.getInstance().getFileObjByPathInClasspath(
                        Tools.getRealKeyByDefine("classpath", Config.configpath), configfilepath);
            } else {
                f = new File(WabacusAssistant.getInstance().getRealFilePath(Config.configpath, configfilepath));
            }
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
            xwriter = new XMLWriter(new OutputStreamWriter(new FileOutputStream(f, false), "UTF-8"));
            xwriter.write(doc);
        } finally {
            if (xwriter != null)
                xwriter.close();
        }
    }

    public XmlElementBean parseXmlValueToXmlBean(Element element) {
        if (element == null)
            return null;
        if (!isLegalNamespaceElement(element)) {
            throw new WabacusConfigLoadingException("namespace" + element.getNamespacePrefix() + "??");
        }
        XmlElementBean xebean = new XmlElementBean(element.getName());
        String tagContent = element.getText();
        xebean.setContent(tagContent == null ? "" : tagContent.trim());
        Iterator itAttributes = element.attributeIterator();
        Map<String, String> mProps = new HashMap<String, String>();
        xebean.setMProperties(mProps);
        Attribute eleProps;
        while (itAttributes.hasNext()) {
            eleProps = (Attribute) itAttributes.next();
            mProps.put(eleProps.getName(), eleProps.getValue());
        }
        List<XmlElementBean> lstChildren = null;
        List lstChildElements = element.elements();
        if (lstChildElements != null && lstChildElements.size() > 0) {
            lstChildren = new ArrayList<XmlElementBean>();
            XmlElementBean eleTmp;
            for (Object eleObj : lstChildElements) {
                if (eleObj == null)
                    continue;
                eleTmp = parseXmlValueToXmlBean((Element) eleObj);
                if (eleTmp == null)
                    continue;
                eleTmp.setParentElement(xebean);
                lstChildren.add(eleTmp);
            }
            xebean.setLstChildElements(lstChildren);
        }
        return xebean;
    }

    public void mergeXmlElementBeans(XmlElementBean xebean1, XmlElementBean xebean2) {
        if (xebean1 == null || xebean2 == null)
            return;
        Map<String, String> mAttributes2 = xebean2.attributes();
        if (mAttributes2 != null && mAttributes2.size() > 0) {
            for (Entry<String, String> entryAtt2 : mAttributes2.entrySet()) {
                if (entryAtt2.getKey() == null || entryAtt2.getValue() == null)
                    continue;
                if (xebean1.attributeValue(entryAtt2.getKey()) == null) {
                    xebean1.setAttributeValue(entryAtt2.getKey(), entryAtt2.getValue());
                }
            }
        }
        if ((xebean1.getContent() == null || xebean1.getContent().trim().equals(""))
                && (xebean1.getLstChildElements() == null || xebean1.getLstChildElements().size() == 0)) {//xebean1???
            xebean1.setContent(xebean2.getContent());
            xebean1.setLstChildElements(xebean2.getLstChildElementsClone(xebean1));
        }
    }
}