Author: markt
Date: Wed Dec 11 10:37:34 2013
New Revision: 1550099

URL: http://svn.apache.org/r1550099
Log:
DBCP-292
Register BasicDataSource implementations with JMX, exposing the configuration 
properties as well as the current state of the connection pool and statement 
pools.

Added:
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
   (with props)
Modified:
    commons/proper/dbcp/trunk/src/changes/changes.xml
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java

Modified: commons/proper/dbcp/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/changes/changes.xml?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- commons/proper/dbcp/trunk/src/changes/changes.xml (original)
+++ commons/proper/dbcp/trunk/src/changes/changes.xml Wed Dec 11 10:37:34 2013
@@ -82,6 +82,11 @@ The <action> type attribute can be add,u
         Fix threading issues with accessToUnderlyingConnectionAllowed attribute
         of PoolingDriver which is used to support unit testing.
       </action>
+      <action dev="markt" issue="DBCP-292" type="add">
+        BasicDataSource instances are now exposed via JMX. All the 
configuration
+        properties are available as is the connection pool and the statement
+        pools (if statement pooling is enabled).
+      </action>
     </release>
     <release version="1.5.1" date="TBD" description="TBD">
       <action dev="markt" issue="DBCP-405" type="fix">

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java
 Wed Dec 11 10:37:34 2013
@@ -17,6 +17,7 @@
 package org.apache.commons.dbcp2;
 
 import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
 import java.util.Properties;
 import java.util.Collection;
 import java.util.List;
@@ -30,8 +31,12 @@ import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 
+import javax.management.InstanceAlreadyExistsException;
 import javax.management.MBeanRegistration;
+import javax.management.MBeanRegistrationException;
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
 import javax.management.ObjectName;
 import javax.sql.DataSource;
 
@@ -59,7 +64,8 @@ import org.apache.commons.pool2.impl.Gen
  * @author Dirk Verbeeck
  * @version $Revision$ $Date$
  */
