refactor loadClass

This commit is contained in:
wenshao
2012-07-19 10:59:54 +08:00
parent 3ee01ce1a2
commit 92b106565b
8 changed files with 37 additions and 256 deletions
@@ -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
@@ -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(""));
}