mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
refactor loadClass
This commit is contained in:
@@ -56,6 +56,8 @@ import com.alibaba.druid.proxy.jdbc.DataSourceProxy;
|
||||
import com.alibaba.druid.proxy.jdbc.TransactionInfo;
|
||||
import com.alibaba.druid.stat.JdbcDataSourceStat;
|
||||
import com.alibaba.druid.stat.JdbcStatManager;
|
||||
import com.alibaba.druid.support.logging.Log;
|
||||
import com.alibaba.druid.support.logging.LogFactory;
|
||||
import com.alibaba.druid.util.ConcurrentIdentityHashMap;
|
||||
import com.alibaba.druid.util.DruidLoaderUtils;
|
||||
import com.alibaba.druid.util.Histogram;
|
||||
@@ -67,6 +69,7 @@ import com.alibaba.druid.util.JdbcUtils;
|
||||
* @author ljw<ljw2083@alibaba-inc.com>
|
||||
*/
|
||||
public abstract class DruidAbstractDataSource extends WrapperAdapter implements DruidAbstractDataSourceMBean, DataSource, DataSourceProxy, Serializable {
|
||||
private final static Log LOG = LogFactory.getLog(DruidAbstractDataSource.class);
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -486,9 +489,10 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
ValidConnectionChecker validConnectionChecker = null;
|
||||
if (clazz != null) {
|
||||
validConnectionChecker = (ValidConnectionChecker) clazz.newInstance();
|
||||
this.validConnectionChecker = validConnectionChecker;
|
||||
} else {
|
||||
LOG.error("load validConnectionCheckerClass error : " + validConnectionCheckerClass);
|
||||
}
|
||||
|
||||
this.validConnectionChecker = validConnectionChecker;
|
||||
}
|
||||
|
||||
public String getDbType() {
|
||||
@@ -713,6 +717,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
if (clazz != null) {
|
||||
this.passwordCallback = (PasswordCallback) clazz.newInstance();
|
||||
} else {
|
||||
LOG.error("load passwordCallback error : " + passwordCallbackClassName);
|
||||
this.passwordCallback = null;
|
||||
}
|
||||
}
|
||||
@@ -1012,7 +1017,11 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
}
|
||||
|
||||
Class<?> clazz = DruidLoaderUtils.loadClass(exceptionSorter);
|
||||
this.exceptionSorter = (ExceptionSorter) clazz.newInstance();
|
||||
if (clazz == null) {
|
||||
LOG.error("load exceptionSorter error : " + exceptionSorter);
|
||||
} else {
|
||||
this.exceptionSorter = (ExceptionSorter) clazz.newInstance();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+6
-2
@@ -49,7 +49,11 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser
|
||||
public OracleValidConnectionChecker(){
|
||||
try {
|
||||
clazz = DruidLoaderUtils.loadClass("oracle.jdbc.driver.OracleConnection");
|
||||
ping = clazz.getMethod("pingDatabase", new Class[] { Integer.TYPE });
|
||||
if (clazz != null) {
|
||||
ping = clazz.getMethod("pingDatabase", new Class[] { Integer.TYPE });
|
||||
} else {
|
||||
ping = null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Unable to resolve pingDatabase method:", e);
|
||||
}
|
||||
@@ -79,7 +83,7 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser
|
||||
}
|
||||
|
||||
// unwrap
|
||||
if (clazz.isAssignableFrom(conn.getClass())) {
|
||||
if (clazz != null && clazz.isAssignableFrom(conn.getClass())) {
|
||||
Integer status = (Integer) ping.invoke(conn, params);
|
||||
|
||||
// Error
|
||||
|
||||
@@ -37,7 +37,6 @@ import javax.management.ObjectName;
|
||||
import com.alibaba.druid.VERSION;
|
||||
import com.alibaba.druid.filter.Filter;
|
||||
import com.alibaba.druid.proxy.config.AbstractDruidFilterConfig;
|
||||
import com.alibaba.druid.proxy.config.DruidFilterConfigLoader;
|
||||
import com.alibaba.druid.proxy.jdbc.DataSourceProxy;
|
||||
import com.alibaba.druid.proxy.jdbc.DataSourceProxyConfig;
|
||||
import com.alibaba.druid.proxy.jdbc.DataSourceProxyImpl;
|
||||
@@ -61,7 +60,6 @@ public class DruidDriver implements Driver, DruidDriverMBean {
|
||||
private final static AtomicInteger dataSourceIdSeed = new AtomicInteger(0);
|
||||
|
||||
public final static String DEFAULT_PREFIX = "jdbc:wrap-jdbc:";
|
||||
public final static String CONFIG_PREFIX = "druid.config";
|
||||
public final static String DRIVER_PREFIX = "driver=";
|
||||
public final static String PASSWORD_CALLBACK_PREFIX = "passwordCallback=";
|
||||
public final static String NAME_PREFIX = "name=";
|
||||
@@ -197,13 +195,6 @@ public class DruidDriver implements Driver, DruidDriverMBean {
|
||||
|
||||
List<AbstractDruidFilterConfig> druidFilterConfigList = new ArrayList<AbstractDruidFilterConfig>();
|
||||
|
||||
if (info != null) {
|
||||
String configFile = info.getProperty(CONFIG_PREFIX);
|
||||
if (configFile != null) {
|
||||
DruidFilterConfigLoader.loadConfig(configFile.trim(), druidFilterConfigList);
|
||||
}
|
||||
}
|
||||
|
||||
if (restUrl.startsWith(DRIVER_PREFIX)) {
|
||||
int pos = restUrl.indexOf(':', DRIVER_PREFIX.length());
|
||||
String driverText = restUrl.substring(DRIVER_PREFIX.length(), pos);
|
||||
|
||||
@@ -1,169 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2011 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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 com.alibaba.druid.proxy.config;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.alibaba.druid.proxy.DruidDriver;
|
||||
import com.alibaba.druid.util.DruidLoaderUtils;
|
||||
|
||||
/**
|
||||
* 读配置
|
||||
*
|
||||
* @author gang.su
|
||||
*/
|
||||
public class DruidFilterConfigLoader {
|
||||
|
||||
private static final String NAME_TAG = "name";
|
||||
|
||||
private static final String VALUE_TAG = "value";
|
||||
|
||||
private static final String CLAZZ_TAG = "class";
|
||||
|
||||
private static final String CONFIG_CLAZZ_TAG = "configClass";
|
||||
|
||||
public static void loadConfig(String config, List<AbstractDruidFilterConfig> druidFilterConfigList)
|
||||
throws SQLException {
|
||||
URL url = findResource(config);
|
||||
if (url != null) {
|
||||
try {
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
// Turn on validation, and turn off namespaces
|
||||
factory.setValidating(false);
|
||||
factory.setNamespaceAware(false);
|
||||
DocumentBuilder builder;
|
||||
|
||||
builder = factory.newDocumentBuilder();
|
||||
|
||||
Document doc;
|
||||
doc = builder.parse(new File(url.getPath()));
|
||||
if (doc == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Node filtersNode = doc.getFirstChild();
|
||||
if (filtersNode == null) {
|
||||
return;
|
||||
}
|
||||
NodeList filterNodeList = filtersNode.getChildNodes();
|
||||
for (int i = 0; i < filterNodeList.getLength(); i++) {
|
||||
Node filterNode = filterNodeList.item(i);
|
||||
if (filterNode != null && filterNode.getNodeType() == Node.ELEMENT_NODE
|
||||
&& filterNode.getAttributes().getNamedItem(NAME_TAG) != null) {
|
||||
Node configClassNode = filterNode.getAttributes().getNamedItem(CONFIG_CLAZZ_TAG);
|
||||
if (configClassNode != null && !"".equalsIgnoreCase(configClassNode.getNodeValue())) {
|
||||
Class<?> configClass = DruidLoaderUtils.loadClass(configClassNode.getNodeValue());
|
||||
if (configClass != null) {
|
||||
try {
|
||||
AbstractDruidFilterConfig druidFilterConfig = (AbstractDruidFilterConfig) configClass.newInstance();
|
||||
if (filterNode.getAttributes().getNamedItem(NAME_TAG) != null) {
|
||||
druidFilterConfig.setName(filterNode.getAttributes().getNamedItem(NAME_TAG).getNodeValue());
|
||||
}
|
||||
if (filterNode.getAttributes().getNamedItem(CLAZZ_TAG) != null) {
|
||||
druidFilterConfig.setClazz(filterNode.getAttributes().getNamedItem(CLAZZ_TAG).getNodeValue());
|
||||
}
|
||||
NodeList propNodeList = filterNode.getChildNodes();
|
||||
for (int j = 0; j < propNodeList.getLength(); j++) {
|
||||
Node propNode = propNodeList.item(j);
|
||||
if (propNode != null && propNode.getNodeType() == Node.ELEMENT_NODE) {
|
||||
Node nameNode = propNode.getAttributes().getNamedItem(NAME_TAG);
|
||||
Node valueNode = propNode.getAttributes().getNamedItem(VALUE_TAG);
|
||||
if (nameNode != null && valueNode != null) {
|
||||
Class<?> partypes[] = new Class[1];
|
||||
partypes[0] = String.class;
|
||||
Method meth = null;
|
||||
try {
|
||||
String name1 = "set" + nameNode.getNodeValue();
|
||||
meth = configClass.getMethod(name1, partypes);
|
||||
Object arglist[] = new Object[1];
|
||||
arglist[0] = valueNode.getNodeValue();
|
||||
meth.invoke(druidFilterConfig, arglist);
|
||||
} catch (SecurityException e) {
|
||||
} catch (NoSuchMethodException e) {
|
||||
} catch (IllegalArgumentException e) {
|
||||
} catch (InvocationTargetException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
druidFilterConfigList.add(druidFilterConfig);
|
||||
} catch (InstantiationException e) {
|
||||
} catch (IllegalAccessException e) {
|
||||
} catch (SecurityException e) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DruidFilterConfig druidFilterConfig = new DruidFilterConfig();
|
||||
if (filterNode.getAttributes().getNamedItem(NAME_TAG) != null) {
|
||||
druidFilterConfig.setName(filterNode.getAttributes().getNamedItem(NAME_TAG).getNodeValue());
|
||||
}
|
||||
if (filterNode.getAttributes().getNamedItem(CLAZZ_TAG) != null) {
|
||||
druidFilterConfig.setClazz(filterNode.getAttributes().getNamedItem(CLAZZ_TAG).getNodeValue());
|
||||
}
|
||||
druidFilterConfigList.add(druidFilterConfig);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (ParserConfigurationException e) {
|
||||
} catch (SAXException e) {
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static URL findResource(String resource) throws SQLException {
|
||||
try {
|
||||
return new URL(resource);
|
||||
} catch (MalformedURLException e) {
|
||||
return findClassLoaderResource(resource);
|
||||
}
|
||||
}
|
||||
|
||||
private static URL findClassLoaderResource(String resource) throws SQLException {
|
||||
URL url = Thread.currentThread().getContextClassLoader().getResource(resource);
|
||||
|
||||
if (url == null) {
|
||||
url = DruidDriver.class.getClassLoader().getResource(resource);
|
||||
}
|
||||
|
||||
if (url == null) {
|
||||
url = ClassLoader.getSystemResource(resource);
|
||||
}
|
||||
|
||||
if (url == null) {
|
||||
throw new SQLException("config not found:" + resource);
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -136,28 +136,17 @@ public class DruidLoaderUtils {
|
||||
try {
|
||||
clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
|
||||
} catch (ClassNotFoundException e) {
|
||||
LOG.error("load class error", e);
|
||||
|
||||
}
|
||||
|
||||
if (clazz == null) {
|
||||
loadClass2(className);
|
||||
}
|
||||
|
||||
return clazz;
|
||||
}
|
||||
|
||||
public static Class<?> loadClass2(String className) {
|
||||
if (className == null) {
|
||||
return null;
|
||||
if (clazz != null) {
|
||||
return clazz;
|
||||
}
|
||||
|
||||
try {
|
||||
return Class.forName(className);
|
||||
} catch (ClassNotFoundException e) {
|
||||
// skip
|
||||
return null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,6 +16,21 @@ public class IOUtils {
|
||||
InputStreamReader reader = new InputStreamReader(in);
|
||||
return read(reader);
|
||||
}
|
||||
|
||||
public static String readFromResource(String resource) throws IOException {
|
||||
InputStream in = null;
|
||||
try {
|
||||
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
|
||||
if (in == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String text = IOUtils.read(in);
|
||||
return text;
|
||||
} finally {
|
||||
JdbcUtils.close(in);
|
||||
}
|
||||
}
|
||||
|
||||
public static String read(Reader reader) {
|
||||
try {
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2011 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* 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 com.alibaba.druid.bvt.proxy.config;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.alibaba.druid.proxy.config.AbstractDruidFilterConfig;
|
||||
import com.alibaba.druid.proxy.config.EncodingDruidFilterConfig;
|
||||
import com.alibaba.druid.proxy.config.DruidFilterConfigLoader;
|
||||
|
||||
/**
|
||||
* @author gang.su
|
||||
*/
|
||||
public class DruidConfigLoaderTest extends TestCase {
|
||||
|
||||
public void testLoadConfig() throws SQLException {
|
||||
List<AbstractDruidFilterConfig> druidFilterConfigList = new ArrayList<AbstractDruidFilterConfig>();
|
||||
String config = "DruidDriverConfig.xml";
|
||||
DruidFilterConfigLoader.loadConfig(config, druidFilterConfigList);
|
||||
Assert.assertNotNull(druidFilterConfigList);
|
||||
Assert.assertEquals(4, druidFilterConfigList.size());
|
||||
for (Iterator<AbstractDruidFilterConfig> iterator = druidFilterConfigList.iterator(); iterator.hasNext();) {
|
||||
AbstractDruidFilterConfig abstractDruidFilterConfig = iterator.next();
|
||||
if ("encoding".equalsIgnoreCase(abstractDruidFilterConfig.getName())) {
|
||||
EncodingDruidFilterConfig druidConfig = (EncodingDruidFilterConfig) abstractDruidFilterConfig;
|
||||
Assert.assertEquals("gbk", druidConfig.getClientEncoding());
|
||||
Assert.assertEquals("utf8", druidConfig.getServerEncoding());
|
||||
} else if ("stat".equalsIgnoreCase(abstractDruidFilterConfig.getName())) {
|
||||
Assert.assertEquals("com.alibaba.druid.proxy.filter.stat.StatFilter",
|
||||
abstractDruidFilterConfig.getClazz());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -112,13 +112,9 @@ public class DruidLoaderUtilsTest extends TestCase {
|
||||
|
||||
public void twest_loadClass() throws Exception {
|
||||
Assert.assertEquals(null, DruidLoaderUtils.loadClass(null));
|
||||
Assert.assertEquals(null, DruidLoaderUtils.loadClass2(null));
|
||||
Assert.assertEquals(null, DruidLoaderUtils.loadClass("xxx"));
|
||||
Assert.assertEquals(null, DruidLoaderUtils.loadClass2("xxx"));
|
||||
Assert.assertEquals(PublicJdbcFilterAdapter.class,
|
||||
DruidLoaderUtils.loadClass(PublicJdbcFilterAdapter.class.getName()));
|
||||
Assert.assertEquals(PublicJdbcFilterAdapter.class,
|
||||
DruidLoaderUtils.loadClass2(PublicJdbcFilterAdapter.class.getName()));
|
||||
Assert.assertNull(DruidLoaderUtils.loadClass(null));
|
||||
Assert.assertNull(DruidLoaderUtils.loadClass(""));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user