-public class BasicDataSource implements DataSource, MBeanRegistration {
+public class BasicDataSource
+        implements DataSource, BasicDataSourceMXBean, MBeanRegistration {
 
     private static final Log log =
             LogFactory.getLog(BasicDataSource.class);
@@ -81,6 +87,7 @@ public class BasicDataSource implements 
      *
      * @return true if default auto-commit is enabled
      */
+    @Override
     public boolean getDefaultAutoCommit() {
         return this.defaultAutoCommit;
     }
@@ -112,6 +119,7 @@ public class BasicDataSource implements 
      *
      * @return true if connections are readOnly by default
      */
+    @Override
     public boolean getDefaultReadOnly() {
         Boolean val = defaultReadOnly;
         if (val != null) {
@@ -147,6 +155,7 @@ public class BasicDataSource implements 
      * @return the default value for transaction isolation state
      * @see Connection#getTransactionIsolation
      */
+    @Override
     public int getDefaultTransactionIsolation() {
         return this.defaultTransactionIsolation;
     }
@@ -180,6 +189,7 @@ public class BasicDataSource implements 
      *
      * @return the default catalog
      */
+    @Override
     public String getDefaultCatalog() {
         return this.defaultCatalog;
     }
@@ -215,6 +225,7 @@ public class BasicDataSource implements 
      *
      * @return  the state caching flag
      */
+    @Override
     public boolean getCacheState() {
         return cacheState;
     }
@@ -275,6 +286,7 @@ public class BasicDataSource implements 
      *
      * @return the jdbc driver class name
      */
+    @Override
     public synchronized String getDriverClassName() {
         return this.driverClassName;
     }
@@ -352,6 +364,7 @@ public class BasicDataSource implements 
      *
      * @see #lifo
      */
+    @Override
     public synchronized boolean getLifo() {
         return this.lifo;
     }
@@ -384,6 +397,7 @@ public class BasicDataSource implements 
      *
      * @return the maximum number of active connections
      */
+    @Override
     public synchronized int getMaxTotal() {
         return this.maxTotal;
     }
@@ -422,6 +436,7 @@ public class BasicDataSource implements 
      *
      * @return the maximum number of idle connections
      */
+    @Override
     public synchronized int getMaxIdle() {
         return this.maxIdle;
     }
@@ -458,6 +473,7 @@ public class BasicDataSource implements 
      * @return the minimum number of idle connections
      * @see GenericObjectPool#getMinIdle()
      */
+    @Override
     public synchronized int getMinIdle() {
         return this.minIdle;
     }
@@ -491,6 +507,7 @@ public class BasicDataSource implements 
      *
      * @return the number of connections created when the pool is initialized
      */
+    @Override
     public synchronized int getInitialSize() {
         return this.initialSize;
     }
@@ -528,6 +545,7 @@ public class BasicDataSource implements 
      *
      * @return the maxWaitMillis property value
      */
+    @Override
     public synchronized long getMaxWaitMillis() {
         return this.maxWaitMillis;
     }
@@ -559,6 +577,7 @@ public class BasicDataSource implements 
      *
      * @return true if prepared and callable statements are pooled
      */
+    @Override
     public synchronized boolean isPoolPreparedStatements() {
         return this.poolPreparedStatements;
     }
@@ -598,6 +617,7 @@ public class BasicDataSource implements 
      * @return the maximum number of open statements
      * @see #maxOpenPreparedStatements
      */
+    @Override
     public synchronized int getMaxOpenPreparedStatements() {
         return this.maxOpenPreparedStatements;
     }
@@ -634,6 +654,7 @@ public class BasicDataSource implements 
      *
      * @see #testOnBorrow
      */
+    @Override
     public synchronized boolean getTestOnBorrow() {
         return this.testOnBorrow;
     }
@@ -700,6 +721,7 @@ public class BasicDataSource implements 
      * @return the time (in milliseconds) between evictor runs
      * @see #timeBetweenEvictionRunsMillis
      */
+    @Override
     public synchronized long getTimeBetweenEvictionRunsMillis() {
         return this.timeBetweenEvictionRunsMillis;
     }
@@ -731,6 +753,7 @@ public class BasicDataSource implements 
      * runs
      * @see #numTestsPerEvictionRun
      */
+    @Override
     public synchronized int getNumTestsPerEvictionRun() {
         return this.numTestsPerEvictionRun;
     }
@@ -762,6 +785,7 @@ public class BasicDataSource implements 
      * @return the value of the {@link #minEvictableIdleTimeMillis} property
      * @see #minEvictableIdleTimeMillis
      */
+    @Override
     public synchronized long getMinEvictableIdleTimeMillis() {
         return this.minEvictableIdleTimeMillis;
     }
@@ -828,6 +852,7 @@ public class BasicDataSource implements 
      * in the pool
      * @since 1.4.1
      */
+    @Override
     public synchronized long getSoftMinEvictableIdleTimeMillis() {
         return softMinEvictableIdleTimeMillis;
     }
@@ -846,6 +871,7 @@ public class BasicDataSource implements 
      * validated
      * @see #testWhileIdle
      */
+    @Override
     public synchronized boolean getTestWhileIdle() {
         return this.testWhileIdle;
     }
@@ -871,6 +897,7 @@ public class BasicDataSource implements 
      *
      * @return the current number of active connections
      */
+    @Override
     public synchronized int getNumActive() {
         if (connectionPool != null) {
             return connectionPool.getNumActive();
@@ -886,6 +913,7 @@ public class BasicDataSource implements 
      *
      * @return the current number of idle connections
      */
+    @Override
     public synchronized int getNumIdle() {
         if (connectionPool != null) {
             return connectionPool.getNumIdle();
@@ -905,6 +933,7 @@ public class BasicDataSource implements 
      *
      * @return the connection password
      */
+    @Override
     public String getPassword() {
         return this.password;
     }
@@ -936,6 +965,7 @@ public class BasicDataSource implements 
      * @return the {@link #url} passed to the JDBC driver to establish
      * connections
      */
+    @Override
     public synchronized String getUrl() {
         return this.url;
     }
@@ -967,6 +997,7 @@ public class BasicDataSource implements 
      * @return the {@link #username} passed to the JDBC driver to establish
      * connections
      */
+    @Override
     public String getUsername() {
         return this.username;
     }
@@ -1001,6 +1032,7 @@ public class BasicDataSource implements 
      * @return the SQL validation query
      * @see #validationQuery
      */
+    @Override
     public String getValidationQuery() {
         return this.validationQuery;
     }
@@ -1037,6 +1069,7 @@ public class BasicDataSource implements 
      * @return the timeout in seconds before connection validation queries 
fail.
      * @since 1.3
      */
+    @Override
     public int getValidationQueryTimeout() {
         return validationQueryTimeout;
     }
@@ -1089,6 +1122,16 @@ public class BasicDataSource implements 
     }
 
     /**
+     * Provides the same data as {@link #getConnectionInitSqls()} but in an
+     * array so it is accessible via JMX.
+     */
+    @Override
+    public String[] getConnectionInitSqlsAsArray() {
+        Collection<String> result = getConnectionInitSqls();
+        return result.toArray(new String[result.size()]);
+    }
+
+    /**
      * Sets the list of SQL statements to be executed when a physical
      * connection is first created.
      * <p>
@@ -1132,6 +1175,7 @@ public class BasicDataSource implements 
      * @return true if access to the underlying connection is allowed, false
      * otherwise.
      */
+    @Override
     public synchronized boolean isAccessToUnderlyingConnectionAllowed() {
         return this.accessToUnderlyingConnectionAllowed;
     }
@@ -1160,6 +1204,7 @@ public class BasicDataSource implements 
      * Returns the maximum permitted lifetime of a connection in milliseconds. 
A
      * value of zero or less indicates an infinite lifetime.
      */
+    @Override
     public long getMaxConnLifetimeMillis() {
         return maxConnLifetimeMillis;
     }
@@ -1177,6 +1222,27 @@ public class BasicDataSource implements 
         this.maxConnLifetimeMillis = maxConnLifetimeMillis;
     }
 
+    private String jmxName = null;
+    
+    /**
+     * Returns the JMX name that has been requested for this DataSource. If the
+     * requested name is not valid, an alternative may be chosen.
+     */
+    public String getJmxName() {
+        return jmxName;
+    }
+
+    /**
+     * Sets the JMX name that has been requested for this DataSource. If the
+     * requested name is not valid, an alternative may be chosen. This
+     * DataSource will attempt to register itself using this name. If another
+     * component registers this DataSource with JMX and this name is valid this
+     * name will be used in preference to any specified by the other component.
+     */
+    public void setJmxName(String jmxName) {
+        this.jmxName = jmxName;
+    }
+
 
     // ----------------------------------------------------- Instance Variables
 
@@ -1357,6 +1423,7 @@ public class BasicDataSource implements 
      *
      * @see #getRemoveAbandonedTimeout()
      */
+    @Override
     public boolean getRemoveAbandonedOnBorrow() {
         if (abandonedConfig != null) {
             return abandonedConfig.getRemoveAbandonedOnBorrow();
@@ -1408,6 +1475,7 @@ public class BasicDataSource implements 
      *
      * @see #getRemoveAbandonedTimeout()
      */
+    @Override
     public boolean getRemoveAbandonedOnMaintenance() {
         if (abandonedConfig != null) {
             return abandonedConfig.getRemoveAbandonedOnMaintenance();
@@ -1454,6 +1522,7 @@ public class BasicDataSource implements 
      *
      * <p>The default value is 300 seconds.</p>
      */
+    @Override
     public int getRemoveAbandonedTimeout() {
         if (abandonedConfig != null) {
             return abandonedConfig.getRemoveAbandonedTimeout();
@@ -1492,6 +1561,7 @@ public class BasicDataSource implements 
      * for every Connection open or new Statement because a stack
      * trace has to be generated. </p>
      */
+    @Override
     public boolean getLogAbandoned() {
         if (abandonedConfig != null) {
             return abandonedConfig.getLogAbandoned();
@@ -1543,6 +1613,7 @@ public class BasicDataSource implements 
      *
      * @return <code>true</code> if usage tracking is enabled
      */
+    @Override
     public boolean getAbandonedUsageTracking() {
         if (abandonedConfig != null) {
             return abandonedConfig.getUseUsageTracking();
@@ -1668,6 +1739,7 @@ public class BasicDataSource implements 
      * If true, this data source is closed and no more connections can be 
retrieved from this datasource.
      * @return true, if the data source is closed; false otherwise
      */
+    @Override
     public synchronized boolean isClosed() {
         return closed;
     }
@@ -1715,6 +1787,8 @@ public class BasicDataSource implements 
                 return (dataSource);
             }
 
+            jmxRegister();
+
             // create factory which returns raw physical connections
             ConnectionFactory driverConnectionFactory = 
createConnectionFactory();
 
@@ -1959,8 +2033,7 @@ public class BasicDataSource implements 
             ConnectionFactory driverConnectionFactory) throws SQLException {
         PoolableConnectionFactory connectionFactory = null;
         try {
-            connectionFactory =
-                new PoolableConnectionFactory(driverConnectionFactory);
+            connectionFactory = new 
PoolableConnectionFactory(driverConnectionFactory, registeredJmxName);
             connectionFactory.setValidationQuery(validationQuery);
             
connectionFactory.setValidationQueryTimeout(validationQueryTimeout);
             connectionFactory.setConnectionInitSql(connectionInitSqls);
@@ -2008,13 +2081,54 @@ public class BasicDataSource implements 
         }
     }
 
-    private ObjectName oname = null;
+    /**
+     * Actual name under which this component has been registered.
+     */
+    private ObjectName registeredJmxName = null;
     
+    private void jmxRegister() {
+        // Return immediately if this DataSource has already been registered
+        if (registeredJmxName != null) {
+            return;
+        }
+        // Return immediately if no JMX name has been specified
+        String requestedName = getJmxName();
+        if (requestedName == null) {
+            return;
+        }
+        ObjectName oname;
+        try {
+             oname = new ObjectName(requestedName);
+        } catch (MalformedObjectNameException e) {
+            log.warn("The requested JMX name [" + requestedName +
+                    "] was not valid and will be ignored.");
+            return;
+        }
+        
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        try {
+            mbs.registerMBean(this, oname);
+        } catch (InstanceAlreadyExistsException | MBeanRegistrationException
+                | NotCompliantMBeanException e) {
+            log.warn("Failed to complete JMX registration", e);
+        }
+    }
+
     @Override
-    public ObjectName preRegister(MBeanServer server, ObjectName name)
-            throws Exception {
-        oname = name;
-        return name;
+    public ObjectName preRegister(MBeanServer server, ObjectName name) {
+        String requestedName = getJmxName();
+        if (requestedName != null) {
+            try {
+                registeredJmxName = new ObjectName(requestedName);
+            } catch (MalformedObjectNameException e) {
+                log.warn("The requested JMX name [" + requestedName +
+                        "] was not valid and will be ignored.");
+            }
+        }
+        if (registeredJmxName == null) {
+            registeredJmxName = name;
+        }
+        return registeredJmxName;
     }
 
     @Override
@@ -2033,12 +2147,16 @@ public class BasicDataSource implements 
     }
     
     private void updateJmxName(GenericObjectPoolConfig config) {
-        if (oname == null) {
+        if (registeredJmxName == null) {
             return;
         }
-        StringBuilder base = new StringBuilder(oname.toString());
+        StringBuilder base = new StringBuilder(registeredJmxName.toString());
         base.append(",pool=");
         config.setJmxNameBase(base.toString());
         config.setJmxNamePrefix("connections");
     }
+    
+    protected ObjectName getRegisteredJmxName() {
+        return registeredJmxName;
+    }
 }

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
 Wed Dec 11 10:37:34 2013
@@ -70,6 +70,8 @@ public class BasicDataSourceFactory impl
     private final static String PROP_USERNAME = "username";
     private final static String PROP_VALIDATIONQUERY = "validationQuery";
     private final static String PROP_VALIDATIONQUERY_TIMEOUT = 
"validationQueryTimeout";
+    private final static String PROP_JMX_NAME = "jmxName";
+
     /**
      * The property name for connectionInitSqls.
      * The associated value String must be of the form [query;]*
@@ -387,6 +389,11 @@ public class BasicDataSourceFactory impl
             dataSource.setMaxConnLifetimeMillis(Long.parseLong(value));
         }
 
+        value = properties.getProperty(PROP_JMX_NAME);
+        if (value != null) {
+            dataSource.setJmxName(value);
+        }
+        
         // DBCP-215
         // Trick to make sure that initialSize connections are created
         if (dataSource.getInitialSize() > 0) {

Added: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java?rev=1550099&view=auto
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
 (added)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
 Wed Dec 11 10:37:34 2013
@@ -0,0 +1,241 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.commons.dbcp2;
+
+/**
+ * Defines the methods that will be made available via JMX.
+ *
+ * @since 2.0
+ */
+public interface BasicDataSourceMXBean {
+    
+    /**
+     * @See {@link BasicDataSource#getAbandonedUsageTracking()}
+     * @return {@link BasicDataSource#getAbandonedUsageTracking()}
+     */
+    boolean getAbandonedUsageTracking();
+ 
+    /**
+     * @See {@link BasicDataSource#getDefaultAutoCommit()}
+     * @return {@link BasicDataSource#getDefaultAutoCommit()}
+     */
+    boolean getDefaultAutoCommit();
+   
+    /**
+     * @See {@link BasicDataSource#getDefaultReadOnly()}
+     * @return {@link BasicDataSource#getDefaultReadOnly()}
+     */
+    boolean getDefaultReadOnly();
+   
+    /**
+     * @See {@link BasicDataSource#getDefaultTransactionIsolation()}
+     * @return {@link BasicDataSource#getDefaultTransactionIsolation()}
+     */
+    int getDefaultTransactionIsolation();
+   
+    /**
+     * @See {@link BasicDataSource#getDefaultCatalog()}
+     * @return {@link BasicDataSource#getDefaultCatalog()}
+     */
+    String getDefaultCatalog();
+   
+    /**
+     * @See {@link BasicDataSource#getCacheState()}
+     * @return {@link BasicDataSource#getCacheState()}
+     */
+    boolean getCacheState();
+   
+    /**
+     * @See {@link BasicDataSource#getDriverClassName()}
+     * @return {@link BasicDataSource#getDriverClassName()}
+     */
+    String getDriverClassName();
+   
+    /**
+     * @See {@link BasicDataSource#getLifo()}
+     * @return {@link BasicDataSource#getLifo()}
+     */
+    boolean getLifo();
+   
+    /**
+     * @See {@link BasicDataSource#getMaxTotal()}
+     * @return {@link BasicDataSource#getMaxTotal()}
+     */
+    int getMaxTotal();
+   
+    /**
+     * @See {@link BasicDataSource#getMaxIdle()}
+     * @return {@link BasicDataSource#getMaxIdle()}
+     */
+    int getMaxIdle();
+
+    /**
+     * @See {@link BasicDataSource#getMinIdle()}
+     * @return {@link BasicDataSource#getMinIdle()}
+     */
+    int getMinIdle();
+   
+    /**
+     * @See {@link BasicDataSource#getInitialSize()}
+     * @return {@link BasicDataSource#getInitialSize()}
+     */
+    int getInitialSize();
+   
+    /**
+     * @See {@link BasicDataSource#getMaxWaitMillis()}
+     * @return {@link BasicDataSource#getMaxWaitMillis()}
+     */
+    long getMaxWaitMillis();
+   
+    /**
+     * @See {@link BasicDataSource#isPoolPreparedStatements()}
+     * @return {@link BasicDataSource#isPoolPreparedStatements()}
+     */
+    boolean isPoolPreparedStatements();
+   
+    /**
+     * @See {@link BasicDataSource#getMaxOpenPreparedStatements()}
+     * @return {@link BasicDataSource#getMaxOpenPreparedStatements()}
+     */
+    int getMaxOpenPreparedStatements();
+   
+    /**
+     * @See {@link BasicDataSource#getTestOnBorrow()}
+     * @return {@link BasicDataSource#getTestOnBorrow()}
+     */
+    boolean getTestOnBorrow();
+      
+    /**
+     * @See {@link BasicDataSource#getTimeBetweenEvictionRunsMillis()}
+     * @return {@link BasicDataSource#getTimeBetweenEvictionRunsMillis()}
+     */
+    long getTimeBetweenEvictionRunsMillis();
+   
+    /**
+     * @See {@link BasicDataSource#getNumTestsPerEvictionRun()}
+     * @return {@link BasicDataSource#getNumTestsPerEvictionRun()}
+     */
+    int getNumTestsPerEvictionRun();
+   
+    /**
+     * @See {@link BasicDataSource#getMinEvictableIdleTimeMillis()}
+     * @return {@link BasicDataSource#getMinEvictableIdleTimeMillis()}
+     */
+    long getMinEvictableIdleTimeMillis();
+   
+    /**
+     * @See {@link BasicDataSource#getSoftMinEvictableIdleTimeMillis()}
+     * @return {@link BasicDataSource#getSoftMinEvictableIdleTimeMillis()}
+     */
+    long getSoftMinEvictableIdleTimeMillis();
+   
+    /**
+     * @See {@link BasicDataSource#getTestWhileIdle()}
+     * @return {@link BasicDataSource#getTestWhileIdle()}
+     */
+    boolean getTestWhileIdle();
+   
+    /**
+     * @See {@link BasicDataSource#getNumActive()}
+     * @return {@link BasicDataSource#getNumActive()}
+     */
+    int getNumActive();
+   
+    /**
+     * @See {@link BasicDataSource#getNumIdle()}
+     * @return {@link BasicDataSource#getNumIdle()}
+     */
+    int getNumIdle();
+   
+    /**
+     * @See {@link BasicDataSource#getPassword()}
+     * @return {@link BasicDataSource#getPassword()}
+     */
+    String getPassword();
+   
+    /**
+     * @See {@link BasicDataSource#getUrl()}
+     * @return {@link BasicDataSource#getUrl()}
+     */
+    String getUrl();
+   
+    /**
+     * @See {@link BasicDataSource#getUsername()}
+     * @return {@link BasicDataSource#getUsername()}
+     */
+    String getUsername();
+   
+    /**
+     * @See {@link BasicDataSource#getValidationQuery()}
+     * @return {@link BasicDataSource#getValidationQuery()}
+     */
+    String getValidationQuery();
+   
+    /**
+     * @See {@link BasicDataSource#getValidationQueryTimeout()}
+     * @return {@link BasicDataSource#getValidationQueryTimeout()}
+     */
+    int getValidationQueryTimeout();
+   
+    /**
+     * @See {@link BasicDataSource#getConnectionInitSqlsAsArray()}
+     * @return {@link BasicDataSource#getConnectionInitSqlsAsArray()}
+     */
+    String[] getConnectionInitSqlsAsArray();
+   
+    /**
+     * @See {@link BasicDataSource#isAccessToUnderlyingConnectionAllowed()}
+     * @return {@link BasicDataSource#isAccessToUnderlyingConnectionAllowed()}
+     */
+    boolean isAccessToUnderlyingConnectionAllowed();
+   
+    /**
+     * @See {@link BasicDataSource#getMaxConnLifetimeMillis()}
+     * @return {@link BasicDataSource#getMaxConnLifetimeMillis()}
+     */
+    long getMaxConnLifetimeMillis();
+   
+    /**
+     * @See {@link BasicDataSource#getRemoveAbandonedOnBorrow()}
+     * @return {@link BasicDataSource#getRemoveAbandonedOnBorrow()}
+     */
+    boolean getRemoveAbandonedOnBorrow();
+   
+    /**
+     * @See {@link BasicDataSource#getRemoveAbandonedOnMaintenance()}
+     * @return {@link BasicDataSource#getRemoveAbandonedOnMaintenance()}
+     */
+    boolean getRemoveAbandonedOnMaintenance();
+   
+    /**
+     * @See {@link BasicDataSource#getRemoveAbandonedTimeout()}
+     * @return {@link BasicDataSource#getRemoveAbandonedTimeout()}
+     */
+    int getRemoveAbandonedTimeout();
+   
+    /**
+     * @See {@link BasicDataSource#getLogAbandoned()}
+     * @return {@link BasicDataSource#getLogAbandoned()}
+     */
+    boolean getLogAbandoned();
+   
+    /**
+     * @See {@link BasicDataSource#isClosed()}
+     * @return {@link BasicDataSource#isClosed()}
+     */
+    boolean isClosed();
+}

Propchange: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java
 Wed Dec 11 10:37:34 2013
@@ -110,9 +110,11 @@ public class DelegatingConnection<C exte
                     s = "connection is closed";
                 }
                 else {
+                    StringBuffer sb = new StringBuffer();
+                    sb.append(hashCode());
                     DatabaseMetaData meta = c.getMetaData();
                     if (meta != null) {
-                        StringBuffer sb = new StringBuffer();
+                        sb.append(", URL=");
                         sb.append(meta.getURL());
                         sb.append(", UserName=");
                         sb.append(meta.getUserName());

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
 Wed Dec 11 10:37:34 2013
@@ -23,6 +23,8 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Collection;
 
+import javax.management.ObjectName;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.commons.pool2.KeyedObjectPool;
@@ -54,16 +56,10 @@ public class PoolableConnectionFactory
      * @param connFactory the {@link ConnectionFactory} from which to obtain
      * base {@link Connection}s
      */
-    public PoolableConnectionFactory(ConnectionFactory connFactory) {
-        _connFactory = connFactory;
-    }
-
-    /**
-     * Sets the {@link ConnectionFactory} from which to obtain base {@link 
Connection}s.
-     * @param connFactory the {@link ConnectionFactory} from which to obtain 
base {@link Connection}s
-     */
-    public void setConnectionFactory(ConnectionFactory connFactory) {
+    public PoolableConnectionFactory(ConnectionFactory connFactory,
+            ObjectName dataSourceJmxName) {
         _connFactory = connFactory;
+        this.dataSourceJmxName = dataSourceJmxName;
     }
 
     /**
@@ -203,6 +199,12 @@ public class PoolableConnectionFactory
             config.setMaxWaitMillis(0);
             config.setMaxIdlePerKey(1);
             config.setMaxTotal(maxOpenPreparedStatements);
+            if (dataSourceJmxName != null) {
+                StringBuilder base = new 
StringBuilder(dataSourceJmxName.toString());
+                base.append(",pool=statements,connection=");
+                config.setJmxNameBase(base.toString());
+                config.setJmxNamePrefix(Integer.toString(conn.hashCode()));
+            }
             KeyedObjectPool<PStmtKey,DelegatingPreparedStatement> stmtPool =
                     new GenericKeyedObjectPool<>((PoolingConnection)conn, 
config);
             ((PoolingConnection)conn).setStatementPool(stmtPool);
@@ -348,7 +350,8 @@ public class PoolableConnectionFactory
     }
 
 
-    protected volatile ConnectionFactory _connFactory = null;
+    protected final ConnectionFactory _connFactory;
+    private final ObjectName dataSourceJmxName;
     protected volatile String _validationQuery = null;
     protected volatile int _validationQueryTimeout = -1;
     protected Collection<String> _connectionInitSqls = null;

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
 Wed Dec 11 10:37:34 2013
@@ -183,7 +183,7 @@ public class BasicManagedDataSource exte
         PoolableConnectionFactory connectionFactory = null;
         try {
             connectionFactory = new PoolableManagedConnectionFactory(
-                    (XAConnectionFactory) driverConnectionFactory);
+                    (XAConnectionFactory) driverConnectionFactory, 
getRegisteredJmxName());
             connectionFactory.setValidationQuery(validationQuery);
             
connectionFactory.setValidationQueryTimeout(validationQueryTimeout);
             connectionFactory.setConnectionInitSql(connectionInitSqls);

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
 Wed Dec 11 10:37:34 2013
@@ -18,6 +18,8 @@
 package org.apache.commons.dbcp2.managed;
 import java.sql.Connection;
 
+import javax.management.ObjectName;
+
 import org.apache.commons.dbcp2.DelegatingPreparedStatement;
 import org.apache.commons.dbcp2.PStmtKey;
 import org.apache.commons.dbcp2.PoolableConnection;
@@ -44,8 +46,9 @@ public class PoolableManagedConnectionFa
      *
      * @param connFactory XAConnectionFactory
      */
-    public PoolableManagedConnectionFactory(XAConnectionFactory connFactory) {
-        super(connFactory);
+    public PoolableManagedConnectionFactory(XAConnectionFactory connFactory,
+            ObjectName dataSourceJmxName) {
+        super(connFactory, dataSourceJmxName);
         this.transactionRegistry = connFactory.getTransactionRegistry();
     }
 

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java
 Wed Dec 11 10:37:34 2013
@@ -68,6 +68,7 @@ public class TestBasicDataSource extends
         ds.setValidationQuery("SELECT DUMMY FROM DUAL");
         ds.setConnectionInitSqls(Arrays.asList(new String[] { "SELECT 1", 
"SELECT 2"}));
         ds.setDriverClassLoader(new TesterClassLoader());
+        ds.setJmxName("org.apache.commons.dbcp2:name=test");
     }
 
     protected BasicDataSource createDataSource() throws Exception {

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java
 Wed Dec 11 10:37:34 2013
@@ -56,7 +56,7 @@ public class TestDriverManagerConnection
                     "jdbc:apache:commons:testdriver",
                     "foo", "bar");
         final PoolableConnectionFactory poolableConnectionFactory =
-            new PoolableConnectionFactory(connectionFactory);
+            new PoolableConnectionFactory(connectionFactory, null);
         poolableConnectionFactory.setDefaultReadOnly(false);
         poolableConnectionFactory.setDefaultAutoCommit(true);
 

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java
 Wed Dec 11 10:37:34 2013
@@ -53,7 +53,7 @@ public class TestPStmtPooling extends Te
                 "jdbc:apache:commons:testdriver","u1","p1");
 
         PoolableConnectionFactory pcf =
-            new PoolableConnectionFactory(connFactory);
+            new PoolableConnectionFactory(connFactory, null);
         pcf.setPoolStatements(true);
         pcf.setDefaultReadOnly(false);
         pcf.setDefaultAutoCommit(true);
@@ -78,7 +78,7 @@ public class TestPStmtPooling extends Te
                 "jdbc:apache:commons:testdriver","u1","p1");
 
         PoolableConnectionFactory pcf =
-            new PoolableConnectionFactory(connFactory);
+            new PoolableConnectionFactory(connFactory, null);
         pcf.setPoolStatements(true);
         pcf.setDefaultReadOnly(false);
         pcf.setDefaultAutoCommit(true);
@@ -117,7 +117,7 @@ public class TestPStmtPooling extends Te
                 "jdbc:apache:commons:testdriver","u1","p1");
 
         PoolableConnectionFactory pcf =
-            new PoolableConnectionFactory(connFactory);
+            new PoolableConnectionFactory(connFactory, null);
         pcf.setPoolStatements(true);
         pcf.setDefaultReadOnly(false);
         pcf.setDefaultAutoCommit(true);

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java
 Wed Dec 11 10:37:34 2013
@@ -46,7 +46,8 @@ public class TestPoolableConnection exte
     public void setUp() throws Exception {
         PoolableConnectionFactory factory = new PoolableConnectionFactory(
                 new DriverConnectionFactory(
-                        new TesterDriver(),"jdbc:apache:commons:testdriver", 
null));
+                        new TesterDriver(),"jdbc:apache:commons:testdriver", 
null),
+                null);
         factory.setDefaultAutoCommit(true);
         factory.setDefaultReadOnly(true);
 

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java
 Wed Dec 11 10:37:34 2013
@@ -55,8 +55,9 @@ public class TestPoolingDataSource exten
         props.setProperty("password", "password");
         PoolableConnectionFactory factory =
             new PoolableConnectionFactory(
-                new DriverConnectionFactory(new TesterDriver(),
-                        "jdbc:apache:commons:testdriver", props));
+                    new DriverConnectionFactory(new TesterDriver(),
+                            "jdbc:apache:commons:testdriver", props),
+                    null);
         factory.setValidationQuery("SELECT DUMMY FROM DUAL");
         factory.setDefaultReadOnly(true);
         factory.setDefaultAutoCommit(true);

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java
 Wed Dec 11 10:37:34 2013
@@ -60,7 +60,7 @@ public class TestPoolingDriver extends T
         super.setUp();
         DriverConnectionFactory cf = new DriverConnectionFactory(new 
TesterDriver(),"jdbc:apache:commons:testdriver",null);
 
-        PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf);
+        PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf, 
null);
         pcf.setPoolStatements(true);
         pcf.setMaxOpenPrepatedStatements(10);
         pcf.setValidationQuery("SELECT COUNT(*) FROM DUAL");
@@ -95,7 +95,7 @@ public class TestPoolingDriver extends T
     public void test1() {
         ConnectionFactory connectionFactory = new 
DriverManagerConnectionFactory("jdbc:some:connect:string","username","password");
         PoolableConnectionFactory pcf =
-            new PoolableConnectionFactory(connectionFactory);
+            new PoolableConnectionFactory(connectionFactory, null);
         pcf.setDefaultReadOnly(false);
         pcf.setDefaultAutoCommit(true);
         GenericObjectPool<PoolableConnection> connectionPool =
@@ -107,7 +107,7 @@ public class TestPoolingDriver extends T
     public void test2() {
         ConnectionFactory connectionFactory = new 
DriverManagerConnectionFactory("jdbc:some:connect:string","username","password");
         PoolableConnectionFactory pcf =
-            new PoolableConnectionFactory(connectionFactory);
+            new PoolableConnectionFactory(connectionFactory, null);
         pcf.setDefaultReadOnly(false);
         pcf.setDefaultAutoCommit(true);
         GenericObjectPool<PoolableConnection> connectionPool = new 
GenericObjectPool<>(pcf);
@@ -147,7 +147,7 @@ public class TestPoolingDriver extends T
             "username",
             "password");
         PoolableConnectionFactory poolableConnectionFactory =
-            new PoolableConnectionFactory(connectionFactory);
+            new PoolableConnectionFactory(connectionFactory, null);
         poolableConnectionFactory.setDefaultReadOnly(false);
         poolableConnectionFactory.setDefaultAutoCommit(true);
         ObjectPool<PoolableConnection> connectionPool =

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java
 Wed Dec 11 10:37:34 2013
@@ -76,7 +76,7 @@ public class TestManagedDataSource exten
 
         // create the pool object factory
         PoolableConnectionFactory factory =
-            new PoolableConnectionFactory(xaConnectionFactory);
+            new PoolableConnectionFactory(xaConnectionFactory, null);
         factory.setValidationQuery("SELECT DUMMY FROM DUAL");
         factory.setDefaultReadOnly(true);
         factory.setDefaultAutoCommit(true);


Reply via email to