返回顶部

收藏

使用 Digester 解析 XML 文件的一个实例

更多

这是我2004年一个standalone项目中的连接池配置的代码,使用Digester 解析并自动映射到Bean的方法中。

datasources.xml

<?xml version="1.0" encoding="GBK"?>
<service>   
    <!-- 数据源配置 -->
    <data-sources>
        <data-source name="mcp">  
            <driverClassName>com.microsoft.jdbc.sqlserver.SQLServerDriver</driverClassName>
            <url>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mcpdb2</url>
            <username>noanyone</username>
            <password>noanyonecancomin</password>
            <maxActive>100</maxActive>
            <maxWait>5000</maxWait>
            <defaultAutoCommit>true</defaultAutoCommit>
            <defaultReadOnly>false</defaultReadOnly>
            <validationQuery>SELECT 1</validationQuery>
            <removeAbandoned>true</removeAbandoned>
            <removeAbandonedTimeout>120</removeAbandonedTimeout>
        </data-source>

        <data-source name="WAPDB">
            <driverClassName>com.microsoft.jdbc.sqlserver.SQLServerDriver</driverClassName>
            <url>jdbc:microsoft:sqlserver://59.42.253.131:8921;DatabaseName=wapdb</url>
            <username>sa</username>
            <password>moabc_db2!</password>
            <maxActive>20</maxActive>
            <maxWait>5000</maxWait>
            <defaultAutoCommit>true</defaultAutoCommit>
            <defaultReadOnly>false</defaultReadOnly>
            <validationQuery>SELECT 1</validationQuery>
            <removeAbandoned>true</removeAbandoned>
            <removeAbandonedTimeout>120</removeAbandonedTimeout>
        </data-source>

    </data-sources>

</service>

McpDataSourceFactory.java

/**
 * Created on 2004-4-10 By Winter Lau
 */
package demo;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import javax.sql.DataSource;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.ExtendedBaseRules;
import org.xml.sax.SAXException;

/**
 * 数据源
 * @author Winter Lau
 */
public class McpDataSourceFactory {

    private HashMap dataSources = new HashMap();

    /**
     * 初始化数据源
     * 
     * @param config
     * @param base
     * @return @throws
     *         IOException
     * @throws SAXException
     */
    protected synchronized static McpDataSourceFactory initDataSources(
            String config, String base) throws IOException, SAXException {
        String key = base + "/data-source";
        Digester dig = new Digester();
        dig.setValidating(false);
        dig.setRules(new ExtendedBaseRules());
        dig.addObjectCreate(base, McpDataSourceFactory.class);
        dig.addObjectCreate(key, McpDataSource.class);
        dig.addSetProperties(key);
        dig.addBeanPropertySetter(key + "/?");
        dig.addSetNext(key, "addDataSource");
        return (McpDataSourceFactory) dig.parse(config);
    }
    /**
     * 添加数据源,该方法只由Digester调用
     * @param ds
     */
    public synchronized final void addDataSource(McpDataSource ds) {
        if (ds != null) dataSources.put(ds.getName(), ds);
    }

    public int size() {
        return dataSources.size();
    }
    /**
     * 获取第一个数据源,该方法用于当数据源只有一个的时候获取其实例
     * @return
     */
    public synchronized DataSource getDataSource() {
        Iterator dss = dataSources.values().iterator();
        return dss.hasNext() ? (McpDataSource) dss.next() : null;
    }
    /**
     * 获取指定名称的数据源
     * @param key
     * @return
     */
    public synchronized DataSource getDataSource(Object key) {
        return (McpDataSource) dataSources.get(key);
    }
    /**
     * 获取第一个数据源的连接,该方法用于当数据源只有一个的时候获取其实例
     * @return
     */
    public synchronized Connection getConnection() throws SQLException {
        Iterator dss = dataSources.values().iterator();
        return dss.hasNext() ? ((McpDataSource) dss.next()).getConnection() : null;
    }
    /**
     * 获取指定名称的数据源的连接
     * @param key
     * @return
     */
    public synchronized Connection getConnection(Object key) throws SQLException {
        return ((McpDataSource) dataSources.get(key)).getConnection();
    }
    /**
     * 获取所有的数据源名称
     * @return
     */
    public Set names() {
        return dataSources.keySet();
    }
    /**
     * 获取所有的数据源实例
     * @return
     */
    public Iterator datasources() {
        return dataSources.values().iterator();
    }

    public static void main(String[] args) throws Exception {
        McpDataSourceFactory mdsf = McpDataSourceFactory.initDataSources(
                "datasources.xml", "service/data-sources");
        Iterator names = mdsf.names().iterator();
        while (names.hasNext())
            System.out.println(names.next());
    }

}

标签:jQuery,XML,DataSource,Digester

收藏

0人收藏

支持

0

反对

0

发表评论