diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 8a2887013f..bb02faa1d9 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -59,7 +59,7 @@ 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.DruidFilterUtils; import com.alibaba.druid.util.Histogram; import com.alibaba.druid.util.IOUtils; import com.alibaba.druid.util.JdbcUtils; @@ -485,7 +485,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public void setValidConnectionCheckerClassName(String validConnectionCheckerClass) throws Exception { - Class clazz = DruidLoaderUtils.loadClass(validConnectionCheckerClass); + Class clazz = DruidFilterUtils.loadClass(validConnectionCheckerClass); ValidConnectionChecker validConnectionChecker = null; if (clazz != null) { validConnectionChecker = (ValidConnectionChecker) clazz.newInstance(); @@ -713,7 +713,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public void setPasswordCallbackClassName(String passwordCallbackClassName) throws Exception { - Class clazz = DruidLoaderUtils.loadClass(passwordCallbackClassName); + Class clazz = DruidFilterUtils.loadClass(passwordCallbackClassName); if (clazz != null) { this.passwordCallback = (PasswordCallback) clazz.newInstance(); } else { @@ -1012,7 +1012,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements return; } - Class clazz = DruidLoaderUtils.loadClass(exceptionSorter); + Class clazz = DruidFilterUtils.loadClass(exceptionSorter); if (clazz == null) { LOG.error("load exceptionSorter error : " + exceptionSorter); } else { @@ -1050,7 +1050,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements String[] filterArray = filters.split("\\,"); for (String item : filterArray) { - DruidLoaderUtils.loadFilter(this.filters, item); + DruidFilterUtils.loadFilter(this.filters, item); } } diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java index 6a1a127699..675c1368e5 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java @@ -12,7 +12,7 @@ import com.alibaba.druid.pool.ValidConnectionChecker; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.util.DruidLoaderUtils; +import com.alibaba.druid.util.DruidFilterUtils; import com.alibaba.druid.util.JdbcUtils; public class MySqlValidConnectionChecker implements ValidConnectionChecker, Serializable { @@ -26,7 +26,7 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri public MySqlValidConnectionChecker(){ try { - clazz = DruidLoaderUtils.loadClass("com.mysql.jdbc.Connection"); + clazz = DruidFilterUtils.loadClass("com.mysql.jdbc.Connection"); ping = clazz.getMethod("ping"); if (ping != null) { driverHasPingMethod = true; 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 f35ac6b224..604e678627 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java @@ -33,7 +33,7 @@ import com.alibaba.druid.pool.ValidConnectionChecker; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.util.DruidLoaderUtils; +import com.alibaba.druid.util.DruidFilterUtils; import com.alibaba.druid.util.JdbcUtils; public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { @@ -48,7 +48,7 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser public OracleValidConnectionChecker(){ try { - clazz = DruidLoaderUtils.loadClass("oracle.jdbc.driver.OracleConnection"); + clazz = DruidFilterUtils.loadClass("oracle.jdbc.driver.OracleConnection"); if (clazz != null) { ping = clazz.getMethod("pingDatabase", new Class[] { Integer.TYPE }); } else { diff --git a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java index 56c8b9bb0e..6fd8411074 100644 --- a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java +++ b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java @@ -22,8 +22,6 @@ import java.sql.DriverManager; import java.sql.DriverPropertyInfo; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; -import java.util.ArrayList; -import java.util.List; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -36,14 +34,13 @@ 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.jdbc.DataSourceProxy; import com.alibaba.druid.proxy.jdbc.DataSourceProxyConfig; import com.alibaba.druid.proxy.jdbc.DataSourceProxyImpl; 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.DruidLoaderUtils; +import com.alibaba.druid.util.DruidFilterUtils; import com.alibaba.druid.util.JMXUtils; import com.alibaba.druid.util.JdbcUtils; @@ -66,7 +63,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { public final static String JMX_PREFIX = "jmx="; public final static String FILTERS_PREFIX = "filters="; - private final AtomicLong connectCount = new AtomicLong(0); + private final AtomicLong connectCount = new AtomicLong(0); private String acceptPrefix = DEFAULT_PREFIX; @@ -86,7 +83,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { try { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); - + ObjectName objectName = new ObjectName(MBEAN_NAME); if (!mbeanServer.isRegistered(objectName)) { mbeanServer.registerMBean(instance, objectName); @@ -158,12 +155,12 @@ public class DruidDriver implements Driver, DruidDriverMBean { Driver rawDriver = createDriver(config.getRawDriverClassName()); DataSourceProxyImpl newDataSource = new DataSourceProxyImpl(rawDriver, config); - + { String property = System.getProperty("druid.filters"); if (property != null && property.length() > 0) { for (String filterItem : property.split(",")) { - DruidLoaderUtils.loadFilter(config.getFilters(), filterItem); + DruidFilterUtils.loadFilter(config.getFilters(), filterItem); } } } @@ -176,7 +173,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { } } - DataSourceProxy oldDataSource = proxyDataSources.putIfAbsent(url, newDataSource); + DataSourceProxy oldDataSource = proxyDataSources.putIfAbsent(url, newDataSource); if (oldDataSource == null) { if (config.isJmxOption()) { JMXUtils.register("com.alibaba.druid:type=JdbcStat", JdbcStatManager.getInstance()); @@ -193,8 +190,6 @@ public class DruidDriver implements Driver, DruidDriverMBean { DataSourceProxyConfig config = new DataSourceProxyConfig(); - List druidFilterConfigList = new ArrayList(); - if (restUrl.startsWith(DRIVER_PREFIX)) { int pos = restUrl.indexOf(':', DRIVER_PREFIX.length()); String driverText = restUrl.substring(DRIVER_PREFIX.length(), pos); @@ -208,14 +203,10 @@ public class DruidDriver implements Driver, DruidDriverMBean { int pos = restUrl.indexOf(':', FILTERS_PREFIX.length()); String filtersText = restUrl.substring(FILTERS_PREFIX.length(), pos); for (String filterItem : filtersText.split(",")) { - DruidLoaderUtils.loadFilter(config.getFilters(), filterItem); + DruidFilterUtils.loadFilter(config.getFilters(), filterItem); } restUrl = restUrl.substring(pos + 1); } - // 如果url中并无定义filter 采用配置 - if (config.getFilters().size() <= 0) { - DruidLoaderUtils.loadFilter(config.getFilters(), druidFilterConfigList); - } if (restUrl.startsWith(NAME_PREFIX)) { int pos = restUrl.indexOf(':', NAME_PREFIX.length()); @@ -244,7 +235,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { } public Driver createDriver(String className) throws SQLException { - Class rawDriverClass = DruidLoaderUtils.loadClass(className); + Class rawDriverClass = DruidFilterUtils.loadClass(className); if (rawDriverClass == null) { throw new SQLException("jdbc-driver's class not found. '" + className + "'"); @@ -309,7 +300,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { public void resetStat() { connectCount.set(0); } - + @Override public String getDruidVersion() { return VERSION.getVersionNumber(); diff --git a/src/main/java/com/alibaba/druid/util/DruidFilterUtils.java b/src/main/java/com/alibaba/druid/util/DruidFilterUtils.java new file mode 100644 index 0000000000..1e7fdb2595 --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/DruidFilterUtils.java @@ -0,0 +1,129 @@ +/* + * 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.util; + +import java.sql.SQLException; +import java.util.List; + +import com.alibaba.druid.filter.Filter; +import com.alibaba.druid.filter.FilterManager; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; + +/** + * druid loader utils + * + * @author gang.su + */ +public class DruidFilterUtils { + + private final static Log LOG = LogFactory.getLog(DruidFilterUtils.class); + + public static void loadFilter(List filters, String filterName) throws SQLException { + if (filterName.length() == 0) { + return; + } + + String filterClassNames = FilterManager.getFilter(filterName); + + if (filterClassNames != null) { + for (String filterClassName : filterClassNames.split(",")) { + if (existsFilter(filters, filterClassName)) { + continue; + } + + Class filterClass = loadClass(filterClassName); + + if (filterClass == null) { + LOG.error("load filter error, filter not found : " + filterClassName); + continue; + } + + Filter filter; + + try { + filter = (Filter) filterClass.newInstance(); + } catch (InstantiationException e) { + throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); + } catch (IllegalAccessException e) { + throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); + } + + filters.add(filter); + } + + return; + } + + if (existsFilter(filters, filterName)) { + return; + } + + Class filterClass = loadClass(filterName); + if (filterClass == null) { + LOG.error("load filter error, filter not found : " + filterName); + return; + } + + try { + Filter filter = (Filter) filterClass.newInstance(); + filters.add(filter); + } catch (Exception e) { + throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); + } + } + + /** + * 是否存在load + * + * @param filterList + * @param filterClassName + * @return + */ + private static boolean existsFilter(List filterList, String filterClassName) { + for (Filter filter : filterList) { + String itemFilterClassName = filter.getClass().getName(); + if (itemFilterClassName.equalsIgnoreCase(filterClassName)) { + return true; + } + } + return false; + } + + public static Class loadClass(String className) { + Class clazz = null; + + if (className == null) { + return null; + } + + try { + clazz = Thread.currentThread().getContextClassLoader().loadClass(className); + } catch (ClassNotFoundException e) { + + } + + if (clazz != null) { + return clazz; + } + + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + return null; + } + } +} diff --git a/src/main/java/com/alibaba/druid/util/DruidLoaderUtils.java b/src/main/java/com/alibaba/druid/util/DruidLoaderUtils.java deleted file mode 100644 index 1afaa9344f..0000000000 --- a/src/main/java/com/alibaba/druid/util/DruidLoaderUtils.java +++ /dev/null @@ -1,152 +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.util; - -import java.sql.SQLException; -import java.util.Iterator; -import java.util.List; - -import com.alibaba.druid.filter.Filter; -import com.alibaba.druid.filter.FilterManager; -import com.alibaba.druid.proxy.config.AbstractDruidFilterConfig; -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; - -/** - * druid loader utils - * - * @author gang.su - */ -public class DruidLoaderUtils { - - private final static Log LOG = LogFactory.getLog(DruidLoaderUtils.class); - - public static void loadFilter(List filterList, List druidFilterConfigList) - throws SQLException { - for (Iterator iterator = druidFilterConfigList.iterator(); iterator.hasNext();) { - AbstractDruidFilterConfig druidFilterConfig = iterator.next(); - String filterItem = druidFilterConfig.getClazz(); - - Class filterClass = loadClass(druidFilterConfig.getClazz()); - - if (filterClass == null) { - return; - } - - Filter jdbcFilter; - try { - jdbcFilter = (Filter) filterClass.newInstance(); - jdbcFilter.loadConfig(druidFilterConfig); - } catch (InstantiationException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterItem, e); - } catch (IllegalAccessException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterItem, e); - } - filterList.add(jdbcFilter); - } - - } - - public static void loadFilter(List filters, String filterName) throws SQLException { - if (filterName.length() == 0) { - return; - } - - String filterClassNames = FilterManager.getFilter(filterName); - if (filterClassNames != null) { - filterClassNames = filterClassNames.trim(); - } - - if (filterClassNames != null) { - for (String filterClassName : filterClassNames.split(",")) { - - if (!isExist(filters, filterClassName)) { - Class filterClass = loadClass(filterClassName); - - if (filterClass != null) { - Filter filter; - - try { - filter = (Filter) filterClass.newInstance(); - } catch (InstantiationException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); - } catch (IllegalAccessException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); - } - - filters.add(filter); - } - } - } - } else { - if (!isExist(filters, filterName)) { - Class filterClass = loadClass(filterName); - - if (filterClass != null) { - try { - Filter filter = (Filter) filterClass.newInstance(); - filters.add(filter); - } catch (InstantiationException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); - } catch (IllegalAccessException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); - } - } - } - } - } - - /** - * 是否存在load - * - * @param filterConfigList - * @param filterClassName - * @return - */ - private static boolean isExist(List filterConfigList, String filterClassName) { - for (Iterator iterator = filterConfigList.iterator(); iterator.hasNext();) { - Filter filter = (Filter) iterator.next(); - if (filter.getClass().getName().equalsIgnoreCase(filterClassName)) { - return true; - } - } - return false; - } - - public static Class loadClass(String className) { - Class clazz = null; - - if (className == null) { - return null; - } - - try { - clazz = Thread.currentThread().getContextClassLoader().loadClass(className); - } catch (ClassNotFoundException e) { - - } - - if (clazz != null) { - return clazz; - } - - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { - return null; - } - } -} 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 5e47123729..e3d4b884b3 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 @@ -25,9 +25,7 @@ import junit.framework.TestCase; import com.alibaba.druid.bvt.proxy.DruidDriverTest.PublicJdbcFilterAdapter; import com.alibaba.druid.filter.Filter; -import com.alibaba.druid.proxy.config.AbstractDruidFilterConfig; -import com.alibaba.druid.proxy.config.DruidFilterConfig; -import com.alibaba.druid.util.DruidLoaderUtils; +import com.alibaba.druid.util.DruidFilterUtils; /** * druidLoader util 测试 @@ -41,42 +39,42 @@ public class DruidLoaderUtilsTest extends TestCase { List filters = new ArrayList(); // log4j String filterItem = "log4j"; - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); Filter filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.logging.Log4jFilter", filterConfig.getClass().getName()); // stat filterItem = "stat"; filters.clear(); - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.stat.StatFilter", filterConfig.getClass().getName()); // default filterItem = "default"; filters.clear(); - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.stat.StatFilter", filterConfig.getClass().getName()); // counter filterItem = "stat"; filters.clear(); - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.stat.StatFilter", filterConfig.getClass().getName()); // commonLogging filterItem = "commonLogging"; filters.clear(); - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.logging.CommonsLogFilter", filterConfig.getClass().getName()); // encoding filterItem = "encoding"; filters.clear(); - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.encoding.EncodingConvertFilter", @@ -84,9 +82,9 @@ public class DruidLoaderUtilsTest extends TestCase { // 判定重复 filterItem = "stat"; filters.clear(); - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); filterItem = "default"; - DruidLoaderUtils.loadFilter(filters, filterItem); + DruidFilterUtils.loadFilter(filters, filterItem); for (Iterator iterator = filters.iterator(); iterator.hasNext();) { Filter filter = (Filter) iterator.next(); System.out.println(filter.getClass().getName()); @@ -94,29 +92,13 @@ public class DruidLoaderUtilsTest extends TestCase { // default } - public void testLoadFilter2() throws SQLException { - - List filterConfigList = new ArrayList(); - List druidFilterConfigList = new ArrayList(); - DruidFilterConfig druidFilterConfig = new DruidFilterConfig(); - druidFilterConfig.setClazz("com.alibaba.druid.filter.logging.Log4jFilter"); - druidFilterConfig.setName("log4j"); - druidFilterConfigList.add(druidFilterConfig); - // log4j - DruidLoaderUtils.loadFilter(filterConfigList, druidFilterConfigList); - Filter filterConfig = filterConfigList.get(0); - Assert.assertNotNull(filterConfig); - Assert.assertEquals("com.alibaba.druid.filter.logging.Log4jFilter", filterConfig.getClass().getName()); - - } - public void twest_loadClass() throws Exception { - Assert.assertEquals(null, DruidLoaderUtils.loadClass(null)); - Assert.assertEquals(null, DruidLoaderUtils.loadClass("xxx")); + Assert.assertEquals(null, DruidFilterUtils.loadClass(null)); + Assert.assertEquals(null, DruidFilterUtils.loadClass("xxx")); Assert.assertEquals(PublicJdbcFilterAdapter.class, - DruidLoaderUtils.loadClass(PublicJdbcFilterAdapter.class.getName())); - Assert.assertNull(DruidLoaderUtils.loadClass(null)); - Assert.assertNull(DruidLoaderUtils.loadClass("")); + DruidFilterUtils.loadClass(PublicJdbcFilterAdapter.class.getName())); + Assert.assertNull(DruidFilterUtils.loadClass(null)); + Assert.assertNull(DruidFilterUtils.loadClass("")); } }