aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRich Tabedzki <richard.tabedzki@att.com>2017-05-02 15:21:11 +0000
committerRich Tabedzki <richard.tabedzki@att.com>2017-05-02 15:23:39 +0000
commitd7442d6613d566f220c1876e1094598feffd5ea8 (patch)
treea3271edf7143ea18cd177d21ac7bcf87156bdcad
parentff5caca08a31cb0152b1eaf74a774aca67501975 (diff)
[SDNC-8] summary
Upadted dependencies Change-Id: I431b34177c4b4e76744ef3b305c3998a1a57b8ca Signed-off-by: Rich Tabedzki <richard.tabedzki@att.com>
-rwxr-xr-xdblib/common/LICENSE201
-rwxr-xr-xdblib/common/NOTICE6
-rwxr-xr-xdblib/common/build.properties.default100
-rwxr-xr-xdblib/common/doc/changelog.xml133
-rwxr-xr-xdblib/common/doc/jdbc-pool.xml988
-rwxr-xr-xdblib/common/doc/package.xsl249
-rwxr-xr-xdblib/common/doc/project.xml31
-rwxr-xr-xdblib/common/pom.xml88
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/naming/GenericNamingResourcesFactory.java254
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ClassLoaderUtil.java81
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java1500
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSource.java180
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java612
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java1496
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DisposableConnectionFacade.java118
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java579
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java259
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/MultiLockFairBlockingQueue.java584
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java917
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolExhaustedException.java76
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java1332
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolUtilities.java58
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java795
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java176
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/TrapException.java101
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/Validator.java57
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/XADataSource.java57
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java158
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractQueryReport.java285
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java184
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/QueryTimeoutInterceptor.java77
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ResetAbandonedTimer.java112
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java516
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java338
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmxMBean.java43
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementCache.java358
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementDecoratorInterceptor.java342
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java136
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml56
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java960
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPoolMBean.java107
-rw-r--r--dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/mbeans-descriptors.xml420
-rw-r--r--dblib/common/src/main/java/org/openecomp/sdnc/sli/resource/common/CommonActivator.java40
-rwxr-xr-xdblib/features/src/main/resources/features.xml2
-rwxr-xr-xdblib/pom.xml1
-rwxr-xr-xdblib/provider/pom.xml5
-rwxr-xr-x[-rw-r--r--]filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java55
-rwxr-xr-xrootpom/pom.xml1
48 files changed, 51 insertions, 15173 deletions
diff --git a/dblib/common/LICENSE b/dblib/common/LICENSE
deleted file mode 100755
index f49a4e1..0000000
--- a/dblib/common/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- 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. \ No newline at end of file
diff --git a/dblib/common/NOTICE b/dblib/common/NOTICE
deleted file mode 100755
index 0b6fc4b..0000000
--- a/dblib/common/NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Tomcat JDBC Pool
-Copyright 2008-2016 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/dblib/common/build.properties.default b/dblib/common/build.properties.default
deleted file mode 100755
index f15ecac..0000000
--- a/dblib/common/build.properties.default
+++ /dev/null
@@ -1,100 +0,0 @@
-# -----------------------------------------------------------------------------
-# 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.
-# -----------------------------------------------------------------------------
-# build.properties.sample
-#
-# This is an example "build.properties" file, used to customize building
-# Tomcat JDBC Pool for your local environment. It defines the location of all external
-# modules that Tomcat JDBC Pool depends on. Copy this file to "build.properties"
-# in the top-level source directory, and customize it as needed.
-# -----------------------------------------------------------------------------
-
-# ----- Vesion Control Flags -----
-version.major=1
-version.minor=1
-version.build=0
-version.patch=1
-version.suffix=
-
-# ----- Default Base Path for Dependent Packages -----
-# Please note this path must be absolute, not relative,
-# as it is referenced with different working directory
-# contexts by the various build scripts.
-base.path=${basedir}/includes
-
-compile.source=1.7
-compile.target=1.7
-compile.debug=true
-
-# Do not pass -deprecation (-Xlint:deprecation) flag to javac
-compile.deprecation=false
-
-# ----- Settings for Junit test database.
-
-# Common settings
-testdb.username=root
-testdb.password=password
-
-# H2
-testdb.url=jdbc:h2:~/.h2/test;QUERY_TIMEOUT=0;DB_CLOSE_ON_EXIT=TRUE;LOCK_TIMEOUT=50000;DEFAULT_LOCK_TIMEOUT=50000
-testdb.driverClassName=org.h2.Driver
-testdb.validationQuery=SELECT 1
-
-# MySQL
-#testdb.url=jdbc:mysql://localhost:3306/mysql?autoReconnect=true
-#testdb.driverClassName=com.mysql.jdbc.Driver
-#testdb.validationQuery=SELECT 1
-
-# Derby
-#testdb.url=jdbc:derby:derbyDB;create=true
-#testdb.driverClassName=org.apache.derby.jdbc.EmbeddedDriver
-#testdb.validationQuery=VALUES 1
-
-# JUnit Unit Test Suite
-junit.version=4.11
-junit.home=${base.path}/junit-${junit.version}
-junit.jar=${junit.home}/junit-${junit.version}.jar
-junit.loc=http://repo.maven.apache.org/maven2/junit/junit/${junit.version}/junit-${junit.version}.jar
-
-# Hamcrest Library, used by JUnit
-hamcrest.version=1.3
-hamcrest.home=${base.path}/hamcrest-${hamcrest.version}
-hamcrest.jar=${hamcrest.home}/hamcrest-core-${hamcrest.version}.jar
-hamcrest.loc=http://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/${hamcrest.version}/hamcrest-core-${hamcrest.version}.jar
-
-mysql.home=${base.path}/mysql-connector-java-5.1.12
-mysql.jar=${mysql.home}/mysql-connector-java-5.1.12-bin.jar
-mysql.loc=http://mysql.mirrors.hoobly.com/Downloads/Connector-J/mysql-connector-java-5.1.12.zip
-
-tomcat.version=8.0.14
-tomcat.home=${base.path}/apache-tomcat-${tomcat.version}
-tomcat.dbcp.jar=${tomcat.home}/lib/tomcat-dbcp.jar
-tomcat.juli.jar=${tomcat.home}/bin/tomcat-juli.jar
-tomcat.loc=http://archive.apache.org/dist/tomcat/tomcat-8/v${tomcat.version}/bin/apache-tomcat-${tomcat.version}.zip
-
-tomcat.project.loc=http://svn.apache.org/repos/asf/tomcat/trunk/webapps/docs/project.xml
-tomcat.project.dest=${base.path}/project.xml
-
-tomcat.xsl.loc=http://svn.apache.org/repos/asf/tomcat/trunk/webapps/docs/tomcat-docs.xsl
-tomcat.xsl.dest=${base.path}/tomcat-docs.xsl
-
-derby.home=${base.path}/db-derby-10.5.1.1-bin
-derby.loc=http://archive.apache.org/dist/db/derby/db-derby-10.5.1.1/db-derby-10.5.1.1-bin.tar.gz
-derby.jar=${derby.home}/lib/derby.jar
-
-h2.home=${base.path}/h2
-h2.loc=http://h2database.googlecode.com/files/h2-2010-02-19.zip
-h2.jar=${h2.home}/bin/h2-1.2.129.jar
diff --git a/dblib/common/doc/changelog.xml b/dblib/common/doc/changelog.xml
deleted file mode 100755
index 2d7ddf8..0000000
--- a/dblib/common/doc/changelog.xml
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<!DOCTYPE document [
- <!ENTITY project SYSTEM "@TOMCAT_PROJECT_DEST@">
-]>
-<?xml-stylesheet type="text/xsl" href="package.xsl"?>
-<document url="changelog.html">
-
- &project;
-
- <properties>
- <author email="fhanik@apache.org">Filip Hanik</author>
- <title>Changelog</title>
- </properties>
-
-<body>
-
-<section name="Tomcat JDBC Connection Pool - Apache Tomcat 7.0.19 and later">
- <p>
- Starting with Apache Tomcat 7.0.19 in July 2011, Tomcat JDBC Connection Pool
- is built and released as a component in official releases of Tomcat.
- The changes are now listed in "jdbc-pool" sections of Apache Tomcat
- changelog file. This changelog file is obsolete.
- </p>
-</section>
-
-<section name="Tomcat JDBC Connection Pool 1.1.0.0">
- <subsection name="pool">
- <changelog>
- <add><rev>1207712</rev> Pool cleaner should be a global thread, not spawn one thread per connection pool. (fhanik)</add>
- <fix><rev>1073531</rev> <bug>50805</bug> Only initialize connections once when async (fhanik)</fix>
- <fix><rev>1076380</rev> <bug>50857</bug> Correctly handle timeouts when the pool is busy when async (fhanik)</fix>
- <add>Added QueryTimeoutInterceptor to be able to configure timeouts on running queries automatically.</add>
- </changelog>
- </subsection>
-</section>
-
-<section name="Tomcat JDBC Connection Pool 1.0.9.4">
- <subsection name="pool">
- <changelog>
- <fix><rev>1069864</rev> <bug>50759</bug> Correctly set validation timestamp when using external validator.(fhanik)</fix>
- </changelog>
- </subsection>
-</section>
-
-<section name="Tomcat JDBC Connection Pool 1.0.9.3">
- <subsection name="pool">
- <changelog>
- <fix><rev>1060998</rev> <bug>50613</bug> Fix concurrency issue around pool size calculation.(fhanik)</fix>
- </changelog>
- </subsection>
-</section>
-<section name="Tomcat JDBC Connection Pool 1.0.9.2">
- <subsection name="pool">
- <changelog>
- <fix><rev>1057743</rev> Make sure passwords are masked.(fhanik)</fix>
- </changelog>
- </subsection>
-</section>
-<section name="Tomcat JDBC Connection Pool 1.0.9.0">
- <subsection name="pool">
- <changelog>
- <fix><rev>997321</rev> Ensure threads borrowing connections do not
- get stuck waiting for a new connection if a connection is released in
- another thread. (markt)</fix>
- <fix><rev>995432</rev> Make interceptor class names, property names
- and property values tolerant of whitespace by trimming the values before
- use. (markt)</fix>
- <fix><rev>995091</rev> <bug>49831</bug> Make sure pooled XAConnections are
- closed when the connection pool shuts down. Patch provided by Daniel
- Mikusa. (markt)</fix>
- <update><rev>995087</rev> Code clean-up. Remove some unused code. (markt)
- </update>
- <update><rev>995083</rev> Update to Tomcat 6.0.29 (for JULI). (markt)
- </update>
- <update><rev>992409</rev> Code clean-up. Reduce sequences of three or more
- blank lines to two blank lines. (markt)</update>
- <add><rev>952811</rev>, <rev>995095</rev> <bug>48814</bug> Add Validator
- interface and allow users to configure a Validator class name. Patch
- provided by Matt Passell. (markt)</add>
- <update><rev>948073</rev> Code clean-up. Remove unused imports. (markt)
- </update>
- <fix><rev>943434</rev> <bug>49224</bug> Only try setting the username and
- password if they are non-null. Patch provided by Matt Passell. (markt)
- </fix>
- <fix><rev>943032</rev> <bug>49269</bug> Set maxIdle to maxActive by
- default to prevent warning on start when maxIdle > maxActive. Patch
- provided by Matt Passell. (markt)</fix>
- <fix><rev>940574</rev> <bug>49241</bug> Don&apos;t ignore the
- suspectTimeout property. (fhanik)</fix>
- <fix><rev>939320</rev> Fix svn:keywords for property replacement.
- (kkolinko)</fix>
- <add><rev>931550</rev>, <rev>934651</rev>, <rev>934677</rev> Add a
- statement cache. (fhanik)</add>
- <update><rev>919076</rev> Improve XA support. (fhanik)</update>
- <fix><rev>915940</rev> <bug>48392</bug> Add an interceptor to wrap
- Statements and ResultSets to prevent access to the physical connection.
- (fhanik)</fix>
- <fix><rev>912026</rev> Call <code>setTransactionIsolation()</code> before
- anything else as some drivers require this to be the first call. (fhanik)
- </fix>
- <update><rev>900017</rev> Update Javadoc for XADataSource. (kkolinko)
- </update>
- </changelog>
- </subsection>
-</section>
-<section name="Tomcat JDBC Connection Pool prior to 1.0.9.0 (incomplete)">
- <subsection name="pool">
- <changelog>
- <update><rev>720253</rev> Document how to use interceptors</update>
- <update><rev>717972</rev> Added an interceptor that will clean up non closed statements when a connection is returned to the pool. (<code>org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer</code>)</update>
- <update><rev>713763</rev> Improve connection state handling</update>
- <fix><rev>713763</rev> Improve connection state handling</fix>
- </changelog>
- </subsection>
-</section>
-</body>
-</document>
diff --git a/dblib/common/doc/jdbc-pool.xml b/dblib/common/doc/jdbc-pool.xml
deleted file mode 100755
index 8d69624..0000000
--- a/dblib/common/doc/jdbc-pool.xml
+++ /dev/null
@@ -1,988 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<!DOCTYPE document [
- <!ENTITY project SYSTEM "@TOMCAT_PROJECT_DEST@">
-]>
-<document url="jdbc-pool.html">
-
- &project;
-
- <properties>
- <author email="fhanik@apache.org">Filip Hanik</author>
- <title>The Tomcat JDBC Connection Pool</title>
- </properties>
-
-<body>
-
-<section name="Table of Contents">
-<toc/>
-</section>
-
-<section name="Introduction">
-
- <p>The <strong>JDBC Connection Pool <code>org.apache.tomcat.jdbc.pool</code></strong>
- is a replacement or an alternative to the <a href="http://commons.apache.org/dbcp/">Apache Commons DBCP</a>
- connection pool.</p>
-
- <p>So why do we need a new connection pool?</p>
-
- <p>Here are a few of the reasons:</p>
- <ol>
- <li>Commons DBCP 1.x is single threaded. In order to be thread safe
- Commons locks the entire pool for short periods during both object
- allocation and object return. Note that this does not apply to
- Commons DBCP 2.x.</li>
- <li>Commons DBCP 1.x can be slow. As the number of logical CPUs grows and
- the number of concurrent threads attempting to borrow or return
- objects increases, the performance suffers. For highly concurrent
- systems the impact can be significant. Note that this does not apply
- to Commons DBCP 2.x.</li>
- <li>Commons DBCP is over 60 classes. tomcat-jdbc-pool core is 8 classes,
- hence modifications for future requirement will require much less
- changes. This is all you need to run the connection pool itself, the
- rest is gravy.</li>
- <li>Commons DBCP uses static interfaces. This means you have to use the
- right version for a given JRE version or you may see
- <code>NoSuchMethodException</code> exceptions.</li>
- <li>It's not worth rewriting over 60 classes, when a connection pool can
- be accomplished with a much simpler implementation.</li>
- <li>Tomcat jdbc pool implements the ability retrieve a connection
- asynchronously, without adding additional threads to the library
- itself.</li>
- <li>Tomcat jdbc pool is a Tomcat module, it depends on Tomcat JULI, a
- simplified logging framework used in Tomcat.</li>
- <li>Retrieve the underlying connection using the
- <code>javax.sql.PooledConnection</code> interface.</li>
- <li>Starvation proof. If a pool is empty, and threads are waiting for a
- connection, when a connection is returned, the pool will awake the
- correct thread waiting. Most pools will simply starve.</li>
- </ol>
-
- <p>Features added over other connection pool implementations</p>
- <ol>
- <li>Support for highly concurrent environments and multi core/cpu systems.</li>
- <li>Dynamic implementation of interface, will support <code>java.sql</code> and <code>javax.sql</code> interfaces for
- your runtime environment (as long as your JDBC driver does the same), even when compiled with a lower version of the JDK.</li>
- <li>Validation intervals - we don't have to validate every single time we use the connection, we can do this
- when we borrow or return the connection, just not more frequent than an interval we can configure.</li>
- <li>Run-Once query, a configurable query that will be run only once, when the connection to the database is established.
- Very useful to setup session settings, that you want to exist during the entire time the connection is established.</li>
- <li>Ability to configure custom interceptors.
- This allows you to write custom interceptors to enhance the functionality. You can use interceptors to gather query stats,
- cache session states, reconnect the connection upon failures, retry queries, cache query results, and so on.
- Your options are endless and the interceptors are dynamic, not tied to a JDK version of a
- <code>java.sql</code>/<code>javax.sql</code> interface.</li>
- <li>High performance - we will show some differences in performance later on</li>
- <li>Extremely simple, due to the very simplified implementation, the line count and source file count are very low, compare with c3p0
- that has over 200 source files(last time we checked), Tomcat jdbc has a core of 8 files, the connection pool itself is about half
- that. As bugs may occur, they will be faster to track down, and easier to fix. Complexity reduction has been a focus from inception.</li>
- <li>Asynchronous connection retrieval - you can queue your request for a connection and receive a <code>Future&lt;Connection&gt;</code> back.</li>
- <li>Better idle connection handling. Instead of closing connections directly, it can still pool connections and sizes the idle pool with a smarter algorithm.</li>
- <li>You can decide at what moment connections are considered abandoned, is it when the pool is full, or directly at a timeout
- by specifying a pool usage threshold.
- </li>
- <li>The abandon connection timer will reset upon a statement/query activity. Allowing a connections that is in use for a long time to not timeout.
- This is achieved using the <code>ResetAbandonedTimer</code>
- </li>
- <li>Close connections after they have been connected for a certain time. Age based close upon return to the pool.
- </li>
- <li>Get JMX notifications and log entries when connections are suspected for being abandoned. This is similar to
- the <code>removeAbandonedTimeout</code> but it doesn't take any action, only reports the information.
- This is achieved using the <code>suspectTimeout</code> attribute.</li>
- <li>Connections can be retrieved from a <code>java.sql.Driver</code>, <code>javax.sql.DataSource</code> or <code>javax.sql.XADataSource</code>
- This is achieved using the <code>dataSource</code> and <code>dataSourceJNDI</code> attributes.</li>
- <li>XA connection support</li>
- </ol>
-
-
-</section>
-<section name="How to use">
- <p>
- Usage of the Tomcat connection pool has been made to be as simple as possible, for those of you that are familiar with commons-dbcp, the
- transition will be very simple. Moving from other connection pools is also fairly straight forward.
- </p>
- <subsection name="Additional features">
- <p>The Tomcat connection pool offers a few additional features over what most other pools let you do:</p>
- <ul>
- <li><code>initSQL</code> - the ability to run a SQL statement exactly once, when the connection is created</li>
- <li><code>validationInterval</code> - in addition to running validations on connections, avoid running them too frequently.</li>
- <li><code>jdbcInterceptors</code> - flexible and pluggable interceptors to create any customizations around the pool,
- the query execution and the result set handling. More on this in the advanced section.</li>
- <li><code>fairQueue</code> - Set the fair flag to true to achieve thread fairness or to use asynchronous connection retrieval</li>
- </ul>
- </subsection>
- <subsection name="Inside the Apache Tomcat Container">
- <p>
- The Tomcat Connection pool is configured as a resource described in <a href="http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html" target="_blank">The Tomcat JDBC documentation</a>
- With the only difference being that you have to specify the <code>factory</code> attribute and set the value to
- <code>org.apache.tomcat.jdbc.pool.DataSourceFactory</code>
- </p>
- </subsection>
- <subsection name="Standalone">
- <p>
- The connection pool only has another dependency, and that is on tomcat-juli.jar.
- To configure the pool in a stand alone project using bean instantiation, the bean to instantiate is
- <code>org.apache.tomcat.jdbc.pool.DataSource</code>. The same attributes (documented below) as you use to configure a connection
- pool as a JNDI resource, are used to configure a data source as a bean.
- </p>
- </subsection>
- <subsection name="JMX">
- <p>
- The connection pool object exposes an MBean that can be registered.
- In order for the connection pool object to create the MBean, the flag <code>jmxEnabled</code> has to be set to true.
- This doesn't imply that the pool will be registered with an MBean server, merely that the MBean is created.
- In a container like Tomcat, Tomcat itself registers the DataSource with the MBean server, the
- <code>org.apache.tomcat.jdbc.pool.DataSource</code> object will then register the actual
- connection pool MBean.
- If you're running outside of a container, you can register the DataSource yourself under any object name you specify,
- and it propagates the registration to the underlying pool. To do this you would call <code>mBeanServer.registerMBean(dataSource.getPool().getJmxPool(),objectname)</code>.
- Prior to this call, ensure that the pool has been created by calling <code>dataSource.createPool()</code>.
- </p>
- </subsection>
-
-</section>
-<section name="Attributes">
- <p>To provide a very simple switch to and from commons-dbcp and tomcat-jdbc-pool,
- Most attributes are the same and have the same meaning.</p>
- <subsection name="JNDI Factory and Type">
- <attributes>
- <attribute name="factory" required="true">
- <p>factory is required, and the value should be <code>org.apache.tomcat.jdbc.pool.DataSourceFactory</code></p>
- </attribute>
- <attribute name="type" required="true">
- <p>Type should always be <code>javax.sql.DataSource</code> or <code>javax.sql.XADataSource</code></p>
- <p>Depending on the type a <code>org.apache.tomcat.jdbc.pool.DataSource</code> or a <code>org.apache.tomcat.jdbc.pool.XADataSource</code> will be created.</p>
- </attribute>
- </attributes>
- </subsection>
-
- <subsection name="System Properties">
- <p>System properties are JVM wide, affect all pools created in the JVM</p>
- <attributes>
- <attribute name="org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader" required="false">
- <p>(boolean) Controls classloading of dynamic classes, such as
- JDBC drivers, interceptors and validators. If set to
- <code>false</code>, default value, the pool will first attempt
- to load using the current loader (i.e. the class loader that
- loaded the pool classes) and if class loading fails attempt to
- load using the thread context loader. Set this value to
- <code>true</code>, if you wish to remain backwards compatible
- with Apache Tomcat 8.0.8 and earlier, and only attempt the
- current loader.
- If not set then the default value is <code>false</code>.
- </p>
- </attribute>
- </attributes>
- </subsection>
-
- <subsection name="Common Attributes">
- <p>These attributes are shared between commons-dbcp and tomcat-jdbc-pool, in some cases default values are different.</p>
- <attributes>
-
- <attribute name="defaultAutoCommit" required="false">
- <p>(boolean) The default auto-commit state of connections created by this pool. If not set, default is JDBC driver default (If not set then the <code>setAutoCommit</code> method will not be called.)</p>
- </attribute>
-
- <attribute name="defaultReadOnly" required="false">
- <p>(boolean) The default read-only state of connections created by this pool. If not set then the <code>setReadOnly</code> method will not be called. (Some drivers don't support read only mode, ex: Informix)</p>
- </attribute>
-
- <attribute name="defaultTransactionIsolation" required="false">
- <p>(String) The default TransactionIsolation state of connections created by this pool. One of the following: (see javadoc )</p>
- <ul>
- <li><code>NONE</code></li>
- <li><code>READ_COMMITTED</code></li>
- <li><code>READ_UNCOMMITTED</code></li>
- <li><code>REPEATABLE_READ</code></li>
- <li><code>SERIALIZABLE</code></li>
- </ul>
- <p>If not set, the method will not be called and it defaults to the JDBC driver.</p>
- </attribute>
-
- <attribute name="defaultCatalog" required="false">
- <p>(String) The default catalog of connections created by this pool.</p>
- </attribute>
-
- <attribute name="driverClassName" required="true">
- <p>(String) The fully qualified Java class name of the JDBC driver to be used. The driver has to be accessible
- from the same classloader as tomcat-jdbc.jar
- </p>
- </attribute>
-
- <attribute name="username" required="true">
- <p>(String) The connection username to be passed to our JDBC driver to establish a connection.
- Note that method <code>DataSource.getConnection(username,password)</code>
- by default will not use credentials passed into the method,
- but will use the ones configured here. See <code>alternateUsernameAllowed</code>
- property for more details.
- </p>
- </attribute>
-
- <attribute name="password" required="true">
- <p>(String) The connection password to be passed to our JDBC driver to establish a connection.
- Note that method <code>DataSource.getConnection(username,password)</code>
- by default will not use credentials passed into the method,
- but will use the ones configured here. See <code>alternateUsernameAllowed</code>
- property for more details.
- </p>
- </attribute>
-
- <attribute name="maxActive" required="false">
- <p>(int) The maximum number of active connections that can be allocated from this pool at the same time.
- The default value is <code>100</code></p>
- </attribute>
-
- <attribute name="maxIdle" required="false">
- <p>(int) The maximum number of connections that should be kept in the pool at all times.
- Default value is <code>maxActive</code>:<code>100</code>
- Idle connections are checked periodically (if enabled) and
- connections that been idle for longer than <code>minEvictableIdleTimeMillis</code>
- will be released. (also see <code>testWhileIdle</code>)</p>
- </attribute>
-
- <attribute name="minIdle" required="false">
- <p>
- (int) The minimum number of established connections that should be kept in the pool at all times.
- The connection pool can shrink below this number if validation queries fail.
- Default value is derived from <code>initialSize</code>:<code>10</code> (also see <code>testWhileIdle</code>)
- </p>
- </attribute>
-
- <attribute name="initialSize" required="false">
- <p>(int)The initial number of connections that are created when the pool is started.
- Default value is <code>10</code></p>
- </attribute>
-
- <attribute name="maxWait" required="false">
- <p>(int) The maximum number of milliseconds that the pool will wait (when there are no available connections)
- for a connection to be returned before throwing an exception.
- Default value is <code>30000</code> (30 seconds)</p>
- </attribute>
-
- <attribute name="testOnBorrow" required="false">
- <p>(boolean) The indication of whether objects will be validated before being borrowed from the pool.
- If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another.
- NOTE - for a true value to have any effect, the <code>validationQuery</code>
- or <code>validatorClassName</code> parameter must be set to a non-null string.
- In order to have a more efficient validation, see <code>validationInterval</code>.
- Default value is <code>false</code>
- </p>
- </attribute>
-
- <attribute name="testOnConnect" required="false">
- <p>(boolean) The indication of whether objects will be validated when a connection is first created.
- If an object fails to validate, it will be throw <code>SQLException</code>.
- NOTE - for a true value to have any effect, the <code>validationQuery</code>, <code>initSQL</code>
- or <code>validatorClassName</code> parameter must be set to a non-null string.
- Default value is <code>false</code>
- </p>
- </attribute>
-
- <attribute name="testOnReturn" required="false">
- <p>(boolean) The indication of whether objects will be validated before being returned to the pool.
- NOTE - for a true value to have any effect, the <code>validationQuery</code>
- or <code>validatorClassName</code> parameter must be set to a non-null string.
- The default value is <code>false</code>.
- </p>
- </attribute>
-
- <attribute name="testWhileIdle" required="false">
- <p>(boolean) The indication of whether objects will be validated by the idle object evictor (if any).
- If an object fails to validate, it will be dropped from the pool.
- NOTE - for a true value to have any effect, the <code>validationQuery</code>
- or <code>validatorClassName</code> parameter must be set to a non-null string.
- The default value is <code>false</code> and this property has to be set in order for the
- pool cleaner/test thread is to run (also see <code>timeBetweenEvictionRunsMillis</code>)
- </p>
- </attribute>
-
- <attribute name="validationQuery" required="false">
- <p>(String) The SQL query that will be used to validate connections from this pool before returning them to the caller.
- If specified, this query does not have to return any data, it just can't throw a <code>SQLException</code>.
- The default value is <code>null</code>.
- Example values are <code>SELECT 1</code>(mysql), <code>select 1 from dual</code>(oracle), <code>SELECT 1</code>(MS Sql Server)
- </p>
- </attribute>
-
- <attribute name="validationQueryTimeout" required="false">
- <p>(int) The timeout in seconds before a connection validation queries fail. This works by calling
- <code>java.sql.Statement.setQueryTimeout(seconds)</code> on the statement that executes the <code>validationQuery</code>.
- The pool itself doesn't timeout the query, it is still up to the JDBC driver to enforce query timeouts.
- A value less than or equal to zero will disable this feature.
- The default value is <code>-1</code>.
- </p>
- </attribute>
-
- <attribute name="validatorClassName" required="false">
- <p>(String) The name of a class which implements the
- <code>org.apache.tomcat.jdbc.pool.Validator</code> interface and
- provides a no-arg constructor (may be implicit). If specified, the
- class will be used to create a Validator instance which is then used
- instead of any validation query to validate connections. The default
- value is <code>null</code>. An example value is
- <code>com.mycompany.project.SimpleValidator</code>.
- </p>
- </attribute>
-
- <attribute name="timeBetweenEvictionRunsMillis" required="false">
- <p>(int) The number of milliseconds to sleep between runs of the idle connection validation/cleaner thread.
- This value should not be set under 1 second. It dictates how often we check for idle, abandoned connections, and how often
- we validate idle connections.
- The default value is <code>5000</code> (5 seconds). <br/>
- </p>
- </attribute>
-
- <attribute name="numTestsPerEvictionRun" required="false">
- <p>(int) Property not used in tomcat-jdbc-pool.</p>
- </attribute>
-
- <attribute name="minEvictableIdleTimeMillis" required="false">
- <p>(int) The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.
- The default value is <code>60000</code> (60 seconds).</p>
- </attribute>
-
- <attribute name="accessToUnderlyingConnectionAllowed" required="false">
- <p>(boolean) Property not used. Access can be achieved by calling <code>unwrap</code> on the pooled connection.
- see <code>javax.sql.DataSource</code> interface, or call <code>getConnection</code> through reflection or
- cast the object as <code>javax.sql.PooledConnection</code></p>
- </attribute>
-
- <attribute name="removeAbandoned" required="false">
- <p>(boolean) Flag to remove abandoned connections if they exceed the <code>removeAbandonedTimeout</code>.
- If set to true a connection is considered abandoned and eligible for removal if it has been in use
- longer than the <code>removeAbandonedTimeout</code> Setting this to <code>true</code> can recover db connections from
- applications that fail to close a connection. See also <code>logAbandoned</code>
- The default value is <code>false</code>.</p>
- </attribute>
-
- <attribute name="removeAbandonedTimeout" required="false">
- <p>(int) Timeout in seconds before an abandoned(in use) connection can be removed.
- The default value is <code>60</code> (60 seconds). The value should be set to the longest running query your applications
- might have.</p>
- </attribute>
-
- <attribute name="logAbandoned" required="false">
- <p>(boolean) Flag to log stack traces for application code which abandoned a Connection.
- Logging of abandoned Connections adds overhead for every Connection borrow because a stack trace has to be generated.
- The default value is <code>false</code>.</p>
- </attribute>
-
- <attribute name="connectionProperties" required="false">
- <p>(String) The connection properties that will be sent to our JDBC driver when establishing new connections.
- Format of the string must be [propertyName=property;]*
- NOTE - The "user" and "password" properties will be passed explicitly, so they do not need to be included here.
- The default value is <code>null</code>.</p>
- </attribute>
-
- <attribute name="poolPreparedStatements" required="false">
- <p>(boolean) Property not used.</p>
- </attribute>
-
- <attribute name="maxOpenPreparedStatements" required="false">
- <p>(int) Property not used.</p>
- </attribute>
-
- </attributes>
-
- </subsection>
-
- <subsection name="Tomcat JDBC Enhanced Attributes">
-
- <attributes>
-
- <attribute name="initSQL" required="false">
- <p>(String) A custom query to be run when a connection is first created.
- The default value is <code>null</code>.</p>
- </attribute>
-
- <attribute name="jdbcInterceptors" required="false">
- <p>(String) A semicolon separated list of classnames extending
- <code>org.apache.tomcat.jdbc.pool.JdbcInterceptor</code> class.
- See <a href="#Configuring_JDBC_interceptors">Configuring JDBC interceptors</a>
- below for more detailed description of syntaz and examples.
- </p>
- <p>
- These interceptors will be inserted as an interceptor into the chain
- of operations on a <code>java.sql.Connection</code> object.
- The default value is <code>null</code>.
- </p>
- <p>
- Predefined interceptors:<br/>
- <code>org.apache.tomcat.jdbc.pool.interceptor.<br />ConnectionState</code>
- - keeps track of auto commit, read only, catalog and transaction isolation level.<br/>
- <code>org.apache.tomcat.jdbc.pool.interceptor.<br />StatementFinalizer</code>
- - keeps track of opened statements, and closes them when the connection is returned to the pool.
- </p>
- <p>
- More predefined interceptors are described in detail in the
- <a href="#JDBC_interceptors">JDBC Interceptors section</a>.
- </p>
- </attribute>
-
- <attribute name="validationInterval" required="false">
- <p>(long) avoid excess validation, only run validation at most at this frequency - time in milliseconds.
- If a connection is due for validation, but has been validated previously within this interval, it will not be validated again.
- The default value is <code>3000</code> (3 seconds).</p>
- </attribute>
-
- <attribute name="jmxEnabled" required="false">
- <p>(boolean) Register the pool with JMX or not.
- The default value is <code>true</code>.</p>
- </attribute>
-
- <attribute name="fairQueue" required="false">
- <p>(boolean) Set to true if you wish that calls to getConnection should be treated
- fairly in a true FIFO fashion. This uses the <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue</code>
- implementation for the list of the idle connections. The default value is <code>true</code>.
- This flag is required when you want to use asynchronous connection retrieval.<br/>
- Setting this flag ensures that threads receive connections in the order they arrive.<br/>
- During performance tests, there is a very large difference in how locks
- and lock waiting is implemented. When <code>fairQueue=true</code>
- there is a decision making process based on what operating system the system is running.
- If the system is running on Linux (property <code>os.name=Linux</code>.
- To disable this Linux specific behavior and still use the fair queue, simply add the property
- <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true</code> to your system properties
- before the connection pool classes are loaded.
- </p>
- </attribute>
-
- <attribute name="abandonWhenPercentageFull" required="false">
- <p>(int) Connections that have been abandoned (timed out) wont get closed and reported up unless
- the number of connections in use are above the percentage defined by <code>abandonWhenPercentageFull</code>.
- The value should be between 0-100.
- The default value is <code>0</code>, which implies that connections are eligible for closure as soon
- as <code>removeAbandonedTimeout</code> has been reached.</p>
- </attribute>
-
- <attribute name="maxAge" required="false">
- <p>(long) Time in milliseconds to keep this connection. This attribute
- works both when returning connection and when borrowing connection.
- When a connection is borrowed from the pool, the pool will check to see
- if the <code>now - time-when-connected > maxAge</code> has been reached
- , and if so, it reconnects before borrow it. When a connection is
- returned to the pool, the pool will check to see if the
- <code>now - time-when-connected > maxAge</code> has been reached, and
- if so, it closes the connection rather than returning it to the pool.
- The default value is <code>0</code>, which implies that connections
- will be left open and no age check will be done upon borrowing from the
- pool and returning the connection to the pool.</p>
- </attribute>
-
- <attribute name="useEquals" required="false">
- <p>(boolean) Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> and set to <code>false</code>
- when you wish to use <code>==</code> when comparing method names. This property does not apply to added interceptors as those are configured individually.
- The default value is <code>true</code>.
- </p>
- </attribute>
- <attribute name="suspectTimeout" required="false">
- <p>(int) Timeout value in seconds. Default value is <code>0</code>.<br/>
- Similar to to the <code>removeAbandonedTimeout</code> value but instead of treating the connection
- as abandoned, and potentially closing the connection, this simply logs the warning if
- <code>logAbandoned</code> is set to true. If this value is equal or less than 0, no suspect
- checking will be performed. Suspect checking only takes place if the timeout value is larger than 0 and
- the connection was not abandoned or if abandon check is disabled. If a connection is suspect a WARN message gets
- logged and a JMX notification gets sent once.
- </p>
- </attribute>
- <attribute name="rollbackOnReturn" required="false">
- <p>(boolean) If <code>autoCommit==false</code> then the pool can terminate the transaction by calling rollback on the connection as it is returned to the pool
- Default value is <code>false</code>.<br/>
- </p>
- </attribute>
- <attribute name="commitOnReturn" required="false">
- <p>(boolean) If <code>autoCommit==false</code> then the pool can complete the transaction by calling commit on the connection as it is returned to the pool
- If <code>rollbackOnReturn==true</code> then this attribute is ignored.
- Default value is <code>false</code>.<br/>
- </p>
- </attribute>
- <attribute name="alternateUsernameAllowed" required="false">
- <p>(boolean) By default, the jdbc-pool will ignore the
- <a href="http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)"><code>DataSource.getConnection(username,password)</code></a>
- call, and simply return a previously pooled connection under the globally configured properties <code>username</code> and <code>password</code>, for performance reasons.
- </p>
- <p>
- The pool can however be configured to allow use of different credentials
- each time a connection is requested. To enable the functionality described in the
- <a href="http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)"><code>DataSource.getConnection(username,password)</code></a>
- call, simply set the property <code>alternateUsernameAllowed</code>
- to <code>true</code>.<br />
- Should you request a connection with the credentials user1/password1 and the connection
- was previously connected using different user2/password2, the connection will be closed,
- and reopened with the requested credentials. This way, the pool size is still managed
- on a global level, and not on a per schema level. <br/>
- The default value is <code>false</code>.<br/>
- This property was added as an enhancement to <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=50025">bug 50025</a>.
- </p>
- </attribute>
- <attribute name="dataSource" required="false">
- <p>(javax.sql.DataSource) Inject a data source to the connection pool, and the pool will use the data source to retrieve connections instead of establishing them using the <code>java.sql.Driver</code> interface.
- This is useful when you wish to pool XA connections or connections established using a data source instead of a connection string. Default value is <code>null</code>
- </p>
- </attribute>
- <attribute name="dataSourceJNDI" required="false">
- <p>(String) The JNDI name for a data source to be looked up in JNDI and then used to establish connections to the database. See the <code>dataSource</code> attribute. Default value is <code>null</code>
- </p>
- </attribute>
- <attribute name="useDisposableConnectionFacade" required="false">
- <p>(boolean) Set this to true if you wish to put a facade on your connection so that it cannot be reused after it has been closed. This prevents a thread holding on to a
- reference of a connection it has already called closed on, to execute queries on it. Default value is <code>true</code>.
- </p>
- </attribute>
- <attribute name="logValidationErrors" required="false">
- <p>(boolean) Set this to true to log errors during the validation phase to the log file. If set to true, errors will be logged as SEVERE. Default value is <code>false</code> for backwards compatibility.
- </p>
- </attribute>
- <attribute name="propagateInterruptState" required="false">
- <p>(boolean) Set this to true to propagate the interrupt state for a thread that has been interrupted (not clearing the interrupt state). Default value is <code>false</code> for backwards compatibility.
- </p>
- </attribute>
- <attribute name="ignoreExceptionOnPreLoad" required="false">
- <p>(boolean) Flag whether ignore error of connection creation while initializing the pool.
- Set to true if you want to ignore error of connection creation while initializing the pool.
- Set to false if you want to fail the initialization of the pool by throwing exception.
- The default value is <code>false</code>.
- </p>
- </attribute>
-
- </attributes>
- </subsection>
-</section>
-<section name="Advanced usage">
- <subsection name="JDBC interceptors">
- <p>To see an example of how to use an interceptor, take a look at
- <code>org.apache.tomcat.jdbc.pool.interceptor.ConnectionState</code>.
- This simple interceptor is a cache of three attributes, transaction isolation level, auto commit and read only state,
- in order for the system to avoid not needed roundtrips to the database.
- </p>
- <p>Further interceptors will be added to the core of the pool as the need arises. Contributions are always welcome!</p>
- <p>Interceptors are of course not limited to just <code>java.sql.Connection</code> but can be used to wrap any
- of the results from a method invokation as well. You could build query performance analyzer that provides JMX notifications when a
- query is running longer than the expected time.</p>
- </subsection>
- <subsection name="Configuring JDBC interceptors">
- <p>Configuring JDBC interceptors is done using the <b>jdbcInterceptors</b> property.
- The property contains a list of semicolon separated class names. If the
- classname is not fully qualified it will be prefixed with the
- <code>org.apache.tomcat.jdbc.pool.interceptor.</code> prefix.
- </p>
- <p>Example:<br/>
- <code>
- jdbcInterceptors=&quot;org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
- org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer&quot;
- </code>
- <br/>
- is the same as
- <br/>
- <code> jdbcInterceptors=&quot;ConnectionState;StatementFinalizer&quot;</code>
- </p>
- <p>
- Interceptors can have properties as well. Properties for an interceptor
- are specified within parentheses after the class name. Several properties
- are separated by commas.
- </p>
- <p>Example:<br/>
- <code>
- jdbcInterceptors=&quot;ConnectionState;StatementFinalizer(useEquals=true)&quot;
- </code>
- </p>
- <p>
- Extra whitespace characters around class names, property names and values
- are ignored.
- </p>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.JdbcInterceptor">
- <p>Abstract base class for all interceptors, cannot be instantiated.</p>
- <attributes>
- <attribute name="useEquals" required="false">
- <p>(boolean) Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> and set to <code>false</code>
- when you wish to use <code>==</code> when comparing method names.
- The default value is <code>true</code>.
- </p>
- </attribute>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState">
- <p>Caches the connection for the following attributes <code>autoCommit</code>, <code>readOnly</code>,
- <code>transactionIsolation</code> and <code>catalog</code>.
- It is a performance enhancement to avoid roundtrip to the database when getters are called or setters are called with an already set value.
- </p>
- <attributes>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer">
- <p>Keeps track of all statements created using <code>createStatement</code>, <code>prepareStatement</code> or <code>prepareCall</code>
- and closes these statements when the connection is returned to the pool.
- </p>
- <attributes>
- <attribute name="trace" required="false">
- <p>(boolean as String) Enable tracing of unclosed statements.
- When enabled and a connection is closed, and statements are not closed,
- the interceptor will log all stack traces.
- The default value is <code>false</code>.
- </p>
- </attribute>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.StatementCache">
- <p>Caches <code>PreparedStatement</code> and/or <code>CallableStatement</code>
- instances on a connection.
- </p>
- <p>The statements are cached per connection.
- The count limit is counted globally for all connections that belong to
- the same pool. Once the count reaches <code>max</code>, subsequent
- statements are not returned to the cache and are closed immediately.
- </p>
- <attributes>
- <attribute name="prepared" required="false">
- <p>(boolean as String) Enable caching of <code>PreparedStatement</code>
- instances created using <code>prepareStatement</code> calls.
- The default value is <code>true</code>.
- </p>
- </attribute>
- <attribute name="callable" required="false">
- <p>(boolean as String) Enable caching of <code>CallableStatement</code>
- instances created using <code>prepareCall</code> calls.
- The default value is <code>false</code>.
- </p>
- </attribute>
- <attribute name="max" required="false">
- <p>(int as String) Limit on the count of cached statements across
- the connection pool.
- The default value is <code>50</code>.
- </p>
- </attribute>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor">
- <p>See <bug>48392</bug>. Interceptor to wrap statements and result sets in order to prevent access to the actual connection
- using the methods <code>ResultSet.getStatement().getConnection()</code> and <code>Statement.getConnection()</code>
- </p>
- <attributes>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor">
- <p>Automatically calls <code>java.sql.Statement.setQueryTimeout(seconds)</code> when a new statement is created.
- The pool itself doesn't timeout the query, it is still up to the JDBC driver to enforce query timeouts.
- </p>
- <attributes>
- <attribute name="queryTimeout" required="true">
- <p>(int as String) The number of seconds to set for the query timeout.
- A value less than or equal to zero will disable this feature.
- The default value is <code>1</code> seconds.
- </p>
- </attribute>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport">
- <p>Keeps track of query performance and issues log entries when queries exceed a time threshold of fail.
- The log level used is <code>WARN</code>
- </p>
- <attributes>
- <attribute name="threshold" required="false">
- <p>(int as String) The number of milliseconds a query has to exceed before issuing a log alert.
- The default value is <code>1000</code> milliseconds.
- </p>
- </attribute>
- <attribute name="maxQueries" required="false">
- <p>(int as String) The maximum number of queries to keep track of in order to preserve memory space.
- A value less than or equal to 0 will disable this feature.
- The default value is <code>1000</code>.
- </p>
- </attribute>
- <attribute name="logSlow" required="false">
- <p>(boolean as String) Set to <code>true</code> if you wish to log slow queries.
- The default value is <code>true</code>.
- </p>
- </attribute>
- <attribute name="logFailed" required="false">
- <p>(boolean as String) Set to <code>true</code> if you wish to log failed queries.
- The default value is <code>false</code>.
- </p>
- </attribute>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx">
- <p>Extends the <code>SlowQueryReport</code> and in addition to log entries it issues JMX notification
- for monitoring tools to react to. Inherits all the attributes from its parent class.
- This class uses Tomcat's JMX engine so it wont work outside of the Tomcat container.
- By default, JMX notifications are sent through the ConnectionPool mbean if it is enabled.
- The <code>SlowQueryReportJmx</code> can also register an MBean if <code>notifyPool=false</code>
- </p>
- <attributes>
- <attribute name="notifyPool" required="false">
- <p>(boolean as String) Set to false if you want JMX notifications to go to the <code>SlowQueryReportJmx</code> MBean
- The default value is <code>true</code>.
- </p>
- </attribute>
- <attribute name="objectName" required="false">
- <p>(String) Define a valid <code>javax.management.ObjectName</code> string that will be used to register this object with the platform mbean server
- The default value is <code>null</code> and the object will be registered using
- tomcat.jdbc:type=org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx,name=the-name-of-the-pool
- </p>
- </attribute>
- </attributes>
- </subsection>
- <subsection name="org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer">
- <p>
- The abandoned timer starts when a connection is checked out from the pool.
- This means if you have a 30second timeout and run 10x10second queries using the connection
- it will be marked abandoned and potentially reclaimed depending on the <code>abandonWhenPercentageFull</code>
- attribute.
- Using this interceptor it will reset the checkout timer every time you perform an operation on the connection or execute a
- query successfully.
- </p>
- <attributes>
- </attributes>
- </subsection>
-</section>
-
-<section name="Code Example">
- <p>Other examples of Tomcat configuration for JDBC usage can be found <a href="http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html">in the Tomcat documentation</a>. </p>
- <subsection name="Plain Ol' Java">
- <p>Here is a simple example of how to create and use a data source.</p>
-<source><![CDATA[ import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.Statement;
-
- import org.apache.tomcat.jdbc.pool.DataSource;
- import org.apache.tomcat.jdbc.pool.PoolProperties;
-
- public class SimplePOJOExample {
-
- public static void main(String[] args) throws Exception {
- PoolProperties p = new PoolProperties();
- p.setUrl("jdbc:mysql://localhost:3306/mysql");
- p.setDriverClassName("com.mysql.jdbc.Driver");
- p.setUsername("root");
- p.setPassword("password");
- p.setJmxEnabled(true);
- p.setTestWhileIdle(false);
- p.setTestOnBorrow(true);
- p.setValidationQuery("SELECT 1");
- p.setTestOnReturn(false);
- p.setValidationInterval(30000);
- p.setTimeBetweenEvictionRunsMillis(30000);
- p.setMaxActive(100);
- p.setInitialSize(10);
- p.setMaxWait(10000);
- p.setRemoveAbandonedTimeout(60);
- p.setMinEvictableIdleTimeMillis(30000);
- p.setMinIdle(10);
- p.setLogAbandoned(true);
- p.setRemoveAbandoned(true);
- p.setJdbcInterceptors(
- "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
- "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
- DataSource datasource = new DataSource();
- datasource.setPoolProperties(p);
-
- Connection con = null;
- try {
- con = datasource.getConnection();
- Statement st = con.createStatement();
- ResultSet rs = st.executeQuery("select * from user");
- int cnt = 1;
- while (rs.next()) {
- System.out.println((cnt++)+". Host:" +rs.getString("Host")+
- " User:"+rs.getString("User")+" Password:"+rs.getString("Password"));
- }
- rs.close();
- st.close();
- } finally {
- if (con!=null) try {con.close();}catch (Exception ignore) {}
- }
- }
-
- }]]></source>
- </subsection>
- <subsection name="As a Resource">
- <p>And here is an example on how to configure a resource for JNDI lookups</p>
-<source><![CDATA[<Resource name="jdbc/TestDB"
- auth="Container"
- type="javax.sql.DataSource"
- factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
- testWhileIdle="true"
- testOnBorrow="true"
- testOnReturn="false"
- validationQuery="SELECT 1"
- validationInterval="30000"
- timeBetweenEvictionRunsMillis="30000"
- maxActive="100"
- minIdle="10"
- maxWait="10000"
- initialSize="10"
- removeAbandonedTimeout="60"
- removeAbandoned="true"
- logAbandoned="true"
- minEvictableIdleTimeMillis="30000"
- jmxEnabled="true"
- jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
- org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
- username="root"
- password="password"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/mysql"/>]]></source>
-
- </subsection>
- <subsection name="Asynchronous Connection Retrieval">
- <p> The Tomcat JDBC connection pool supports asynchronous connection retrieval without adding additional threads to the
- pool library. It does this by adding a method to the data source called <code>Future&lt;Connection&gt; getConnectionAsync()</code>.
- In order to use the async retrieval, two conditions must be met:
- </p>
- <ol>
- <li>You must configure the <code>fairQueue</code> property to be <code>true</code>.</li>
- <li>You will have to cast the data source to <code>org.apache.tomcat.jdbc.pool.DataSource</code></li>
- </ol>
- An example of using the async feature is show below.
-<source><![CDATA[ Connection con = null;
- try {
- Future<Connection> future = datasource.getConnectionAsync();
- while (!future.isDone()) {
- System.out.println("Connection is not yet available. Do some background work");
- try {
- Thread.sleep(100); //simulate work
- }catch (InterruptedException x) {
- Thread.currentThread().interrupt();
- }
- }
- con = future.get(); //should return instantly
- Statement st = con.createStatement();
- ResultSet rs = st.executeQuery("select * from user");]]></source>
-
- </subsection>
- <subsection name="Interceptors">
- <p>Interceptors are a powerful way to enable, disable or modify functionality on a specific connection or its sub components.
- There are many different use cases for when interceptors are useful. By default, and for performance reasons, the connection pool is stateless.
- The only state the pool itself inserts are <code>defaultAutoCommit</code>, <code>defaultReadOnly</code>, <code>defaultTransactionIsolation</code>, <code>defaultCatalog</code> if
- these are set. These 4 properties are only set upon connection creation. Should these properties be modified during the usage of the connection,
- the pool itself will not reset them.</p>
- <p>An interceptor has to extend the <code>org.apache.tomcat.jdbc.pool.JdbcInterceptor</code> class. This class is fairly simple,
- You will need to have a no arg constructor</p>
-<source><![CDATA[ public JdbcInterceptor() {
- }]]></source>
- <p>
- When a connection is borrowed from the pool, the interceptor can initialize or in some other way react to the event by implementing the
- </p>
-<source><![CDATA[ public abstract void reset(ConnectionPool parent, PooledConnection con);]]></source>
- <p>
- method. This method gets called with two parameters, a reference to the connection pool itself <code>ConnectionPool parent</code>
- and a reference to the underlying connection <code>PooledConnection con</code>.
- </p>
- <p>
- When a method on the <code>java.sql.Connection</code> object is invoked, it will cause the
- </p>
-<source><![CDATA[ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable]]></source>
- <p>
- method to get invoked. The <code>Method method</code> is the actual method invoked, and <code>Object[] args</code> are the arguments.
- To look at a very simple example, where we demonstrate how to make the invokation to <code>java.sql.Connection.close()</code> a noop
- if the connection has been closed
- </p>
-<source><![CDATA[ if (CLOSE_VAL==method.getName()) {
- if (isClosed()) return null; //noop for already closed.
- }
- return super.invoke(proxy,method,args);]]></source>
- <p>
- There is an observation being made. It is the comparison of the method name. One way to do this would be to do
- <code>&quot;close&quot;.equals(method.getName())</code>.
- Above we see a direct reference comparison between the method name and <code>static final String</code> reference.
- According to the JVM spec, method names and static final String end up in a shared constant pool, so the reference comparison should work.
- One could of course do this as well:
- </p>
-<source><![CDATA[ if (compare(CLOSE_VAL,method)) {
- if (isClosed()) return null; //noop for already closed.
- }
- return super.invoke(proxy,method,args);]]></source>
- <p>
- The <code>compare(String,Method)</code> will use the <code>useEquals</code> flag on an interceptor and do either reference comparison or
- a string value comparison when the <code>useEquals=true</code> flag is set.
- </p>
- <p>Pool start/stop<br/>
- When the connection pool is started or closed, you can be notifed. You will only be notified once per interceptor class
- even though it is an instance method. and you will be notified using an interceptor currently not attached to a pool.
- </p>
-<source><![CDATA[ public void poolStarted(ConnectionPool pool) {
- }
-
- public void poolClosed(ConnectionPool pool) {
- }]]></source>
- <p>
- When overriding these methods, don't forget to call super if you are extending a class other than <code>JdbcInterceptor</code>
- </p>
- <p>Configuring interceptors<br/>
- Interceptors are configured using the <code>jdbcInterceptors</code> property or the <code>setJdbcInterceptors</code> method.
- An interceptor can have properties, and would be configured like this
- </p>
-<source><![CDATA[ String jdbcInterceptors=
- "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState(useEquals=true,fast=yes)"]]></source>
-
- <p>Interceptor properties<br/>
- Since interceptors can have properties, you need to be able to read the values of these properties within your
- interceptor. Taking an example like the one above, you can override the <code>setProperties</code> method.
- </p>
-<source><![CDATA[ public void setProperties(Map<String, InterceptorProperty> properties) {
- super.setProperties(properties);
- final String myprop = "myprop";
- InterceptorProperty p1 = properties.get(myprop);
- if (p1!=null) {
- setMyprop(Long.parseLong(p1.getValue()));
- }
- }]]></source>
-
- </subsection>
- <subsection name="Getting the actual JDBC connection">
- <p>Connection pools create wrappers around the actual connection in order to properly pool them.
- We also create interceptors in these wrappers to be able to perform certain functions.
- If there is a need to retrieve the actual connection, one can do so using the <code>javax.sql.PooledConnection</code>
- interface.
- </p>
-<source><![CDATA[ Connection con = datasource.getConnection();
- Connection actual = ((javax.sql.PooledConnection)con).getConnection();]]></source>
-
- </subsection>
-
-</section>
-
-<section name="Building">
- <p>We build the JDBC pool code with 1.6, but it is backwards compatible down to 1.5 for runtime environment. For unit test, we use 1.6 and higher</p>
- <p>Other examples of Tomcat configuration for JDBC usage can be found <a href="http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html">in the Tomcat documentation</a>. </p>
- <subsection name="Building from source">
- <p>Building is pretty simple. The pool has a dependency on <code>tomcat-juli.jar</code> and in case you want the <code>SlowQueryReportJmx</code></p>
-<source><![CDATA[ javac -classpath tomcat-juli.jar \
- -d . \
- org/apache/tomcat/jdbc/pool/*.java \
- org/apache/tomcat/jdbc/pool/interceptor/*.java \
- org/apache/tomcat/jdbc/pool/jmx/*.java]]></source>
- <p>
- A build file can be found in the Tomcat <a href="http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/">source repository</a>.
- </p>
- <p>
- As a convenience, a build file is also included where a simple build command will generate all files needed.
- </p>
-<source> ant download (downloads dependencies)
- ant build (compiles and generates .jar files)
- ant dist (creates a release package)
- ant test (runs tests, expects a test database to be setup)</source>
-
- <p>
- The system is structured for a Maven build, but does generate release artifacts. Just the library itself.
- </p>
- </subsection>
-</section>
-</body>
-
-</document>
diff --git a/dblib/common/doc/package.xsl b/dblib/common/doc/package.xsl
deleted file mode 100755
index cdadd53..0000000
--- a/dblib/common/doc/package.xsl
+++ /dev/null
@@ -1,249 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<!--
- Stylesheet that generates "package.html" for Javadoc tool
- from jdbc-pool.xml documentation file.
- It is based on "tomcat-docs" stylesheet, but it needs to avoid
- generating complicated headers and footers, as those cannot be
- digested by Javadoc tool and break layout of javadoc pages.
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
-
- <!-- Output method -->
- <xsl:output method="html"
- encoding="UTF-8"
- indent="no"/>
-
-
- <!-- Defined parameters (overrideable) -->
- <xsl:param name="relative-path" select="'.'"/>
- <xsl:param name="void-image" select="'/images/void.gif'"/>
- <xsl:param name="standalone" select="''"/>
- <xsl:param name="buglink" select="'http://bz.apache.org/bugzilla/show_bug.cgi?id='"/>
- <xsl:param name="revlink" select="'http://svn.apache.org/viewvc?view=rev&amp;rev='"/>
-
- <!-- Defined variables (non-overrideable) -->
- <xsl:variable name="body-bg" select="'#ffffff'"/>
- <xsl:variable name="body-fg" select="'#000000'"/>
- <xsl:variable name="body-link" select="'#525D76'"/>
- <xsl:variable name="banner-bg" select="'#525D76'"/>
- <xsl:variable name="banner-fg" select="'#ffffff'"/>
- <xsl:variable name="sub-banner-bg" select="'#828DA6'"/>
- <xsl:variable name="sub-banner-fg" select="'#ffffff'"/>
- <xsl:variable name="source-color" select="'#023264'"/>
- <xsl:variable name="attributes-color" select="'#023264'"/>
- <xsl:variable name="table-th-bg" select="'#039acc'"/>
- <xsl:variable name="table-td-bg" select="'#a0ddf0'"/>
-
- <!-- Process an entire document into an HTML page -->
- <xsl:template match="document">
- <xsl:variable name="project"
- select="document('project.xml')/project"/>
- <html>
- <head>
- <title><xsl:value-of select="project/title"/> - <xsl:value-of select="properties/title"/></title>
- </head>
-
- <body bgcolor="{$body-bg}" text="{$body-fg}" link="{$body-link}"
- alink="{$body-link}" vlink="{$body-link}">
-
- <h2><xsl:value-of select="properties/title"/>.</h2>
- <xsl:apply-templates select="body/section"/>
- </body>
- </html>
-
- </xsl:template>
-
-
- <!-- Process a documentation section -->
- <xsl:template match="section">
- <xsl:variable name="name">
- <xsl:value-of select="@name"/>
- </xsl:variable>
- <table border="0" cellspacing="0" cellpadding="2">
- <!-- Section heading -->
- <tr><td bgcolor="{$banner-bg}">
- <font color="{$banner-fg}" face="arial,helvetica.sanserif">
- <a name="{$name}">
- <strong><xsl:value-of select="@name"/></strong></a></font>
- </td></tr>
- <!-- Section body -->
- <tr><td><blockquote>
- <xsl:apply-templates/>
- </blockquote></td></tr>
- </table>
- </xsl:template>
-
-
- <!-- Process a documentation subsection -->
- <xsl:template match="subsection">
- <xsl:variable name="name">
- <xsl:value-of select="@name"/>
- </xsl:variable>
- <table border="0" cellspacing="0" cellpadding="2">
- <!-- Subsection heading -->
- <tr><td bgcolor="{$sub-banner-bg}">
- <font color="{$sub-banner-fg}" face="arial,helvetica.sanserif">
- <a name="{$name}">
- <strong><xsl:value-of select="@name"/></strong></a></font>
- </td></tr>
- <!-- Subsection body -->
- <tr><td><blockquote>
- <xsl:apply-templates/>
- </blockquote></td></tr>
- </table>
- </xsl:template>
-
-
- <!-- Process a source code example -->
- <xsl:template match="source">
- <xsl:variable name="void">
- <xsl:value-of select="$relative-path"/><xsl:value-of select="$void-image"/>
- </xsl:variable>
- <div align="left">
- <table cellspacing="4" cellpadding="0" border="0">
- <tr>
- <td bgcolor="{$source-color}" width="1" height="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- <td bgcolor="{$source-color}" height="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- <td bgcolor="{$source-color}" width="1" height="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- </tr>
- <tr>
- <td bgcolor="{$source-color}" width="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- <td bgcolor="#ffffff" height="1"><pre>
- <xsl:value-of select="."/>
- </pre></td>
- <td bgcolor="{$source-color}" width="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- </tr>
- <tr>
- <td bgcolor="{$source-color}" width="1" height="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- <td bgcolor="{$source-color}" height="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- <td bgcolor="{$source-color}" width="1" height="1">
- <img src="{$void}" width="1" height="1" vspace="0" hspace="0" border="0"/>
- </td>
- </tr>
- </table>
- </div>
- </xsl:template>
-
-
- <!-- Process an attributes list with nested attribute elements -->
- <xsl:template match="attributes">
- <table border="1" cellpadding="5">
- <tr>
- <th width="15%" bgcolor="{$attributes-color}">
- <font color="#ffffff">Attribute</font>
- </th>
- <th width="85%" bgcolor="{$attributes-color}">
- <font color="#ffffff">Description</font>
- </th>
- </tr>
- <xsl:for-each select="attribute">
- <tr>
- <td align="left" valign="center">
- <xsl:if test="@required = 'true'">
- <strong><code><xsl:value-of select="@name"/></code></strong>
- </xsl:if>
- <xsl:if test="@required != 'true'">
- <code><xsl:value-of select="@name"/></code>
- </xsl:if>
- </td>
- <td align="left" valign="center">
- <xsl:apply-templates/>
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </xsl:template>
-
- <!-- Process a properties list with nested property elements -->
- <xsl:template match="properties">
- <table border="1" cellpadding="5">
- <tr>
- <th width="15%" bgcolor="{$attributes-color}">
- <font color="#ffffff">Property</font>
- </th>
- <th width="85%" bgcolor="{$attributes-color}">
- <font color="#ffffff">Description</font>
- </th>
- </tr>
- <xsl:for-each select="property">
- <tr>
- <td align="left" valign="center">
- <code><xsl:value-of select="@name"/></code>
- </td>
- <td align="left" valign="center">
- <xsl:apply-templates/>
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </xsl:template>
-
- <!-- Fix relative links in printer friendly versions of the docs -->
- <xsl:template match="a">
- <xsl:variable name="href" select="@href"/>
- <xsl:choose>
- <xsl:when test="$standalone = 'standalone'">
- <xsl:apply-templates/>
- </xsl:when>
- <xsl:when test="$href != ''">
- <a href="{$href}"><xsl:apply-templates/></a>
- </xsl:when>
- <xsl:otherwise>
- <xsl:variable name="name" select="@name"/>
- <a name="{$name}"><xsl:apply-templates/></a>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!-- Link to a bug report -->
- <xsl:template match="bug">
- <xsl:variable name="link"><xsl:value-of select="$buglink"/><xsl:value-of select="text()"/></xsl:variable>
- <a href="{$link}"><xsl:apply-templates/></a>
- </xsl:template>
-
- <!-- Link to a SVN revision report -->
- <xsl:template match="rev">
- <xsl:variable name="link"><xsl:value-of select="$revlink"/><xsl:value-of select="text()"/></xsl:variable>
- <a href="{$link}"><xsl:apply-templates/></a>
- </xsl:template>
-
- <!-- Process everything else by just passing it through -->
- <xsl:template match="*|@*">
- <xsl:copy>
- <xsl:apply-templates select="@*|*|text()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/dblib/common/doc/project.xml b/dblib/common/doc/project.xml
deleted file mode 100755
index 912903d..0000000
--- a/dblib/common/doc/project.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<project name="Apache Tomcat JDBC Pool Documentation"
- href="http://tomcat.apache.org/">
-
- <title>Apache Tomcat JDBC Pool</title>
-
- <logo href="/images/tomcat.gif">
- The Apache Tomcat Servlet/JSP Container
- </logo>
-
- <body>
- </body>
-
-</project>
-
diff --git a/dblib/common/pom.xml b/dblib/common/pom.xml
deleted file mode 100755
index 722d99b..0000000
--- a/dblib/common/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.openecomp.sdnc.core</groupId>
- <artifactId>dblib</artifactId>
- <version>1.1.1-SNAPSHOT</version>
- </parent>
- <artifactId>dblib-common</artifactId>
- <packaging>bundle</packaging>
- <name>DBLIB Adaptor - Common</name>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>juli</artifactId>
- <version>6.0.32</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-dbcp</artifactId>
- <version>8.0.14</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <version>1.3.152</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.osgi</artifactId>
- <version>${equinox.osgi.version}</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>${mysql.connector.version}</version>
- </dependency>
-
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-Activator>org.openecomp.sdnc.sli.resource.common.CommonActivator</Bundle-Activator>
- <Export-Package>
- org.openecomp.sdnc.sli.resource.common;version=${project.version},
- org.apache.tomcat.jdbc;version=${project.version},
- org.apache.tomcat.jdbc.pool;version=${project.version},
- org.apache.tomcat.jdbc.naming;version=${project.version},
- org.apache.tomcat.jdbc.pool.interceptor;version=${project.version},
- org.apache.tomcat.jdbc.pool.jmx;version=${project.version}</Export-Package>
- <Import-Package>*</Import-Package>
- <!--
- <Embed-Dependency>*;scope=compile;artifactId=commons-lang|commons-lang3</Embed-Dependency>
- -->
- <Embed-Transitive>true</Embed-Transitive>
- </instructions>
- <manifestLocation>${project.basedir}/src/main/resources/META-INF</manifestLocation>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/naming/GenericNamingResourcesFactory.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/naming/GenericNamingResourcesFactory.java
deleted file mode 100644
index c6112a1..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/naming/GenericNamingResourcesFactory.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.naming;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import javax.naming.Context;
-import javax.naming.Name;
-import javax.naming.RefAddr;
-import javax.naming.Reference;
-import javax.naming.spi.ObjectFactory;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.ClassLoaderUtil;
-
-/**
- * Simple way of configuring generic resources by using reflection.
- * Example usage:
- * <pre><code>
- * &lt;Resource factory=&quot;org.apache.tomcat.jdbc.naming.GenericNamingResourcesFactory&quot;
- * name=&quot;jdbc/test&quot;
- * type=&quot;org.apache.derby.jdbc.ClientXADataSource&quot;
- * databaseName=&quot;sample&quot;
- * createDatabase=&quot;create&quot;
- * serverName=&quot;localhost&quot;
- * port=&quot;1527&quot;/&gt;
- * </code></pre>
- *
- */
-public class GenericNamingResourcesFactory implements ObjectFactory {
- private static final Log log = LogFactory.getLog(GenericNamingResourcesFactory.class);
-
- @Override
- public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
- if ((obj == null) || !(obj instanceof Reference)) {
- return null;
- }
- Reference ref = (Reference) obj;
- Enumeration<RefAddr> refs = ref.getAll();
-
- String type = ref.getClassName();
- Object o =
- ClassLoaderUtil.loadClass(
- type,
- GenericNamingResourcesFactory.class.getClassLoader(),
- Thread.currentThread().getContextClassLoader())
- .newInstance();
-
- while (refs.hasMoreElements()) {
- RefAddr addr = refs.nextElement();
- String param = addr.getType();
- String value = null;
- if (addr.getContent()!=null) {
- value = addr.getContent().toString();
- }
- if (setProperty(o, param, value)) {
-
- } else {
- log.debug("Property not configured["+param+"]. No setter found on["+o+"].");
- }
- }
- return o;
- }
-
- @SuppressWarnings("null") // setPropertyMethodVoid can't be null when used
- private static boolean setProperty(Object o, String name, String value) {
- if (log.isDebugEnabled())
- log.debug("IntrospectionUtils: setProperty(" +
- o.getClass() + " " + name + "=" + value + ")");
-
- String setter = "set" + capitalize(name);
-
- try {
- Method methods[] = o.getClass().getMethods();
- Method setPropertyMethodVoid = null;
- Method setPropertyMethodBool = null;
-
- // First, the ideal case - a setFoo( String ) method
- for (int i = 0; i < methods.length; i++) {
- Class<?> paramT[] = methods[i].getParameterTypes();
- if (setter.equals(methods[i].getName()) && paramT.length == 1
- && "java.lang.String".equals(paramT[0].getName())) {
-
- methods[i].invoke(o, new Object[] { value });
- return true;
- }
- }
-
- // Try a setFoo ( int ) or ( boolean )
- for (int i = 0; i < methods.length; i++) {
- boolean ok = true;
- if (setter.equals(methods[i].getName())
- && methods[i].getParameterTypes().length == 1) {
-
- // match - find the type and invoke it
- Class<?> paramType = methods[i].getParameterTypes()[0];
- Object params[] = new Object[1];
-
- // Try a setFoo ( int )
- if ("java.lang.Integer".equals(paramType.getName())
- || "int".equals(paramType.getName())) {
- try {
- params[0] = new Integer(value);
- } catch (NumberFormatException ex) {
- ok = false;
- }
- // Try a setFoo ( long )
- }else if ("java.lang.Long".equals(paramType.getName())
- || "long".equals(paramType.getName())) {
- try {
- params[0] = new Long(value);
- } catch (NumberFormatException ex) {
- ok = false;
- }
-
- // Try a setFoo ( boolean )
- } else if ("java.lang.Boolean".equals(paramType.getName())
- || "boolean".equals(paramType.getName())) {
- params[0] = Boolean.valueOf(value);
-
- // Try a setFoo ( InetAddress )
- } else if ("java.net.InetAddress".equals(paramType
- .getName())) {
- try {
- params[0] = InetAddress.getByName(value);
- } catch (UnknownHostException exc) {
- if (log.isDebugEnabled())
- log.debug("IntrospectionUtils: Unable to resolve host name:" + value);
- ok = false;
- }
-
- // Unknown type
- } else {
- if (log.isDebugEnabled())
- log.debug("IntrospectionUtils: Unknown type " +
- paramType.getName());
- }
-
- if (ok) {
- methods[i].invoke(o, params);
- return true;
- }
- }
-
- // save "setProperty" for later
- if ("setProperty".equals(methods[i].getName())) {
- if (methods[i].getReturnType()==Boolean.TYPE){
- setPropertyMethodBool = methods[i];
- }else {
- setPropertyMethodVoid = methods[i];
- }
-
- }
- }
-
- // Ok, no setXXX found, try a setProperty("name", "value")
- if (setPropertyMethodBool != null || setPropertyMethodVoid != null) {
- Object params[] = new Object[2];
- params[0] = name;
- params[1] = value;
- if (setPropertyMethodBool != null) {
- try {
- return ((Boolean) setPropertyMethodBool.invoke(o, params)).booleanValue();
- }catch (IllegalArgumentException biae) {
- //the boolean method had the wrong
- //parameter types. lets try the other
- if (setPropertyMethodVoid!=null) {
- setPropertyMethodVoid.invoke(o, params);
- return true;
- }else {
- throw biae;
- }
- }
- } else {
- setPropertyMethodVoid.invoke(o, params);
- return true;
- }
- }
-
- } catch (IllegalArgumentException ex2) {
- log.warn("IAE " + o + " " + name + " " + value, ex2);
- } catch (SecurityException ex1) {
- if (log.isDebugEnabled())
- log.debug("IntrospectionUtils: SecurityException for " +
- o.getClass() + " " + name + "=" + value + ")", ex1);
- } catch (IllegalAccessException iae) {
- if (log.isDebugEnabled())
- log.debug("IntrospectionUtils: IllegalAccessException for " +
- o.getClass() + " " + name + "=" + value + ")", iae);
- } catch (InvocationTargetException ie) {
- Throwable cause = ie.getCause();
- if (cause instanceof ThreadDeath) {
- throw (ThreadDeath) cause;
- }
- if (cause instanceof VirtualMachineError) {
- throw (VirtualMachineError) cause;
- }
- if (log.isDebugEnabled())
- log.debug("IntrospectionUtils: InvocationTargetException for " +
- o.getClass() + " " + name + "=" + value + ")", ie);
- }
- return false;
- }
-
- public static String capitalize(String name) {
- if (name == null || name.length() == 0) {
- return name;
- }
- char chars[] = name.toCharArray();
- chars[0] = Character.toUpperCase(chars[0]);
- return new String(chars);
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ClassLoaderUtil.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ClassLoaderUtil.java
deleted file mode 100644
index 23b5668..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ClassLoaderUtil.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-public class ClassLoaderUtil {
- private static final Log log = LogFactory.getLog(ClassLoaderUtil.class);
-
- private static final boolean onlyAttemptFirstLoader =
- Boolean.parseBoolean(System.getProperty("org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader", "false"));
-
- public static Class<?> loadClass(String className, ClassLoader... classLoaders) throws ClassNotFoundException {
- ClassNotFoundException last = null;
- StringBuilder errorMsg = null;
- for (ClassLoader cl : classLoaders) {
- try {
- if (cl!=null) {
- if (log.isDebugEnabled()) {
- log.debug("Attempting to load class["+className+"] from "+cl);
- }
- return Class.forName(className, true, cl);
- } else {
- throw new ClassNotFoundException("Classloader is null");
- }
- } catch (ClassNotFoundException x) {
- last = x;
- if (errorMsg==null) {
- errorMsg = new StringBuilder();
- } else {
- errorMsg.append(';');
- }
- errorMsg.append("ClassLoader:");
- errorMsg.append(cl);
- }
- if (onlyAttemptFirstLoader) {
- break;
- }
- }
- throw new ClassNotFoundException("Unable to load class: "+className+" from "+errorMsg, last);
- }
-
-
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
deleted file mode 100644
index 7b081df..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
+++ /dev/null
@@ -1,1500 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Collections;
-import java.util.ConcurrentModificationException;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-/**
- * Implementation of simple connection pool.
- * The ConnectionPool uses a {@link PoolProperties} object for storing all the meta information about the connection pool.
- * As the underlying implementation, the connection pool uses {@link java.util.concurrent.BlockingQueue} to store active and idle connections.
- * A custom implementation of a fair {@link FairBlockingQueue} blocking queue is provided with the connection pool itself.
- * @version 1.0
- */
-public class ConnectionPool {
-
- /**
- * Default domain for objects registering with an mbean server
- */
- public static final String POOL_JMX_DOMAIN = "tomcat.jdbc";
- /**
- * Prefix type for JMX registration
- */
- public static final String POOL_JMX_TYPE_PREFIX = POOL_JMX_DOMAIN+":type=";
-
- /**
- * Logger
- */
- private static final Log log = LogFactory.getLog(ConnectionPool.class);
-
- //===============================================================================
- // INSTANCE/QUICK ACCESS VARIABLE
- //===============================================================================
- /**
- * Carries the size of the pool, instead of relying on a queue implementation
- * that usually iterates over to get an exact count
- */
- private AtomicInteger size = new AtomicInteger(0);
-
- /**
- * All the information about the connection pool
- * These are the properties the pool got instantiated with
- */
- private PoolConfiguration poolProperties;
-
- /**
- * Contains all the connections that are in use
- * TODO - this shouldn't be a blocking queue, simply a list to hold our objects
- */
- private BlockingQueue<PooledConnection> busy;
-
- /**
- * Contains all the idle connections
- */
- private BlockingQueue<PooledConnection> idle;
-
- /**
- * The thread that is responsible for checking abandoned and idle threads
- */
- private volatile PoolCleaner poolCleaner;
-
- /**
- * Pool closed flag
- */
- private volatile boolean closed = false;
-
- /**
- * Since newProxyInstance performs the same operation, over and over
- * again, it is much more optimized if we simply store the constructor ourselves.
- */
- private Constructor<?> proxyClassConstructor;
-
- /**
- * Executor service used to cancel Futures
- */
- private ThreadPoolExecutor cancellator = new ThreadPoolExecutor(0,1,1000,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
-
- /**
- * reference to the JMX mbean
- */
- protected org.apache.tomcat.jdbc.pool.jmx.ConnectionPool jmxPool = null;
-
- /**
- * counter to track how many threads are waiting for a connection
- */
- private AtomicInteger waitcount = new AtomicInteger(0);
-
- private AtomicLong poolVersion = new AtomicLong(Long.MIN_VALUE);
-
- /**
- * The counters for statistics of the pool.
- */
- private final AtomicLong borrowedCount = new AtomicLong(0);
- private final AtomicLong returnedCount = new AtomicLong(0);
- private final AtomicLong createdCount = new AtomicLong(0);
- private final AtomicLong releasedCount = new AtomicLong(0);
- private final AtomicLong reconnectedCount = new AtomicLong(0);
- private final AtomicLong removeAbandonedCount = new AtomicLong(0);
- private final AtomicLong releasedIdleCount = new AtomicLong(0);
-
- //===============================================================================
- // PUBLIC METHODS
- //===============================================================================
-
- /**
- * Instantiate a connection pool. This will create connections if initialSize is larger than 0.
- * The {@link PoolProperties} should not be reused for another connection pool.
- * @param prop PoolProperties - all the properties for this connection pool
- * @throws SQLException Pool initialization error
- */
- public ConnectionPool(PoolConfiguration prop) throws SQLException {
- //setup quick access variables and pools
- init(prop);
- }
-
-
- /**
- * Retrieves a Connection future. If a connection is not available, one can block using future.get()
- * until a connection has become available.
- * If a connection is not retrieved, the Future must be cancelled in order for the connection to be returned
- * to the pool.
- * @return a Future containing a reference to the connection or the future connection
- * @throws SQLException Cannot use asynchronous connect
- */
- public Future<Connection> getConnectionAsync() throws SQLException {
- try {
- PooledConnection pc = borrowConnection(0, null, null);
- if (pc!=null) {
- return new ConnectionFuture(pc);
- }
- }catch (SQLException x) {
- if (x.getMessage().indexOf("NoWait")<0) {
- throw x;
- }
- }
- //we can only retrieve a future if the underlying queue supports it.
- if (idle instanceof FairBlockingQueue<?>) {
- Future<PooledConnection> pcf = ((FairBlockingQueue<PooledConnection>)idle).pollAsync();
- return new ConnectionFuture(pcf);
- } else if (idle instanceof MultiLockFairBlockingQueue<?>) {
- Future<PooledConnection> pcf = ((MultiLockFairBlockingQueue<PooledConnection>)idle).pollAsync();
- return new ConnectionFuture(pcf);
- } else {
- throw new SQLException("Connection pool is misconfigured, doesn't support async retrieval. Set the 'fair' property to 'true'");
- }
- }
-
- /**
- * Borrows a connection from the pool. If a connection is available (in the idle queue) or the pool has not reached
- * {@link PoolProperties#maxActive maxActive} connections a connection is returned immediately.
- * If no connection is available, the pool will attempt to fetch a connection for {@link PoolProperties#maxWait maxWait} milliseconds.
- * @return Connection - a java.sql.Connection/javax.sql.PooledConnection reflection proxy, wrapping the underlying object.
- * @throws SQLException - if the wait times out or a failure occurs creating a connection
- */
- public Connection getConnection() throws SQLException {
- //check out a connection
- PooledConnection con = borrowConnection(-1,null,null);
- return setupConnection(con);
- }
-
-
- /**
- * Borrows a connection from the pool. If a connection is available (in the
- * idle queue) or the pool has not reached {@link PoolProperties#maxActive
- * maxActive} connections a connection is returned immediately. If no
- * connection is available, the pool will attempt to fetch a connection for
- * {@link PoolProperties#maxWait maxWait} milliseconds.
- * @param username The user name to use for the connection
- * @param password The password for the connection
- * @return Connection - a java.sql.Connection/javax.sql.PooledConnection
- * reflection proxy, wrapping the underlying object.
- * @throws SQLException
- * - if the wait times out or a failure occurs creating a
- * connection
- */
- public Connection getConnection(String username, String password) throws SQLException {
- // check out a connection
- PooledConnection con = borrowConnection(-1, username, password);
- return setupConnection(con);
- }
-
- /**
- * Returns the name of this pool
- * @return String - the name of the pool
- */
- public String getName() {
- return getPoolProperties().getPoolName();
- }
-
- /**
- * Return the number of threads waiting for a connection
- * @return number of threads waiting for a connection
- */
- public int getWaitCount() {
- return waitcount.get();
- }
-
- /**
- * Returns the pool properties associated with this connection pool
- * @return PoolProperties
- *
- */
- public PoolConfiguration getPoolProperties() {
- return this.poolProperties;
- }
-
- /**
- * Returns the total size of this pool, this includes both busy and idle connections
- * @return int - number of established connections to the database
- */
- public int getSize() {
- return size.get();
- }
-
- /**
- * Returns the number of connections that are in use
- * @return int - number of established connections that are being used by the application
- */
- public int getActive() {
- return busy.size();
- }
-
- /**
- * Returns the number of idle connections
- * @return int - number of established connections not being used
- */
- public int getIdle() {
- return idle.size();
- }
-
- /**
- * Returns true if {@link #close close} has been called, and the connection pool is unusable
- * @return boolean
- */
- public boolean isClosed() {
- return this.closed;
- }
-
- //===============================================================================
- // PROTECTED METHODS
- //===============================================================================
-
-
- /**
- * configures a pooled connection as a proxy.
- * This Proxy implements {@link java.sql.Connection} and {@link javax.sql.PooledConnection} interfaces.
- * All calls on {@link java.sql.Connection} methods will be propagated down to the actual JDBC connection except for the
- * {@link java.sql.Connection#close()} method.
- * @param con a {@link PooledConnection} to wrap in a Proxy
- * @return a {@link java.sql.Connection} object wrapping a pooled connection.
- * @throws SQLException if an interceptor can't be configured, if the proxy can't be instantiated
- */
- protected Connection setupConnection(PooledConnection con) throws SQLException {
- //fetch previously cached interceptor proxy - one per connection
- JdbcInterceptor handler = con.getHandler();
- if (handler==null) {
- //build the proxy handler
- handler = new ProxyConnection(this,con,getPoolProperties().isUseEquals());
- //set up the interceptor chain
- PoolProperties.InterceptorDefinition[] proxies = getPoolProperties().getJdbcInterceptorsAsArray();
- for (int i=proxies.length-1; i>=0; i--) {
- try {
- //create a new instance
- JdbcInterceptor interceptor = proxies[i].getInterceptorClass().newInstance();
- //configure properties
- interceptor.setProperties(proxies[i].getProperties());
- //setup the chain
- interceptor.setNext(handler);
- //call reset
- interceptor.reset(this, con);
- //configure the last one to be held by the connection
- handler = interceptor;
- }catch(Exception x) {
- SQLException sx = new SQLException("Unable to instantiate interceptor chain.");
- sx.initCause(x);
- throw sx;
- }
- }
- //cache handler for the next iteration
- con.setHandler(handler);
- } else {
- JdbcInterceptor next = handler;
- //we have a cached handler, reset it
- while (next!=null) {
- next.reset(this, con);
- next = next.getNext();
- }
- }
-
- try {
- getProxyConstructor(con.getXAConnection() != null);
- //create the proxy
- //TODO possible optimization, keep track if this connection was returned properly, and don't generate a new facade
- Connection connection = null;
- if (getPoolProperties().getUseDisposableConnectionFacade() ) {
- connection = (Connection)proxyClassConstructor.newInstance(new Object[] { new DisposableConnectionFacade(handler) });
- } else {
- connection = (Connection)proxyClassConstructor.newInstance(new Object[] {handler});
- }
- //return the connection
- return connection;
- }catch (Exception x) {
- SQLException s = new SQLException();
- s.initCause(x);
- throw s;
- }
-
- }
-
- /**
- * Creates and caches a {@link java.lang.reflect.Constructor} used to instantiate the proxy object.
- * We cache this, since the creation of a constructor is fairly slow.
- * @param xa Use a XA connection
- * @return constructor used to instantiate the wrapper object
- * @throws NoSuchMethodException Failed to get a constructor
- */
- public Constructor<?> getProxyConstructor(boolean xa) throws NoSuchMethodException {
- //cache the constructor
- if (proxyClassConstructor == null ) {
- Class<?> proxyClass = xa ?
- Proxy.getProxyClass(ConnectionPool.class.getClassLoader(), new Class[] {java.sql.Connection.class,javax.sql.PooledConnection.class, javax.sql.XAConnection.class}) :
- Proxy.getProxyClass(ConnectionPool.class.getClassLoader(), new Class[] {java.sql.Connection.class,javax.sql.PooledConnection.class});
- proxyClassConstructor = proxyClass.getConstructor(new Class[] { InvocationHandler.class });
- }
- return proxyClassConstructor;
- }
-
- /**
- * Closes the pool and all disconnects all idle connections
- * Active connections will be closed upon the {@link java.sql.Connection#close close} method is called
- * on the underlying connection instead of being returned to the pool
- * @param force - true to even close the active connections
- */
- protected void close(boolean force) {
- //are we already closed
- if (this.closed) return;
- //prevent other threads from entering
- this.closed = true;
- //stop background thread
- if (poolCleaner!=null) {
- poolCleaner.stopRunning();
- }
-
- /* release all idle connections */
- BlockingQueue<PooledConnection> pool = (idle.size()>0)?idle:(force?busy:idle);
- while (pool.size()>0) {
- try {
- //retrieve the next connection
- PooledConnection con = pool.poll(1000, TimeUnit.MILLISECONDS);
- //close it and retrieve the next one, if one is available
- while (con != null) {
- //close the connection
- if (pool==idle)
- release(con);
- else
- abandon(con);
- if (pool.size()>0) {
- con = pool.poll(1000, TimeUnit.MILLISECONDS);
- } else {
- break;
- }
- } //while
- } catch (InterruptedException ex) {
- if (getPoolProperties().getPropagateInterruptState()) {
- Thread.currentThread().interrupt();
- }
- }
- if (pool.size()==0 && force && pool!=busy) pool = busy;
- }
- if (this.getPoolProperties().isJmxEnabled()) this.jmxPool = null;
- PoolProperties.InterceptorDefinition[] proxies = getPoolProperties().getJdbcInterceptorsAsArray();
- for (int i=0; i<proxies.length; i++) {
- try {
- JdbcInterceptor interceptor = proxies[i].getInterceptorClass().newInstance();
- interceptor.setProperties(proxies[i].getProperties());
- interceptor.poolClosed(this);
- }catch (Exception x) {
- log.debug("Unable to inform interceptor of pool closure.",x);
- }
- }
- } //closePool
-
-
- /**
- * Initialize the connection pool - called from the constructor
- * @param properties PoolProperties - properties used to initialize the pool with
- * @throws SQLException if initialization fails
- */
- protected void init(PoolConfiguration properties) throws SQLException {
- poolProperties = properties;
-
- //make sure the pool is properly configured
- checkPoolConfiguration(properties);
-
- //make space for 10 extra in case we flow over a bit
- busy = new LinkedBlockingQueue<>();
- //busy = new FairBlockingQueue<PooledConnection>();
- //make space for 10 extra in case we flow over a bit
- if (properties.isFairQueue()) {
- idle = new FairBlockingQueue<>();
- //idle = new MultiLockFairBlockingQueue<PooledConnection>();
- //idle = new LinkedTransferQueue<PooledConnection>();
- //idle = new ArrayBlockingQueue<PooledConnection>(properties.getMaxActive(),false);
- } else {
- idle = new LinkedBlockingQueue<>();
- }
-
- initializePoolCleaner(properties);
-
- //create JMX MBean
- if (this.getPoolProperties().isJmxEnabled()) createMBean();
-
- //Parse and create an initial set of interceptors. Letting them know the pool has started.
- //These interceptors will not get any connection.
- PoolProperties.InterceptorDefinition[] proxies = getPoolProperties().getJdbcInterceptorsAsArray();
- for (int i=0; i<proxies.length; i++) {
- try {
- if (log.isDebugEnabled()) {
- log.debug("Creating interceptor instance of class:"+proxies[i].getInterceptorClass());
- }
- JdbcInterceptor interceptor = proxies[i].getInterceptorClass().newInstance();
- interceptor.setProperties(proxies[i].getProperties());
- interceptor.poolStarted(this);
- }catch (Exception x) {
- log.error("Unable to inform interceptor of pool start.",x);
- if (jmxPool!=null) jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.NOTIFY_INIT, getStackTrace(x));
- close(true);
- SQLException ex = new SQLException();
- ex.initCause(x);
- throw ex;
- }
- }
-
- //initialize the pool with its initial set of members
- PooledConnection[] initialPool = new PooledConnection[poolProperties.getInitialSize()];
- try {
- for (int i = 0; i < initialPool.length; i++) {
- initialPool[i] = this.borrowConnection(0, null, null); //don't wait, should be no contention
- } //for
-
- } catch (SQLException x) {
- log.error("Unable to create initial connections of pool.", x);
- if (!poolProperties.isIgnoreExceptionOnPreLoad()) {
- if (jmxPool!=null) jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.NOTIFY_INIT, getStackTrace(x));
- close(true);
- throw x;
- }
- } finally {
- //return the members as idle to the pool
- for (int i = 0; i < initialPool.length; i++) {
- if (initialPool[i] != null) {
- try {this.returnConnection(initialPool[i]);}catch(Exception x){/*NOOP*/}
- } //end if
- } //for
- } //catch
-
- closed = false;
- }
-
- public void checkPoolConfiguration(PoolConfiguration properties) {
- //make sure the pool is properly configured
- if (properties.getMaxActive()<1) {
- log.warn("maxActive is smaller than 1, setting maxActive to: "+PoolProperties.DEFAULT_MAX_ACTIVE);
- properties.setMaxActive(PoolProperties.DEFAULT_MAX_ACTIVE);
- }
- if (properties.getMaxActive()<properties.getInitialSize()) {
- log.warn("initialSize is larger than maxActive, setting initialSize to: "+properties.getMaxActive());
- properties.setInitialSize(properties.getMaxActive());
- }
- if (properties.getMinIdle()>properties.getMaxActive()) {
- log.warn("minIdle is larger than maxActive, setting minIdle to: "+properties.getMaxActive());
- properties.setMinIdle(properties.getMaxActive());
- }
- if (properties.getMaxIdle()>properties.getMaxActive()) {
- log.warn("maxIdle is larger than maxActive, setting maxIdle to: "+properties.getMaxActive());
- properties.setMaxIdle(properties.getMaxActive());
- }
- if (properties.getMaxIdle()<properties.getMinIdle()) {
- log.warn("maxIdle is smaller than minIdle, setting maxIdle to: "+properties.getMinIdle());
- properties.setMaxIdle(properties.getMinIdle());
- }
- }
-
- public void initializePoolCleaner(PoolConfiguration properties) {
- //if the evictor thread is supposed to run, start it now
- if (properties.isPoolSweeperEnabled()) {
- poolCleaner = new PoolCleaner(this, properties.getTimeBetweenEvictionRunsMillis());
- poolCleaner.start();
- } //end if
- }
-
- public void terminatePoolCleaner() {
- if (poolCleaner!= null) {
- poolCleaner.stopRunning();
- poolCleaner = null;
- }
- }
-
-
-//===============================================================================
-// CONNECTION POOLING IMPL LOGIC
-//===============================================================================
-
- /**
- * thread safe way to abandon a connection
- * signals a connection to be abandoned.
- * this will disconnect the connection, and log the stack trace if logAbandoned=true
- * @param con PooledConnection
- */
- protected void abandon(PooledConnection con) {
- if (con == null)
- return;
- try {
- con.lock();
- String trace = con.getStackTrace();
- if (getPoolProperties().isLogAbandoned()) {
- log.warn("Connection has been abandoned " + con + ":" + trace);
- }
- if (jmxPool!=null) {
- jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.NOTIFY_ABANDON, trace);
- }
- //release the connection
- removeAbandonedCount.incrementAndGet();
- release(con);
- } finally {
- con.unlock();
- }
- }
-
- /**
- * Thread safe way to suspect a connection. Similar to
- * {@link #abandon(PooledConnection)}, but instead of actually abandoning
- * the connection, this will log a warning and set the suspect flag on the
- * {@link PooledConnection} if logAbandoned=true
- *
- * @param con PooledConnection
- */
- protected void suspect(PooledConnection con) {
- if (con == null)
- return;
- if (con.isSuspect())
- return;
- try {
- con.lock();
- String trace = con.getStackTrace();
- if (getPoolProperties().isLogAbandoned()) {
- log.warn("Connection has been marked suspect, possibly abandoned " + con + "["+(System.currentTimeMillis()-con.getTimestamp())+" ms.]:" + trace);
- }
- if (jmxPool!=null) {
- jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.SUSPECT_ABANDONED_NOTIFICATION, trace);
- }
- con.setSuspect(true);
- } finally {
- con.unlock();
- }
- }
-
- /**
- * thread safe way to release a connection
- * @param con PooledConnection
- */
- protected void release(PooledConnection con) {
- if (con == null)
- return;
- try {
- con.lock();
- if (con.release()) {
- //counter only decremented once
- size.addAndGet(-1);
- con.setHandler(null);
- }
- releasedCount.incrementAndGet();
- } finally {
- con.unlock();
- }
- // we've asynchronously reduced the number of connections
- // we could have threads stuck in idle.poll(timeout) that will never be
- // notified
- if (waitcount.get() > 0) {
- idle.offer(create(true));
- }
- }
-
- /**
- * Thread safe way to retrieve a connection from the pool
- * @param wait - time to wait, overrides the maxWait from the properties,
- * set to -1 if you wish to use maxWait, 0 if you wish no wait time.
- * @param username The user name to use for the connection
- * @param password The password for the connection
- * @return a connection
- * @throws SQLException Failed to get a connection
- */
- private PooledConnection borrowConnection(int wait, String username, String password) throws SQLException {
-
- if (isClosed()) {
- throw new SQLException("Connection pool closed.");
- } //end if
-
- //get the current time stamp
- long now = System.currentTimeMillis();
- //see if there is one available immediately
- PooledConnection con = idle.poll();
-
- while (true) {
- if (con!=null) {
- //configure the connection and return it
- PooledConnection result = borrowConnection(now, con, username, password);
- borrowedCount.incrementAndGet();
- if (result!=null) return result;
- }
-
- //if we get here, see if we need to create one
- //this is not 100% accurate since it doesn't use a shared
- //atomic variable - a connection can become idle while we are creating
- //a new connection
- if (size.get() < getPoolProperties().getMaxActive()) {
- //atomic duplicate check
- if (size.addAndGet(1) > getPoolProperties().getMaxActive()) {
- //if we got here, two threads passed through the first if
- size.decrementAndGet();
- } else {
- //create a connection, we're below the limit
- return createConnection(now, con, username, password);
- }
- } //end if
-
- //calculate wait time for this iteration
- long maxWait = wait;
- //if the passed in wait time is -1, means we should use the pool property value
- if (wait==-1) {
- maxWait = (getPoolProperties().getMaxWait()<=0)?Long.MAX_VALUE:getPoolProperties().getMaxWait();
- }
-
- long timetowait = Math.max(0, maxWait - (System.currentTimeMillis() - now));
- waitcount.incrementAndGet();
- try {
- //retrieve an existing connection
- con = idle.poll(timetowait, TimeUnit.MILLISECONDS);
- } catch (InterruptedException ex) {
- if (getPoolProperties().getPropagateInterruptState()) {
- Thread.currentThread().interrupt();
- }
- SQLException sx = new SQLException("Pool wait interrupted.");
- sx.initCause(ex);
- throw sx;
- } finally {
- waitcount.decrementAndGet();
- }
- if (maxWait==0 && con == null) { //no wait, return one if we have one
- if (jmxPool!=null) {
- jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.POOL_EMPTY, "Pool empty - no wait.");
- }
- throw new PoolExhaustedException("[" + Thread.currentThread().getName()+"] " +
- "NoWait: Pool empty. Unable to fetch a connection, none available["+busy.size()+" in use].");
- }
- //we didn't get a connection, lets see if we timed out
- if (con == null) {
- if ((System.currentTimeMillis() - now) >= maxWait) {
- if (jmxPool!=null) {
- jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.POOL_EMPTY, "Pool empty - timeout.");
- }
- throw new PoolExhaustedException("[" + Thread.currentThread().getName()+"] " +
- "Timeout: Pool empty. Unable to fetch a connection in " + (maxWait / 1000) +
- " seconds, none available[size:"+size.get() +"; busy:"+busy.size()+"; idle:"+idle.size()+"; lastwait:"+timetowait+"].");
- } else {
- //no timeout, lets try again
- continue;
- }
- }
- } //while
- }
-
- /**
- * Creates a JDBC connection and tries to connect to the database.
- * @param now timestamp of when this was called
- * @param notUsed Argument not used
- * @param username The user name to use for the connection
- * @param password The password for the connection
- * @return a PooledConnection that has been connected
- * @throws SQLException Failed to get a connection
- */
- protected PooledConnection createConnection(long now, PooledConnection notUsed, String username, String password) throws SQLException {
- //no connections where available we'll create one
- PooledConnection con = create(false);
- if (username!=null) con.getAttributes().put(PooledConnection.PROP_USER, username);
- if (password!=null) con.getAttributes().put(PooledConnection.PROP_PASSWORD, password);
- boolean error = false;
- try {
- //connect and validate the connection
- con.lock();
- con.connect();
- if (con.validate(PooledConnection.VALIDATE_INIT)) {
- //no need to lock a new one, its not contented
- con.setTimestamp(now);
- if (getPoolProperties().isLogAbandoned()) {
- con.setStackTrace(getThreadDump());
- }
- if (!busy.offer(con)) {
- log.debug("Connection doesn't fit into busy array, connection will not be traceable.");
- }
- createdCount.incrementAndGet();
- return con;
- } else {
- //validation failed, make sure we disconnect
- //and clean up
- throw new SQLException("Validation Query Failed, enable logValidationErrors for more details.");
- } //end if
- } catch (Exception e) {
- error = true;
- if (log.isDebugEnabled())
- log.debug("Unable to create a new JDBC connection.", e);
- if (e instanceof SQLException) {
- throw (SQLException)e;
- } else {
- SQLException ex = new SQLException(e.getMessage());
- ex.initCause(e);
- throw ex;
- }
- } finally {
- // con can never be null here
- if (error ) {
- release(con);
- }
- con.unlock();
- }//catch
- }
-
- /**
- * Validates and configures a previously idle connection
- * @param now - timestamp
- * @param con - the connection to validate and configure
- * @param username The user name to use for the connection
- * @param password The password for the connection
- * @return a connection
- * @throws SQLException if a validation error happens
- */
- protected PooledConnection borrowConnection(long now, PooledConnection con, String username, String password) throws SQLException {
- //we have a connection, lets set it up
-
- //flag to see if we need to nullify
- boolean setToNull = false;
- try {
- con.lock();
- if (con.isReleased()) {
- return null;
- }
-
- //evaluate username/password change as well as max age functionality
- boolean forceReconnect = con.shouldForceReconnect(username, password) || con.isMaxAgeExpired();
-
- if (!con.isDiscarded() && !con.isInitialized()) {
- //here it states that the connection not discarded, but the connection is null
- //don't attempt a connect here. It will be done during the reconnect.
- forceReconnect = true;
- }
-
- if (!forceReconnect) {
- if ((!con.isDiscarded()) && con.validate(PooledConnection.VALIDATE_BORROW)) {
- //set the timestamp
- con.setTimestamp(now);
- if (getPoolProperties().isLogAbandoned()) {
- //set the stack trace for this pool
- con.setStackTrace(getThreadDump());
- }
- if (!busy.offer(con)) {
- log.debug("Connection doesn't fit into busy array, connection will not be traceable.");
- }
- return con;
- }
- }
- //if we reached here, that means the connection
- //is either has another principal, is discarded or validation failed.
- //we will make one more attempt
- //in order to guarantee that the thread that just acquired
- //the connection shouldn't have to poll again.
- try {
- con.reconnect();
- reconnectedCount.incrementAndGet();
- int validationMode = getPoolProperties().isTestOnConnect() || getPoolProperties().getInitSQL()!=null ?
- PooledConnection.VALIDATE_INIT :
- PooledConnection.VALIDATE_BORROW;
-
- if (con.validate(validationMode)) {
- //set the timestamp
- con.setTimestamp(now);
- if (getPoolProperties().isLogAbandoned()) {
- //set the stack trace for this pool
- con.setStackTrace(getThreadDump());
- }
- if (!busy.offer(con)) {
- log.debug("Connection doesn't fit into busy array, connection will not be traceable.");
- }
- return con;
- } else {
- //validation failed.
- throw new SQLException("Failed to validate a newly established connection.");
- }
- } catch (Exception x) {
- release(con);
- setToNull = true;
- if (x instanceof SQLException) {
- throw (SQLException)x;
- } else {
- SQLException ex = new SQLException(x.getMessage());
- ex.initCause(x);
- throw ex;
- }
- }
- } finally {
- con.unlock();
- if (setToNull) {
- con = null;
- }
- }
- }
- /**
- * Terminate the current transaction for the given connection.
- * @param con The connection
- * @return <code>true</code> if the connection TX termination succeeded
- * otherwise <code>false</code>
- */
- protected boolean terminateTransaction(PooledConnection con) {
- try {
- if (Boolean.FALSE.equals(con.getPoolProperties().getDefaultAutoCommit())) {
- if (this.getPoolProperties().getRollbackOnReturn()) {
- boolean autocommit = con.getConnection().getAutoCommit();
- if (!autocommit) con.getConnection().rollback();
- } else if (this.getPoolProperties().getCommitOnReturn()) {
- boolean autocommit = con.getConnection().getAutoCommit();
- if (!autocommit) con.getConnection().commit();
- }
- }
- return true;
- } catch (SQLException x) {
- log.warn("Unable to terminate transaction, connection will be closed.",x);
- return false;
- }
-
- }
-
- /**
- * Determines if a connection should be closed upon return to the pool.
- * @param con - the connection
- * @param action - the validation action that should be performed
- * @return <code>true</code> if the connection should be closed
- */
- protected boolean shouldClose(PooledConnection con, int action) {
- if (con.getConnectionVersion() < getPoolVersion()) return true;
- if (con.isDiscarded()) return true;
- if (isClosed()) return true;
- if (!con.validate(action)) return true;
- if (!terminateTransaction(con)) return true;
- if (con.isMaxAgeExpired()) return true;
- else return false;
- }
-
- /**
- * Returns a connection to the pool
- * If the pool is closed, the connection will be released
- * If the connection is not part of the busy queue, it will be released.
- * If {@link PoolProperties#testOnReturn} is set to true it will be validated
- * @param con PooledConnection to be returned to the pool
- */
- protected void returnConnection(PooledConnection con) {
- if (isClosed()) {
- //if the connection pool is closed
- //close the connection instead of returning it
- release(con);
- return;
- } //end if
-
- if (con != null) {
- try {
- returnedCount.incrementAndGet();
- con.lock();
- if (con.isSuspect()) {
- if (poolProperties.isLogAbandoned() && log.isInfoEnabled()) {
- log.info("Connection(" + con + ") that has been marked suspect was returned."
- + " The processing time is " + (System.currentTimeMillis()-con.getTimestamp()) + " ms.");
- }
- if (jmxPool!=null) {
- jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.SUSPECT_RETURNED_NOTIFICATION,
- "Connection(" + con + ") that has been marked suspect was returned.");
- }
- }
- if (busy.remove(con)) {
-
- if (!shouldClose(con,PooledConnection.VALIDATE_RETURN)) {
- con.setStackTrace(null);
- con.setTimestamp(System.currentTimeMillis());
- if (((idle.size()>=poolProperties.getMaxIdle()) && !poolProperties.isPoolSweeperEnabled()) || (!idle.offer(con))) {
- if (log.isDebugEnabled()) {
- log.debug("Connection ["+con+"] will be closed and not returned to the pool, idle["+idle.size()+"]>=maxIdle["+poolProperties.getMaxIdle()+"] idle.offer failed.");
- }
- release(con);
- }
- } else {
- if (log.isDebugEnabled()) {
- log.debug("Connection ["+con+"] will be closed and not returned to the pool.");
- }
- release(con);
- } //end if
- } else {
- if (log.isDebugEnabled()) {
- log.debug("Connection ["+con+"] will be closed and not returned to the pool, busy.remove failed.");
- }
- release(con);
- }
- } finally {
- con.unlock();
- }
- } //end if
- } //checkIn
-
- /**
- * Determines if a connection should be abandoned based on
- * {@link PoolProperties#abandonWhenPercentageFull} setting.
- * @return <code>true</code> if the connection should be abandoned
- */
- protected boolean shouldAbandon() {
- if (!poolProperties.isRemoveAbandoned()) return false;
- if (poolProperties.getAbandonWhenPercentageFull()==0) return true;
- float used = busy.size();
- float max = poolProperties.getMaxActive();
- float perc = poolProperties.getAbandonWhenPercentageFull();
- return (used/max*100f)>=perc;
- }
-
- /**
- * Iterates through all the busy connections and checks for connections that have timed out
- */
- public void checkAbandoned() {
- try {
- if (busy.size()==0) return;
- Iterator<PooledConnection> locked = busy.iterator();
- int sto = getPoolProperties().getSuspectTimeout();
- while (locked.hasNext()) {
- PooledConnection con = locked.next();
- boolean setToNull = false;
- try {
- con.lock();
- //the con has been returned to the pool or released
- //ignore it
- if (idle.contains(con) || con.isReleased())
- continue;
- long time = con.getTimestamp();
- long now = System.currentTimeMillis();
- if (shouldAbandon() && (now - time) > con.getAbandonTimeout()) {
- busy.remove(con);
- abandon(con);
- setToNull = true;
- } else if (sto > 0 && (now - time) > (sto * 1000L)) {
- suspect(con);
- } else {
- //do nothing
- } //end if
- } finally {
- con.unlock();
- if (setToNull)
- con = null;
- }
- } //while
- } catch (ConcurrentModificationException e) {
- log.debug("checkAbandoned failed." ,e);
- } catch (Exception e) {
- log.warn("checkAbandoned failed, it will be retried.",e);
- }
- }
-
- /**
- * Iterates through the idle connections and resizes the idle pool based on parameters
- * {@link PoolProperties#maxIdle}, {@link PoolProperties#minIdle}, {@link PoolProperties#minEvictableIdleTimeMillis}
- */
- public void checkIdle() {
- checkIdle(false);
- }
-
- public void checkIdle(boolean ignoreMinSize) {
-
- try {
- if (idle.size()==0) return;
- long now = System.currentTimeMillis();
- Iterator<PooledConnection> unlocked = idle.iterator();
- while ( (ignoreMinSize || (idle.size()>=getPoolProperties().getMinIdle())) && unlocked.hasNext()) {
- PooledConnection con = unlocked.next();
- boolean setToNull = false;
- try {
- con.lock();
- //the con been taken out, we can't clean it up
- if (busy.contains(con))
- continue;
- long time = con.getTimestamp();
- if (shouldReleaseIdle(now, con, time)) {
- releasedIdleCount.incrementAndGet();
- release(con);
- idle.remove(con);
- setToNull = true;
- } else {
- //do nothing
- } //end if
- } finally {
- con.unlock();
- if (setToNull)
- con = null;
- }
- } //while
- } catch (ConcurrentModificationException e) {
- log.debug("checkIdle failed." ,e);
- } catch (Exception e) {
- log.warn("checkIdle failed, it will be retried.",e);
- }
-
- }
-
-
- protected boolean shouldReleaseIdle(long now, PooledConnection con, long time) {
- if (con.getConnectionVersion() < getPoolVersion()) return true;
- else return (con.getReleaseTime()>0) && ((now - time) > con.getReleaseTime()) && (getSize()>getPoolProperties().getMinIdle());
- }
-
- /**
- * Forces a validation of all idle connections if {@link PoolProperties#testWhileIdle} is set.
- */
- public void testAllIdle() {
- try {
- if (idle.size()==0) return;
- Iterator<PooledConnection> unlocked = idle.iterator();
- while (unlocked.hasNext()) {
- PooledConnection con = unlocked.next();
- try {
- con.lock();
- //the con been taken out, we can't clean it up
- if (busy.contains(con))
- continue;
- if (!con.validate(PooledConnection.VALIDATE_IDLE)) {
- idle.remove(con);
- release(con);
- }
- } finally {
- con.unlock();
- }
- } //while
- } catch (ConcurrentModificationException e) {
- log.debug("testAllIdle failed." ,e);
- } catch (Exception e) {
- log.warn("testAllIdle failed, it will be retried.",e);
- }
-
- }
-
- /**
- * Creates a stack trace representing the existing thread's current state.
- * @return a string object representing the current state.
- * TODO investigate if we simply should store {@link java.lang.Thread#getStackTrace()} elements
- */
- protected static String getThreadDump() {
- Exception x = new Exception();
- x.fillInStackTrace();
- return getStackTrace(x);
- }
-
- /**
- * Convert an exception into a String
- * @param x - the throwable
- * @return a string representing the stack trace
- */
- public static String getStackTrace(Throwable x) {
- if (x == null) {
- return null;
- } else {
- java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
- java.io.PrintStream writer = new java.io.PrintStream(bout);
- x.printStackTrace(writer);
- String result = bout.toString();
- return (x.getMessage()!=null && x.getMessage().length()>0)? x.getMessage()+";"+result:result;
- } //end if
- }
-
-
- /**
- * Create a new pooled connection object. Not connected nor validated.
- * @param incrementCounter <code>true</code> to increment the connection count
- * @return a pooled connection object
- */
- protected PooledConnection create(boolean incrementCounter) {
- if (incrementCounter) size.incrementAndGet();
- PooledConnection con = new PooledConnection(getPoolProperties(), this);
- return con;
- }
-
- /**
- * Purges all connections in the pool.
- * For connections currently in use, these connections will be
- * purged when returned on the pool. This call also
- * purges connections that are idle and in the pool
- * To only purge used/active connections see {@link #purgeOnReturn()}
- */
- public void purge() {
- purgeOnReturn();
- checkIdle(true);
- }
-
- /**
- * Purges connections when they are returned from the pool.
- * This call does not purge idle connections until they are used.
- * To purge idle connections see {@link #purge()}
- */
- public void purgeOnReturn() {
- poolVersion.incrementAndGet();
- }
-
- /**
- * Hook to perform final actions on a pooled connection object once it has been disconnected and will be discarded
- * @param con The connection
- */
- protected void finalize(PooledConnection con) {
- JdbcInterceptor handler = con.getHandler();
- while (handler!=null) {
- handler.reset(null, null);
- handler=handler.getNext();
- }
- }
-
- /**
- * Hook to perform final actions on a pooled connection object once it has been disconnected and will be discarded
- * @param con The connection
- * @param finalizing <code>true</code> if finalizing the connection
- */
- protected void disconnectEvent(PooledConnection con, boolean finalizing) {
- JdbcInterceptor handler = con.getHandler();
- while (handler!=null) {
- handler.disconnected(this, con, finalizing);
- handler=handler.getNext();
- }
- }
-
- /**
- * Return the object that is potentially registered in JMX for notifications
- * @return the object implementing the {@link org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean} interface
- */
- public org.apache.tomcat.jdbc.pool.jmx.ConnectionPool getJmxPool() {
- return jmxPool;
- }
-
- /**
- * Create MBean object that can be registered.
- */
- protected void createMBean() {
- try {
- jmxPool = new org.apache.tomcat.jdbc.pool.jmx.ConnectionPool(this);
- } catch (Exception x) {
- log.warn("Unable to start JMX integration for connection pool. Instance["+getName()+"] can't be monitored.",x);
- }
- }
-
- /**
- * The total number of connections borrowed from this pool.
- * @return the borrowed connection count
- */
- public long getBorrowedCount() {
- return borrowedCount.get();
- }
-
- /**
- * The total number of connections returned to this pool.
- * @return the returned connection count
- */
- public long getReturnedCount() {
- return returnedCount.get();
- }
-
- /**
- * The total number of connections created by this pool.
- * @return the created connection count
- */
- public long getCreatedCount() {
- return createdCount.get();
- }
-
- /**
- * The total number of connections released from this pool.
- * @return the released connection count
- */
- public long getReleasedCount() {
- return releasedCount.get();
- }
-
- /**
- * The total number of connections reconnected by this pool.
- * @return the reconnected connection count
- */
- public long getReconnectedCount() {
- return reconnectedCount.get();
- }
-
- /**
- * The total number of connections released by remove abandoned.
- * @return the PoolCleaner removed abandoned connection count
- */
- public long getRemoveAbandonedCount() {
- return removeAbandonedCount.get();
- }
-
- /**
- * The total number of connections released by eviction.
- * @return the PoolCleaner evicted idle connection count
- */
- public long getReleasedIdleCount() {
- return releasedIdleCount.get();
- }
-
- /**
- * reset the statistics of this pool.
- */
- public void resetStats() {
- borrowedCount.set(0);
- returnedCount.set(0);
- createdCount.set(0);
- releasedCount.set(0);
- reconnectedCount.set(0);
- removeAbandonedCount.set(0);
- releasedIdleCount.set(0);
- }
-
- /**
- * Tread safe wrapper around a future for the regular queue
- * This one retrieves the pooled connection object
- * and performs the initialization according to
- * interceptors and validation rules.
- * This class is thread safe and is cancellable
- *
- */
- protected class ConnectionFuture implements Future<Connection>, Runnable {
- Future<PooledConnection> pcFuture = null;
- AtomicBoolean configured = new AtomicBoolean(false);
- CountDownLatch latch = new CountDownLatch(1);
- volatile Connection result = null;
- SQLException cause = null;
- AtomicBoolean cancelled = new AtomicBoolean(false);
- volatile PooledConnection pc = null;
- public ConnectionFuture(Future<PooledConnection> pcf) {
- this.pcFuture = pcf;
- }
-
- public ConnectionFuture(PooledConnection pc) throws SQLException {
- this.pc = pc;
- result = ConnectionPool.this.setupConnection(pc);
- configured.set(true);
- }
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean cancel(boolean mayInterruptIfRunning) {
- if (pc!=null) {
- return false;
- } else if ((!cancelled.get()) && cancelled.compareAndSet(false, true)) {
- //cancel by retrieving the connection and returning it to the pool
- ConnectionPool.this.cancellator.execute(this);
- }
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Connection get() throws InterruptedException, ExecutionException {
- try {
- return get(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
- }catch (TimeoutException x) {
- throw new ExecutionException(x);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Connection get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
- PooledConnection pc = this.pc!=null?this.pc:pcFuture.get(timeout,unit);
- if (pc!=null) {
- if (result!=null) return result;
- if (configured.compareAndSet(false, true)) {
- try {
- pc = borrowConnection(System.currentTimeMillis(),pc, null, null);
- result = ConnectionPool.this.setupConnection(pc);
- } catch (SQLException x) {
- cause = x;
- } finally {
- latch.countDown();
- }
- } else {
- //if we reach here, another thread is configuring the actual connection
- latch.await(timeout,unit); //this shouldn't block for long
- }
- if (result==null) throw new ExecutionException(cause);
- return result;
- } else {
- return null;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isCancelled() {
- return pc==null && (pcFuture.isCancelled() || cancelled.get());
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isDone() {
- return pc!=null || pcFuture.isDone();
- }
-
- /**
- * run method to be executed when cancelled by an executor
- */
- @Override
- public void run() {
- try {
- Connection con = get(); //complete this future
- con.close(); //return to the pool
- }catch (ExecutionException ex) {
- //we can ignore this
- }catch (Exception x) {
- ConnectionPool.log.error("Unable to cancel ConnectionFuture.",x);
- }
- }
-
- }
-
-
-
- private static volatile Timer poolCleanTimer = null;
- private static HashSet<PoolCleaner> cleaners = new HashSet<>();
-
- private static synchronized void registerCleaner(PoolCleaner cleaner) {
- unregisterCleaner(cleaner);
- cleaners.add(cleaner);
- if (poolCleanTimer == null) {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- try {
- Thread.currentThread().setContextClassLoader(ConnectionPool.class.getClassLoader());
- // Create the timer thread in a PrivilegedAction so that a
- // reference to the web application class loader is not created
- // via Thread.inheritedAccessControlContext
- PrivilegedAction<Timer> pa = new PrivilegedNewTimer();
- poolCleanTimer = AccessController.doPrivileged(pa);
- } finally {
- Thread.currentThread().setContextClassLoader(loader);
- }
- }
- poolCleanTimer.schedule(cleaner, cleaner.sleepTime,cleaner.sleepTime);
- }
-
- private static synchronized void unregisterCleaner(PoolCleaner cleaner) {
- boolean removed = cleaners.remove(cleaner);
- if (removed) {
- cleaner.cancel();
- if (poolCleanTimer != null) {
- poolCleanTimer.purge();
- if (cleaners.size() == 0) {
- poolCleanTimer.cancel();
- poolCleanTimer = null;
- }
- }
- }
- }
-
- private static class PrivilegedNewTimer implements PrivilegedAction<Timer> {
- @Override
- public Timer run() {
- return new Timer("Tomcat JDBC Pool Cleaner["+ System.identityHashCode(ConnectionPool.class.getClassLoader()) + ":"+
- System.currentTimeMillis() + "]", true);
- }
- }
-
- public static Set<TimerTask> getPoolCleaners() {
- return Collections.<TimerTask>unmodifiableSet(cleaners);
- }
-
- public long getPoolVersion() {
- return poolVersion.get();
- }
-
- public static Timer getPoolTimer() {
- return poolCleanTimer;
- }
-
- protected static class PoolCleaner extends TimerTask {
- protected WeakReference<ConnectionPool> pool;
- protected long sleepTime;
-
- PoolCleaner(ConnectionPool pool, long sleepTime) {
- this.pool = new WeakReference<>(pool);
- this.sleepTime = sleepTime;
- if (sleepTime <= 0) {
- log.warn("Database connection pool evicter thread interval is set to 0, defaulting to 30 seconds");
- this.sleepTime = 1000 * 30;
- } else if (sleepTime < 1000) {
- log.warn("Database connection pool evicter thread interval is set to lower than 1 second.");
- }
- }
-
- @Override
- public void run() {
- ConnectionPool pool = this.pool.get();
- if (pool == null) {
- stopRunning();
- } else if (!pool.isClosed()) {
- try {
- if (pool.getPoolProperties().isRemoveAbandoned()
- || pool.getPoolProperties().getSuspectTimeout() > 0)
- pool.checkAbandoned();
- if (pool.getPoolProperties().getMinIdle() < pool.idle
- .size())
- pool.checkIdle();
- if (pool.getPoolProperties().isTestWhileIdle())
- pool.testAllIdle();
- } catch (Exception x) {
- log.error("", x);
- }
- }
- }
-
- public void start() {
- registerCleaner(this);
- }
-
- public void stopRunning() {
- unregisterCleaner(this);
- }
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSource.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSource.java
deleted file mode 100644
index 4922bf0..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSource.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.lang.management.ManagementFactory;
-import java.util.Hashtable;
-
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanRegistration;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-
-/**
- * A DataSource that can be instantiated through IoC and implements the DataSource interface
- * since the DataSourceProxy is used as a generic proxy.
- * The DataSource simply wraps a {@link ConnectionPool} in order to provide a standard interface to the user.
- * @version 1.0
- */
-public class DataSource extends DataSourceProxy implements javax.sql.DataSource,MBeanRegistration, org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean, javax.sql.ConnectionPoolDataSource {
- private static final Log log = LogFactory.getLog(DataSource.class);
-
- /**
- * Constructor for reflection only. A default set of pool properties will be created.
- */
- public DataSource() {
- super();
- }
-
- /**
- * Constructs a DataSource object wrapping a connection
- * @param poolProperties The pool properties
- */
- public DataSource(PoolConfiguration poolProperties) {
- super(poolProperties);
- }
-
-
-
-
-
-//===============================================================================
-// JMX Operations - Register the actual pool itself under the tomcat.jdbc domain
-//===============================================================================
- protected volatile ObjectName oname = null;
-
- /**
- * Unregisters the underlying connection pool mbean.<br>
- * {@inheritDoc}
- */
- @Override
- public void postDeregister() {
- if (oname!=null) unregisterJmx();
- }
-
- /**
- * no-op<br>
- * {@inheritDoc}
- */
- @Override
- public void postRegister(Boolean registrationDone) {
- // NOOP
- }
-
-
- /**
- * no-op<br>
- * {@inheritDoc}
- */
- @Override
- public void preDeregister() throws Exception {
- // NOOP
- }
-
- /**
- * If the connection pool MBean exists, it will be registered during this operation.<br>
- * {@inheritDoc}
- */
- @Override
- public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
- try {
- if ( isJmxEnabled() ) {
- this.oname = createObjectName(name);
- if (oname!=null) registerJmx();
- }
- }catch (MalformedObjectNameException x) {
- log.error("Unable to create object name for JDBC pool.",x);
- }
- return name;
- }
-
- /**
- * Creates the ObjectName for the ConnectionPoolMBean object to be registered
- * @param original the ObjectName for the DataSource
- * @return the ObjectName for the ConnectionPoolMBean
- * @throws MalformedObjectNameException Invalid object name
- */
- public ObjectName createObjectName(ObjectName original) throws MalformedObjectNameException {
- String domain = ConnectionPool.POOL_JMX_DOMAIN;
- Hashtable<String,String> properties = original.getKeyPropertyList();
- String origDomain = original.getDomain();
- properties.put("type", "ConnectionPool");
- properties.put("class", this.getClass().getName());
- if (original.getKeyProperty("path")!=null || properties.get("context")!=null) {
- //this ensures that if the registration came from tomcat, we're not losing
- //the unique domain, but putting that into as an engine attribute
- properties.put("engine", origDomain);
- }
- ObjectName name = new ObjectName(domain,properties);
- return name;
- }
-
- /**
- * Registers the ConnectionPoolMBean under a unique name based on the ObjectName for the DataSource
- */
- protected void registerJmx() {
- try {
- if (pool.getJmxPool()!=null) {
- MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
- mbs.registerMBean(pool.getJmxPool(), oname);
- }
- } catch (Exception e) {
- log.error("Unable to register JDBC pool with JMX",e);
- }
- }
-
- /**
- *
- */
- protected void unregisterJmx() {
- try {
- MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
- mbs.unregisterMBean(oname);
- } catch (InstanceNotFoundException ignore) {
- // NOOP
- } catch (Exception e) {
- log.error("Unable to unregister JDBC pool with JMX",e);
- }
- }
-
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
deleted file mode 100644
index d0a5127..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
+++ /dev/null
@@ -1,612 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-
-import java.sql.Connection;
-import java.util.Hashtable;
-import java.util.Properties;
-
-import javax.management.ObjectName;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.Name;
-import javax.naming.NamingException;
-import javax.naming.RefAddr;
-import javax.naming.Reference;
-import javax.naming.spi.ObjectFactory;
-import javax.sql.DataSource;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-/**
- * <p>JNDI object factory that creates an instance of
- * <code>BasicDataSource</code> that has been configured based on the
- * <code>RefAddr</code> values of the specified <code>Reference</code>,
- * which must match the names and data types of the
- * <code>BasicDataSource</code> bean properties.</p>
- * <br>
- * Properties available for configuration:<br>
- * <a href="http://commons.apache.org/dbcp/configuration.html">Commons DBCP properties</a><br>
- *<ol>
- * <li>initSQL - A query that gets executed once, right after the connection is established.</li>
- * <li>testOnConnect - run validationQuery after connection has been established.</li>
- * <li>validationInterval - avoid excess validation, only run validation at most at this frequency - time in milliseconds.</li>
- * <li>jdbcInterceptors - a semicolon separated list of classnames extending {@link JdbcInterceptor} class.</li>
- * <li>jmxEnabled - true of false, whether to register the pool with JMX.</li>
- * <li>fairQueue - true of false, whether the pool should sacrifice a little bit of performance for true fairness.</li>
- *</ol>
- * @author Craig R. McClanahan
- * @author Dirk Verbeeck
- */
-public class DataSourceFactory implements ObjectFactory {
- private static final Log log = LogFactory.getLog(DataSourceFactory.class);
-
- protected static final String PROP_DEFAULTAUTOCOMMIT = "defaultAutoCommit";
- protected static final String PROP_DEFAULTREADONLY = "defaultReadOnly";
- protected static final String PROP_DEFAULTTRANSACTIONISOLATION = "defaultTransactionIsolation";
- protected static final String PROP_DEFAULTCATALOG = "defaultCatalog";
-
- protected static final String PROP_DRIVERCLASSNAME = "driverClassName";
- protected static final String PROP_PASSWORD = "password";
- protected static final String PROP_URL = "url";
- protected static final String PROP_USERNAME = "username";
-
- protected static final String PROP_MAXACTIVE = "maxActive";
- protected static final String PROP_MAXIDLE = "maxIdle";
- protected static final String PROP_MINIDLE = "minIdle";
- protected static final String PROP_INITIALSIZE = "initialSize";
- protected static final String PROP_MAXWAIT = "maxWait";
- protected static final String PROP_MAXAGE = "maxAge";
-
- protected static final String PROP_TESTONBORROW = "testOnBorrow";
- protected static final String PROP_TESTONRETURN = "testOnReturn";
- protected static final String PROP_TESTWHILEIDLE = "testWhileIdle";
- protected static final String PROP_TESTONCONNECT = "testOnConnect";
- protected static final String PROP_VALIDATIONQUERY = "validationQuery";
- protected static final String PROP_VALIDATIONQUERY_TIMEOUT = "validationQueryTimeout";
- protected static final String PROP_VALIDATOR_CLASS_NAME = "validatorClassName";
-
- protected static final String PROP_NUMTESTSPEREVICTIONRUN = "numTestsPerEvictionRun";
- protected static final String PROP_TIMEBETWEENEVICTIONRUNSMILLIS = "timeBetweenEvictionRunsMillis";
- protected static final String PROP_MINEVICTABLEIDLETIMEMILLIS = "minEvictableIdleTimeMillis";
-
- protected static final String PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED = "accessToUnderlyingConnectionAllowed";
-
- protected static final String PROP_REMOVEABANDONED = "removeAbandoned";
- protected static final String PROP_REMOVEABANDONEDTIMEOUT = "removeAbandonedTimeout";
- protected static final String PROP_LOGABANDONED = "logAbandoned";
- protected static final String PROP_ABANDONWHENPERCENTAGEFULL = "abandonWhenPercentageFull";
-
- protected static final String PROP_POOLPREPAREDSTATEMENTS = "poolPreparedStatements";
- protected static final String PROP_MAXOPENPREPAREDSTATEMENTS = "maxOpenPreparedStatements";
- protected static final String PROP_CONNECTIONPROPERTIES = "connectionProperties";
-
- protected static final String PROP_INITSQL = "initSQL";
- protected static final String PROP_INTERCEPTORS = "jdbcInterceptors";
- protected static final String PROP_VALIDATIONINTERVAL = "validationInterval";
- protected static final String PROP_JMX_ENABLED = "jmxEnabled";
- protected static final String PROP_FAIR_QUEUE = "fairQueue";
-
- protected static final String PROP_USE_EQUALS = "useEquals";
- protected static final String PROP_USE_CON_LOCK = "useLock";
-
- protected static final String PROP_DATASOURCE= "dataSource";
- protected static final String PROP_DATASOURCE_JNDI = "dataSourceJNDI";
-
- protected static final String PROP_SUSPECT_TIMEOUT = "suspectTimeout";
-
- protected static final String PROP_ALTERNATE_USERNAME_ALLOWED = "alternateUsernameAllowed";
-
- protected static final String PROP_COMMITONRETURN = "commitOnReturn";
- protected static final String PROP_ROLLBACKONRETURN = "rollbackOnReturn";
-
- protected static final String PROP_USEDISPOSABLECONNECTIONFACADE = "useDisposableConnectionFacade";
-
- protected static final String PROP_LOGVALIDATIONERRORS = "logValidationErrors";
-
- protected static final String PROP_PROPAGATEINTERRUPTSTATE = "propagateInterruptState";
-
- protected static final String PROP_IGNOREEXCEPTIONONPRELOAD = "ignoreExceptionOnPreLoad";
-
- public static final int UNKNOWN_TRANSACTIONISOLATION = -1;
-
- public static final String OBJECT_NAME = "object_name";
-
-
- protected static final String[] ALL_PROPERTIES = {
- PROP_DEFAULTAUTOCOMMIT,
- PROP_DEFAULTREADONLY,
- PROP_DEFAULTTRANSACTIONISOLATION,
- PROP_DEFAULTCATALOG,
- PROP_DRIVERCLASSNAME,
- PROP_MAXACTIVE,
- PROP_MAXIDLE,
- PROP_MINIDLE,
- PROP_INITIALSIZE,
- PROP_MAXWAIT,
- PROP_TESTONBORROW,
- PROP_TESTONRETURN,
- PROP_TIMEBETWEENEVICTIONRUNSMILLIS,
- PROP_NUMTESTSPEREVICTIONRUN,
- PROP_MINEVICTABLEIDLETIMEMILLIS,
- PROP_TESTWHILEIDLE,
- PROP_TESTONCONNECT,
- PROP_PASSWORD,
- PROP_URL,
- PROP_USERNAME,
- PROP_VALIDATIONQUERY,
- PROP_VALIDATIONQUERY_TIMEOUT,
- PROP_VALIDATOR_CLASS_NAME,
- PROP_VALIDATIONINTERVAL,
- PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED,
- PROP_REMOVEABANDONED,
- PROP_REMOVEABANDONEDTIMEOUT,
- PROP_LOGABANDONED,
- PROP_POOLPREPAREDSTATEMENTS,
- PROP_MAXOPENPREPAREDSTATEMENTS,
- PROP_CONNECTIONPROPERTIES,
- PROP_INITSQL,
- PROP_INTERCEPTORS,
- PROP_JMX_ENABLED,
- PROP_FAIR_QUEUE,
- PROP_USE_EQUALS,
- OBJECT_NAME,
- PROP_ABANDONWHENPERCENTAGEFULL,
- PROP_MAXAGE,
- PROP_USE_CON_LOCK,
- PROP_DATASOURCE,
- PROP_DATASOURCE_JNDI,
- PROP_SUSPECT_TIMEOUT,
- PROP_ALTERNATE_USERNAME_ALLOWED,
- PROP_COMMITONRETURN,
- PROP_ROLLBACKONRETURN,
- PROP_USEDISPOSABLECONNECTIONFACADE,
- PROP_LOGVALIDATIONERRORS,
- PROP_PROPAGATEINTERRUPTSTATE,
- PROP_IGNOREEXCEPTIONONPRELOAD
- };
-
- // -------------------------------------------------- ObjectFactory Methods
-
- /**
- * <p>Create and return a new <code>BasicDataSource</code> instance. If no
- * instance can be created, return <code>null</code> instead.</p>
- *
- * @param obj The possibly null object containing location or
- * reference information that can be used in creating an object
- * @param name The name of this object relative to <code>nameCtx</code>
- * @param nameCtx The context relative to which the <code>name</code>
- * parameter is specified, or <code>null</code> if <code>name</code>
- * is relative to the default initial context
- * @param environment The possibly null environment that is used in
- * creating this object
- *
- * @exception Exception if an exception occurs creating the instance
- */
- @Override
- public Object getObjectInstance(Object obj, Name name, Context nameCtx,
- Hashtable<?,?> environment) throws Exception {
-
- // We only know how to deal with <code>javax.naming.Reference</code>s
- // that specify a class name of "javax.sql.DataSource"
- if ((obj == null) || !(obj instanceof Reference)) {
- return null;
- }
- Reference ref = (Reference) obj;
- boolean XA = false;
- boolean ok = false;
- if ("javax.sql.DataSource".equals(ref.getClassName())) {
- ok = true;
- }
- if ("javax.sql.XADataSource".equals(ref.getClassName())) {
- ok = true;
- XA = true;
- }
- if (org.apache.tomcat.jdbc.pool.DataSource.class.getName().equals(ref.getClassName())) {
- ok = true;
- }
-
- if (!ok) {
- log.warn(ref.getClassName()+" is not a valid class name/type for this JNDI factory.");
- return null;
- }
-
-
- Properties properties = new Properties();
- for (int i = 0; i < ALL_PROPERTIES.length; i++) {
- String propertyName = ALL_PROPERTIES[i];
- RefAddr ra = ref.get(propertyName);
- if (ra != null) {
- String propertyValue = ra.getContent().toString();
- properties.setProperty(propertyName, propertyValue);
- }
- }
-
- return createDataSource(properties,nameCtx,XA);
- }
-
- public static PoolConfiguration parsePoolProperties(Properties properties) {
- PoolConfiguration poolProperties = new PoolProperties();
- String value = null;
-
- value = properties.getProperty(PROP_DEFAULTAUTOCOMMIT);
- if (value != null) {
- poolProperties.setDefaultAutoCommit(Boolean.valueOf(value));
- }
-
- value = properties.getProperty(PROP_DEFAULTREADONLY);
- if (value != null) {
- poolProperties.setDefaultReadOnly(Boolean.valueOf(value));
- }
-
- value = properties.getProperty(PROP_DEFAULTTRANSACTIONISOLATION);
- if (value != null) {
- int level = UNKNOWN_TRANSACTIONISOLATION;
- if ("NONE".equalsIgnoreCase(value)) {
- level = Connection.TRANSACTION_NONE;
- } else if ("READ_COMMITTED".equalsIgnoreCase(value)) {
- level = Connection.TRANSACTION_READ_COMMITTED;
- } else if ("READ_UNCOMMITTED".equalsIgnoreCase(value)) {
- level = Connection.TRANSACTION_READ_UNCOMMITTED;
- } else if ("REPEATABLE_READ".equalsIgnoreCase(value)) {
- level = Connection.TRANSACTION_REPEATABLE_READ;
- } else if ("SERIALIZABLE".equalsIgnoreCase(value)) {
- level = Connection.TRANSACTION_SERIALIZABLE;
- } else {
- try {
- level = Integer.parseInt(value);
- } catch (NumberFormatException e) {
- System.err.println("Could not parse defaultTransactionIsolation: " + value);
- System.err.println("WARNING: defaultTransactionIsolation not set");
- System.err.println("using default value of database driver");
- level = UNKNOWN_TRANSACTIONISOLATION;
- }
- }
- poolProperties.setDefaultTransactionIsolation(level);
- }
-
- value = properties.getProperty(PROP_DEFAULTCATALOG);
- if (value != null) {
- poolProperties.setDefaultCatalog(value);
- }
-
- value = properties.getProperty(PROP_DRIVERCLASSNAME);
- if (value != null) {
- poolProperties.setDriverClassName(value);
- }
-
- value = properties.getProperty(PROP_MAXACTIVE);
- if (value != null) {
- poolProperties.setMaxActive(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_MAXIDLE);
- if (value != null) {
- poolProperties.setMaxIdle(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_MINIDLE);
- if (value != null) {
- poolProperties.setMinIdle(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_INITIALSIZE);
- if (value != null) {
- poolProperties.setInitialSize(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_MAXWAIT);
- if (value != null) {
- poolProperties.setMaxWait(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_TESTONBORROW);
- if (value != null) {
- poolProperties.setTestOnBorrow(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_TESTONRETURN);
- if (value != null) {
- poolProperties.setTestOnReturn(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_TESTONCONNECT);
- if (value != null) {
- poolProperties.setTestOnConnect(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_TIMEBETWEENEVICTIONRUNSMILLIS);
- if (value != null) {
- poolProperties.setTimeBetweenEvictionRunsMillis(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_NUMTESTSPEREVICTIONRUN);
- if (value != null) {
- poolProperties.setNumTestsPerEvictionRun(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_MINEVICTABLEIDLETIMEMILLIS);
- if (value != null) {
- poolProperties.setMinEvictableIdleTimeMillis(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_TESTWHILEIDLE);
- if (value != null) {
- poolProperties.setTestWhileIdle(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_PASSWORD);
- if (value != null) {
- poolProperties.setPassword(value);
- }
-
- value = properties.getProperty(PROP_URL);
- if (value != null) {
- poolProperties.setUrl(value);
- }
-
- value = properties.getProperty(PROP_USERNAME);
- if (value != null) {
- poolProperties.setUsername(value);
- }
-
- value = properties.getProperty(PROP_VALIDATIONQUERY);
- if (value != null) {
- poolProperties.setValidationQuery(value);
- }
-
- value = properties.getProperty(PROP_VALIDATIONQUERY_TIMEOUT);
- if (value != null) {
- poolProperties.setValidationQueryTimeout(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_VALIDATOR_CLASS_NAME);
- if (value != null) {
- poolProperties.setValidatorClassName(value);
- }
-
- value = properties.getProperty(PROP_VALIDATIONINTERVAL);
- if (value != null) {
- poolProperties.setValidationInterval(Long.parseLong(value));
- }
-
- value = properties.getProperty(PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED);
- if (value != null) {
- poolProperties.setAccessToUnderlyingConnectionAllowed(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_REMOVEABANDONED);
- if (value != null) {
- poolProperties.setRemoveAbandoned(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_REMOVEABANDONEDTIMEOUT);
- if (value != null) {
- poolProperties.setRemoveAbandonedTimeout(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_LOGABANDONED);
- if (value != null) {
- poolProperties.setLogAbandoned(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_POOLPREPAREDSTATEMENTS);
- if (value != null) {
- log.warn(PROP_POOLPREPAREDSTATEMENTS + " is not a valid setting, it will have no effect.");
- }
-
- value = properties.getProperty(PROP_MAXOPENPREPAREDSTATEMENTS);
- if (value != null) {
- log.warn(PROP_MAXOPENPREPAREDSTATEMENTS + " is not a valid setting, it will have no effect.");
- }
-
- value = properties.getProperty(PROP_CONNECTIONPROPERTIES);
- if (value != null) {
- Properties p = getProperties(value);
- poolProperties.setDbProperties(p);
- } else {
- poolProperties.setDbProperties(new Properties());
- }
-
- if (poolProperties.getUsername()!=null) {
- poolProperties.getDbProperties().setProperty("user",poolProperties.getUsername());
- }
- if (poolProperties.getPassword()!=null) {
- poolProperties.getDbProperties().setProperty("password",poolProperties.getPassword());
- }
-
- value = properties.getProperty(PROP_INITSQL);
- if (value != null) {
- poolProperties.setInitSQL(value);
- }
-
- value = properties.getProperty(PROP_INTERCEPTORS);
- if (value != null) {
- poolProperties.setJdbcInterceptors(value);
- }
-
- value = properties.getProperty(PROP_JMX_ENABLED);
- if (value != null) {
- poolProperties.setJmxEnabled(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_FAIR_QUEUE);
- if (value != null) {
- poolProperties.setFairQueue(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_USE_EQUALS);
- if (value != null) {
- poolProperties.setUseEquals(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(OBJECT_NAME);
- if (value != null) {
- poolProperties.setName(ObjectName.quote(value));
- }
-
- value = properties.getProperty(PROP_ABANDONWHENPERCENTAGEFULL);
- if (value != null) {
- poolProperties.setAbandonWhenPercentageFull(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_MAXAGE);
- if (value != null) {
- poolProperties.setMaxAge(Long.parseLong(value));
- }
-
- value = properties.getProperty(PROP_USE_CON_LOCK);
- if (value != null) {
- poolProperties.setUseLock(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_DATASOURCE);
- if (value != null) {
- //this should never happen
- throw new IllegalArgumentException("Can't set dataSource property as a string, this must be a javax.sql.DataSource object.");
-
- }
-
- value = properties.getProperty(PROP_DATASOURCE_JNDI);
- if (value != null) {
- poolProperties.setDataSourceJNDI(value);
- }
-
- value = properties.getProperty(PROP_SUSPECT_TIMEOUT);
- if (value != null) {
- poolProperties.setSuspectTimeout(Integer.parseInt(value));
- }
-
- value = properties.getProperty(PROP_ALTERNATE_USERNAME_ALLOWED);
- if (value != null) {
- poolProperties.setAlternateUsernameAllowed(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_COMMITONRETURN);
- if (value != null) {
- poolProperties.setCommitOnReturn(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_ROLLBACKONRETURN);
- if (value != null) {
- poolProperties.setRollbackOnReturn(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_USEDISPOSABLECONNECTIONFACADE);
- if (value != null) {
- poolProperties.setUseDisposableConnectionFacade(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_LOGVALIDATIONERRORS);
- if (value != null) {
- poolProperties.setLogValidationErrors(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_PROPAGATEINTERRUPTSTATE);
- if (value != null) {
- poolProperties.setPropagateInterruptState(Boolean.parseBoolean(value));
- }
-
- value = properties.getProperty(PROP_IGNOREEXCEPTIONONPRELOAD);
- if (value != null) {
- poolProperties.setIgnoreExceptionOnPreLoad(Boolean.parseBoolean(value));
- }
-
- return poolProperties;
- }
-
- /**
- * Creates and configures a {@link DataSource} instance based on the
- * given properties.
- *
- * @param properties the datasource configuration properties
- * @return the datasource
- * @throws Exception if an error occurs creating the data source
- */
- public DataSource createDataSource(Properties properties) throws Exception {
- return createDataSource(properties,null,false);
- }
- public DataSource createDataSource(Properties properties,Context context, boolean XA) throws Exception {
- PoolConfiguration poolProperties = DataSourceFactory.parsePoolProperties(properties);
- if (poolProperties.getDataSourceJNDI()!=null && poolProperties.getDataSource()==null) {
- performJNDILookup(context, poolProperties);
- }
- org.apache.tomcat.jdbc.pool.DataSource dataSource = XA?
- new org.apache.tomcat.jdbc.pool.XADataSource(poolProperties) :
- new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
- //initialise the pool itself
- dataSource.createPool();
- // Return the configured DataSource instance
- return dataSource;
- }
-
- public void performJNDILookup(Context context, PoolConfiguration poolProperties) {
- Object jndiDS = null;
- try {
- if (context!=null) {
- jndiDS = context.lookup(poolProperties.getDataSourceJNDI());
- } else {
- log.warn("dataSourceJNDI property is configured, but local JNDI context is null.");
- }
- } catch (NamingException e) {
- log.debug("The name \""+poolProperties.getDataSourceJNDI()+"\" cannot be found in the local context.");
- }
- if (jndiDS==null) {
- try {
- context = new InitialContext();
- jndiDS = context.lookup(poolProperties.getDataSourceJNDI());
- } catch (NamingException e) {
- log.warn("The name \""+poolProperties.getDataSourceJNDI()+"\" cannot be found in the InitialContext.");
- }
- }
- if (jndiDS!=null) {
- poolProperties.setDataSource(jndiDS);
- }
- }
-
- /**
- * Parse properties from the string. Format of the string must be [propertyName=property;]*.
- * @param propText The properties string
- * @return the properties
- */
- protected static Properties getProperties(String propText) {
- return PoolProperties.getProperties(propText,null);
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
deleted file mode 100644
index 3e9b8ae..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
+++ /dev/null
@@ -1,1496 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.io.PrintWriter;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.concurrent.Future;
-import java.util.logging.Logger;
-
-import javax.sql.XAConnection;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorDefinition;
-
-/**
- *
- * The DataSource proxy lets us implements methods that don't exist in the current
- * compiler JDK but might be methods that are part of a future JDK DataSource interface.
- * <br>
- * It's a trick to work around compiler issues when implementing interfaces. For example,
- * I could put in Java 6 methods of javax.sql.DataSource here, and compile it with JDK 1.5
- * and still be able to run under Java 6 without getting NoSuchMethodException.
- *
- * @version 1.0
- */
-
-public class DataSourceProxy implements PoolConfiguration {
- private static final Log log = LogFactory.getLog(DataSourceProxy.class);
-
- protected volatile ConnectionPool pool = null;
-
- protected volatile PoolConfiguration poolProperties = null;
-
- public DataSourceProxy() {
- this(new PoolProperties());
- }
-
- public DataSourceProxy(PoolConfiguration poolProperties) {
- if (poolProperties == null) throw new NullPointerException("PoolConfiguration cannot be null.");
- this.poolProperties = poolProperties;
- }
-
-
- @SuppressWarnings("unused") // Has to match signature in DataSource
- public boolean isWrapperFor(Class<?> iface) throws SQLException {
- // we are not a wrapper of anything
- return false;
- }
-
-
- @SuppressWarnings("unused") // Has to match signature in DataSource
- public <T> T unwrap(Class<T> iface) throws SQLException {
- //we can't unwrap anything
- return null;
- }
-
- /**
- * Get a database connection.
- * {@link javax.sql.DataSource#getConnection()}
- * @param username The user name
- * @param password The password
- * @return the connection
- * @throws SQLException Connection error
- */
- public Connection getConnection(String username, String password) throws SQLException {
- if (this.getPoolProperties().isAlternateUsernameAllowed()) {
- if (pool == null)
- return createPool().getConnection(username,password);
- return pool.getConnection(username,password);
- } else {
- return getConnection();
- }
- }
-
- public PoolConfiguration getPoolProperties() {
- return poolProperties;
- }
-
- /**
- * Sets up the connection pool, by creating a pooling driver.
- * @return the connection pool
- * @throws SQLException Error creating pool
- */
- public ConnectionPool createPool() throws SQLException {
- if (pool != null) {
- return pool;
- } else {
- return pCreatePool();
- }
- }
-
- /**
- * Sets up the connection pool, by creating a pooling driver.
- */
- private synchronized ConnectionPool pCreatePool() throws SQLException {
- if (pool != null) {
- return pool;
- } else {
- pool = new ConnectionPool(poolProperties);
- return pool;
- }
- }
-
- /**
- * Get a database connection.
- * {@link javax.sql.DataSource#getConnection()}
- * @return the connection
- * @throws SQLException Connection error
- */
- public Connection getConnection() throws SQLException {
- if (pool == null)
- return createPool().getConnection();
- return pool.getConnection();
- }
-
- /**
- * Invokes an sync operation to retrieve the connection.
- * @return a Future containing a reference to the connection when it becomes available
- * @throws SQLException Connection error
- */
- public Future<Connection> getConnectionAsync() throws SQLException {
- if (pool == null)
- return createPool().getConnectionAsync();
- return pool.getConnectionAsync();
- }
-
- /**
- * Get a database connection.
- * {@link javax.sql.XADataSource#getXAConnection()}
- * @return the connection
- * @throws SQLException Connection error
- */
- public XAConnection getXAConnection() throws SQLException {
- Connection con = getConnection();
- if (con instanceof XAConnection) {
- return (XAConnection)con;
- } else {
- try {
- con.close();
- } catch (Exception ignore) {
- // Ignore
- }
- throw new SQLException("Connection from pool does not implement javax.sql.XAConnection");
- }
- }
-
- /**
- * Get a database connection.
- * {@link javax.sql.XADataSource#getXAConnection(String, String)}
- * @param username The user name
- * @param password The password
- * @return the connection
- * @throws SQLException Connection error
- */
- public XAConnection getXAConnection(String username, String password) throws SQLException {
- Connection con = getConnection(username, password);
- if (con instanceof XAConnection) {
- return (XAConnection)con;
- } else {
- try {
- con.close();
- } catch (Exception ignore) {
- // Ignore
- }
- throw new SQLException("Connection from pool does not implement javax.sql.XAConnection");
- }
- }
-
-
- /**
- * Get a database connection.
- * {@link javax.sql.DataSource#getConnection()}
- * @return the connection
- * @throws SQLException Connection error
- */
- public javax.sql.PooledConnection getPooledConnection() throws SQLException {
- return (javax.sql.PooledConnection) getConnection();
- }
-
- /**
- * Get a database connection.
- * {@link javax.sql.DataSource#getConnection()}
- * @param username unused
- * @param password unused
- * @return the connection
- * @throws SQLException Connection error
- */
- public javax.sql.PooledConnection getPooledConnection(String username,
- String password) throws SQLException {
- return (javax.sql.PooledConnection) getConnection();
- }
-
- public ConnectionPool getPool() {
- try {
- return createPool();
- }catch (SQLException x) {
- log.error("Error during connection pool creation.", x);
- return null;
- }
- }
-
-
- public void close() {
- close(false);
- }
- public void close(boolean all) {
- try {
- if (pool != null) {
- final ConnectionPool p = pool;
- pool = null;
- if (p!=null) {
- p.close(all);
- }
- }
- }catch (Exception x) {
- log.warn("Error during connection pool closure.", x);
- }
- }
-
- public int getPoolSize() {
- final ConnectionPool p = pool;
- if (p == null) return 0;
- else return p.getSize();
- }
-
-
- @Override
- public String toString() {
- return super.toString()+"{"+getPoolProperties()+"}";
- }
-
-
-/*-----------------------------------------------------------------------*/
-// PROPERTIES WHEN NOT USED WITH FACTORY
-/*------------------------------------------------------------------------*/
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getPoolName() {
- return pool.getName();
- }
-
-
- public void setPoolProperties(PoolConfiguration poolProperties) {
- this.poolProperties = poolProperties;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDriverClassName(String driverClassName) {
- this.poolProperties.setDriverClassName(driverClassName);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setInitialSize(int initialSize) {
- this.poolProperties.setInitialSize(initialSize);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setInitSQL(String initSQL) {
- this.poolProperties.setInitSQL(initSQL);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setLogAbandoned(boolean logAbandoned) {
- this.poolProperties.setLogAbandoned(logAbandoned);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxActive(int maxActive) {
- this.poolProperties.setMaxActive(maxActive);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxIdle(int maxIdle) {
- this.poolProperties.setMaxIdle(maxIdle);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxWait(int maxWait) {
- this.poolProperties.setMaxWait(maxWait);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
- this.poolProperties.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMinIdle(int minIdle) {
- this.poolProperties.setMinIdle(minIdle);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
- this.poolProperties.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setPassword(String password) {
- this.poolProperties.setPassword(password);
- this.poolProperties.getDbProperties().setProperty("password",this.poolProperties.getPassword());
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setRemoveAbandoned(boolean removeAbandoned) {
- this.poolProperties.setRemoveAbandoned(removeAbandoned);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) {
- this.poolProperties.setRemoveAbandonedTimeout(removeAbandonedTimeout);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestOnBorrow(boolean testOnBorrow) {
- this.poolProperties.setTestOnBorrow(testOnBorrow);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestOnConnect(boolean testOnConnect) {
- this.poolProperties.setTestOnConnect(testOnConnect);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestOnReturn(boolean testOnReturn) {
- this.poolProperties.setTestOnReturn(testOnReturn);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestWhileIdle(boolean testWhileIdle) {
- this.poolProperties.setTestWhileIdle(testWhileIdle);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
- this.poolProperties.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUrl(String url) {
- this.poolProperties.setUrl(url);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUsername(String username) {
- this.poolProperties.setUsername(username);
- this.poolProperties.getDbProperties().setProperty("user",getPoolProperties().getUsername());
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidationInterval(long validationInterval) {
- this.poolProperties.setValidationInterval(validationInterval);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidationQuery(String validationQuery) {
- this.poolProperties.setValidationQuery(validationQuery);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidatorClassName(String className) {
- this.poolProperties.setValidatorClassName(className);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidationQueryTimeout(int validationQueryTimeout) {
- this.poolProperties.setValidationQueryTimeout(validationQueryTimeout);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setJdbcInterceptors(String interceptors) {
- this.getPoolProperties().setJdbcInterceptors(interceptors);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setJmxEnabled(boolean enabled) {
- this.getPoolProperties().setJmxEnabled(enabled);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setFairQueue(boolean fairQueue) {
- this.getPoolProperties().setFairQueue(fairQueue);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUseLock(boolean useLock) {
- this.getPoolProperties().setUseLock(useLock);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultCatalog(String catalog) {
- this.getPoolProperties().setDefaultCatalog(catalog);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultAutoCommit(Boolean autocommit) {
- this.getPoolProperties().setDefaultAutoCommit(autocommit);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultTransactionIsolation(int defaultTransactionIsolation) {
- this.getPoolProperties().setDefaultTransactionIsolation(defaultTransactionIsolation);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setConnectionProperties(String properties) {
- try {
- java.util.Properties prop = DataSourceFactory
- .getProperties(properties);
- Iterator<?> i = prop.keySet().iterator();
- while (i.hasNext()) {
- String key = (String) i.next();
- String value = prop.getProperty(key);
- getPoolProperties().getDbProperties().setProperty(key, value);
- }
-
- } catch (Exception x) {
- log.error("Unable to parse connection properties.", x);
- throw new RuntimeException(x);
- }
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUseEquals(boolean useEquals) {
- this.getPoolProperties().setUseEquals(useEquals);
- }
-
- /**
- * no-op
- * {@link javax.sql.DataSource#getParentLogger}
- * @return no return value
- * @throws SQLFeatureNotSupportedException Unsupported
- */
- public Logger getParentLogger() throws SQLFeatureNotSupportedException {
- throw new SQLFeatureNotSupportedException();
- }
-
- /**
- * no-op
- * {@link javax.sql.DataSource#getLogWriter}
- * @return null
- * @throws SQLException No exception
- */
- public PrintWriter getLogWriter() throws SQLException {
- return null;
- }
-
-
- /**
- * no-op
- * {@link javax.sql.DataSource#setLogWriter(PrintWriter)}
- * @param out Ignored
- * @throws SQLException No exception
- */
- public void setLogWriter(PrintWriter out) throws SQLException {
- // NOOP
- }
-
- /**
- * no-op
- * {@link javax.sql.DataSource#getLoginTimeout}
- * @return the timeout
- */
- public int getLoginTimeout() {
- if (poolProperties == null) {
- return 0;
- } else {
- return poolProperties.getMaxWait() / 1000;
- }
- }
-
- /**
- * {@link javax.sql.DataSource#setLoginTimeout(int)}
- * @param i The timeout value
- */
- public void setLoginTimeout(int i) {
- if (poolProperties == null) {
- return;
- } else {
- poolProperties.setMaxWait(1000 * i);
- }
-
- }
-
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getSuspectTimeout() {
- return getPoolProperties().getSuspectTimeout();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setSuspectTimeout(int seconds) {
- getPoolProperties().setSuspectTimeout(seconds);
- }
-
- //===============================================================================
-// Expose JMX attributes through Tomcat's dynamic reflection
-//===============================================================================
- /**
- * If the pool has not been created, it will be created during this call.
- * @return the number of established but idle connections
- */
- public int getIdle() {
- try {
- return createPool().getIdle();
- }catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * {@link #getIdle()}
- * @return the number of established but idle connections
- */
- public int getNumIdle() {
- return getIdle();
- }
-
- /**
- * Forces an abandon check on the connection pool.
- * If connections that have been abandoned exists, they will be closed during this run
- */
- public void checkAbandoned() {
- try {
- createPool().checkAbandoned();
- }catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * Forces a check for resizing of the idle connections
- */
- public void checkIdle() {
- try {
- createPool().checkIdle();
- }catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * @return number of connections in use by the application
- */
- public int getActive() {
- try {
- return createPool().getActive();
- }catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * @return number of connections in use by the application
- * {@link DataSource#getActive()}
- */
- public int getNumActive() {
- return getActive();
- }
-
- /**
- * @return number of threads waiting for a connection
- */
- public int getWaitCount() {
- try {
- return createPool().getWaitCount();
- }catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * @return the current size of the pool
- */
- public int getSize() {
- try {
- return createPool().getSize();
- }catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * Performs a validation on idle connections
- */
- public void testIdle() {
- try {
- createPool().testAllIdle();
- }catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * The total number of connections borrowed from this pool.
- * @return the borrowed connection count
- */
- public long getBorrowedCount() {
- try {
- return createPool().getBorrowedCount();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * The total number of connections returned to this pool.
- * @return the returned connection count
- */
- public long getReturnedCount() {
- try {
- return createPool().getReturnedCount();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * The total number of connections created by this pool.
- * @return the created connection count
- */
- public long getCreatedCount() {
- try {
- return createPool().getCreatedCount();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * The total number of connections released from this pool.
- * @return the released connection count
- */
- public long getReleasedCount() {
- try {
- return createPool().getReleasedCount();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * The total number of connections reconnected by this pool.
- * @return the reconnected connection count
- */
- public long getReconnectedCount() {
- try {
- return createPool().getReconnectedCount();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * The total number of connections released by remove abandoned.
- * @return the PoolCleaner removed abandoned connection count
- */
- public long getRemoveAbandonedCount() {
- try {
- return createPool().getRemoveAbandonedCount();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * The total number of connections released by eviction.
- * @return the PoolCleaner evicted idle connection count
- */
- public long getReleasedIdleCount() {
- try {
- return createPool().getReleasedIdleCount();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- /**
- * reset the statistics of this pool.
- */
- public void resetStats() {
- try {
- createPool().resetStats();
- } catch (SQLException x) {
- throw new RuntimeException(x);
- }
- }
-
- //=========================================================
- // PROPERTIES / CONFIGURATION
- //=========================================================
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getConnectionProperties() {
- return getPoolProperties().getConnectionProperties();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Properties getDbProperties() {
- return getPoolProperties().getDbProperties();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getDefaultCatalog() {
- return getPoolProperties().getDefaultCatalog();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getDefaultTransactionIsolation() {
- return getPoolProperties().getDefaultTransactionIsolation();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getDriverClassName() {
- return getPoolProperties().getDriverClassName();
- }
-
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getInitialSize() {
- return getPoolProperties().getInitialSize();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getInitSQL() {
- return getPoolProperties().getInitSQL();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getJdbcInterceptors() {
- return getPoolProperties().getJdbcInterceptors();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMaxActive() {
- return getPoolProperties().getMaxActive();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMaxIdle() {
- return getPoolProperties().getMaxIdle();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMaxWait() {
- return getPoolProperties().getMaxWait();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMinEvictableIdleTimeMillis() {
- return getPoolProperties().getMinEvictableIdleTimeMillis();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMinIdle() {
- return getPoolProperties().getMinIdle();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public long getMaxAge() {
- return getPoolProperties().getMaxAge();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getName() {
- return getPoolProperties().getName();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getNumTestsPerEvictionRun() {
- return getPoolProperties().getNumTestsPerEvictionRun();
- }
-
- /**
- * @return DOES NOT RETURN THE PASSWORD, IT WOULD SHOW UP IN JMX
- */
- @Override
- public String getPassword() {
- return "Password not available as DataSource/JMX operation.";
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getRemoveAbandonedTimeout() {
- return getPoolProperties().getRemoveAbandonedTimeout();
- }
-
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getTimeBetweenEvictionRunsMillis() {
- return getPoolProperties().getTimeBetweenEvictionRunsMillis();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getUrl() {
- return getPoolProperties().getUrl();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getUsername() {
- return getPoolProperties().getUsername();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public long getValidationInterval() {
- return getPoolProperties().getValidationInterval();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getValidationQuery() {
- return getPoolProperties().getValidationQuery();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getValidationQueryTimeout() {
- return getPoolProperties().getValidationQueryTimeout();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getValidatorClassName() {
- return getPoolProperties().getValidatorClassName();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Validator getValidator() {
- return getPoolProperties().getValidator();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setValidator(Validator validator) {
- getPoolProperties().setValidator(validator);
- }
-
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isAccessToUnderlyingConnectionAllowed() {
- return getPoolProperties().isAccessToUnderlyingConnectionAllowed();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean isDefaultAutoCommit() {
- return getPoolProperties().isDefaultAutoCommit();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean isDefaultReadOnly() {
- return getPoolProperties().isDefaultReadOnly();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isLogAbandoned() {
- return getPoolProperties().isLogAbandoned();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isPoolSweeperEnabled() {
- return getPoolProperties().isPoolSweeperEnabled();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isRemoveAbandoned() {
- return getPoolProperties().isRemoveAbandoned();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getAbandonWhenPercentageFull() {
- return getPoolProperties().getAbandonWhenPercentageFull();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestOnBorrow() {
- return getPoolProperties().isTestOnBorrow();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestOnConnect() {
- return getPoolProperties().isTestOnConnect();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestOnReturn() {
- return getPoolProperties().isTestOnReturn();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestWhileIdle() {
- return getPoolProperties().isTestWhileIdle();
- }
-
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean getDefaultAutoCommit() {
- return getPoolProperties().getDefaultAutoCommit();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean getDefaultReadOnly() {
- return getPoolProperties().getDefaultReadOnly();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public InterceptorDefinition[] getJdbcInterceptorsAsArray() {
- return getPoolProperties().getJdbcInterceptorsAsArray();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean getUseLock() {
- return getPoolProperties().getUseLock();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isFairQueue() {
- return getPoolProperties().isFairQueue();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isJmxEnabled() {
- return getPoolProperties().isJmxEnabled();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isUseEquals() {
- return getPoolProperties().isUseEquals();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setAbandonWhenPercentageFull(int percentage) {
- getPoolProperties().setAbandonWhenPercentageFull(percentage);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setAccessToUnderlyingConnectionAllowed(boolean accessToUnderlyingConnectionAllowed) {
- getPoolProperties().setAccessToUnderlyingConnectionAllowed(accessToUnderlyingConnectionAllowed);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDbProperties(Properties dbProperties) {
- getPoolProperties().setDbProperties(dbProperties);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultReadOnly(Boolean defaultReadOnly) {
- getPoolProperties().setDefaultReadOnly(defaultReadOnly);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxAge(long maxAge) {
- getPoolProperties().setMaxAge(maxAge);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setName(String name) {
- getPoolProperties().setName(name);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setDataSource(Object ds) {
- getPoolProperties().setDataSource(ds);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object getDataSource() {
- return getPoolProperties().getDataSource();
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setDataSourceJNDI(String jndiDS) {
- getPoolProperties().setDataSourceJNDI(jndiDS);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getDataSourceJNDI() {
- return getPoolProperties().getDataSourceJNDI();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isAlternateUsernameAllowed() {
- return getPoolProperties().isAlternateUsernameAllowed();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setAlternateUsernameAllowed(boolean alternateUsernameAllowed) {
- getPoolProperties().setAlternateUsernameAllowed(alternateUsernameAllowed);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setCommitOnReturn(boolean commitOnReturn) {
- getPoolProperties().setCommitOnReturn(commitOnReturn);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getCommitOnReturn() {
- return getPoolProperties().getCommitOnReturn();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setRollbackOnReturn(boolean rollbackOnReturn) {
- getPoolProperties().setRollbackOnReturn(rollbackOnReturn);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getRollbackOnReturn() {
- return getPoolProperties().getRollbackOnReturn();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUseDisposableConnectionFacade(boolean useDisposableConnectionFacade) {
- getPoolProperties().setUseDisposableConnectionFacade(useDisposableConnectionFacade);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getUseDisposableConnectionFacade() {
- return getPoolProperties().getUseDisposableConnectionFacade();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setLogValidationErrors(boolean logValidationErrors) {
- getPoolProperties().setLogValidationErrors(logValidationErrors);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getLogValidationErrors() {
- return getPoolProperties().getLogValidationErrors();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getPropagateInterruptState() {
- return getPoolProperties().getPropagateInterruptState();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setPropagateInterruptState(boolean propagateInterruptState) {
- getPoolProperties().setPropagateInterruptState(propagateInterruptState);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isIgnoreExceptionOnPreLoad() {
- return getPoolProperties().isIgnoreExceptionOnPreLoad();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setIgnoreExceptionOnPreLoad(boolean ignoreExceptionOnPreLoad) {
- getPoolProperties().setIgnoreExceptionOnPreLoad(ignoreExceptionOnPreLoad);
- }
-
- public void purge() {
- try {
- createPool().purge();
- }catch (SQLException x) {
- log.error("Unable to purge pool.",x);
- }
- }
-
- public void purgeOnReturn() {
- try {
- createPool().purgeOnReturn();
- }catch (SQLException x) {
- log.error("Unable to purge pool.",x);
- }
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DisposableConnectionFacade.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DisposableConnectionFacade.java
deleted file mode 100644
index ed0e9db..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/DisposableConnectionFacade.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.sql.SQLException;
-
-/**
- * A DisposableConnectionFacade object is the top most interceptor that wraps an
- * object of type {@link PooledConnection}. The ProxyCutOffConnection intercepts
- * two methods:
- * <ul>
- * <li>{@link java.sql.Connection#close()} - returns the connection to the
- * pool then breaks the link between cutoff and the next interceptor.
- * May be called multiple times.</li>
- * <li>{@link java.lang.Object#toString()} - returns a custom string for this
- * object</li>
- * </ul>
- * By default method comparisons is done on a String reference level, unless the
- * {@link PoolConfiguration#setUseEquals(boolean)} has been called with a
- * <code>true</code> argument.
- */
-public class DisposableConnectionFacade extends JdbcInterceptor {
- protected DisposableConnectionFacade(JdbcInterceptor interceptor) {
- setUseEquals(interceptor.isUseEquals());
- setNext(interceptor);
- }
-
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- }
-
-
-
- @Override
- public int hashCode() {
- return System.identityHashCode(this);
- }
-
- @Override
- public boolean equals(Object obj) {
- return this==obj;
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- if (compare(EQUALS_VAL, method)) {
- return Boolean.valueOf(
- this.equals(Proxy.getInvocationHandler(args[0])));
- } else if (compare(HASHCODE_VAL, method)) {
- return Integer.valueOf(this.hashCode());
- } else if (getNext()==null) {
- if (compare(ISCLOSED_VAL, method)) {
- return Boolean.TRUE;
- }
- else if (compare(CLOSE_VAL, method)) {
- return null;
- }
- else if (compare(ISVALID_VAL, method)) {
- return Boolean.FALSE;
- }
- }
-
- try {
- return super.invoke(proxy, method, args);
- } catch (NullPointerException e) {
- if (getNext() == null) {
- if (compare(TOSTRING_VAL, method)) {
- return "DisposableConnectionFacade[null]";
- }
- throw new SQLException(
- "PooledConnection has already been closed.");
- }
-
- throw e;
- } finally {
- if (compare(CLOSE_VAL, method)) {
- setNext(null);
- }
- }
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java
deleted file mode 100644
index c02bfa3..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java
+++ /dev/null
@@ -1,579 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.NoSuchElementException;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- *
- * A simple implementation of a blocking queue with fairness waiting.
- * invocations to method poll(...) will get handed out in the order they were received.
- * Locking is fine grained, a shared lock is only used during the first level of contention, waiting is done in a
- * lock per thread basis so that order is guaranteed once the thread goes into a suspended monitor state.
- * <br>
- * Not all of the methods of the {@link java.util.concurrent.BlockingQueue} are implemented.
- *
- * @param <E> Type of element in the queue
- */
-
-public class FairBlockingQueue<E> implements BlockingQueue<E> {
-
- /**
- * This little sucker is used to reorder the way to do
- * {@link java.util.concurrent.locks.Lock#lock()},
- * {@link java.util.concurrent.locks.Lock#unlock()}
- * and
- * {@link java.util.concurrent.CountDownLatch#countDown()}
- * during the {@link #poll(long, TimeUnit)} operation.
- * On Linux, it performs much better if we count down while we hold the global
- * lock, on Solaris its the other way around.
- * Until we have tested other platforms we only check for Linux.
- */
- static final boolean isLinux = "Linux".equals(System.getProperty("os.name")) &&
- (!Boolean.getBoolean(FairBlockingQueue.class.getName()+".ignoreOS"));
-
- /**
- * Phase one entry lock in order to give out
- * per-thread-locks for the waiting phase we have
- * a phase one lock during the contention period.
- */
- final ReentrantLock lock = new ReentrantLock(false);
-
- /**
- * All the objects in the pool are stored in a simple linked list
- */
- final LinkedList<E> items;
-
- /**
- * All threads waiting for an object are stored in a linked list
- */
- final LinkedList<ExchangeCountDownLatch<E>> waiters;
-
- /**
- * Creates a new fair blocking queue.
- */
- public FairBlockingQueue() {
- items = new LinkedList<>();
- waiters = new LinkedList<>();
- }
-
- //------------------------------------------------------------------
- // USED BY CONPOOL IMPLEMENTATION
- //------------------------------------------------------------------
- /**
- * Will always return true, queue is unbounded.
- * {@inheritDoc}
- */
- @Override
- public boolean offer(E e) {
- //during the offer, we will grab the main lock
- final ReentrantLock lock = this.lock;
- lock.lock();
- ExchangeCountDownLatch<E> c = null;
- try {
- //check to see if threads are waiting for an object
- if (waiters.size() > 0) {
- //if threads are waiting grab the latch for that thread
- c = waiters.poll();
- //give the object to the thread instead of adding it to the pool
- c.setItem(e);
- if (isLinux) c.countDown();
- } else {
- //we always add first, so that the most recently used object will be given out
- items.addFirst(e);
- }
- } finally {
- lock.unlock();
- }
- //if we exchanged an object with another thread, wake it up.
- if (!isLinux && c!=null) c.countDown();
- //we have an unbounded queue, so always return true
- return true;
- }
-
- /**
- * Will never timeout, as it invokes the {@link #offer(Object)} method.
- * Once a lock has been acquired, the
- * {@inheritDoc}
- */
- @Override
- public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException {
- return offer(e);
- }
-
- /**
- * Fair retrieval of an object in the queue.
- * Objects are returned in the order the threads requested them.
- * {@inheritDoc}
- */
- @Override
- public E poll(long timeout, TimeUnit unit) throws InterruptedException {
- E result = null;
- final ReentrantLock lock = this.lock;
- //acquire the global lock until we know what to do
- lock.lock();
- try {
- //check to see if we have objects
- result = items.poll();
- if (result==null && timeout>0) {
- //the queue is empty we will wait for an object
- ExchangeCountDownLatch<E> c = new ExchangeCountDownLatch<>(1);
- //add to the bottom of the wait list
- waiters.addLast(c);
- //unlock the global lock
- lock.unlock();
- boolean didtimeout = true;
- InterruptedException interruptedException = null;
- try {
- //wait for the specified timeout
- didtimeout = !c.await(timeout, unit);
- } catch (InterruptedException ix) {
- interruptedException = ix;
- }
- if (didtimeout) {
- //if we timed out, or got interrupted
- // remove ourselves from the waitlist
- lock.lock();
- try {
- waiters.remove(c);
- } finally {
- lock.unlock();
- }
- }
- //return the item we received, can be null if we timed out
- result = c.getItem();
- if (null!=interruptedException) {
- //we got interrupted
- if ( null!=result) {
- //we got a result - clear the interrupt status
- //don't propagate cause we have removed a connection from pool
- Thread.interrupted();
- } else {
- throw interruptedException;
- }
- }
- } else {
- //we have an object, release
- lock.unlock();
- }
- } finally {
- if (lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- return result;
- }
-
- /**
- * Request an item from the queue asynchronously
- * @return - a future pending the result from the queue poll request
- */
- public Future<E> pollAsync() {
- Future<E> result = null;
- final ReentrantLock lock = this.lock;
- //grab the global lock
- lock.lock();
- try {
- //check to see if we have objects in the queue
- E item = items.poll();
- if (item==null) {
- //queue is empty, add ourselves as waiters
- ExchangeCountDownLatch<E> c = new ExchangeCountDownLatch<>(1);
- waiters.addLast(c);
- //return a future that will wait for the object
- result = new ItemFuture<>(c);
- } else {
- //return a future with the item
- result = new ItemFuture<>(item);
- }
- } finally {
- lock.unlock();
- }
- return result;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean remove(Object e) {
- final ReentrantLock lock = this.lock;
- lock.lock();
- try {
- return items.remove(e);
- } finally {
- lock.unlock();
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int size() {
- return items.size();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Iterator<E> iterator() {
- return new FairIterator();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public E poll() {
- final ReentrantLock lock = this.lock;
- lock.lock();
- try {
- return items.poll();
- } finally {
- lock.unlock();
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean contains(Object e) {
- final ReentrantLock lock = this.lock;
- lock.lock();
- try {
- return items.contains(e);
- } finally {
- lock.unlock();
- }
- }
-
-
- //------------------------------------------------------------------
- // NOT USED BY CONPOOL IMPLEMENTATION
- //------------------------------------------------------------------
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean add(E e) {
- return offer(e);
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public int drainTo(Collection<? super E> c, int maxElements) {
- throw new UnsupportedOperationException("int drainTo(Collection<? super E> c, int maxElements)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
-
- @Override
- public int drainTo(Collection<? super E> c) {
- return drainTo(c,Integer.MAX_VALUE);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void put(E e) throws InterruptedException {
- offer(e);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int remainingCapacity() {
- return Integer.MAX_VALUE - size();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public E take() throws InterruptedException {
- return this.poll(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean addAll(Collection<? extends E> c) {
- Iterator<? extends E> i = c.iterator();
- while (i.hasNext()) {
- E e = i.next();
- offer(e);
- }
- return true;
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public void clear() {
- throw new UnsupportedOperationException("void clear()");
-
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public boolean containsAll(Collection<?> c) {
- throw new UnsupportedOperationException("boolean containsAll(Collection<?> c)");
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isEmpty() {
- return size() == 0;
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public boolean removeAll(Collection<?> c) {
- throw new UnsupportedOperationException("boolean removeAll(Collection<?> c)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public boolean retainAll(Collection<?> c) {
- throw new UnsupportedOperationException("boolean retainAll(Collection<?> c)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public Object[] toArray() {
- throw new UnsupportedOperationException("Object[] toArray()");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public <T> T[] toArray(T[] a) {
- throw new UnsupportedOperationException("<T> T[] toArray(T[] a)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public E element() {
- throw new UnsupportedOperationException("E element()");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public E peek() {
- throw new UnsupportedOperationException("E peek()");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public E remove() {
- throw new UnsupportedOperationException("E remove()");
- }
-
-
-
- //------------------------------------------------------------------
- // Non cancellable Future used to check and see if a connection has been made available
- //------------------------------------------------------------------
- protected class ItemFuture<T> implements Future<T> {
- protected volatile T item = null;
- protected volatile ExchangeCountDownLatch<T> latch = null;
- protected volatile boolean canceled = false;
-
- public ItemFuture(T item) {
- this.item = item;
- }
-
- public ItemFuture(ExchangeCountDownLatch<T> latch) {
- this.latch = latch;
- }
-
- @Override
- public boolean cancel(boolean mayInterruptIfRunning) {
- return false; //don't allow cancel for now
- }
-
- @Override
- public T get() throws InterruptedException, ExecutionException {
- if (item!=null) {
- return item;
- } else if (latch!=null) {
- latch.await();
- return latch.getItem();
- } else {
- throw new ExecutionException("ItemFuture incorrectly instantiated. Bug in the code?", new Exception());
- }
- }
-
- @Override
- public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
- if (item!=null) {
- return item;
- } else if (latch!=null) {
- boolean timedout = !latch.await(timeout, unit);
- if (timedout) throw new TimeoutException();
- else return latch.getItem();
- } else {
- throw new ExecutionException("ItemFuture incorrectly instantiated. Bug in the code?", new Exception());
- }
- }
-
- @Override
- public boolean isCancelled() {
- return false;
- }
-
- @Override
- public boolean isDone() {
- return (item!=null || latch.getItem()!=null);
- }
-
- }
-
- //------------------------------------------------------------------
- // Count down latch that can be used to exchange information
- //------------------------------------------------------------------
- protected class ExchangeCountDownLatch<T> extends CountDownLatch {
- protected volatile T item;
- public ExchangeCountDownLatch(int i) {
- super(i);
- }
- public T getItem() {
- return item;
- }
- public void setItem(T item) {
- this.item = item;
- }
- }
-
- //------------------------------------------------------------------
- // Iterator safe from concurrent modification exceptions
- //------------------------------------------------------------------
- protected class FairIterator implements Iterator<E> {
- E[] elements = null;
- int index;
- E element = null;
-
- @SuppressWarnings("unchecked") // Can't create arrays of generic types
- public FairIterator() {
- final ReentrantLock lock = FairBlockingQueue.this.lock;
- lock.lock();
- try {
- elements = (E[]) new Object[FairBlockingQueue.this.items.size()];
- FairBlockingQueue.this.items.toArray(elements);
- index = 0;
- } finally {
- lock.unlock();
- }
- }
- @Override
- public boolean hasNext() {
- return index<elements.length;
- }
-
- @Override
- public E next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- element = elements[index++];
- return element;
- }
-
- @Override
- public void remove() {
- final ReentrantLock lock = FairBlockingQueue.this.lock;
- lock.lock();
- try {
- if (element!=null) {
- FairBlockingQueue.this.items.remove(element);
- }
- } finally {
- lock.unlock();
- }
- }
-
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java
deleted file mode 100644
index 46bc0b1..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/JdbcInterceptor.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.util.Map;
-
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorProperty;
-
-/**
- * Abstract class that is to be extended for implementations of interceptors.
- * Everytime an operation is called on the {@link java.sql.Connection} object the
- * {@link #invoke(Object, Method, Object[])} method on the interceptor will be called.
- * Interceptors are useful to change or improve behavior of the connection pool.<br>
- * Interceptors can receive a set of properties. Each sub class is responsible for parsing the properties during runtime when they
- * are needed or simply override the {@link #setProperties(Map)} method.
- * Properties arrive in a key-value pair of Strings as they were received through the configuration.
- * This method is called once per cached connection object when the object is first configured.
- *
- * @version 1.0
- */
-public abstract class JdbcInterceptor implements InvocationHandler {
- /**
- * {@link java.sql.Connection#close()} method name
- */
- public static final String CLOSE_VAL = "close";
- /**
- * {@link Object#toString()} method name
- */
- public static final String TOSTRING_VAL = "toString";
- /**
- * {@link java.sql.Connection#isClosed()} method name
- */
- public static final String ISCLOSED_VAL = "isClosed";
- /**
- * {@link javax.sql.PooledConnection#getConnection()} method name
- */
- public static final String GETCONNECTION_VAL = "getConnection";
- /**
- * {@link java.sql.Wrapper#unwrap(Class)} method name
- */
- public static final String UNWRAP_VAL = "unwrap";
- /**
- * {@link java.sql.Wrapper#isWrapperFor(Class)} method name
- */
- public static final String ISWRAPPERFOR_VAL = "isWrapperFor";
-
- /**
- * {@link java.sql.Connection#isValid(int)} method name
- */
- public static final String ISVALID_VAL = "isValid";
-
- /**
- * {@link java.lang.Object#equals(Object)}
- */
- public static final String EQUALS_VAL = "equals";
-
- /**
- * {@link java.lang.Object#hashCode()}
- */
- public static final String HASHCODE_VAL = "hashCode";
-
- /**
- * Properties for this interceptor.
- */
- protected Map<String,InterceptorProperty> properties = null;
-
- /**
- * The next interceptor in the chain
- */
- private volatile JdbcInterceptor next = null;
- /**
- * Property that decides how we do string comparison, default is to use
- * {@link String#equals(Object)}. If set to <code>false</code> then the
- * equality operator (==) is used.
- */
- private boolean useEquals = true;
-
- /**
- * Public constructor for instantiation through reflection
- */
- public JdbcInterceptor() {
- // NOOP
- }
-
- /**
- * Gets invoked each time an operation on {@link java.sql.Connection} is invoked.
- * {@inheritDoc}
- */
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if (getNext()!=null) return getNext().invoke(proxy,method,args);
- else throw new NullPointerException();
- }
-
- /**
- * Returns the next interceptor in the chain
- * @return the next interceptor in the chain
- */
- public JdbcInterceptor getNext() {
- return next;
- }
-
- /**
- * configures the next interceptor in the chain
- * @param next The next chain item
- */
- public void setNext(JdbcInterceptor next) {
- this.next = next;
- }
-
- /**
- * Performs a string comparison, using references unless the useEquals property is set to true.
- * @param name1 The first name
- * @param name2 The second name
- * @return true if name1 is equal to name2 based on {@link #useEquals}
- */
- public boolean compare(String name1, String name2) {
- if (isUseEquals()) {
- return name1.equals(name2);
- } else {
- return name1==name2;
- }
- }
-
- /**
- * Compares a method name (String) to a method (Method)
- * {@link #compare(String,String)}
- * Uses reference comparison unless the useEquals property is set to true
- * @param methodName The method name
- * @param method The method
- * @return <code>true</code> if the name matches
- */
- public boolean compare(String methodName, Method method) {
- return compare(methodName, method.getName());
- }
-
- /**
- * Gets called each time the connection is borrowed from the pool
- * This means that if an interceptor holds a reference to the connection
- * the interceptor can be reused for another connection.
- * <br>
- * This method may be called with null as both arguments when we are closing down the connection.
- * @param parent - the connection pool owning the connection
- * @param con - the pooled connection
- */
- public abstract void reset(ConnectionPool parent, PooledConnection con);
-
- /**
- * Called when {@link java.sql.Connection#close()} is called on the underlying connection.
- * This is to notify the interceptors, that the physical connection has been released.
- * Implementation of this method should be thought through with care, as no actions should trigger an exception.
- * @param parent - the connection pool that this connection belongs to
- * @param con - the pooled connection that holds this connection
- * @param finalizing - if this connection is finalizing. True means that the pooled connection will not reconnect the underlying connection
- */
- public void disconnected(ConnectionPool parent, PooledConnection con, boolean finalizing) {
- }
-
-
- /**
- * Returns the properties configured for this interceptor
- * @return the configured properties for this interceptor
- */
- public Map<String,InterceptorProperty> getProperties() {
- return properties;
- }
-
- /**
- * Called during the creation of an interceptor
- * The properties can be set during the configuration of an interceptor
- * Override this method to perform type casts between string values and object properties
- * @param properties The properties
- */
- public void setProperties(Map<String,InterceptorProperty> properties) {
- this.properties = properties;
- final String useEquals = "useEquals";
- InterceptorProperty p = properties.get(useEquals);
- if (p!=null) {
- setUseEquals(Boolean.parseBoolean(p.getValue()));
- }
- }
-
- /**
- * @return true if the compare method uses the Object.equals(Object) method
- * false if comparison is done on a reference level
- */
- public boolean isUseEquals() {
- return useEquals;
- }
-
- /**
- * Set to true if string comparisons (for the {@link #compare(String, Method)} and {@link #compare(String, String)} methods) should use the Object.equals(Object) method
- * The default is false
- * @param useEquals <code>true</code> if equals will be used for comparisons
- */
- public void setUseEquals(boolean useEquals) {
- this.useEquals = useEquals;
- }
-
- /**
- * This method is invoked by a connection pool when the pool is closed.
- * Interceptor classes can override this method if they keep static
- * variables or other tracking means around.
- * <b>This method is only invoked on a single instance of the interceptor, and not on every instance created.</b>
- * @param pool - the pool that is being closed.
- */
- public void poolClosed(ConnectionPool pool) {
- // NOOP
- }
-
- /**
- * This method is invoked by a connection pool when the pool is first started up, usually when the first connection is requested.
- * Interceptor classes can override this method if they keep static
- * variables or other tracking means around.
- * <b>This method is only invoked on a single instance of the interceptor, and not on every instance created.</b>
- * @param pool - the pool that is being closed.
- */
- public void poolStarted(ConnectionPool pool) {
- // NOOP
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/MultiLockFairBlockingQueue.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/MultiLockFairBlockingQueue.java
deleted file mode 100644
index a4b1f73..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/MultiLockFairBlockingQueue.java
+++ /dev/null
@@ -1,584 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.NoSuchElementException;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * <b>EXPERIMENTAL AND NOT YET COMPLETE!</b>
- *
- *
- * An implementation of a blocking queue with fairness waiting and lock dispersal to avoid contention.
- * invocations to method poll(...) will get handed out in the order they were received.
- * Locking is fine grained, a shared lock is only used during the first level of contention, waiting is done in a
- * lock per thread basis so that order is guaranteed once the thread goes into a suspended monitor state.
- * <br>
- * Not all of the methods of the {@link java.util.concurrent.BlockingQueue} are implemented.
- *
- * @param <E> Type of element in the queue
- */
-
-public class MultiLockFairBlockingQueue<E> implements BlockingQueue<E> {
-
- final int LOCK_COUNT = Runtime.getRuntime().availableProcessors();
-
- final AtomicInteger putQueue = new AtomicInteger(0);
- final AtomicInteger pollQueue = new AtomicInteger(0);
-
- public int getNextPut() {
- int idx = Math.abs(putQueue.incrementAndGet()) % LOCK_COUNT;
- return idx;
- }
-
- public int getNextPoll() {
- int idx = Math.abs(pollQueue.incrementAndGet()) % LOCK_COUNT;
- return idx;
- }
- /**
- * Phase one entry lock in order to give out
- * per-thread-locks for the waiting phase we have
- * a phase one lock during the contention period.
- */
- private final ReentrantLock[] locks = new ReentrantLock[LOCK_COUNT];
-
- /**
- * All the objects in the pool are stored in a simple linked list
- */
- final LinkedList<E>[] items;
-
- /**
- * All threads waiting for an object are stored in a linked list
- */
- final LinkedList<ExchangeCountDownLatch<E>>[] waiters;
-
- /**
- * Creates a new fair blocking queue.
- */
- @SuppressWarnings("unchecked") // Can create arrays of generic types
- public MultiLockFairBlockingQueue() {
- items = new LinkedList[LOCK_COUNT];
- waiters = new LinkedList[LOCK_COUNT];
- for (int i=0; i<LOCK_COUNT; i++) {
- items[i] = new LinkedList<>();
- waiters[i] = new LinkedList<>();
- locks[i] = new ReentrantLock(false);
- }
- }
-
- //------------------------------------------------------------------
- // USED BY CONPOOL IMPLEMENTATION
- //------------------------------------------------------------------
- /**
- * Will always return true, queue is unbounded.
- * {@inheritDoc}
- */
- @Override
- public boolean offer(E e) {
- int idx = getNextPut();
- //during the offer, we will grab the main lock
- final ReentrantLock lock = this.locks[idx];
- lock.lock();
- ExchangeCountDownLatch<E> c = null;
- try {
- //check to see if threads are waiting for an object
- if (waiters[idx].size() > 0) {
- //if threads are waiting grab the latch for that thread
- c = waiters[idx].poll();
- //give the object to the thread instead of adding it to the pool
- c.setItem(e);
- } else {
- //we always add first, so that the most recently used object will be given out
- items[idx].addFirst(e);
- }
- } finally {
- lock.unlock();
- }
- //if we exchanged an object with another thread, wake it up.
- if (c!=null) c.countDown();
- //we have an unbounded queue, so always return true
- return true;
- }
-
- /**
- * Will never timeout, as it invokes the {@link #offer(Object)} method.
- * Once a lock has been acquired, the
- * {@inheritDoc}
- */
- @Override
- public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException {
- return offer(e);
- }
-
- /**
- * Fair retrieval of an object in the queue.
- * Objects are returned in the order the threads requested them.
- * {@inheritDoc}
- */
- @Override
- public E poll(long timeout, TimeUnit unit) throws InterruptedException {
- int idx = getNextPoll();
- E result = null;
- final ReentrantLock lock = this.locks[idx];
- try {
- //acquire the global lock until we know what to do
- lock.lock();
- //check to see if we have objects
- result = items[idx].poll();
- if (result==null && timeout>0) {
- //the queue is empty we will wait for an object
- ExchangeCountDownLatch<E> c = new ExchangeCountDownLatch<>(1);
- //add to the bottom of the wait list
- waiters[idx].addLast(c);
- //unlock the global lock
- lock.unlock();
- //wait for the specified timeout
- if (!c.await(timeout, unit)) {
- //if we timed out, remove ourselves from the waitlist
- lock.lock();
- waiters[idx].remove(c);
- lock.unlock();
- }
- //return the item we received, can be null if we timed out
- result = c.getItem();
- } else {
- //we have an object, release
- lock.unlock();
- }
- } finally {
- if (lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- return result;
- }
-
- /**
- * Request an item from the queue asynchronously
- * @return - a future pending the result from the queue poll request
- */
- public Future<E> pollAsync() {
- int idx = getNextPoll();
- Future<E> result = null;
- final ReentrantLock lock = this.locks[idx];
- try {
- //grab the global lock
- lock.lock();
- //check to see if we have objects in the queue
- E item = items[idx].poll();
- if (item==null) {
- //queue is empty, add ourselves as waiters
- ExchangeCountDownLatch<E> c = new ExchangeCountDownLatch<>(1);
- waiters[idx].addLast(c);
- //return a future that will wait for the object
- result = new ItemFuture<>(c);
- } else {
- //return a future with the item
- result = new ItemFuture<>(item);
- }
- } finally {
- lock.unlock();
- }
- return result;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean remove(Object e) {
- for (int idx=0; idx<LOCK_COUNT; idx++) {
- final ReentrantLock lock = this.locks[idx];
- lock.lock();
- try {
- boolean result = items[idx].remove(e);
- if (result) return result;
- } finally {
- lock.unlock();
- }
- }
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int size() {
- int size = 0;
- for (int idx=0; idx<LOCK_COUNT; idx++) {
- size += items[idx].size();
- }
- return size;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Iterator<E> iterator() {
- return new FairIterator();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public E poll() {
- int idx = getNextPoll();
- final ReentrantLock lock = this.locks[idx];
- lock.lock();
- try {
- return items[idx].poll();
- } finally {
- lock.unlock();
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean contains(Object e) {
- for (int idx=0; idx<LOCK_COUNT; idx++) {
- boolean result = items[idx].contains(e);
- if (result) return result;
- }
- return false;
- }
-
-
- //------------------------------------------------------------------
- // NOT USED BY CONPOOL IMPLEMENTATION
- //------------------------------------------------------------------
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean add(E e) {
- return offer(e);
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public int drainTo(Collection<? super E> c, int maxElements) {
- throw new UnsupportedOperationException("int drainTo(Collection<? super E> c, int maxElements)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public int drainTo(Collection<? super E> c) {
- return drainTo(c,Integer.MAX_VALUE);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void put(E e) throws InterruptedException {
- offer(e);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int remainingCapacity() {
- return Integer.MAX_VALUE - size();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public E take() throws InterruptedException {
- return this.poll(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean addAll(Collection<? extends E> c) {
- Iterator<? extends E> i = c.iterator();
- while (i.hasNext()) {
- E e = i.next();
- offer(e);
- }
- return true;
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public void clear() {
- throw new UnsupportedOperationException("void clear()");
-
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public boolean containsAll(Collection<?> c) {
- throw new UnsupportedOperationException("boolean containsAll(Collection<?> c)");
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isEmpty() {
- return size() == 0;
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public boolean removeAll(Collection<?> c) {
- throw new UnsupportedOperationException("boolean removeAll(Collection<?> c)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public boolean retainAll(Collection<?> c) {
- throw new UnsupportedOperationException("boolean retainAll(Collection<?> c)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public Object[] toArray() {
- throw new UnsupportedOperationException("Object[] toArray()");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public <T> T[] toArray(T[] a) {
- throw new UnsupportedOperationException("<T> T[] toArray(T[] a)");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public E element() {
- throw new UnsupportedOperationException("E element()");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public E peek() {
- throw new UnsupportedOperationException("E peek()");
- }
-
- /**
- * {@inheritDoc}
- * @throws UnsupportedOperationException - this operation is not supported
- */
- @Override
- public E remove() {
- throw new UnsupportedOperationException("E remove()");
- }
-
-
-
- //------------------------------------------------------------------
- // Non cancellable Future used to check and see if a connection has been made available
- //------------------------------------------------------------------
- protected class ItemFuture<T> implements Future<T> {
- protected volatile T item = null;
- protected volatile ExchangeCountDownLatch<T> latch = null;
- protected volatile boolean canceled = false;
-
- public ItemFuture(T item) {
- this.item = item;
- }
-
- public ItemFuture(ExchangeCountDownLatch<T> latch) {
- this.latch = latch;
- }
-
- @Override
- public boolean cancel(boolean mayInterruptIfRunning) {
- return false; //don't allow cancel for now
- }
-
- @Override
- public T get() throws InterruptedException, ExecutionException {
- if (item!=null) {
- return item;
- } else if (latch!=null) {
- latch.await();
- return latch.getItem();
- } else {
- throw new ExecutionException("ItemFuture incorrectly instantiated. Bug in the code?", new Exception());
- }
- }
-
- @Override
- public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
- if (item!=null) {
- return item;
- } else if (latch!=null) {
- boolean timedout = !latch.await(timeout, unit);
- if (timedout) throw new TimeoutException();
- else return latch.getItem();
- } else {
- throw new ExecutionException("ItemFuture incorrectly instantiated. Bug in the code?", new Exception());
- }
- }
-
- @Override
- public boolean isCancelled() {
- return false;
- }
-
- @Override
- public boolean isDone() {
- return (item!=null || latch.getItem()!=null);
- }
-
- }
-
- //------------------------------------------------------------------
- // Count down latch that can be used to exchange information
- //------------------------------------------------------------------
- protected class ExchangeCountDownLatch<T> extends CountDownLatch {
- protected volatile T item;
- public ExchangeCountDownLatch(int i) {
- super(i);
- }
- public T getItem() {
- return item;
- }
- public void setItem(T item) {
- this.item = item;
- }
- }
-
- //------------------------------------------------------------------
- // Iterator safe from concurrent modification exceptions
- //------------------------------------------------------------------
- protected class FairIterator implements Iterator<E> {
- E[] elements = null;
- int index;
- E element = null;
-
- @SuppressWarnings("unchecked") // Can't create arrays of generic types
- public FairIterator() {
- ArrayList<E> list = new ArrayList<>(MultiLockFairBlockingQueue.this.size());
- for (int idx=0; idx<LOCK_COUNT; idx++) {
- final ReentrantLock lock = MultiLockFairBlockingQueue.this.locks[idx];
- lock.lock();
- try {
- elements = (E[]) new Object[MultiLockFairBlockingQueue.this.items[idx].size()];
- MultiLockFairBlockingQueue.this.items[idx].toArray(elements);
-
- } finally {
- lock.unlock();
- }
- }
- index = 0;
- elements = (E[]) new Object[list.size()];
- list.toArray(elements);
- }
- @Override
- public boolean hasNext() {
- return index<elements.length;
- }
-
- @Override
- public E next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- element = elements[index++];
- return element;
- }
-
- @Override
- public void remove() {
- for (int idx=0; idx<LOCK_COUNT; idx++) {
- final ReentrantLock lock = MultiLockFairBlockingQueue.this.locks[idx];
- lock.lock();
- try {
- boolean result = MultiLockFairBlockingQueue.this.items[idx].remove(elements[index]);
- if (result) break;
- } finally {
- lock.unlock();
- }
- }
-
- }
-
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
deleted file mode 100644
index 42cf11d..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
+++ /dev/null
@@ -1,917 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.util.Properties;
-
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorDefinition;
-
-/**
- * A list of properties that are configurable for a connection pool.
- * The {@link DataSource} object also implements this interface so that it can be easily configured through
- * an IoC container without having to specify a secondary object with a setter method.
- *
- */
-
-public interface PoolConfiguration {
-
- /**
- * JMX prefix for interceptors that register themselves with JMX
- */
- public static final String PKG_PREFIX = "org.apache.tomcat.jdbc.pool.interceptor.";
-
- /**
- * Connections that have been abandoned (timed out) wont get closed and reported up unless the number of connections in use are
- * above the percentage defined by abandonWhenPercentageFull.
- * The value should be between 0-100.
- * The default value is 0, which implies that connections are eligible for
- * closure as soon as removeAbandonedTimeout has been reached.
- * @param percentage a value between 0 and 100 to indicate when connections that have been abandoned/timed out are considered abandoned
- */
- public void setAbandonWhenPercentageFull(int percentage);
-
- /**
- * Connections that have been abandoned (timed out) wont get closed and reported up unless the number of connections in use are
- * above the percentage defined by abandonWhenPercentageFull.
- * The value should be between 0-100.
- * The default value is 0, which implies that connections are eligible for
- * closure as soon as removeAbandonedTimeout has been reached.
- * @return percentage - a value between 0 and 100 to indicate when connections that have been abandoned/timed out are considered abandoned
- */
- public int getAbandonWhenPercentageFull();
-
- /**
- * Returns <code>true</code> if a fair queue is being used by the connection pool
- * @return <code>true</code> if a fair waiting queue is being used
- */
- public boolean isFairQueue();
-
- /**
- * Set to true if you wish that calls to getConnection
- * should be treated fairly in a true FIFO fashion.
- * This uses the {@link FairBlockingQueue} implementation for the list of the idle connections.
- * The default value is true.
- * This flag is required when you want to use asynchronous connection retrieval.
- * @param fairQueue <code>true</code> to use a fair queue
- */
- public void setFairQueue(boolean fairQueue);
-
- /**
- * Property not used. Access is always allowed.
- * Access can be achieved by calling unwrap on the pooled connection. see {@link javax.sql.DataSource} interface
- * or call getConnection through reflection or cast the object as {@link javax.sql.PooledConnection}
- * @return <code>true</code>
- */
- public boolean isAccessToUnderlyingConnectionAllowed();
-
- /**
- * No-op
- * @param accessToUnderlyingConnectionAllowed parameter ignored
- */
- public void setAccessToUnderlyingConnectionAllowed(boolean accessToUnderlyingConnectionAllowed);
-
- /**
- * The connection properties that will be sent to the JDBC driver when establishing new connections.
- * Format of the string is [propertyName=property;] <br>
- * NOTE - The "user" and "password" properties will be passed explicitly, so they do not need to be included here.
- * The default value is null.
- * @return the connection properties
- */
- public String getConnectionProperties();
-
- /**
- * The properties that will be passed into {@link java.sql.Driver#connect(String, Properties)} method.
- * Username and password do not need to be stored here, they will be passed into the properties right before the connection is established.
- * @param connectionProperties properties - Format of the string is [propertyName=property;]*
- * Example: prop1=value1;prop2=value2
- */
- public void setConnectionProperties(String connectionProperties);
-
- /**
- * Returns the database properties that are passed into the {@link java.sql.Driver#connect(String, Properties)} method.
- * @return database properties that are passed into the {@link java.sql.Driver#connect(String, Properties)} method.
- */
- public Properties getDbProperties();
-
- /**
- * Overrides the database properties passed into the {@link java.sql.Driver#connect(String, Properties)} method.
- * @param dbProperties The database properties
- */
- public void setDbProperties(Properties dbProperties);
-
- /**
- * The default auto-commit state of connections created by this pool.
- * If not set (null), default is JDBC driver default (If set to null then the {@link java.sql.Connection#setAutoCommit(boolean)} method will not be called.)
- * @return the default auto commit setting, null is Driver default.
- */
- public Boolean isDefaultAutoCommit();
-
- /**
- * The default auto-commit state of connections created by this pool.
- * If not set (null), default is JDBC driver default (If set to null then the {@link java.sql.Connection#setAutoCommit(boolean)} method will not be called.)
- * @return the default auto commit setting, null is Driver default.
- */
- public Boolean getDefaultAutoCommit();
-
- /**
- * The default auto-commit state of connections created by this pool.
- * If not set (null), default is JDBC driver default (If set to null then the {@link java.sql.Connection#setAutoCommit(boolean)} method will not be called.)
- * @param defaultAutoCommit default auto commit setting, null is Driver default.
- */
- public void setDefaultAutoCommit(Boolean defaultAutoCommit);
-
- /**
- * If non null, during connection creation the method {@link java.sql.Connection#setCatalog(String)} will be called with the set value.
- * @return the default catalog, null if not set and accepting the driver default.
- */
- public String getDefaultCatalog();
-
- /**
- * If non null, during connection creation the method {@link java.sql.Connection#setCatalog(String)} will be called with the set value.
- * @param defaultCatalog null if not set and accepting the driver default.
- */
- public void setDefaultCatalog(String defaultCatalog);
-
- /**
- * If non null, during connection creation the method {@link java.sql.Connection#setReadOnly(boolean)} will be called with the set value.
- * @return null if not set and accepting the driver default otherwise the read only value
- */
- public Boolean isDefaultReadOnly();
-
- /**
- * If non null, during connection creation the method {@link java.sql.Connection#setReadOnly(boolean)} will be called with the set value.
- * @return null if not set and accepting the driver default otherwise the read only value
- */
- public Boolean getDefaultReadOnly();
-
- /**
- * If non null, during connection creation the method {@link java.sql.Connection#setReadOnly(boolean)} will be called with the set value.
- * @param defaultReadOnly null if not set and accepting the driver default.
- */
- public void setDefaultReadOnly(Boolean defaultReadOnly);
-
-
- /**
- * Returns the default transaction isolation level. If set to {@link DataSourceFactory#UNKNOWN_TRANSACTIONISOLATION} the method
- * {@link java.sql.Connection#setTransactionIsolation(int)} will not be called during connection creation.
- * @return driver transaction isolation level, or -1 {@link DataSourceFactory#UNKNOWN_TRANSACTIONISOLATION} if not set.
- */
- public int getDefaultTransactionIsolation();
-
- /**
- * If set to {@link DataSourceFactory#UNKNOWN_TRANSACTIONISOLATION} the method
- * {@link java.sql.Connection#setTransactionIsolation(int)} will not be called during connection creation. Otherwise the method
- * will be called with the isolation level set by this property.
- * @param defaultTransactionIsolation a value of {@link java.sql.Connection#TRANSACTION_NONE}, {@link java.sql.Connection#TRANSACTION_READ_COMMITTED},
- * {@link java.sql.Connection#TRANSACTION_READ_UNCOMMITTED}, {@link java.sql.Connection#TRANSACTION_REPEATABLE_READ},
- * {@link java.sql.Connection#TRANSACTION_SERIALIZABLE} or {@link DataSourceFactory#UNKNOWN_TRANSACTIONISOLATION}
- * The last value will not be set on the connection.
- */
- public void setDefaultTransactionIsolation(int defaultTransactionIsolation);
-
- /**
- * The fully qualified Java class name of the JDBC driver to be used. The driver has to be accessible from the same classloader as tomcat-jdbc.jar
- * @return fully qualified JDBC driver name.
- */
- public String getDriverClassName();
-
- /**
- * The fully qualified Java class name of the JDBC driver to be used. The driver has to be accessible from the same classloader as tomcat-jdbc.jar
- * @param driverClassName a fully qualified Java class name of a {@link java.sql.Driver} implementation.
- */
- public void setDriverClassName(String driverClassName);
-
- /**
- * Returns the number of connections that will be established when the connection pool is started.
- * Default value is 10
- * @return number of connections to be started when pool is started
- */
- public int getInitialSize();
-
- /**
- * Set the number of connections that will be established when the connection pool is started.
- * Default value is 10.
- * If this value exceeds {@link #setMaxActive(int)} it will automatically be lowered.
- * @param initialSize the number of connections to be established.
- *
- */
- public void setInitialSize(int initialSize);
-
- /**
- * boolean flag to set if stack traces should be logged for application code which abandoned a Connection.
- * Logging of abandoned Connections adds overhead for every Connection borrow because a stack trace has to be generated.
- * The default value is false.
- * @return true if the connection pool logs stack traces when connections are borrowed from the pool.
- */
- public boolean isLogAbandoned();
-
- /**
- * boolean flag to set if stack traces should be logged for application code which abandoned a Connection.
- * Logging of abandoned Connections adds overhead for every Connection borrow because a stack trace has to be generated.
- * The default value is false.
- * @param logAbandoned set to true if stack traces should be recorded when {@link DataSource#getConnection()} is called.
- */
- public void setLogAbandoned(boolean logAbandoned);
-
- /**
- * The maximum number of active connections that can be allocated from this pool at the same time. The default value is 100
- * @return the maximum number of connections used by this pool
- */
- public int getMaxActive();
-
- /**
- * The maximum number of active connections that can be allocated from this pool at the same time. The default value is 100
- * @param maxActive hard limit for number of managed connections by this pool
- */
- public void setMaxActive(int maxActive);
-
-
- /**
- * The maximum number of connections that should be kept in the idle pool if {@link #isPoolSweeperEnabled()} returns false.
- * If the If {@link #isPoolSweeperEnabled()} returns true, then the idle pool can grow up to {@link #getMaxActive}
- * and will be shrunk according to {@link #getMinEvictableIdleTimeMillis()} setting.
- * Default value is maxActive:100
- * @return the maximum number of idle connections.
- */
- public int getMaxIdle();
-
- /**
- * The maximum number of connections that should be kept in the idle pool if {@link #isPoolSweeperEnabled()} returns false.
- * If the If {@link #isPoolSweeperEnabled()} returns true, then the idle pool can grow up to {@link #getMaxActive}
- * and will be shrunk according to {@link #getMinEvictableIdleTimeMillis()} setting.
- * Default value is maxActive:100
- * @param maxIdle the maximum size of the idle pool
- */
- public void setMaxIdle(int maxIdle);
-
- /**
- * The maximum number of milliseconds that the pool will wait (when there are no available connections and the
- * {@link #getMaxActive} has been reached) for a connection to be returned
- * before throwing an exception. Default value is 30000 (30 seconds)
- * @return the number of milliseconds to wait for a connection to become available if the pool is maxed out.
- */
- public int getMaxWait();
-
- /**
- * The maximum number of milliseconds that the pool will wait (when there are no available connections and the
- * {@link #getMaxActive} has been reached) for a connection to be returned
- * before throwing an exception. Default value is 30000 (30 seconds)
- * @param maxWait the maximum number of milliseconds to wait.
- */
- public void setMaxWait(int maxWait);
-
- /**
- * The minimum amount of time an object must sit idle in the pool before it is eligible for eviction.
- * The default value is 60000 (60 seconds).
- * @return the minimum amount of idle time in milliseconds before a connection is considered idle and eligible for eviction.
- */
- public int getMinEvictableIdleTimeMillis();
-
- /**
- * The minimum amount of time an object must sit idle in the pool before it is eligible for eviction.
- * The default value is 60000 (60 seconds).
- * @param minEvictableIdleTimeMillis the number of milliseconds a connection must be idle to be eligible for eviction.
- */
- public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis);
-
- /**
- * The minimum number of established connections that should be kept in the pool at all times.
- * The connection pool can shrink below this number if validation queries fail and connections get closed.
- * Default value is derived from {@link #getInitialSize()} (also see {@link #setTestWhileIdle(boolean)}
- * The idle pool will not shrink below this value during an eviction run, hence the number of actual connections
- * can be between {@link #getMinIdle()} and somewhere between {@link #getMaxIdle()} and {@link #getMaxActive()}
- * @return the minimum number of idle or established connections
- */
- public int getMinIdle();
-
- /**
- * The minimum number of established connections that should be kept in the pool at all times.
- * The connection pool can shrink below this number if validation queries fail and connections get closed.
- * Default value is derived from {@link #getInitialSize()} (also see {@link #setTestWhileIdle(boolean)}
- * The idle pool will not shrink below this value during an eviction run, hence the number of actual connections
- * can be between {@link #getMinIdle()} and somewhere between {@link #getMaxIdle()} and {@link #getMaxActive()}
- *
- * @param minIdle the minimum number of idle or established connections
- */
- public void setMinIdle(int minIdle);
-
- /**
- * Returns the name of the connection pool. By default a JVM unique random name is assigned.
- * @return the name of the pool, should be unique in a JVM
- */
- public String getName();
-
- /**
- * Sets the name of the connection pool
- * @param name the name of the pool, should be unique in a runtime JVM
- */
- public void setName(String name);
-
- /**
- * Property not used
- * @return unknown value
- */
- public int getNumTestsPerEvictionRun();
-
- /**
- * Property not used
- * @param numTestsPerEvictionRun parameter ignored.
- */
- public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun);
-
- /**
- * Returns the password used when establishing connections to the database.
- * @return the password in string format
- */
- public String getPassword();
-
- /**
- * Sets the password to establish the connection with.
- * The password will be included as a database property with the name 'password'.
- * @param password The password
- * @see #getDbProperties()
- */
- public void setPassword(String password);
-
- /**
- * @see #getName()
- * @return the pool name
- */
- public String getPoolName();
-
- /**
- * Returns the username used to establish the connection with
- * @return the username used to establish the connection with
- */
- public String getUsername();
-
- /**
- * Sets the username used to establish the connection with
- * It will also be a property called 'user' in the database properties.
- * @param username The user name
- * @see #getDbProperties()
- */
- public void setUsername(String username);
-
-
- /**
- * boolean flag to remove abandoned connections if they exceed the removeAbandonedTimout.
- * If set to true a connection is considered abandoned and eligible for removal if it has
- * been in use longer than the {@link #getRemoveAbandonedTimeout()} and the condition for
- * {@link #getAbandonWhenPercentageFull()} is met.
- * Setting this to true can recover db connections from applications that fail to close a connection.
- * See also {@link #isLogAbandoned()} The default value is false.
- * @return true if abandoned connections can be closed and expelled out of the pool
- */
- public boolean isRemoveAbandoned();
-
- /**
- * boolean flag to remove abandoned connections if they exceed the removeAbandonedTimout.
- * If set to true a connection is considered abandoned and eligible for removal if it has
- * been in use longer than the {@link #getRemoveAbandonedTimeout()} and the condition for
- * {@link #getAbandonWhenPercentageFull()} is met.
- * Setting this to true can recover db connections from applications that fail to close a connection.
- * See also {@link #isLogAbandoned()} The default value is false.
- * @param removeAbandoned set to true if abandoned connections can be closed and expelled out of the pool
- */
- public void setRemoveAbandoned(boolean removeAbandoned);
-
- /**
- * The time in seconds before a connection can be considered abandoned.
- * The timer can be reset upon queries using an interceptor.
- * @param removeAbandonedTimeout the time in seconds before a used connection can be considered abandoned
- * @see org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer
- */
- public void setRemoveAbandonedTimeout(int removeAbandonedTimeout);
-
- /**
- * The time in seconds before a connection can be considered abandoned.
- * The timer can be reset upon queries using an interceptor.
- * @see org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer
- * @return the time in seconds before a used connection can be considered abandoned
- */
- public int getRemoveAbandonedTimeout();
-
- /**
- * The indication of whether objects will be validated before being borrowed from the pool.
- * If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another.
- * NOTE - for a true value to have any effect, the validationQuery parameter must be set to a non-null string.
- * Default value is false
- * In order to have a more efficient validation, see {@link #setValidationInterval(long)}
- * @return true if the connection is to be validated upon borrowing a connection from the pool
- * @see #getValidationInterval()
- */
- public boolean isTestOnBorrow();
-
- /**
- * The indication of whether objects will be validated before being borrowed from the pool.
- * If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another.
- * NOTE - for a true value to have any effect, the validationQuery parameter must be set to a non-null string.
- * Default value is false
- * In order to have a more efficient validation, see {@link #setValidationInterval(long)}
- * @param testOnBorrow set to true if validation should take place before a connection is handed out to the application
- * @see #getValidationInterval()
- */
- public void setTestOnBorrow(boolean testOnBorrow);
-
- /**
- * The indication of whether objects will be validated after being returned to the pool.
- * If the object fails to validate, it will be dropped from the pool.
- * NOTE - for a true value to have any effect, the validationQuery parameter must be set to a non-null string.
- * Default value is false
- * In order to have a more efficient validation, see {@link #setValidationInterval(long)}
- * @return true if validation should take place after a connection is returned to the pool
- * @see #getValidationInterval()
- */
- public boolean isTestOnReturn();
-
- /**
- * The indication of whether objects will be validated after being returned to the pool.
- * If the object fails to validate, it will be dropped from the pool.
- * NOTE - for a true value to have any effect, the validationQuery parameter must be set to a non-null string.
- * Default value is false
- * In order to have a more efficient validation, see {@link #setValidationInterval(long)}
- * @param testOnReturn true if validation should take place after a connection is returned to the pool
- * @see #getValidationInterval()
- */
- public void setTestOnReturn(boolean testOnReturn);
-
-
- /**
- * Set to true if query validation should take place while the connection is idle.
- * @return true if validation should take place during idle checks
- * @see #setTimeBetweenEvictionRunsMillis(int)
- */
- public boolean isTestWhileIdle();
-
- /**
- * Set to true if query validation should take place while the connection is idle.
- * @param testWhileIdle true if validation should take place during idle checks
- * @see #setTimeBetweenEvictionRunsMillis(int)
- */
- public void setTestWhileIdle(boolean testWhileIdle);
-
- /**
- * The number of milliseconds to sleep between runs of the idle connection validation, abandoned cleaner
- * and idle pool resizing. This value should not be set under 1 second.
- * It dictates how often we check for idle, abandoned connections, and how often we validate idle connection and resize the idle pool.
- * The default value is 5000 (5 seconds)
- * @return the sleep time in between validations in milliseconds
- */
- public int getTimeBetweenEvictionRunsMillis();
-
- /**
- * The number of milliseconds to sleep between runs of the idle connection validation, abandoned cleaner
- * and idle pool resizing. This value should not be set under 1 second.
- * It dictates how often we check for idle, abandoned connections, and how often we validate idle connection and resize the idle pool.
- * The default value is 5000 (5 seconds)
- * @param timeBetweenEvictionRunsMillis the sleep time in between validations in milliseconds
- */
- public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis);
-
- /**
- * The URL used to connect to the database
- * @return the configured URL for this connection pool
- * @see java.sql.Driver#connect(String, Properties)
- */
- public String getUrl();
-
- /**
- * Sets the URL used to connect to the database
- * @param url the configured URL for this connection pool
- * @see java.sql.Driver#connect(String, Properties)
- */
- public void setUrl(String url);
-
- /**
- * The SQL query that will be used to validate connections from this
- * pool before returning them to the caller or pool.
- * If specified, this query does not have to return any data,
- * it just can't throw a SQLException.
- * The default value is null.
- * Example values are SELECT 1(mysql),
- * select 1 from dual(oracle),
- * SELECT 1(MS Sql Server)
- * @return the query used for validation or null if no validation is performed
- */
- public String getValidationQuery();
-
- /**
- * The SQL query that will be used to validate connections from this
- * pool before returning them to the caller or pool.
- * If specified, this query does not have to return any data,
- * it just can't throw a SQLException.
- * The default value is null.
- * Example values are SELECT 1(mysql),
- * select 1 from dual(oracle),
- * SELECT 1(MS Sql Server)
- * @param validationQuery the query used for validation or null if no validation is performed
- */
- public void setValidationQuery(String validationQuery);
-
- /**
- * The timeout in seconds before a connection validation queries fail.
- * A value less than or equal to zero will disable this feature. Defaults to -1.
- * @return the timeout value in seconds
- */
- public int getValidationQueryTimeout();
-
- /**
- * The timeout in seconds before a connection validation queries fail.
- * A value less than or equal to zero will disable this feature. Defaults to -1.
- * @param validationQueryTimeout The timeout value
- */
- public void setValidationQueryTimeout(int validationQueryTimeout);
-
- /**
- * Return the name of the optional validator class - may be null.
- *
- * @return the name of the optional validator class - may be null
- */
- public String getValidatorClassName();
-
- /**
- * Set the name for an optional validator class which will be used in place of test queries. If set to
- * null, standard validation will be used.
- *
- * @param className the name of the optional validator class
- */
- public void setValidatorClassName(String className);
-
- /**
- * @return the optional validator object - may be null
- */
- public Validator getValidator();
-
- /**
- * Sets the validator object
- * If this is a non null object, it will be used as a validator instead of the validationQuery
- * If this is null, remove the usage of the validator.
- * @param validator The validator object
- */
- public void setValidator(Validator validator);
-
- /**
- * avoid excess validation, only run validation at most at this frequency - time in milliseconds.
- * If a connection is due for validation, but has been validated previously
- * within this interval, it will not be validated again.
- * The default value is 3000 (3 seconds).
- * @return the validation interval in milliseconds
- */
- public long getValidationInterval();
-
- /**
- * avoid excess validation, only run validation at most at this frequency - time in milliseconds.
- * If a connection is due for validation, but has been validated previously
- * within this interval, it will not be validated again.
- * The default value is 3000 (3 seconds).
- * @param validationInterval the validation interval in milliseconds
- */
- public void setValidationInterval(long validationInterval);
-
- /**
- * A custom query to be run when a connection is first created. The default value is null.
- * This query only runs once per connection, and that is when a new connection is established to the database.
- * If this value is non null, it will replace the validation query during connection creation.
- * @return the init SQL used to run against the DB or null if not set
- */
- public String getInitSQL();
-
- /**
- * A custom query to be run when a connection is first created. The default value is null.
- * This query only runs once per connection, and that is when a new connection is established to the database.
- * If this value is non null, it will replace the validation query during connection creation.
- * @param initSQL the init SQL used to run against the DB or null if no query should be executed
- */
- public void setInitSQL(String initSQL);
-
- /**
- * Returns true if we should run the validation query when connecting to the database for the first time on a connection.
- * Normally this is always set to false, unless one wants to use the validationQuery as an init query.
- * @return true if we should run the validation query upon connect
- */
- public boolean isTestOnConnect();
-
- /**
- * Set to true if we should run the validation query when connecting to the database for the first time on a connection.
- * Normally this is always set to false, unless one wants to use the validationQuery as an init query.
- * Setting an {@link #setInitSQL(String)} will override this setting, as the init SQL will be used instead of the validation query
- * @param testOnConnect set to true if we should run the validation query upon connect
- */
- public void setTestOnConnect(boolean testOnConnect);
-
- /**
- * A semicolon separated list of classnames extending {@link org.apache.tomcat.jdbc.pool.JdbcInterceptor} class.
- * These interceptors will be inserted as an interceptor into the chain of operations on a java.sql.Connection object.
- * Example interceptors are {@link org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer StatementFinalizer} to close all
- * used statements during the session.
- * {@link org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer ResetAbandonedTimer} resets the timer upon every operation
- * on the connection or a statement.
- * {@link org.apache.tomcat.jdbc.pool.interceptor.ConnectionState ConnectionState} caches the auto commit, read only and catalog settings to avoid round trips to the DB.
- * The default value is null.
- * @return the interceptors that are used for connections.
- * Example format: 'ConnectionState(useEquals=true,fast=yes);ResetAbandonedTimer'
- */
- public String getJdbcInterceptors();
-
- /**
- * A semicolon separated list of classnames extending {@link org.apache.tomcat.jdbc.pool.JdbcInterceptor} class.
- * These interceptors will be inserted as an interceptor into the chain of operations on a java.sql.Connection object.
- * Example interceptors are {@link org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer StatementFinalizer} to close all
- * used statements during the session.
- * {@link org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer ResetAbandonedTimer} resets the timer upon every operation
- * on the connection or a statement.
- * {@link org.apache.tomcat.jdbc.pool.interceptor.ConnectionState ConnectionState} caches the auto commit, read only and catalog settings to avoid round trips to the DB.
- * The default value is null.
- * @param jdbcInterceptors the interceptors that are used for connections.
- * Example format: 'ConnectionState(useEquals=true,fast=yes);ResetAbandonedTimer'
- */
- public void setJdbcInterceptors(String jdbcInterceptors);
-
- /**
- * Returns the {@link #getJdbcInterceptors()} as an array of objects with properties and the classes.
- * @return an array of interceptors that have been configured
- */
- public InterceptorDefinition[] getJdbcInterceptorsAsArray();
-
-
- /**
- * If set to true, the connection pool creates a {@link org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean} object
- * that can be registered with JMX to receive notifications and state about the pool.
- * The ConnectionPool object doesn't register itself, as there is no way to keep a static non changing ObjectName across JVM restarts.
- * @return true if the mbean object will be created upon startup.
- */
- public boolean isJmxEnabled();
-
- /**
- * If set to true, the connection pool creates a {@link org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean} object
- * that can be registered with JMX to receive notifications and state about the pool.
- * The ConnectionPool object doesn't register itself, as there is no way to keep a static non changing ObjectName across JVM restarts.
- * @param jmxEnabled set to to if the mbean object should be created upon startup.
- */
- public void setJmxEnabled(boolean jmxEnabled);
-
- /**
- * Returns true if the pool sweeper is enabled for the connection pool.
- * The pool sweeper is enabled if any settings that require async intervention in the pool are turned on
- * <code>
- boolean result = getTimeBetweenEvictionRunsMillis()&gt;0;
- result = result &amp;&amp; (isRemoveAbandoned() &amp;&amp; getRemoveAbandonedTimeout()&gt;0);
- result = result || (isTestWhileIdle() &amp;&amp; getValidationQuery()!=null);
- return result;
- </code>
- *
- * @return true if a background thread is or will be enabled for this pool
- */
- public boolean isPoolSweeperEnabled();
-
- /**
- * Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> instead of
- * <code>==</code> when comparing method names.
- * This property does not apply to added interceptors as those are configured individually.
- * The default value is <code>false</code>.
- * @return true if pool uses {@link String#equals(Object)} instead of == when comparing method names on {@link java.sql.Connection} methods
- */
- public boolean isUseEquals();
-
- /**
- * Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> instead of
- * <code>==</code> when comparing method names.
- * This property does not apply to added interceptors as those are configured individually.
- * The default value is <code>false</code>.
- * @param useEquals set to true if the pool should use {@link String#equals(Object)} instead of ==
- * when comparing method names on {@link java.sql.Connection} methods
- */
- public void setUseEquals(boolean useEquals);
-
- /**
- * Time in milliseconds to keep this connection alive even when used.
- * When a connection is returned to the pool, the pool will check to see if the
- * ((now - time-when-connected) &gt; maxAge) has been reached, and if so,
- * it closes the connection rather than returning it to the pool.
- * The default value is 0, which implies that connections will be left open and no
- * age check will be done upon returning the connection to the pool.
- * This is a useful setting for database sessions that leak memory as it ensures that the session
- * will have a finite life span.
- * @return the time in milliseconds a connection will be open for when used
- */
- public long getMaxAge();
-
- /**
- * Time in milliseconds to keep this connection alive even when used.
- * When a connection is returned to the pool, the pool will check to see if the
- * ((now - time-when-connected) &gt; maxAge) has been reached, and if so,
- * it closes the connection rather than returning it to the pool.
- * The default value is 0, which implies that connections will be left open and no
- * age check will be done upon returning the connection to the pool.
- * This is a useful setting for database sessions that leak memory as it ensures that the session
- * will have a finite life span.
- * @param maxAge the time in milliseconds a connection will be open for when used
- */
- public void setMaxAge(long maxAge);
-
- /**
- * Return true if a lock should be used when operations are performed on the connection object.
- * Should be set to false unless you plan to have a background thread of your own doing idle and abandon checking
- * such as JMX clients. If the pool sweeper is enabled, then the lock will automatically be used regardless of this setting.
- * @return true if a lock is used.
- */
- public boolean getUseLock();
-
- /**
- * Set to true if a lock should be used when operations are performed on the connection object.
- * Should be set to false unless you plan to have a background thread of your own doing idle and abandon checking
- * such as JMX clients. If the pool sweeper is enabled, then the lock will automatically be used regardless of this setting.
- * @param useLock set to true if a lock should be used on connection operations
- */
- public void setUseLock(boolean useLock);
-
- /**
- * Similar to {@link #setRemoveAbandonedTimeout(int)} but instead of treating the connection
- * as abandoned, and potentially closing the connection, this simply logs the warning if
- * {@link #isLogAbandoned()} returns true. If this value is equal or less than 0, no suspect
- * checking will be performed. Suspect checking only takes place if the timeout value is larger than 0 and
- * the connection was not abandoned or if abandon check is disabled. If a connection is suspect a WARN message gets
- * logged and a JMX notification gets sent once.
- * @param seconds - the amount of time in seconds that has to pass before a connection is marked suspect.
- */
- public void setSuspectTimeout(int seconds);
-
- /**
- * Returns the time in seconds to pass before a connection is marked an abandoned suspect.
- * Any value lesser than or equal to 0 means the check is disabled.
- * @return Returns the time in seconds to pass before a connection is marked an abandoned suspect.
- */
- public int getSuspectTimeout();
-
- /**
- * Injects a datasource that will be used to retrieve/create connections.
- * If a data source is set, the {@link PoolConfiguration#getUrl()} and {@link PoolConfiguration#getDriverClassName()} methods are ignored
- * and not used by the pool. If the {@link PoolConfiguration#getUsername()} and {@link PoolConfiguration#getPassword()}
- * values are set, the method {@link javax.sql.DataSource#getConnection(String, String)} method will be called instead of the
- * {@link javax.sql.DataSource#getConnection()} method.
- * If the data source implements {@link javax.sql.XADataSource} the methods
- * {@link javax.sql.XADataSource#getXAConnection()} and {@link javax.sql.XADataSource#getXAConnection(String,String)}
- * will be invoked.
- * @param ds the {@link javax.sql.DataSource} to be used for creating connections to be pooled.
- */
- public void setDataSource(Object ds);
-
- /**
- * Returns a datasource, if one exists that is being used to create connections.
- * This method will return null if the pool is using a {@link java.sql.Driver}
- * @return the {@link javax.sql.DataSource} to be used for creating connections to be pooled or null if a Driver is used.
- */
- public Object getDataSource();
-
- /**
- * Configure the connection pool to use a DataSource according to {@link PoolConfiguration#setDataSource(Object)}
- * But instead of injecting the object, specify the JNDI location.
- * After a successful JNDI look, the {@link PoolConfiguration#getDataSource()} will not return null.
- * @param jndiDS -the JNDI string @TODO specify the rules here.
- */
- public void setDataSourceJNDI(String jndiDS);
-
- /**
- * Returns the JNDI string configured for data source usage.
- * @return the JNDI string or null if not set
- */
- public String getDataSourceJNDI();
-
- /**
- * Returns true if the call {@link DataSource#getConnection(String, String) getConnection(username,password)} is
- * allowed. This is used for when the pool is used by an application accessing multiple schemas.
- * There is a performance impact turning this option on.
- * @return true if {@link DataSource#getConnection(String, String) getConnection(username,password)} is honored, false if it is ignored.
- */
- public boolean isAlternateUsernameAllowed();
-
- /**
- * Set to true if the call {@link DataSource#getConnection(String, String) getConnection(username,password)} is
- * allowed and honored.. This is used for when the pool is used by an application accessing multiple schemas.
- * There is a performance impact turning this option on, even when not used due to username checks.
- * @param alternateUsernameAllowed - set true if {@link DataSource#getConnection(String, String) getConnection(username,password)} is honored,
- * false if it is to be ignored.
- */
- public void setAlternateUsernameAllowed(boolean alternateUsernameAllowed);
- /**
- * Set to true if you want the connection pool to commit any pending transaction when a connection is returned.
- * The default value is false, as this could result in committing data.
- * This parameter is only looked at if the {@link #getDefaultAutoCommit()} returns false
- * @param commitOnReturn set to true if the pool should call {@link java.sql.Connection#commit()} when a connection is returned to the pool.
- * Default is false
- */
- public void setCommitOnReturn(boolean commitOnReturn);
-
- /**
- * @see PoolConfiguration#setCommitOnReturn(boolean)
- * @return <code>true</code> if the pool should commit when a connection is returned to it
- */
- public boolean getCommitOnReturn();
-
- /**
- * Set to true if you want the connection pool to rollback any pending transaction when a connection is returned.
- * The default value is false, as this could result in committing data.
- * This parameter is only looked at if the {@link #getDefaultAutoCommit()} returns false
- * @param rollbackOnReturn set to true if the pool should call {@link java.sql.Connection#rollback()} when a connection is returned to the pool.
- * Default is false
- */
- public void setRollbackOnReturn(boolean rollbackOnReturn);
-
- /**
- * @see PoolConfiguration#setRollbackOnReturn(boolean)
- * @return <code>true</code> if the pool should rollback when a connection is returned to it
- */
- public boolean getRollbackOnReturn();
-
- /**
- * If set to <code>true</code>, the connection will be wrapped with facade that will disallow the connection to be used after
- * {@link java.sql.Connection#close()} is called. If set to <code>true</code>, after {@link java.sql.Connection#close()} all calls except
- * {@link java.sql.Connection#close()} and {@link java.sql.Connection#isClosed()} will throw an exception.
- * @param useDisposableConnectionFacade <code>true</code> to use a facade
- */
- public void setUseDisposableConnectionFacade(boolean useDisposableConnectionFacade);
- /**
- * Returns <code>true</code> if this connection pool is configured to use a connection facade to prevent re-use of connection after
- * {@link java.sql.Connection#close()} has been invoked
- * @return <code>true</code> if {@link java.sql.Connection#close()} has been invoked.
- */
- public boolean getUseDisposableConnectionFacade();
-
- /**
- * Set to true if you wish that errors from validation should be logged as error messages.
- * @param logValidationErrors set to true to log validation errors
- */
- public void setLogValidationErrors(boolean logValidationErrors);
-
- /**
- * Returns true if errors that happen during validation will be logged
- * @return true if errors that happen during validation will be logged
- */
- public boolean getLogValidationErrors();
-
- /**
- * Returns true if the pool is configured to propagate interrupt state of a thread.
- * A thread waiting for a connection, can have its wait interrupted, and by default
- * will clear the interrupt flag and throw a {@link PoolExhaustedException}
- * @return true if the pool is configured to propagate and not clear the thread interrupt state
- */
- public boolean getPropagateInterruptState();
-
- /**
- * Configure the pool to propagate interrupt state for interrupted threads waiting for a connection
- * A thread waiting for a connection, can have its wait interrupted, and by default
- * will clear the interrupt flag and throw a {@link PoolExhaustedException}
- * If set to true, this behavior will change, while the {@link PoolExhaustedException} is still thrown, the threads interrupted state is still set.
- * @param propagateInterruptState - set to true to not clear, but propagate, a threads interrupted state.
- */
- public void setPropagateInterruptState(boolean propagateInterruptState);
-
- /**
- * Set to true if you want to ignore error of connection creation while initializing the pool.
- * Set to false if you want to fail the initialization of the pool by throwing exception.
- * @param ignoreExceptionOnPreLoad set to true if you want to ignore error of connection creation while initializing the pool.
- */
- public void setIgnoreExceptionOnPreLoad(boolean ignoreExceptionOnPreLoad);
-
- /**
- * @return <code>true</code> to ignore exceptions
- * @see PoolConfiguration#setIgnoreExceptionOnPreLoad(boolean)
- */
- public boolean isIgnoreExceptionOnPreLoad();
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolExhaustedException.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolExhaustedException.java
deleted file mode 100644
index 9352581..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolExhaustedException.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.sql.SQLException;
-
-public class PoolExhaustedException extends SQLException {
-
- private static final long serialVersionUID = 3501536931777262475L;
-
- public PoolExhaustedException() {
- }
-
- public PoolExhaustedException(String reason) {
- super(reason);
- }
-
- public PoolExhaustedException(Throwable cause) {
- super(cause);
- }
-
- public PoolExhaustedException(String reason, String SQLState) {
- super(reason, SQLState);
- }
-
- public PoolExhaustedException(String reason, Throwable cause) {
- super(reason, cause);
- }
-
- public PoolExhaustedException(String reason, String SQLState, int vendorCode) {
- super(reason, SQLState, vendorCode);
- }
-
- public PoolExhaustedException(String reason, String sqlState, Throwable cause) {
- super(reason, sqlState, cause);
- }
-
- public PoolExhaustedException(String reason, String sqlState, int vendorCode, Throwable cause) {
- super(reason, sqlState, vendorCode, cause);
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
deleted file mode 100644
index 9d64c26..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
+++ /dev/null
@@ -1,1332 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicInteger;
-
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-public class PoolProperties implements PoolConfiguration, Cloneable, Serializable {
-
- private static final long serialVersionUID = -8519283440854213745L;
- private static final Log log = LogFactory.getLog(PoolProperties.class);
-
- public static final int DEFAULT_MAX_ACTIVE = 100;
-
- protected static final AtomicInteger poolCounter = new AtomicInteger(0);
- private volatile Properties dbProperties = new Properties();
- private volatile String url = null;
- private volatile String driverClassName = null;
- private volatile Boolean defaultAutoCommit = null;
- private volatile Boolean defaultReadOnly = null;
- private volatile int defaultTransactionIsolation = DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION;
- private volatile String defaultCatalog = null;
- private volatile String connectionProperties;
- private volatile int initialSize = 10;
- private volatile int maxActive = DEFAULT_MAX_ACTIVE;
- private volatile int maxIdle = maxActive;
- private volatile int minIdle = initialSize;
- private volatile int maxWait = 30000;
- private volatile String validationQuery;
- private volatile int validationQueryTimeout = -1;
- private volatile String validatorClassName;
- private volatile Validator validator;
- private volatile boolean testOnBorrow = false;
- private volatile boolean testOnReturn = false;
- private volatile boolean testWhileIdle = false;
- private volatile int timeBetweenEvictionRunsMillis = 5000;
- private volatile int numTestsPerEvictionRun;
- private volatile int minEvictableIdleTimeMillis = 60000;
- private volatile boolean accessToUnderlyingConnectionAllowed = true;
- private volatile boolean removeAbandoned = false;
- private volatile int removeAbandonedTimeout = 60;
- private volatile boolean logAbandoned = false;
- private volatile String name = "Tomcat Connection Pool["+(poolCounter.addAndGet(1))+"-"+System.identityHashCode(PoolProperties.class)+"]";
- private volatile String password;
- private volatile String username;
- private volatile long validationInterval = 3000;
- private volatile boolean jmxEnabled = true;
- private volatile String initSQL;
- private volatile boolean testOnConnect =false;
- private volatile String jdbcInterceptors=null;
- private volatile boolean fairQueue = true;
- private volatile boolean useEquals = true;
- private volatile int abandonWhenPercentageFull = 0;
- private volatile long maxAge = 0;
- private volatile boolean useLock = false;
- private volatile InterceptorDefinition[] interceptors = null;
- private volatile int suspectTimeout = 0;
- private volatile Object dataSource = null;
- private volatile String dataSourceJNDI = null;
- private volatile boolean alternateUsernameAllowed = false;
- private volatile boolean commitOnReturn = false;
- private volatile boolean rollbackOnReturn = false;
- private volatile boolean useDisposableConnectionFacade = true;
- private volatile boolean logValidationErrors = false;
- private volatile boolean propagateInterruptState = false;
- private volatile boolean ignoreExceptionOnPreLoad = false;
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setAbandonWhenPercentageFull(int percentage) {
- if (percentage<0) abandonWhenPercentageFull = 0;
- else if (percentage>100) abandonWhenPercentageFull = 100;
- else abandonWhenPercentageFull = percentage;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int getAbandonWhenPercentageFull() {
- return abandonWhenPercentageFull;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isFairQueue() {
- return fairQueue;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setFairQueue(boolean fairQueue) {
- this.fairQueue = fairQueue;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isAccessToUnderlyingConnectionAllowed() {
- return accessToUnderlyingConnectionAllowed;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getConnectionProperties() {
- return connectionProperties;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Properties getDbProperties() {
- return dbProperties;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean isDefaultAutoCommit() {
- return defaultAutoCommit;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getDefaultCatalog() {
- return defaultCatalog;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean isDefaultReadOnly() {
- return defaultReadOnly;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getDefaultTransactionIsolation() {
- return defaultTransactionIsolation;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getDriverClassName() {
- return driverClassName;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getInitialSize() {
- return initialSize;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isLogAbandoned() {
- return logAbandoned;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMaxActive() {
- return maxActive;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMaxIdle() {
- return maxIdle;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMaxWait() {
- return maxWait;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMinEvictableIdleTimeMillis() {
- return minEvictableIdleTimeMillis;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getMinIdle() {
- return minIdle;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getName() {
- return name;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getNumTestsPerEvictionRun() {
- return numTestsPerEvictionRun;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getPassword() {
- return password;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getPoolName() {
- return getName();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isRemoveAbandoned() {
- return removeAbandoned;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getRemoveAbandonedTimeout() {
- return removeAbandonedTimeout;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestOnBorrow() {
- return testOnBorrow;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestOnReturn() {
- return testOnReturn;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestWhileIdle() {
- return testWhileIdle;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getTimeBetweenEvictionRunsMillis() {
- return timeBetweenEvictionRunsMillis;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getUrl() {
- return url;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getUsername() {
- return username;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getValidationQuery() {
- return validationQuery;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int getValidationQueryTimeout() {
- return validationQueryTimeout;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setValidationQueryTimeout(int validationQueryTimeout) {
- this.validationQueryTimeout = validationQueryTimeout;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getValidatorClassName() {
- return validatorClassName;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Validator getValidator() {
- return validator;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setValidator(Validator validator) {
- this.validator = validator;
- if (validator!=null) {
- this.validatorClassName = validator.getClass().getName();
- } else {
- this.validatorClassName = null;
- }
- }
-
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public long getValidationInterval() {
- return validationInterval;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getInitSQL() {
- return initSQL;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isTestOnConnect() {
- return testOnConnect;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getJdbcInterceptors() {
- return jdbcInterceptors;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public InterceptorDefinition[] getJdbcInterceptorsAsArray() {
- if (interceptors == null) {
- if (jdbcInterceptors==null) {
- interceptors = new InterceptorDefinition[0];
- } else {
- String[] interceptorValues = jdbcInterceptors.split(";");
- InterceptorDefinition[] definitions = new InterceptorDefinition[interceptorValues.length+1];
- //always add the trap interceptor to the mix
- definitions[0] = new InterceptorDefinition(TrapException.class);
- for (int i=0; i<interceptorValues.length; i++) {
- int propIndex = interceptorValues[i].indexOf('(');
- int endIndex = interceptorValues[i].indexOf(')');
- if (propIndex<0 || endIndex<0 || endIndex <= propIndex) {
- definitions[i+1] = new InterceptorDefinition(interceptorValues[i].trim());
- } else {
- String name = interceptorValues[i].substring(0,propIndex).trim();
- definitions[i+1] = new InterceptorDefinition(name);
- String propsAsString = interceptorValues[i].substring(propIndex+1, endIndex);
- String[] props = propsAsString.split(",");
- for (int j=0; j<props.length; j++) {
- int pidx = props[j].indexOf('=');
- String propName = props[j].substring(0,pidx).trim();
- String propValue = props[j].substring(pidx+1).trim();
- definitions[i+1].addProperty(new InterceptorProperty(propName,propValue));
- }
- }
- }
- interceptors = definitions;
- }
- }
- return interceptors;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setAccessToUnderlyingConnectionAllowed(boolean accessToUnderlyingConnectionAllowed) {
- // NOOP
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setConnectionProperties(String connectionProperties) {
- this.connectionProperties = connectionProperties;
- getProperties(connectionProperties, getDbProperties());
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDbProperties(Properties dbProperties) {
- this.dbProperties = dbProperties;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultAutoCommit(Boolean defaultAutoCommit) {
- this.defaultAutoCommit = defaultAutoCommit;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultCatalog(String defaultCatalog) {
- this.defaultCatalog = defaultCatalog;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultReadOnly(Boolean defaultReadOnly) {
- this.defaultReadOnly = defaultReadOnly;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDefaultTransactionIsolation(int defaultTransactionIsolation) {
- this.defaultTransactionIsolation = defaultTransactionIsolation;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setDriverClassName(String driverClassName) {
- this.driverClassName = driverClassName;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setInitialSize(int initialSize) {
- this.initialSize = initialSize;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setLogAbandoned(boolean logAbandoned) {
- this.logAbandoned = logAbandoned;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxActive(int maxActive) {
- this.maxActive = maxActive;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxIdle(int maxIdle) {
- this.maxIdle = maxIdle;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxWait(int maxWait) {
- this.maxWait = maxWait;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
- this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMinIdle(int minIdle) {
- this.minIdle = minIdle;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
- this.numTestsPerEvictionRun = numTestsPerEvictionRun;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setPassword(String password) {
- this.password = password;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setRemoveAbandoned(boolean removeAbandoned) {
- this.removeAbandoned = removeAbandoned;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) {
- this.removeAbandonedTimeout = removeAbandonedTimeout;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestOnBorrow(boolean testOnBorrow) {
- this.testOnBorrow = testOnBorrow;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestWhileIdle(boolean testWhileIdle) {
- this.testWhileIdle = testWhileIdle;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestOnReturn(boolean testOnReturn) {
- this.testOnReturn = testOnReturn;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTimeBetweenEvictionRunsMillis(int
- timeBetweenEvictionRunsMillis) {
- this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUrl(String url) {
- this.url = url;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUsername(String username) {
- this.username = username;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidationInterval(long validationInterval) {
- this.validationInterval = validationInterval;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidationQuery(String validationQuery) {
- this.validationQuery = validationQuery;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidatorClassName(String className) {
- this.validatorClassName = className;
-
- validator = null;
-
- if (className == null) {
- return;
- }
-
- try {
- @SuppressWarnings("unchecked")
- Class<Validator> validatorClass = (Class<Validator>)ClassLoaderUtil.loadClass(
- className,
- PoolProperties.class.getClassLoader(),
- Thread.currentThread().getContextClassLoader()
- );
- validator = validatorClass.newInstance();
- } catch (ClassNotFoundException e) {
- log.warn("The class "+className+" cannot be found.", e);
- } catch (ClassCastException e) {
- log.warn("The class "+className+" does not implement the Validator interface.", e);
- } catch (InstantiationException e) {
- log.warn("An object of class "+className+" cannot be instantiated. Make sure that "+
- "it includes an implicit or explicit no-arg constructor.", e);
- } catch (IllegalAccessException e) {
- log.warn("The class "+className+" or its no-arg constructor are inaccessible.", e);
- }
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setInitSQL(String initSQL) {
- this.initSQL = initSQL!=null && initSQL.trim().length()>0 ? initSQL : null;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setTestOnConnect(boolean testOnConnect) {
- this.testOnConnect = testOnConnect;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setJdbcInterceptors(String jdbcInterceptors) {
- this.jdbcInterceptors = jdbcInterceptors;
- this.interceptors = null;
- }
-
-
- @Override
- public String toString() {
- StringBuilder buf = new StringBuilder("ConnectionPool[");
- try {
- String[] fields = DataSourceFactory.ALL_PROPERTIES;
- for (String field: fields) {
- final String[] prefix = new String[] {"get","is"};
- for (int j=0; j<prefix.length; j++) {
-
- String name = prefix[j]
- + field.substring(0, 1).toUpperCase(Locale.ENGLISH)
- + field.substring(1);
- Method m = null;
- try {
- m = getClass().getMethod(name);
- }catch (NoSuchMethodException nm) {
- continue;
- }
- buf.append(field);
- buf.append("=");
- if (DataSourceFactory.PROP_PASSWORD.equals(field)) {
- buf.append("********");
- } else {
- buf.append(m.invoke(this, new Object[0]));
- }
- buf.append("; ");
- break;
- }
- }
- }catch (Exception x) {
- //shouldn't happen
- log.debug("toString() call failed", x);
- }
- return buf.toString();
- }
-
- public static int getPoolCounter() {
- return poolCounter.get();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isJmxEnabled() {
- return jmxEnabled;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setJmxEnabled(boolean jmxEnabled) {
- this.jmxEnabled = jmxEnabled;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean getDefaultAutoCommit() {
- return defaultAutoCommit;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Boolean getDefaultReadOnly() {
- return defaultReadOnly;
- }
-
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getSuspectTimeout() {
- return this.suspectTimeout;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setSuspectTimeout(int seconds) {
- this.suspectTimeout = seconds;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isPoolSweeperEnabled() {
- boolean timer = getTimeBetweenEvictionRunsMillis()>0;
- boolean result = timer && (isRemoveAbandoned() && getRemoveAbandonedTimeout()>0);
- result = result || (timer && getSuspectTimeout()>0);
- result = result || (timer && isTestWhileIdle() && getValidationQuery()!=null);
- result = result || (timer && getMinEvictableIdleTimeMillis()>0);
- return result;
- }
-
-
- public static class InterceptorDefinition implements Serializable {
- private static final long serialVersionUID = 1L;
- protected String className;
- protected Map<String,InterceptorProperty> properties = new HashMap<>();
- protected volatile Class<?> clazz = null;
- public InterceptorDefinition(String className) {
- this.className = className;
- }
-
- public InterceptorDefinition(Class<?> cl) {
- this(cl.getName());
- clazz = cl;
- }
-
- public String getClassName() {
- return className;
- }
- public void addProperty(String name, String value) {
- InterceptorProperty p = new InterceptorProperty(name,value);
- addProperty(p);
- }
-
- public void addProperty(InterceptorProperty p) {
- properties.put(p.getName(), p);
- }
-
- public Map<String,InterceptorProperty> getProperties() {
- return properties;
- }
-
- @SuppressWarnings("unchecked")
- public Class<? extends JdbcInterceptor> getInterceptorClass() throws ClassNotFoundException {
- if (clazz==null) {
- if (getClassName().indexOf('.')<0) {
- if (log.isDebugEnabled()) {
- log.debug("Loading interceptor class:"+PoolConfiguration.PKG_PREFIX+getClassName());
- }
- clazz = ClassLoaderUtil.loadClass(
- PoolConfiguration.PKG_PREFIX+getClassName(),
- PoolProperties.class.getClassLoader(),
- Thread.currentThread().getContextClassLoader()
- );
- } else {
- if (log.isDebugEnabled()) {
- log.debug("Loading interceptor class:"+getClassName());
- }
- clazz = ClassLoaderUtil.loadClass(
- getClassName(),
- PoolProperties.class.getClassLoader(),
- Thread.currentThread().getContextClassLoader()
- );
- }
- }
- return (Class<? extends JdbcInterceptor>)clazz;
- }
- }
-
- public static class InterceptorProperty implements Serializable {
- private static final long serialVersionUID = 1L;
- String name;
- String value;
- public InterceptorProperty(String name, String value) {
- assert(name!=null);
- this.name = name;
- this.value = value;
- }
- public String getName() {
- return name;
- }
- public String getValue() {
- return value;
- }
-
- public boolean getValueAsBoolean(boolean def) {
- if (value==null) return def;
- if ("true".equals(value)) return true;
- if ("false".equals(value)) return false;
- return def;
- }
-
- public int getValueAsInt(int def) {
- if (value==null) return def;
- try {
- int v = Integer.parseInt(value);
- return v;
- }catch (NumberFormatException nfe) {
- return def;
- }
- }
-
- public long getValueAsLong(long def) {
- if (value==null) return def;
- try {
- return Long.parseLong(value);
- }catch (NumberFormatException nfe) {
- return def;
- }
- }
-
- public byte getValueAsByte(byte def) {
- if (value==null) return def;
- try {
- return Byte.parseByte(value);
- }catch (NumberFormatException nfe) {
- return def;
- }
- }
-
- public short getValueAsShort(short def) {
- if (value==null) return def;
- try {
- return Short.parseShort(value);
- }catch (NumberFormatException nfe) {
- return def;
- }
- }
-
- public float getValueAsFloat(float def) {
- if (value==null) return def;
- try {
- return Float.parseFloat(value);
- }catch (NumberFormatException nfe) {
- return def;
- }
- }
-
- public double getValueAsDouble(double def) {
- if (value==null) return def;
- try {
- return Double.parseDouble(value);
- }catch (NumberFormatException nfe) {
- return def;
- }
- }
-
- public char getValueAschar(char def) {
- if (value==null) return def;
- try {
- return value.charAt(0);
- }catch (StringIndexOutOfBoundsException nfe) {
- return def;
- }
- }
-
- @Override
- public int hashCode() {
- return name.hashCode();
- }
-
- @Override
- public boolean equals(Object o) {
- if (o==this) return true;
- if (o instanceof InterceptorProperty) {
- InterceptorProperty other = (InterceptorProperty)o;
- return other.name.equals(this.name);
- }
- return false;
- }
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean isUseEquals() {
- return useEquals;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUseEquals(boolean useEquals) {
- this.useEquals = useEquals;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public long getMaxAge() {
- return maxAge;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setMaxAge(long maxAge) {
- this.maxAge = maxAge;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public boolean getUseLock() {
- return useLock;
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setUseLock(boolean useLock) {
- this.useLock = useLock;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setDataSource(Object ds) {
- if (ds instanceof DataSourceProxy) {
- throw new IllegalArgumentException("Layered pools are not allowed.");
- }
- this.dataSource = ds;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object getDataSource() {
- return dataSource;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setDataSourceJNDI(String jndiDS) {
- this.dataSourceJNDI = jndiDS;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getDataSourceJNDI() {
- return this.dataSourceJNDI;
- }
-
-
- public static Properties getProperties(String propText, Properties props) {
- if (props==null) props = new Properties();
- if (propText != null) {
- try {
- props.load(new ByteArrayInputStream(propText.replace(';', '\n').getBytes()));
- }catch (IOException x) {
- throw new RuntimeException(x);
- }
- }
- return props;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isAlternateUsernameAllowed() {
- return alternateUsernameAllowed;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setAlternateUsernameAllowed(boolean alternateUsernameAllowed) {
- this.alternateUsernameAllowed = alternateUsernameAllowed;
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setCommitOnReturn(boolean commitOnReturn) {
- this.commitOnReturn = commitOnReturn;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getCommitOnReturn() {
- return this.commitOnReturn;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setRollbackOnReturn(boolean rollbackOnReturn) {
- this.rollbackOnReturn = rollbackOnReturn;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getRollbackOnReturn() {
- return this.rollbackOnReturn;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUseDisposableConnectionFacade(boolean useDisposableConnectionFacade) {
- this.useDisposableConnectionFacade = useDisposableConnectionFacade;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getUseDisposableConnectionFacade() {
- return useDisposableConnectionFacade;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setLogValidationErrors(boolean logValidationErrors) {
- this.logValidationErrors = logValidationErrors;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getLogValidationErrors() {
- return this.logValidationErrors;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getPropagateInterruptState() {
- return propagateInterruptState;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setPropagateInterruptState(boolean propagateInterruptState) {
- this.propagateInterruptState = propagateInterruptState;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isIgnoreExceptionOnPreLoad() {
- return ignoreExceptionOnPreLoad;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setIgnoreExceptionOnPreLoad(boolean ignoreExceptionOnPreLoad) {
- this.ignoreExceptionOnPreLoad = ignoreExceptionOnPreLoad;
- }
-
- @Override
- protected Object clone() throws CloneNotSupportedException {
- // TODO Auto-generated method stub
- return super.clone();
- }
-
-
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolUtilities.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolUtilities.java
deleted file mode 100644
index cd0d3b2..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PoolUtilities.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.util.Properties;
-
-public class PoolUtilities {
-
- public static final String PROP_USER = "user";
-
- public static final String PROP_PASSWORD = "password";
-
- public static Properties clone(Properties p) {
- Properties c = new Properties();
- c.putAll(p);
- return c;
- }
-
- public static Properties cloneWithoutPassword(Properties p) {
- Properties result = clone(p);
- result.remove(PROP_PASSWORD);
- return result;
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
deleted file mode 100644
index b704c7f..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
+++ /dev/null
@@ -1,795 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.HashMap;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
-
-import com.mysql.jdbc.Driver;
-
-/**
- * Represents a pooled connection
- * and holds a reference to the {@link java.sql.Connection} object
- * @version 1.0
- */
-public class PooledConnection {
- /**
- * Logger
- */
- private static final Log log = LogFactory.getLog(PooledConnection.class);
-
- public static final String PROP_USER = PoolUtilities.PROP_USER;
-
- public static final String PROP_PASSWORD = PoolUtilities.PROP_PASSWORD;
-
- /**
- * Validate when connection is borrowed flag
- */
- public static final int VALIDATE_BORROW = 1;
- /**
- * Validate when connection is returned flag
- */
- public static final int VALIDATE_RETURN = 2;
- /**
- * Validate when connection is idle flag
- */
- public static final int VALIDATE_IDLE = 3;
- /**
- * Validate when connection is initialized flag
- */
- public static final int VALIDATE_INIT = 4;
- /**
- * The properties for the connection pool
- */
- protected PoolConfiguration poolProperties;
- /**
- * The underlying database connection
- */
- private volatile java.sql.Connection connection;
-
- /**
- * If using a XAConnection underneath.
- */
- protected volatile javax.sql.XAConnection xaConnection;
- /**
- * When we track abandon traces, this string holds the thread dump
- */
- private String abandonTrace = null;
- /**
- * Timestamp the connection was last 'touched' by the pool
- */
- private volatile long timestamp;
- /**
- * Lock for this connection only
- */
- private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(false);
- /**
- * Set to true if this connection has been discarded by the pool
- */
- private volatile boolean discarded = false;
- /**
- * The Timestamp when the last time the connect() method was called successfully
- */
- private volatile long lastConnected = -1;
- /**
- * timestamp to keep track of validation intervals
- */
- private volatile long lastValidated = System.currentTimeMillis();
- /**
- * The parent
- */
- protected ConnectionPool parent;
-
- private HashMap<Object, Object> attributes = new HashMap<>();
-
- private volatile long connectionVersion=0;
-
- /**
- * Weak reference to cache the list of interceptors for this connection
- * so that we don't create a new list of interceptors each time we borrow
- * the connection
- */
- private volatile JdbcInterceptor handler = null;
-
- private AtomicBoolean released = new AtomicBoolean(false);
-
- private volatile boolean suspect = false;
-
- private java.sql.Driver driver = null;
-
- /**
- * Constructor
- * @param prop - pool properties
- * @param parent - the parent connection pool
- */
- public PooledConnection(PoolConfiguration prop, ConnectionPool parent) {
- poolProperties = prop;
- this.parent = parent;
- connectionVersion = parent.getPoolVersion();
- }
-
- public long getConnectionVersion() {
- return connectionVersion;
- }
-
- /**
- * @deprecated use {@link #shouldForceReconnect(String, String)}
- * method kept since it was public, to avoid changing interface.
- * @param username The user name
- * @param password The password
- * @return <code>true</code>if the pool does not need to reconnect
- */
- @Deprecated
- public boolean checkUser(String username, String password) {
- return !shouldForceReconnect(username, password);
- }
-
- /**
- * Returns true if we must force reconnect based on credentials passed in.
- * Returns false if {@link PoolConfiguration#isAlternateUsernameAllowed()} method returns false.
- * Returns false if the username/password has not changed since this connection was connected
- * @param username the username you wish to connect with, pass in null to accept the default username from {@link PoolConfiguration#getUsername()}
- * @param password the password you wish to connect with, pass in null to accept the default username from {@link org.apache.tomcat.jdbc.pool.PoolConfiguration#getPassword()}
- * @return true is the pool must reconnect
- */
- public boolean shouldForceReconnect(String username, String password) {
-
- if (!getPoolProperties().isAlternateUsernameAllowed()) return false;
-
- if (username==null) username = poolProperties.getUsername();
- if (password==null) password = poolProperties.getPassword();
-
- String storedUsr = (String)getAttributes().get(PROP_USER);
- String storedPwd = (String)getAttributes().get(PROP_PASSWORD);
-
- boolean noChangeInCredentials = (username==null && storedUsr==null);
- noChangeInCredentials = (noChangeInCredentials || (username!=null && username.equals(storedUsr)));
-
- noChangeInCredentials = noChangeInCredentials && ((password==null && storedPwd==null) || (password!=null && password.equals(storedPwd)));
-
- if (username==null) getAttributes().remove(PROP_USER); else getAttributes().put(PROP_USER, username);
- if (password==null) getAttributes().remove(PROP_PASSWORD); else getAttributes().put(PROP_PASSWORD, password);
-
- return !noChangeInCredentials;
- }
-
- /**
- * Connects the underlying connection to the database.
- * @throws SQLException if the method {@link #release()} has been called.
- * @throws SQLException if driver instantiation fails
- * @throws SQLException if a call to {@link java.sql.Driver#connect(String, java.util.Properties)} fails.
- * @throws SQLException if default properties are configured and a call to
- * {@link java.sql.Connection#setAutoCommit(boolean)}, {@link java.sql.Connection#setCatalog(String)},
- * {@link java.sql.Connection#setTransactionIsolation(int)} or {@link java.sql.Connection#setReadOnly(boolean)} fails.
- */
- public void connect() throws SQLException {
- if (released.get()) throw new SQLException("A connection once released, can't be reestablished.");
- if (connection != null) {
- try {
- this.disconnect(false);
- } catch (Exception x) {
- log.debug("Unable to disconnect previous connection.", x);
- } //catch
- } //end if
- if (poolProperties.getDataSource()==null && poolProperties.getDataSourceJNDI()!=null) {
- //TODO lookup JNDI name
- }
-
- if (poolProperties.getDataSource()!=null) {
- connectUsingDataSource();
- } else {
- connectUsingDriver();
- }
-
- //set up the default state, unless we expect the interceptor to do it
- if (poolProperties.getJdbcInterceptors()==null || poolProperties.getJdbcInterceptors().indexOf(ConnectionState.class.getName())<0 ||
- poolProperties.getJdbcInterceptors().indexOf(ConnectionState.class.getSimpleName())<0) {
- if (poolProperties.getDefaultTransactionIsolation()!=DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION) connection.setTransactionIsolation(poolProperties.getDefaultTransactionIsolation());
- if (poolProperties.getDefaultReadOnly()!=null) connection.setReadOnly(poolProperties.getDefaultReadOnly().booleanValue());
- if (poolProperties.getDefaultAutoCommit()!=null) connection.setAutoCommit(poolProperties.getDefaultAutoCommit().booleanValue());
- if (poolProperties.getDefaultCatalog()!=null) connection.setCatalog(poolProperties.getDefaultCatalog());
- }
- this.discarded = false;
- this.lastConnected = System.currentTimeMillis();
- }
-
- protected void connectUsingDataSource() throws SQLException {
- String usr = null;
- String pwd = null;
- if (getAttributes().containsKey(PROP_USER)) {
- usr = (String) getAttributes().get(PROP_USER);
- } else {
- usr = poolProperties.getUsername();
- getAttributes().put(PROP_USER, usr);
- }
- if (getAttributes().containsKey(PROP_PASSWORD)) {
- pwd = (String) getAttributes().get(PROP_PASSWORD);
- } else {
- pwd = poolProperties.getPassword();
- getAttributes().put(PROP_PASSWORD, pwd);
- }
- if (poolProperties.getDataSource() instanceof javax.sql.XADataSource) {
- javax.sql.XADataSource xds = (javax.sql.XADataSource)poolProperties.getDataSource();
- if (usr!=null && pwd!=null) {
- xaConnection = xds.getXAConnection(usr, pwd);
- connection = xaConnection.getConnection();
- } else {
- xaConnection = xds.getXAConnection();
- connection = xaConnection.getConnection();
- }
- } else if (poolProperties.getDataSource() instanceof javax.sql.DataSource){
- javax.sql.DataSource ds = (javax.sql.DataSource)poolProperties.getDataSource();
- if (usr!=null && pwd!=null) {
- connection = ds.getConnection(usr, pwd);
- } else {
- connection = ds.getConnection();
- }
- } else if (poolProperties.getDataSource() instanceof javax.sql.ConnectionPoolDataSource){
- javax.sql.ConnectionPoolDataSource ds = (javax.sql.ConnectionPoolDataSource)poolProperties.getDataSource();
- if (usr!=null && pwd!=null) {
- connection = ds.getPooledConnection(usr, pwd).getConnection();
- } else {
- connection = ds.getPooledConnection().getConnection();
- }
- } else {
- throw new SQLException("DataSource is of unknown class:"+(poolProperties.getDataSource()!=null?poolProperties.getDataSource().getClass():"null"));
- }
- }
- protected void connectUsingDriver() throws SQLException {
-
- try {
- Class.forName("com.mysql.jdbc.Driver") ;
- Driver dr = new com.mysql.jdbc.Driver();
- if(dr == null)
- log.warn("Driver NOT CREATED");
- } catch (ClassNotFoundException e) {
- log.warn("Driver NOT CREATED", e);
- }
-
- try {
- if (driver==null) {
- if (log.isDebugEnabled()) {
- log.debug("Instantiating driver using class: "+poolProperties.getDriverClassName()+" [url="+poolProperties.getUrl()+"]");
- }
- if (poolProperties.getDriverClassName()==null) {
- //rely on DriverManager
- log.warn("Not loading a JDBC driver as driverClassName property is null.");
- } else {
- driver = (java.sql.Driver)
- ClassLoaderUtil.loadClass(
- poolProperties.getDriverClassName(),
- PooledConnection.class.getClassLoader(),
- Thread.currentThread().getContextClassLoader()
- ).newInstance();
- }
- }
- } catch (java.lang.Exception cn) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to instantiate JDBC driver.", cn);
- }
- SQLException ex = new SQLException(cn.getMessage());
- ex.initCause(cn);
- throw ex;
- }
- String driverURL = poolProperties.getUrl();
- String usr = null;
- String pwd = null;
- if (getAttributes().containsKey(PROP_USER)) {
- usr = (String) getAttributes().get(PROP_USER);
- } else {
- usr = poolProperties.getUsername();
- getAttributes().put(PROP_USER, usr);
- }
- if (getAttributes().containsKey(PROP_PASSWORD)) {
- pwd = (String) getAttributes().get(PROP_PASSWORD);
- } else {
- pwd = poolProperties.getPassword();
- getAttributes().put(PROP_PASSWORD, pwd);
- }
- Properties properties = PoolUtilities.clone(poolProperties.getDbProperties());
- if (usr != null) properties.setProperty(PROP_USER, usr);
- if (pwd != null) properties.setProperty(PROP_PASSWORD, pwd);
-
- try {
- if (driver==null) {
- connection = DriverManager.getConnection(driverURL, properties);
- } else {
- connection = driver.connect(driverURL, properties);
- }
- } catch (Exception x) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to connect to database.", x);
- }
- if (parent.jmxPool!=null) {
- parent.jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.NOTIFY_CONNECT,
- ConnectionPool.getStackTrace(x));
- }
- if (x instanceof SQLException) {
- throw (SQLException)x;
- } else {
- SQLException ex = new SQLException(x.getMessage());
- ex.initCause(x);
- throw ex;
- }
- }
- if (connection==null) {
- throw new SQLException("Driver:"+driver+" returned null for URL:"+driverURL);
- }
- }
-
- /**
- *
- * @return true if connect() was called successfully and disconnect has not yet been called
- */
- public boolean isInitialized() {
- return connection!=null;
- }
-
- /**
- * Returns true if the connection has been connected more than
- * {@link PoolConfiguration#getMaxAge()} milliseconds. false otherwise.
- * @return Returns true if the connection has been connected more than
- * {@link PoolConfiguration#getMaxAge()} milliseconds. false otherwise.
- */
- public boolean isMaxAgeExpired() {
- if (getPoolProperties().getMaxAge()>0 ) {
- return (System.currentTimeMillis() - getLastConnected()) > getPoolProperties().getMaxAge();
- } else {
- return false;
- }
- }
- /**
- * Issues a call to {@link #disconnect(boolean)} with the argument false followed by a call to
- * {@link #connect()}
- * @throws SQLException if the call to {@link #connect()} fails.
- */
- public void reconnect() throws SQLException {
- this.disconnect(false);
- this.connect();
- } //reconnect
-
- /**
- * Disconnects the connection. All exceptions are logged using debug level.
- * @param finalize if set to true, a call to {@link ConnectionPool#finalize(PooledConnection)} is called.
- */
- private void disconnect(boolean finalize) {
- if (isDiscarded() && connection == null) {
- return;
- }
- setDiscarded(true);
- if (connection != null) {
- try {
- parent.disconnectEvent(this, finalize);
- if (xaConnection == null) {
- connection.close();
- } else {
- xaConnection.close();
- }
- }catch (Exception ignore) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to close underlying SQL connection",ignore);
- }
- }
- }
- connection = null;
- xaConnection = null;
- lastConnected = -1;
- if (finalize) parent.finalize(this);
- }
-
-
-//============================================================================
-//
-//============================================================================
-
- /**
- * Returns abandon timeout in milliseconds
- * @return abandon timeout in milliseconds
- */
- public long getAbandonTimeout() {
- if (poolProperties.getRemoveAbandonedTimeout() <= 0) {
- return Long.MAX_VALUE;
- } else {
- return poolProperties.getRemoveAbandonedTimeout() * 1000L;
- } //end if
- }
-
- /**
- * Returns <code>true</code> if the connection pool is configured
- * to do validation for a certain action.
- * @param action The validation action
- */
- private boolean doValidate(int action) {
- if (action == PooledConnection.VALIDATE_BORROW &&
- poolProperties.isTestOnBorrow())
- return true;
- else if (action == PooledConnection.VALIDATE_RETURN &&
- poolProperties.isTestOnReturn())
- return true;
- else if (action == PooledConnection.VALIDATE_IDLE &&
- poolProperties.isTestWhileIdle())
- return true;
- else if (action == PooledConnection.VALIDATE_INIT &&
- poolProperties.isTestOnConnect())
- return true;
- else if (action == PooledConnection.VALIDATE_INIT &&
- poolProperties.getInitSQL()!=null)
- return true;
- else
- return false;
- }
-
- /**
- * Returns <code>true</code> if the object is still valid. if not
- * the pool will call the getExpiredAction() and follow up with one
- * of the four expired methods
- * @param validateAction The value
- * @return <code>true</code> if the connection is valid
- */
- public boolean validate(int validateAction) {
- return validate(validateAction,null);
- }
-
- /**
- * Validates a connection.
- * @param validateAction the action used. One of {@link #VALIDATE_BORROW}, {@link #VALIDATE_IDLE},
- * {@link #VALIDATE_INIT} or {@link #VALIDATE_RETURN}
- * @param sql the SQL to be used during validation. If the {@link PoolConfiguration#setInitSQL(String)} has been called with a non null
- * value and the action is {@link #VALIDATE_INIT} the init SQL will be used for validation.
- *
- * @return true if the connection was validated successfully. It returns true even if validation was not performed, such as when
- * {@link PoolConfiguration#setValidationInterval(long)} has been called with a positive value.
- * <p>
- * false if the validation failed. The caller should close the connection if false is returned since a session could have been left in
- * an unknown state during initialization.
- */
- public boolean validate(int validateAction,String sql) {
- if (this.isDiscarded()) {
- return false;
- }
-
- if (!doValidate(validateAction)) {
- //no validation required, no init sql and props not set
- return true;
- }
-
- //Don't bother validating if already have recently enough
- long now = System.currentTimeMillis();
- if (validateAction!=VALIDATE_INIT &&
- poolProperties.getValidationInterval() > 0 &&
- (now - this.lastValidated) <
- poolProperties.getValidationInterval()) {
- return true;
- }
-
- if (poolProperties.getValidator() != null) {
- if (poolProperties.getValidator().validate(connection, validateAction)) {
- this.lastValidated = now;
- return true;
- } else {
- if (getPoolProperties().getLogValidationErrors()) {
- log.error("Custom validation through "+poolProperties.getValidator()+" failed.");
- }
- return false;
- }
- }
-
- String query = sql;
-
- if (validateAction == VALIDATE_INIT && poolProperties.getInitSQL() != null) {
- query = poolProperties.getInitSQL();
- }
-
- if (query == null) {
- query = poolProperties.getValidationQuery();
- }
-
- if (query == null) {
- int validationQueryTimeout = poolProperties.getValidationQueryTimeout();
- if (validationQueryTimeout < 0) validationQueryTimeout = 0;
- try {
- if (connection.isValid(validationQueryTimeout)) {
- this.lastValidated = now;
- return true;
- } else {
- if (getPoolProperties().getLogValidationErrors()) {
- log.error("isValid() returned false.");
- }
- return false;
- }
- } catch (SQLException e) {
- if (getPoolProperties().getLogValidationErrors()) {
- log.error("isValid() failed.", e);
- } else if (log.isDebugEnabled()) {
- log.debug("isValid() failed.", e);
- }
- return false;
- }
- }
-
- Statement stmt = null;
- try {
- stmt = connection.createStatement();
-
- int validationQueryTimeout = poolProperties.getValidationQueryTimeout();
- if (validationQueryTimeout > 0) {
- stmt.setQueryTimeout(validationQueryTimeout);
- }
-
- stmt.execute(query);
- stmt.close();
- this.lastValidated = now;
- return true;
- } catch (Exception ex) {
- if (getPoolProperties().getLogValidationErrors()) {
- log.warn("SQL Validation error", ex);
- } else if (log.isDebugEnabled()) {
- log.debug("Unable to validate object:",ex);
- }
- if (stmt!=null)
- try { stmt.close();} catch (Exception ignore2){/*NOOP*/}
- }
- return false;
- } //validate
-
- /**
- * The time limit for how long the object
- * can remain unused before it is released
- * @return {@link PoolConfiguration#getMinEvictableIdleTimeMillis()}
- */
- public long getReleaseTime() {
- return this.poolProperties.getMinEvictableIdleTimeMillis();
- }
-
- /**
- * This method is called if (Now - timeCheckedIn &gt; getReleaseTime())
- * This method disconnects the connection, logs an error in debug mode if it happens
- * then sets the {@link #released} flag to false. Any attempts to connect this cached object again
- * will fail per {@link #connect()}
- * The connection pool uses the atomic return value to decrement the pool size counter.
- * @return true if this is the first time this method has been called. false if this method has been called before.
- */
- public boolean release() {
- try {
- disconnect(true);
- } catch (Exception x) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to close SQL connection",x);
- }
- }
- return released.compareAndSet(false, true);
-
- }
-
- /**
- * The pool will set the stack trace when it is check out and
- * checked in
- * @param trace the stack trace for this connection
- */
-
- public void setStackTrace(String trace) {
- abandonTrace = trace;
- }
-
- /**
- * Returns the stack trace from when this connection was borrowed. Can return null if no stack trace was set.
- * @return the stack trace or null of no trace was set
- */
- public String getStackTrace() {
- return abandonTrace;
- }
-
- /**
- * Sets a timestamp on this connection. A timestamp usually means that some operation
- * performed successfully.
- * @param timestamp the timestamp as defined by {@link System#currentTimeMillis()}
- */
- public void setTimestamp(long timestamp) {
- this.timestamp = timestamp;
- setSuspect(false);
- }
-
-
- public boolean isSuspect() {
- return suspect;
- }
-
- public void setSuspect(boolean suspect) {
- this.suspect = suspect;
- }
-
- /**
- * An interceptor can call this method with the value true, and the connection will be closed when it is returned to the pool.
- * @param discarded - only valid value is true
- * @throws IllegalStateException if this method is called with the value false and the value true has already been set.
- */
- public void setDiscarded(boolean discarded) {
- if (this.discarded && !discarded) throw new IllegalStateException("Unable to change the state once the connection has been discarded");
- this.discarded = discarded;
- }
-
- /**
- * Set the timestamp the connection was last validated.
- * This flag is used to keep track when we are using a {@link PoolConfiguration#setValidationInterval(long) validation-interval}.
- * @param lastValidated a timestamp as defined by {@link System#currentTimeMillis()}
- */
- public void setLastValidated(long lastValidated) {
- this.lastValidated = lastValidated;
- }
-
- /**
- * Sets the pool configuration for this connection and connection pool.
- * Object is shared with the {@link ConnectionPool}
- * @param poolProperties The pool properties
- */
- public void setPoolProperties(PoolConfiguration poolProperties) {
- this.poolProperties = poolProperties;
- }
-
- /**
- * Return the timestamps of last pool action. Timestamps are typically set when connections
- * are borrowed from the pool. It is used to keep track of {@link PoolConfiguration#setRemoveAbandonedTimeout(int) abandon-timeouts}.
- * This timestamp can also be reset by the {@link org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer#invoke(Object, java.lang.reflect.Method, Object[])}
- * @return the timestamp of the last pool action as defined by {@link System#currentTimeMillis()}
- */
- public long getTimestamp() {
- return timestamp;
- }
-
- /**
- * Returns the discarded flag.
- * @return the discarded flag. If the value is true,
- * either {@link #disconnect(boolean)} has been called or it will be called when the connection is returned to the pool.
- */
- public boolean isDiscarded() {
- return discarded;
- }
-
- /**
- * Returns the timestamp of the last successful validation query execution.
- * @return the timestamp of the last successful validation query execution as defined by {@link System#currentTimeMillis()}
- */
- public long getLastValidated() {
- return lastValidated;
- }
-
- /**
- * Returns the configuration for this connection and pool
- * @return the configuration for this connection and pool
- */
- public PoolConfiguration getPoolProperties() {
- return poolProperties;
- }
-
- /**
- * Locks the connection only if either {@link PoolConfiguration#isPoolSweeperEnabled()} or
- * {@link PoolConfiguration#getUseLock()} return true. The per connection lock ensures thread safety is
- * multiple threads are performing operations on the connection.
- * Otherwise this is a noop for performance
- */
- public void lock() {
- if (poolProperties.getUseLock() || this.poolProperties.isPoolSweeperEnabled()) {
- //optimized, only use a lock when there is concurrency
- lock.writeLock().lock();
- }
- }
-
- /**
- * Unlocks the connection only if the sweeper is enabled
- * Otherwise this is a noop for performance
- */
- public void unlock() {
- if (poolProperties.getUseLock() || this.poolProperties.isPoolSweeperEnabled()) {
- //optimized, only use a lock when there is concurrency
- lock.writeLock().unlock();
- }
- }
-
- /**
- * Returns the underlying connection
- * @return the underlying JDBC connection as it was returned from the JDBC driver
- * @see javax.sql.PooledConnection#getConnection()
- */
- public java.sql.Connection getConnection() {
- return this.connection;
- }
-
- /**
- * Returns the underlying XA connection
- * @return the underlying XA connection as it was returned from the Datasource
- */
- public javax.sql.XAConnection getXAConnection() {
- return this.xaConnection;
- }
-
-
- /**
- * Returns the timestamp of when the connection was last connected to the database.
- * ie, a successful call to {@link java.sql.Driver#connect(String, java.util.Properties)}.
- * @return the timestamp when this connection was created as defined by {@link System#currentTimeMillis()}
- */
- public long getLastConnected() {
- return lastConnected;
- }
-
- /**
- * Returns the first handler in the interceptor chain
- * @return the first interceptor for this connection
- */
- public JdbcInterceptor getHandler() {
- return handler;
- }
-
- public void setHandler(JdbcInterceptor handler) {
- if (this.handler!=null && this.handler!=handler) {
- JdbcInterceptor interceptor = this.handler;
- while (interceptor!=null) {
- interceptor.reset(null, null);
- interceptor = interceptor.getNext();
- }//while
- }//end if
- this.handler = handler;
- }
-
- @Override
- public String toString() {
- return "PooledConnection["+(connection!=null?connection.toString():"null")+"]";
- }
-
- /**
- * Returns true if this connection has been released and wont be reused.
- * @return true if the method {@link #release()} has been called
- */
- public boolean isReleased() {
- return released.get();
- }
-
- public HashMap<Object,Object> getAttributes() {
- return attributes;
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java
deleted file mode 100644
index 0a67e8e..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.sql.SQLException;
-
-import javax.sql.XAConnection;
-/**
- * A ProxyConnection object is the bottom most interceptor that wraps an object of type
- * {@link PooledConnection}. The ProxyConnection intercepts three methods:
- * <ul>
- * <li>{@link java.sql.Connection#close()} - returns the connection to the pool. May be called multiple times.</li>
- * <li>{@link java.lang.Object#toString()} - returns a custom string for this object</li>
- * <li>{@link javax.sql.PooledConnection#getConnection()} - returns the underlying connection</li>
- * </ul>
- * By default method comparisons is done on a String reference level, unless the {@link PoolConfiguration#setUseEquals(boolean)} has been called
- * with a <code>true</code> argument.
- */
-public class ProxyConnection extends JdbcInterceptor {
-
- protected PooledConnection connection = null;
-
- protected ConnectionPool pool = null;
-
- public PooledConnection getConnection() {
- return connection;
- }
-
- public void setConnection(PooledConnection connection) {
- this.connection = connection;
- }
-
- public ConnectionPool getPool() {
- return pool;
- }
-
- public void setPool(ConnectionPool pool) {
- this.pool = pool;
- }
-
- protected ProxyConnection(ConnectionPool parent, PooledConnection con,
- boolean useEquals) {
- pool = parent;
- connection = con;
- setUseEquals(useEquals);
- }
-
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- this.pool = parent;
- this.connection = con;
- }
-
- public boolean isWrapperFor(Class<?> iface) {
- if (iface == XAConnection.class && connection.getXAConnection()!=null) {
- return true;
- } else {
- return (iface.isInstance(connection.getConnection()));
- }
- }
-
-
- public Object unwrap(Class<?> iface) throws SQLException {
- if (iface == PooledConnection.class) {
- return connection;
- }else if (iface == XAConnection.class) {
- return connection.getXAConnection();
- } else if (isWrapperFor(iface)) {
- return connection.getConnection();
- } else {
- throw new SQLException("Not a wrapper of "+iface.getName());
- }
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if (compare(ISCLOSED_VAL,method)) {
- return Boolean.valueOf(isClosed());
- }
- if (compare(CLOSE_VAL,method)) {
- if (connection==null) return null; //noop for already closed.
- PooledConnection poolc = this.connection;
- this.connection = null;
- pool.returnConnection(poolc);
- return null;
- } else if (compare(TOSTRING_VAL,method)) {
- return this.toString();
- } else if (compare(GETCONNECTION_VAL,method) && connection!=null) {
- return connection.getConnection();
- } else if (method.getDeclaringClass().equals(XAConnection.class)) {
- try {
- return method.invoke(connection.getXAConnection(),args);
- }catch (Throwable t) {
- if (t instanceof InvocationTargetException) {
- throw t.getCause() != null ? t.getCause() : t;
- } else {
- throw t;
- }
- }
- }
- if (isClosed()) throw new SQLException("Connection has already been closed.");
- if (compare(UNWRAP_VAL,method)) {
- return unwrap((Class<?>)args[0]);
- } else if (compare(ISWRAPPERFOR_VAL,method)) {
- return Boolean.valueOf(this.isWrapperFor((Class<?>)args[0]));
- }
- try {
- PooledConnection poolc = connection;
- if (poolc!=null) {
- return method.invoke(poolc.getConnection(),args);
- } else {
- throw new SQLException("Connection has already been closed.");
- }
- }catch (Throwable t) {
- if (t instanceof InvocationTargetException) {
- throw t.getCause() != null ? t.getCause() : t;
- } else {
- throw t;
- }
- }
- }
-
- public boolean isClosed() {
- return connection==null || connection.isDiscarded();
- }
-
- public PooledConnection getDelegateConnection() {
- return connection;
- }
-
- public ConnectionPool getParentPool() {
- return pool;
- }
-
- @Override
- public String toString() {
- return "ProxyConnection["+(connection!=null?connection.toString():"null")+"]";
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/TrapException.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/TrapException.java
deleted file mode 100644
index 5c597f3..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/TrapException.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.sql.SQLException;
-/**
- * Interceptor that traps any unhandled exception types and throws an exception that has been declared by the method
- * called, or throw a SQLException if it is declared.
- * If the caught exception is not declared, and the method doesn't throw SQLException, then this interceptor will
- * throw a RuntimeException
- *
- */
-public class TrapException extends JdbcInterceptor {
-
-
- public TrapException() {
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- try {
- return super.invoke(proxy, method, args);
- }catch (Exception t) {
- Throwable exception = t;
- if (t instanceof InvocationTargetException && t.getCause() != null) {
- exception = t.getCause();
- if (exception instanceof Error) {
- throw exception;
- }
- }
- Class<?> exceptionClass = exception.getClass();
- if (!isDeclaredException(method, exceptionClass)) {
- if (isDeclaredException(method,SQLException.class)) {
- SQLException sqlx = new SQLException("Uncaught underlying exception.");
- sqlx.initCause(exception);
- exception = sqlx;
- } else {
- RuntimeException rx = new RuntimeException("Uncaught underlying exception.");
- rx.initCause(exception);
- exception = rx;
- }
- }
- throw exception;
- }
-
- }
-
- public boolean isDeclaredException(Method m, Class<?> clazz) {
- for (Class<?> cl : m.getExceptionTypes()) {
- if (cl.equals(clazz) || cl.isAssignableFrom(clazz)) return true;
- }
- return false;
- }
-
- /**
- * no-op for this interceptor. no state is stored.
- */
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- // NOOP
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/Validator.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/Validator.java
deleted file mode 100644
index 70cef5a..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/Validator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-import java.sql.Connection;
-
-/**
- * Interface to be implemented by custom validator classes.
- *
- * @author mpassell
- */
-public interface Validator {
- /**
- * Validate a connection and return a boolean to indicate if it's valid.
- *
- * @param connection the Connection object to test
- * @param validateAction the action used. One of {@link PooledConnection#VALIDATE_BORROW},
- * {@link PooledConnection#VALIDATE_IDLE}, {@link PooledConnection#VALIDATE_INIT} or
- * {@link PooledConnection#VALIDATE_RETURN}
- * @return true if the connection is valid
- */
- public boolean validate(Connection connection, int validateAction);
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/XADataSource.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/XADataSource.java
deleted file mode 100644
index 4bdb198..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/XADataSource.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool;
-
-public class XADataSource extends DataSource implements javax.sql.XADataSource {
-
- /**
- * Constructor for reflection only. A default set of pool properties will be created.
- */
- public XADataSource() {
- super();
- }
-
- /**
- * Constructs a DataSource object wrapping a connection
- * @param poolProperties The pool configuration
- */
- public XADataSource(PoolConfiguration poolProperties) {
- super(poolProperties);
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java
deleted file mode 100644
index e2f1414..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Method;
-
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-
-/**
- * Abstraction interceptor. This component intercepts all calls to create some type of SQL statement.
- * By extending this class, one can intercept queries and update statements by overriding the {@link #createStatement(Object, Method, Object[], Object, long)}
- * method.
- * @version 1.0
- */
-public abstract class AbstractCreateStatementInterceptor extends JdbcInterceptor {
- protected static final String CREATE_STATEMENT = "createStatement";
- protected static final int CREATE_STATEMENT_IDX = 0;
- protected static final String PREPARE_STATEMENT = "prepareStatement";
- protected static final int PREPARE_STATEMENT_IDX = 1;
- protected static final String PREPARE_CALL = "prepareCall";
- protected static final int PREPARE_CALL_IDX = 2;
-
- protected static final String[] STATEMENT_TYPES = {CREATE_STATEMENT, PREPARE_STATEMENT, PREPARE_CALL};
- protected static final int STATEMENT_TYPE_COUNT = STATEMENT_TYPES.length;
-
- protected static final String EXECUTE = "execute";
- protected static final String EXECUTE_QUERY = "executeQuery";
- protected static final String EXECUTE_UPDATE = "executeUpdate";
- protected static final String EXECUTE_BATCH = "executeBatch";
-
- protected static final String[] EXECUTE_TYPES = {EXECUTE, EXECUTE_QUERY, EXECUTE_UPDATE, EXECUTE_BATCH};
-
- public AbstractCreateStatementInterceptor() {
- super();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if (compare(CLOSE_VAL,method)) {
- closeInvoked();
- return super.invoke(proxy, method, args);
- } else {
- boolean process = false;
- process = isStatement(method, process);
- if (process) {
- long start = System.currentTimeMillis();
- Object statement = super.invoke(proxy,method,args);
- long delta = System.currentTimeMillis() - start;
- return createStatement(proxy,method,args,statement, delta);
- } else {
- return super.invoke(proxy,method,args);
- }
- }
- }
-
- /**
- * This method will be invoked after a successful statement creation. This method can choose to return a wrapper
- * around the statement or return the statement itself.
- * If this method returns a wrapper then it should return a wrapper object that implements one of the following interfaces.
- * {@link java.sql.Statement}, {@link java.sql.PreparedStatement} or {@link java.sql.CallableStatement}
- * @param proxy the actual proxy object
- * @param method the method that was called. It will be one of the methods defined in {@link #STATEMENT_TYPES}
- * @param args the arguments to the method
- * @param statement the statement that the underlying connection created
- * @param time Elapsed time
- * @return a {@link java.sql.Statement} object
- */
- public abstract Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time);
-
- /**
- * Method invoked when the operation {@link java.sql.Connection#close()} is invoked.
- */
- public abstract void closeInvoked();
-
- /**
- * Returns true if the method that is being invoked matches one of the statement types.
- *
- * @param method the method being invoked on the proxy
- * @param process boolean result used for recursion
- * @return returns true if the method name matched
- */
- protected boolean isStatement(Method method, boolean process){
- return process(STATEMENT_TYPES, method, process);
- }
-
- /**
- * Returns true if the method that is being invoked matches one of the execute types.
- *
- * @param method the method being invoked on the proxy
- * @param process boolean result used for recursion
- * @return returns true if the method name matched
- */
- protected boolean isExecute(Method method, boolean process){
- return process(EXECUTE_TYPES, method, process);
- }
-
- /*
- * Returns true if the method that is being invoked matches one of the method names passed in
- * @param names list of method names that we want to intercept
- * @param method the method being invoked on the proxy
- * @param process boolean result used for recursion
- * @return returns true if the method name matched
- */
- protected boolean process(String[] names, Method method, boolean process) {
- final String name = method.getName();
- for (int i=0; (!process) && i<names.length; i++) {
- process = compare(names[i],name);
- }
- return process;
- }
-
- /**
- * no-op for this interceptor. no state is stored.
- */
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- // NOOP
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractQueryReport.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractQueryReport.java
deleted file mode 100644
index 374969d..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractQueryReport.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
-/**
- * Abstract class that wraps statements and intercepts query executions.
- *
- */
-public abstract class AbstractQueryReport extends AbstractCreateStatementInterceptor {
- //logger
- private static final Log log = LogFactory.getLog(AbstractQueryReport.class);
-
- /**
- * The threshold in milliseconds. If the query is faster than this, we don't measure it
- */
- protected long threshold = 1000; //don't report queries less than this
-
- /**
- * the constructors that are used to create statement proxies
- */
- protected static final Constructor<?>[] constructors =
- new Constructor[AbstractCreateStatementInterceptor.STATEMENT_TYPE_COUNT];
-
-
- public AbstractQueryReport() {
- super();
- }
-
- /**
- * Invoked when prepareStatement has been called and completed.
- * @param sql - the string used to prepare the statement with
- * @param time - the time it took to invoke prepare
- */
- protected abstract void prepareStatement(String sql, long time);
-
- /**
- * Invoked when prepareCall has been called and completed.
- * @param query - the string used to prepare the statement with
- * @param time - the time it took to invoke prepare
- */
- protected abstract void prepareCall(String query, long time);
-
- /**
- * Invoked when a query execution, a call to execute/executeQuery or executeBatch failed.
- * @param query the query that was executed and failed
- * @param args the arguments to the execution
- * @param name the name of the method used to execute {@link AbstractCreateStatementInterceptor#isExecute(Method, boolean)}
- * @param start the time the query execution started
- * @param t the exception that happened
- * @return - the SQL that was executed or the string &quot;batch&quot; if it was a batch execution
- */
- protected String reportFailedQuery(String query, Object[] args, final String name, long start, Throwable t) {
- //extract the query string
- String sql = (query==null && args!=null && args.length>0)?(String)args[0]:query;
- //if we do batch execution, then we name the query 'batch'
- if (sql==null && compare(EXECUTE_BATCH,name)) {
- sql = "batch";
- }
- return sql;
- }
-
- /**
- * Invoked when a query execution, a call to execute/executeQuery or executeBatch succeeded and was within the timing threshold
- * @param query the query that was executed and failed
- * @param args the arguments to the execution
- * @param name the name of the method used to execute {@link AbstractCreateStatementInterceptor#isExecute(Method, boolean)}
- * @param start the time the query execution started
- * @param delta the time the execution took
- * @return - the SQL that was executed or the string &quot;batch&quot; if it was a batch execution
- */
- protected String reportQuery(String query, Object[] args, final String name, long start, long delta) {
- //extract the query string
- String sql = (query==null && args!=null && args.length>0)?(String)args[0]:query;
- //if we do batch execution, then we name the query 'batch'
- if (sql==null && compare(EXECUTE_BATCH,name)) {
- sql = "batch";
- }
- return sql;
- }
-
- /**
- * Invoked when a query execution, a call to execute/executeQuery or executeBatch succeeded and was exceeded the timing threshold
- * @param query the query that was executed and failed
- * @param args the arguments to the execution
- * @param name the name of the method used to execute {@link AbstractCreateStatementInterceptor#isExecute(Method, boolean)}
- * @param start the time the query execution started
- * @param delta the time the execution took
- * @return - the SQL that was executed or the string &quot;batch&quot; if it was a batch execution
- */
- protected String reportSlowQuery(String query, Object[] args, final String name, long start, long delta) {
- //extract the query string
- String sql = (query==null && args!=null && args.length>0)?(String)args[0]:query;
- //if we do batch execution, then we name the query 'batch'
- if (sql==null && compare(EXECUTE_BATCH,name)) {
- sql = "batch";
- }
- return sql;
- }
-
- /**
- * returns the query measure threshold.
- * This value is in milliseconds. If the query is faster than this threshold than it wont be accounted for
- * @return the threshold in milliseconds
- */
- public long getThreshold() {
- return threshold;
- }
-
- /**
- * Sets the query measurement threshold. The value is in milliseconds.
- * If the query goes faster than this threshold it will not be recorded.
- * @param threshold set to -1 to record every query. Value is in milliseconds.
- */
- public void setThreshold(long threshold) {
- this.threshold = threshold;
- }
-
- /**
- * Creates a constructor for a proxy class, if one doesn't already exist
- * @param idx - the index of the constructor
- * @param clazz - the interface that the proxy will implement
- * @return - returns a constructor used to create new instances
- * @throws NoSuchMethodException Constructor not found
- */
- protected Constructor<?> getConstructor(int idx, Class<?> clazz) throws NoSuchMethodException {
- if (constructors[idx]==null) {
- Class<?> proxyClass = Proxy.getProxyClass(SlowQueryReport.class.getClassLoader(), new Class[] {clazz});
- constructors[idx] = proxyClass.getConstructor(new Class[] { InvocationHandler.class });
- }
- return constructors[idx];
- }
-
- /**
- * Creates a statement interceptor to monitor query response times
- */
- @Override
- public Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time) {
- try {
- Object result = null;
- String name = method.getName();
- String sql = null;
- Constructor<?> constructor = null;
- if (compare(CREATE_STATEMENT,name)) {
- //createStatement
- constructor = getConstructor(CREATE_STATEMENT_IDX,Statement.class);
- }else if (compare(PREPARE_STATEMENT,name)) {
- //prepareStatement
- sql = (String)args[0];
- constructor = getConstructor(PREPARE_STATEMENT_IDX,PreparedStatement.class);
- if (sql!=null) {
- prepareStatement(sql, time);
- }
- }else if (compare(PREPARE_CALL,name)) {
- //prepareCall
- sql = (String)args[0];
- constructor = getConstructor(PREPARE_CALL_IDX,CallableStatement.class);
- prepareCall(sql,time);
- }else {
- //do nothing, might be a future unsupported method
- //so we better bail out and let the system continue
- return statement;
- }
- result = constructor.newInstance(new Object[] { new StatementProxy(statement,sql) });
- return result;
- }catch (Exception x) {
- log.warn("Unable to create statement proxy for slow query report.",x);
- }
- return statement;
- }
-
-
- /**
- * Class to measure query execute time
- *
- */
- protected class StatementProxy implements InvocationHandler {
- protected boolean closed = false;
- protected Object delegate;
- protected final String query;
- public StatementProxy(Object parent, String query) {
- this.delegate = parent;
- this.query = query;
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- //get the name of the method for comparison
- final String name = method.getName();
- //was close invoked?
- boolean close = compare(JdbcInterceptor.CLOSE_VAL,name);
- //allow close to be called multiple times
- if (close && closed) return null;
- //are we calling isClosed?
- if (compare(JdbcInterceptor.ISCLOSED_VAL,name)) return Boolean.valueOf(closed);
- //if we are calling anything else, bail out
- if (closed) throw new SQLException("Statement closed.");
- boolean process = false;
- //check to see if we are about to execute a query
- process = isExecute( method, process);
- //if we are executing, get the current time
- long start = (process)?System.currentTimeMillis():0;
- Object result = null;
- try {
- //execute the query
- result = method.invoke(delegate,args);
- }catch (Throwable t) {
- reportFailedQuery(query,args,name,start,t);
- if (t instanceof InvocationTargetException
- && t.getCause() != null) {
- throw t.getCause();
- } else {
- throw t;
- }
- }
- //measure the time
- long delta = (process)?(System.currentTimeMillis()-start):Long.MIN_VALUE;
- //see if we meet the requirements to measure
- if (delta>threshold) {
- try {
- //report the slow query
- reportSlowQuery(query, args, name, start, delta);
- }catch (Exception t) {
- if (log.isWarnEnabled()) log.warn("Unable to process slow query",t);
- }
- } else if (process) {
- reportQuery(query, args, name, start, delta);
- }
- //perform close cleanup
- if (close) {
- closed=true;
- delegate = null;
- }
- return result;
- }
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java
deleted file mode 100644
index 95049c6..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ConnectionState.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Method;
-import java.sql.SQLException;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.DataSourceFactory;
-import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
-import org.apache.tomcat.jdbc.pool.PoolConfiguration;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-
-/**
- * Interceptor that keep track of connection state to avoid roundtrips to the database.
- * The {@link org.apache.tomcat.jdbc.pool.ConnectionPool} is optimized to do as little work as possible.
- * The pool itself doesn't remember settings like {@link java.sql.Connection#setAutoCommit(boolean)},
- * {@link java.sql.Connection#setReadOnly(boolean)}, {@link java.sql.Connection#setCatalog(String)} or
- * {@link java.sql.Connection#setTransactionIsolation(int)}. It relies on the application to remember how and when
- * these settings have been applied.
- * In the cases where the application code doesn't know or want to keep track of the state, this interceptor helps cache the
- * state, and it also avoids roundtrips to the database asking for it.
- *
- */
-
-public class ConnectionState extends JdbcInterceptor {
- private static final Log log = LogFactory.getLog(ConnectionState.class);
-
- protected final String[] readState = {"getAutoCommit","getTransactionIsolation","isReadOnly","getCatalog"};
- protected final String[] writeState = {"setAutoCommit","setTransactionIsolation","setReadOnly","setCatalog"};
-
- protected Boolean autoCommit = null;
- protected Integer transactionIsolation = null;
- protected Boolean readOnly = null;
- protected String catalog = null;
-
-
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- if (parent==null || con==null) {
- //we are resetting, reset our defaults
- autoCommit = null;
- transactionIsolation = null;
- readOnly = null;
- catalog = null;
- return;
- }
- PoolConfiguration poolProperties = parent.getPoolProperties();
- if (poolProperties.getDefaultTransactionIsolation()!=DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION) {
- try {
- if (transactionIsolation==null || transactionIsolation.intValue()!=poolProperties.getDefaultTransactionIsolation()) {
- con.getConnection().setTransactionIsolation(poolProperties.getDefaultTransactionIsolation());
- transactionIsolation = Integer.valueOf(poolProperties.getDefaultTransactionIsolation());
- }
- }catch (SQLException x) {
- transactionIsolation = null;
- log.error("Unable to reset transaction isolation state to connection.",x);
- }
- }
- if (poolProperties.getDefaultReadOnly()!=null) {
- try {
- if (readOnly==null || readOnly.booleanValue()!=poolProperties.getDefaultReadOnly().booleanValue()) {
- con.getConnection().setReadOnly(poolProperties.getDefaultReadOnly().booleanValue());
- readOnly = poolProperties.getDefaultReadOnly();
- }
- }catch (SQLException x) {
- readOnly = null;
- log.error("Unable to reset readonly state to connection.",x);
- }
- }
- if (poolProperties.getDefaultAutoCommit()!=null) {
- try {
- if (autoCommit==null || autoCommit.booleanValue()!=poolProperties.getDefaultAutoCommit().booleanValue()) {
- con.getConnection().setAutoCommit(poolProperties.getDefaultAutoCommit().booleanValue());
- autoCommit = poolProperties.getDefaultAutoCommit();
- }
- }catch (SQLException x) {
- autoCommit = null;
- log.error("Unable to reset autocommit state to connection.",x);
- }
- }
- if (poolProperties.getDefaultCatalog()!=null) {
- try {
- if (catalog==null || (!catalog.equals(poolProperties.getDefaultCatalog()))) {
- con.getConnection().setCatalog(poolProperties.getDefaultCatalog());
- catalog = poolProperties.getDefaultCatalog();
- }
- }catch (SQLException x) {
- catalog = null;
- log.error("Unable to reset default catalog state to connection.",x);
- }
- }
-
- }
-
-
- @Override
- public void disconnected(ConnectionPool parent, PooledConnection con, boolean finalizing) {
- //we are resetting, reset our defaults
- autoCommit = null;
- transactionIsolation = null;
- readOnly = null;
- catalog = null;
- super.disconnected(parent, con, finalizing);
- }
-
-
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- String name = method.getName();
- boolean read = false;
- int index = -1;
- for (int i=0; (!read) && i<readState.length; i++) {
- read = compare(name,readState[i]);
- if (read) index = i;
- }
- boolean write = false;
- for (int i=0; (!write) && (!read) && i<writeState.length; i++) {
- write = compare(name,writeState[i]);
- if (write) index = i;
- }
- Object result = null;
- if (read) {
- switch (index) {
- case 0:{result = autoCommit; break;}
- case 1:{result = transactionIsolation; break;}
- case 2:{result = readOnly; break;}
- case 3:{result = catalog; break;}
- default: // NOOP
- }
- //return cached result, if we have it
- if (result!=null) return result;
- }
-
- result = super.invoke(proxy, method, args);
- if (read || write) {
- switch (index) {
- case 0:{autoCommit = (Boolean) (read?result:args[0]); break;}
- case 1:{transactionIsolation = (Integer)(read?result:args[0]); break;}
- case 2:{readOnly = (Boolean)(read?result:args[0]); break;}
- case 3:{catalog = (String)(read?result:args[0]); break;}
- }
- }
- return result;
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/QueryTimeoutInterceptor.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/QueryTimeoutInterceptor.java
deleted file mode 100644
index 7aec0b4..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/QueryTimeoutInterceptor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Method;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Map;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorProperty;
-
-public class QueryTimeoutInterceptor extends AbstractCreateStatementInterceptor {
- private static Log log = LogFactory.getLog(QueryTimeoutInterceptor.class);
- int timeout = 1;
-
- @Override
- public void setProperties(Map<String,InterceptorProperty> properties) {
- super.setProperties(properties);
- InterceptorProperty p = properties.get("queryTimeout");
- if (p!=null) timeout = p.getValueAsInt(timeout);
- }
-
- @Override
- public Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time) {
- if (statement instanceof Statement && timeout > 0) {
- Statement s = (Statement)statement;
- try {
- s.setQueryTimeout(timeout);
- }catch (SQLException x) {
- log.warn("[QueryTimeoutInterceptor] Unable to set query timeout:"+x.getMessage(),x);
- }
- }
- return statement;
- }
-
- @Override
- public void closeInvoked() {
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ResetAbandonedTimer.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ResetAbandonedTimer.java
deleted file mode 100644
index 6c6981e..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/ResetAbandonedTimer.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Method;
-
-import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-import org.apache.tomcat.jdbc.pool.ProxyConnection;
-
-/**
- * Class that resets the abandoned timer on any activity on the
- * Connection or any successful query executions.
- * This interceptor is useful for when you have a {@link org.apache.tomcat.jdbc.pool.PoolConfiguration#setRemoveAbandonedTimeout(int)}
- * that is fairly low, and you want to reset the abandoned time each time any operation on the connection is performed
- * This is useful for batch processing programs that use connections for extensive amount of times.
- *
- */
-public class ResetAbandonedTimer extends AbstractQueryReport {
-
- public ResetAbandonedTimer() {
- }
-
- public boolean resetTimer() {
- boolean result = false;
- JdbcInterceptor interceptor = this.getNext();
- while (interceptor!=null && result==false) {
- if (interceptor instanceof ProxyConnection) {
- PooledConnection con = ((ProxyConnection)interceptor).getConnection();
- if (con!=null) {
- con.setTimestamp(System.currentTimeMillis());
- result = true;
- } else {
- break;
- }
- }
- interceptor = interceptor.getNext();
- }
- return result;
- }
-
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- Object result = super.invoke(proxy, method, args);
- resetTimer();
- return result;
- }
-
- @Override
- protected void prepareCall(String query, long time) {
- resetTimer();
- }
-
- @Override
- protected void prepareStatement(String sql, long time) {
- resetTimer();
-
- }
-
- @Override
- public void closeInvoked() {
- resetTimer();
- }
-
- @Override
- protected String reportQuery(String query, Object[] args, String name,long start, long delta) {
- resetTimer();
- return super.reportQuery(query, args, name, start, delta);
- }
-
- @Override
- protected String reportSlowQuery(String query, Object[] args, String name,long start, long delta) {
- resetTimer();
- return super.reportSlowQuery(query, args, name, start, delta);
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
deleted file mode 100644
index 23fa3fa..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
+++ /dev/null
@@ -1,516 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.management.openmbean.CompositeDataSupport;
-import javax.management.openmbean.CompositeType;
-import javax.management.openmbean.OpenDataException;
-import javax.management.openmbean.OpenType;
-import javax.management.openmbean.SimpleType;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorProperty;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-
-/**
- * Slow query report interceptor. Tracks timing of query executions.
- * @version 1.0
- */
-public class SlowQueryReport extends AbstractQueryReport {
- //logger
- private static final Log log = LogFactory.getLog(SlowQueryReport.class);
-
- /**
- * we will be keeping track of query stats on a per pool basis
- */
- protected static final ConcurrentHashMap<String,ConcurrentHashMap<String,QueryStats>> perPoolStats =
- new ConcurrentHashMap<>();
- /**
- * the queries that are used for this interceptor.
- */
- protected volatile ConcurrentHashMap<String,QueryStats> queries = null;
- /**
- * Maximum number of queries we will be storing
- */
- protected int maxQueries= 1000; //don't store more than this amount of queries
-
- /**
- * Flag to enable disable logging of slow queries
- */
- protected boolean logSlow = true;
-
- /**
- * Flag to enable disable logging of failed queries
- */
- protected boolean logFailed = false;
-
- /**
- * Sort QueryStats by last invocation time
- */
- protected final Comparator<QueryStats> queryStatsComparator = new QueryStatsComparator();
-
- /**
- * Returns the query stats for a given pool
- * @param poolname - the name of the pool we want to retrieve stats for
- * @return a hash map containing statistics for 0 to maxQueries
- */
- public static ConcurrentHashMap<String,QueryStats> getPoolStats(String poolname) {
- return perPoolStats.get(poolname);
- }
-
- /**
- * Creates a slow query report interceptor
- */
- public SlowQueryReport() {
- super();
- }
-
- public void setMaxQueries(int maxQueries) {
- this.maxQueries = maxQueries;
- }
-
-
- @Override
- protected String reportFailedQuery(String query, Object[] args, String name, long start, Throwable t) {
- String sql = super.reportFailedQuery(query, args, name, start, t);
- if (this.maxQueries > 0 ) {
- long now = System.currentTimeMillis();
- long delta = now - start;
- QueryStats qs = this.getQueryStats(sql);
- if (qs != null) {
- qs.failure(delta, now);
- if (isLogFailed() && log.isWarnEnabled()) {
- log.warn("Failed Query Report SQL="+sql+"; time="+delta+" ms;");
- }
- }
- }
- return sql;
- }
-
- @Override
- protected String reportQuery(String query, Object[] args, final String name, long start, long delta) {
- String sql = super.reportQuery(query, args, name, start, delta);
- if (this.maxQueries > 0 ) {
- QueryStats qs = this.getQueryStats(sql);
- if (qs != null) qs.add(delta, start);
- }
- return sql;
- }
-
- @Override
- protected String reportSlowQuery(String query, Object[] args, String name, long start, long delta) {
- String sql = super.reportSlowQuery(query, args, name, start, delta);
- if (this.maxQueries > 0 ) {
- QueryStats qs = this.getQueryStats(sql);
- if (qs != null) {
- qs.add(delta, start);
- if (isLogSlow() && log.isWarnEnabled()) {
- log.warn("Slow Query Report SQL="+sql+"; time="+delta+" ms;");
- }
- }
- }
- return sql;
- }
-
- /**
- * invoked when the connection receives the close request
- * Not used for now.
- */
- @Override
- public void closeInvoked() {
- // NOOP
- }
-
- @Override
- public void prepareStatement(String sql, long time) {
- if (this.maxQueries > 0 ) {
- QueryStats qs = getQueryStats(sql);
- if (qs != null) qs.prepare(time);
- }
- }
-
- @Override
- public void prepareCall(String sql, long time) {
- if (this.maxQueries > 0 ) {
- QueryStats qs = getQueryStats(sql);
- if (qs != null) qs.prepare(time);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void poolStarted(ConnectionPool pool) {
- super.poolStarted(pool);
- //see if we already created a map for this pool
- queries = SlowQueryReport.perPoolStats.get(pool.getName());
- if (queries==null) {
- //create the map to hold our stats
- //however TODO we need to improve the eviction
- //selection
- queries = new ConcurrentHashMap<>();
- if (perPoolStats.putIfAbsent(pool.getName(), queries)!=null) {
- //there already was one
- queries = SlowQueryReport.perPoolStats.get(pool.getName());
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void poolClosed(ConnectionPool pool) {
- perPoolStats.remove(pool.getName());
- super.poolClosed(pool);
- }
-
- protected QueryStats getQueryStats(String sql) {
- if (sql==null) sql = "";
- ConcurrentHashMap<String,QueryStats> queries = SlowQueryReport.this.queries;
- if (queries==null) {
- if (log.isWarnEnabled()) log.warn("Connection has already been closed or abandoned");
- return null;
- }
- QueryStats qs = queries.get(sql);
- if (qs == null) {
- qs = new QueryStats(sql);
- if (queries.putIfAbsent(sql,qs)!=null) {
- qs = queries.get(sql);
- } else {
- //we added a new element, see if we need to remove the oldest
- if (queries.size() > maxQueries) {
- removeOldest(queries);
- }
- }
- }
- return qs;
- }
-
- /**
- * Sort QueryStats by last invocation time
- * @param queries The queries map
- */
- protected void removeOldest(ConcurrentHashMap<String,QueryStats> queries) {
- ArrayList<QueryStats> list = new ArrayList<>(queries.values());
- Collections.sort(list, queryStatsComparator);
- int removeIndex = 0;
- while (queries.size() > maxQueries) {
- String sql = list.get(removeIndex).getQuery();
- queries.remove(sql);
- if (log.isDebugEnabled()) log.debug("Removing slow query, capacity reached:"+sql);
- removeIndex++;
- }
- }
-
-
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- super.reset(parent, con);
- if (parent!=null)
- queries = SlowQueryReport.perPoolStats.get(parent.getName());
- else
- queries = null;
- }
-
-
- public boolean isLogSlow() {
- return logSlow;
- }
-
- public void setLogSlow(boolean logSlow) {
- this.logSlow = logSlow;
- }
-
- public boolean isLogFailed() {
- return logFailed;
- }
-
- public void setLogFailed(boolean logFailed) {
- this.logFailed = logFailed;
- }
-
- @Override
- public void setProperties(Map<String, InterceptorProperty> properties) {
- super.setProperties(properties);
- final String threshold = "threshold";
- final String maxqueries= "maxQueries";
- final String logslow = "logSlow";
- final String logfailed = "logFailed";
- InterceptorProperty p1 = properties.get(threshold);
- InterceptorProperty p2 = properties.get(maxqueries);
- InterceptorProperty p3 = properties.get(logslow);
- InterceptorProperty p4 = properties.get(logfailed);
- if (p1!=null) {
- setThreshold(Long.parseLong(p1.getValue()));
- }
- if (p2!=null) {
- setMaxQueries(Integer.parseInt(p2.getValue()));
- }
- if (p3!=null) {
- setLogSlow(Boolean.parseBoolean(p3.getValue()));
- }
- if (p4!=null) {
- setLogFailed(Boolean.parseBoolean(p4.getValue()));
- }
- }
-
-
- public static class QueryStats {
- static final String[] FIELD_NAMES = new String[] {
- "query",
- "nrOfInvocations",
- "maxInvocationTime",
- "maxInvocationDate",
- "minInvocationTime",
- "minInvocationDate",
- "totalInvocationTime",
- "failures",
- "prepareCount",
- "prepareTime",
- "lastInvocation"
- };
-
- static final String[] FIELD_DESCRIPTIONS = new String[] {
- "The SQL query",
- "The number of query invocations, a call to executeXXX",
- "The longest time for this query in milliseconds",
- "The time and date for when the longest query took place",
- "The shortest time for this query in milliseconds",
- "The time and date for when the shortest query took place",
- "The total amount of milliseconds spent executing this query",
- "The number of failures for this query",
- "The number of times this query was prepared (prepareStatement/prepareCall)",
- "The total number of milliseconds spent preparing this query",
- "The date and time of the last invocation"
- };
-
- static final OpenType<?>[] FIELD_TYPES = new OpenType[] {
- SimpleType.STRING,
- SimpleType.INTEGER,
- SimpleType.LONG,
- SimpleType.LONG,
- SimpleType.LONG,
- SimpleType.LONG,
- SimpleType.LONG,
- SimpleType.LONG,
- SimpleType.INTEGER,
- SimpleType.LONG,
- SimpleType.LONG
- };
-
- private final String query;
- private volatile int nrOfInvocations;
- private volatile long maxInvocationTime = Long.MIN_VALUE;
- private volatile long maxInvocationDate;
- private volatile long minInvocationTime = Long.MAX_VALUE;
- private volatile long minInvocationDate;
- private volatile long totalInvocationTime;
- private volatile long failures;
- private volatile int prepareCount;
- private volatile long prepareTime;
- private volatile long lastInvocation = 0;
-
- public static String[] getFieldNames() {
- return FIELD_NAMES;
- }
-
- public static String[] getFieldDescriptions() {
- return FIELD_DESCRIPTIONS;
- }
-
- public static OpenType<?>[] getFieldTypes() {
- return FIELD_TYPES;
- }
-
- @Override
- public String toString() {
- SimpleDateFormat sdf =
- new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US);
- sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
- StringBuilder buf = new StringBuilder("QueryStats[query:");
- buf.append(query);
- buf.append(", nrOfInvocations:");
- buf.append(nrOfInvocations);
- buf.append(", maxInvocationTime:");
- buf.append(maxInvocationTime);
- buf.append(", maxInvocationDate:");
- buf.append(sdf.format(new java.util.Date(maxInvocationDate)));
- buf.append(", minInvocationTime:");
- buf.append(minInvocationTime);
- buf.append(", minInvocationDate:");
- buf.append(sdf.format(new java.util.Date(minInvocationDate)));
- buf.append(", totalInvocationTime:");
- buf.append(totalInvocationTime);
- buf.append(", averageInvocationTime:");
- buf.append((float)totalInvocationTime / (float)nrOfInvocations);
- buf.append(", failures:");
- buf.append(failures);
- buf.append(", prepareCount:");
- buf.append(prepareCount);
- buf.append(", prepareTime:");
- buf.append(prepareTime);
- buf.append("]");
- return buf.toString();
- }
-
- public CompositeDataSupport getCompositeData(final CompositeType type) throws OpenDataException{
- Object[] values = new Object[] {
- query,
- Integer.valueOf(nrOfInvocations),
- Long.valueOf(maxInvocationTime),
- Long.valueOf(maxInvocationDate),
- Long.valueOf(minInvocationTime),
- Long.valueOf(minInvocationDate),
- Long.valueOf(totalInvocationTime),
- Long.valueOf(failures),
- Integer.valueOf(prepareCount),
- Long.valueOf(prepareTime),
- Long.valueOf(lastInvocation)
- };
- return new CompositeDataSupport(type,FIELD_NAMES,values);
- }
-
- public QueryStats(String query) {
- this.query = query;
- }
-
- public void prepare(long invocationTime) {
- prepareCount++;
- prepareTime+=invocationTime;
-
- }
-
- public void add(long invocationTime, long now) {
- //not thread safe, but don't sacrifice performance for this kind of stuff
- maxInvocationTime = Math.max(invocationTime, maxInvocationTime);
- if (maxInvocationTime == invocationTime) {
- maxInvocationDate = now;
- }
- minInvocationTime = Math.min(invocationTime, minInvocationTime);
- if (minInvocationTime==invocationTime) {
- minInvocationDate = now;
- }
- nrOfInvocations++;
- totalInvocationTime+=invocationTime;
- lastInvocation = now;
- }
-
- public void failure(long invocationTime, long now) {
- add(invocationTime,now);
- failures++;
-
- }
-
- public String getQuery() {
- return query;
- }
-
- public int getNrOfInvocations() {
- return nrOfInvocations;
- }
-
- public long getMaxInvocationTime() {
- return maxInvocationTime;
- }
-
- public long getMaxInvocationDate() {
- return maxInvocationDate;
- }
-
- public long getMinInvocationTime() {
- return minInvocationTime;
- }
-
- public long getMinInvocationDate() {
- return minInvocationDate;
- }
-
- public long getTotalInvocationTime() {
- return totalInvocationTime;
- }
-
- @Override
- public int hashCode() {
- return query.hashCode();
- }
-
- @Override
- public boolean equals(Object other) {
- if (other instanceof QueryStats) {
- QueryStats qs = (QueryStats)other;
- return qs.query.equals(this.query);
- }
- return false;
- }
-
- public boolean isOlderThan(QueryStats other) {
- return this.lastInvocation < other.lastInvocation;
- }
- }
-
- /** Compare QueryStats by their lastInvocation value. QueryStats that
- * have never been updated, have a lastInvocation value of {@code 0}
- * which should be handled as the newest possible invocation.
- */
- private static class QueryStatsComparator implements Comparator<QueryStats> {
-
- @Override
- public int compare(QueryStats stats1, QueryStats stats2) {
- return Long.compare(handleZero(stats1.lastInvocation),
- handleZero(stats2.lastInvocation));
- }
-
- private static long handleZero(long value) {
- return value == 0 ? Long.MAX_VALUE : value;
- }
-
- }
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java
deleted file mode 100644
index 60b48a0..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.management.ManagementFactory;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.ListenerNotFoundException;
-import javax.management.MBeanException;
-import javax.management.MBeanNotificationInfo;
-import javax.management.MBeanRegistrationException;
-import javax.management.MalformedObjectNameException;
-import javax.management.NotCompliantMBeanException;
-import javax.management.Notification;
-import javax.management.NotificationBroadcasterSupport;
-import javax.management.NotificationEmitter;
-import javax.management.NotificationFilter;
-import javax.management.NotificationListener;
-import javax.management.ObjectName;
-import javax.management.RuntimeOperationsException;
-import javax.management.openmbean.CompositeData;
-import javax.management.openmbean.CompositeDataSupport;
-import javax.management.openmbean.CompositeType;
-import javax.management.openmbean.OpenDataException;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorProperty;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-/**
- * Publishes data to JMX and provides notifications
- * when failures happen.
- *
- */
-public class SlowQueryReportJmx extends SlowQueryReport implements NotificationEmitter, SlowQueryReportJmxMBean{
- public static final String SLOW_QUERY_NOTIFICATION = "SLOW QUERY";
- public static final String FAILED_QUERY_NOTIFICATION = "FAILED QUERY";
-
- public static final String objectNameAttribute = "objectName";
-
- protected static volatile CompositeType SLOW_QUERY_TYPE;
-
- private static final Log log = LogFactory.getLog(SlowQueryReportJmx.class);
-
-
- protected static final ConcurrentHashMap<String,SlowQueryReportJmxMBean> mbeans =
- new ConcurrentHashMap<>();
-
-
- //==============================JMX STUFF========================
- protected volatile NotificationBroadcasterSupport notifier = new NotificationBroadcasterSupport();
-
- @Override
- public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IllegalArgumentException {
- notifier.addNotificationListener(listener, filter, handback);
- }
-
-
- @Override
- public MBeanNotificationInfo[] getNotificationInfo() {
- return notifier.getNotificationInfo();
- }
-
- @Override
- public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
- notifier.removeNotificationListener(listener);
-
- }
-
- @Override
- public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws ListenerNotFoundException {
- notifier.removeNotificationListener(listener, filter, handback);
-
- }
-
-
- //==============================JMX STUFF========================
-
- protected String poolName = null;
-
- protected static final AtomicLong notifySequence = new AtomicLong(0);
-
- protected boolean notifyPool = true;
-
- protected ConnectionPool pool = null;
-
- protected static CompositeType getCompositeType() {
- if (SLOW_QUERY_TYPE==null) {
- try {
- SLOW_QUERY_TYPE = new CompositeType(
- SlowQueryReportJmx.class.getName(),
- "Composite data type for query statistics",
- QueryStats.getFieldNames(),
- QueryStats.getFieldDescriptions(),
- QueryStats.getFieldTypes());
- }catch (OpenDataException x) {
- log.warn("Unable to initialize composite data type for JMX stats and notifications.",x);
- }
- }
- return SLOW_QUERY_TYPE;
- }
-
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- super.reset(parent, con);
- if (parent!=null) {
- poolName = parent.getName();
- pool = parent;
- registerJmx();
- }
- }
-
-
- @Override
- public void poolClosed(ConnectionPool pool) {
- this.poolName = pool.getName();
- deregisterJmx();
- super.poolClosed(pool);
- }
-
- @Override
- public void poolStarted(ConnectionPool pool) {
- this.pool = pool;
- super.poolStarted(pool);
- this.poolName = pool.getName();
- }
-
- @Override
- protected String reportFailedQuery(String query, Object[] args, String name, long start, Throwable t) {
- query = super.reportFailedQuery(query, args, name, start, t);
- if (isLogFailed()) notifyJmx(query,FAILED_QUERY_NOTIFICATION);
- return query;
- }
-
- protected void notifyJmx(String query, String type) {
- try {
- long sequence = notifySequence.incrementAndGet();
-
- if (isNotifyPool()) {
- if (this.pool!=null && this.pool.getJmxPool()!=null) {
- this.pool.getJmxPool().notify(type, query);
- }
- } else {
- if (notifier!=null) {
- Notification notification =
- new Notification(type,
- this,
- sequence,
- System.currentTimeMillis(),
- query);
-
- notifier.sendNotification(notification);
- }
- }
- } catch (RuntimeOperationsException e) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to send failed query notification.",e);
- }
- }
- }
-
- @Override
- protected String reportSlowQuery(String query, Object[] args, String name, long start, long delta) {
- query = super.reportSlowQuery(query, args, name, start, delta);
- if (isLogSlow()) notifyJmx(query,SLOW_QUERY_NOTIFICATION);
- return query;
- }
-
- /**
- * JMX operation - return the names of all the pools
- * @return - all the names of pools that we have stored data for
- */
- public String[] getPoolNames() {
- Set<String> keys = perPoolStats.keySet();
- return keys.toArray(new String[0]);
- }
-
- /**
- * JMX operation - return the name of the pool
- * @return the name of the pool, unique within the JVM
- */
- public String getPoolName() {
- return poolName;
- }
-
-
- public boolean isNotifyPool() {
- return notifyPool;
- }
-
- public void setNotifyPool(boolean notifyPool) {
- this.notifyPool = notifyPool;
- }
-
- /**
- * JMX operation - remove all stats for this connection pool
- */
- public void resetStats() {
- ConcurrentHashMap<String,QueryStats> queries = perPoolStats.get(poolName);
- if (queries!=null) {
- Iterator<String> it = queries.keySet().iterator();
- while (it.hasNext()) it.remove();
- }
- }
-
- /**
- * JMX operation - returns all the queries we have collected.
- * @return - the slow query report as composite data.
- */
- @Override
- public CompositeData[] getSlowQueriesCD() throws OpenDataException {
- CompositeDataSupport[] result = null;
- ConcurrentHashMap<String,QueryStats> queries = perPoolStats.get(poolName);
- if (queries!=null) {
- Set<Map.Entry<String,QueryStats>> stats = queries.entrySet();
- if (stats!=null) {
- result = new CompositeDataSupport[stats.size()];
- Iterator<Map.Entry<String,QueryStats>> it = stats.iterator();
- int pos = 0;
- while (it.hasNext()) {
- Map.Entry<String,QueryStats> entry = it.next();
- QueryStats qs = entry.getValue();
- result[pos++] = qs.getCompositeData(getCompositeType());
- }
- }
- }
- return result;
- }
-
- protected void deregisterJmx() {
- try {
- if (mbeans.remove(poolName)!=null) {
- ObjectName oname = getObjectName(getClass(),poolName);
- ManagementFactory.getPlatformMBeanServer().unregisterMBean(oname);
- }
- } catch (MBeanRegistrationException e) {
- log.debug("Jmx deregistration failed.",e);
- } catch (InstanceNotFoundException e) {
- log.debug("Jmx deregistration failed.",e);
- } catch (MalformedObjectNameException e) {
- log.warn("Jmx deregistration failed.",e);
- } catch (RuntimeOperationsException e) {
- log.warn("Jmx deregistration failed.",e);
- }
-
- }
-
-
- public ObjectName getObjectName(Class<?> clazz, String poolName) throws MalformedObjectNameException {
- ObjectName oname;
- Map<String,InterceptorProperty> properties = getProperties();
- if (properties != null && properties.containsKey(objectNameAttribute)) {
- oname = new ObjectName(properties.get(objectNameAttribute).getValue());
- } else {
- oname = new ObjectName(ConnectionPool.POOL_JMX_TYPE_PREFIX+clazz.getName()+",name=" + poolName);
- }
- return oname;
- }
-
- protected void registerJmx() {
- try {
- //only if we notify the pool itself
- if (isNotifyPool()) {
-
- } else if (getCompositeType()!=null) {
- ObjectName oname = getObjectName(getClass(),poolName);
- if (mbeans.putIfAbsent(poolName, this)==null) {
- ManagementFactory.getPlatformMBeanServer().registerMBean(this, oname);
- }
- } else {
- log.warn(SlowQueryReport.class.getName()+ "- No JMX support, composite type was not found.");
- }
- } catch (MalformedObjectNameException e) {
- log.error("Jmx registration failed, no JMX data will be exposed for the query stats.",e);
- } catch (RuntimeOperationsException e) {
- log.error("Jmx registration failed, no JMX data will be exposed for the query stats.",e);
- } catch (MBeanException e) {
- log.error("Jmx registration failed, no JMX data will be exposed for the query stats.",e);
- } catch (InstanceAlreadyExistsException e) {
- log.error("Jmx registration failed, no JMX data will be exposed for the query stats.",e);
- } catch (NotCompliantMBeanException e) {
- log.error("Jmx registration failed, no JMX data will be exposed for the query stats.",e);
- }
- }
-
- @Override
- public void setProperties(Map<String, InterceptorProperty> properties) {
- super.setProperties(properties);
- final String threshold = "notifyPool";
- InterceptorProperty p1 = properties.get(threshold);
- if (p1!=null) {
- this.setNotifyPool(Boolean.parseBoolean(p1.getValue()));
- }
- }
-
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmxMBean.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmxMBean.java
deleted file mode 100644
index 202d06e..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmxMBean.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/* 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.tomcat.jdbc.pool.interceptor;
-
-import javax.management.openmbean.CompositeData;
-import javax.management.openmbean.OpenDataException;
-
-public interface SlowQueryReportJmxMBean {
- public CompositeData[] getSlowQueriesCD() throws OpenDataException;
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementCache.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementCache.java
deleted file mode 100644
index e98d3b6..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementCache.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/* 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.sql.ResultSet;
-import java.sql.Statement;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorProperty;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-
-/**
- * Interceptor that caches {@code PreparedStatement} and/or
- * {@code CallableStatement} instances on a connection.
- */
-public class StatementCache extends StatementDecoratorInterceptor {
- protected static final String[] ALL_TYPES = new String[] {PREPARE_STATEMENT,PREPARE_CALL};
- protected static final String[] CALLABLE_TYPE = new String[] {PREPARE_CALL};
- protected static final String[] PREPARED_TYPE = new String[] {PREPARE_STATEMENT};
- protected static final String[] NO_TYPE = new String[] {};
-
- protected static final String STATEMENT_CACHE_ATTR = StatementCache.class.getName() + ".cache";
-
- /*begin properties for the statement cache*/
- private boolean cachePrepared = true;
- private boolean cacheCallable = false;
- private int maxCacheSize = 50;
- private PooledConnection pcon;
- private String[] types;
-
-
- public boolean isCachePrepared() {
- return cachePrepared;
- }
-
- public boolean isCacheCallable() {
- return cacheCallable;
- }
-
- public int getMaxCacheSize() {
- return maxCacheSize;
- }
-
- public String[] getTypes() {
- return types;
- }
-
- public AtomicInteger getCacheSize() {
- return cacheSize;
- }
-
- @Override
- public void setProperties(Map<String, InterceptorProperty> properties) {
- super.setProperties(properties);
- InterceptorProperty p = properties.get("prepared");
- if (p!=null) cachePrepared = p.getValueAsBoolean(cachePrepared);
- p = properties.get("callable");
- if (p!=null) cacheCallable = p.getValueAsBoolean(cacheCallable);
- p = properties.get("max");
- if (p!=null) maxCacheSize = p.getValueAsInt(maxCacheSize);
- if (cachePrepared && cacheCallable) {
- this.types = ALL_TYPES;
- } else if (cachePrepared) {
- this.types = PREPARED_TYPE;
- } else if (cacheCallable) {
- this.types = CALLABLE_TYPE;
- } else {
- this.types = NO_TYPE;
- }
-
- }
- /*end properties for the statement cache*/
-
- /*begin the cache size*/
- private static ConcurrentHashMap<ConnectionPool,AtomicInteger> cacheSizeMap =
- new ConcurrentHashMap<>();
-
- private AtomicInteger cacheSize;
-
- @Override
- public void poolStarted(ConnectionPool pool) {
- cacheSizeMap.putIfAbsent(pool, new AtomicInteger(0));
- super.poolStarted(pool);
- }
-
- @Override
- public void poolClosed(ConnectionPool pool) {
- cacheSizeMap.remove(pool);
- super.poolClosed(pool);
- }
- /*end the cache size*/
-
- /*begin the actual statement cache*/
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- super.reset(parent, con);
- if (parent==null) {
- cacheSize = null;
- this.pcon = null;
- } else {
- cacheSize = cacheSizeMap.get(parent);
- this.pcon = con;
- if (!pcon.getAttributes().containsKey(STATEMENT_CACHE_ATTR)) {
- ConcurrentHashMap<CacheKey,CachedStatement> cache =
- new ConcurrentHashMap<>();
- pcon.getAttributes().put(STATEMENT_CACHE_ATTR,cache);
- }
- }
- }
-
- @Override
- public void disconnected(ConnectionPool parent, PooledConnection con, boolean finalizing) {
- @SuppressWarnings("unchecked")
- ConcurrentHashMap<CacheKey,CachedStatement> statements =
- (ConcurrentHashMap<CacheKey,CachedStatement>)con.getAttributes().get(STATEMENT_CACHE_ATTR);
-
- if (statements!=null) {
- for (Map.Entry<CacheKey, CachedStatement> p : statements.entrySet()) {
- closeStatement(p.getValue());
- }
- statements.clear();
- }
-
- super.disconnected(parent, con, finalizing);
- }
-
- public void closeStatement(CachedStatement st) {
- if (st==null) return;
- st.forceClose();
- }
-
- @Override
- protected Object createDecorator(Object proxy, Method method, Object[] args,
- Object statement, Constructor<?> constructor, String sql)
- throws InstantiationException, IllegalAccessException, InvocationTargetException {
- boolean process = process(this.types, method, false);
- if (process) {
- Object result = null;
- CachedStatement statementProxy = new CachedStatement((Statement)statement,sql);
- result = constructor.newInstance(new Object[] { statementProxy });
- statementProxy.setActualProxy(result);
- statementProxy.setConnection(proxy);
- statementProxy.setConstructor(constructor);
- statementProxy.setCacheKey(createCacheKey(method, args));
- return result;
- } else {
- return super.createDecorator(proxy, method, args, statement, constructor, sql);
- }
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- boolean process = process(this.types, method, false);
- if (process && args.length>0 && args[0] instanceof String) {
- CachedStatement statement = isCached(method, args);
- if (statement!=null) {
- //remove it from the cache since it is used
- removeStatement(statement);
- return statement.getActualProxy();
- } else {
- return super.invoke(proxy, method, args);
- }
- } else {
- return super.invoke(proxy,method,args);
- }
- }
-
- public CachedStatement isCached(Method method, Object[] args) {
- @SuppressWarnings("unchecked")
- ConcurrentHashMap<CacheKey,CachedStatement> cache =
- (ConcurrentHashMap<CacheKey,CachedStatement>)pcon.getAttributes().get(STATEMENT_CACHE_ATTR);
- return cache.get(createCacheKey(method, args));
- }
-
- public boolean cacheStatement(CachedStatement proxy) {
- @SuppressWarnings("unchecked")
- ConcurrentHashMap<CacheKey,CachedStatement> cache =
- (ConcurrentHashMap<CacheKey,CachedStatement>)pcon.getAttributes().get(STATEMENT_CACHE_ATTR);
- if (proxy.getCacheKey()==null) {
- return false;
- } else if (cache.containsKey(proxy.getCacheKey())) {
- return false;
- } else if (cacheSize.get()>=maxCacheSize) {
- return false;
- } else if (cacheSize.incrementAndGet()>maxCacheSize) {
- cacheSize.decrementAndGet();
- return false;
- } else {
- //cache the statement
- cache.put(proxy.getCacheKey(), proxy);
- return true;
- }
- }
-
- public boolean removeStatement(CachedStatement proxy) {
- @SuppressWarnings("unchecked")
- ConcurrentHashMap<CacheKey,CachedStatement> cache =
- (ConcurrentHashMap<CacheKey,CachedStatement>)pcon.getAttributes().get(STATEMENT_CACHE_ATTR);
- if (cache.remove(proxy.getCacheKey()) != null) {
- cacheSize.decrementAndGet();
- return true;
- } else {
- return false;
- }
- }
- /*end the actual statement cache*/
-
-
- protected class CachedStatement extends StatementDecoratorInterceptor.StatementProxy<Statement> {
- boolean cached = false;
- CacheKey key;
- public CachedStatement(Statement parent, String sql) {
- super(parent, sql);
- }
-
- @Override
- public void closeInvoked() {
- //should we cache it
- boolean shouldClose = true;
- if (cacheSize.get() < maxCacheSize) {
- //cache a proxy so that we don't reuse the facade
- CachedStatement proxy = new CachedStatement(getDelegate(),getSql());
- proxy.setCacheKey(getCacheKey());
- try {
- // clear Resultset
- ResultSet result = getDelegate().getResultSet();
- if (result != null && !result.isClosed()) {
- result.close();
- }
- //create a new facade
- Object actualProxy = getConstructor().newInstance(new Object[] { proxy });
- proxy.setActualProxy(actualProxy);
- proxy.setConnection(getConnection());
- proxy.setConstructor(getConstructor());
- if (cacheStatement(proxy)) {
- proxy.cached = true;
- shouldClose = false;
- }
- } catch (Exception x) {
- removeStatement(proxy);
- }
- }
- if (shouldClose) {
- super.closeInvoked();
- }
- closed = true;
- delegate = null;
-
- }
-
- public void forceClose() {
- removeStatement(this);
- super.closeInvoked();
- }
-
- public CacheKey getCacheKey() {
- return key;
- }
-
- public void setCacheKey(CacheKey cacheKey) {
- key = cacheKey;
- }
-
- }
-
- protected CacheKey createCacheKey(Method method, Object[] args) {
- return createCacheKey(method.getName(), args);
- }
-
- protected CacheKey createCacheKey(String methodName, Object[] args) {
- CacheKey key = null;
- if (compare(PREPARE_STATEMENT, methodName)) {
- key = new CacheKey(PREPARE_STATEMENT, args);
- } else if (compare(PREPARE_CALL, methodName)) {
- key = new CacheKey(PREPARE_CALL, args);
- }
- return key;
- }
-
-
- private static final class CacheKey {
- private final String stmtType;
- private final Object[] args;
- private CacheKey(String type, Object[] methodArgs) {
- stmtType = type;
- args = methodArgs;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + Arrays.hashCode(args);
- result = prime * result
- + ((stmtType == null) ? 0 : stmtType.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- CacheKey other = (CacheKey) obj;
- if (!Arrays.equals(args, other.args))
- return false;
- if (stmtType == null) {
- if (other.stmtType != null)
- return false;
- } else if (!stmtType.equals(other.stmtType))
- return false;
- return true;
- }
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementDecoratorInterceptor.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementDecoratorInterceptor.java
deleted file mode 100644
index e3b160b..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementDecoratorInterceptor.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-/**
- * Implementation of <b>JdbcInterceptor</b> that proxies resultSets and statements.
- * @author Guillermo Fernandes
- */
-public class StatementDecoratorInterceptor extends AbstractCreateStatementInterceptor {
-
- private static final Log logger = LogFactory.getLog(StatementDecoratorInterceptor.class);
-
- protected static final String EXECUTE_QUERY = "executeQuery";
- protected static final String GET_GENERATED_KEYS = "getGeneratedKeys";
- protected static final String GET_RESULTSET = "getResultSet";
-
- protected static final String[] RESULTSET_TYPES = {EXECUTE_QUERY, GET_GENERATED_KEYS, GET_RESULTSET};
-
- /**
- * the constructors that are used to create statement proxies
- */
- protected static final Constructor<?>[] constructors = new Constructor[AbstractCreateStatementInterceptor.STATEMENT_TYPE_COUNT];
-
- /**
- * the constructor to create the resultSet proxies
- */
- protected static Constructor<?> resultSetConstructor = null;
-
- @Override
- public void closeInvoked() {
- // nothing to do
- }
-
- /**
- * Creates a constructor for a proxy class, if one doesn't already exist
- *
- * @param idx
- * - the index of the constructor
- * @param clazz
- * - the interface that the proxy will implement
- * @return - returns a constructor used to create new instances
- * @throws NoSuchMethodException Constructor not found
- */
- protected Constructor<?> getConstructor(int idx, Class<?> clazz) throws NoSuchMethodException {
- if (constructors[idx] == null) {
- Class<?> proxyClass = Proxy.getProxyClass(StatementDecoratorInterceptor.class.getClassLoader(),
- new Class[] { clazz });
- constructors[idx] = proxyClass.getConstructor(new Class[] { InvocationHandler.class });
- }
- return constructors[idx];
- }
-
- protected Constructor<?> getResultSetConstructor() throws NoSuchMethodException {
- if (resultSetConstructor == null) {
- Class<?> proxyClass = Proxy.getProxyClass(StatementDecoratorInterceptor.class.getClassLoader(),
- new Class[] { ResultSet.class });
- resultSetConstructor = proxyClass.getConstructor(new Class[] { InvocationHandler.class });
- }
- return resultSetConstructor;
- }
-
- /**
- * Creates a statement interceptor to monitor query response times
- */
- @Override
- public Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time) {
- try {
- String name = method.getName();
- Constructor<?> constructor = null;
- String sql = null;
- if (compare(CREATE_STATEMENT, name)) {
- // createStatement
- constructor = getConstructor(CREATE_STATEMENT_IDX, Statement.class);
- } else if (compare(PREPARE_STATEMENT, name)) {
- // prepareStatement
- constructor = getConstructor(PREPARE_STATEMENT_IDX, PreparedStatement.class);
- sql = (String)args[0];
- } else if (compare(PREPARE_CALL, name)) {
- // prepareCall
- constructor = getConstructor(PREPARE_CALL_IDX, CallableStatement.class);
- sql = (String)args[0];
- } else {
- // do nothing, might be a future unsupported method
- // so we better bail out and let the system continue
- return statement;
- }
- return createDecorator(proxy, method, args, statement, constructor, sql);
- } catch (Exception x) {
- if (x instanceof InvocationTargetException) {
- Throwable cause = x.getCause();
- if (cause instanceof ThreadDeath) {
- throw (ThreadDeath) cause;
- }
- if (cause instanceof VirtualMachineError) {
- throw (VirtualMachineError) cause;
- }
- }
- logger.warn("Unable to create statement proxy for slow query report.", x);
- }
- return statement;
- }
-
- /**
- * Creates a proxy for a Statement.
- *
- * @param proxy The proxy object on which the method that triggered
- * the creation of the statement was called.
- * @param method The method that was called on the proxy
- * @param args The arguments passed as part of the method call to
- * the proxy
- * @param statement The statement object that is to be proxied
- * @param constructor The constructor for the desired proxy
- * @param sql The sql of of the statement
- *
- * @return A new proxy for the Statement
- * @throws InstantiationException Couldn't instantiate object
- * @throws IllegalAccessException Inaccessible constructor
- * @throws InvocationTargetException Exception thrown from constructor
- */
- protected Object createDecorator(Object proxy, Method method, Object[] args,
- Object statement, Constructor<?> constructor, String sql)
- throws InstantiationException, IllegalAccessException, InvocationTargetException {
- Object result = null;
- StatementProxy<Statement> statementProxy =
- new StatementProxy<>((Statement)statement,sql);
- result = constructor.newInstance(new Object[] { statementProxy });
- statementProxy.setActualProxy(result);
- statementProxy.setConnection(proxy);
- statementProxy.setConstructor(constructor);
- return result;
- }
-
- protected boolean isExecuteQuery(String methodName) {
- return EXECUTE_QUERY.equals(methodName);
- }
-
- protected boolean isExecuteQuery(Method method) {
- return isExecuteQuery(method.getName());
- }
-
- protected boolean isResultSet(Method method, boolean process) {
- return process(RESULTSET_TYPES, method, process);
- }
-
- /**
- * Class to measure query execute time.
- */
- protected class StatementProxy<T extends java.sql.Statement> implements InvocationHandler {
-
- protected boolean closed = false;
- protected T delegate;
- private Object actualProxy;
- private Object connection;
- private String sql;
- private Constructor<?> constructor;
-
- public StatementProxy(T delegate, String sql) {
- this.delegate = delegate;
- this.sql = sql;
- }
- public T getDelegate() {
- return this.delegate;
- }
-
- public String getSql() {
- return sql;
- }
-
- public void setConnection(Object proxy) {
- this.connection = proxy;
- }
- public Object getConnection() {
- return this.connection;
- }
-
- public void setActualProxy(Object proxy){
- this.actualProxy = proxy;
- }
- public Object getActualProxy() {
- return this.actualProxy;
- }
-
-
- public Constructor<?> getConstructor() {
- return constructor;
- }
- public void setConstructor(Constructor<?> constructor) {
- this.constructor = constructor;
- }
- public void closeInvoked() {
- if (getDelegate()!=null) {
- try {
- getDelegate().close();
- }catch (SQLException ignore) {
- }
- }
- closed = true;
- delegate = null;
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if (compare(TOSTRING_VAL,method)) {
- return toString();
- }
- // was close invoked?
- boolean close = compare(CLOSE_VAL, method);
- // allow close to be called multiple times
- if (close && closed)
- return null;
- // are we calling isClosed?
- if (compare(ISCLOSED_VAL, method))
- return Boolean.valueOf(closed);
- // if we are calling anything else, bail out
- if (closed)
- throw new SQLException("Statement closed.");
- if (compare(GETCONNECTION_VAL,method)){
- return connection;
- }
- boolean process = false;
- process = isResultSet(method, process);
- // check to see if we are about to execute a query
- // if we are executing, get the current time
- Object result = null;
- try {
- // perform close cleanup
- if (close) {
- closeInvoked();
- } else {
- // execute the query
- result = method.invoke(delegate, args);
- }
- } catch (Throwable t) {
- if (t instanceof InvocationTargetException
- && t.getCause() != null) {
- throw t.getCause();
- } else {
- throw t;
- }
- }
- if (process && result != null) {
- Constructor<?> cons = getResultSetConstructor();
- result = cons.newInstance(new Object[]{new ResultSetProxy(actualProxy, result)});
- }
- return result;
- }
-
- @Override
- public String toString() {
- StringBuffer buf = new StringBuffer(StatementProxy.class.getName());
- buf.append("[Proxy=");
- buf.append(System.identityHashCode(this));
- buf.append("; Sql=");
- buf.append(getSql());
- buf.append("; Delegate=");
- buf.append(getDelegate());
- buf.append("; Connection=");
- buf.append(getConnection());
- buf.append("]");
- return buf.toString();
- }
- }
-
- protected class ResultSetProxy implements InvocationHandler {
-
- private Object st;
- private Object delegate;
-
- public ResultSetProxy(Object st, Object delegate) {
- this.st = st;
- this.delegate = delegate;
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if (method.getName().equals("getStatement")) {
- return this.st;
- } else {
- try {
- return method.invoke(this.delegate, args);
- } catch (Throwable t) {
- if (t instanceof InvocationTargetException
- && t.getCause() != null) {
- throw t.getCause();
- } else {
- throw t;
- }
- }
- }
- }
- }
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java
deleted file mode 100644
index 6535139..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/*
- * 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.tomcat.jdbc.pool.interceptor;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Method;
-import java.sql.Statement;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.PoolProperties;
-import org.apache.tomcat.jdbc.pool.PooledConnection;
-
-/**
- * Keeps track of statements associated with a connection and invokes close upon {@link java.sql.Connection#close()}
- * Useful for applications that dont close the associated statements after being done with a connection.
- *
- */
-public class StatementFinalizer extends AbstractCreateStatementInterceptor {
- private static final Log log = LogFactory.getLog(StatementFinalizer.class);
-
- protected List<StatementEntry> statements = new LinkedList<>();
-
- private boolean logCreationStack = false;
-
- @Override
- public Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time) {
- try {
- if (statement instanceof Statement)
- statements.add(new StatementEntry((Statement)statement));
- }catch (ClassCastException x) {
- //ignore this one
- }
- return statement;
- }
-
- @SuppressWarnings("null") // st is not null when used
- @Override
- public void closeInvoked() {
- while (statements.size()>0) {
- StatementEntry ws = statements.remove(0);
- Statement st = ws.getStatement();
- boolean shallClose = false;
- try {
- shallClose = st!=null && (!st.isClosed());
- if (shallClose) {
- st.close();
- }
- } catch (Exception ignore) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to closed statement upon connection close.",ignore);
- }
- } finally {
- if (logCreationStack && shallClose) {
- log.warn("Statement created, but was not closed at:", ws.getAllocationStack());
- }
- }
- }
- }
-
- @Override
- public void setProperties(Map<String, PoolProperties.InterceptorProperty> properties) {
- super.setProperties(properties);
-
- PoolProperties.InterceptorProperty logProperty = properties.get("trace");
- if (null != logProperty) {
- logCreationStack = logProperty.getValueAsBoolean(logCreationStack);
- }
- }
-
- @Override
- public void reset(ConnectionPool parent, PooledConnection con) {
- statements.clear();
- super.reset(parent, con);
- }
-
- protected class StatementEntry {
- private WeakReference<Statement> statement;
- private Throwable allocationStack;
-
- public StatementEntry(Statement statement) {
- this.statement = new WeakReference<>(statement);
- if (logCreationStack) {
- this.allocationStack = new Throwable();
- }
- }
-
- public Statement getStatement() {
- return statement.get();
- }
-
- public Throwable getAllocationStack() {
- return allocationStack;
- }
- }
-
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml
deleted file mode 100644
index 0cca7ad..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START=======================================================
- openecomp
- ================================================================================
- Copyright (C) 2016 - 2017 AT&T
- ================================================================================
- 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.
- ============LICENSE_END=========================================================
- -->
-
-<!--
- 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.
--->
-<mbeans-descriptors>
-
- <mbean description="Reports " domain="tomcat.jdbc" group="jdbc-pool" name="SlowQueryReportJmx"
- type="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx">
-
- <attribute description="The name of the connection pool this Jmx bean is representing" name="poolName" type="java.lang.String" writeable="false"/>
- <attribute description="List of all registered connections pools" name="poolNames" type="[java.lang.String;" writeable="false"/>
- <attribute description="All the recorded query stats. " name="slowQueriesCD" type="[javax.management.openmbean.CompositeData;" writeable="false"/>
- <operation description="Clears all the query stats" impact="ACTION" name="resetStats" returnType="void"/>
-
- <notification description="Notification sent out by the slow query report when a query exceeds the threshold" name="slow-query">
- <notification-type>Slow query</notification-type>
- </notification>
-
- <notification description="Notification sent out by the slow query report when a query fails execution" name="failed-query">
- <notification-type>Failed query execution</notification-type>
- </notification>
- </mbean>
-</mbeans-descriptors>
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
deleted file mode 100644
index 9044bae..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
+++ /dev/null
@@ -1,960 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/* 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.tomcat.jdbc.pool.jmx;
-
-import java.util.Properties;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.management.MBeanNotificationInfo;
-import javax.management.Notification;
-import javax.management.NotificationBroadcasterSupport;
-import javax.management.NotificationListener;
-
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jdbc.pool.PoolConfiguration;
-import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorDefinition;
-import org.apache.tomcat.jdbc.pool.PoolUtilities;
-import org.apache.tomcat.jdbc.pool.Validator;
-
-public class ConnectionPool extends NotificationBroadcasterSupport implements ConnectionPoolMBean {
- /**
- * logger
- */
- private static final Log log = LogFactory.getLog(ConnectionPool.class);
-
- /**
- * the connection pool
- */
- protected org.apache.tomcat.jdbc.pool.ConnectionPool pool = null;
- /**
- * sequence for JMX notifications
- */
- protected AtomicInteger sequence = new AtomicInteger(0);
-
- /**
- * Listeners that are local and interested in our notifications, no need for JMX
- */
- protected ConcurrentLinkedQueue<NotificationListener> listeners =
- new ConcurrentLinkedQueue<>();
-
- public ConnectionPool(org.apache.tomcat.jdbc.pool.ConnectionPool pool) {
- super();
- this.pool = pool;
- }
-
- public org.apache.tomcat.jdbc.pool.ConnectionPool getPool() {
- return pool;
- }
-
- public PoolConfiguration getPoolProperties() {
- return pool.getPoolProperties();
- }
-
- //=================================================================
- // NOTIFICATION INFO
- //=================================================================
- public static final String NOTIFY_INIT = "INIT FAILED";
- public static final String NOTIFY_CONNECT = "CONNECTION FAILED";
- public static final String NOTIFY_ABANDON = "CONNECTION ABANDONED";
- public static final String SLOW_QUERY_NOTIFICATION = "SLOW QUERY";
- public static final String FAILED_QUERY_NOTIFICATION = "FAILED QUERY";
- public static final String SUSPECT_ABANDONED_NOTIFICATION = "SUSPECT CONNECTION ABANDONED";
- public static final String POOL_EMPTY = "POOL EMPTY";
- public static final String SUSPECT_RETURNED_NOTIFICATION = "SUSPECT CONNECTION RETURNED";
-
- @Override
- public MBeanNotificationInfo[] getNotificationInfo() {
- MBeanNotificationInfo[] pres = super.getNotificationInfo();
- MBeanNotificationInfo[] loc = getDefaultNotificationInfo();
- MBeanNotificationInfo[] aug = new MBeanNotificationInfo[pres.length + loc.length];
- if (pres.length>0) System.arraycopy(pres, 0, aug, 0, pres.length);
- if (loc.length >0) System.arraycopy(loc, 0, aug, pres.length, loc.length);
- return aug;
- }
-
- public static MBeanNotificationInfo[] getDefaultNotificationInfo() {
- String[] types = new String[] {NOTIFY_INIT, NOTIFY_CONNECT, NOTIFY_ABANDON, SLOW_QUERY_NOTIFICATION,
- FAILED_QUERY_NOTIFICATION, SUSPECT_ABANDONED_NOTIFICATION, POOL_EMPTY, SUSPECT_RETURNED_NOTIFICATION};
- String name = Notification.class.getName();
- String description = "A connection pool error condition was met.";
- MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);
- return new MBeanNotificationInfo[] {info};
- }
-
- /**
- * Return true if the notification was sent successfully, false otherwise.
- * @param type The notification type
- * @param message The message
- * @return true if the notification succeeded
- */
- public boolean notify(final String type, String message) {
- try {
- Notification n = new Notification(
- type,
- this,
- sequence.incrementAndGet(),
- System.currentTimeMillis(),
- "["+type+"] "+message);
- sendNotification(n);
- for (NotificationListener listener : listeners) {
- listener.handleNotification(n,this);
- }
- return true;
- }catch (Exception x) {
- if (log.isDebugEnabled()) {
- log.debug("Notify failed. Type="+type+"; Message="+message,x);
- }
- return false;
- }
-
- }
-
- public void addListener(NotificationListener list) {
- listeners.add(list);
- }
-
- public boolean removeListener(NotificationListener list) {
- return listeners.remove(list);
- }
-
- //=================================================================
- // POOL STATS
- //=================================================================
-
- @Override
- public int getSize() {
- return pool.getSize();
- }
-
- @Override
- public int getIdle() {
- return pool.getIdle();
- }
-
- @Override
- public int getActive() {
- return pool.getActive();
- }
-
- @Override
- public int getNumIdle() {
- return getIdle();
- }
-
- @Override
- public int getNumActive() {
- return getActive();
- }
-
- @Override
- public int getWaitCount() {
- return pool.getWaitCount();
- }
-
- @Override
- public long getBorrowedCount() {
- return pool.getBorrowedCount();
- }
-
- @Override
- public long getReturnedCount() {
- return pool.getReturnedCount();
- }
-
- @Override
- public long getCreatedCount() {
- return pool.getCreatedCount();
- }
-
- @Override
- public long getReleasedCount() {
- return pool.getReleasedCount();
- }
-
- @Override
- public long getReconnectedCount() {
- return pool.getReconnectedCount();
- }
-
- @Override
- public long getRemoveAbandonedCount() {
- return pool.getRemoveAbandonedCount();
- }
-
- @Override
- public long getReleasedIdleCount() {
- return pool.getReleasedIdleCount();
- }
-
- //=================================================================
- // POOL OPERATIONS
- //=================================================================
- @Override
- public void checkIdle() {
- pool.checkIdle();
- }
-
- @Override
- public void checkAbandoned() {
- pool.checkAbandoned();
- }
-
- @Override
- public void testIdle() {
- pool.testAllIdle();
- }
-
- @Override
- public void resetStats() {
- pool.resetStats();
- }
-
- //=================================================================
- // POOL PROPERTIES
- //=================================================================
- //=========================================================
- // PROPERTIES / CONFIGURATION
- //=========================================================
-
-
- @Override
- public String getConnectionProperties() {
- return getPoolProperties().getConnectionProperties();
- }
-
- @Override
- public Properties getDbProperties() {
- return PoolUtilities.cloneWithoutPassword(getPoolProperties().getDbProperties());
- }
-
- @Override
- public String getDefaultCatalog() {
- return getPoolProperties().getDefaultCatalog();
- }
-
- @Override
- public int getDefaultTransactionIsolation() {
- return getPoolProperties().getDefaultTransactionIsolation();
- }
-
- @Override
- public String getDriverClassName() {
- return getPoolProperties().getDriverClassName();
- }
-
-
- @Override
- public int getInitialSize() {
- return getPoolProperties().getInitialSize();
- }
-
- @Override
- public String getInitSQL() {
- return getPoolProperties().getInitSQL();
- }
-
- @Override
- public String getJdbcInterceptors() {
- return getPoolProperties().getJdbcInterceptors();
- }
-
- @Override
- public int getMaxActive() {
- return getPoolProperties().getMaxActive();
- }
-
- @Override
- public int getMaxIdle() {
- return getPoolProperties().getMaxIdle();
- }
-
- @Override
- public int getMaxWait() {
- return getPoolProperties().getMaxWait();
- }
-
- @Override
- public int getMinEvictableIdleTimeMillis() {
- return getPoolProperties().getMinEvictableIdleTimeMillis();
- }
-
- @Override
- public int getMinIdle() {
- return getPoolProperties().getMinIdle();
- }
-
- @Override
- public long getMaxAge() {
- return getPoolProperties().getMaxAge();
- }
-
- @Override
- public String getName() {
- return this.getPoolName();
- }
-
- @Override
- public int getNumTestsPerEvictionRun() {
- return getPoolProperties().getNumTestsPerEvictionRun();
- }
-
- /**
- * @return DOES NOT RETURN THE PASSWORD, IT WOULD SHOW UP IN JMX
- */
- @Override
- public String getPassword() {
- return "Password not available as DataSource/JMX operation.";
- }
-
- @Override
- public int getRemoveAbandonedTimeout() {
- return getPoolProperties().getRemoveAbandonedTimeout();
- }
-
-
- @Override
- public int getTimeBetweenEvictionRunsMillis() {
- return getPoolProperties().getTimeBetweenEvictionRunsMillis();
- }
-
- @Override
- public String getUrl() {
- return getPoolProperties().getUrl();
- }
-
- @Override
- public String getUsername() {
- return getPoolProperties().getUsername();
- }
-
- @Override
- public long getValidationInterval() {
- return getPoolProperties().getValidationInterval();
- }
-
- @Override
- public String getValidationQuery() {
- return getPoolProperties().getValidationQuery();
- }
-
- @Override
- public int getValidationQueryTimeout() {
- return getPoolProperties().getValidationQueryTimeout();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public String getValidatorClassName() {
- return getPoolProperties().getValidatorClassName();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public Validator getValidator() {
- return getPoolProperties().getValidator();
- }
-
- @Override
- public boolean isAccessToUnderlyingConnectionAllowed() {
- return getPoolProperties().isAccessToUnderlyingConnectionAllowed();
- }
-
- @Override
- public Boolean isDefaultAutoCommit() {
- return getPoolProperties().isDefaultAutoCommit();
- }
-
- @Override
- public Boolean isDefaultReadOnly() {
- return getPoolProperties().isDefaultReadOnly();
- }
-
- @Override
- public boolean isLogAbandoned() {
- return getPoolProperties().isLogAbandoned();
- }
-
- @Override
- public boolean isPoolSweeperEnabled() {
- return getPoolProperties().isPoolSweeperEnabled();
- }
-
- @Override
- public boolean isRemoveAbandoned() {
- return getPoolProperties().isRemoveAbandoned();
- }
-
- @Override
- public int getAbandonWhenPercentageFull() {
- return getPoolProperties().getAbandonWhenPercentageFull();
- }
-
- @Override
- public boolean isTestOnBorrow() {
- return getPoolProperties().isTestOnBorrow();
- }
-
- @Override
- public boolean isTestOnConnect() {
- return getPoolProperties().isTestOnConnect();
- }
-
- @Override
- public boolean isTestOnReturn() {
- return getPoolProperties().isTestOnReturn();
- }
-
- @Override
- public boolean isTestWhileIdle() {
- return getPoolProperties().isTestWhileIdle();
- }
-
-
- @Override
- public Boolean getDefaultAutoCommit() {
- return getPoolProperties().getDefaultAutoCommit();
- }
-
- @Override
- public Boolean getDefaultReadOnly() {
- return getPoolProperties().getDefaultReadOnly();
- }
-
- @Override
- public InterceptorDefinition[] getJdbcInterceptorsAsArray() {
- return getPoolProperties().getJdbcInterceptorsAsArray();
- }
-
- @Override
- public boolean getUseLock() {
- return getPoolProperties().getUseLock();
- }
-
- @Override
- public boolean isFairQueue() {
- return getPoolProperties().isFairQueue();
- }
-
- @Override
- public boolean isJmxEnabled() {
- return getPoolProperties().isJmxEnabled();
- }
-
- @Override
- public boolean isUseEquals() {
- return getPoolProperties().isUseEquals();
- }
-
- @Override
- public void setAbandonWhenPercentageFull(int percentage) {
- getPoolProperties().setAbandonWhenPercentageFull(percentage);
- }
-
- @Override
- public void setAccessToUnderlyingConnectionAllowed(boolean accessToUnderlyingConnectionAllowed) {
- getPoolProperties().setAccessToUnderlyingConnectionAllowed(accessToUnderlyingConnectionAllowed);
- }
-
- @Override
- public void setDbProperties(Properties dbProperties) {
- getPoolProperties().setDbProperties(dbProperties);
- }
-
- @Override
- public void setDefaultReadOnly(Boolean defaultReadOnly) {
- getPoolProperties().setDefaultReadOnly(defaultReadOnly);
- }
-
- @Override
- public void setMaxAge(long maxAge) {
- getPoolProperties().setMaxAge(maxAge);
- }
-
- @Override
- public void setName(String name) {
- getPoolProperties().setName(name);
- }
-
- @Override
- public String getPoolName() {
- return getPoolProperties().getName();
- }
-
-
- @Override
- public void setConnectionProperties(String connectionProperties) {
- getPoolProperties().setConnectionProperties(connectionProperties);
-
- }
-
- @Override
- public void setDefaultAutoCommit(Boolean defaultAutoCommit) {
- getPoolProperties().setDefaultAutoCommit(defaultAutoCommit);
- }
-
- @Override
- public void setDefaultCatalog(String defaultCatalog) {
- getPoolProperties().setDefaultCatalog(defaultCatalog);
- }
-
- @Override
- public void setDefaultTransactionIsolation(int defaultTransactionIsolation) {
- getPoolProperties().setDefaultTransactionIsolation(defaultTransactionIsolation);
- }
-
- @Override
- public void setDriverClassName(String driverClassName) {
- getPoolProperties().setDriverClassName(driverClassName);
- }
-
-
- @Override
- public void setFairQueue(boolean fairQueue) {
- // noop - this pool is already running
- throw new UnsupportedOperationException();
- }
-
-
- @Override
- public void setInitialSize(int initialSize) {
- // noop - this pool is already running
- throw new UnsupportedOperationException();
-
- }
-
-
- @Override
- public void setInitSQL(String initSQL) {
- getPoolProperties().setInitSQL(initSQL);
-
- }
-
-
- @Override
- public void setJdbcInterceptors(String jdbcInterceptors) {
- // noop - this pool is already running
- throw new UnsupportedOperationException();
- }
-
-
- @Override
- public void setJmxEnabled(boolean jmxEnabled) {
- // noop - this pool is already running and obviously jmx enabled
- throw new UnsupportedOperationException();
- }
-
-
- @Override
- public void setLogAbandoned(boolean logAbandoned) {
- getPoolProperties().setLogAbandoned(logAbandoned);
- }
-
-
- @Override
- public void setMaxActive(int maxActive) {
- getPoolProperties().setMaxActive(maxActive);
- //make sure the pool is properly configured
- pool.checkPoolConfiguration(getPoolProperties());
- }
-
-
- @Override
- public void setMaxIdle(int maxIdle) {
- getPoolProperties().setMaxIdle(maxIdle);
- //make sure the pool is properly configured
- pool.checkPoolConfiguration(getPoolProperties());
-
- }
-
-
- @Override
- public void setMaxWait(int maxWait) {
- getPoolProperties().setMaxWait(maxWait);
- }
-
-
- @Override
- public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
- boolean wasEnabled = getPoolProperties().isPoolSweeperEnabled();
- getPoolProperties().setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
- boolean shouldBeEnabled = getPoolProperties().isPoolSweeperEnabled();
- //make sure pool cleaner starts/stops when it should
- if (!wasEnabled && shouldBeEnabled) pool.initializePoolCleaner(getPoolProperties());
- else if (wasEnabled && !shouldBeEnabled) pool.terminatePoolCleaner();
- }
-
-
- @Override
- public void setMinIdle(int minIdle) {
- getPoolProperties().setMinIdle(minIdle);
- //make sure the pool is properly configured
- pool.checkPoolConfiguration(getPoolProperties());
- }
-
-
- @Override
- public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
- getPoolProperties().setNumTestsPerEvictionRun(numTestsPerEvictionRun);
- }
-
-
- @Override
- public void setPassword(String password) {
- getPoolProperties().setPassword(password);
- }
-
-
- @Override
- public void setRemoveAbandoned(boolean removeAbandoned) {
- boolean wasEnabled = getPoolProperties().isPoolSweeperEnabled();
- getPoolProperties().setRemoveAbandoned(removeAbandoned);
- boolean shouldBeEnabled = getPoolProperties().isPoolSweeperEnabled();
- //make sure pool cleaner starts/stops when it should
- if (!wasEnabled && shouldBeEnabled) pool.initializePoolCleaner(getPoolProperties());
- else if (wasEnabled && !shouldBeEnabled) pool.terminatePoolCleaner();
- }
-
-
- @Override
- public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) {
- boolean wasEnabled = getPoolProperties().isPoolSweeperEnabled();
- getPoolProperties().setRemoveAbandonedTimeout(removeAbandonedTimeout);
- boolean shouldBeEnabled = getPoolProperties().isPoolSweeperEnabled();
- //make sure pool cleaner starts/stops when it should
- if (!wasEnabled && shouldBeEnabled) pool.initializePoolCleaner(getPoolProperties());
- else if (wasEnabled && !shouldBeEnabled) pool.terminatePoolCleaner();
- }
-
-
- @Override
- public void setTestOnBorrow(boolean testOnBorrow) {
- getPoolProperties().setTestOnBorrow(testOnBorrow);
- }
-
-
- @Override
- public void setTestOnConnect(boolean testOnConnect) {
- getPoolProperties().setTestOnConnect(testOnConnect);
- }
-
-
- @Override
- public void setTestOnReturn(boolean testOnReturn) {
- getPoolProperties().setTestOnReturn(testOnReturn);
- }
-
-
- @Override
- public void setTestWhileIdle(boolean testWhileIdle) {
- boolean wasEnabled = getPoolProperties().isPoolSweeperEnabled();
- getPoolProperties().setTestWhileIdle(testWhileIdle);
- boolean shouldBeEnabled = getPoolProperties().isPoolSweeperEnabled();
- //make sure pool cleaner starts/stops when it should
- if (!wasEnabled && shouldBeEnabled) pool.initializePoolCleaner(getPoolProperties());
- else if (wasEnabled && !shouldBeEnabled) pool.terminatePoolCleaner();
- }
-
-
- @Override
- public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
- boolean wasEnabled = getPoolProperties().isPoolSweeperEnabled();
- getPoolProperties().setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
- boolean shouldBeEnabled = getPoolProperties().isPoolSweeperEnabled();
- //make sure pool cleaner starts/stops when it should
- if (!wasEnabled && shouldBeEnabled) {
- pool.initializePoolCleaner(getPoolProperties());
- } else if (wasEnabled) {
- pool.terminatePoolCleaner();
- if (shouldBeEnabled) {
- pool.initializePoolCleaner(getPoolProperties());
- }
- }
- }
-
-
- @Override
- public void setUrl(String url) {
- getPoolProperties().setUrl(url);
- }
-
-
- @Override
- public void setUseEquals(boolean useEquals) {
- getPoolProperties().setUseEquals(useEquals);
- }
-
-
- @Override
- public void setUseLock(boolean useLock) {
- getPoolProperties().setUseLock(useLock);
- }
-
-
- @Override
- public void setUsername(String username) {
- getPoolProperties().setUsername(username);
- }
-
-
- @Override
- public void setValidationInterval(long validationInterval) {
- getPoolProperties().setValidationInterval(validationInterval);
- }
-
-
- @Override
- public void setValidationQuery(String validationQuery) {
- getPoolProperties().setValidationQuery(validationQuery);
- }
-
- @Override
- public void setValidationQueryTimeout(int validationQueryTimeout) {
- getPoolProperties().setValidationQueryTimeout(validationQueryTimeout);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setValidatorClassName(String className) {
- getPoolProperties().setValidatorClassName(className);
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public int getSuspectTimeout() {
- return getPoolProperties().getSuspectTimeout();
- }
-
- /**
- * {@inheritDoc}
- */
-
- @Override
- public void setSuspectTimeout(int seconds) {
- getPoolProperties().setSuspectTimeout(seconds);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setDataSource(Object ds) {
- getPoolProperties().setDataSource(ds);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Object getDataSource() {
- return getPoolProperties().getDataSource();
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setDataSourceJNDI(String jndiDS) {
- getPoolProperties().setDataSourceJNDI(jndiDS);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getDataSourceJNDI() {
- return getPoolProperties().getDataSourceJNDI();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isAlternateUsernameAllowed() {
- return getPoolProperties().isAlternateUsernameAllowed();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setAlternateUsernameAllowed(boolean alternateUsernameAllowed) {
- getPoolProperties().setAlternateUsernameAllowed(alternateUsernameAllowed);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setValidator(Validator validator) {
- getPoolProperties().setValidator(validator);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setCommitOnReturn(boolean commitOnReturn) {
- getPoolProperties().setCommitOnReturn(commitOnReturn);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getCommitOnReturn() {
- return getPoolProperties().getCommitOnReturn();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setRollbackOnReturn(boolean rollbackOnReturn) {
- getPoolProperties().setRollbackOnReturn(rollbackOnReturn);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getRollbackOnReturn() {
- return getPoolProperties().getRollbackOnReturn();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUseDisposableConnectionFacade(boolean useDisposableConnectionFacade) {
- getPoolProperties().setUseDisposableConnectionFacade(useDisposableConnectionFacade);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getUseDisposableConnectionFacade() {
- return getPoolProperties().getUseDisposableConnectionFacade();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setLogValidationErrors(boolean logValidationErrors) {
- getPoolProperties().setLogValidationErrors(logValidationErrors);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getLogValidationErrors() {
- return getPoolProperties().getLogValidationErrors();
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean getPropagateInterruptState() {
- return getPoolProperties().getPropagateInterruptState();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setPropagateInterruptState(boolean propagateInterruptState) {
- getPoolProperties().setPropagateInterruptState(propagateInterruptState);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isIgnoreExceptionOnPreLoad() {
- return getPoolProperties().isIgnoreExceptionOnPreLoad();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setIgnoreExceptionOnPreLoad(boolean ignoreExceptionOnPreLoad) {
- // noop - this pool is already running
- throw new UnsupportedOperationException();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void purge() {
- pool.purge();
-
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void purgeOnReturn() {
- pool.purgeOnReturn();
-
- }
-
-
-
-
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPoolMBean.java b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPoolMBean.java
deleted file mode 100644
index bc3bbca..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPoolMBean.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-/* 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.tomcat.jdbc.pool.jmx;
-
-import org.apache.tomcat.jdbc.pool.PoolConfiguration;
-
-public interface ConnectionPoolMBean extends PoolConfiguration {
-
- //=================================================================
- // POOL STATS
- //=================================================================
-
- public int getSize();
-
- public int getIdle();
-
- public int getActive();
-
- public int getNumIdle();
-
- public int getNumActive();
-
- public int getWaitCount();
-
- public long getBorrowedCount();
-
- public long getReturnedCount();
-
- public long getCreatedCount();
-
- public long getReleasedCount();
-
- public long getReconnectedCount();
-
- public long getRemoveAbandonedCount();
-
- public long getReleasedIdleCount();
-
- //=================================================================
- // POOL OPERATIONS
- //=================================================================
- public void checkIdle();
-
- public void checkAbandoned();
-
- public void testIdle();
-
- /**
- * Purges all connections in the pool.
- * For connections currently in use, these connections will be
- * purged when returned on the pool. This call also
- * purges connections that are idle and in the pool
- * To only purge used/active connections see {@link #purgeOnReturn()}
- */
- public void purge();
-
- /**
- * Purges connections when they are returned from the pool.
- * This call does not purge idle connections until they are used.
- * To purge idle connections see {@link #purge()}
- */
- public void purgeOnReturn();
-
- /**
- * reset the statistics of this pool.
- */
- public void resetStats();
-
- //=================================================================
- // POOL NOTIFICATIONS
- //=================================================================
-
-
-}
diff --git a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/mbeans-descriptors.xml b/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/mbeans-descriptors.xml
deleted file mode 100644
index 591c1d1..0000000
--- a/dblib/common/src/main/java/org/apache/tomcat/jdbc/pool/mbeans-descriptors.xml
+++ /dev/null
@@ -1,420 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START=======================================================
- openecomp
- ================================================================================
- Copyright (C) 2016 - 2017 AT&T
- ================================================================================
- 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.
- ============LICENSE_END=========================================================
- -->
-
-<!--
- 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.
--->
-<mbeans-descriptors>
-
- <mbean name="TomcatJDBCPool"
- description="Provides per diagnostic metrics and notifications for JDBC operations"
- domain="tomcat"
- group="jdbc"
- type="org.apache.tomcat.jdbc.pool.DataSource">
-
- <attribute name="className"
- description="Fully qualified class name of the managed object"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="size"
- description="The number of established connections in the pool, idle and in use"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="idle"
- description="The number of established connections in the pool that are idle"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="numIdle"
- description="Same as the idle attribute"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="active"
- description="The number of established connections in the pool that are in use"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="numActive"
- description="Same as the active attribute"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="poolSweeperEnabled"
- description="Returns true if the pool has a background thread running"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="url"
- description="The JDBC url for this connection pool"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="driverClassName"
- description="The JDBC driver class for this connection pool"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="defaultAutoCommit"
- description="The JDBC auto commit setting for new connections"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="defaultReadOnly"
- description="The JDBC read only setting for new connections"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="defaultTransactionIsolation"
- description="The JDBC transaction isolation setting for new connections"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="connectionProperties"
- description="The connection properties that will be set for new connections. Format of the string will be [propertyName=property;]*"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="defaultCatalog"
- description="The JDBC transaction isolation setting for new connections"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="initialSize"
- description="The number of connections opened at pool startup"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="maxActive"
- description="The maximum number of open connections"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="maxIdle"
- description="The max number of idle connections"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="minIdle"
- description="The minimum number of open connections"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="maxWait"
- description="The time to wait in milliseconds before a SQLException is thrown when a connection is requested"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="validationQuery"
- description="The query to run during validation"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="validationQueryTimeout"
- description="The timeout in seconds before a connection validation queries fail"
- type="java.lang.Integer"
- writeable="false" />
-
- <attribute name="testOnBorrow"
- description="True if validation happens when a connection is requested"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="testOnReturn"
- description="True if validation happens when a connection is returned"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="testWhileIdle"
- description="True if validation happens when a connection is not in use (idle)"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="timeBetweenEvictionRunsMillis"
- description="Sleep time for background thread in between pool checks"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="numTestsPerEvictionRun"
- description="Not in use"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="minEvictableIdleTimeMillis"
- description="Minimum amount of time a connection stays idle before it is evicted"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="accessToUnderlyingConnectionAllowed"
- description="Returns true if one can retrieve the actual JDBC connection"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="removeAbandoned"
- description="Returns true if connection in use can be timed out"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="removeAbandonedTimeout"
- description="Timeout in seconds for connections in use"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="logAbandoned"
- description="If true, stack trace will be recorded and printed out for timed out connection"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="loginTimeout"
- description="Not in use"
- type="java.lang.Integer"
- writeable="false"/>
-
-
- <attribute name="name"
- description="The name of the connection pool, will be used in the ObjectName of the actual pool"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="password"
- description="For security purposes,this doesn't return anything"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="username"
- description="The username used to open connections"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="validationInterval"
- description="If larger than zero than validation will only occur after the interval milliseconds has passed"
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="initSQL"
- description="A SQL executed once per connection, when it is established"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="testOnConnect"
- description="Validate connection after connection has been established"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="jdbcInterceptors"
- description="The interceptors configured for this pool"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="jmxEnabled"
- description="Register the pool with JMX or not"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="fairQueue"
- description="a fair queue is being used by the connection pool"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="abandonWhenPercentageFull"
- description="Connections that have been abandoned isn't closed unless connections in use are above this percentage"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="maxAge"
- description="Time in milliseconds to keep this connection alive even when used"
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="useEquals"
- description="Set to true if you wish the ProxyConnection class to use String.equals and set to false when you wish to use == when comparing method names"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="useLock"
- description="If true, use a lock when operations are performed on the connection object"
- type="java.lang.Boolean"
- is="false"
- writeable="false"/>
-
- <attribute name="suspectTimeout"
- description="Timeout in seconds for connection that suspected to have been abandoned"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="rollbackOnReturn"
- description="If autoCommit==false then the pool can terminate the transaction by calling rollback on the connection as it is returned to the pool"
- type="java.lang.Boolean"
- is="false"
- writeable="false"/>
-
- <attribute name="commitOnReturn"
- description="If autoCommit==false then the pool can complete the transaction by calling commit on the connection as it is returned to the pool"
- type="java.lang.Boolean"
- is="false"
- writeable="false"/>
-
- <attribute name="alternateUsernameAllowed"
- description="If true, getConnection(username,password) is allowed"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="dataSource"
- description="Data source that is injected into the pool"
- type="javax.sql.DataSource"
- writeable="false"/>
-
- <attribute name="dataSourceJNDI"
- description="The JNDI name for a data source to be looked up"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="useDisposableConnectionFacade"
- description="If true, connection pool is configured to use a connection facade to prevent re-use of connection after close() has been invoked"
- type="java.lang.Boolean"
- is="false"
- writeable="false"/>
-
- <attribute name="logValidationErrors"
- description="Log errors during the validation phase to the log file"
- type="java.lang.Boolean"
- is="false"
- writeable="false"/>
-
- <attribute name="validatorClassName"
- description="The name of validator class which implements org.apache.tomcat.jdbc.pool.Validator interface"
- type="java.lang.String"
- writeable="false"/>
-
- <attribute name="waitCount"
- description="The number of threads waiting for a connection"
- type="java.lang.Integer"
- writeable="false"/>
-
- <attribute name="propagateInterruptState"
- description="If true, propagate the interrupt state for a thread that has been interrupted"
- type="java.lang.Boolean"
- is="false"
- writeable="false"/>
-
- <attribute name="ignoreExceptionOnPreLoad"
- description="If true, ignore error of connection creation while initializing the pool"
- type="java.lang.Boolean"
- is="true"
- writeable="false"/>
-
- <attribute name="borrowedCount"
- description="The total number of connections borrowed from this pool"
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="createdCount"
- description="The total number of connections created by this pool"
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="returnedCount"
- description="The total number of connections returned to this pool"
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="releasedCount"
- description="The total number of connections released from this pool"
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="reconnectedCount"
- description="The total number of connections reconnected by this pool."
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="removeAbandonedCount"
- description="The total number of connections released by remove abandoned."
- type="java.lang.Long"
- writeable="false"/>
-
- <attribute name="releasedIdleCount"
- description="The total number of connections released by eviction."
- type="java.lang.Long"
- writeable="false"/>
-
- <operation name="checkIdle"
- description="forces a check of idle connections"
- impact="ACTION"
- returnType="void" />
-
- <operation name="checkAbandoned"
- description="forces a check of abandoned connections"
- impact="ACTION"
- returnType="void" />
-
- <operation name="testIdle"
- description="forces a validation of abandoned connections"
- impact="ACTION"
- returnType="void" />
-
- <operation name="purge"
- description="Purges all connections in the pool"
- impact="ACTION"
- returnType="void" />
-
- <operation name="purgeOnReturn"
- description="Purges connections when they are returned from the pool"
- impact="ACTION"
- returnType="void" />
-
- <operation name="resetStats"
- description="reset the statistics of this pool."
- impact="ACTION"
- returnType="void" />
-
- </mbean>
-
-</mbeans-descriptors>
diff --git a/dblib/common/src/main/java/org/openecomp/sdnc/sli/resource/common/CommonActivator.java b/dblib/common/src/main/java/org/openecomp/sdnc/sli/resource/common/CommonActivator.java
deleted file mode 100644
index 6a0ed06..0000000
--- a/dblib/common/src/main/java/org/openecomp/sdnc/sli/resource/common/CommonActivator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openecomp
- * ================================================================================
- * Copyright (C) 2016 - 2017 AT&T
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.sdnc.sli.resource.common;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class CommonActivator implements BundleActivator {
-
- @Override
- public void start(BundleContext context) throws Exception {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void stop(BundleContext context) throws Exception {
- // TODO Auto-generated method stub
-
- }
-
-}
diff --git a/dblib/features/src/main/resources/features.xml b/dblib/features/src/main/resources/features.xml
index d7f0030..016ab6f 100755
--- a/dblib/features/src/main/resources/features.xml
+++ b/dblib/features/src/main/resources/features.xml
@@ -10,7 +10,7 @@
<feature name='sdnc-dblib' description="sdnc-dblib" version='${project.version}'>
<!-- Most applications will have a dependency on the ODL MD-SAL Broker -->
<feature version="${odl.mdsal.version}">odl-mdsal-broker</feature>
- <bundle>mvn:org.openecomp.sdnc.core/dblib-common/${project.version}</bundle>
+ <bundle>mvn:org.apache.tomcat/tomcat-jdbc/${tomcat-jdbc.version}</bundle>
<bundle>mvn:org.openecomp.sdnc.core/dblib-provider/${project.version}</bundle>
<bundle>mvn:mysql/mysql-connector-java/${mysql.connector.version}</bundle>
</feature>
diff --git a/dblib/pom.xml b/dblib/pom.xml
index 32127cb..73f0af7 100755
--- a/dblib/pom.xml
+++ b/dblib/pom.xml
@@ -119,7 +119,6 @@
<name>AT&amp;T</name>
</organization>
<modules>
- <module>common</module>
<module>provider</module>
<module>features</module>
<module>installer</module>
diff --git a/dblib/provider/pom.xml b/dblib/provider/pom.xml
index 9d9340f..aa05102 100755
--- a/dblib/provider/pom.xml
+++ b/dblib/provider/pom.xml
@@ -52,6 +52,11 @@
<artifactId>dblib-common</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-jdbc</artifactId>
+ <version>${tomcat-jdbc.version}</version>
+ </dependency>
</dependencies>
<build>
diff --git a/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java b/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java
index 79559a4..183301b 100644..100755
--- a/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java
+++ b/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java
@@ -8,9 +8,9 @@
* 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.
@@ -212,7 +212,7 @@ public class RequestResponseDbLoggingFilter implements Filter {
} finally {
- if (request instanceof HttpServletRequest) {
+ if (request != null && request instanceof HttpServletRequest) {
t1 = System.currentTimeMillis();
@@ -243,22 +243,55 @@ public class RequestResponseDbLoggingFilter implements Filter {
private String decompressGZIPByteArray(byte[] bytes) {
+ BufferedReader in = null;
+ InputStreamReader inR = null;
+ ByteArrayInputStream byteS = null;
+ GZIPInputStream gzS = null;
StringBuilder str = new StringBuilder();
- try (ByteArrayInputStream byteS = new ByteArrayInputStream(bytes);
- GZIPInputStream gzS = new GZIPInputStream(byteS);
- InputStreamReader inR = new InputStreamReader(gzS);
- BufferedReader in = new BufferedReader(inR);) {
+ try {
+ byteS = new ByteArrayInputStream(bytes);
+ gzS = new GZIPInputStream(byteS);
+ inR = new InputStreamReader(gzS);
+ in = new BufferedReader(inR);
+
+ if (in != null) {
- String content;
+ String content;
- while ((content = in.readLine()) != null) {
- str.append(content);
+ while ((content = in.readLine()) != null) {
+ str.append(content);
+ }
}
} catch (Exception e) {
log.error("Failed get read GZIPInputStream", e);
- }
+ } finally {
+ if (byteS != null)
+ try {
+ byteS.close();
+ } catch (IOException e1) {
+ log.error("Failed to close ByteStream", e1);
+ }
+ if (gzS != null)
+ try {
+ gzS.close();
+ } catch (IOException e2) {
+ log.error("Failed to close GZStream", e2);
+ }
+ if (inR != null)
+ try {
+ inR.close();
+ } catch (IOException e3) {
+ log.error("Failed to close InputReader", e3);
+ }
+ if (in != null)
+ try {
+ in.close();
+ } catch (IOException e) {
+ log.error("Failed to close BufferedReader", e);
+ }
+ }
return str.toString();
}
}
diff --git a/rootpom/pom.xml b/rootpom/pom.xml
index 122f805..aab4161 100755
--- a/rootpom/pom.xml
+++ b/rootpom/pom.xml
@@ -150,6 +150,7 @@
<mysql.connector.version>5.1.39</mysql.connector.version>
<h2database.version>1.4.186</h2database.version>
+ <tomcat-jdbc.version>8.5.14</tomcat-jdbc.version>
</properties>
<modelVersion>4.0.0</modelVersion>