From 700a5ade029f48243c1847112515f4326ddf6bb5 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 14 May 2011 16:28:56 +0000 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81PasswordCallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@87 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/pool/DruidDataAbstractSource.java | 35 +++++++++++++++--- .../druid/bvt/pool/PasswordCallbackTest.java | 37 ++++++++++++++++--- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataAbstractSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataAbstractSource.java index 81a03ed1f3..018d893012 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataAbstractSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataAbstractSource.java @@ -17,6 +17,8 @@ package com.alibaba.druid.pool; import java.io.PrintWriter; import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; @@ -320,7 +322,7 @@ public abstract class DruidDataAbstractSource implements DataSource, DataSourceP public void setPasswordCallback(PasswordCallback passwordCallback) { this.passwordCallback = passwordCallback; } - + public void setPasswordCallback(String passwordCallbackClassName) throws Exception { Class clazz = Thread.currentThread().getContextClassLoader().loadClass(passwordCallbackClassName); this.passwordCallback = (PasswordCallback) clazz.newInstance(); @@ -626,7 +628,7 @@ public abstract class DruidDataAbstractSource implements DataSource, DataSourceP private final Properties info; private final DruidDataAbstractSource dataSource; - public DruidPoolConnectionFactory(DruidDataAbstractSource dataSource){ + public DruidPoolConnectionFactory(DruidDataAbstractSource dataSource) throws SQLException{ this.dataSource = dataSource; this.url = dataSource.getUrl(); @@ -639,10 +641,33 @@ public abstract class DruidDataAbstractSource implements DataSource, DataSourceP } String password; - if (dataSource.getPasswordCallback() != null) { - char[] chars = dataSource.getPasswordCallback().getPassword(); + PasswordCallback passwordCallback = dataSource.getPasswordCallback(); + if (passwordCallback != null) { + try { + Method method = passwordCallback.getClass().getMethod("setUrl", String.class); + method.invoke(passwordCallback, url); + } catch (NoSuchMethodException ex) { + // skip + } catch (IllegalAccessException e) { + throw new SQLException("passwordCallback Error", e); + } catch (InvocationTargetException e) { + throw new SQLException("passwordCallback Error", e); + } + + try { + Method method = passwordCallback.getClass().getMethod("setProperties", Properties.class); + method.invoke(passwordCallback, properties); + } catch (NoSuchMethodException ex) { + // skip + } catch (IllegalAccessException e) { + throw new SQLException("passwordCallback Error", e); + } catch (InvocationTargetException e) { + throw new SQLException("passwordCallback Error", e); + } + + char[] chars = passwordCallback.getPassword(); if (chars != null) { - password = new String(chars); + password = new String(chars); } else { password = null; } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/PasswordCallbackTest.java b/src/test/java/com/alibaba/druid/bvt/pool/PasswordCallbackTest.java index 134585334a..98b44e6d04 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/PasswordCallbackTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/PasswordCallbackTest.java @@ -1,33 +1,60 @@ package com.alibaba.druid.bvt.pool; import java.sql.Connection; +import java.util.Properties; import javax.security.auth.callback.PasswordCallback; +import junit.framework.Assert; import junit.framework.TestCase; import com.alibaba.druid.pool.DruidDataSource; public class PasswordCallbackTest extends TestCase { - public void test_0 () throws Exception { + public void test_0() throws Exception { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mock:"); - dataSource.setPasswordCallback(new TestPasswordCallback()); - + + TestPasswordCallback passwordCallback = new TestPasswordCallback(); + dataSource.setPasswordCallback(passwordCallback); + Connection conn = dataSource.getConnection(); conn.close(); + + Assert.assertEquals(dataSource.getUrl(), passwordCallback.getUrl()); + Assert.assertEquals(dataSource.getConnectionProperties(), passwordCallback.getProperties()); } public static class TestPasswordCallback extends PasswordCallback { - public TestPasswordCallback() { - super ("test", false); + + private String url; + private Properties properties; + + public TestPasswordCallback(){ + super("test", false); } public TestPasswordCallback(String prompt, boolean echoOn){ super(prompt, echoOn); } + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + /** * */