From 92b106565b8faf23958e3474542e7c1c28435da9 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 19 Jul 2012 10:59:54 +0800 Subject: [PATCH] refactor loadClass --- .../druid/pool/DruidAbstractDataSource.java | 15 +- .../vendor/OracleValidConnectionChecker.java | 8 +- .../com/alibaba/druid/proxy/DruidDriver.java | 9 - .../proxy/config/DruidFilterConfigLoader.java | 169 ------------------ .../alibaba/druid/util/DruidLoaderUtils.java | 19 +- .../java/com/alibaba/druid/util/IOUtils.java | 15 ++ .../proxy/config/DruidConfigLoaderTest.java | 54 ------ .../bvt/proxy/utils/DruidLoaderUtilsTest.java | 4 - 8 files changed, 37 insertions(+), 256 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfigLoader.java delete mode 100644 src/test/java/com/alibaba/druid/bvt/proxy/config/DruidConfigLoaderTest.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 2bcf7495be..bf83234df5 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -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 */ 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 diff --git a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java index 1df1d4b5f5..f35ac6b224 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java @@ -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 diff --git a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java index 30a42114ee..56c8b9bb0e 100644 --- a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java +++ b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java @@ -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 druidFilterConfigList = new ArrayList(); - 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); diff --git a/src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfigLoader.java b/src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfigLoader.java deleted file mode 100644 index cc2ee5006c..0000000000 --- a/src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfigLoader.java +++ /dev/null @@ -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 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; - } - -} diff --git a/src/main/java/com/alibaba/druid/util/DruidLoaderUtils.java b/src/main/java/com/alibaba/druid/util/DruidLoaderUtils.java index 0863f648bf..1afaa9344f 100644 --- a/src/main/java/com/alibaba/druid/util/DruidLoaderUtils.java +++ b/src/main/java/com/alibaba/druid/util/DruidLoaderUtils.java @@ -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; } - } diff --git a/src/main/java/com/alibaba/druid/util/IOUtils.java b/src/main/java/com/alibaba/druid/util/IOUtils.java index 88f9e09d3f..87753271f3 100644 --- a/src/main/java/com/alibaba/druid/util/IOUtils.java +++ b/src/main/java/com/alibaba/druid/util/IOUtils.java @@ -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 { diff --git a/src/test/java/com/alibaba/druid/bvt/proxy/config/DruidConfigLoaderTest.java b/src/test/java/com/alibaba/druid/bvt/proxy/config/DruidConfigLoaderTest.java deleted file mode 100644 index 6514843666..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/proxy/config/DruidConfigLoaderTest.java +++ /dev/null @@ -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 druidFilterConfigList = new ArrayList(); - String config = "DruidDriverConfig.xml"; - DruidFilterConfigLoader.loadConfig(config, druidFilterConfigList); - Assert.assertNotNull(druidFilterConfigList); - Assert.assertEquals(4, druidFilterConfigList.size()); - for (Iterator 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()); - } - } - - } -} diff --git a/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java index 45af086e8f..5e47123729 100644 --- a/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java @@ -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("")); }