xmlconfigurator.java

来自「JGRoups源码」· Java 代码 · 共 533 行 · 第 1/2 页

JAVA
533
字号
// $Id: XmlConfigurator.java,v 1.17 2006/10/09 13:35:31 belaban Exp $package org.jgroups.conf;/** * Uses XML to configure a protocol stack * @author Filip Hanik (<a href="mailto:filip@filip.net">filip@filip.net) * @version 1.0 */import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.w3c.dom.*;import org.jgroups.stack.Configurator;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.util.*;public class XmlConfigurator implements ProtocolStackConfigurator {    public static final String ATTR_NAME="name";    public static final String ATTR_VALUE="value";    public static final String ATTR_INHERIT="inherit";    public static final String ELMT_PROT_OVERRIDE="protocol-override";    public static final String ELMT_PROT="protocol";    public static final String ELMT_PROT_NAME="protocol-name";    public static final String ELMT_CLASS="class-name";    public static final String ELMT_DESCRIPTION="description";    public static final String ELMT_PROT_PARAMS="protocol-params";    private final ArrayList mProtocolStack=new ArrayList();    private final String mStackName;    protected static final Log log=LogFactory.getLog(XmlConfigurator.class);    protected XmlConfigurator(String stackName, ProtocolData[] protocols) {        mStackName=stackName;        for(int i=0; i < protocols.length; i++)            mProtocolStack.add(protocols[i]);    }    protected XmlConfigurator(String stackName) {        this(stackName, new ProtocolData[0]);    }    public static XmlConfigurator getInstance(URL url) throws java.io.IOException {        return getInstance(url.openStream());    }    public static XmlConfigurator getInstanceOldFormat(URL url) throws java.io.IOException {        return getInstanceOldFormat(url.openStream());    }    public static XmlConfigurator getInstance(InputStream stream) throws java.io.IOException {        return parse(stream);    }    public static XmlConfigurator getInstanceOldFormat(InputStream stream) throws java.io.IOException {        return parseOldFormat(stream);    }    public static XmlConfigurator getInstance(Element el) throws java.io.IOException {        return parse(el);    }    /**     *     * @param convert If false: print old plain output, else print new XML format     * @return String with protocol stack in specified format     */    public String getProtocolStackString(boolean convert) {        StringBuffer buf=new StringBuffer();        Iterator it=mProtocolStack.iterator();        if(convert) buf.append("<config>\n");        while(it.hasNext()) {            ProtocolData d=(ProtocolData)it.next();            if(convert) buf.append("    <");            buf.append(d.getProtocolString(convert));            if(convert) buf.append("/>");            if(it.hasNext()) {                if(convert)                    buf.append('\n');                else                    buf.append(':');            }        }        if(convert) buf.append("\n</config>");        return buf.toString();    }    public String getProtocolStackString() {        return getProtocolStackString(false);    }    public ProtocolData[] getProtocolStack() {        return (ProtocolData[])mProtocolStack.toArray(new ProtocolData[mProtocolStack.size()]);    }    public String getName() {        return mStackName;    }    public void override(ProtocolData data)            throws IOException {        int index=mProtocolStack.indexOf(data);        if(index < 0) throw new IOException("You can not override a protocol that doesn't exist");        ProtocolData source=(ProtocolData)mProtocolStack.get(index);        source.override(data.getParametersAsArray());    }    public void add(ProtocolData data) {        mProtocolStack.add(data);    }    protected static XmlConfigurator parseOldFormat(InputStream stream) throws java.io.IOException {        XmlConfigurator configurator=null;        try {            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();            factory.setValidating(false); //for now            DocumentBuilder builder=factory.newDocumentBuilder();            Document document=builder.parse(stream);            Element root=(Element)document.getElementsByTagName("protocol-stack").item(0);            root.normalize();            //print("",new PrintWriter(System.out),root);            String stackname=root.getAttribute(ATTR_NAME);            String inherit=root.getAttribute(ATTR_INHERIT);            boolean isinherited=(inherit != null && inherit.length() > 0);            NodeList protocol_list=document.getElementsByTagName(isinherited ? ELMT_PROT_OVERRIDE : ELMT_PROT);            Vector v=new Vector();            for(int i=0; i < protocol_list.getLength(); i++) {                if(protocol_list.item(i).getNodeType() == Node.ELEMENT_NODE) {                    v.addElement(parseProtocolData(protocol_list.item(i)));                }            }            ProtocolData[] protocols=new ProtocolData[v.size()];            v.copyInto(protocols);            if(isinherited) {                URL inheritURL=new URL(inherit);                configurator=XmlConfigurator.getInstance(inheritURL);                for(int i=0; i < protocols.length; i++)                    configurator.override(protocols[i]);            }            else {                configurator=new XmlConfigurator(stackname, protocols);            }        }        catch(Exception x) {            if(x instanceof java.io.IOException)                throw (java.io.IOException)x;            else {                IOException tmp=new IOException();                tmp.initCause(x);                throw tmp;            }        }        return configurator;    }    protected static XmlConfigurator parse(InputStream stream) throws java.io.IOException {        /**         * CAUTION: crappy code ahead ! I (bela) am not an XML expert, so the code below is pretty amateurish...         * But it seems to work, and it is executed only on startup, so no perf loss on the critical path.         * If somebody wants to improve this, please be my guest.         */        try {            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();            factory.setValidating(false); //for now            DocumentBuilder builder=factory.newDocumentBuilder();            Document document=builder.parse(stream);            // The root element of the document should be the "config" element,            // but the parser(Element) method checks this so a check is not            // needed here.            Element configElement = document.getDocumentElement();            return parse(configElement);        }        catch(Exception x) {            if(x instanceof java.io.IOException)                throw (java.io.IOException)x;            else {                IOException tmp=new IOException();                tmp.initCause(x);                throw tmp;            }        }    }    protected static XmlConfigurator parse(Element root_element) throws java.io.IOException {        XmlConfigurator configurator=null;        /** LinkedList<ProtocolData> */        LinkedList prot_data=new LinkedList();        /**         * CAUTION: crappy code ahead ! I (bela) am not an XML expert, so the code below is pretty amateurish...         * But it seems to work, and it is executed only on startup, so no perf loss on the critical path.         * If somebody wants to improve this, please be my guest.         */        try {            Node root=root_element;//            NodeList roots=root_element.getChildNodes();//            for(int i =0; i < roots.getLength(); i++) {//                root=roots.item(i);//                if(root.getNodeType() != Node.ELEMENT_NODE)//                    continue;//            }            String root_name=root.getNodeName();            if(!"config".equals(root_name.trim().toLowerCase())) {                log.fatal("XML protocol stack configuration does not start with a '<config>' element; " +                        "maybe the XML configuration needs to be converted to the new format ?\n" +                        "use 'java org.jgroups.conf.XmlConfigurator <old XML file> -new_format' to do so");                throw new IOException("invalid XML configuration");            }            NodeList prots=root.getChildNodes();            for(int i=0; i < prots.getLength(); i++) {                Node node = prots.item(i);                if( node.getNodeType() != Node.ELEMENT_NODE )                    continue;                Element tag = (Element) node;                String protocol = tag.getTagName();                // System.out.println("protocol: " + protocol);                LinkedList tmp=new LinkedList();                NamedNodeMap attrs = tag.getAttributes();                int attrLength = attrs.getLength();                for(int a = 0; a < attrLength; a ++) {                    Attr attr = (Attr) attrs.item(a);                    String name = attr.getName();                    String value = attr.getValue();                    // System.out.println("    name=" + name + ", value=" + value);                    tmp.add(new ProtocolParameter(name, value));                }                ProtocolParameter[] params=new ProtocolParameter[tmp.size()];                for(int j=0; j < tmp.size(); j++)                    params[j]=(ProtocolParameter)tmp.get(j);                ProtocolData data=new ProtocolData(protocol, "bla", "" + protocol, params);                prot_data.add(data);            }            ProtocolData[] data=new ProtocolData[(prot_data.size())];            for(int k=0; k < prot_data.size(); k++)                data[k]=(ProtocolData)prot_data.get(k);            configurator=new XmlConfigurator("bla", data);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?