/** * Copyright 2014 Duan Bingnan * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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.pinus4j.cluster.config.loader.impl; import java.util.Map; import org.pinus4j.cluster.beans.AppDBInfo; import org.pinus4j.cluster.beans.DBInfo; import org.pinus4j.cluster.beans.EnvDBInfo; import org.pinus4j.cluster.config.IClusterConfig; import org.pinus4j.cluster.container.ContainerType; import org.pinus4j.cluster.container.DefaultContainerFactory; import org.pinus4j.cluster.container.IContainer; import org.pinus4j.cluster.cp.IDBConnectionPool; import org.pinus4j.cluster.cp.impl.AbstractConnectionPool; import org.pinus4j.cluster.enums.EnumDB; import org.pinus4j.exceptions.LoadConfigException; import org.pinus4j.utils.StringUtil; import org.w3c.dom.Node; public class DBConnectionPoolLoader extends AbstractXMLConfigLoader<IDBConnectionPool> { @Override public IDBConnectionPool load(Node xmlNode) throws LoadConfigException { IContainer<DBInfo> dbInfos = DefaultContainerFactory.createContainer(ContainerType.MAP); Node dsBucket = xmlUtil.getFirstChildByName(xmlNode, "datasource-bucket"); if (dsBucket == null) { throw new LoadConfigException("can not found <datasource-bucket>"); } IDBConnectionPool dbConnectionPool = null; String connectionPoolClass = xmlUtil.getAttributeValue(dsBucket, "cpclass"); if (StringUtil.isBlank(connectionPoolClass)) { connectionPoolClass = IClusterConfig.DEFAULT_CP_CLASS; } try { Class<?> clazz = Class.forName(connectionPoolClass); dbConnectionPool = (IDBConnectionPool) clazz.newInstance(); } catch (Exception e) { throw new LoadConfigException(e); } DBInfo dbInfo = null; String dbInfoId = null; EnumDB dbCatalog = null; for (Node appDBInfoNode : xmlUtil.getChildByName(dsBucket, "appds")) { dbInfoId = xmlUtil.getAttributeValue(appDBInfoNode, "id"); if (StringUtil.isBlank(dbInfoId)) throw new LoadConfigException("<appds> 必须设置id属性"); dbCatalog = EnumDB.getEnum(xmlUtil.getAttributeValue(appDBInfoNode, "catalog")); if (dbCatalog == null) { dbCatalog = EnumDB.MYSQL; } dbInfo = new AppDBInfo(); dbInfo.setId(dbInfoId); dbInfo.setDbCatalog(dbCatalog); String username = xmlUtil.getFirstChildByName(appDBInfoNode, "username").getTextContent().trim(); String password = xmlUtil.getFirstChildByName(appDBInfoNode, "password").getTextContent().trim(); String url = xmlUtil.getFirstChildByName(appDBInfoNode, "url").getTextContent().trim(); ((AppDBInfo) dbInfo).setUsername(username); ((AppDBInfo) dbInfo).setPassword(password); ((AppDBInfo) dbInfo).setUrl(url); Map<String, String> connectParam = xmlUtil.getAttributeAsMap(dsBucket, "cpclass"); Map<String, String> oneDBConnectParam = xmlUtil.getAttributeAsMap(appDBInfoNode, "id", "catalog"); for (Map.Entry<String, String> connectParamEntry : oneDBConnectParam.entrySet()) { connectParam.put(connectParamEntry.getKey(), connectParamEntry.getValue()); } ((AppDBInfo) dbInfo).setConnPoolInfo(connectParam); if (dbInfos.find(dbInfoId) != null) { throw new LoadConfigException("配置错误,数据源id配置重复,id=" + dbInfoId); } dbInfos.put(dbInfoId, dbInfo); dbConnectionPool.addDataSource(dbInfo); } for (Node envDBInfoNode : xmlUtil.getChildByName(dsBucket, "envds")) { dbInfoId = xmlUtil.getAttributeValue(envDBInfoNode, "id"); if (StringUtil.isBlank(dbInfoId)) throw new LoadConfigException("<envds> 必须设置id属性"); dbInfo = new EnvDBInfo(); dbInfo.setId(dbInfoId); String envDsName = xmlUtil.getFirstChildByName(envDBInfoNode, "jndi").getTextContent().trim(); ((EnvDBInfo) dbInfo).setEnvDsName(envDsName); if (dbInfos.find(dbInfoId) != null) { throw new LoadConfigException("配置错误,数据源id配置重复,id=" + dbInfoId); } dbInfos.put(dbInfoId, dbInfo); dbConnectionPool.addDataSource(dbInfo); } ((AbstractConnectionPool) dbConnectionPool).setDbInfos(dbInfos); return dbConnectionPool; } }