libcommons-dbcp-java-1.4.orig/0000755000175000017500000000000011337741616016211 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/build.properties.sample0000644000175000017500000000514311333570550022702 0ustar drazzibdrazzib# 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. ########################################################################## # Sample Ant build.properties file # # This setup assumes dependent jars are in a local maven 2 repository. # However the jars are located, the properties ending in ".jar" need to # expand to full paths to the jars. ########################################################################## # Repository base path repository=${user.home}/.m2/repository # commons-pool.jar - path to commons-pool-1.5.4.jar commons-pool.home=${repository}/commons-pool/commons-pool/1.5.4 commons-pool.jar=${commons-pool.home}/commons-pool-1.5.4.jar # JUnit junit.home=${repository}/junit/junit/3.8.2 junit.jar=${junit.home}/junit-3.8.2.jar # XML parser xerces.home=${repository}/xerces/xercesImpl/2.4.0 xerces.jar=${xerces.home}/xercesImpl-2.4.0.jar # Tomcat naming jars - needed only for JNDI tests naming.common.home=${repository}/tomcat/naming-common/5.0.28 naming-common.jar=${naming.common.home}/naming-common-5.0.28.jar naming.java.home=${repository}/tomcat/naming-java/5.0.28 naming-java.jar=${naming.java.home}/naming-java-5.0.28.jar # Commons logging - dependency of naming jars commons-logging.home=${repository}/commons-logging/commons-logging/1.1.1 commons-logging.jar=${commons-logging.home}/commons-logging-1.1.1.jar # JTA - needed for managed connections jta-spec.jar=${repository}/org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1/geronimo-jta_1.1_spec-1.1.jar jta-impl.jar=${repository}/org/apache/geronimo/modules/geronimo-transaction/1.2-beta/geronimo-transaction-1.2-beta.jar # JTA dependencies - required so the test cases run backport-util-concurrent.jar=${repository}/backport-util-concurrent/backport-util-concurrent/2.2/backport-util-concurrent-2.2.jar ejb-spec.jar=${repository}/org/apache/geronimo/specs/geronimo-ejb_2.1_spec/1.1/geronimo-ejb_2.1_spec-1.1.jar libcommons-dbcp-java-1.4.orig/pom.xml0000644000175000017500000002557711333570550017537 0ustar drazzibdrazzib org.apache.commons commons-parent 12 4.0.0 commons-dbcp commons-dbcp 1.4 Commons DBCP 2001 Commons Database Connection Pooling http://commons.apache.org/dbcp/ people.apache.org Commons DBCP scp://people.apache.org/www/commons.apache.org/dbcp jira http://issues.apache.org/jira/browse/DBCP scm:svn:http://svn.apache.org/repos/asf/commons/proper/dbcp/trunk scm:svn:https://svn.apache.org/repos/asf/commons/proper/dbcp/trunk http://svn.apache.org/viewvc/commons/proper/dbcp/trunk Morgan Delagrange morgand Geir Magnusson geirm Craig McClanahan craigmcc John McNally jmcnally Martin Poeschl mpoeschl mpoeschl@marmot.at tucana.at Rodney Waldhoff rwaldhoff David Weinrich dweinr1 Dirk Verbeeck dirkv Yoav Shapira yoavs yoavs@apache.org Apache Software Foundation Phil Steitz psteitz Jörg Schaible joehni joerg.schaible@gmx.de +1 Mark Thomas markt markt@apache.org Apache Software Foundation Todd Carmichael toddc@concur.com Wayne Woodfield Dain Sundstrom dain@apache.org Philippe Mouawad commons-pool commons-pool 1.5.4 junit junit 3.8.2 test org.apache.geronimo.specs geronimo-jta_1.1_spec 1.1.1 true tomcat naming-common 5.0.28 test tomcat naming-java 5.0.28 test commons-logging commons-logging 1.1.1 test org.apache.geronimo.modules geronimo-transaction 1.2-beta test 1.6 1.6 dbcp 1.4 DBCP 12310469 src/java src/test src/test testpool.jocl . META-INF NOTICE.txt LICENSE.txt ${basedir}/src/test testpool.jocl org.codehaus.mojo cobertura-maven-plugin 2.3 org.apache.maven.plugins maven-surefire-plugin plain **/Tester*.java **/Test*$*.java maven-assembly-plugin src/assembly/bin.xml src/assembly/src.xml gnu org.codehaus.mojo findbugs-maven-plugin 2.1 Normal Default ${basedir}/findbugs-exclude-filter.xml org.codehaus.mojo cobertura-maven-plugin 2.3 org.apache.maven.plugins maven-javadoc-plugin 2.4 http://java.sun.com/j2se/1.5.0/docs/api http://commons.apache.org/pool/api-1.5.4 http://java.sun.com/j2ee/sdk_1.3/techdocs/api org.apache.maven.plugins maven-changes-plugin 2.0 ${basedir}/xdocs/changes.xml %URL%/%ISSUE% src/template changes-report org.apache.maven.plugins maven-checkstyle-plugin 2.1 ${basedir}/checkstyle.xml false org.apache.maven.plugins maven-pmd-plugin 2.4 checkstyle.xml ${maven.compile.target} org.codehaus.mojo clirr-maven-plugin 2.2.2 1.2.2 info libcommons-dbcp-java-1.4.orig/build.xml0000644000175000017500000002620211333570550020025 0ustar drazzibdrazzib Checking dependencies libcommons-dbcp-java-1.4.orig/RELEASE-NOTES.txt0000644000175000017500000002331311333570550020713 0ustar drazzibdrazzib commons-dbcp-1.3/1.4 RELEASE NOTES This release includes new features as well as bug fixes and enhancements. Some bug fixes change semantics (e.g. connection close is now idempotent). The 1.3 and 1.4 releases of DBCP are built from the same sources. Version 1.4 supports JDBC 4, so requires JDK 1.6. Applications running under JDK 1.4-1.5 must use DBCP 1.3. Applications running under JDK 1.6 should use DBCP 1.4. Other than support for the added methods in JDBC 4, there is nothing new or different in DBCP 1.4 vs. DBCP 1.3. The list of changes below since 1.2.2 applies to both the 1.3 and 1.4 release. Other than the issue related to adding JDBC 4 support (DBCP-191), all bug fixes or new features are included in both DBCP 1.3 and 1.4. Changes since DBCP 1.2.2 include: New features: o DBCP-204: Made PoolingConnection pool CallableStatements. When BasicDataSource's poolPreparedStatements property is true, CallableStatements are now pooled along with PreparedStatements. The maxOpenPreparedStatements property limits the combined number of Callable and Prepared statements that can be in use at a given time. Thanks to Wei Chen. o DBCP-226: Added a validationQueryTimeout configuration parameter to BasicDataSource allowing the user to specify a timeout value (in seconds) for connection validation queries. o DBCP-175: Added a connectionInitSqls configuration parameter to BasicDataSource allowing the user to specify a collection of SQL statements to execute one time when a physical database connection is first opened. Thanks to Jiri Melichna and Jerome Lacoste. o DBCP-228: Added support for pooling managed connections. Thanks to Dain Sundstrom. o DBCP-230: Added BasicManagedDataSource, extending BasicDataSource. Also improved extensibility of BasicDataSource by encapsulating methods to create object pool, connection factory and datasource instance previously embedded in createDataSource. Thanks to Dain Sundstrom. Fixed Bugs: o DBCP-320: Eliminated poolKeys cache from PerUserPoolDataSource. o DBCP-321: Eliminated userKeys LRUMap cache from SharedPoolDataSource. o DBCP-319: Made private fields final where possible. Thanks to Sebastian Bazley. o DBCP-318: PerUserPoolDataSource.getPooledConnectionAndInfo multi-threading bug. Thanks to Sebastian Bazley. o DBCP-315: Remove throws clause from method that does not throw an exception. Thanks to Sebastian Bazley. o DBCP-313: Remove code that catches and ignores Exceptions when calling PooledConnection.removeConnectionEventListener(ConnectionEventListener) as the method does not throw any Exceptions. Thanks to Sebastian Bazley. o DBCP-316: Remove impossible null check. Thanks to Sebastian Bazley. o DBCP-303: Ensure Statement.getGeneratedKeys() works correctly with the CPDS adapter. Thanks to Dave Oxley. o DBCP-302: Removed incorrectly advertised ClassNotFoundException from JOCLContentHandler.ConstructorDetails.createObject(). Thanks to Sebastian Bazley. o DBCP-8: Handle user password changes for InstanceKeyDataSources. o DBCP-294: Added PoolableManagedConnection and PoolableManagedConnectionFactory so that pooled managed connections can unregister themselves from transaction registries, avoiding resource leaks. Thanks to Philippe Mouawad. o DBCP-212: PoolableConnectionFactory.makeObject() is no longer synchronized. This provides improved response times when load spikes at the cost of a faster rise in database server load. This change was made as a partial fix for DBCP-212. The synchronization changes in Commons Pool 1.5 complete the fix for this issue. o DBCP-242: Reverted DelegatingConnection close to 1.2.2 version to ensure open statements are closed before the underlying connection is closed. o DBCP-235: Refactor DelegatingConnection and ManagedConnection enable overridden equals() and hashcode() to work correctly. o DBCP-215: Modified BasicDataSourceFactory to complete initialization of the pool by creating initialSize connections rather than leaving this to lazy initialization when the pool is used. o DBCP-253: Eliminated masked _stmt field in descendents of DelegatingStatement. o DBCP-191: Modified DBCP sources to support compilation under JDK 1.4-1.6 using Ant flags to do conditional compilation. Thanks to Michael Heuer and J. David Beutel. o DBCP-272: Added a static initializer to BasicDatasource that calls DriverManager.getDrivers() to force initialization before we ever do anything that might use Class.forName() to load (and register) a JDBC driver. o DBCP-4: Eliminated direct System.out calls in AbandonedTrace. o DBCP-264: Modified DelegatingStatment close to clear open batches. o DBCP-255: Eliminated unused private "parent" field in AbandonedTrace. o DBCP-273: Fixed errors handling boolean-valued Reference properties in InstanceKeyObjectFactory, DriverAdapterCPDS that were causing testOnBorrow and poolPreparedStatements properties to be incorrectly set when creating objects from javax.naming.Reference instances. Thanks to Mark Lin. o DBCP-271: Made private instance fields of AbandonedTrace volatile (parent, createdBy, lastUsed, createdTime) or final (trace). Thanks to Sebastian Bazley. o DBCP-270: Narrowed synchronization in AbandonedTrace to resolve an Evictor deadlock. Thanks to Filip Hanik. o DBCP-218: Corrected Javadoc to state that getLoginTimeout and setLoginTimeout are NOT supported by BasicDataSource. o DBCP-221: BasicDataSource.close() now permanently marks the data source as closed, and no new connections can be obtained from the data source. At close all idle connections are destroyed and the method returns. As the remaining active connections are closed, they are destroyed. o DBCP-241: Eliminated potential sources of NullPointerExceptions in PoolingConnection. o DBCP-216: Improved error recovery and listener cleanup in KeyedCPDSConnectionFactory. Substituted calls to destroyObject with _pool.invalidateObject on error to ensure pool active count is decremented on error events. Ensured that events from closed or invalid connections are ignored and listeners are cleaned up. Thanks to Marcos Sanz. o DBCP-245: Fixed error in SharedPoolDataSource causing incorrect passwords to be stored under certain conditions. Thanks to Michael Drechsel. o DBCP-237: Added exception handler to ensure that PooledConnections are not orphaned when an exception occurs in setUpDefaults or clearWarnings in IntanceKeyDataSource.getConnection. Thanks to Oliver Matz. o DBCP-252: Made getPool synchronized in PoolableConnectionFactory. Fixes inconsistent synchronization accessing _pool. Thanks to FindBugs. o DBCP-252: Fixed inconsistent synchronization on _rollbackAfterValidation, _validationQuery and _pool in CPDSConnectionFactory and KeyedCPDSConnectionFactory by making the first two volatile and making both getter and setter for _pool synchronized. Thanks to FindBugs. Changes: o DBCP-314: Renamed variables with duplicate names in different scopes. Thanks to Sebastian Bazley. o DBCP-312: Clarified javadoc for BasicDataSource close() method. Thanks to Glen Mazza. o DBCP-305: Use an API specific exception for logging abandoned objects to make scanning the logs for these exceptions simpler and to provide a better message that includes the creation time of the abandoned object. Thanks to Christopher Schultz. o DBCP-203: Make the class loader used to load the JDBC driver configurable for the BasicDatasource. Thanks to Mark Grand. o DBCP-289: Made XADataSource configurable in BasicManagedDataSource. Thanks to Marc Kannegieer. o DBCP-276: Added connectionProperties property to DriverAdapterCPDS. o DBCP-265: Add a DelegatingDatabaseMetaData to track ResultSets returned from DatabaseMetaData objects. o DBCP-211: Added Maven 2 pom.xml. Removed a block of code from TestJOCLed that set the Xerces parser manually. This was to support early JDKs. The 1.3 version of DBCP requires JDK 1.4+. o DBCP-233: Changed behavior to allow Connection, Statement, PreparedStatement, CallableStatement and ResultSet to be closed multiple times. The first time close is called the resource is closed and any subsequent calls have no effect. This behavior is required as per the JavaDocs for these classes. Also added tests for closing all types multiple times and updated any tests that incorrectly assert that a resource can not be closed more then once. Fixes DBCP-3, DBCP-5, DBCP-23 and DBCP-134. Thanks to Dain Sundstrom. o DBCP-11: Modified PoolingDataSource, PoolingDriver and DelegatingStatement to assure that all returned Statements, PreparedStatements, CallableStatements and ResultSets are wrapped with a delegating object, which already properly handle the back pointers for Connection and Statement. Also added tests to to assure that the *same* object used to create the statement or result set is returned from either getConnection() or getStatement(). Thanks to Dain Sundstrom. o DBCP-143: SQLNestedException has been deprecated and will be replaced in DBCP 2.0 with SQLException and standard Java exception chaining. For complete information on commons-dbcp, including instructions on how to submit bug reports, patches, or suggestions for improvement, see the commons-dbcp website: http://commons.apache.org/dbcp/ libcommons-dbcp-java-1.4.orig/LICENSE.txt0000644000175000017500000002613611333570550020035 0ustar drazzibdrazzib 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. libcommons-dbcp-java-1.4.orig/findbugs-exclude-filter.xml0000644000175000017500000000231011333570550023433 0ustar drazzibdrazzib * libcommons-dbcp-java-1.4.orig/README.txt0000644000175000017500000000236011333570550017701 0ustar drazzibdrazzibApache Commons DBCP =========================== Welcome to the DBCP component of the Apache Commons project (http://commons.apache.org). DBCP now comes in two different versions, one to support JDBC 3 and one to support JDBC 4. Here is how it works: DBCP 1.4 compiles and runs under JDK 1.6 only (JDBC 4) DBCP 1.3 compiles and runs under JDK 1.4-1.5 only (JDBC 3) DBCP 1.4 binaries should be used by applications running under JDK 1.6 DBCP 1.3 should be used when running under JDK 1.4 or 1.5. There is no difference in the codebase supporting these two versions, other than that the code implementing methods added to support JDBC 4 has been filtered out of the DBCP 1.3 sources. Both versions can be built using either Ant or Maven (version 2). To build DBCP using Maven, type "mvn package" at a command line prompt from the top-level directory of the source distribution (the directory that contains the file named pom.xml). DBCP can also be built using Ant from the build.xml file. Locations of dependent jars for the Ant build need to be specified in build.properties. There is a build.properties.sample file included in the source distribution. See http://commons.apache.org/dbcp/ for additional and up-to-date information on Commons DBCP. libcommons-dbcp-java-1.4.orig/checkstyle.xml0000644000175000017500000001667311333570550021077 0ustar drazzibdrazzib libcommons-dbcp-java-1.4.orig/NOTICE.txt0000644000175000017500000000025511333570550017726 0ustar drazzibdrazzibApache Commons DBCP Copyright 2001-2010 The Apache Software Foundation This product includes software developed by The Apache Software Foundation (http://www.apache.org/). libcommons-dbcp-java-1.4.orig/src/0000755000175000017500000000000011333570550016771 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/assembly/0000755000175000017500000000000011337741616020617 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/assembly/bin.xml0000644000175000017500000000313711333570547022114 0ustar drazzibdrazzib bin tar.gz zip false LICENSE.txt NOTICE.txt README.txt RELEASE-NOTES.txt target *.jar target/site/apidocs apidocs libcommons-dbcp-java-1.4.orig/src/assembly/src.xml0000644000175000017500000000353611333570547022136 0ustar drazzibdrazzib src tar.gz zip ${project.artifactId}-${project.version}-src build.properties.sample build.xml checkstyle.xml LICENSE.txt LICENSE-header.txt NOTICE.txt pom.xml README.txt RELEASE-NOTES.txt test-jar.xml findbugs-exclude-filter.xml doc src xdocs libcommons-dbcp-java-1.4.orig/src/test/0000755000175000017500000000000011337741616017757 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/test/testpool.jocl0000644000175000017500000000437711333570547022513 0ustar drazzibdrazzib libcommons-dbcp-java-1.4.orig/src/test/org/0000755000175000017500000000000011333570547020545 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/test/org/apache/0000755000175000017500000000000011333570547021766 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/0000755000175000017500000000000011333570547023441 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/jocl/0000755000175000017500000000000011337741616024371 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/jocl/TestJOCLContentHandler.java0000644000175000017500000003241011333570547031453 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.jocl; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.SAXException; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.io.InputStream; import java.io.IOException; /** * @version $Revision: 893803 $ $Date: 2009-12-24 14:10:46 -0500 (Thu, 24 Dec 2009) $ */ public class TestJOCLContentHandler extends TestCase { public TestJOCLContentHandler(String testName) { super(testName); if (Float.parseFloat(System.getProperty("java.specification.version")) < 1.6f) { if(null == System.getProperty("org.xml.sax.driver")) { System.setProperty("org.xml.sax.driver","org.apache.xerces.parsers.SAXParser"); } } } public static Test suite() { return new TestSuite(TestJOCLContentHandler.class); } public static void main(String args[]) { String[] testCaseName = { TestJOCLContentHandler.class.getName() }; junit.textui.TestRunner.main(testCaseName); } private JOCLContentHandler jocl = null; public void setUp() { jocl = new JOCLContentHandler(); } public void testPrimitives() throws Exception { jocl.startDocument(); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","jocl","jocl",new AttributesImpl()); { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","true"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","boolean","boolean",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","boolean","boolean"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","1"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","byte","byte",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","byte","byte"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","c"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","char","char",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","char","char"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","2.0"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","double","double",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","double","double"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","3.0"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","float","float",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","float","float"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","5"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","int","int",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","int","int"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","7"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","11"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","short","short",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","short","short"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","All your base are belong to us."); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","string","string",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","string","string"); } jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","jocl","jocl"); jocl.endDocument(); assertEquals(Boolean.TYPE,jocl.getType(0)); assertEquals(Byte.TYPE,jocl.getType(1)); assertEquals(Character.TYPE,jocl.getType(2)); assertEquals(Double.TYPE,jocl.getType(3)); assertEquals(Float.TYPE,jocl.getType(4)); assertEquals(Integer.TYPE,jocl.getType(5)); assertEquals(Long.TYPE,jocl.getType(6)); assertEquals(Short.TYPE,jocl.getType(7)); assertEquals(String.class,jocl.getType(8)); assertEquals(Boolean.TRUE,jocl.getValue(0)); assertEquals(new Byte("1"),jocl.getValue(1)); assertEquals(new Character('c'),jocl.getValue(2)); assertEquals(new Double("2.0"),jocl.getValue(3)); assertEquals(new Float("3.0"),jocl.getValue(4)); assertEquals(new Integer("5"),jocl.getValue(5)); assertEquals(new Long("7"),jocl.getValue(6)); assertEquals(new Short("11"),jocl.getValue(7)); assertEquals("All your base are belong to us.",jocl.getValue(8)); } public void testObject() throws Exception { jocl.startDocument(); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","jocl","jocl",new AttributesImpl()); { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","null","null","CDATA","true"); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","class","class","CDATA","java.lang.String"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","class","class","CDATA","java.util.Date"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","class","class","CDATA","java.util.Date"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object",attr); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","345"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long"); } jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); // test array of 2 longs { AttributesImpl attr = new AttributesImpl(); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","array","array",attr); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","12"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","34"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long"); } jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); // test collection of 2 Strings, one null { AttributesImpl attr = new AttributesImpl(); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","collection","collection",attr); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","null","null","CDATA","true"); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","class","class","CDATA","java.lang.String"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","String #1"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","string","string",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","string","string"); } jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); // test list of 1 Date, one Long { AttributesImpl attr = new AttributesImpl(); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","list","list",attr); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","class","class","CDATA","java.util.Date"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); } { AttributesImpl attr = new AttributesImpl(); attr.addAttribute("http://apache.org/xml/xmlns/jakarta/commons/jocl","value","value","CDATA","12"); jocl.startElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long",attr); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","long","long"); } jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","object","object"); jocl.endElement("http://apache.org/xml/xmlns/jakarta/commons/jocl","jocl","jocl"); jocl.endDocument(); assertEquals(String.class,jocl.getType(0)); assertEquals(java.util.Date.class,jocl.getType(1)); assertEquals(java.util.Date.class,jocl.getType(2)); assertTrue(jocl.getType(3).isArray()); assertEquals(Collection.class,jocl.getType(4)); assertEquals(List.class,jocl.getType(5)); assertTrue(null == jocl.getValue(0)); assertTrue(null != jocl.getValue(1)); assertEquals(new java.util.Date(345L),jocl.getValue(2)); Object[] objects = (Object[])jocl.getValue(3); assertEquals(new Long(12L), objects[0]); assertEquals(new Long(34L), objects[1]); Iterator iterator = ((Collection)jocl.getValue(4)).iterator(); assertNull(iterator.next()); assertEquals("String #1", iterator.next()); List list = (List) jocl.getValue(5); assertEquals(java.util.Date.class,list.get(0).getClass()); assertEquals(new Long(12L),list.get(1)); } public void testParse() throws IOException, SAXException { InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("testpool.jocl"); JOCLContentHandler.parse(stream); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/jocl/TestAll.java0000644000175000017500000000267411333570547026614 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.jocl; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * @version $Revision: 830125 $ $Date: 2009-10-27 06:36:25 -0400 (Tue, 27 Oct 2009) $ */ public class TestAll extends TestCase { public TestAll(String testName) { super(testName); } public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(TestJOCLContentHandler.suite()); return suite; } public static void main(String args[]) { String[] testCaseName = { TestAll.class.getName() }; junit.textui.TestRunner.main(testCaseName); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/0000755000175000017500000000000011337741616024352 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestPStmtPoolingBasicDataSource.java0000644000175000017500000002147611333570547033402 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite for BasicDataSource with prepared statement pooling enabled * * @author Dirk Verbeeck * @version $Revision: 883383 $ $Date: 2009-11-23 10:52:21 -0500 (Mon, 23 Nov 2009) $ */ public class TestPStmtPoolingBasicDataSource extends TestBasicDataSource { public TestPStmtPoolingBasicDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestPStmtPoolingBasicDataSource.class); } public void setUp() throws Exception { super.setUp(); // PoolPreparedStatements enabled, should not affect the basic tests ds.setPoolPreparedStatements(true); ds.setMaxOpenPreparedStatements(2); } public void tearDown() throws Exception { super.tearDown(); // nothing to do here } public void testPreparedStatementPooling() throws Exception { Connection conn = getConnection(); assertNotNull(conn); PreparedStatement stmt1 = conn.prepareStatement("select 'a' from dual"); assertNotNull(stmt1); PreparedStatement stmt2 = conn.prepareStatement("select 'b' from dual"); assertNotNull(stmt2); assertTrue(stmt1 != stmt2); // go over the maxOpen limit PreparedStatement stmt3 = null; try { conn.prepareStatement("select 'c' from dual"); fail("expected SQLException"); } catch (SQLException e) {} // make idle stmt2.close(); // test cleanup the 'b' statement stmt3 = conn.prepareStatement("select 'c' from dual"); assertNotNull(stmt3); assertTrue(stmt3 != stmt1); assertTrue(stmt3 != stmt2); // normal reuse of statement stmt1.close(); PreparedStatement stmt4 = conn.prepareStatement("select 'a' from dual"); assertNotNull(stmt4); } /** * Verifies that the prepared statement pool behaves as an LRU cache, * closing least-recently-used statements idle in the pool to make room * for new ones if necessary. */ public void testLRUBehavior() throws Exception { ds.setMaxOpenPreparedStatements(3); Connection conn = getConnection(); assertNotNull(conn); // Open 3 statements and then close them into the pool PreparedStatement stmt1 = conn.prepareStatement("select 'a' from dual"); PreparedStatement inner1 = (PreparedStatement) ((DelegatingPreparedStatement) stmt1).getInnermostDelegate(); PreparedStatement stmt2 = conn.prepareStatement("select 'b' from dual"); PreparedStatement inner2 = (PreparedStatement) ((DelegatingPreparedStatement) stmt2).getInnermostDelegate(); PreparedStatement stmt3 = conn.prepareStatement("select 'c' from dual"); PreparedStatement inner3 = (PreparedStatement) ((DelegatingPreparedStatement) stmt3).getInnermostDelegate(); stmt1.close(); Thread.sleep(100); // Make sure return timestamps are different stmt2.close(); Thread.sleep(100); stmt3.close(); // Pool now has three idle statements, getting another one will force oldest (stmt1) out PreparedStatement stmt4 = conn.prepareStatement("select 'd' from dual"); assertNotNull(stmt4); // Verify that inner1 has been closed try { inner1.clearParameters(); fail("expecting SQLExcption - statement should be closed"); } catch (SQLException ex) { //Expected } // But others are still open inner2.clearParameters(); inner3.clearParameters(); // Now make sure stmt1 does not come back from the dead PreparedStatement stmt5 = conn.prepareStatement("select 'a' from dual"); PreparedStatement inner5 = (PreparedStatement) ((DelegatingPreparedStatement) stmt5).getInnermostDelegate(); assertNotSame(inner5, inner1); // inner2 should be closed now try { inner2.clearParameters(); fail("expecting SQLExcption - statement should be closed"); } catch (SQLException ex) { //Expected } // But inner3 should still be open inner3.clearParameters(); } // Bugzilla Bug 27246 // PreparedStatement cache should be different depending on the Catalog public void testPStmtCatalog() throws Exception { Connection conn = getConnection(); conn.setCatalog("catalog1"); DelegatingPreparedStatement stmt1 = (DelegatingPreparedStatement) conn.prepareStatement("select 'a' from dual"); TesterPreparedStatement inner1 = (TesterPreparedStatement) stmt1.getInnermostDelegate(); assertEquals("catalog1", inner1.getCatalog()); stmt1.close(); conn.setCatalog("catalog2"); DelegatingPreparedStatement stmt2 = (DelegatingPreparedStatement) conn.prepareStatement("select 'a' from dual"); TesterPreparedStatement inner2 = (TesterPreparedStatement) stmt2.getInnermostDelegate(); assertEquals("catalog2", inner2.getCatalog()); stmt2.close(); conn.setCatalog("catalog1"); DelegatingPreparedStatement stmt3 = (DelegatingPreparedStatement) conn.prepareStatement("select 'a' from dual"); TesterPreparedStatement inner3 = (TesterPreparedStatement) stmt1.getInnermostDelegate(); assertEquals("catalog1", inner3.getCatalog()); stmt3.close(); assertNotSame(inner1, inner2); assertSame(inner1, inner3); } public void testPStmtPoolingWithNoClose() throws Exception { ds.setMaxActive(1); // only one connection in pool needed ds.setMaxIdle(1); ds.setAccessToUnderlyingConnectionAllowed(true); Connection conn1 = getConnection(); assertNotNull(conn1); assertEquals(1, ds.getNumActive()); assertEquals(0, ds.getNumIdle()); PreparedStatement stmt1 = conn1.prepareStatement("select 'a' from dual"); assertNotNull(stmt1); Statement inner1 = ((DelegatingPreparedStatement) stmt1).getInnermostDelegate(); assertNotNull(inner1); stmt1.close(); Connection conn2 = conn1; assertNotNull(conn2); assertEquals(1, ds.getNumActive()); assertEquals(0, ds.getNumIdle()); PreparedStatement stmt2 = conn2.prepareStatement("select 'a' from dual"); assertNotNull(stmt2); Statement inner2 = ((DelegatingPreparedStatement) stmt2).getInnermostDelegate(); assertNotNull(inner2); assertSame(inner1, inner2); } public void testPStmtPoolingAccrossClose() throws Exception { ds.setMaxActive(1); // only one connection in pool needed ds.setMaxIdle(1); ds.setAccessToUnderlyingConnectionAllowed(true); Connection conn1 = getConnection(); assertNotNull(conn1); assertEquals(1, ds.getNumActive()); assertEquals(0, ds.getNumIdle()); PreparedStatement stmt1 = conn1.prepareStatement("select 'a' from dual"); assertNotNull(stmt1); Statement inner1 = ((DelegatingPreparedStatement) stmt1).getInnermostDelegate(); assertNotNull(inner1); stmt1.close(); conn1.close(); assertEquals(0, ds.getNumActive()); assertEquals(1, ds.getNumIdle()); Connection conn2 = getConnection(); assertNotNull(conn2); assertEquals(1, ds.getNumActive()); assertEquals(0, ds.getNumIdle()); PreparedStatement stmt2 = conn2.prepareStatement("select 'a' from dual"); assertNotNull(stmt2); Statement inner2 = ((DelegatingPreparedStatement) stmt2).getInnermostDelegate(); assertNotNull(inner2); assertSame(inner1, inner2); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TesterResultSet.java0000644000175000017500000006507011333570547030345 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.Calendar; /* JDBC_4_ANT_KEY_BEGIN */ import java.io.InputStream; import java.io.Reader; import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; /* JDBC_4_ANT_KEY_END */ /** * A dummy {@link ResultSet}, for testing purposes. * * @author Rodney Waldhoff * @author Dirk Verbeeck * @version $Revision: 883942 $ $Date: 2009-11-24 20:00:03 -0500 (Tue, 24 Nov 2009) $ */ public class TesterResultSet implements ResultSet { public TesterResultSet(Statement stmt) { _statement = stmt; } public TesterResultSet(Statement stmt, Object[][] data) { _statement = stmt; _data = data; } public TesterResultSet(Statement stmt, Object[][] data, int type, int concurrency) { _statement = stmt; _data = data; _type = type; _concurrency = concurrency; } protected int _type = ResultSet.TYPE_FORWARD_ONLY; protected int _concurrency = ResultSet.CONCUR_READ_ONLY; protected Object[][] _data = null; protected int _currentRow = -1; protected Statement _statement = null; protected int _rowsLeft = 2; protected boolean _open = true; public boolean next() throws SQLException { checkOpen(); if (_data != null) { _currentRow++; return _currentRow < _data.length; } else { if(--_rowsLeft > 0) { return true; } else { return false; } } } public void close() throws SQLException { if (!_open) { return; } // Not all result sets are generated from statements eg DatabaseMetaData if (_statement != null) { ((TesterStatement)_statement)._resultSet = null; } _open = false; } public boolean wasNull() throws SQLException { checkOpen(); return false; } public String getString(int columnIndex) throws SQLException { checkOpen(); if (columnIndex == -1) { throw new SQLException("broken connection"); } if (_data != null) { return (String) getObject(columnIndex); } return "String" + columnIndex; } public boolean getBoolean(int columnIndex) throws SQLException { checkOpen(); return true; } public byte getByte(int columnIndex) throws SQLException { checkOpen(); return (byte)columnIndex; } public short getShort(int columnIndex) throws SQLException { checkOpen(); return (short)columnIndex; } public int getInt(int columnIndex) throws SQLException { checkOpen(); return (short)columnIndex; } public long getLong(int columnIndex) throws SQLException { checkOpen(); return columnIndex; } public float getFloat(int columnIndex) throws SQLException { checkOpen(); return columnIndex; } public double getDouble(int columnIndex) throws SQLException { checkOpen(); return columnIndex; } /** @deprecated */ public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { checkOpen(); return new BigDecimal(columnIndex); } public byte[] getBytes(int columnIndex) throws SQLException { checkOpen(); return new byte[] { (byte)columnIndex }; } public java.sql.Date getDate(int columnIndex) throws SQLException { checkOpen(); return null; } public java.sql.Time getTime(int columnIndex) throws SQLException { checkOpen(); return null; } public java.sql.Timestamp getTimestamp(int columnIndex) throws SQLException { checkOpen(); return null; } public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException { checkOpen(); return null; } /** @deprecated */ public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException { checkOpen(); return null; } public java.io.InputStream getBinaryStream(int columnIndex) throws SQLException { checkOpen(); return null; } public String getString(String columnName) throws SQLException { checkOpen(); return columnName; } public boolean getBoolean(String columnName) throws SQLException { checkOpen(); return true; } public byte getByte(String columnName) throws SQLException { checkOpen(); return (byte)(columnName.hashCode()); } public short getShort(String columnName) throws SQLException { checkOpen(); return (short)(columnName.hashCode()); } public int getInt(String columnName) throws SQLException { checkOpen(); return (columnName.hashCode()); } public long getLong(String columnName) throws SQLException { checkOpen(); return columnName.hashCode(); } public float getFloat(String columnName) throws SQLException { checkOpen(); return columnName.hashCode(); } public double getDouble(String columnName) throws SQLException { checkOpen(); return columnName.hashCode(); } /** @deprecated */ public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException { checkOpen(); return new BigDecimal(columnName.hashCode()); } public byte[] getBytes(String columnName) throws SQLException { checkOpen(); return columnName.getBytes(); } public java.sql.Date getDate(String columnName) throws SQLException { checkOpen(); return null; } public java.sql.Time getTime(String columnName) throws SQLException { checkOpen(); return null; } public java.sql.Timestamp getTimestamp(String columnName) throws SQLException { checkOpen(); return null; } public java.io.InputStream getAsciiStream(String columnName) throws SQLException { checkOpen(); return null; } /** @deprecated */ public java.io.InputStream getUnicodeStream(String columnName) throws SQLException { checkOpen(); return null; } public java.io.InputStream getBinaryStream(String columnName) throws SQLException { checkOpen(); return null; } public SQLWarning getWarnings() throws SQLException { checkOpen(); return null; } public void clearWarnings() throws SQLException { checkOpen(); } public String getCursorName() throws SQLException { checkOpen(); return null; } public ResultSetMetaData getMetaData() throws SQLException { checkOpen(); return null; } public Object getObject(int columnIndex) throws SQLException { checkOpen(); if (_data != null) { return _data[_currentRow][columnIndex-1]; } return new Object(); } public Object getObject(String columnName) throws SQLException { checkOpen(); return columnName; } public int findColumn(String columnName) throws SQLException { checkOpen(); return 1; } public java.io.Reader getCharacterStream(int columnIndex) throws SQLException { checkOpen(); return null; } public java.io.Reader getCharacterStream(String columnName) throws SQLException { checkOpen(); return null; } public BigDecimal getBigDecimal(int columnIndex) throws SQLException { checkOpen(); return new BigDecimal(columnIndex); } public BigDecimal getBigDecimal(String columnName) throws SQLException { checkOpen(); return new BigDecimal(columnName.hashCode()); } public boolean isBeforeFirst() throws SQLException { checkOpen(); return _rowsLeft == 2; } public boolean isAfterLast() throws SQLException { checkOpen(); return _rowsLeft < 0; } public boolean isFirst() throws SQLException { checkOpen(); return _rowsLeft == 1; } public boolean isLast() throws SQLException { checkOpen(); return _rowsLeft == 0; } public void beforeFirst() throws SQLException { checkOpen(); } public void afterLast() throws SQLException { checkOpen(); } public boolean first() throws SQLException { checkOpen(); return false; } public boolean last() throws SQLException { checkOpen(); return false; } public int getRow() throws SQLException { checkOpen(); return 3 - _rowsLeft; } public boolean absolute( int row ) throws SQLException { checkOpen(); return false; } public boolean relative( int rows ) throws SQLException { checkOpen(); return false; } public boolean previous() throws SQLException { checkOpen(); return false; } public void setFetchDirection(int direction) throws SQLException { checkOpen(); } public int getFetchDirection() throws SQLException { checkOpen(); return 1; } public void setFetchSize(int rows) throws SQLException { checkOpen(); } public int getFetchSize() throws SQLException { checkOpen(); return 2; } public int getType() throws SQLException { return this._type; } public int getConcurrency() throws SQLException { return this._concurrency; } public boolean rowUpdated() throws SQLException { checkOpen(); return false; } public boolean rowInserted() throws SQLException { checkOpen(); return false; } public boolean rowDeleted() throws SQLException { checkOpen(); return false; } public void updateNull(int columnIndex) throws SQLException { checkOpen(); } public void updateBoolean(int columnIndex, boolean x) throws SQLException { checkOpen(); } public void updateByte(int columnIndex, byte x) throws SQLException { checkOpen(); } public void updateShort(int columnIndex, short x) throws SQLException { checkOpen(); } public void updateInt(int columnIndex, int x) throws SQLException { checkOpen(); } public void updateLong(int columnIndex, long x) throws SQLException { checkOpen(); } public void updateFloat(int columnIndex, float x) throws SQLException { checkOpen(); } public void updateDouble(int columnIndex, double x) throws SQLException { checkOpen(); } public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { checkOpen(); } public void updateString(int columnIndex, String x) throws SQLException { checkOpen(); } public void updateBytes(int columnIndex, byte x[]) throws SQLException { checkOpen(); } public void updateDate(int columnIndex, java.sql.Date x) throws SQLException { checkOpen(); } public void updateTime(int columnIndex, java.sql.Time x) throws SQLException { checkOpen(); } public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException { checkOpen(); } public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); } public void updateBinaryStream(int columnIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); } public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException { checkOpen(); } public void updateObject(int columnIndex, Object x, int scale) throws SQLException { checkOpen(); } public void updateObject(int columnIndex, Object x) throws SQLException { checkOpen(); } public void updateNull(String columnName) throws SQLException { checkOpen(); } public void updateBoolean(String columnName, boolean x) throws SQLException { checkOpen(); } public void updateByte(String columnName, byte x) throws SQLException { checkOpen(); } public void updateShort(String columnName, short x) throws SQLException { checkOpen(); } public void updateInt(String columnName, int x) throws SQLException { checkOpen(); } public void updateLong(String columnName, long x) throws SQLException { checkOpen(); } public void updateFloat(String columnName, float x) throws SQLException { checkOpen(); } public void updateDouble(String columnName, double x) throws SQLException { checkOpen(); } public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException { checkOpen(); } public void updateString(String columnName, String x) throws SQLException { checkOpen(); } public void updateBytes(String columnName, byte x[]) throws SQLException { checkOpen(); } public void updateDate(String columnName, java.sql.Date x) throws SQLException { checkOpen(); } public void updateTime(String columnName, java.sql.Time x) throws SQLException { checkOpen(); } public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException { checkOpen(); } public void updateAsciiStream(String columnName, java.io.InputStream x, int length) throws SQLException { checkOpen(); } public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException { checkOpen(); } public void updateCharacterStream(String columnName, java.io.Reader reader, int length) throws SQLException { checkOpen(); } public void updateObject(String columnName, Object x, int scale) throws SQLException { checkOpen(); } public void updateObject(String columnName, Object x) throws SQLException { checkOpen(); } public void insertRow() throws SQLException { checkOpen(); } public void updateRow() throws SQLException { checkOpen(); } public void deleteRow() throws SQLException { checkOpen(); } public void refreshRow() throws SQLException { checkOpen(); } public void cancelRowUpdates() throws SQLException { checkOpen(); } public void moveToInsertRow() throws SQLException { checkOpen(); } public void moveToCurrentRow() throws SQLException { checkOpen(); } public Statement getStatement() throws SQLException { checkOpen(); return _statement; } public Object getObject(int i, java.util.Map map) throws SQLException { checkOpen(); return new Object(); } public Ref getRef(int i) throws SQLException { checkOpen(); return null; } public Blob getBlob(int i) throws SQLException { checkOpen(); return null; } public Clob getClob(int i) throws SQLException { checkOpen(); return null; } public Array getArray(int i) throws SQLException { checkOpen(); return null; } public Object getObject(String colName, java.util.Map map) throws SQLException { checkOpen(); return colName; } public Ref getRef(String colName) throws SQLException { checkOpen(); return null; } public Blob getBlob(String colName) throws SQLException { checkOpen(); return null; } public Clob getClob(String colName) throws SQLException { checkOpen(); return null; } public Array getArray(String colName) throws SQLException { checkOpen(); return null; } public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException { checkOpen(); return null; } public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException { checkOpen(); return null; } public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException { checkOpen(); return null; } public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException { checkOpen(); return null; } public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { checkOpen(); return null; } public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException { checkOpen(); return null; } protected void checkOpen() throws SQLException { if(!_open) { throw new SQLException("ResultSet is closed."); } } public java.net.URL getURL(int columnIndex) throws SQLException { throw new SQLException("Not implemented."); } public java.net.URL getURL(String columnName) throws SQLException { throw new SQLException("Not implemented."); } public void updateRef(int columnIndex, java.sql.Ref x) throws SQLException { throw new SQLException("Not implemented."); } public void updateRef(String columnName, java.sql.Ref x) throws SQLException { throw new SQLException("Not implemented."); } public void updateBlob(int columnIndex, java.sql.Blob x) throws SQLException { throw new SQLException("Not implemented."); } public void updateBlob(String columnName, java.sql.Blob x) throws SQLException { throw new SQLException("Not implemented."); } public void updateClob(int columnIndex, java.sql.Clob x) throws SQLException { throw new SQLException("Not implemented."); } public void updateClob(String columnName, java.sql.Clob x) throws SQLException { throw new SQLException("Not implemented."); } public void updateArray(int columnIndex, java.sql.Array x) throws SQLException { throw new SQLException("Not implemented."); } public void updateArray(String columnName, java.sql.Array x) throws SQLException { throw new SQLException("Not implemented."); } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { throw new SQLException("Not implemented."); } public T unwrap(Class iface) throws SQLException { throw new SQLException("Not implemented."); } public RowId getRowId(int columnIndex) throws SQLException { throw new SQLException("Not implemented."); } public RowId getRowId(String columnLabel) throws SQLException { throw new SQLException("Not implemented."); } public void updateRowId(int columnIndex, RowId value) throws SQLException { throw new SQLException("Not implemented."); } public void updateRowId(String columnLabel, RowId value) throws SQLException { throw new SQLException("Not implemented."); } public int getHoldability() throws SQLException { throw new SQLException("Not implemented."); } public boolean isClosed() throws SQLException { return !_open; } public void updateNString(int columnIndex, String value) throws SQLException { throw new SQLException("Not implemented."); } public void updateNString(String columnLabel, String value) throws SQLException { throw new SQLException("Not implemented."); } public void updateNClob(int columnIndex, NClob value) throws SQLException { throw new SQLException("Not implemented."); } public void updateNClob(String columnLabel, NClob value) throws SQLException { throw new SQLException("Not implemented."); } public NClob getNClob(int columnIndex) throws SQLException { throw new SQLException("Not implemented."); } public NClob getNClob(String columnLabel) throws SQLException { throw new SQLException("Not implemented."); } public SQLXML getSQLXML(int columnIndex) throws SQLException { throw new SQLException("Not implemented."); } public SQLXML getSQLXML(String columnLabel) throws SQLException { throw new SQLException("Not implemented."); } public void updateSQLXML(int columnIndex, SQLXML value) throws SQLException { throw new SQLException("Not implemented."); } public void updateSQLXML(String columnLabel, SQLXML value) throws SQLException { throw new SQLException("Not implemented."); } public String getNString(int columnIndex) throws SQLException { throw new SQLException("Not implemented."); } public String getNString(String columnLabel) throws SQLException { throw new SQLException("Not implemented."); } public Reader getNCharacterStream(int columnIndex) throws SQLException { throw new SQLException("Not implemented."); } public Reader getNCharacterStream(String columnLabel) throws SQLException { throw new SQLException("Not implemented."); } public void updateNCharacterStream(int columnIndex, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateAsciiStream(int columnIndex, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateBinaryStream(int columnIndex, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateCharacterStream(int columnIndex, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateAsciiStream(String columnLabel, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateBinaryStream(String columnLabel, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void updateNCharacterStream(int columnIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void updateAsciiStream(int columnIndex, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void updateBinaryStream(int columnIndex, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void updateCharacterStream(int columnIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void updateAsciiStream(String columnLabel, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void updateBinaryStream(String columnLabel, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void updateClob(int columnIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void updateClob(String columnLabel, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void updateNClob(int columnIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void updateNClob(String columnLabel, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TesterDriver.java0000644000175000017500000001015411333570547027637 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.DriverPropertyInfo; import java.sql.SQLException; import java.util.Properties; /** * Mock object implementing the java.sql.Driver interface. * Returns TestConnection's from getConnection methods. * Valid username, password combinations are: * * * * * * * *
userpassword
foobar
u1p1
u2p2
usernamepassword
* * @author Rodney Waldhoff * @author Dirk Verbeeck * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ public class TesterDriver implements Driver { private static final Properties validUserPasswords = new Properties(); static { try { DriverManager.registerDriver(new TesterDriver()); } catch(Exception e) { } validUserPasswords.put("foo", "bar"); validUserPasswords.put("u1", "p1"); validUserPasswords.put("u2", "p2"); validUserPasswords.put("username", "password"); } /** * TesterDriver specific method to add users to the list of valid users */ public static void addUser(String username, String password) { synchronized (validUserPasswords) { validUserPasswords.put(username, password); } } public boolean acceptsURL(String url) throws SQLException { return CONNECT_STRING.startsWith(url); } private void assertValidUserPassword(String user, String password) throws SQLException { synchronized (validUserPasswords) { String realPassword = validUserPasswords.getProperty(user); if (realPassword == null) { throw new SQLException(user + " is not a valid username."); } if (!realPassword.equals(password)) { throw new SQLException(password + " is not the correct password for " + user + ". The correct password is " + realPassword); } } } public Connection connect(String url, Properties info) throws SQLException { //return (acceptsURL(url) ? new TesterConnection() : null); Connection conn = null; if (acceptsURL(url)) { String username = "test"; String password = "test"; if (info != null) { username = info.getProperty("user"); password = info.getProperty("password"); assertValidUserPassword(username, password); } conn = new TesterConnection(username, password); } return conn; } public int getMajorVersion() { return MAJOR_VERSION; } public int getMinorVersion() { return MINOR_VERSION; } public boolean jdbcCompliant() { return true; } public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) { return new DriverPropertyInfo[0]; } protected static final String CONNECT_STRING = "jdbc:apache:commons:testdriver"; // version numbers protected static final int MAJOR_VERSION = 1; protected static final int MINOR_VERSION = 0; } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TesterDatabaseMetaData.java0000644000175000017500000004615111333570547031517 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; /* JDBC_4_ANT_KEY_BEGIN */ import java.sql.RowIdLifetime; /* JDBC_4_ANT_KEY_END */ import java.sql.SQLException; /** * Dummy {@link DatabaseMetaData} for tetsing purposes. Implements only those * methods required by the test cases. */ public class TesterDatabaseMetaData implements DatabaseMetaData { public boolean allProceduresAreCallable() throws SQLException { return false; } public boolean allTablesAreSelectable() throws SQLException { return false; } public boolean dataDefinitionCausesTransactionCommit() throws SQLException { return false; } public boolean dataDefinitionIgnoredInTransactions() throws SQLException { return false; } public boolean deletesAreDetected(int type) throws SQLException { return false; } public boolean doesMaxRowSizeIncludeBlobs() throws SQLException { return false; } public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException { return null; } public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException { return null; } public String getCatalogSeparator() throws SQLException { return null; } public String getCatalogTerm() throws SQLException { return null; } public ResultSet getCatalogs() throws SQLException { return null; } public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException { return null; } public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { return null; } public Connection getConnection() throws SQLException { return null; } public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { return null; } public int getDatabaseMajorVersion() throws SQLException { return 0; } public int getDatabaseMinorVersion() throws SQLException { return 0; } public String getDatabaseProductName() throws SQLException { return null; } public String getDatabaseProductVersion() throws SQLException { return null; } public int getDefaultTransactionIsolation() throws SQLException { return 0; } public int getDriverMajorVersion() { return 0; } public int getDriverMinorVersion() { return 0; } public String getDriverName() throws SQLException { return null; } public String getDriverVersion() throws SQLException { return null; } public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { return null; } public String getExtraNameCharacters() throws SQLException { return null; } public String getIdentifierQuoteString() throws SQLException { return null; } public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { return null; } public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException { return null; } public int getJDBCMajorVersion() throws SQLException { return 0; } public int getJDBCMinorVersion() throws SQLException { return 0; } public int getMaxBinaryLiteralLength() throws SQLException { return 0; } public int getMaxCatalogNameLength() throws SQLException { return 0; } public int getMaxCharLiteralLength() throws SQLException { return 0; } public int getMaxColumnNameLength() throws SQLException { return 0; } public int getMaxColumnsInGroupBy() throws SQLException { return 0; } public int getMaxColumnsInIndex() throws SQLException { return 0; } public int getMaxColumnsInOrderBy() throws SQLException { return 0; } public int getMaxColumnsInSelect() throws SQLException { return 0; } public int getMaxColumnsInTable() throws SQLException { return 0; } public int getMaxConnections() throws SQLException { return 0; } public int getMaxCursorNameLength() throws SQLException { return 0; } public int getMaxIndexLength() throws SQLException { return 0; } public int getMaxProcedureNameLength() throws SQLException { return 0; } public int getMaxRowSize() throws SQLException { return 0; } public int getMaxSchemaNameLength() throws SQLException { return 0; } public int getMaxStatementLength() throws SQLException { return 0; } public int getMaxStatements() throws SQLException { return 0; } public int getMaxTableNameLength() throws SQLException { return 0; } public int getMaxTablesInSelect() throws SQLException { return 0; } public int getMaxUserNameLength() throws SQLException { return 0; } public String getNumericFunctions() throws SQLException { return null; } public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { return null; } public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException { return null; } public String getProcedureTerm() throws SQLException { return null; } public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException { return null; } public int getResultSetHoldability() throws SQLException { return 0; } public String getSQLKeywords() throws SQLException { return null; } public int getSQLStateType() throws SQLException { return 0; } public String getSchemaTerm() throws SQLException { return null; } public ResultSet getSchemas() throws SQLException { return new TesterResultSet(null); } public String getSearchStringEscape() throws SQLException { return null; } public String getStringFunctions() throws SQLException { return null; } public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException { return null; } public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException { return null; } public String getSystemFunctions() throws SQLException { return null; } public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException { return null; } public ResultSet getTableTypes() throws SQLException { return null; } public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException { return null; } public String getTimeDateFunctions() throws SQLException { return null; } public ResultSet getTypeInfo() throws SQLException { return null; } public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException { return null; } public String getURL() throws SQLException { return null; } public String getUserName() throws SQLException { return null; } public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException { return null; } public boolean insertsAreDetected(int type) throws SQLException { return false; } public boolean isCatalogAtStart() throws SQLException { return false; } public boolean isReadOnly() throws SQLException { return false; } public boolean locatorsUpdateCopy() throws SQLException { return false; } public boolean nullPlusNonNullIsNull() throws SQLException { return false; } public boolean nullsAreSortedAtEnd() throws SQLException { return false; } public boolean nullsAreSortedAtStart() throws SQLException { return false; } public boolean nullsAreSortedHigh() throws SQLException { return false; } public boolean nullsAreSortedLow() throws SQLException { return false; } public boolean othersDeletesAreVisible(int type) throws SQLException { return false; } public boolean othersInsertsAreVisible(int type) throws SQLException { return false; } public boolean othersUpdatesAreVisible(int type) throws SQLException { return false; } public boolean ownDeletesAreVisible(int type) throws SQLException { return false; } public boolean ownInsertsAreVisible(int type) throws SQLException { return false; } public boolean ownUpdatesAreVisible(int type) throws SQLException { return false; } public boolean storesLowerCaseIdentifiers() throws SQLException { return false; } public boolean storesLowerCaseQuotedIdentifiers() throws SQLException { return false; } public boolean storesMixedCaseIdentifiers() throws SQLException { return false; } public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { return false; } public boolean storesUpperCaseIdentifiers() throws SQLException { return false; } public boolean storesUpperCaseQuotedIdentifiers() throws SQLException { return false; } public boolean supportsANSI92EntryLevelSQL() throws SQLException { return false; } public boolean supportsANSI92FullSQL() throws SQLException { return false; } public boolean supportsANSI92IntermediateSQL() throws SQLException { return false; } public boolean supportsAlterTableWithAddColumn() throws SQLException { return false; } public boolean supportsAlterTableWithDropColumn() throws SQLException { return false; } public boolean supportsBatchUpdates() throws SQLException { return false; } public boolean supportsCatalogsInDataManipulation() throws SQLException { return false; } public boolean supportsCatalogsInIndexDefinitions() throws SQLException { return false; } public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException { return false; } public boolean supportsCatalogsInProcedureCalls() throws SQLException { return false; } public boolean supportsCatalogsInTableDefinitions() throws SQLException { return false; } public boolean supportsColumnAliasing() throws SQLException { return false; } public boolean supportsConvert() throws SQLException { return false; } public boolean supportsConvert(int fromType, int toType) throws SQLException { return false; } public boolean supportsCoreSQLGrammar() throws SQLException { return false; } public boolean supportsCorrelatedSubqueries() throws SQLException { return false; } public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException { return false; } public boolean supportsDataManipulationTransactionsOnly() throws SQLException { return false; } public boolean supportsDifferentTableCorrelationNames() throws SQLException { return false; } public boolean supportsExpressionsInOrderBy() throws SQLException { return false; } public boolean supportsExtendedSQLGrammar() throws SQLException { return false; } public boolean supportsFullOuterJoins() throws SQLException { return false; } public boolean supportsGetGeneratedKeys() throws SQLException { return false; } public boolean supportsGroupBy() throws SQLException { return false; } public boolean supportsGroupByBeyondSelect() throws SQLException { return false; } public boolean supportsGroupByUnrelated() throws SQLException { return false; } public boolean supportsIntegrityEnhancementFacility() throws SQLException { return false; } public boolean supportsLikeEscapeClause() throws SQLException { return false; } public boolean supportsLimitedOuterJoins() throws SQLException { return false; } public boolean supportsMinimumSQLGrammar() throws SQLException { return false; } public boolean supportsMixedCaseIdentifiers() throws SQLException { return false; } public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException { return false; } public boolean supportsMultipleOpenResults() throws SQLException { return false; } public boolean supportsMultipleResultSets() throws SQLException { return false; } public boolean supportsMultipleTransactions() throws SQLException { return false; } public boolean supportsNamedParameters() throws SQLException { return false; } public boolean supportsNonNullableColumns() throws SQLException { return false; } public boolean supportsOpenCursorsAcrossCommit() throws SQLException { return false; } public boolean supportsOpenCursorsAcrossRollback() throws SQLException { return false; } public boolean supportsOpenStatementsAcrossCommit() throws SQLException { return false; } public boolean supportsOpenStatementsAcrossRollback() throws SQLException { return false; } public boolean supportsOrderByUnrelated() throws SQLException { return false; } public boolean supportsOuterJoins() throws SQLException { return false; } public boolean supportsPositionedDelete() throws SQLException { return false; } public boolean supportsPositionedUpdate() throws SQLException { return false; } public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException { return false; } public boolean supportsResultSetHoldability(int holdability) throws SQLException { return false; } public boolean supportsResultSetType(int type) throws SQLException { return false; } public boolean supportsSavepoints() throws SQLException { return false; } public boolean supportsSchemasInDataManipulation() throws SQLException { return false; } public boolean supportsSchemasInIndexDefinitions() throws SQLException { return false; } public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException { return false; } public boolean supportsSchemasInProcedureCalls() throws SQLException { return false; } public boolean supportsSchemasInTableDefinitions() throws SQLException { return false; } public boolean supportsSelectForUpdate() throws SQLException { return false; } public boolean supportsStatementPooling() throws SQLException { return false; } public boolean supportsStoredProcedures() throws SQLException { return false; } public boolean supportsSubqueriesInComparisons() throws SQLException { return false; } public boolean supportsSubqueriesInExists() throws SQLException { return false; } public boolean supportsSubqueriesInIns() throws SQLException { return false; } public boolean supportsSubqueriesInQuantifieds() throws SQLException { return false; } public boolean supportsTableCorrelationNames() throws SQLException { return false; } public boolean supportsTransactionIsolationLevel(int level) throws SQLException { return false; } public boolean supportsTransactions() throws SQLException { return false; } public boolean supportsUnion() throws SQLException { return false; } public boolean supportsUnionAll() throws SQLException { return false; } public boolean updatesAreDetected(int type) throws SQLException { return false; } public boolean usesLocalFilePerTable() throws SQLException { return false; } public boolean usesLocalFiles() throws SQLException { return false; } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return false; } public T unwrap(Class iface) throws SQLException { return null; } public RowIdLifetime getRowIdLifetime() throws SQLException { return null; } public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException { return null; } public boolean autoCommitFailureClosesAllResultSets() throws SQLException { return false; } public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException { return false; } public ResultSet getClientInfoProperties() throws SQLException { return null; } public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException { return null; } public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException { return null; } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/managed/0000755000175000017500000000000011337741616025746 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/managed/TestBasicManagedDataSource.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/managed/TestBasicManagedDataSource.ja0000644000175000017500000000644511333570547033403 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import java.sql.SQLException; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbcp.TestBasicDataSource; import org.apache.geronimo.transaction.manager.TransactionManagerImpl; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite for BasicManagedDataSource */ public class TestBasicManagedDataSource extends TestBasicDataSource { public TestBasicManagedDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestBasicManagedDataSource.class); } protected BasicDataSource createDataSource() throws Exception { BasicManagedDataSource basicManagedDataSource = new BasicManagedDataSource(); basicManagedDataSource.setTransactionManager(new TransactionManagerImpl()); return basicManagedDataSource; } public void testHashCode() throws Exception { // TODO reenable... hashcode doesn't work when accessToUnderlyingConnectionAllowed is false } /** * JIRA: DBCP-294 * Verify that PoolableConnections created by BasicManagedDataSource unregister themselves * when reallyClosed. */ public void testReallyClose() throws Exception { BasicManagedDataSource basicManagedDataSource = new BasicManagedDataSource(); basicManagedDataSource.setTransactionManager(new TransactionManagerImpl()); basicManagedDataSource.setDriverClassName("org.apache.commons.dbcp.TesterDriver"); basicManagedDataSource.setUrl("jdbc:apache:commons:testdriver"); basicManagedDataSource.setUsername("username"); basicManagedDataSource.setPassword("password"); basicManagedDataSource.setMaxIdle(1); // Create two connections ManagedConnection conn = (ManagedConnection) basicManagedDataSource.getConnection(); assertNotNull(basicManagedDataSource.getTransactionRegistry().getXAResource(conn)); ManagedConnection conn2 = (ManagedConnection) basicManagedDataSource.getConnection(); conn2.close(); // Return one connection to the pool conn.close(); // No room at the inn - this will trigger reallyClose(), which should unregister try { basicManagedDataSource.getTransactionRegistry().getXAResource(conn); fail("Expecting SQLException - XAResources orphaned"); } catch (SQLException ex) { // expected } conn2.close(); basicManagedDataSource.close(); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/managed/TestManagedDataSource.java0000644000175000017500000002303511333570547032762 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.DelegatingConnection; import org.apache.commons.dbcp.DriverConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; import org.apache.commons.dbcp.TestConnectionPool; import org.apache.commons.dbcp.TesterDriver; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; import org.apache.geronimo.transaction.manager.TransactionManagerImpl; import javax.transaction.TransactionManager; import java.sql.Connection; import java.util.Properties; /** * TestSuite for ManagedDataSource without a transaction in progress. * * @author Dain Sundstrom * @version $Revision$ */ public class TestManagedDataSource extends TestConnectionPool { public TestManagedDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestManagedDataSource.class); } protected Connection getConnection() throws Exception { return ds.getConnection(); } protected PoolingDataSource ds = null; private GenericObjectPool pool = null; protected TransactionManager transactionManager; public void setUp() throws Exception { super.setUp(); // create a GeronimoTransactionManager for testing transactionManager = new TransactionManagerImpl(); // create a driver connection factory Properties properties = new Properties(); properties.setProperty("user", "username"); properties.setProperty("password", "password"); ConnectionFactory connectionFactory = new DriverConnectionFactory(new TesterDriver(), "jdbc:apache:commons:testdriver", properties); // wrap it with a LocalXAConnectionFactory XAConnectionFactory xaConnectionFactory = new LocalXAConnectionFactory(transactionManager, connectionFactory); // create the pool pool = new GenericObjectPool(); pool.setMaxActive(getMaxActive()); pool.setMaxWait(getMaxWait()); // create the pool object factory PoolableConnectionFactory factory = new PoolableConnectionFactory(xaConnectionFactory, pool, null, "SELECT DUMMY FROM DUAL", true, true); pool.setFactory(factory); // finally create the datasource ds = new ManagedDataSource(pool, xaConnectionFactory.getTransactionRegistry()); ds.setAccessToUnderlyingConnectionAllowed(true); } public void tearDown() throws Exception { pool.close(); super.tearDown(); } /** * Verify the accessToUnderlyingConnectionAllowed propertly limits access to the physical connection. */ public void testAccessToUnderlyingConnectionAllowed() throws Exception { ds.setAccessToUnderlyingConnectionAllowed(true); ManagedConnection connection = (ManagedConnection) newConnection(); assertTrue(connection.isAccessToUnderlyingConnectionAllowed()); assertNotNull(connection.getDelegate()); assertNotNull(connection.getInnermostDelegate()); connection.close(); ds.setAccessToUnderlyingConnectionAllowed(false); connection = (ManagedConnection) newConnection(); assertFalse(connection.isAccessToUnderlyingConnectionAllowed()); assertNull(connection.getDelegate()); assertNull(connection.getInnermostDelegate()); connection.close(); } /** * Verify that conection sharing is working (or not working) as expected. */ public void testSharedConnection() throws Exception { DelegatingConnection connectionA = (DelegatingConnection) newConnection(); DelegatingConnection connectionB = (DelegatingConnection) newConnection(); assertFalse(connectionA.equals(connectionB)); assertFalse(connectionB.equals(connectionA)); assertFalse(connectionA.innermostDelegateEquals(connectionB.getInnermostDelegate())); assertFalse(connectionB.innermostDelegateEquals(connectionA.getInnermostDelegate())); connectionA.close(); connectionB.close(); } public void testManagedConnectionEqualsSameDelegateNoUnderlyingAccess() throws Exception { // Get a maximal set of connections from the pool Connection[] c = new Connection[getMaxActive()]; for (int i = 0; i < c.length; i++) { c[i] = newConnection(); } // Close the delegate of one wrapper in the pool ((DelegatingConnection) c[0]).getDelegate().close(); // Disable access for the new connection ds.setAccessToUnderlyingConnectionAllowed(false); // Grab a new connection - should get c[0]'s closed connection // so should be delegate-equivalent, so equal Connection con = newConnection(); assertTrue(c[0].equals(con)); assertTrue(con.equals(c[0])); for (int i = 0; i < c.length; i++) { c[i].close(); } ds.setAccessToUnderlyingConnectionAllowed(true); } public void testManagedConnectionEqualsSameDelegate() throws Exception { // Get a maximal set of connections from the pool Connection[] c = new Connection[getMaxActive()]; for (int i = 0; i < c.length; i++) { c[i] = newConnection(); } // Close the delegate of one wrapper in the pool ((DelegatingConnection) c[0]).getDelegate().close(); // Grab a new connection - should get c[0]'s closed connection // so should be delegate-equivalent, so equal Connection con = newConnection(); assertTrue(c[0].equals(con)); assertTrue(con.equals(c[0])); for (int i = 0; i < c.length; i++) { c[i].close(); } } /* * JIRA: DBCP-198 */ public void testManagedConnectionEqualsReflexive() throws Exception { // Statndard setup - using DelegatingConnections // returned from PoolableConnectionFactory checkManagedConnectionEqualsReflexive(); // Force ManagedConnections to wrap non-Delegating connections pool.close(); pool = new GenericObjectPool(); pool.setMaxActive(getMaxActive()); pool.setMaxWait(getMaxWait()); Properties props = new Properties(); props.setProperty("user", "username"); props.setProperty("password", "password"); NonDelegatingPoolableConnectionFactory factory = new NonDelegatingPoolableConnectionFactory(new DriverConnectionFactory(new TesterDriver(), "jdbc:apache:commons:testdriver", props), pool); pool.setFactory(factory); ds = new PoolingDataSource(pool); checkManagedConnectionEqualsReflexive(); } private void checkManagedConnectionEqualsReflexive() throws Exception { Connection con = ds.getConnection(); Connection con2 = con; assertTrue(con2.equals(con)); assertTrue(con.equals(con2)); con.close(); } public void testManagedConnectionEqualsFail() throws Exception { Connection con1 = ds.getConnection(); Connection con2 = ds.getConnection(); assertFalse(con1.equals(con2)); con1.close(); con2.close(); } public void testManagedConnectionEqualsNull() throws Exception { Connection con1 = ds.getConnection(); Connection con2 = null; assertFalse(con1.equals(con2)); con1.close(); } public void testManagedConnectionEqualsType() throws Exception { Connection con1 = ds.getConnection(); Integer con2 = new Integer(0); assertFalse(con1.equals(con2)); con1.close(); } public void testManagedConnectionEqualInnermost() throws Exception { ds.setAccessToUnderlyingConnectionAllowed(true); DelegatingConnection con = (DelegatingConnection) ds.getConnection(); Connection inner = con.getInnermostDelegate(); ds.setAccessToUnderlyingConnectionAllowed(false); DelegatingConnection con2 = new DelegatingConnection(inner); assertTrue(con2.equals(con)); assertTrue(con.innermostDelegateEquals(con2.getInnermostDelegate())); assertTrue(con2.innermostDelegateEquals(inner)); assertTrue(con.equals(con2)); } /** * Factory to return non-delegating connections for DBCP-198 test */ private static class NonDelegatingPoolableConnectionFactory extends PoolableConnectionFactory { public NonDelegatingPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool) { super(connFactory, pool, null, null, true, true); } synchronized public Object makeObject() throws Exception { return _connFactory.createConnection(); } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/managed/TestManagedDataSourceInTx.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/managed/TestManagedDataSourceInTx.jav0000644000175000017500000003075311333570547033431 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import org.apache.commons.dbcp.DelegatingConnection; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.sql.ResultSet; import java.sql.PreparedStatement; import junit.framework.Test; import junit.framework.TestSuite; import javax.transaction.Transaction; /** * TestSuite for ManagedDataSource with an active transaction in progress. * * @author Dain Sundstrom * @version $Revision$ */ public class TestManagedDataSourceInTx extends TestManagedDataSource { public TestManagedDataSourceInTx(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestManagedDataSourceInTx.class); } public void setUp() throws Exception { super.setUp(); transactionManager.begin(); } public void tearDown() throws Exception { if (transactionManager.getTransaction() != null) { transactionManager.commit(); } super.tearDown(); } /** * @see #testSharedConnection() */ public void testManagedConnectionEqualsFail() throws Exception { // this test is invalid for managed conections since because // two connections to the same datasource are supposed to share // a single connection } public void testConnectionsAreDistinct() throws Exception { Connection[] conn = new Connection[getMaxActive()]; for(int i=0;i 0); } public void testHashCodeEqual() { DelegatingConnection conn2 = new DelegatingConnection(delegateConn); assertEquals(conn.hashCode(), conn2.hashCode()); } public void testHashCodeNotEqual() { DelegatingConnection conn2 = new DelegatingConnection(delegateConn2); assertTrue(conn.hashCode() != conn2.hashCode()); } public void testEquals() { DelegatingConnection conn2 = new DelegatingConnection(delegateConn); DelegatingConnection conn3 = new DelegatingConnection(null); assertTrue(!conn.equals(null)); assertTrue(conn.equals(conn2)); assertTrue(!conn.equals(conn3)); assertTrue(conn.equals(conn)); } public void testCheckOpen() throws Exception { conn.checkOpen(); conn.close(); try { conn.checkOpen(); fail("Expecting SQLException"); } catch (SQLException ex) { // expected } } /** * Verify fix for DBCP-241 */ public void testCheckOpenNull() throws Exception { try { conn.close(); conn.checkOpen(); fail("Expecting SQLException"); } catch (SQLException ex) { assertTrue(ex.getMessage().endsWith("is closed.")); } try { conn = new DelegatingConnection(null); conn._closed = true; conn.checkOpen(); fail("Expecting SQLException"); } catch (SQLException ex) { assertTrue(ex.getMessage().endsWith("is null.")); } try { PoolingConnection pc = new PoolingConnection (delegateConn2, new GenericKeyedObjectPool()); conn = new DelegatingConnection(pc); pc.close(); conn.close(); conn.prepareStatement(""); fail("Expecting SQLException"); } catch (SQLException ex) { assertTrue(ex.getMessage().endsWith("is closed.")); } try { conn = new DelegatingConnection(new RTEGeneratingConnection()); conn.close(); conn.checkOpen(); fail("Expecting SQLException"); } catch (SQLException ex) { assertTrue(ex.getMessage().endsWith("is closed.")); } } /** * Delegate that will throw RTE on toString * Used to validate fix for DBCP-241 */ static class RTEGeneratingConnection extends TesterConnection { public RTEGeneratingConnection() { super("",""); } public String toString() { throw new RuntimeException("bang!"); } } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestAbandonedBasicDataSource.java0000644000175000017500000001322111333570547032643 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite for BasicDataSource with abandoned connection trace enabled * * @author Dirk Verbeeck * @version $Revision: 884205 $ $Date: 2009-11-25 12:25:48 -0500 (Wed, 25 Nov 2009) $ */ public class TestAbandonedBasicDataSource extends TestBasicDataSource { public TestAbandonedBasicDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestAbandonedBasicDataSource.class); } public void setUp() throws Exception { super.setUp(); // abandoned enabled but should not affect the basic tests // (very high timeout) ds.setLogAbandoned(true); ds.setRemoveAbandoned(true); ds.setRemoveAbandonedTimeout(10000); } public void tearDown() throws Exception { super.tearDown(); // nothing to do here } // ---------- Abandoned Test ----------- public void testAbandoned() throws Exception { // force abandoned ds.setRemoveAbandonedTimeout(0); ds.setMaxActive(1); for (int i = 0; i < 3; i++) { assertNotNull(ds.getConnection()); } } public void testAbandonedClose() throws Exception { // force abandoned ds.setRemoveAbandonedTimeout(0); ds.setMaxActive(1); ds.setAccessToUnderlyingConnectionAllowed(true); Connection conn1 = getConnection(); assertNotNull(conn1); assertEquals(1, ds.getNumActive()); Connection conn2 = getConnection(); // Attempt to borrow object triggers abandoned cleanup // conn1 should be closed by the pool to make room assertNotNull(conn2); assertEquals(1, ds.getNumActive()); // Verify that conn1 is closed assertTrue(((DelegatingConnection) conn1).getInnermostDelegate().isClosed()); conn2.close(); assertEquals(0, ds.getNumActive()); // Second close on conn1 is OK as of dbcp 1.3 conn1.close(); assertEquals(0, ds.getNumActive()); } public void testAbandonedCloseWithExceptions() throws Exception { // force abandoned ds.setRemoveAbandonedTimeout(0); ds.setMaxActive(1); ds.setAccessToUnderlyingConnectionAllowed(true); Connection conn1 = getConnection(); assertNotNull(conn1); assertEquals(1, ds.getNumActive()); Connection conn2 = getConnection(); assertNotNull(conn2); assertEquals(1, ds.getNumActive()); // set an IO failure causing the isClosed mathod to fail TesterConnection tconn1 = (TesterConnection) ((DelegatingConnection)conn1).getInnermostDelegate(); tconn1.setFailure(new IOException("network error")); TesterConnection tconn2 = (TesterConnection) ((DelegatingConnection)conn2).getInnermostDelegate(); tconn2.setFailure(new IOException("network error")); try { conn2.close(); } catch (SQLException ex) { } assertEquals(0, ds.getNumActive()); try { conn1.close(); } catch (SQLException ex) { } assertEquals(0, ds.getNumActive()); } /** * Verify that lastUsed property is updated when a connection * creates or prepares a statement */ public void testlastUsed() throws Exception { ds.setRemoveAbandonedTimeout(1); ds.setMaxActive(2); Connection conn1 = ds.getConnection(); Thread.sleep(500); conn1.createStatement(); // Should reset lastUsed Thread.sleep(800); Connection conn2 = ds.getConnection(); // triggers abandoned cleanup conn1.createStatement(); // Should still be OK conn2.close(); Thread.sleep(500); conn1.prepareStatement("SELECT 1 FROM DUAL"); // reset Thread.sleep(800); ds.getConnection(); // trigger abandoned cleanup again conn1.createStatement(); } /** * Verify that lastUsed property is updated when a connection * prepares a callable statement. */ public void testlastUsedPrepareCall() throws Exception { ds.setRemoveAbandonedTimeout(1); ds.setMaxActive(2); Connection conn1 = ds.getConnection(); Thread.sleep(500); conn1.prepareCall("{call home}"); // Should reset lastUsed Thread.sleep(800); Connection conn2 = ds.getConnection(); // triggers abandoned cleanup conn1.prepareCall("{call home}"); // Should still be OK conn2.close(); Thread.sleep(500); conn1.prepareCall("{call home}"); // reset Thread.sleep(800); ds.getConnection(); // trigger abandoned cleanup again conn1.createStatement(); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestBasicDataSource.java0000644000175000017500000004302211333570547031051 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Arrays; import junit.framework.Test; import junit.framework.TestSuite; /** * TestSuite for BasicDataSource * * @author Dirk Verbeeck * @version $Revision: 895859 $ $Date: 2010-01-04 21:18:58 -0500 (Mon, 04 Jan 2010) $ */ public class TestBasicDataSource extends TestConnectionPool { public TestBasicDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestBasicDataSource.class); } protected Connection getConnection() throws Exception { return ds.getConnection(); } protected BasicDataSource ds = null; private static final String CATALOG = "test catalog"; public void setUp() throws Exception { super.setUp(); ds = createDataSource(); ds.setDriverClassName("org.apache.commons.dbcp.TesterDriver"); ds.setUrl("jdbc:apache:commons:testdriver"); ds.setMaxActive(getMaxActive()); ds.setMaxWait(getMaxWait()); ds.setDefaultAutoCommit(true); ds.setDefaultReadOnly(false); ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); ds.setDefaultCatalog(CATALOG); ds.setUsername("username"); ds.setPassword("password"); ds.setValidationQuery("SELECT DUMMY FROM DUAL"); ds.setConnectionInitSqls(Arrays.asList(new String[] { "SELECT 1", "SELECT 2"})); } protected BasicDataSource createDataSource() throws Exception { return new BasicDataSource(); } public void tearDown() throws Exception { super.tearDown(); ds.close(); ds = null; } public void testClose() throws Exception { ds.setAccessToUnderlyingConnectionAllowed(true); // active connection is held open when ds is closed Connection activeConnection = getConnection(); Connection rawActiveConnection = ((DelegatingConnection) activeConnection).getInnermostDelegate(); assertFalse(activeConnection.isClosed()); assertFalse(rawActiveConnection.isClosed()); // idle connection is in pool but closed Connection idleConnection = getConnection(); Connection rawIdleConnection = ((DelegatingConnection) idleConnection).getInnermostDelegate(); assertFalse(idleConnection.isClosed()); assertFalse(rawIdleConnection.isClosed()); // idle wrapper should be closed but raw connection should be open idleConnection.close(); assertTrue(idleConnection.isClosed()); assertFalse(rawIdleConnection.isClosed()); ds.close(); // raw idle connection should now be closed assertTrue(rawIdleConnection.isClosed()); // active connection should still be open assertFalse(activeConnection.isClosed()); assertFalse(rawActiveConnection.isClosed()); // now close the active connection activeConnection.close(); // both wrapper and raw active connection should be closed assertTrue(activeConnection.isClosed()); assertTrue(rawActiveConnection.isClosed()); // Verify SQLException on getConnection after close try { getConnection(); fail("Expecting SQLException"); } catch (SQLException ex) { // Expected } // Redundant close is OK ds.close(); } public void testSetProperties() throws Exception { // normal ds.setConnectionProperties("name1=value1;name2=value2;name3=value3"); assertEquals(3, ds.connectionProperties.size()); assertEquals("value1", ds.connectionProperties.getProperty("name1")); assertEquals("value2", ds.connectionProperties.getProperty("name2")); assertEquals("value3", ds.connectionProperties.getProperty("name3")); // make sure all properties are replaced ds.setConnectionProperties("name1=value1;name2=value2"); assertEquals(2, ds.connectionProperties.size()); assertEquals("value1", ds.connectionProperties.getProperty("name1")); assertEquals("value2", ds.connectionProperties.getProperty("name2")); assertFalse(ds.connectionProperties.containsKey("name3")); // no value is empty string ds.setConnectionProperties("name1=value1;name2"); assertEquals(2, ds.connectionProperties.size()); assertEquals("value1", ds.connectionProperties.getProperty("name1")); assertEquals("", ds.connectionProperties.getProperty("name2")); // no value (with equals) is empty string ds.setConnectionProperties("name1=value1;name2="); assertEquals(2, ds.connectionProperties.size()); assertEquals("value1", ds.connectionProperties.getProperty("name1")); assertEquals("", ds.connectionProperties.getProperty("name2")); // single value ds.setConnectionProperties("name1=value1"); assertEquals(1, ds.connectionProperties.size()); assertEquals("value1", ds.connectionProperties.getProperty("name1")); // single value with trailing ; ds.setConnectionProperties("name1=value1;"); assertEquals(1, ds.connectionProperties.size()); assertEquals("value1", ds.connectionProperties.getProperty("name1")); // single value wit no value ds.setConnectionProperties("name1"); assertEquals(1, ds.connectionProperties.size()); assertEquals("", ds.connectionProperties.getProperty("name1")); // null should throw a NullPointerException try { ds.setConnectionProperties(null); fail("Expected NullPointerException"); } catch (NullPointerException e) { // expected } } public void testTransactionIsolationBehavior() throws Exception { Connection conn = getConnection(); assertNotNull(conn); assertEquals(Connection.TRANSACTION_READ_COMMITTED, conn.getTransactionIsolation()); conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); conn.close(); Connection conn2 = getConnection(); assertEquals(Connection.TRANSACTION_READ_COMMITTED, conn2.getTransactionIsolation()); Connection conn3 = getConnection(); assertEquals(Connection.TRANSACTION_READ_COMMITTED, conn3.getTransactionIsolation()); conn2.close(); conn3.close(); } public void testPooling() throws Exception { // this also needs access to the underlying connection ds.setAccessToUnderlyingConnectionAllowed(true); super.testPooling(); } public void testNoAccessToUnderlyingConnectionAllowed() throws Exception { // default: false assertEquals(false, ds.isAccessToUnderlyingConnectionAllowed()); Connection conn = getConnection(); Connection dconn = ((DelegatingConnection) conn).getDelegate(); assertNull(dconn); dconn = ((DelegatingConnection) conn).getInnermostDelegate(); assertNull(dconn); } public void testAccessToUnderlyingConnectionAllowed() throws Exception { ds.setAccessToUnderlyingConnectionAllowed(true); assertEquals(true, ds.isAccessToUnderlyingConnectionAllowed()); Connection conn = getConnection(); Connection dconn = ((DelegatingConnection) conn).getDelegate(); assertNotNull(dconn); dconn = ((DelegatingConnection) conn).getInnermostDelegate(); assertNotNull(dconn); assertTrue(dconn instanceof TesterConnection); } public void testEmptyValidationQuery() throws Exception { assertNotNull(ds.getValidationQuery()); ds.setValidationQuery(""); assertNull(ds.getValidationQuery()); ds.setValidationQuery(" "); assertNull(ds.getValidationQuery()); } public void testInvalidValidationQuery() { try { ds.setValidationQuery("invalid"); ds.getConnection(); fail("expected SQLException"); } catch (SQLException e) { if (e.toString().indexOf("invalid") < 0) { fail("expected detailed error message"); } } } public void testValidationQueryTimoutFail() { ds.setTestOnBorrow(true); ds.setValidationQueryTimeout(3); // Too fast for TesterStatement try { ds.getConnection(); fail("expected SQLException"); } catch (SQLException ex) { if (ex.toString().indexOf("timeout") < 0) { fail("expected timeout error message"); } } } public void testValidationQueryTimeoutZero() throws Exception { ds.setTestOnBorrow(true); ds.setTestOnReturn(true); ds.setValidationQueryTimeout(0); Connection con = ds.getConnection(); con.close(); } public void testValidationQueryTimeoutNegative() throws Exception { ds.setTestOnBorrow(true); ds.setTestOnReturn(true); ds.setValidationQueryTimeout(-1); Connection con = ds.getConnection(); con.close(); } public void testValidationQueryTimeoutSucceed() throws Exception { ds.setTestOnBorrow(true); ds.setTestOnReturn(true); ds.setValidationQueryTimeout(100); // Works for TesterStatement Connection con = ds.getConnection(); con.close(); } public void testEmptyInitConnectionSql() throws Exception { ds.setConnectionInitSqls(Arrays.asList(new String[]{"", " "})); assertNotNull(ds.getConnectionInitSqls()); assertEquals(0, ds.getConnectionInitSqls().size()); ds.setConnectionInitSqls(null); assertNotNull(ds.getConnectionInitSqls()); assertEquals(0, ds.getConnectionInitSqls().size()); } public void testInvalidConnectionInitSql() { try { ds.setConnectionInitSqls(Arrays.asList(new String[]{"SELECT 1","invalid"})); ds.getConnection(); fail("expected SQLException"); } catch (SQLException e) { if (e.toString().indexOf("invalid") < 0) { fail("expected detailed error message"); } } } public void testSetValidationTestProperties() { // defaults assertEquals(true, ds.getTestOnBorrow()); assertEquals(false, ds.getTestOnReturn()); assertEquals(false, ds.getTestWhileIdle()); ds.setTestOnBorrow(true); ds.setTestOnReturn(true); ds.setTestWhileIdle(true); assertEquals(true, ds.getTestOnBorrow()); assertEquals(true, ds.getTestOnReturn()); assertEquals(true, ds.getTestWhileIdle()); ds.setTestOnBorrow(false); ds.setTestOnReturn(false); ds.setTestWhileIdle(false); assertEquals(false, ds.getTestOnBorrow()); assertEquals(false, ds.getTestOnReturn()); assertEquals(false, ds.getTestWhileIdle()); } public void testNoValidationQuery() throws Exception { ds.setTestOnBorrow(true); ds.setTestOnReturn(true); ds.setTestWhileIdle(true); ds.setValidationQuery(""); Connection conn = ds.getConnection(); conn.close(); assertEquals(false, ds.getTestOnBorrow()); assertEquals(false, ds.getTestOnReturn()); assertEquals(false, ds.getTestWhileIdle()); } public void testDefaultCatalog() throws Exception { Connection[] c = new Connection[getMaxActive()]; for (int i = 0; i < c.length; i++) { c[i] = getConnection(); assertTrue(c[i] != null); assertEquals(CATALOG, c[i].getCatalog()); } for (int i = 0; i < c.length; i++) { c[i].setCatalog("error"); c[i].close(); } for (int i = 0; i < c.length; i++) { c[i] = getConnection(); assertTrue(c[i] != null); assertEquals(CATALOG, c[i].getCatalog()); } for (int i = 0; i < c.length; i++) { c[i].close(); } } public void testSetAutoCommitTrueOnClose() throws Exception { ds.setAccessToUnderlyingConnectionAllowed(true); ds.setDefaultAutoCommit(false); Connection conn = getConnection(); assertNotNull(conn); assertEquals(false, conn.getAutoCommit()); Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate(); assertNotNull(dconn); assertEquals(false, dconn.getAutoCommit()); conn.close(); assertEquals(true, dconn.getAutoCommit()); } public void testInitialSize() throws Exception { ds.setMaxActive(20); ds.setMaxIdle(20); ds.setInitialSize(10); Connection conn = getConnection(); assertNotNull(conn); conn.close(); assertEquals(0, ds.getNumActive()); assertEquals(10, ds.getNumIdle()); } // Bugzilla Bug 28251: Returning dead database connections to BasicDataSource // isClosed() failure blocks returning a connection to the pool public void testIsClosedFailure() throws SQLException { ds.setAccessToUnderlyingConnectionAllowed(true); Connection conn = ds.getConnection(); assertNotNull(conn); assertEquals(1, ds.getNumActive()); // set an IO failure causing the isClosed mathod to fail TesterConnection tconn = (TesterConnection) ((DelegatingConnection)conn).getInnermostDelegate(); tconn.setFailure(new IOException("network error")); try { conn.close(); fail("Expected SQLException"); } catch(SQLException ex) { } assertEquals(0, ds.getNumActive()); } /** * Bugzilla Bug 29054: * The BasicDataSource.setTestOnReturn(boolean) is not carried through to * the GenericObjectPool variable _testOnReturn. */ public void testPropertyTestOnReturn() throws Exception { ds.setValidationQuery("select 1 from dual"); ds.setTestOnBorrow(false); ds.setTestWhileIdle(false); ds.setTestOnReturn(true); Connection conn = ds.getConnection(); assertNotNull(conn); assertEquals(false, ds.connectionPool.getTestOnBorrow()); assertEquals(false, ds.connectionPool.getTestWhileIdle()); assertEquals(true, ds.connectionPool.getTestOnReturn()); } /** * Bugzilla Bug 29055: AutoCommit and ReadOnly * The DaffodilDB driver throws an SQLException if * trying to commit or rollback a readOnly connection. */ public void testRollbackReadOnly() throws Exception { ds.setDefaultReadOnly(true); ds.setDefaultAutoCommit(false); Connection conn = ds.getConnection(); assertNotNull(conn); conn.close(); } /** * Bugzilla Bug 29832: Broken behaviour for BasicDataSource.setMaxActive(0) * MaxActive == 0 should throw SQLException on getConnection. * Results from Bug 29863 in commons-pool. */ public void testMaxActiveZero() throws Exception { ds.setMaxActive(0); try { Connection conn = ds.getConnection(); assertNotNull(conn); fail("SQLException expected"); } catch (SQLException e) { // test OK } } /** * JIRA DBCP-93: If an SQLException occurs after the GenericObjectPool is * initialized in createDataSource, the evictor task is not cleaned up. */ public void testCreateDataSourceCleanupThreads() throws Exception { ds.close(); ds = null; ds = createDataSource(); ds.setDriverClassName("org.apache.commons.dbcp.TesterDriver"); ds.setUrl("jdbc:apache:commons:testdriver"); ds.setMaxActive(getMaxActive()); ds.setMaxWait(getMaxWait()); ds.setDefaultAutoCommit(true); ds.setDefaultReadOnly(false); ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); ds.setDefaultCatalog(CATALOG); ds.setUsername("username"); // Set timeBetweenEvictionRuns > 0, so evictor is created ds.setTimeBetweenEvictionRunsMillis(100); // Make password incorrect, so createDataSource will throw ds.setPassword("wrong"); ds.setValidationQuery("SELECT DUMMY FROM DUAL"); int threadCount = Thread.activeCount(); for (int i = 0; i < 10; i++) { try { ds.getConnection(); } catch (SQLException ex) { // ignore } } // Allow one extra thread for JRockit compatibility assertTrue(Thread.activeCount() <= threadCount + 1); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestPoolingDataSource.java0000644000175000017500000001443611333570547031446 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.util.Properties; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; /** * TestSuite for PoolingDataSource * * @version $Revision: 392677 $ $Date: 2006-04-08 21:42:24 -0700 (Sat, 08 Apr 2006) $ */ public class TestPoolingDataSource extends TestConnectionPool { public TestPoolingDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestPoolingDataSource.class); } protected Connection getConnection() throws Exception { return ds.getConnection(); } protected PoolingDataSource ds = null; private GenericObjectPool pool = null; public void setUp() throws Exception { super.setUp(); pool = new GenericObjectPool(); pool.setMaxActive(getMaxActive()); pool.setMaxWait(getMaxWait()); Properties props = new Properties(); props.setProperty("user", "username"); props.setProperty("password", "password"); PoolableConnectionFactory factory = new PoolableConnectionFactory( new DriverConnectionFactory(new TesterDriver(), "jdbc:apache:commons:testdriver", props), pool, null, "SELECT DUMMY FROM DUAL", true, true); pool.setFactory(factory); ds = new PoolingDataSource(pool); ds.setAccessToUnderlyingConnectionAllowed(true); } public void tearDown() throws Exception { pool.close(); super.tearDown(); } public void testPoolGuardConnectionWrapperEqualsSameDelegate() throws Exception { // Get a maximal set of connections from the pool Connection[] c = new Connection[getMaxActive()]; for (int i = 0; i < c.length; i++) { c[i] = newConnection(); } // Close the delegate of one wrapper in the pool ((DelegatingConnection) c[0]).getDelegate().close(); // Grab a new connection - should get c[0]'s closed connection // so should be delegate-equivalent, so equal Connection con = newConnection(); assertTrue(c[0].equals(con)); assertTrue(con.equals(c[0])); for (int i = 0; i < c.length; i++) { c[i].close(); } } private void checkPoolGuardConnectionWrapperEqualsReflexive() throws Exception { Connection con = ds.getConnection(); Connection con2 = con; assertTrue(con2.equals(con)); assertTrue(con.equals(con2)); con.close(); } /* * JIRA: DBCP-198 */ public void testPoolGuardConnectionWrapperEqualsReflexive() throws Exception { // Statndard setup - using DelegatingConnections // returned from PoolableConnectionFactory checkPoolGuardConnectionWrapperEqualsReflexive(); // Force PoolGuardConnectionWrappers to wrap non-Delegating connections pool.close(); pool = new GenericObjectPool(); pool.setMaxActive(getMaxActive()); pool.setMaxWait(getMaxWait()); Properties props = new Properties(); props.setProperty("user", "username"); props.setProperty("password", "password"); NonDelegatingPoolableConnectionFactory factory = new NonDelegatingPoolableConnectionFactory( new DriverConnectionFactory(new TesterDriver(), "jdbc:apache:commons:testdriver", props), pool); pool.setFactory(factory); ds = new PoolingDataSource(pool); checkPoolGuardConnectionWrapperEqualsReflexive(); } public void testPoolGuardConnectionWrapperEqualsFail() throws Exception { Connection con1 = ds.getConnection(); Connection con2 = ds.getConnection(); assertFalse(con1.equals(con2)); con1.close(); con2.close(); } public void testPoolGuardConnectionWrapperEqualsNull() throws Exception { Connection con1 = ds.getConnection(); Connection con2 = null; assertFalse(con1.equals(con2)); con1.close(); } public void testPoolGuardConnectionWrapperEqualsType() throws Exception { Connection con1 = ds.getConnection(); Integer con2 = new Integer(0); assertFalse(con1.equals(con2)); con1.close(); } public void testestPoolGuardConnectionWrapperEqualInnermost() throws Exception { ds.setAccessToUnderlyingConnectionAllowed(true); DelegatingConnection con = (DelegatingConnection) ds.getConnection(); Connection inner = con.getInnermostDelegate(); ds.setAccessToUnderlyingConnectionAllowed(false); DelegatingConnection con2 = new DelegatingConnection(inner); assertTrue(con2.equals(con)); assertTrue(con.innermostDelegateEquals(con2.getInnermostDelegate())); assertTrue(con2.innermostDelegateEquals(inner)); assertTrue(con.equals(con2)); } /** Factory to return non-delegating connections for DBCP-198 test */ private static class NonDelegatingPoolableConnectionFactory extends PoolableConnectionFactory { public NonDelegatingPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool) { super(connFactory, pool, null, null, true, true); } synchronized public Object makeObject() throws Exception { return _connFactory.createConnection(); } } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TesterCallableStatement.java0000644000175000017500000003131411333570547031771 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.net.URL; import java.sql.Array; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.Date; import java.sql.Ref; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.Map; /* JDBC_4_ANT_KEY_BEGIN */ import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; /* JDBC_4_ANT_KEY_END */ /** * Trivial implementation of a CallableStatement to avoid null pointer exceptions in tests. * * @author Dain Sundstrom * @version $Revision$ */ public class TesterCallableStatement extends TesterPreparedStatement implements CallableStatement { public TesterCallableStatement(Connection conn) { super(conn); } public TesterCallableStatement(Connection conn, String sql) { super(conn, sql); } public TesterCallableStatement(Connection conn, String sql, int resultSetType, int resultSetConcurrency) { super(conn, sql, resultSetType, resultSetConcurrency); } public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException { } public void registerOutParameter(int parameterIndex, int sqlType, int scale) throws SQLException { } public boolean wasNull() throws SQLException { return false; } public String getString(int parameterIndex) throws SQLException { return null; } public boolean getBoolean(int parameterIndex) throws SQLException { return false; } public byte getByte(int parameterIndex) throws SQLException { return 0; } public short getShort(int parameterIndex) throws SQLException { return 0; } public int getInt(int parameterIndex) throws SQLException { return 0; } public long getLong(int parameterIndex) throws SQLException { return 0; } public float getFloat(int parameterIndex) throws SQLException { return 0; } public double getDouble(int parameterIndex) throws SQLException { return 0; } /** * @deprecated */ public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException { return null; } public byte[] getBytes(int parameterIndex) throws SQLException { return new byte[0]; } public Date getDate(int parameterIndex) throws SQLException { return null; } public Time getTime(int parameterIndex) throws SQLException { return null; } public Timestamp getTimestamp(int parameterIndex) throws SQLException { return null; } public Object getObject(int parameterIndex) throws SQLException { return null; } public BigDecimal getBigDecimal(int parameterIndex) throws SQLException { return null; } public Object getObject(int i, Map map) throws SQLException { return null; } public Ref getRef(int i) throws SQLException { return null; } public Blob getBlob(int i) throws SQLException { return null; } public Clob getClob(int i) throws SQLException { return null; } public Array getArray(int i) throws SQLException { return null; } public Date getDate(int parameterIndex, Calendar cal) throws SQLException { return null; } public Time getTime(int parameterIndex, Calendar cal) throws SQLException { return null; } public Timestamp getTimestamp(int parameterIndex, Calendar cal) throws SQLException { return null; } public void registerOutParameter(int paramIndex, int sqlType, String typeName) throws SQLException { } public void registerOutParameter(String parameterName, int sqlType) throws SQLException { } public void registerOutParameter(String parameterName, int sqlType, int scale) throws SQLException { } public void registerOutParameter(String parameterName, int sqlType, String typeName) throws SQLException { } public URL getURL(int parameterIndex) throws SQLException { return null; } public void setURL(String parameterName, URL val) throws SQLException { } public void setNull(String parameterName, int sqlType) throws SQLException { } public void setBoolean(String parameterName, boolean x) throws SQLException { } public void setByte(String parameterName, byte x) throws SQLException { } public void setShort(String parameterName, short x) throws SQLException { } public void setInt(String parameterName, int x) throws SQLException { } public void setLong(String parameterName, long x) throws SQLException { } public void setFloat(String parameterName, float x) throws SQLException { } public void setDouble(String parameterName, double x) throws SQLException { } public void setBigDecimal(String parameterName, BigDecimal x) throws SQLException { } public void setString(String parameterName, String x) throws SQLException { } public void setBytes(String parameterName, byte x[]) throws SQLException { } public void setDate(String parameterName, Date x) throws SQLException { } public void setTime(String parameterName, Time x) throws SQLException { } public void setTimestamp(String parameterName, Timestamp x) throws SQLException { } public void setAsciiStream(String parameterName, InputStream x, int length) throws SQLException { } public void setBinaryStream(String parameterName, InputStream x, int length) throws SQLException { } public void setObject(String parameterName, Object x, int targetSqlType, int scale) throws SQLException { } public void setObject(String parameterName, Object x, int targetSqlType) throws SQLException { } public void setObject(String parameterName, Object x) throws SQLException { } public void setCharacterStream(String parameterName, Reader reader, int length) throws SQLException { } public void setDate(String parameterName, Date x, Calendar cal) throws SQLException { } public void setTime(String parameterName, Time x, Calendar cal) throws SQLException { } public void setTimestamp(String parameterName, Timestamp x, Calendar cal) throws SQLException { } public void setNull(String parameterName, int sqlType, String typeName) throws SQLException { } public String getString(String parameterName) throws SQLException { return null; } public boolean getBoolean(String parameterName) throws SQLException { return false; } public byte getByte(String parameterName) throws SQLException { return 0; } public short getShort(String parameterName) throws SQLException { return 0; } public int getInt(String parameterName) throws SQLException { return 0; } public long getLong(String parameterName) throws SQLException { return 0; } public float getFloat(String parameterName) throws SQLException { return 0; } public double getDouble(String parameterName) throws SQLException { return 0; } public byte[] getBytes(String parameterName) throws SQLException { return new byte[0]; } public Date getDate(String parameterName) throws SQLException { return null; } public Time getTime(String parameterName) throws SQLException { return null; } public Timestamp getTimestamp(String parameterName) throws SQLException { return null; } public Object getObject(String parameterName) throws SQLException { return null; } public BigDecimal getBigDecimal(String parameterName) throws SQLException { return null; } public Object getObject(String parameterName, Map map) throws SQLException { return null; } public Ref getRef(String parameterName) throws SQLException { return null; } public Blob getBlob(String parameterName) throws SQLException { return null; } public Clob getClob(String parameterName) throws SQLException { return null; } public Array getArray(String parameterName) throws SQLException { return null; } public Date getDate(String parameterName, Calendar cal) throws SQLException { return null; } public Time getTime(String parameterName, Calendar cal) throws SQLException { return null; } public Timestamp getTimestamp(String parameterName, Calendar cal) throws SQLException { return null; } public URL getURL(String parameterName) throws SQLException { return null; } /* JDBC_4_ANT_KEY_BEGIN */ public RowId getRowId(int parameterIndex) throws SQLException { return null; } public RowId getRowId(String parameterName) throws SQLException { return null; } public void setRowId(String parameterName, RowId value) throws SQLException { } public void setNString(String parameterName, String value) throws SQLException { } public void setNCharacterStream(String parameterName, Reader reader, long length) throws SQLException { } public void setNClob(String parameterName, NClob value) throws SQLException { } public void setClob(String parameterName, Reader reader, long length) throws SQLException { } public void setBlob(String parameterName, InputStream inputStream, long length) throws SQLException { } public void setNClob(String parameterName, Reader reader, long length) throws SQLException { } public NClob getNClob(int parameterIndex) throws SQLException { return null; } public NClob getNClob(String parameterName) throws SQLException { return null; } public void setSQLXML(String parameterName, SQLXML value) throws SQLException { } public SQLXML getSQLXML(int parameterIndex) throws SQLException { return null; } public SQLXML getSQLXML(String parameterName) throws SQLException { return null; } public String getNString(int parameterIndex) throws SQLException { return null; } public String getNString(String parameterName) throws SQLException { return null; } public Reader getNCharacterStream(int parameterIndex) throws SQLException { return null; } public Reader getNCharacterStream(String parameterName) throws SQLException { return null; } public Reader getCharacterStream(int parameterIndex) throws SQLException { return null; } public Reader getCharacterStream(String parameterName) throws SQLException { return null; } public void setBlob(String parameterName, Blob blob) throws SQLException { } public void setClob(String parameterName, Clob clob) throws SQLException { } public void setAsciiStream(String parameterName, InputStream inputStream, long length) throws SQLException { } public void setBinaryStream(String parameterName, InputStream inputStream, long length) throws SQLException { } public void setCharacterStream(String parameterName, Reader reader, long length) throws SQLException { } public void setAsciiStream(String parameterName, InputStream inputStream) throws SQLException { } public void setBinaryStream(String parameterName, InputStream inputStream) throws SQLException { } public void setCharacterStream(String parameterName, Reader reader) throws SQLException { } public void setNCharacterStream(String parameterName, Reader reader) throws SQLException { } public void setClob(String parameterName, Reader reader) throws SQLException { } public void setBlob(String parameterName, InputStream inputStream) throws SQLException { } public void setNClob(String parameterName, Reader reader) throws SQLException { } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestDelegatingPreparedStatement.java0000644000175000017500000001124111333570547033466 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.PreparedStatement; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * @author Rodney Waldhoff * @author Dirk Verbeeck * @version $Revision: 896720 $ $Date: 2010-01-06 18:43:07 -0500 (Wed, 06 Jan 2010) $ */ public class TestDelegatingPreparedStatement extends TestCase { public TestDelegatingPreparedStatement(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestDelegatingPreparedStatement.class); } private DelegatingConnection conn = null; private Connection delegateConn = null; private DelegatingPreparedStatement stmt = null; private PreparedStatement delegateStmt = null; public void setUp() throws Exception { delegateConn = new TesterConnection("test", "test"); conn = new DelegatingConnection(delegateConn); } public void testExecuteQueryReturnsNull() throws Exception { delegateStmt = new TesterPreparedStatement(delegateConn,"null"); stmt = new DelegatingPreparedStatement(conn,delegateStmt); assertNull(stmt.executeQuery()); } public void testExecuteQueryReturnsNotNull() throws Exception { delegateStmt = new TesterPreparedStatement(delegateConn,"select * from foo"); stmt = new DelegatingPreparedStatement(conn,delegateStmt); assertTrue(null != stmt.executeQuery()); } public void testGetDelegate() throws Exception { delegateStmt = new TesterPreparedStatement(delegateConn,"select * from foo"); stmt = new DelegatingPreparedStatement(conn,delegateStmt); assertEquals(delegateStmt,stmt.getDelegate()); } public void testHashCodeNull() { stmt = new DelegatingPreparedStatement(conn, null); assertEquals(0, stmt.hashCode()); } public void testHashCode() { delegateStmt = new TesterPreparedStatement(delegateConn,"select * from foo"); DelegatingPreparedStatement stmt1 = new DelegatingPreparedStatement(conn,delegateStmt); DelegatingPreparedStatement stmt2 = new DelegatingPreparedStatement(conn,delegateStmt); assertEquals(stmt1.hashCode(), stmt2.hashCode()); } public void testEquals() { delegateStmt = new TesterPreparedStatement(delegateConn,"select * from foo"); PreparedStatement del = new TesterPreparedStatement(delegateConn,"select * from foo"); DelegatingPreparedStatement stmt1 = new DelegatingPreparedStatement(conn, delegateStmt); DelegatingPreparedStatement stmt2 = new DelegatingPreparedStatement(conn, delegateStmt); DelegatingPreparedStatement stmt3 = new DelegatingPreparedStatement(conn, null); DelegatingPreparedStatement stmt4 = new DelegatingPreparedStatement(conn, del); // Nothing is equal to null assertFalse(stmt1.equals(null)); assertFalse(stmt2.equals(null)); assertFalse(stmt3.equals(null)); assertFalse(stmt4.equals(null)); // 1 & 2 are equivalent assertTrue(stmt1.equals(stmt2)); assertTrue(stmt2.equals(stmt1)); // reflexive // 1 & 3 are not (different statements, one null) assertFalse(stmt1.equals(stmt3)); assertFalse(stmt3.equals(stmt1)); // reflexive // 1 & 4 are not (different statements) assertFalse(stmt1.equals(stmt4)); assertFalse(stmt4.equals(stmt1)); // reflexive // Check self-equals assertTrue(stmt1.equals(stmt1)); assertTrue(stmt2.equals(stmt2)); assertFalse(stmt3.equals(stmt3)); // because underlying statement is null assertTrue(stmt4.equals(stmt4)); DelegatingStatement dstmt1 = stmt1; // 1 & 2 are equivalent assertTrue(dstmt1.equals(stmt2)); assertTrue(stmt2.equals(dstmt1)); // reflexive } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestBasicDataSourceFactory.java0000644000175000017500000001257611333570547032413 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.util.Properties; import javax.sql.DataSource; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * TestSuite for BasicDataSourceFactory * * @author Dirk Verbeeck * @version $Revision: 828639 $ $Date: 2009-10-22 06:27:43 -0400 (Thu, 22 Oct 2009) $ */ public class TestBasicDataSourceFactory extends TestCase { public TestBasicDataSourceFactory(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestBasicDataSourceFactory.class); } public void testNoProperties() throws Exception { Properties properties = new Properties(); DataSource ds = BasicDataSourceFactory.createDataSource(properties); assertNotNull(ds); assertTrue(ds instanceof BasicDataSource); } public void testProperties() throws Exception { Properties properties = new Properties(); properties.setProperty("driverClassName", "org.apache.commons.dbcp.TesterDriver"); properties.setProperty("url", "jdbc:apache:commons:testdriver"); properties.setProperty("maxActive", "10"); properties.setProperty("maxIdle", "8"); properties.setProperty("minIdle", "0"); properties.setProperty("maxWait", "500"); properties.setProperty("initialSize", "5"); properties.setProperty("defaultAutoCommit", "true"); properties.setProperty("defaultReadOnly", "false"); properties.setProperty("defaultTransactionIsolation", "READ_COMMITTED"); properties.setProperty("defaultCatalog", "test"); properties.setProperty("testOnBorrow", "true"); properties.setProperty("testOnReturn", "false"); properties.setProperty("username", "username"); properties.setProperty("password", "password"); properties.setProperty("validationQuery", "SELECT DUMMY FROM DUAL"); properties.setProperty("validationQueryTimeout", "100"); properties.setProperty("initConnectionSqls", "SELECT 1;SELECT 2"); properties.setProperty("timeBetweenEvictionRunsMillis", "1000"); properties.setProperty("minEvictableIdleTimeMillis", "2000"); properties.setProperty("numTestsPerEvictionRun", "2"); properties.setProperty("testWhileIdle", "true"); properties.setProperty("accessToUnderlyingConnectionAllowed", "true"); properties.setProperty("removeAbandoned", "true"); properties.setProperty("removeAbandonedTimeout", "3000"); properties.setProperty("logAbandoned", "true"); properties.setProperty("poolPreparedStatements", "true"); properties.setProperty("maxOpenPreparedStatements", "10"); BasicDataSource ds = (BasicDataSource) BasicDataSourceFactory.createDataSource(properties); assertEquals("org.apache.commons.dbcp.TesterDriver", ds.getDriverClassName()); assertEquals("jdbc:apache:commons:testdriver", ds.getUrl()); assertEquals(10, ds.getMaxActive()); assertEquals(8, ds.getMaxIdle()); assertEquals(0, ds.getMinIdle()); assertEquals(500, ds.getMaxWait()); assertEquals(5, ds.getInitialSize()); assertEquals(5, ds.getNumIdle()); assertEquals(true, ds.getDefaultAutoCommit()); assertEquals(false, ds.getDefaultReadOnly()); assertEquals(Connection.TRANSACTION_READ_COMMITTED, ds.getDefaultTransactionIsolation()); assertEquals("test", ds.getDefaultCatalog()); assertEquals(true, ds.getTestOnBorrow()); assertEquals(false, ds.getTestOnReturn()); assertEquals("username", ds.getUsername()); assertEquals("password", ds.getPassword()); assertEquals("SELECT DUMMY FROM DUAL", ds.getValidationQuery()); assertEquals(100, ds.getValidationQueryTimeout()); assertEquals(2, ds.connectionInitSqls.size()); assertEquals("SELECT 1", ds.connectionInitSqls.get(0)); assertEquals("SELECT 2", ds.connectionInitSqls.get(1)); assertEquals(1000, ds.getTimeBetweenEvictionRunsMillis()); assertEquals(2000, ds.getMinEvictableIdleTimeMillis()); assertEquals(2, ds.getNumTestsPerEvictionRun()); assertEquals(true, ds.getTestWhileIdle()); assertEquals(true, ds.isAccessToUnderlyingConnectionAllowed()); assertEquals(true, ds.getRemoveAbandoned()); assertEquals(3000, ds.getRemoveAbandonedTimeout()); assertEquals(true, ds.getLogAbandoned()); assertEquals(true, ds.isPoolPreparedStatements()); assertEquals(10, ds.getMaxOpenPreparedStatements()); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/0000755000175000017500000000000011337741616026667 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/ConnectionPoolDataSourceProxy.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/ConnectionPoolDataSourceP0000644000175000017500000000526211333570547033642 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.PrintWriter; import java.sql.SQLException; import javax.sql.ConnectionPoolDataSource; import javax.sql.PooledConnection; /** * ConnectionPoolDataSource implementation that proxies another * ConnectionPoolDataSource. * * @version $Revision$ $Date$ */ public class ConnectionPoolDataSourceProxy implements ConnectionPoolDataSource { protected ConnectionPoolDataSource delegate = null; public ConnectionPoolDataSourceProxy(ConnectionPoolDataSource cpds) { this.delegate = cpds; } public ConnectionPoolDataSource getDelegate() { return delegate; } public int getLoginTimeout() throws SQLException { return delegate.getLoginTimeout(); } public PrintWriter getLogWriter() throws SQLException { return delegate.getLogWriter(); } /** * Return a TesterPooledConnection with notifyOnClose turned on */ public PooledConnection getPooledConnection() throws SQLException { return wrapPooledConnection(delegate.getPooledConnection()); } /** * Return a TesterPooledConnection with notifyOnClose turned on */ public PooledConnection getPooledConnection(String user, String password) throws SQLException { return wrapPooledConnection(delegate.getPooledConnection(user, password)); } public void setLoginTimeout(int seconds) throws SQLException { delegate.setLoginTimeout(seconds); } public void setLogWriter(PrintWriter out) throws SQLException { delegate.setLogWriter(out); } /** * Create a TesterPooledConnection with notifyOnClose turned on */ protected PooledConnection wrapPooledConnection(PooledConnection pc) { PooledConnectionProxy tpc = new PooledConnectionProxy(pc); tpc.setNotifyOnClose(true); return tpc; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/PooledConnectionProxy.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/PooledConnectionProxy.jav0000644000175000017500000001076311333570547033703 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.sql.Connection; import java.sql.SQLException; import java.util.Collection; import java.util.Vector; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; import javax.sql.PooledConnection; /* JDBC_4_ANT_KEY_BEGIN */ import javax.sql.StatementEventListener; /* JDBC_4_ANT_KEY_END */ /** * PooledConnection implementation that wraps a driver-supplied * PooledConnection and proxies events, allowing behavior to be * modified to simulate behavior of different implementations. * * @version $Revision$ $Date$ */ public class PooledConnectionProxy implements PooledConnection, ConnectionEventListener { protected PooledConnection delegate = null; /** * ConnectionEventListeners */ private Vector eventListeners = new Vector(); /** * True means we will (dubiously) notify listeners with a * ConnectionClosed event when this (i.e. the PooledConnection itself) * is closed */ private boolean notifyOnClose = false; public PooledConnectionProxy(PooledConnection pooledConnection) { this.delegate = pooledConnection; pooledConnection.addConnectionEventListener(this); } /** * If notifyOnClose is on, notify listeners */ public void close() throws SQLException { delegate.close(); if (isNotifyOnClose()) { notifyListeners(); } } public Connection getConnection() throws SQLException { return delegate.getConnection(); } /** * Remove event listeners. */ public void removeConnectionEventListener(ConnectionEventListener listener) { eventListeners.remove(listener); } /* JDBC_4_ANT_KEY_BEGIN */ public void removeStatementEventListener(StatementEventListener listener) { eventListeners.remove(listener); } /* JDBC_4_ANT_KEY_END */ public boolean isNotifyOnClose() { return notifyOnClose; } public void setNotifyOnClose(boolean notifyOnClose) { this.notifyOnClose = notifyOnClose; } /** * sends a connectionClosed event to listeners. */ void notifyListeners() { ConnectionEvent event = new ConnectionEvent(this); Object[] listeners = eventListeners.toArray(); for (int i = 0; i < listeners.length; i++) { ((ConnectionEventListener) listeners[i]).connectionClosed(event); } } /** * Add event listeners. */ public void addConnectionEventListener(ConnectionEventListener listener) { if (!eventListeners.contains(listener)) { eventListeners.add(listener); } } /* JDBC_4_ANT_KEY_BEGIN */ public void addStatementEventListener(StatementEventListener listener) { if (!eventListeners.contains(listener)) { eventListeners.add(listener); } } /* JDBC_4_ANT_KEY_END */ /** * Pass closed events on to listeners */ public void connectionClosed(ConnectionEvent event) { notifyListeners(); } /** * Pass error events on to listeners */ public void connectionErrorOccurred(ConnectionEvent event) { Object[] listeners = eventListeners.toArray(); for (int i = 0; i < listeners.length; i++) { ((ConnectionEventListener) listeners[i]).connectionErrorOccurred(event); } } /** * Generate a connection error event */ public void throwConnectionError() { ConnectionEvent event = new ConnectionEvent(this); connectionErrorOccurred(event); } /** * Expose listeners */ public Collection getListeners() { return eventListeners; } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/TestFactory.java0000644000175000017500000000471211333570547032004 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.util.Hashtable; import javax.naming.CompositeName; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * @author Dirk Verbeeck * @version $Revision: 479137 $ $Date: 2006-11-25 10:51:48 -0500 (Sat, 25 Nov 2006) $ */ public class TestFactory extends TestCase { public TestFactory(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestFactory.class); } // Bugzilla Bug 24082: bug in InstanceKeyDataSourceFactory // There's a fatal bug in InstanceKeyDataSourceFactory that means you can't // instantiate more than one factory. // http://issues.apache.org/bugzilla/show_bug.cgi?id=24082 public void testJNDI2Pools() throws Exception { Reference refObj = new Reference(SharedPoolDataSource.class.getName()); refObj.add(new StringRefAddr("dataSourceName","java:comp/env/jdbc/bookstoreCPDS")); Context context = new InitialContext(); Hashtable env = new Hashtable(); ObjectFactory factory = new SharedPoolDataSourceFactory(); Name name = new CompositeName("myDB"); Object obj = factory.getObjectInstance(refObj, name, context, env); assertNotNull(obj); Name name2 = new CompositeName("myDB2"); Object obj2 = factory.getObjectInstance(refObj, name2, context, env); assertNotNull(obj2); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/TestCPDSConnectionFactory.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/TestCPDSConnectionFactory0000644000175000017500000001327311333570547033560 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.sql.Connection; import java.sql.SQLException; import javax.sql.PooledConnection; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS; import org.apache.commons.pool.impl.GenericObjectPool; /** * @version $Revision$ $Date$ */ public class TestCPDSConnectionFactory extends TestCase { protected ConnectionPoolDataSourceProxy cpds = null; public TestCPDSConnectionFactory(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestCPDSConnectionFactory.class); } public void setUp() throws Exception { cpds = new ConnectionPoolDataSourceProxy(new DriverAdapterCPDS()); DriverAdapterCPDS delegate = (DriverAdapterCPDS) cpds.getDelegate(); delegate.setDriver("org.apache.commons.dbcp.TesterDriver"); delegate.setUrl("jdbc:apache:commons:testdriver"); delegate.setUser("username"); delegate.setPassword("password"); } /** * JIRA DBCP-216 * * Check PoolableConnection close triggered by destroy is handled * properly. PooledConnectionProxy (dubiously) fires connectionClosed * when PooledConnection itself is closed. */ public void testSharedPoolDSDestroyOnReturn() throws Exception { PerUserPoolDataSource ds = new PerUserPoolDataSource(); ds.setConnectionPoolDataSource(cpds); ds.setPerUserMaxActive("username",new Integer(10));// Integer.valueOf() is Java 1.5 ds.setPerUserMaxWait("username",new Integer(50)); ds.setPerUserMaxIdle("username",new Integer(2)); Connection conn1 = ds.getConnection("username", "password"); Connection conn2 = ds.getConnection("username", "password"); Connection conn3 = ds.getConnection("username", "password"); assertEquals(3, ds.getNumActive("username", "password")); conn1.close(); assertEquals(1, ds.getNumIdle("username", "password")); conn2.close(); assertEquals(2, ds.getNumIdle("username", "password")); conn3.close(); // Return to pool will trigger destroy -> close sequence assertEquals(2, ds.getNumIdle("username", "password")); } /** * JIRA DBCP-216 * * Verify that pool counters are maintained properly and listeners are * cleaned up when a PooledConnection throws a connectionError event. */ public void testConnectionErrorCleanup() throws Exception { // Setup factory GenericObjectPool pool = new GenericObjectPool(null); CPDSConnectionFactory factory = new CPDSConnectionFactory(cpds, pool, null, "username", "password"); // Checkout a pair of connections PooledConnection pcon1 = ((PooledConnectionAndInfo) pool.borrowObject()) .getPooledConnection(); Connection con1 = pcon1.getConnection(); PooledConnection pcon2 = ((PooledConnectionAndInfo) pool.borrowObject()) .getPooledConnection(); assertEquals(2, pool.getNumActive()); assertEquals(0, pool.getNumIdle()); // Verify listening PooledConnectionProxy pc = (PooledConnectionProxy) pcon1; assertTrue(pc.getListeners().contains(factory)); // Throw connectionError event pc.throwConnectionError(); // Active count should be reduced by 1 and no idle increase assertEquals(1, pool.getNumActive()); assertEquals(0, pool.getNumIdle()); // Throw another one - should be ignored pc.throwConnectionError(); assertEquals(1, pool.getNumActive()); assertEquals(0, pool.getNumIdle()); // Ask for another connection PooledConnection pcon3 = ((PooledConnectionAndInfo) pool.borrowObject()) .getPooledConnection(); assertTrue(!pcon3.equals(pcon1)); // better not get baddie back assertTrue(!pc.getListeners().contains(factory)); // verify cleanup assertEquals(2, pool.getNumActive()); assertEquals(0, pool.getNumIdle()); // Return good connections back to pool pcon2.getConnection().close(); pcon3.getConnection().close(); assertEquals(2, pool.getNumIdle()); assertEquals(0, pool.getNumActive()); // Verify pc is closed try { pc.getConnection(); fail("Expecting SQLException using closed PooledConnection"); } catch (SQLException ex) { // expected } // Back from the dead - ignore the ghost! con1.close(); assertEquals(2, pool.getNumIdle()); assertEquals(0, pool.getNumActive()); // Clear pool factory.getPool().clear(); assertEquals(0, pool.getNumIdle()); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/TestInstanceKeyDataSource.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/TestInstanceKeyDataSource0000644000175000017500000000525311333570547033646 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.sql.Connection; import java.sql.SQLException; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS; /** * @version $Revision$ $Date$ */ public class TestInstanceKeyDataSource extends TestCase { public TestInstanceKeyDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestInstanceKeyDataSource.class); } public void setUp() throws Exception { } /** * Verify that exception on setupDefaults does not leak PooledConnection * * JIRA: DBCP-237 */ public void testExceptionOnSetupDefaults() throws Exception { DriverAdapterCPDS pcds; pcds = new DriverAdapterCPDS(); pcds.setDriver("org.apache.commons.dbcp.TesterDriver"); pcds.setUrl("jdbc:apache:commons:testdriver"); pcds.setUser("foo"); pcds.setPassword("bar"); pcds.setPoolPreparedStatements(false); ThrowOnSetupDefaultsDataSource tds = new ThrowOnSetupDefaultsDataSource(); tds.setConnectionPoolDataSource(pcds); int numConnections = tds.getNumActive(); try { tds.getConnection("foo", "bar"); fail("Expecting SQLException"); } catch (SQLException ex) { //Expected } assertEquals(numConnections,tds.getNumActive()); } private static class ThrowOnSetupDefaultsDataSource extends SharedPoolDataSource { private static final long serialVersionUID = -448025812063133259L; ThrowOnSetupDefaultsDataSource() { super(); } protected void setupDefaults(Connection con, String username) throws SQLException { throw new SQLException("bang!"); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/TestPerUserPoolDataSource.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/datasources/TestPerUserPoolDataSource0000644000175000017500000004441211333570547033650 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.dbcp.TestConnectionPool; import org.apache.commons.dbcp.TesterDriver; import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS; /** * @author John McNally * @author Dirk Verbeeck * @version $Revision: 907359 $ $Date: 2010-02-06 20:07:29 -0500 (Sat, 06 Feb 2010) $ */ public class TestPerUserPoolDataSource extends TestConnectionPool { public TestPerUserPoolDataSource(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestPerUserPoolDataSource.class); } protected Connection getConnection() throws SQLException { return ds.getConnection("foo","bar"); } private DataSource ds; public void setUp() throws Exception { super.setUp(); DriverAdapterCPDS pcds = new DriverAdapterCPDS(); pcds.setDriver("org.apache.commons.dbcp.TesterDriver"); pcds.setUrl("jdbc:apache:commons:testdriver"); pcds.setUser("foo"); pcds.setPassword("bar"); pcds.setAccessToUnderlyingConnectionAllowed(true); PerUserPoolDataSource tds = new PerUserPoolDataSource(); tds.setConnectionPoolDataSource(pcds); tds.setDefaultMaxActive(getMaxActive()); tds.setDefaultMaxWait((int)(getMaxWait())); tds.setPerUserMaxActive("foo",new Integer(getMaxActive())); tds.setPerUserMaxWait("foo",new Integer((int)(getMaxWait()))); tds.setDefaultTransactionIsolation( Connection.TRANSACTION_READ_COMMITTED); ds = tds; } public void testBackPointers() throws Exception { // todo disabled until a wrapping issuen in PerUserPoolDataSource are resolved } /** * Switching 'u1 -> 'u2' and 'p1' -> 'p2' will * exhibit the bug detailed in * http://issues.apache.org/bugzilla/show_bug.cgi?id=18905 */ public void testIncorrectPassword() throws Exception { try { // Use bad password ds.getConnection("u1", "zlsafjk"); fail("Able to retrieve connection with incorrect password"); } catch (SQLException e1) { // should fail } // Use good password ds.getConnection("u1", "p1").close(); try { ds.getConnection("u1", "x"); fail("Able to retrieve connection with incorrect password"); } catch (SQLException e) { if (!e.getMessage().startsWith("Given password did not match")) { throw e; } // else the exception was expected } // Make sure we can still use our good password. ds.getConnection("u1", "p1").close(); // Try related users and passwords ds.getConnection("foo", "bar").close(); try { ds.getConnection("foob", "ar"); fail("Should have caused an SQLException"); } catch (SQLException expected) { } try { ds.getConnection("foo", "baz"); fail("Should have generated SQLException"); } catch (SQLException expected) { } } public void testSimple() throws Exception { Connection conn = ds.getConnection(); assertNotNull(conn); PreparedStatement stmt = conn.prepareStatement("select * from dual"); assertNotNull(stmt); ResultSet rset = stmt.executeQuery(); assertNotNull(rset); assertTrue(rset.next()); rset.close(); stmt.close(); conn.close(); } public void testSimpleWithUsername() throws Exception { Connection conn = ds.getConnection("u1", "p1"); assertNotNull(conn); PreparedStatement stmt = conn.prepareStatement("select * from dual"); assertNotNull(stmt); ResultSet rset = stmt.executeQuery(); assertNotNull(rset); assertTrue(rset.next()); rset.close(); stmt.close(); conn.close(); } public void testClosingWithUserName() throws Exception { Connection[] c = new Connection[getMaxActive()]; // open the maximum connections for (int i=0; i 'u2' and 'p1' -> 'p2' will * exhibit the bug detailed in * http://issues.apache.org/bugzilla/show_bug.cgi?id=18905 * * Starting with a successful connection, then incorrect password, * then correct password for same user illustrates * JIRA: DBCP-245 */ public void testIncorrectPassword() throws Exception { ds.getConnection("u2", "p2").close(); try { // Use bad password ds.getConnection("u1", "zlsafjk"); fail("Able to retrieve connection with incorrect password"); } catch (SQLException e1) { // should fail } // Use good password ds.getConnection("u1", "p1").close(); try { ds.getConnection("u1", "x"); fail("Able to retrieve connection with incorrect password"); } catch (SQLException e) { if (!e.getMessage().startsWith("Given password did not match")) { throw e; } // else the exception was expected } // Make sure we can still use our good password. ds.getConnection("u1", "p1").close(); // Try related users and passwords ds.getConnection("foo", "bar").close(); try { ds.getConnection("foob", "ar"); fail("Should have caused an SQLException"); } catch (SQLException expected) { } try { ds.getConnection("foo", "baz"); fail("Should have generated SQLException"); } catch (SQLException expected) { } } public void testSimple() throws Exception { Connection conn = ds.getConnection(); assertNotNull(conn); PreparedStatement stmt = conn.prepareStatement("select * from dual"); assertNotNull(stmt); ResultSet rset = stmt.executeQuery(); assertNotNull(rset); assertTrue(rset.next()); rset.close(); stmt.close(); conn.close(); } public void testSimpleWithUsername() throws Exception { Connection conn = ds.getConnection("u1", "p1"); assertNotNull(conn); PreparedStatement stmt = conn.prepareStatement("select * from dual"); assertNotNull(stmt); ResultSet rset = stmt.executeQuery(); assertNotNull(rset); assertTrue(rset.next()); rset.close(); stmt.close(); conn.close(); } public void testClosingWithUserName() throws Exception { Connection[] c = new Connection[getMaxActive()]; // open the maximum connections for (int i=0; i close sequence assertEquals(2, ds.getNumIdle()); } /** * JIRA DBCP-216 * * Verify that pool counters are maintained properly and listeners are * cleaned up when a PooledConnection throws a connectionError event. */ public void testConnectionErrorCleanup() throws Exception { // Setup factory UserPassKey key = new UserPassKey("username", "password"); GenericKeyedObjectPool pool = new GenericKeyedObjectPool(null); KeyedCPDSConnectionFactory factory = new KeyedCPDSConnectionFactory(cpds, pool, null, false); // Checkout a pair of connections PooledConnection pcon1 = ((PooledConnectionAndInfo) pool.borrowObject(key)) .getPooledConnection(); Connection con1 = pcon1.getConnection(); PooledConnection pcon2 = ((PooledConnectionAndInfo) pool.borrowObject(key)) .getPooledConnection(); assertEquals(2, pool.getNumActive(key)); assertEquals(0, pool.getNumIdle(key)); // Verify listening PooledConnectionProxy pc = (PooledConnectionProxy) pcon1; assertTrue(pc.getListeners().contains(factory)); // Throw connectionError event pc.throwConnectionError(); // Active count should be reduced by 1 and no idle increase assertEquals(1, pool.getNumActive(key)); assertEquals(0, pool.getNumIdle(key)); // Throw another one - we should be on cleanup list, so ignored pc.throwConnectionError(); assertEquals(1, pool.getNumActive(key)); assertEquals(0, pool.getNumIdle(key)); // Ask for another connection - should trigger makeObject, which causes // cleanup, removing listeners. PooledConnection pcon3 = ((PooledConnectionAndInfo) pool.borrowObject(key)) .getPooledConnection(); assertTrue(!pcon3.equals(pcon1)); // better not get baddie back assertTrue(!pc.getListeners().contains(factory)); // verify cleanup assertEquals(2, pool.getNumActive(key)); assertEquals(0, pool.getNumIdle(key)); // Return good connections back to pool pcon2.getConnection().close(); pcon3.getConnection().close(); assertEquals(2, pool.getNumIdle(key)); assertEquals(0, pool.getNumActive(key)); // Verify pc is closed try { pc.getConnection(); fail("Expecting SQLException using closed PooledConnection"); } catch (SQLException ex) { // expected } // Back from the dead - ignore the ghost! con1.close(); assertEquals(2, pool.getNumIdle(key)); assertEquals(0, pool.getNumActive(key)); // Clear pool factory.getPool().clear(); assertEquals(0, pool.getNumIdle(key)); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/cpdsadapter/0000755000175000017500000000000011337741616026644 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/cpdsadapter/TestDriverAdapterCPDS.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/cpdsadapter/TestDriverAdapterCPDS.jav0000644000175000017500000001236311333570547033420 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.cpdsadapter; import java.util.Properties; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Tests for DriverAdapterCPDS * * @version $Revision:$ $Date:$ */ public class TestDriverAdapterCPDS extends TestCase { public TestDriverAdapterCPDS(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestDriverAdapterCPDS.class); } private DriverAdapterCPDS pcds; public void setUp() throws Exception { pcds = new DriverAdapterCPDS(); pcds.setDriver("org.apache.commons.dbcp.TesterDriver"); pcds.setUrl("jdbc:apache:commons:testdriver"); pcds.setUser("foo"); pcds.setPassword("bar"); pcds.setPoolPreparedStatements(false); } /** * JIRA: DBCP-245 */ public void testIncorrectPassword() throws Exception { pcds.getPooledConnection("u2", "p2").close(); try { // Use bad password pcds.getPooledConnection("u1", "zlsafjk"); fail("Able to retrieve connection with incorrect password"); } catch (SQLException e1) { // should fail } // Use good password pcds.getPooledConnection("u1", "p1").close(); try { pcds.getPooledConnection("u1", "x"); fail("Able to retrieve connection with incorrect password"); } catch (SQLException e) { if (!e.getMessage().startsWith("x is not the correct password")) { throw e; } // else the exception was expected } // Make sure we can still use our good password. pcds.getPooledConnection("u1", "p1").close(); } public void testSimple() throws Exception { Connection conn = pcds.getPooledConnection().getConnection(); assertNotNull(conn); PreparedStatement stmt = conn.prepareStatement("select * from dual"); assertNotNull(stmt); ResultSet rset = stmt.executeQuery(); assertNotNull(rset); assertTrue(rset.next()); rset.close(); stmt.close(); conn.close(); } public void testSimpleWithUsername() throws Exception { Connection conn = pcds.getPooledConnection("u1", "p1").getConnection(); assertNotNull(conn); PreparedStatement stmt = conn.prepareStatement("select * from dual"); assertNotNull(stmt); ResultSet rset = stmt.executeQuery(); assertNotNull(rset); assertTrue(rset.next()); rset.close(); stmt.close(); conn.close(); } public void testClosingWithUserName() throws Exception { Connection[] c = new Connection[pcds.getMaxActive()]; // open the maximum connections for (int i=0; i 0 && _queryTimeout < 5) { throw new SQLException("query timeout"); } return new TesterResultSet(this); } } public int executeUpdate(String sql) throws SQLException { checkOpen(); return _rowsUpdated; } public void close() throws SQLException { // calling close twice has no effect if (!_open) { return; } _open = false; if (_resultSet != null) { _resultSet.close(); _resultSet = null; } } public int getMaxFieldSize() throws SQLException { checkOpen(); return _maxFieldSize; } public void setMaxFieldSize(int max) throws SQLException { checkOpen(); _maxFieldSize = max; } public int getMaxRows() throws SQLException { checkOpen(); return _maxRows; } public void setMaxRows(int max) throws SQLException { checkOpen(); _maxRows = max; } public void setEscapeProcessing(boolean enable) throws SQLException { checkOpen(); _escapeProcessing = enable; } public int getQueryTimeout() throws SQLException { checkOpen(); return _queryTimeout; } public void setQueryTimeout(int seconds) throws SQLException { checkOpen(); _queryTimeout = seconds; } public void cancel() throws SQLException { checkOpen(); } public SQLWarning getWarnings() throws SQLException { checkOpen(); return null; } public void clearWarnings() throws SQLException { checkOpen(); } public void setCursorName(String name) throws SQLException { checkOpen(); _cursorName = name; } public boolean execute(String sql) throws SQLException { checkOpen(); if("invalid".equals(sql)) { throw new SQLException("invalid query"); } return _executeResponse; } public ResultSet getResultSet() throws SQLException { checkOpen(); if (_resultSet == null) { _resultSet = new TesterResultSet(this); } return _resultSet; } public int getUpdateCount() throws SQLException { checkOpen(); return _rowsUpdated; } public boolean getMoreResults() throws SQLException { checkOpen(); return false; } public void setFetchDirection(int direction) throws SQLException { checkOpen(); _fetchDirection = direction; } public int getFetchDirection() throws SQLException { checkOpen(); return _fetchDirection; } public void setFetchSize(int rows) throws SQLException { checkOpen(); _fetchSize = rows; } public int getFetchSize() throws SQLException { checkOpen(); return _fetchSize; } public int getResultSetConcurrency() throws SQLException { checkOpen(); return _resultSetConcurrency; } public int getResultSetType() throws SQLException { checkOpen(); return _resultSetType; } public void addBatch(String sql) throws SQLException { checkOpen(); } public void clearBatch() throws SQLException { checkOpen(); } public int[] executeBatch() throws SQLException { checkOpen(); return new int[0]; } public Connection getConnection() throws SQLException { checkOpen(); return _connection; } protected void checkOpen() throws SQLException { if(!_open) { throw new SQLException("Connection is closed."); } } public boolean getMoreResults(int current) throws SQLException { throw new SQLException("Not implemented."); } public ResultSet getGeneratedKeys() throws SQLException { return new TesterResultSet(this); } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { throw new SQLException("Not implemented."); } public int executeUpdate(String sql, int columnIndexes[]) throws SQLException { throw new SQLException("Not implemented."); } public int executeUpdate(String sql, String columnNames[]) throws SQLException { throw new SQLException("Not implemented."); } public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { throw new SQLException("Not implemented."); } public boolean execute(String sql, int columnIndexes[]) throws SQLException { throw new SQLException("Not implemented."); } public boolean execute(String sql, String columnNames[]) throws SQLException { throw new SQLException("Not implemented."); } public int getResultSetHoldability() throws SQLException { checkOpen(); throw new SQLException("Not implemented."); } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { throw new SQLException("Not implemented."); } public T unwrap(Class iface) throws SQLException { throw new SQLException("Not implemented."); } public boolean isClosed() throws SQLException { throw new SQLException("Not implemented."); } public void setPoolable(boolean poolable) throws SQLException { throw new SQLException("Not implemented."); } public boolean isPoolable() throws SQLException { throw new SQLException("Not implemented."); } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TesterPreparedStatement.java0000644000175000017500000002615311333570547032041 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Calendar; /* JDBC_4_ANT_KEY_BEGIN */ import java.io.InputStream; import java.io.Reader; import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; /* JDBC_4_ANT_KEY_END */ /** * A dummy {@link PreparedStatement}, for testing purposes. * * @author Rodney Waldhoff * @author Dirk Verbeeck * @version $Revision: 883942 $ $Date: 2009-11-24 20:00:03 -0500 (Tue, 24 Nov 2009) $ */ public class TesterPreparedStatement extends TesterStatement implements PreparedStatement { private ResultSetMetaData _resultSetMetaData = null; private String _sql = null; private String _catalog = null; public TesterPreparedStatement(Connection conn) { super(conn); try { _catalog = conn.getCatalog(); } catch (SQLException e) { } } public TesterPreparedStatement(Connection conn, String sql) { super(conn); _sql = sql; try { _catalog = conn.getCatalog(); } catch (SQLException e) { } } public TesterPreparedStatement(Connection conn, String sql, int resultSetType, int resultSetConcurrency) { super(conn, resultSetType, resultSetConcurrency); _sql = sql; try { _catalog = conn.getCatalog(); } catch (SQLException e) { } } /** for junit test only */ public String getCatalog() { return _catalog; } public ResultSet executeQuery(String sql) throws SQLException { checkOpen(); if("null".equals(sql)) { return null; } else { return new TesterResultSet(this, null, _resultSetType, _resultSetConcurrency); } } public int executeUpdate(String sql) throws SQLException { checkOpen(); return _rowsUpdated; } public ResultSet executeQuery() throws SQLException { checkOpen(); if("null".equals(_sql)) { return null; } else { return new TesterResultSet(this, null, _resultSetType, _resultSetConcurrency); } } public int executeUpdate() throws SQLException { checkOpen(); return _rowsUpdated; } public void setNull(int parameterIndex, int sqlType) throws SQLException { checkOpen(); } public void setBoolean(int parameterIndex, boolean x) throws SQLException { checkOpen(); } public void setByte(int parameterIndex, byte x) throws SQLException { checkOpen(); } public void setShort(int parameterIndex, short x) throws SQLException { checkOpen(); } public void setInt(int parameterIndex, int x) throws SQLException { checkOpen(); } public void setLong(int parameterIndex, long x) throws SQLException { checkOpen(); } public void setFloat(int parameterIndex, float x) throws SQLException { checkOpen(); } public void setDouble(int parameterIndex, double x) throws SQLException { checkOpen(); } public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { checkOpen(); } public void setString(int parameterIndex, String x) throws SQLException { checkOpen(); } public void setBytes(int parameterIndex, byte x[]) throws SQLException { checkOpen(); } public void setDate(int parameterIndex, java.sql.Date x) throws SQLException { checkOpen(); } public void setTime(int parameterIndex, java.sql.Time x) throws SQLException { checkOpen(); } public void setTimestamp(int parameterIndex, java.sql.Timestamp x) throws SQLException { checkOpen(); } public void setAsciiStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); } /** @deprecated */ public void setUnicodeStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); } public void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); } public void clearParameters() throws SQLException { checkOpen(); } public void setObject(int parameterIndex, Object x, int targetSqlType, int scale) throws SQLException { checkOpen(); } public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { checkOpen(); } public void setObject(int parameterIndex, Object x) throws SQLException { checkOpen(); } public boolean execute() throws SQLException { checkOpen(); return true; } public void addBatch() throws SQLException { checkOpen(); } public void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) throws SQLException { checkOpen(); } public void setRef (int i, Ref x) throws SQLException { checkOpen(); } public void setBlob (int i, Blob x) throws SQLException { checkOpen(); } public void setClob (int i, Clob x) throws SQLException { checkOpen(); } public void setArray (int i, Array x) throws SQLException { checkOpen(); } public ResultSetMetaData getMetaData() throws SQLException { checkOpen(); return _resultSetMetaData; } public void setDate(int parameterIndex, java.sql.Date x, Calendar cal) throws SQLException { checkOpen(); } public void setTime(int parameterIndex, java.sql.Time x, Calendar cal) throws SQLException { checkOpen(); } public void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal) throws SQLException { checkOpen(); } public void setNull (int paramIndex, int sqlType, String typeName) throws SQLException { checkOpen(); } public boolean getMoreResults(int current) throws SQLException { throw new SQLException("Not implemented."); } public ResultSet getGeneratedKeys() throws SQLException { return new TesterResultSet(this, null, _resultSetType, _resultSetConcurrency); } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { throw new SQLException("Not implemented."); } public int executeUpdate(String sql, int columnIndexes[]) throws SQLException { throw new SQLException("Not implemented."); } public int executeUpdate(String sql, String columnNames[]) throws SQLException { throw new SQLException("Not implemented."); } public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { throw new SQLException("Not implemented."); } public boolean execute(String sl, int columnIndexes[]) throws SQLException { throw new SQLException("Not implemented."); } public boolean execute(String sql, String columnNames[]) throws SQLException { throw new SQLException("Not implemented."); } public int getResultSetHoldability() throws SQLException { throw new SQLException("Not implemented."); } public void setURL(int parameterIndex, java.net.URL x) throws SQLException { throw new SQLException("Not implemented."); } public java.sql.ParameterMetaData getParameterMetaData() throws SQLException { throw new SQLException("Not implemented."); } /* JDBC_4_ANT_KEY_BEGIN */ public void setRowId(int parameterIndex, RowId value) throws SQLException { throw new SQLException("Not implemented."); } public void setNString(int parameterIndex, String value) throws SQLException { throw new SQLException("Not implemented."); } public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { throw new SQLException("Not implemented."); } public void setNClob(int parameterIndex, NClob value) throws SQLException { throw new SQLException("Not implemented."); } public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void setSQLXML(int parameterIndex, SQLXML value) throws SQLException { throw new SQLException("Not implemented."); } public void setAsciiStream(int parameterIndex, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void setBinaryStream(int parameterIndex, InputStream inputStream, long length) throws SQLException { throw new SQLException("Not implemented."); } public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { throw new SQLException("Not implemented."); } public void setAsciiStream(int parameterIndex, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void setBinaryStream(int parameterIndex, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void setNCharacterStream(int parameterIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void setClob(int parameterIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { throw new SQLException("Not implemented."); } public void setNClob(int parameterIndex, Reader reader) throws SQLException { throw new SQLException("Not implemented."); } /* JDBC_4_ANT_KEY_END */ } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestDriverManagerConnectionFactory.javalibcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestDriverManagerConnectionFactory.ja0000644000175000017500000000772511333570547033636 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import javax.sql.DataSource; import org.apache.commons.pool.impl.GenericObjectPool; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * This test *must* execute before all other tests to be effective as it tests * the initialisation of DriverManager. * Based on the test case for DBCP-212 written by Marcos Sanz * * @version $Revision: 883848 $ $Date: 2009-11-24 15:15:30 -0500 (Tue, 24 Nov 2009) $ */ public class TestDriverManagerConnectionFactory extends TestCase { public TestDriverManagerConnectionFactory(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestDriverManagerConnectionFactory.class); } public void testDriverManagerInit() throws Exception { System.setProperty("jdbc.drivers", "org.apache.commons.dbcp.TesterDriver"); GenericObjectPool connectionPool = new GenericObjectPool(null, 10, GenericObjectPool.WHEN_EXHAUSTED_BLOCK, -1, 0); final ConnectionFactory connectionFactory = new DriverManagerConnectionFactory( "jdbc:apache:commons:testdriver", "foo", "bar"); final PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true); connectionPool.setFactory(poolableConnectionFactory); PoolingDataSource dataSource = new PoolingDataSource(connectionPool); ConnectionThread[] connectionThreads = new ConnectionThread[10]; Thread[] threads = new Thread[10]; for (int i = 0; i < 10; i++) { connectionThreads[i] = new ConnectionThread(dataSource); threads[i] = new Thread(connectionThreads[i]); } for (int i = 0; i < 10; i++) { threads[i].start(); } for (int i = 0; i < 10; i++) { while (threads[i].isAlive()){//JDK1.5: getState() != Thread.State.TERMINATED) { Thread.sleep(100); } if (!connectionThreads[i].getResult()) { fail("Exception during getConnection"); } } } private static final class ConnectionThread implements Runnable { private DataSource ds; private volatile boolean result = true; private ConnectionThread(DataSource ds) { this.ds = ds; } public void run() { Connection conn = null; try { conn = ds.getConnection(); } catch (Exception e) { e.printStackTrace(); result = false; } finally { if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); result = false; } } } } public boolean getResult() { return result; } } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestPoolableConnection.java0000644000175000017500000000647611333570547031646 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.SQLException; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; /** * @author James Ring * @version $Revision$ $Date$ */ public class TestPoolableConnection extends TestCase { public TestPoolableConnection(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestPoolableConnection.class); } private ObjectPool pool = null; public void setUp() throws Exception { pool = new GenericObjectPool(); PoolableConnectionFactory factory = new PoolableConnectionFactory( new DriverConnectionFactory(new TesterDriver(),"jdbc:apache:commons:testdriver", null), pool, null, null, true, true); pool.setFactory(factory); } public void testConnectionPool() throws Exception { // Grab a new connection from the pool Connection c = (Connection)pool.borrowObject(); assertNotNull("Connection should be created and should not be null", c); assertEquals("There should be exactly one active object in the pool", 1, pool.getNumActive()); // Now return the connection by closing it c.close(); // Can't be null assertEquals("There should now be zero active objects in the pool", 0, pool.getNumActive()); } // Bugzilla Bug 33591: PoolableConnection leaks connections if the // delegated connection closes itself. public void testPoolableConnectionLeak() throws Exception { // 'Borrow' a connection from the pool Connection conn = (Connection)pool.borrowObject(); // Now close our innermost delegate, simulating the case where the // underlying connection closes itself ((PoolableConnection)conn).getInnermostDelegate().close(); // At this point, we can close the pooled connection. The // PoolableConnection *should* realise that its underlying // connection is gone and invalidate itself. The pool should have no // active connections. try { conn.close(); } catch (SQLException e) { // Here we expect 'connection already closed', but the connection // should *NOT* be returned to the pool } assertEquals("The pool should have no active connections", 0, pool.getNumActive()); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestDelegatingCallableStatement.java0000644000175000017500000001115511333570547033427 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.CallableStatement; import java.sql.Connection; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * @version $Revision: 896721 $ $Date: 2010-01-06 18:50:53 -0500 (Wed, 06 Jan 2010) $ */ public class TestDelegatingCallableStatement extends TestCase { public TestDelegatingCallableStatement(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestDelegatingCallableStatement.class); } private DelegatingConnection conn = null; private Connection delegateConn = null; private DelegatingCallableStatement stmt = null; private CallableStatement delegateStmt = null; public void setUp() throws Exception { delegateConn = new TesterConnection("test", "test"); conn = new DelegatingConnection(delegateConn); } public void testExecuteQueryReturnsNull() throws Exception { delegateStmt = new TesterCallableStatement(delegateConn,"null"); stmt = new DelegatingCallableStatement(conn,delegateStmt); assertNull(stmt.executeQuery()); } public void testExecuteQueryReturnsNotNull() throws Exception { delegateStmt = new TesterCallableStatement(delegateConn,"select * from foo"); stmt = new DelegatingCallableStatement(conn,delegateStmt); assertTrue(null != stmt.executeQuery()); } public void testGetDelegate() throws Exception { delegateStmt = new TesterCallableStatement(delegateConn,"select * from foo"); stmt = new DelegatingCallableStatement(conn,delegateStmt); assertEquals(delegateStmt,stmt.getDelegate()); } public void testHashCodeNull() { stmt = new DelegatingCallableStatement(conn, null); assertEquals(0, stmt.hashCode()); } public void testHashCode() { delegateStmt = new TesterCallableStatement(delegateConn,"select * from foo"); DelegatingCallableStatement stmt1 = new DelegatingCallableStatement(conn,delegateStmt); DelegatingCallableStatement stmt2 = new DelegatingCallableStatement(conn,delegateStmt); assertEquals(stmt1.hashCode(), stmt2.hashCode()); } public void testEquals() { delegateStmt = new TesterCallableStatement(delegateConn,"select * from foo"); CallableStatement del = new TesterCallableStatement(delegateConn,"select * from foo"); DelegatingCallableStatement stmt1 = new DelegatingCallableStatement(conn, delegateStmt); DelegatingCallableStatement stmt2 = new DelegatingCallableStatement(conn, delegateStmt); DelegatingCallableStatement stmt3 = new DelegatingCallableStatement(conn, null); DelegatingCallableStatement stmt4 = new DelegatingCallableStatement(conn, del); // Nothing is equal to null assertFalse(stmt1.equals(null)); assertFalse(stmt2.equals(null)); assertFalse(stmt3.equals(null)); assertFalse(stmt4.equals(null)); // 1 & 2 are equivalent assertTrue(stmt1.equals(stmt2)); assertTrue(stmt2.equals(stmt1)); // reflexive // 1 & 3 are not (different statements, one null) assertFalse(stmt1.equals(stmt3)); assertFalse(stmt3.equals(stmt1)); // reflexive // 1 & 4 are not (different statements) assertFalse(stmt1.equals(stmt4)); assertFalse(stmt4.equals(stmt1)); // reflexive // Check self-equals assertTrue(stmt1.equals(stmt1)); assertTrue(stmt2.equals(stmt2)); assertFalse(stmt3.equals(stmt3)); // because underlying statement is null assertTrue(stmt4.equals(stmt4)); DelegatingStatement dstmt1 = stmt1; // 1 & 2 are equivalent assertTrue(dstmt1.equals(stmt2)); assertTrue(stmt2.equals(dstmt1)); // reflexive } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestDelegatingDatabaseMetaData.java0000644000175000017500000000645211333570547033154 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Test suite for {@link DelegatingDatabaseMetaData}. */ public class TestDelegatingDatabaseMetaData extends TestCase { public TestDelegatingDatabaseMetaData(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestDelegatingDatabaseMetaData.class); } private DelegatingConnection conn = null; private Connection delegateConn = null; private DelegatingDatabaseMetaData meta = null; private DatabaseMetaData delegateMeta = null; public void setUp() throws Exception { delegateConn = new TesterConnection("test", "test"); delegateMeta = delegateConn.getMetaData(); conn = new DelegatingConnection(delegateConn); meta = new DelegatingDatabaseMetaData(conn,delegateMeta); } public void testGetDelegate() throws Exception { assertEquals(delegateMeta,meta.getDelegate()); } public void testHashCode() { try { delegateMeta = conn.getMetaData(); } catch (SQLException e) { fail("No exception expected retrieving meta data"); } DelegatingDatabaseMetaData meta1 = new DelegatingDatabaseMetaData(conn,delegateMeta); DelegatingDatabaseMetaData meta2 = new DelegatingDatabaseMetaData(conn,delegateMeta); assertEquals(meta1.hashCode(), meta2.hashCode()); } public void testEquals() { try { delegateMeta = conn.getMetaData(); } catch (SQLException e) { fail("No exception expected retrieving meta data"); } DelegatingDatabaseMetaData meta1 = new DelegatingDatabaseMetaData(conn,delegateMeta); DelegatingDatabaseMetaData meta2 = new DelegatingDatabaseMetaData(conn,delegateMeta); DelegatingDatabaseMetaData meta3 = new DelegatingDatabaseMetaData(conn,null); assertTrue(!meta1.equals(null)); assertTrue(meta1.equals(meta2)); assertTrue(!meta1.equals(meta3)); } /* JDBC_4_ANT_KEY_BEGIN */ public void testCheckOpen() throws Exception { ResultSet rst = meta.getSchemas(); assertTrue(!rst.isClosed()); conn.close(); assertTrue(rst.isClosed()); } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestJOCLed.java0000644000175000017500000000413111333570547027113 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.DriverManager; import junit.framework.Test; import junit.framework.TestSuite; /** * @author Rodney Waldhoff * @version $Revision: 893803 $ $Date: 2009-12-24 14:10:46 -0500 (Thu, 24 Dec 2009) $ */ public class TestJOCLed extends TestConnectionPool { public TestJOCLed(String testName) { super(testName); if (Float.parseFloat(System.getProperty("java.specification.version")) < 1.6f) { if(null == System.getProperty("org.xml.sax.driver")) { System.setProperty("org.xml.sax.driver","org.apache.xerces.parsers.SAXParser"); } } } public static Test suite() { return new TestSuite(TestJOCLed.class); } protected Connection getConnection() throws Exception { return DriverManager.getConnection("jdbc:apache:commons:dbcp:/testpool"); } private PoolingDriver driver = null; public void setUp() throws Exception { super.setUp(); driver = new PoolingDriver(); PoolingDriver.setAccessToUnderlyingConnectionAllowed(true); } public void tearDown() throws Exception { driver.closePool("testpool"); DriverManager.deregisterDriver(driver); super.tearDown(); } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestConnectionPool.java0000644000175000017500000010243711333570547031014 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Hashtable; import java.util.Stack; import junit.framework.TestCase; // XXX FIX ME XXX // this class still needs some cleanup, but at least // this consolidates most of the relevant test code // in a fairly re-usable fashion // XXX FIX ME XXX /** * Base test suite for DBCP pools. * * @author Rodney Waldhoff * @author Sean C. Sullivan * @author John McNally * @author Dirk Verbeeck * @version $Revision: 901818 $ $Date: 2010-01-21 13:28:38 -0500 (Thu, 21 Jan 2010) $ */ public abstract class TestConnectionPool extends TestCase { public TestConnectionPool(String testName) { super(testName); } public void tearDown() throws Exception { super.tearDown(); // Close any connections opened by the test while (!connections.isEmpty()) { Connection conn = (Connection) connections.pop(); try { conn.close(); } catch (Exception ex) { // ignore } finally { conn = null; } } } protected abstract Connection getConnection() throws Exception; protected int getMaxActive() { return 10; } protected long getMaxWait() { return 100L; } /** Connections opened during the course of a test */ protected Stack connections = new Stack(); /** Acquire a connection and push it onto the connections stack */ protected Connection newConnection() throws Exception { Connection connection = getConnection(); connections.push(connection); return connection; } // ----------- Utility Methods --------------------------------- protected String getUsername(Connection conn) throws SQLException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select username"); if (rs.next()) { return rs.getString(1); } return null; } // ----------- tests --------------------------------- public void testClearWarnings() throws Exception { Connection[] c = new Connection[getMaxActive()]; for (int i = 0; i < c.length; i++) { c[i] = newConnection(); assertTrue(c[i] != null); // generate SQLWarning on connection c[i].prepareCall("warning"); } for (int i = 0; i < c.length; i++) { assertNotNull(c[i].getWarnings()); } for (int i = 0; i < c.length; i++) { c[i].close(); } for (int i = 0; i < c.length; i++) { c[i] = newConnection(); } for (int i = 0; i < c.length; i++) { // warnings should have been cleared by putting the connection back in the pool assertNull(c[i].getWarnings()); } for (int i = 0; i < c.length; i++) { c[i].close(); } } public void testIsClosed() throws Exception { for(int i=0;i ms, and then return it to the pool. If is false, * threads will continue this process indefinitely. If is true, exactly 1/2 of the * threads are expected to either throw exceptions or fail to complete. If is false, * all threads are expected to complete successfully. * * @param holdTime time in ms that a thread holds a connection before returning it to the pool * @param expectError whether or not an error is expected * @param loopOnce whether threads should complete the borrow - hold - return cycle only once, or loop indefinitely * @param maxWait passed in by client - has no impact on the test itself, but does get reported * * @throws Exception */ protected void multipleThreads(final int holdTime, final boolean expectError, final boolean loopOnce, final long maxWait) throws Exception { long startTime = timeStamp(); final PoolTest[] pts = new PoolTest[2 * getMaxActive()]; // Catch Exception so we can stop all threads if one fails ThreadGroup threadGroup = new ThreadGroup("foo") { public void uncaughtException(Thread t, Throwable e) { for (int i = 0; i < pts.length; i++) { pts[i].stop(); } } }; // Create all the threads for (int i = 0; i < pts.length; i++) { pts[i] = new PoolTest(threadGroup, holdTime, expectError, loopOnce); } // Start all the threads for (int i = 0; i < pts.length; i++) { pts[i].start(); } // Give all threads a chance to start and succeed Thread.sleep(300L); // Stop threads for (int i = 0; i < pts.length; i++) { pts[i].stop(); } /* * Wait for all threads to terminate. * This is essential to ensure that all threads have a chance to update success[0] * and to ensure that the variable is published correctly. */ int done=0; int failed=0; int didNotRun = 0; int loops=0; for (int i = 0; i < pts.length; i++) { final PoolTest poolTest = pts[i]; poolTest.thread.join(); loops += poolTest.loops; final String state = poolTest.state; if (DONE.equals(state)){ done++; } if (poolTest.loops == 0){ didNotRun++; } final Throwable thrown = poolTest.thrown; if (thrown != null) { failed++; if (!expectError || !(thrown instanceof SQLException)){ System.out.println("Unexpected error: "+thrown.getMessage()); } } } long time = timeStamp() - startTime; System.out.println("Multithread test time = " + time + " ms. Threads: " + pts.length + ". Loops: " + loops + ". Hold time: " + holdTime + ". Maxwait: " + maxWait + ". Done: " + done + ". Did not run: " + didNotRun + ". Failed: " + failed + ". expectError: " + expectError ); if (expectError) { if (DISPLAY_THREAD_DETAILS || (pts.length/2 != failed)){ long offset = pts[0].created - 1000; // To reduce size of output numbers, but ensure they have 4 digits System.out.println("Offset: "+offset); for (int i = 0; i < pts.length; i++) { PoolTest pt = pts[i]; System.out.println( "Pre: " + (pt.preconnected-offset) // First, so can sort on this easily + ". Post: " + (pt.postconnected != 0 ? Long.toString(pt.postconnected-offset): "-") + ". Hash: " + pt.connHash + ". Startup: " + (pt.started-pt.created) + ". getConn(): " + (pt.connected != 0 ? Long.toString(pt.connected-pt.preconnected) : "-") + ". Runtime: " + (pt.ended-pt.started) + ". IDX: " + i + ". Loops: " + pt.loops + ". State: " + pt.state + ". thrown: "+ pt.thrown + "." ); } } if (didNotRun > 0){ System.out.println("NOTE: some threads did not run the code: "+didNotRun); } // Perform initial sanity check: assertTrue("Expected some of the threads to fail",failed > 0); // Assume that threads that did not run would have timed out. assertEquals("WARNING: Expected half the threads to fail",pts.length/2,failed+didNotRun); } else { assertEquals("Did not expect any threads to fail",0,failed); } } private static int currentThreadCount = 0; private static final String DONE = "Done"; protected class PoolTest implements Runnable { /** * The number of milliseconds to hold onto a database connection */ private final int connHoldTime; private volatile boolean isRun; private String state; // No need to be volatile if it is read after the thread finishes private final Thread thread; private Throwable thrown; // Debug for DBCP-318 private final long created; // When object was created private long started; // when thread started private long ended; // when thread ended private long preconnected; // just before connect private long connected; // when thread last connected private long postconnected; // when thread released connection private int loops = 0; private int connHash = 0; // Connection identity hashCode (to see which one is reused) private final boolean stopOnException; // If true, don't rethrow Exception private final boolean loopOnce; // If true, don't repeat loop public PoolTest(ThreadGroup threadGroup, int connHoldTime, boolean isStopOnException) { this(threadGroup, connHoldTime, isStopOnException, false); } private PoolTest(ThreadGroup threadGroup, int connHoldTime, boolean isStopOnException, boolean once) { this.loopOnce = once; this.connHoldTime = connHoldTime; stopOnException = isStopOnException; isRun = true; // Must be done here so main thread is guaranteed to be able to set it false thrown = null; thread = new Thread(threadGroup, this, "Thread+" + currentThreadCount++); thread.setDaemon(false); created = timeStamp(); } public void start(){ thread.start(); } public void run() { started = timeStamp(); try { while (isRun) { loops++; state = "Getting Connection"; preconnected = timeStamp(); Connection conn = getConnection(); connHash = System.identityHashCode(((DelegatingConnection)conn).getInnermostDelegate()); connected = timeStamp(); state = "Using Connection"; assertNotNull(conn); PreparedStatement stmt = conn.prepareStatement("select * from dual"); assertNotNull(stmt); ResultSet rset = stmt.executeQuery(); assertNotNull(rset); assertTrue(rset.next()); state = "Holding Connection"; Thread.sleep(connHoldTime); state = "Closing ResultSet"; rset.close(); state = "Closing Statement"; stmt.close(); state = "Closing Connection"; conn.close(); postconnected = timeStamp(); state = "Closed"; if (loopOnce){ break; // Or could set isRun=false } } state = DONE; } catch (Throwable t) { thrown = t; if (!stopOnException) { throw new RuntimeException(); } } finally { ended = timeStamp(); } } public void stop() { isRun = false; } public Thread getThread() { return thread; } } long timeStamp() { return System.currentTimeMillis();// JVM 1.5+ System.nanoTime() / 1000000; } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestPStmtPooling.java0000644000175000017500000001302011333570547030447 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.Statement; import java.sql.SQLException; import javax.sql.DataSource; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.pool.KeyedObjectPoolFactory; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory; import org.apache.commons.pool.impl.GenericObjectPool; /** * TestSuite for BasicDataSource with prepared statement pooling enabled * * @author Dirk Verbeeck * @version $Revision: 882981 $ $Date: 2009-11-21 15:04:53 -0500 (Sat, 21 Nov 2009) $ */ public class TestPStmtPooling extends TestCase { public TestPStmtPooling(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestPStmtPooling.class); } public void testStmtPool() throws Exception { new TesterDriver(); ConnectionFactory connFactory = new DriverManagerConnectionFactory( "jdbc:apache:commons:testdriver","u1","p1"); ObjectPool connPool = new GenericObjectPool(); KeyedObjectPoolFactory stmtPoolFactory = new GenericKeyedObjectPoolFactory(null); new PoolableConnectionFactory(connFactory, connPool, stmtPoolFactory, null, false, true); DataSource ds = new PoolingDataSource(connPool); Connection conn = ds.getConnection(); Statement stmt1 = conn.prepareStatement("select 1 from dual"); Statement ustmt1 = ((DelegatingStatement) stmt1).getInnermostDelegate(); stmt1.close(); Statement stmt2 = conn.prepareStatement("select 1 from dual"); Statement ustmt2 = ((DelegatingStatement) stmt2).getInnermostDelegate(); stmt2.close(); assertSame(ustmt1, ustmt2); } public void testCallableStatementPooling() throws Exception { new TesterDriver(); ConnectionFactory connFactory = new DriverManagerConnectionFactory( "jdbc:apache:commons:testdriver","u1","p1"); ObjectPool connPool = new GenericObjectPool(); KeyedObjectPoolFactory stmtPoolFactory = new GenericKeyedObjectPoolFactory(null); new PoolableConnectionFactory(connFactory, connPool, stmtPoolFactory, null, false, true); DataSource ds = new PoolingDataSource(connPool); Connection conn = ds.getConnection(); Statement stmt1 = conn.prepareStatement("select 1 from dual"); Statement ustmt1 = ((DelegatingStatement) stmt1).getInnermostDelegate(); Statement cstmt1 = conn.prepareCall("{call home}"); Statement ucstmt1 = ((DelegatingStatement) cstmt1).getInnermostDelegate(); stmt1.close(); // Return to pool cstmt1.close(); // "" Statement stmt2 = conn.prepareStatement("select 1 from dual"); // Check out from pool Statement ustmt2 = ((DelegatingStatement) stmt2).getInnermostDelegate(); Statement cstmt2 = conn.prepareCall("{call home}"); Statement ucstmt2 = ((DelegatingStatement) cstmt2).getInnermostDelegate(); stmt2.close(); // Return to pool cstmt2.close(); // "" assertSame(ustmt1, ustmt2); assertSame(ucstmt1, ucstmt2); // Verify key distinguishes Callable from Prepared Statements in the pool Statement stmt3 = conn.prepareCall("select 1 from dual"); Statement ustmt3 = ((DelegatingStatement) stmt3).getInnermostDelegate(); stmt3.close(); assertNotSame(ustmt1, ustmt3); assertNotSame(ustmt3, ucstmt1); } public void testClosePool() throws Exception { new TesterDriver(); ConnectionFactory connFactory = new DriverManagerConnectionFactory( "jdbc:apache:commons:testdriver","u1","p1"); ObjectPool connPool = new GenericObjectPool(); KeyedObjectPoolFactory stmtPoolFactory = new GenericKeyedObjectPoolFactory(null); new PoolableConnectionFactory(connFactory, connPool, stmtPoolFactory, null, false, true); DataSource ds = new PoolingDataSource(connPool); ((PoolingDataSource) ds).setAccessToUnderlyingConnectionAllowed(true); Connection conn = ds.getConnection(); conn.prepareStatement("select 1 from dual"); Connection poolableConnection = ((DelegatingConnection) conn).getDelegate(); Connection poolingConnection = ((DelegatingConnection) poolableConnection).getDelegate(); poolingConnection.close(); try { conn.prepareStatement("select 1 from dual"); fail("Expecting SQLException"); } catch (SQLException ex) { assertTrue(ex.getMessage().endsWith("invalid PoolingConnection.")); } } } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TesterConnection.java0000644000175000017500000002402211333570547030502 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.Map; /* JDBC_4_ANT_KEY_BEGIN */ import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.NClob; import java.sql.SQLClientInfoException; import java.sql.SQLXML; import java.sql.Struct; import java.util.Properties; /* JDBC_4_ANT_KEY_END */ /** * A dummy {@link Connection}, for testing purposes. * * @author Rodney Waldhoff * @author Dirk Verbeeck * @version $Revision: 895744 $ $Date: 2010-01-04 13:48:05 -0500 (Mon, 04 Jan 2010) $ */ public class TesterConnection implements Connection { protected boolean _open = true; protected boolean _autoCommit = true; protected int _transactionIsolation = 1; protected DatabaseMetaData _metaData = new TesterDatabaseMetaData(); protected String _catalog = null; protected Map _typeMap = null; protected boolean _readOnly = false; protected SQLWarning warnings = null; protected String username = null; protected String password = null; protected Exception failure; public TesterConnection(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return this.username; } public void setWarnings(SQLWarning warning) { this.warnings = warning; } public void clearWarnings() throws SQLException { checkOpen(); warnings = null; } public void close() throws SQLException { checkFailure(); _open = false; } public void commit() throws SQLException { checkOpen(); if (isReadOnly()) { throw new SQLException("Cannot commit a readonly connection"); } } public Statement createStatement() throws SQLException { checkOpen(); return new TesterStatement(this); } public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new TesterStatement(this); } public boolean getAutoCommit() throws SQLException { checkOpen(); return _autoCommit; } public String getCatalog() throws SQLException { checkOpen(); return _catalog; } public DatabaseMetaData getMetaData() throws SQLException { checkOpen(); return _metaData; } public int getTransactionIsolation() throws SQLException { checkOpen(); return _transactionIsolation; } public Map getTypeMap() throws SQLException { checkOpen(); return _typeMap; } public SQLWarning getWarnings() throws SQLException { checkOpen(); return warnings; } public boolean isClosed() throws SQLException { checkFailure(); return !_open; } public boolean isReadOnly() throws SQLException { checkOpen(); return _readOnly; } public String nativeSQL(String sql) throws SQLException { checkOpen(); return sql; } public CallableStatement prepareCall(String sql) throws SQLException { checkOpen(); if ("warning".equals(sql)) { setWarnings(new SQLWarning("warning in prepareCall")); } return new TesterCallableStatement(this); } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new TesterCallableStatement(this); } public PreparedStatement prepareStatement(String sql) throws SQLException { checkOpen(); if("null".equals(sql)) { return null; } if("invalid".equals(sql)) { throw new SQLException("invalid query"); } if ("broken".equals(sql)) { throw new SQLException("broken connection"); } return new TesterPreparedStatement(this, sql); } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new TesterPreparedStatement(this, sql, resultSetType, resultSetConcurrency); } public void rollback() throws SQLException { checkOpen(); if (isReadOnly()) { throw new SQLException("Cannot rollback a readonly connection"); } } public void setAutoCommit(boolean autoCommit) throws SQLException { checkOpen(); _autoCommit = autoCommit; } public void setCatalog(String catalog) throws SQLException { checkOpen(); _catalog = catalog; } public void setReadOnly(boolean readOnly) throws SQLException { checkOpen(); _readOnly = readOnly; } public void setTransactionIsolation(int level) throws SQLException { checkOpen(); _transactionIsolation = level; } public void setTypeMap(Map map) throws SQLException { checkOpen(); _typeMap = map; } protected void checkOpen() throws SQLException { if(!_open) { throw new SQLException("Connection is closed."); } checkFailure(); } protected void checkFailure() throws SQLException { if (failure != null) { throw (SQLException) new SQLException("TesterConnection failure").initCause(failure); } } public void setFailure(Exception failure) { this.failure = failure; } public int getHoldability() throws SQLException { throw new SQLException("Not implemented."); } public void setHoldability(int holdability) throws SQLException { throw new SQLException("Not implemented."); } public java.sql.Savepoint setSavepoint() throws SQLException { throw new SQLException("Not implemented."); } public java.sql.Savepoint setSavepoint(String name) throws SQLException { throw new SQLException("Not implemented."); } public void rollback(java.sql.Savepoint savepoint) throws SQLException { throw new SQLException("Not implemented."); } public void releaseSavepoint(java.sql.Savepoint savepoint) throws SQLException { throw new SQLException("Not implemented."); } public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return createStatement(); } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return prepareStatement(sql); } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return prepareCall(sql); } public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { return prepareStatement(sql); } public PreparedStatement prepareStatement(String sql, int columnIndexes[]) throws SQLException { return prepareStatement(sql); } public PreparedStatement prepareStatement(String sql, String columnNames[]) throws SQLException { return prepareStatement(sql); } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { throw new SQLException("Not implemented."); } public T unwrap(Class iface) throws SQLException { throw new SQLException("Not implemented."); } public Array createArrayOf(String typeName, Object[] elements) throws SQLException { throw new SQLException("Not implemented."); } public Blob createBlob() throws SQLException { throw new SQLException("Not implemented."); } public Clob createClob() throws SQLException { throw new SQLException("Not implemented."); } public NClob createNClob() throws SQLException { throw new SQLException("Not implemented."); } public SQLXML createSQLXML() throws SQLException { throw new SQLException("Not implemented."); } public Struct createStruct(String typeName, Object[] attributes) throws SQLException { throw new SQLException("Not implemented."); } public boolean isValid(int timeout) throws SQLException { throw new SQLException("Not implemented."); } public void setClientInfo(String name, String value) throws SQLClientInfoException { throw new SQLClientInfoException(); } public void setClientInfo(Properties properties) throws SQLClientInfoException { throw new SQLClientInfoException(); } public Properties getClientInfo() throws SQLException { throw new SQLException("Not implemented."); } public String getClientInfo(String name) throws SQLException { throw new SQLException("Not implemented."); } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/test/org/apache/commons/dbcp/TestManual.java0000644000175000017500000002036611333570547027300 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory; import org.apache.commons.pool.impl.GenericObjectPool; /** * Tests for a "manually configured", {@link GenericObjectPool} * based {@link PoolingDriver}. * @author Rodney Waldhoff * @author Sean C. Sullivan * @version $Revision: 896526 $ $Date: 2010-01-06 11:51:06 -0500 (Wed, 06 Jan 2010) $ */ public class TestManual extends TestConnectionPool { public TestManual(String testName) { super(testName); } public static Test suite() { return new TestSuite(TestManual.class); } protected Connection getConnection() throws Exception { return DriverManager.getConnection("jdbc:apache:commons:dbcp:test"); } private PoolingDriver driver = null; public void setUp() throws Exception { super.setUp(); GenericObjectPool pool = new GenericObjectPool(null, getMaxActive(), GenericObjectPool.WHEN_EXHAUSTED_BLOCK, getMaxWait(), 10, true, true, 10000L, 5, 5000L, true); DriverConnectionFactory cf = new DriverConnectionFactory(new TesterDriver(),"jdbc:apache:commons:testdriver",null); GenericKeyedObjectPoolFactory opf = new GenericKeyedObjectPoolFactory(null, 10, GenericKeyedObjectPool.WHEN_EXHAUSTED_BLOCK, 2000L, 10, true, true, 10000L, 5, 5000L, true); PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf, pool, opf, "SELECT COUNT(*) FROM DUAL", false, true); assertNotNull(pcf); driver = new PoolingDriver(); driver.registerPool("test",pool); PoolingDriver.setAccessToUnderlyingConnectionAllowed(true); } public void tearDown() throws Exception { driver.closePool("test"); super.tearDown(); } public void test1() { GenericObjectPool connectionPool = new GenericObjectPool(null); ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string","username","password"); new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true); new PoolingDataSource(connectionPool); } public void test2() { GenericObjectPool connectionPool = new GenericObjectPool(null); ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string","username","password"); new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true); PoolingDriver driver2 = new PoolingDriver(); driver2.registerPool("example",connectionPool); } /** @see "http://issues.apache.org/bugzilla/show_bug.cgi?id=28912" */ public void testReportedBug28912() throws Exception { Connection conn1 = getConnection(); assertNotNull(conn1); assertFalse(conn1.isClosed()); conn1.close(); Connection conn2 = getConnection(); assertNotNull(conn2); assertTrue(conn1.isClosed()); assertFalse(conn2.isClosed()); // should be able to call close multiple times with no effect conn1.close(); assertTrue(conn1.isClosed()); assertFalse(conn2.isClosed()); } /** @see "http://issues.apache.org/bugzilla/show_bug.cgi?id=12400" */ public void testReportedBug12400() throws Exception { ObjectPool connectionPool = new GenericObjectPool( null, 70, GenericObjectPool.WHEN_EXHAUSTED_BLOCK, 60000, 10); ConnectionFactory connectionFactory = new DriverManagerConnectionFactory( "jdbc:apache:commons:testdriver", "username", "password"); PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory( connectionFactory, connectionPool, null, null, false, true); assertNotNull(poolableConnectionFactory); PoolingDriver driver2 = new PoolingDriver(); driver2.registerPool("neusoftim",connectionPool); Connection[] conn = new Connection[25]; for(int i=0;i<25;i++) { conn[i] = DriverManager.getConnection("jdbc:apache:commons:dbcp:neusoftim"); for(int j=0;jF}}6P([Xb[=УGtj?h.9r/2 ޶m۰uVl۶cnnշV\>9q_m۰b L>]+m6=z`СX͛7_R$G 7oKbd3tPo.M#GСCcCR0tP\qNL>i61hƌy@k:dW45hԘZSWWgyfܸqOmmYl:tֲeLmm1hl޼tw͙3g|ԩSUUUV*SUUe]SSc>33}tӣG 6mZ`~3gΘo=PT.W/{;lڴTWW[iIc߲e?~5^zɓ˿/3nܸ@ZtO.qVC5CƚPzIr3c[nw-[x8t |ɒ%o]}'b_?~ټyF:t<Wy`^|EXJWn7|cN>mN>mz-Wt7.⻰~N@:t(Ѐ+//7///zرcʹF>Gfٲe|k<8p._x4D4n\y=>}:p|s͛-Y]]m6mי3gw} *0Z/,Fu>kk:u5L: > k~ gرffȐ!,]߿?==݌3WW죏>jKꫯ_mufʓ&zҥ^ݺu3SLڵZĜ9`4M4ڵ˓Iyy)++3eeeK.z ,ƍݺu󼟦NkMTJlݺ={#-- ף>>:@R~~>rrr(B(..FVVW[nx뭷SN(--U p8p8L\|ō$ĢEԱM4 eggcܹ|C~~>&Md[v-222G7!!k׮7sѢE0`Wo׮]}s";;;+?WڱcG=z+~/ "yO0ͳA~~ Yp!rrr,]%1(..:|y4'駟 4K,A(( 7t P^^n%e@*c?kh(P__:֢555Arr2:wTFhӥK{.}שS'̜9UUUΫZ5X_|>|M<ת*w}kT9:u;vj(bΜ9( d|EC!55sݺuضmfҤIkUyڴi^QQ:ϼn߾ h3~\4yyF`9s&91끱^e=w\KgFbbo2>"gl.,CϟoqQI<'&&zr9Cyq_7=ٳg[I"èAE?,R_~e]Z( 6k [lѣGc jjj|{2$ Z Gj/++ /_7p(/&G18r䈵۽{w3(!{Q $ob_B^۷5i\46L0ѨpsJ2 Zr BD"ů d90L\asq9Ś#%%Ǐ***B>}|dCP(F"_H$k=U~ĉ(((>;cl۶-jjjx3xUPrpJkM–a'zK\ w9-bkΧD\oS0u`LHH>]cÖ198X+.ťDTG 8}JBq^:۹s'zeE8x!0d<& E.M47ވ%KXu1dt 3f@RR5F-i|V~X[ʺG} D.@𒓓q RlW/cr`cy==pФ&$$@u"+ȵ V"Ґp%$KKJJ|e]7Z6899=~&J ȺV{9ƍDZa_ݝ;wk 7܀믿IIIo% ~iE1VLI$d^6^~XH+ ^]u8oҤݻ}ki4@|J`*1v1zh,_v˱|rp0pUI(**o#0^u3&.ILka YG \J%ΚB4׺ ~^q]g***.ٸ UQr%/1ʕ+OLLC=MH0ֺcv]}ܸq(--F[ Ѡv܉QFa>`CD%%%())@bZp!h"8U&xxZ+aQ<$br^Ve]Mʯ^Z]|֒\r<O?UەWff& dխPIZXFcǎ1}q̘1ǎsm?#5 ;wF.]qBBt/;CS-?#55UM\<'%P1],u9~5'+y|lSO8?~NII' 26o+2P՗H-T/S7nȑ#k.gY__ŋcС8v͛ zꩧ|},_;$$8^jj*>'0T)xwe\}y YStԟ s%.4lh*_YY|G+|I2*XXBs hٲUJrem<*ceee;v,n̛7. oc̙ׯN xꩧ`iii5kGy[&dw>wx:55;| kJ'=FA 7^CqX;|!s= _RM^Ǐ9{l\~qˣVUW+VLu6'Oӗ kѲA`9l̼fL2<&Ne˖yGfΜ{OBץ E2rM6Ŕ)S||QYY (z9sпu--a4޽ͰΙ35S0W^չ+5'\Qoə8pug~<{ TKMLVV,Yb-[`(((&z+goT^|9RRRgBB>UYYBy_ݲ2˗/-))Qs\^WT@N5 iӦW\}_YYQFaɒ%ؿ?s{n̚5 8qRRR0k,\{NPrp+>֮]3}wUKB >vC4O?(Ы WAIPMM>:Q]]> cƌ'|pnn. ͛ .\[0$cB4?e˖۷wߍΝ;{֊oƍQVVM6a޽j{͚5CVгgO+xA߿ꫯo[4i^z)`߾}8pl⬛-Z@&MpEa߾}طo{=@6mЪU+h w8p7ov0)) hѢZh/߿?n۶m/opEyVz}aѢE]o7|+t?FII VZMfгgOh38x }lٲK6mpUWgϞBMJ$%%!{ NNNn6`ƍޘ~cȐ!QF pZO}|(**[oyMED$kܸu\sK/ZVVf۶mѡCdddXsI 7_|wLq^Ncp[yn[B8p)))HKKxOQ^^]vyeĵɍ$MI2"#c~H^Kg׎A$ö+A'}a¡DŽ&,}6f8ظSy>ȮdP +Zۮ8xI/)=4r2D!+߭vjf R}/[9V-ʵ4>|JZ?0,97i\H+C^N55&M8gF|HHHP7PI)9KZVy+֗6R~Fsp˄'Q pP:D"vxm"+7\q%r{2ė !վ;\JNBUwyw+RМ?zr΃BZv@ 97)+ .Z]>NnxɓS%l͈ufXґ~"negmͨR) zui(]!(Gݥ eb񉢊T,Z|.-$dR\Rdr& ԗ.{qɌ.՗u\VYK!@3$oaȾdtρHC'eW^\4PjSdEVV(QMqPJILqdEN>W2jONٯI8yڤrEJ%\JEej;vTUJP(E ҊKC=uTPǚ _}^&?~8V^kѣVH1ydt0ĉ(** ("M.]\<$=tVKQȠy ΈdBYқ m˵KxoXט%ipymc>i9PZZ222cjW#-}LYWEӧopBO!\1X`д4+HOOW稴giO>׭[=F _ٳq8"/]]vֈriy<rrr3Ϩs!Ley4Ee 0bK\% _ѧRpJr DMڟ"rbdu) .^k5h_VkÕv^O>rTF8-܂5kX/%ݱcHu\(^oJJJBAAϣҫ]fժU(`ҥ֭Wo/NO"nI^{/1bo^eFf\!Lh2Z`,jW1˄UP_Ac/y%;;S{Lrr2>CdddxJKKq뭷á" ^Nx駭z7oEUp7zƎR* e9響'c!mk>|-?dʷ%8ϳb)Pց jG[im(dzv%=>9bWܬʾ}>^n f~#=rzz:`9p!zHKKSs*'iԩU_|w<"ASıDs.' ؋kCHd3D<V;Xz@P"ަ%ti Im=^88. Mh"HIcɂ4N|ۯ9m߾w9#I3k-\JTSS&ɖ2%ۘEKMM M$eeeY!'Wv wrm활ȝR[d >'OxR erքA|\hԒE=O*pSAss{. %^Bм/֣C?#l߾nr9!=x}n?;Zov-&zȓ "i|85`}PSS㍁+ζP=4&[nŷ?izN8|,ʪs~dR47Bܚɏ}Q(kQߒ|1DP3(NNNưa<>9x7޺ /LiP[VvY!֘r'CHٸ'˓^_3f@۶m}[سg6mdo׮L$~v2|rFUn% m[fXjUF֭}.yE78J03 J>$WXنP-[7{㑘h)Wޒ㓛r{JOhO>{/ڴiM'Nʕ+''&&+233-Z N0A3D.%  %17oFeeB]v;v,ZnKӷ)4&6CA%%%p^^zY&EfƥQ" ߹\ݺukwM4ANNݚ5kTJ\O>e1Hz`zY-Zp8e۬N2)rw}ת׬Y3$&&mXڊ Y&@+wu]?~ hkJŷ_ _ū`cƌ=g$|pOi&|V}zJ{ӦMqM7Y-Z-[XI~~a\}x饗b:qjIJh9k%$Ǐꫯzߥ{P<5}Сp6m=2W^ݻ1*={⮻M>^\9r{ԩSѭ[׿AJ"ǔ=y<8-!9cPRRo6bرɾ7$K8kɓܷo1yd^޽1yd^W^۪?}tL6 VoP詧B֭[2ҫJپkrr F{r$T/s<PoV\KNNF۶m-k;0`7o)5 mUUUUߵؽ{7LbԪU+4k\srrP W)"jEj:D{իw^,9ݻws?f@r;d۪U+ 2;='+Q\7֒^xu/tɳK~!$'+^DiODEw zB"޶+De}߸gKIIAjjREFnHvHpV[{J_~PڿtwyI9`$ 畷L2t3/oos0˧ B{*Ѳr'9гuhiuoM[ZY~ A(?Ѣ)k[y=fct\!{x ZΓ+{, (:,ҀHby^TiS '?Bt#iʩ{ue2$wh׼YHpZUKJ-ICӤ!\JIRbN" Gpŗ|kwH~9I~2͚& y.jyHZ+0~RWFaŕZ*)}dz;=Ԙgq]^e(yLy0BڦO%K2O Ǖ cQ0cGYH-I4E6xX+@@$Ap',D|ZǕA}~x;A4oI1hFJK0 g%㡟30C_=tϽb԰[ކT|(Aa˳R(I ˽\q+y<}2.xO0e4A'x"!˘hUd\l"}rʩ` NT( 0eK[[Ӽ$iH5 <(b<&ԾhJ@)3Ak-kkB05W|* P_=M[2ROWWgF*,$&ܠm3q{'b克\r:f7.3cg?gV?M{*եryG~O\I`5va|5˺EO 6{H1d%m.p@MWЦi ct2c:Nj^ߟQxgb 8[sX:BK.5L攡3M_^}b;9@Z py/o݀8{v~#>oK\x]o=978y[NF#]}L5w6JU չ9I '+j8nEvh=vs+-tL,S©f(YNwkV90bo5@g0.5={`iC:rc;p+DcY*j3/Ь{drO΅>=Oި{gs,8ewWeܠSO\+C>;"/Srnw?/P+7_UG=cؗ:0;/6eT7 XX8r'|&5L3vI{ۣԥWy@|6Jp,GxMNfTx{WlGȃbi-*COthG2mU聫#>씃ZFT|iR+;hg#fvS>lal|D1(&ow~i'D蕈'3Ff*O8Z+cS}TNF$i3SAnub3hvBR]"6I\ȄscM,=؃H4R0@7FS\v@tW'DnAsN6T[X|&8.he<'mG{ʗ4X-zEjAc?lnxB ad`*puNuFS6Z2VSgtdh֑0&zx IuB8$Ƒ' z#POPR!t)YtCWevd:,D٨JeZV~H1H{oq"pwo\q[q7-pdpeq pp b9 bKjgV7;RdIF42UJmV#62. S"y䲄9BA%U7%0fv|?UH 7TQ39i~r܄M)2({5X9한w*#%$0tkh7pb=Ԝ+}Mg靔Ty1%%՜x=a=.B0R2a.x1B s /!`SًIx0"ZhmyRMT>x,W[3uuuTob$xI,[@BM8H:Jg7%%)3$.#y>?Ԝ4f(_)_.j( :Ȕ3WbN衙JئXysu,&4=UN64XvTm;/Z S5IR)wL7vcGP'@&|8*Jz9WB1DTe7S-$sW) iG8:UȞhr-PXA3j19O;W;HO .:3v9'7qrwqږt9vqa'hIriznɖ˰[Q8:hdNVT%Lelu%"xV]DYR`g:24EHlV<%g ʦQtbN.ܵ턘*EWMe܆53n00ݵhflY4F4u6C:ZzÁʼqʩIM9;TZVSb+cxS-5/v?Dc۟zbbd3Jt;D lJjRM*t:6S<_/st %<8[@o3t9:Lc,ڞE)=U%Qzk2A;`/e7:0ѺtLxHf}ċ6Zf}Ǟ2zt,Ү+\n=,bdi=eyźK5[OгŐhiZO0ͧkncۈf;;=<9`mHm.^-a;U0%xnKs; D'!ӫ-G'Ӽq 88lZծbR߂+bdgk3k~FT^i2,G,݆mX9QV(2rf㇅ƻ:C~$ukGcscgyFc }U|k+8'޸$t%3[e+$RͬVȂ4e޹>yGv/x"eȣ[D f#37Z,.L涜o}}F:u|xgktꨫޫ>3*~˙|۷ .y3<:7wx1KNE#N T/a/,_r|=4Y'{a=zPቿKH N ̘\/~ TE;⧅vДUwI逝#, 4}?>v.HS*>U2=1@a2R)# h` j8С%C 5\\hТGz j!˕*c\Id͘2K\OA%Zh50˓*_2|T dV,ijU'Liom[l=͵ { ]`ߒUZj)^2Caqt\3\#yCE1ȗ?&piD|im#YF7­Rg;;s]޽wsѓ]*Yf8x/)|˫]ʟk~m,.0M*6ʤ A =ԩ, J8B-)j$8`($M.5C,otND&` P<,+Bq;vlwz)r@ CH#l3Ml/0 ״<&Z#p mN=[I'<hlq!k$"O][ʫNYlQ":Uԏ|K4\Hov-cNDiSKM&C|7%\TDOʅ(Q"(.xʘB-0ey#rIz21}r!`CD7ud1j jTsreQلgwb fG6 c8,5KdevRUA$ l(HJ~2 (sG?./d!E ~:["a_dCaR&s&5r7 ~{C&sFS#G/jx'?aT@;rP qU?kaTEbG&a\ne[ Ү Md6[%5˜b&{JURJQW#jd4JfBt*]&mx$>{ϦjǓ٤jvQ*U,3"*o9VV)QAM TG=Ωn?kK(J #UgS n4iLB7=hK)^Sr;{e<̞>K:33@2_hPھ3ԨE̲>o-`R2>($;Z :Stոh+*lrTUV;qK]]RkM!mdвХErɈC,TMk_urr8cR!E5͘l|њU^<R *a/R)&_Џ[_^lz :5}(n_lǶCF5 o%$@f- z`әe\\S5] hTEQ*ji؆Y)VZ$%BKF"Zs0c=YuC}#ԷNSC`=*fE &zxb7Muu ڈu5VuPy'*KvLܹIƕls(_ UbǡJ}4SKdH/BG 4~&㱃f@DcWCr#vG&L'`WYzU?۰@!]; [:Tz݆Kʡ{`8bPO!G8Jj%xXwsV2rm$i%9cyW-xGQS?:i Ք㽽/+\DMr4 tХs'餉kgզ/@pw0yvN{7<xC~w#o<9Ƀ>ownciSt5|zyV$5$ #9PVә#Q6~A=qKA rú)ќ I4IsAҿ@AS$87 1")i3)\C Cۣ5{JC: xS19[A೗J[r!x+Ծ c+̕Jį"0|YfC,ADrăc;7|ŗ[[E\E_E`Ej;a F`l :3,4BR5EDnt+D3"PXB3$, bJ4v"ӱ=Iܑ4: CK#?]D\,HHٻE ƀHU( 4J8j|+35W<-KGȜRP[!"ZS-: k526L6D-`X θ܃APJs \dVC(>K1ޘDZ$4#3铐݉5޳)FB&{sH;\}ۚFq2IdG,k& u 3# Ԓk3,B>"#yLt,ˠ2Zk FWDCCZI o*>#A ? 26_\ђ*+&ԭBP"͊u<+@ @*,- pXQ0UyQīD{,d@71uƾ||3̓d7BNڶY DX?DNv;LSRdz.LbiWS`RJ)  a,iDIEP- ?K@Orէ)ڡF^CcQt~bLtG)G͑$+͏4+AY)0]aRMrUy!u riKr;m{c9pL;3ZO\u$sXDDl|Sd ՂIFM3L-Q@)d*CTlryx X-s5ڡ`-8Hʈu6ԌseXC*\|KzXc 3N5/1؂ X[[*R(e)8;q퀛 M \\ܖ})aqC,ɴ#|D2}>ѽBtJbKİ](VX%Zik,sX("4BsbL[2bE%Y \5TCUT/FX1OrsOiܣZZXAn*SBH%$:Ke#)DyD8*"DŽ\NvDQrJ8Rݓ[xb"M8Z:p #~Eׯ jՊS܍tZS a8իL\<`Dﴟ[2 N{=74:>Oٟ@&hF7$)" -.Ia> #ma ոK'Dxʺh%إ%v$ɪZɜSǛiL@:Z(һ=1qtcUK"9?!z](> -1$ґJ:r)] _F UPι̊ɛ-3ÿRY%SYdf@'9 B)[`=3GDC}'kO^rTKVl5CxVE|KL\ٝLגAށ9{`dNIM1k=sCQ)D[ᬣ*Bˆ*2F\hzf~}1:RZchwm<PFf Z AOիcgP5cYM֏ڒ1b%{bY.BK\=^uF"]?_zR}Di6b_e@Jݲu Wڅ 7'kLYCl桪514z#zTN1*js2K.6Ms.G ð(lle$ڛ@4k[:\ۅ6 iJi7m7lc8Z57i:ɱr4{ )mgXr@wIQraF .Ns++<%; )h $txxd-l߂_|37_OzS;8u)&£ʚarSqo3*0:8q4uܓgz[5fBbcѰQ9z{Qzs~Ih㠲/qy׫>;eH+j."iW`jX&i"qkl}L/z{%qVpl2CmeʿQ14j_ՆV@&-7hPo 6@ &D`CN(E+rQaƐAt(qA*;,h ^j$H%Cv|PÅA5p@9e q L5$ɏX^bbǒ-klKn*i۶;yj %HjlԈk&W]Ժx`Bg'SlYeyj8!M6ؐt҉q{Ek:"Y0J穹iE8e}e#2#%inWRB^{U&iY8*覫0j.ndUv׈uB٬%%S2# .zzu.7]Hd &dP1wl(LYp/ gga1n~&"{<~9;sUmtF] pwg= 2ؕ[4p}r*]rVҟ.OI&Erי7Z_Gs_9!kn[~ A{眮Wֵ1I*]3ˣ[&|~Љl9"xy{vħ* '2MO,*NV'WJά򕺱Q6VQ2L_rON/)lI"' Q}>"-fqئčPK|"%Z4 "31eN] _-Pe?ɎlIrG (Q ! EAQ-nIνt4$ "w*0TƢFtJQ\:$oF-Uv#c ᤐBpv hGL dX8 BKW 538lpװ̅09v0#JBAuN ſӝ:eRHI= ҽe,?%7YGcsA1}_J" /`"9 uh%yIJvY(CR0F)M<$>'X'&O+ʛ(aP$Ō(:51 ƖBl}zjaBRo3+6z՞u]6gxQjm椊DZfǺz!+UljU֭@TSBή2?U*Scr|Jc+'Io(bЀ̶ pmsvo{+\v5nqkwMp+2m@skB7ϵXGF`>UZ,Kyȵ'{WׁN+F,bO=cU`}0/l$=N6P΅J0bɦBѣeHHRlg̑WDq1KA1\%!ǩlHRyTy7|6e܈vCIrR)|{ $ ׌+ʚ6 L)>w_}6UQS6oɓ*52|kj== v;9A)N a1߿ i^@=a_EXH`a_b[ 3}Nѯč_d]0KɞjۡDK[Db}HՀGZЉɠ`Zǧb\Z7em5`D=uA\D]I ܇TVQ^dKA2yW͞x`-mUI6o ]Ćt}ٌ#kՋMDXE689!xAY`%N \Ni"~Pνe ]\M$#RRHazF0ιgqHi29@t$QfNcD !*"&'qO3S!npٙ'щ٪hV D.! G^^#LX4&a ב)Y'EHњ%AQ,Fʸ0wpM[1t0MIRP?!٭B$aےqm=_a#:A `A#c7֘\ۨM b#"S#$|-#EkHO%1M]V$qqlmenƂlvҖ~˞֬vj)\ ,a͔#|lK1>œ >::jH,fh-8i Ec0d!Fվ-Q,[mlgQd;cݝtlL֣?& nVmkVn'|bEcG}EI֬dn mƮnKf. FC]]%Vޅ( RB.l&^o,]V$Kы$Я%j5JoVjbnzh DV]ʒ!N^JFBoRnN0E -EJNMf\H&h`뀩2.iR0 YlhܗM(n7PWj`061\0G::? rO'!i{*[\ZaW,E/3iogC q)(u+1 Ԯ@q12#/*k{5xL:2$?r#G&c%GG&2 (py*7NcҶR*ϲ,r*G(E";qsuv 1sr%svuWqAW:Ws=3uAs1+2k52S31w35Wm /e=Dz293;;3Ka^HSEcIW/G4HR%t&t4ӴLKcH4OL4P{DK4tE5#5/SI+5TGCK*GT_2uti5Vgz5X[XXYuu)[7[s\/W\5^uu^5uXS_F[vA5`b#v;6dCLdo]OP egf^ogc8WA6isiwi3P6i7vjkOkǶ6mlsVn߶osokXo6q;q_:7sksOIn=w&wa7_ug7v_wnvw7xCy7zywz{7|[7CS U'&_23'w&0mҀxw6P.838'+}mO*vxz88wچjx8w'Je0d 3r%F7٠d1α]DŸ$Y]O *}~o1hG"xyzjQWXHg)Il BZOrf7 $lOi+sdE1'噣k{blǬ TĞ0bH0nz O2- b{\:OҭzdxVG.!P]8._~8tT } ZM,]ߌ)%xȑzcB;;{h2,^!zK`oXN쀩 p.0[ǥ9Ȧpq>  h;è.."=ܛSX+=3dO<~ 3~)M{+uhߘ닔,yOcA9}.:~@\K8񧽣~/~u, ݿn6lP`B 6daD5XhcF9vdH#I4yrI+Yfl`̅2Ҕ9慁; 'PBy 'ϤJ}8ҡDu_#BL$1&8MܑB#YS ϩ>L1@*=P9:mK2 55 aP.j,mGo=UB9,OWiR,yU3EsUв6 j ZE6Y?5V5D=tRt"3lmUUq& /RDM=6ZTW#v}T^饉oR_e7o+&!]&8]^EY饓nbkWf0UUKSŗ;Zv~zfjvjꮧv6;쩫Zj.׮{ovln_\lkU\#Rl= gapS1i&[Bwd&ÙW0*NZQ>r40A$!C>h"񈀚P d0}e"aÀ'lNrW6al׭h4ʉ9Td:7G;q!i֣4Du+H/5"52-GlL^&_&FS #I)PbʜW ZAdUj%-Q4}ga/5^G !&$Igߨ9MkVf6m~ӛ66I=/U!SaCvi2?2N\񙭾C{@!a`hLp2,[eBPʡKLƬІ.Nt4(Fz40̠I4Y#5pw*Cq ; ''Mo294P:3F~ ݃d g^{U[窂6k*lˆuO]9RRmb;1L~֌fO?T͟O13dZX&40P}3W(eHֽ>x+"5gb,Z4NFH-8y>./hKH4q轱FA ʞJH?D\*RYhS7=Bbl&&n,=Pa`l}HR Y,IR|i0 YvG(p"ﴎ,kp]l@ ̏ M=+ mdI2-&Rh* 2p4hPD zjнξ 0 в,Ћt/R+Ǵٍ̼#wCȰA0,101t '`C+.K8(pj+8++йLh>nW kc2.E P-Lv,&-Y L,+K <,0њ"{yr*}Bp1 lNoqt/JwklLQJ*FrBb~l| OPNo ( 7Nb10 (#dJ)DU**D "~8 *ga1ϊfۈ6mxCF-"V-b8(irR-R]`p?p-FMiܐ`vRHr.HpE产Dd*E-4an4E j-}1(PN8\ED1Q^ODNH~R$K $$9/51=-H>I-6l:$odP(R1K,K~3ا4S+(HRXOBfgp㣸f)).iQِ’,J^ -"&> C9-N o69J,FblK(C;TtF> 6.1دZDVGD/YmE3(='6ë-bu) (,*C )E+9SbYD..%dZoZ#B[, ي? yygjj$ci-z4Fk#k=7vB Z/%ezBe/^'b;]cr#M /MNOmz[YA,;e֭/p:-y%VN1`æ5c/CU0hy :wϬ]CE CH/1Jl\bɄ]1`\9>b*)R.PO锧q)5{d7^w{DEAs \z91Ĕ Uqcc9{=,^']^^ǽ4JO󾧎_"]MGOyL;?C/ 'JA/AOu_kogOAZ\_M#q'mn#Gk_m_?EoN_{n3?$_ <0… :|1C$Z1ƍ;z2ȑ$K<2ʕ,[| 3̙4kڼ3Ν<{;libcommons-dbcp-java-1.4.orig/src/site/resources/images/uml/prepareStatement.gif0000644000175000017500000013632311333570550030033 0ustar drazzibdrazzibGIF89at!)!11!9%B!JDJ!B)R R!J!NZ!ZZZ!J)N)R)R1Z)Z)Z)Z1e g!f )q&c1p 1{+s)!+13)536R!N! B!J!R!Z!J!!R!!1!)9!)B!)J!)R!)B!1J!1R!1c!Z!!c!!Z!)Z!1c1c!)g1k!m.k9s9{9{!19?H)R)!1))R))B)1J)1R)1J)9Z) R)9Z!9c!9e) m)/k!9y!>H1*V-9]1 f15N5BZ5Bc)9m,@rnI^`kkq{ƔƜÙ˙ΜƽʥΥҩֵֵ֭ޭޭޭ޵޵޽޽,tKOa…#BDK#okH?~Pj׮0)ƴ(&͛3sԉ>}Νw{*tӥOBew$}UYf|+ԯRz v!ۨAG3ӘݱxUxr`ƌ[߻|2/ǎ#,k6xuB\ꯝç;e J~ $xF~\Eo,xaǗf5t 0v (;c{' qߺn%hw\sسew7yug!i zR;WnvWmWqM疅m_]%8jz-Bi iQAumF'#߱gs8czYj?c;htډFɱ)ob#nIͥmW*z~٩(qDmIB 6PUe_kEaI Ցs`ΑmЬ)驸:QVj걿;`%ufY\>!m+..;иkZ,\'Aoql '믿>]9@hȪ;p 54BR4e2p0If/z1 bsLXouOWQ-i:ITW Zjee\X͹I*r?lKV_ǍZ-7KZko\iZM]g_!-Ob=7z7܆8Յ}x ~xՆ'](4`g^8Zw{:^.zޖ5ުkuz~#֨ε?"`s9)YB;ͯ.w#W4oJo1 n>7^{ `%,]^F2%$IRӔd{_|/yL]RSĦ0S #X Vd#4kAԩmLGG: PD;wZs (( *xғ 4> o|Ffâ FHG*ҒhGҔ^Jld#7IMӝ@PJԡh6%hQzԪRVjIAftS=RUh=Z:RԦHj66O|dh^ٺ־67QC\ZQ:}d RG#a GFҎMjWZ+ (S) pKE`#؁ FpZM#La S T&dMzUk@ h`jXgiT037 0qFL ;&E*o pv;N! L`!(cHqɡ 0UbrX2r(\f r3N&;KVƑ1TS@2.{9a1ޠ6.6L*ϧ0iINlcCeLg1 ')ƅ'M/,s@ |3axcԣG/V ^իu_MXԵ=gX<P;;$G@1=~ qОueMZK՞m{[(nnn7-zǻa0Q7Mo.nh"̞GxK򔟼3b1ayΛ~󨯼5ηZw=q `qb`.\ {(|"L6@_=zuQk}CNo|Otq?E{uwpWa0aI{kw׀agt(x7`W j lpv S@H)ȁxX/1(3F~picbꆂ-+HChHGhMȄFtV Rgby: A(E.vwu .h% `uF'n1b(IȄvDȁ{5x`h FjgLG  jtl6jXu~yGo@X@ lodR7\NJ芲XWtx#A p(Hxv@~FhP tK&lxȸ،8uWWCha@~FXXxxP{j ,ftHHȐy&nsl Y0 aHlζjqφ DPX 7FSrb' SG u*iV؍A(Wl`nDXK XIv~ht|@Nqɔ+\@9yj^_gf{1Ћr wYaqH_gtH1Q qAУpJٖY(ntSwt^Həojl@W 70 I|S'6JiК@l gQQttXjɛ)YJ')ٝ qij깛ɞ9RP%ɞ¹ܩ9ϖ jéٛvt *% V  yj"J* I&P 1*4'{(*z%z'z %I{=lcؐpj ڞ2-z:ON*gʤI3.ʢ#J j> 'P ~(mJyY A ej('wpfZ|9'5DI雀JS:+ڪGn>zgf8 j))z*v .IV`ڞjHʬs 7uɦjy *FxxqI"笞|D٦ʢu ?3+5(x* v:Ίʰ+˅ڱ&[,{utE rHyj` `j `C FuJ+ ` jfސZdI ydGYJ td[ 9f+x?umKnp kpYf{Q0 'jF|Njo˷Hwbljq;t K Tij0 qslJ&?kJDȴf`jdKfCK[XS(ujjǩPt+vJ۴F{LkjN {`0Ii,H|7fK$K p{?; kCk {j [e{BK$bwj Kjk #t[ H0:+7YkVP`j@Y)wQ Á볦. +t)(Z›+c%\¦ 2|¸&j<@4년{nuhVƶkœ[϶n+ɋkF}*VCJeK391gS */Cӎ?6EѢX=DpɐI(I䃶O?4!┈ҞP|(9 $zpѫH <,9%DŇCK~H@R"U$55i%\,KE~?$.?*CDpIn҄UPIHHQ-NhBdZN15UCNB4"NvjLN𰧒?8񣓑&CI0$^܏^ġv`$qzh+   X\jqlm͟^*(l{x1nY*q $ K$$z@aeA:YB"T#BED}tuN"إO ED<$A CP"(BO!C(QX4& b!¡& ]"+Ѝ;Bb)Z rEQRzqC#,A+Y|pPD/bCDX@!@ez=&*G0q\28"{`!3"KkE( ,c `#yhnCթ' PzcѫG87;uvױpal]҆q8Z`%Ú{\r0򖺺4W$zjğm g^ q[^=WV}%(NtnsιDz:DGnр&Lʬ$HHHD2 >I;Cj M~p$*: Cpx"Bc#(/$qp &"3sR!KT"H'xz5!" Ws>a_{GA aŜiá}  ;QQ ؃,Ua=p 8nJPR\ O"NjOtU+3g \b<\b"T<x p!_<"yYb@8*!jEgO2cyMѨxO܌E2{"<&5{]ЉyHa BC+<{.mNX+Ԕq}BRv›vqސch@& }}]QaOdUqTyG/ G1m\UI^$%*Uġ:ɑUTԃl={T|tvXxy6IG( W~Xs(^qU{-?ۥy8) _ zC8կ2>=̃y D"9! $.IԙN+>@K6x_Z0*@Uwhe+\1(QU &zAm2[١X[97zD(23Ah(*s(yGHK挔#ؤ8<3ֱ<VWi)ְ#o:YaFg 8 +)zx I "`*κz0z7g,\\h @a8LBa$R~ȍtўv,<C +{Cr,(- 6@Y*ڜ⠙ ꞜZ(W0@>[; O<MKa#@T8?C@;2S,A6{z Vh{]  Kpp)2nAk) [=f j;I hil!|G}41~|G|;#H41,~E.-Qsss`rP|pR/Up<Ќ G < CH;=aϬʪSO!PUQ(QUP[UòD4řT=2 |$I;XI7͑Сhk gslÕ-RS"c @{ZWt%Aay5wxWw5 TW;tutwDSAH KAҨ=6؀}y%:%A(ׂX);X}أ٣XYuT H& }6TVieVǠɀ ښ hID{DH֕5eHE+  zDdHENT IhşhEېؤ iPԚ %٭ )Xu4E~\'u-ؒMѨUqAu]zUyU'1 s#zZwI;|:N#qopqPcCViMSz-=ydUCq5_~U@0ɩX\QR(`$[M]AF( ^ ,Eb$ú]l Ib`928%-x]c9Sb4ޱ*\8^حYV[b >P"TvTL Wtc5:B_U(`cˮx]ڏ)uF K 7U QAI%ۣ^vܽS 1աu%dQJ9n4eQ-\f\]WPHdtB 9tSXZ庌Q u"r[`Ob& u# f `gg6U8 >[a]eӾz9 ĊSE9h3mA`~2z'f݅x 0NG\&kcEHh8C>g%9>UlFƢF^M KauOE<"U_£* {2xZ ^0ՏEq0mKރǘB7[Sn=k=~kl.ܚSՀFn=znlgN`gO eqy UX, s$y^~ln~lt|Nnk 9.콶mk.>kW@MJMzߓ[ه C ZZpt'^ eԱ,'^')a ~bȫfe Yi7s:msDa2C3#=bf2ؤ"e[j<1#`A" 5 +rD&1Mk"2t' Xj9aIGcY޲Ҏk{[Opqpc93@d2RCqZr2~:B1>J83ZJ`2B#h`+pĥ=I|#¬\hJ[T"HH R댴;h,7VPxZL5XSd@ }>zV0JkZA e.d 0GCqᦷR( wVqʚcTdPZfF/dF=J{9ow̏gUZWDL>́tHu3KG;h|fF1Dcщn tpЪUǎ? ?g}hLSҚn5_Jz֮hGctsmX:ľt8Ѝ?}##k}as{6{=DkC6]s;F]3{/ z|&c 8%/"=E 'QZZ;IMYD^;ā6@*>V>,^ V V ݌" QUVZd7<}x x_XD RĮCy!O!~!ڡ"!E!Z # "#lS$>bbb#fՓ}-ZKd)>BԊdb<3pdrb+ (.ob(G0Gb0dЎSWQq!B&b!*e%r ^Z9c&;&a<HR^>FL|ƒ7AB#;&bO$%%ʣ;#&"4AF ?n$IJ$:>j>z#CRT#G$M $(b)Jd͘ _^ԊN,"B ƈ .ڢʈ SL\-"RcOnWZ`.#nc>#c*=[d&^Xey!Z$\=<=d#$_f !"az`^!2$He*⼑aEZ)cf$:b$Rg&=.7L$hfehTBbfVk&ifkb7ojf=&[N4X{4SؓtJWI@'4Fgvnǰ@y픩5cn'zMdR's"鎔sRGuJO^&:w6NŘi# 郊f^cO]芲Ga}b}T_(i&{桝ibąa)WY!j(hjh~pfjm:l2=vmC&ɶɂ,n,Ɋb޽fvhr̾,Ƭ-͆2m-眖ʐvEOJ~2+Bif+VnW^'rَƗզFVΨ-!ޜ!J<:m:䢬fU)l-JmG6(H5R)-f&,LRҮĴ!FyhGn. o.b"oF[Fxt`ElR/Vo*^j6"]J/!EooF/ȟeC@Ư// l6jEHntzRk~TObq'dd'N|N**/baFD۩Q`] ߯)fl]rzfop?h̰00.&fz_ha"fgL6ư_^Gίr1qnVgoޱq G /oo G  2!!%*\2'WM'p(C(){2*2)'2**,G'r+C .۲8 Ryz/'!$pl쒰r2r&~, q4C4s7Kr$p lw383:n[ rv(&;EhÉvvhth>s\ 4B(eB 4ckCOQ>SQm4GR+mGw4GUH4.U%1$uJH4LtHtG1L䱃jBz,P8Rt4z4Q'u#>iRGuQs&>KVk5AJnX$V"Y(}Z Hdhgu\5^u^ߵ^5_ @\ӵ]ib+vb?6c H D L 2D[u%'=uZ6iYa[iiƦ6kǶr]lvB+7ⶊ|!ڥ7qq)rrs]ݺ9wr37q;7wg7twsm9HT'G6{u{6gK|o5DX}oᾎ5/87?x>3@8g^4]Fu}[OzE7c{7B*6%7Ǔ*ɋϷ9k1o&;p9E6ԁ6\+y/{< 1+KyWl ?X]VR% W2|CF*RyR3X~4nrv6A6q,*95ig5<8`j6u;rW5~#`6;f'欿`^#R?49*6qxwg:O=}?~C4s#Q=W}[^$7~{`)C׾-%6~Whz#|\RlY47R QV,~wy'W>C=ꃡ3H;nk?!Vv@ 6tbD)FBx6[ݿs +4y?de/cœ)M9y HxOȲNJt}z*?(n1e?}izmZk^ƌڦo^qU.lQ% xX!b \xl97pac3fX!b)uuzifدF@kʍ3 taHg%6;o򉷐G9F1t.>~V󛊴fp҅:\~~kj\Oۏ@+}؁+A Z51&ې5bg6;,!G!@Q PFc ѡBNJl%r&l9)Ԓ,\O't#0ч#\MB:-,vTjc bdM 54D@29A"P0)V V^$oĪ#xP`Y&QzzKd p@{d 8C9\5C*2A "VCxS;(iM'*h.)e$P9de|xL \;j$d8u` &X' c wMH (A1dDc8"@3A e4@; Ͷ}(PzpiU!!OδwѴ; E:q܈zz1TsKe`oXh#ՏWfXu_KӼ芉8aA`٦Li?x0Y] M&jG6j*$B\PD s, ; pmDU͒b #XM G`xMJ5f2HUR0Eb{ P,D:I% uY8ɆdiuV =-&y%ElLC:!=f+z5R%|p U%OKS;m< iS#\67:y48FeM_LEYeI $y;".s]櫽SAZ(U G* rfm/qlyt*ECVᰁV[2}M=b$eFr`gPUf88Zc )KQ%! :EG5q ʨ7!/ؠU( oE G5ywӞְjdG*9y^=crQ;@<&Tm@L!dV-E\[zCNAU7z#2-=z-ת`}8B69G:x^`vPnTU6L`BnUCӶz Qqb)EE"%RXO#%c:| JM`')6.gS6D4<00DH71*OJP36l4@T&VdB|.ހ/\tzbMTMX4mln8bAe*Ioj klwX*X1C$bkpNDŽ'ah0rԤ&I%3^DDQ3_U^$p01BdD`NIBHIrbzIVtt'gNFpqvk$!V``>f x7 gw(+N.'%X4+XŒQXi"4h%F|hd* E[&lp|0DfMdbD ca8 C gF<[I:`#B\LXHpCLPn$Mf1-RJ%]" A`7*%4hhlɮh,(r ɂ(ƪh2vǜ2V)Zrv (yRJPuiH0e2@&   T%mF!4er./aHSe2!5 @bYR.%D9xC3tZbkM\H5OW%Yv/#Lڨֺۘ| r|3ݤ֜ ڞ87{S٘7omS;m۸ r r:HH__`bUr^R1c$8_:`H/1f B AM|35B3'?RqoW~nR1F4DO5U7%Z ^ ` n T Gn^Tn vGkt@ \`rR` t舎T R@G FstKnKUDt ԠLNvG\܀ R @t.z`d @h`G 4!FTb;i1Ն`Rrm͆mZ%!0"[S2&FcT# zr21T/^E?Md%a7(IةBhʠ$-njR)(NJNJYPh~,Z*iY[7BDvz ͓̊ʀA<l2/':p%!;0f_&B,rrU7ePc%0PH;\I~&܄}#7}3uA^aHOTZ&ӧQz5X]:= ԫ˱l^5R-j| M[P~At#?~4Ōk 9ǒ)G 伉ƴdO[=S*_E ;U~#RDu6Xz{I}]>~_ |<S;؁Xw>Et]oQP~v>ah"O(XVr=/HS\U8M6.΄iSu) w8ꔕ?3%sO&V$*_W2eG ה'mhM'@cSMJ,.Vo4%N;,hlԎX*^Vr/sNa,(S Xh&O?~t~ɜsk|a'c6OsP%6nn8cPr軚Z?0S: O nSk0r&-Y\Ý>d smIņ:O5Weg|9Rs\5*Х n; N&:.Քsrw|$UIR#@Iw,| ~^?/}W)%TjM fWwTh6wYƶ~R]R>BS @H4a r~c" N됀,/@ Iн}@xk?q)`k c< a.H%NvaT&&$̀;IV;-!QM-[ԑ-&%M6%FtEPVٲ;=ET)xP{ Ҋx&JMɑ%OBuzf oXVCS|#u setnl'-m#VǹN@4rpʋۑg/EuWkb;0li[iO|S(̈́˩ƝLr@!tɂmBjfHl7GT%JRȅ_WݎڈC8d]\FBIڑIf*ܥ~N~*9j%̉x~UBawm I"1{ޫ St}4n47xJAI'A;hC aEzn>=V&K*RxY4>' ͒Ijih2XTL\θ$kU1Xltٹ3V˧J`fiy3cG;(Pۻu*ZЯJo$g~LL^Zn7* 7xrgX6iizNV9.*Z/wэ߈'yԗ6shޜ/7`ow6 NX}ʼnJ=s Mn1ЂuYh6y#Zt,˙NוFZuW1R3q*b~ʫgfXJux+CsjgG'IǜPߜ툯y^1;>C;{ܠ3s M(V8Fo~rnW0_xCZ?5O0J.Z!GH0 MM.e&/Q/F*>.JCd8^`>38N+';k~e8%vvtG(iwW 04 KVfa*1$QCA8q!P` gR"hdOA/O9vFF1'A ?.C\zK1/sd%*Q/3uXm'(k)ts]Vh":4#N$OG0IHONAC,#+ޡ `@ 0#3 @Y4Zc,.3S"#!ɕ_3 8Zu׆(7Qd:͒^9hLW]'jڱ%5#[Ii:`<Ktn!H'By<(iA$qQ 0@CS/N  ?΀<cSyybQ$8(SΦ7ׄhqRĔmmmqd1L"jIW/#%&iA'5GHsYY3 6CSU!1 5[ @HeB$%=4B5&:%t7ʝ߉zz 8*7!AQω>ERht0p9Mq_ (Y/H/F57S4TSAN;;5DDSu (jẐ=Ox9W 'e\|Wt)pdr#[ +ٕtnn6 z=c֐+ %#K!K: 5F \(gr`97Zmzmdz=c0w1$h/Hgki;) bOB;[4&b2\nvjQRK(KK:qyuv@+Kk50P * ژG9¢TFyBwZZZL/w뻿΢@˻zQ(ۻz n (*Հ׋ \ z(†jyUDgLXVech/ۼ ,Ll ـ \ + l 0  ;p ܼ 5 ذ+- 3|5L !;P5 l|wqF? _`VctFV[K[{eZkԫ[@/Pc,elfgikflqTk"@vmOPOv\_POTw \vq}T)`kq|ɡɣ,wL=?9н[-pKPj@^lKM@H<jiW[L}y;V,K\ lGr་ v g4{ ^ltAEL)"Ka'it)7q)k$ex,.dSie+By9cc#M%$!+ҵ <88 4<ܹPq k8Vzz' '+tJ-ɬgXK}ZvrzF1Ma$"~$W&qzq=tF[]{8zUy}owVbq>Ay4zMc7$b[Qlж~0yi{nJ7to Ѐ+݇7Q-%Mi"Х;}Tv.Qum8kq-!$7"IW٤6q =teT`/{zvMqwR.w-u&-ؿVdОgvb])=bνԭrq!"JśTՉ̧`kj#jKZc]Fg!,,"'\n>f܍`mҵf/% bםs]TbJ}\=]wf}Q'L4H֪1K#;q7,CQ}Tv{Xh~KaQ|@XG=>Wotc+2Z)amctF{,˙]}qp]F-?_B@bT:vX{1ִ=ftװ~Xl]wv..hPއS^zZ/u1E w缾Cn}f2I)}Wc&ʣÌeQ<`~2'+IqoWMhv]3ުr>+ǕÞ٪H7d;g贸"o'Ǖ1$.,d.3?MƃM2@Sf?рfo,K- #kVhVk?pESx\Cap%ATt:*p`AD3!z~Pg(jQ2,O%M#lͫ٠jP*6 aFMa @ 'a/Sb<L[Rj bfɿo M ge ܑMJ,#l>"b ͟ "lrv!v cO[CASpv8*'@Sh߾Tek-a6m$M<}TPEEZt?߾p󶂊o߰٤7!ޘOc~7o6CRPfa3k&lGK,nexYkܙg>Mn/-p7lު YlС>-vȓYlrmnzzjWg^8+*XS%i>_?q D0A:oR0±:kA- 7ܐ+9%liƎ4 2舩3RC'Xxa c*#8J H'̸/2H8#vH#TI'k2iH30j2:jFx.*X#$$i*2-G#9T'tT"HԒSJuTLL,HHӤK+flqoJM/0Xj46٤,gѪC֭Ya'k q75l":P:șf%QUMyf!^j %_'!:H5їtC>B_ X ~*Mybݗy ͦQ38v*`ʛ'zٮP+HplCD&5mڇ/x'bjZy>K4ߩƩy#?;Z}r*\l4gGDO"\mh!5QMj(ʺf"glBFo I%FžG].) J.@DJekYAxLPpt586Ȕ5tCFPt@UGD2Ј"`t,){dE~ZϢr3 kP>ۡZr\]"a/c> ]Y( R " xVͫ]I9r%"JR ck9;x r<2gKqrۤ;iIPJr;P-ow\\w>6?!F<ʏX?)_ Qhgm~SXr[|xW=zbFMb\ʉ9{Y Iϻ/(OylOF t(b2(?E'$k'~Osn(RJJ7N&+ dGtXVk،<6Q3:n=O0Գskh B56RC jOZF6ըI kXT)aAŧϓڴCSj)U}/UdpzNX1^l?pe(@z-leZѳȕ=Kf5S6. l竆M5V,- `mKBimҳ>`(ŏBב6LmtJm( M55nV{QJE/Yj,4 e4B[2ZUg?b $JQV7}o`N A'^ g6ʄV3C]\WXA/m]\܆mhz Rփym5 v*ܝV+6]-J[0e-ivAcjd>J~uvvZh~ : :܍d. ݫЙZ 5W%+Ywu,m6sYJ~4- PK#5uE\va,;XmwRSW0|g,ja莭H#pbk;lwvwj_XCTbd9vYe_zAtd#u{zZכ7%HtLo+-$!BsxTiBy#L/;Jpϼ1|>\m51rwlT*Γ;x:C*,}Kg + ovFp߶4ٺb?87R~w׎%C `}P!x)g=\au@,pGRpQ/:֏tF;Y-o|RX^PfTx7dqşdۡB2BW˭<7x?O|q|!)BRi3## NgŴ6nW^Cǵ<] =l9s>2 ;`u PiP=;)9[<2S >[j Y?H1Iw+A cJA3 3= )%vp<+B;ۻ9‹  C tҸ= l!)dC !&gz"<آS,5&K=])'AXB۝D+pB0TCd  `9hB*;;YBɀ5>k>{>lDi>L56 C9t7:p?2Aƣ38I:ƃ҆! 1|XCgXC[,hŃę;0}(+dv2[EYD tEC @]tX$,*f%h Ơ <5p>4 ?FT*S{|Fh9G`ZM ]TDDt|p<HĚtJpFH|Y0E'\D<ț HɛD5|yŢIXĦTs4Hx8=Th40b/'X[2=ck;BDRAHJIo\JrdVlE}0J5Jxhz 2$G ~ K LJtL̓PLd GeYHlK:T$ ^k5[ɠF2F0LDśW JDMrTL̛4q˴0 HLMolG[JƴM;TØL#\L'̰ Hp;Lj 1#1CA?@ILhp HDWQ<~\ vtQ,VFJ(<ej* S3*({DSb'dKc=>LlD@@#EYv #h3TSќ"4Vnt/>/#\1h3mUWU4F"[MN\Ku"֓NϪ3EF,/>3pD1CCs<=C)ńc9Dlwv}Q2xMUFZz Q\,QX Le ;se>[ͱ w`0EPR<4DVo5#W>=V$gNDlZ[ؒ?zS2 W_*-+2P>C2%餘kPTiŘ)"}ٽŃ;V=]9]X2:œeթ\Mۥ].{ܵ]u9QYj76}m7UQ=S,.,[* -(;E dHe]vPeb5Ը^ڍ9%+͘+0ʺx%Ϛ^酰a+12`ƯQ~+ ?PA~N($S v p_ua+ҐQLmxy<Gw8\ͨjII_%FVb&6Nx6@j`17{=K^ٝb_ʂc2 z"% ul `@HPn kSP Ⴭ>)L܍bqNN/ S@A48w2 &2霞4pc f䞌DI0TfW\5LPtO< `ŝ ɪl  ?RԛۋМh{4ߺ}Sxe||Ca&h)sY%#c3c~c8͏PlNV)ЬG]u8߹V2"\Cx` ӜfPQ8YϴXqBf$i**hj&9my{X32kS]`'4JKk'JibkA 6H(GvX;ho` 0̓Xzsfm0lVJ!Zl k%_Um&4n>n&n`P tjA]We aW+a8vx@@RkHuMҶ~I(Gt`X퓀vRX܄J|v~C _N`Q_.gJ"<N˹N .Fqrh(q~%dGL#/u"Gpn?O;)m' WLmR1+? u[b?5s9g~,-('Hj䅨qBV޺j]D^;ƬY<DqI`a7e5 9N\p8;Le9>[PpHNGu\W1v ^z`}⨛>|e^SYc'v6脶vN?lmMr6Ktvnf0vvvz/}4B'zЩ#=:2t62&gxxKqxjֽ"G;;i'pGZsX }$+뒞$@ųO zuwzz{-`3:ҥ|8vwGJ^AjC;К'7ßQ ƿopІpo{Q|xB||_'}ҟ|Wgw}/ȁ-5(vh/i>c|=tWzlhk( ]q~]ʐlx ]Y'8l ~')~]m7 "<0!Å~M`l߲aspƎ?z rȒCG=jX6o̩s'Ϟ>Lxff4(ӦN2QHU^ Sꓣo];lʋU7/߽~+80 XCΚ.Sbn'Ox掊5PAaǎf*j̨io5|[6'/,[B1i*whN[9Λ7ru?xݿw5łPnvF<>rɏh֩ϯ*XY?Uy'}|'}yh{zC_ML6s(:X6v|JSj:UVJ%}jgxZjh*hgljh(l",F4#5԰E7iqbMܕYW]u#U7iuE[Xh7ZpSab/3EpՖju7TdS%zYK^z|XWlz > 0.˲y/7m3T}?([◮}WGrg5fgjYY1]X)2m]TWMUPޝּ5Q=\.ɇu+͸MZx7ޒsQ@=NEy~Ic?m;w/Y[ejU`Wv̷_n8|#ucE.MO0Q2!=XQm_[|hۨM-}{Y y7VpYz)@e%|Y-Gv󈝬f%Mr0uz\hPFs) 7Iٞ OS̫?WuNptJYB(@Znd)޹2Zh6D2)TjSkoFknf1r#ZzFOCP}(1U? ayGIt4KMV%+XtDRX:Av&y8kQݛ>Y( G;`.MqyǴGv \ZZBY-vj~Uɤ\+7ؑuPj&`]CY8 ]eҎw(7QG EV{tk~(K82FQ\"r{ʼnuq]䮵Y VΒ` QWTZ=QAp}\P7Ѝ(":npt%GpB2WdFFuI>E졛YQV,.Ɩ:]d@[^nnD!ra:P4쪌i E麢27KCъ @NF-B LCehL2!":CƜeH1nT4I8}#'!KnB,iMu4;5ҨV5] X(g0Cpڸ!ޠb9i)k? cj8k 8k:}~fe7ci{#ߐƃq"žС/ Ʉ GzL\(ja ?R2p"(#o` /Xmt|p-ޛs{u6&qU)Bac i@|S7%6NbLJ\%g(+ߡ:Cj((T kM ,L~Ď=e @lDD m+6ˮkn p}mP*_m")$5;Q:k0"Yxw,dCA=#*NJ[M_vȵP F TgY(Jh-#'ؤBJo䍿jVF<ʮEZ_ɚ:hf񟟌ߠ dĤ\fqˁ<a<^ZL;A`7LBB_ ))מAOǠ ! Z<-YmYiU G%aQR TbKԗy!`  OԤ$JLߩKܤS>QyTNXEWtMM yx Ԟ0=S!:a:bvX"YUdPEJ>YQ@b$MU!&$1TZ?d LaP *,-L6 R,!^"K#)F ӿ͠rq zbO]KRcHHn QcV#VU AfJ590R?d`E}I?*BF$K.( L ]# E[T:ZPQd FpIJor?`]N9"j$8ZWbO"^k7͉'aRAn!"w n8YZz雐 wz!i΄5R+>g4P_[>hH UNKDxYi*'YTx)e>d*YXOjI*;C?8?kVQ)櫙ސΩ3 ;*}YEy&R:azETKW&L`ֳy>A5&}RTԦb,VafgQ?ibݐÜC3C8V,V6CUĬى6UcWlV¸Ճr'"h^Q\/UyLJfdVjbp}*v ¬ߚ)Inf)b i-&UCMrȅnlk]r}È7,R9zrZ$M)~ƮĬpTL=q ~?|%kmՍH Ej^iz|>d`lG;`7 H)k򋩬p I͚&ޯM/Ω3U/M@J|wNFÁbtnqQt>Y؛\: r\x>LIcjnY߼qj"ua "zX|"[q=h"26o>dEsۤS6x%WI W1gJ1 1<ܩ|5KzUr w|@IӠ\ś5vU?CۊRǶ0#݌hHA[6lA 1N}"'ZMi.q2r`"ǡ*:L/[b[|X&B<ʋ6#qxE7tCyC p Ȇ ?C'A'[Y,n77);ūps 95uel?@!p-'n݉AVD_XIXWɹ_]Y`:jM?עSXĥUXYYfy=Q]gZ(3fǝhUJǵ 99@c: -hR[wy ئLz{bXpcx#LNokm7o޸IQG*͒Qr2gHWi0B 5xʤZCߜɝz߯c3mnex.\q7̓h ۖ*`Ê{6c#k2!Կ -ϤLp@ĂlBP ![Z(5PB *^5poÀ(rP(3ȉtLH̚,%̀fIQ$(j~&7? 9l"st?ݤMB![pJTPKhNOg!0;'JhUX?ՕHSxP׈zu$dRuӦ>D\ z?v@8ŊV[;#3?CÅCVMa]!i?}\JR)iStb0w LT*;f '2g Cp>iS1ìY*ݔbϖO&k4>O9]бH͸<ٽmisgi>RuSNk_ 1ø$k]۱|&ȿki[6M)ʷ;~s}Ώ/ 01[u4:zOmO{~4Z _B=C/γybjcVa}^* =CJvv] =AiQ1b;[s7lk$0[)V@%{7C~ Q (ȐpdYJA"nNNR>&@th[bZ@n" ϒ-@:F U)2od^S bKXnnO'v]D)*v_vY2/ljG@FP" )0ZR'%qe(J!ްYJA$&lGX%>l ;yLe ,0yia`.UFō3|(˷IN.HCdqʲA 7K;a*ahq`&qoP $rF udn,dItRE ;Lju(LcRSI4i |NyYu6e!k'dNx)\csJwD)ZŘ8;1;DJ7PĘ3P:j3h$&P6RxlC\һLDt]B>."߬?JRť˙4,JOru mU3TA*#gu)dqiE+ؒ+[r8͛o! :=UzM5d@7TIE8Hp] X4C Y=tYRբtN}tH0W6֭2X[`VxWݐ Xgjh^E4Z>?2dIsgn!2ڑ`pڹ J{fPx 1=|gZS. 1p,cbc:Q61S[L$0226 Tj$ ,Q~wplM)+}ַja:^8foʯa)OdQO_މ.Zio??IS)&ذy?/LS`af,fwЍwdf'~b:y]^|}D3 P(QUN?@=P.t՗d,;l̜ P'@"#.˶gSo/Tѻt״>/|S%ѿ<BN̾/+Hac,RʦK>o{$ !G.%4+ҫzϙ`CǘL 1@&vǪ/+ t Q"gL'F 5 d8bF !fXT ` JTh c a!_VFLˢ#)bx`Hi)uHr `@!aB"P*a? J5kJ̠2LȊB!|SJEGd4n<. -PDĂ@Zίzk5VHFD6xF lt SZB72"#4B!B6"&!D!!!%nq!e"=#)Ij" d1 ,Q+%f?hmd`^K_کD $@t~t6*J*J+2+R+2,+2+2-HEPR,UB'Z%&DC&7_ wgWҎR"%04 ` D` j`v)} x * Nc4E4I4M35Qs5U5Y5]36Q h4i  ^ހdH0ql0o.$@Vrvd~'Q|0~ r;@ )l 1==3>s>s>;Z*ȁp0(9d,!"x)M^:E2N6BT2JtCA vl (]ԑT4EQE_EY H01{_lt)TA@;+z&G^"B$$,=D'j'%LfLL}K4MєMM۔Msp#XP2X2@E_B'4>V:eh\ɨ b~"&,Fv|zS1T)GTA@BSTQlO94,$&"Pn.dX'\"(BمIIaD%r&UpkSU*$мOR[5\Yk\\e\x]\U]͵]5a~,!TAq~ 폐Vb_QR,cf _·HjEkvq Nwvth-iN Y4>P3tԎ2Z '`FQHgMgEev$eGbej)䅃`e'D)m뚮@sOMnP~L]QU]T(Gcdj7E]v|ՑwshPTw&'7O$ Q86Nd24buotw}Vi\rh;=$7~XWk㾰hA$e7qm%dȀs?%ВfyVh yNz7.{no"A)B6xi-n~d~f&酊rTȀ D"giu&sVG?7P$t7EiBd3d33A6lDfE…wwY~.Xn$R=\ B%5yښ7sin4Y;Ԁ6`\` \`V rL!cLUYX zbYUY&~f=!($)A l4Mv"l¸@C y wR1[#Ei;A Ȁ5 X"`T` tI:Ҡ ; 89!b:Lfc`' L (h2Ykkp?x2-F_$# :H23p|#G!:C!PKmGF1&Z8![I& SJY2WW\TzGimtKB5%Ur&zٹGCƒ2o"‡HueGbIa.%C'[6,!Lp'r>IZ`rzw 㩦_kg!xT$sU k6c(p<{Tt&j`NQsbʹEF?F!0wpBaw.LڀYd]PLGv_42"a*qa[Cd`E_aP}[##O~Qb \l}ZaphK\?[TrfN0_7p)<%B^H`J!lȋpn ϟ£ A|Ë3jȱǏ /a3J\ɲ˗0w3ϟ@E$YP7'A*Be{:sի1>q( o[OaMDe a۵ZRZqߺ8ߋgP$DU^3kYu`8ٸLcg ]ƦO[XRJҩfY`Yvc|?}G6͇{lΡw^]Po^I߿c3f$= .UE{*EWav`uW[A`m5mvVzYԔ %!dc B<9wPEr͇{c͕l0F?Fӎ1%#zЎ=vNB>(cG6jF 䟇I??U~ WIHqެgi$Wmr` 7WM6d8v7Ύ&$6m:됥s"N6F4ɭJ}e cF>54!w(0j϶P.P(\cFi vO`&E$ RѸ&ceGwL,ͿmMZc$ӽs_}x>fjT "fBmki ?*\Ʃ3Ȍd,I3 wyA6h2{\x/y%ڛIcsVНmEE,YX5ԇ$\/7) "Ω̣#FI?(IE-Y&J GN&}slKJ%~4c6ls։mظtʳK pg;4-" ҏصltӅ7|# >[Zuj( T %$f?PHk^wZ6wM SŒzNr:KA&Lۛ#8e~K'c!x|ԋtcZ(WT:DC'f~Wi| J\hІvjGph A7ʐ Xyz E?:?Sum/Pʐ'ā qHA鑊ݸ3Ę>ƭҰƌ*3Z7h{5E `CM'mi7ekND-kRkWچ| M64ڃ+4ltLZoL<93yx،ipQ+:m99<p@pFۘks{'1DyE CD o^x0'2YɶB 8^b/ |{%FG;@Gg;vl[c0>tYG7g~a[57q(w0) UI5&J)Dhr$Y8jVT"Y8EV8/uN0QQOGxNJ#1UܢB<9D:p_K#BU!VJ$"S !!)"{U"W8#WdHHشG5I/@DRpsՇ &d]U0`׆+q 7P2\(ғM-TU]H9cR#k?"vZ4s5Y sbh\"[ȎQсMA߀+Ir6+\d3.AR6Gg%$X~%I[ SEb&1"-!Or9SՂ|}Yb1&a 1kwE_PYG5ON(UUynAC@(KU\4 `#-29xqn,%zdf>"Gg|D$ZgRĖQnv exx ]M3FH}0t.I-e|eEg)f'9\.` g9FaT@)?2>e\nQqfEVŐ?ST~LDV{R%"gXYnDq%IK9QUle!P`^ )4s̕_i1YF5~CZڐ(jC 4AYq }9miWA)k5ܤ' V"DU`\y]BAy0Bn@zgo#WءACN4&1v'hZJD BjR2؞4a\0gL*6)kK١ߠ\`5 f?fP v3+LP+;*<è5s[ zZmd @Wp0.)٣q!%*\z:&sGbCp b/nCؠ( |N-Q{EzY3J}2{F6Gc+WPݷ;ʞa(8C$,u 2wF/p%Nd1^rCYI;/ % 1%;n!#K)ہPr*4 :) B[0G.頗.HPZʬFMkinJJڂ0azSd)FjI}P431ފ( 5 |3 Dk?F*25DQ&z9q T"id@bƉi1#;I$Sc}kP/5W[F+]f c]r갞UN+[LTptj"LPѼ5l[KQiՋjA q .ziah%aV=B.LgSd Dj;*o)[{o>te|DtGaʦ4" Bg9Zԡ{ʞKb(F_K*i!oBnVo1v)W3?ZArCqF0Bem*@`  \UxE b«YgW`tahoq0l'ǀ|3pe\Ȇ|Ȉ8xT~ȎȐb,ɖl!;libcommons-dbcp-java-1.4.orig/src/site/resources/images/uml/Delegating.gif0000644000175000017500000010520111333570550026542 0ustar drazzibdrazzibGIF89a)1)19,!H*\ȰÇ#JHŋ3jȱǏ C.L HT)eF X̙8sɳϟ@ JѣoIsҦ)իXjʵׯ` P`ٲhɪMv۶xKܲ wmڻ|,mN*^̸ǐ#Kf\A-c|3ϞCs| 3Ӣ5F3fիc-;e&ͻk:iǑwVrơ#.tˣ3]Nӫ2\Z_;!ހh&XPe}1@}^Yi^faw6v`(,(ZWuh`#ȣuY@θ#I#UPF)+2h#X.9h &0d]iuhye H埀*蠺U'@rqN8dhxvfi=ᚚٹ}CVc=ew&j$LꪬOV(zzpz_iek`v:lxVkf`FܖJ짚{>j B&GUf$ @κ0n. #Īnr'w $l2oB.18;_^r"lH'T /l۱>J w&Jpz:-f~*lQ{z)Y}6PͷB{Wی7$PwiZjzW_ڐ%3hɕ*Yʰn $o|hf|j 8 Gmܳqg |>~:r(!no]d7i̓x@[BF/z1Z,s!K2 z#Єl72 1%F@io󝍓eAI:>= FCVZ"\0.H1(І:DJDJъ&\JJ4Q HLD$hINz0uKPRGibbӞ>}JԢH RԦfTSJ@U^jUլh"_IXJֲeA+Njֶ?akIֺq]W!I`J^3Y5b՞ #edلT6ͬfrكt6 mh?;O%-'MVmEdUZR+TijAEq:Wmnt+Rͮuzx;EVH25|K_ů~ ڀҶ /p&15B`w{ ilU4Xii)Qtd@,RyrZ$fO␶ĺydLQ26^3?xGvgܕ%݄2P)GS bv9} f`Yd.sP66jv 8uθyk .`D+9 \a&&Nb-r’LR*NH+fPSѓδsD.ANuukSַy#jFՍN"\;iMg ˎDg{6kkk{ƵWmsIy6's\J7ukt[ܾ&TwEw5 çQ%Nm@ GV('K[/Og<]Ÿi~s1:)t=O/{+PWzѥƨ#SǺ"I@%&֍qTK]E{섂bv:][LnƐ2x;y&>U&]UnH6'R9`SuLۛ0'2y#szL*WR/-ђ{^K—?|/ΏpI.~}.߾?,O%׏}/oÐ:s$e#x/M$X#҃hxO%88"h!$%-424f!!H&c9@:t"':89tC2HA9-zR>g!CaDh7r"x7q)=H4&`87h0qjWt'e75>-#=ib'I<a$8(s'L34aR!#_r@xᅕWxhx;-K?79́>a/(="~8Wd6D-h)2h6hC42bc9@?*W؍8#H#808F㉥XVɣR?߸7$#VH)@lx*iւ}ሺxy8(9H!h?rs7r@s'(&*%:roa`4S5=e(΁&z+ڡڬELjZ9 ȱ9Z 6>ӊ1*1z3*5p*v 'J1B5_:{<=k^BK94!30)+ [%)Zz[#Oth[dFf[`;cjAҶc~d GFXHoʮ93V.a)8ѫJ!ɤV# m*ZS._ʟ8z#1B\UIi`2ʪ{`3' Zkxc>B^z,>ڮ${+K%i1 I63CyA("Y3+> M:(#IHDؾZ~] a(?H<2 J@› 0[ٛ8+ zx gq_ᩓi$ͩq*$H";kZ'x(ӑY;J;῾jA}[Uq!4bY9p";>-JM7I+K<"[-acHxR*@c֬ᩞd+#lfpzmYj惀y s'{zO +,G(̒ ١NHb?sDOEʼ$Z'OI@l}ٚ==9*t~24D5 еA;l<>(-;S0_7 `"prMv$FkJ=LL,jg$BtB.\_BBb`0XtB?/=R"FQK%` ?Et8 qNqAwaڧ|T4`/EH`F% EGPQ!or=-g iUI䱏 O= oXʯ~4n?_T_VDˍTqGAfa2ʽMuēBIqSf @H0pdC%NXE5n8G!E(I)Ud%I/eΤYM2|```8%Jr΢I:SQm6Zբ hUIaŮ:,Hgծe+l[q29ٺw/[fi^‰U6mcȑo\C_挑qA&Qti}5NǦtmboN]p7oC=8-/LsvGrzuś_v_>lqW~ {jǯOjI@+|*T>.B BϮ.РA9L+DET1E alEk h 2 _G!lHT"3hѡ'tr" % sL(Y%, 쵲$6CJ(6㒳NT, sJ>rJ΀ƻ G,oϸ5k 4;FQsT 9T< ӥ6uLTZHSkTlGJj&H E=_ PaR}5׿z˿.ٸj[m[pq5\tUt]7v}\wEWDW^{7xஶ:_v8[ fXێ3y〯//i`pa9ey{nsg磍饕&:f馡zk:曹jlmf!Q [nN;m{o] X o~8 gG=moه?<{p#hRv~w7<׵Knhv0Q#iBsEbvf !)R} K0y˽{:{؋ @ثYӁ-SқHA*"s*|&zMv*4! ?LBE|-/7"D*ۣ;N̍AݸA'@B.Y?9ţjOB$ &DBPd&bJ+tԜbGxrGD-Үڔw[H.?4t(%"!dF")@lBQD+G:Djt?dAT=Ⱥ1ȯF?,:t(] EleԦII` q`H8jFBeGAG?B%25l!FK`) tKsnˏL Lo1~qkQLl˯ t\LĴLm銼$*00T̽t̻͏ M|M͜ތMĄ ̐pMKoJ˂1׌dThξKvΜN͌N\LLLoNT̉rp,ə]C;HkħtP)=4#$)J-u|āLZK^ZFe:s R|J!F1ZSdAHG*mcĠIhC^P u ̥/I?j*=RˢS?)*[uD,.$-DMR@jQt39DD;Tzi#3r56@SP @rt%~}T_{L\}"'"j4ȲLPQI-4PAݩaRܸQd ?Uo["qMWH*ʦUY1=5W}%W DWXy#)LBѼ"X׆ S"tkJzX}ꚡI׎nNH >{*H@\!Q+.ig >[yk K`Q724]i]l4|\eimAX~`J.deMnbY m1eƽ4Z&1=2i:)8-gY8~3nǞ &G d,1&iavg7"&/VychIe- טGRciof뼮NޯR dI-0`{8V38^,0rm-cIщD =%^ViJkhfh!VN#^jj=~ho&doݺl'c%Ġ$e&jN-pϹA*}n~oFa7l^\ξj".ihj-ֳRf޷{.93*gӹR:f1]Tq@좉Ln+gJ>r;4^V_o1 8^`͝DIs7p@$_vl7>B^\/hr-7N3bCW&%odn(ɚ}ˡ9~FPmqķ<7Į~?Q*e#.t(DO b+:R#dQ\2G:l1j0bc'vh dyvv$Iv$YjvjCvl*uP+%uiT-«nV2# p,MI kyrlᲤW%֣?F?F#>m"+6H~!Y>.D\$UdNhTܽ 4bs%AVy:V-pttiX4JY%N UwIai~lqǔH5CEqHsZy%uRJ'Z ТA5 qZ+-,XP^ꊐwgbNw(ZlPu+h׈ +Ⱦ:u9Jd.oShZƎqoeg!"Au@ε$-v[E%.F9+ Gd+8}GL=5NtI R[Wu_'mp3A`ν[ۼugǾЋ)s%t&3%@\ dA|q>^ޗO78":~H'PuVf\slA@.4hBg;ڎ^yvC.GwKE%L aVQ%U%x 5;hg<>$\-'q0`</$}H$B',Kk,}]j9\Cf#)cDS`X$0QE@/RҍR/؛z%WٷfRr,aMMj1Ҥ)M 3u^-VxV\qaM'ęMXHՐ{"WxOݛ'id;VIC8}SW\› ŲkXA]6,xZ霏80]lβex7G F2uZi!d+hg/+s]ٕ5sN1z+yWOD$8&-P#w$ iv˫q$t . li$-I)ѧM1PnzY-P*_6Աjɗ@A yʭkM (D$E`kW4;Jjr!O b-rJ4hoHtӫ< blU~b{4\޶k{ݕ"a91B{mӝomϊn]U1xEϹ(S]RWP.쎌/ٍ(Eo'2 C&vGJSM".KSD-'::sn}kRBSl^f;wIn/Hܟnkؿb4Qᅯ2ޭk _㖿ñ^q4C$JY2 S}pMvT"+桯y;=:riP>236о#q\YXѓ k6ܢZdNZmaK%JʹAۡt`pa E#C4j}10p=cQ#:ZTvX5#X#31b^VX hR"! D-1&.Mg)*B@b9KE"L$M֤Mj0MF"cCF2f0ŗa`L0ISaiR$d?2V⽋=XS(%B%Y%?zbN~E W$^IeZ[%:^wgY]"nE-)%Ud3>E֑fRg>$!M\&J c;Cj%UE]XH8ȑcR;% W ڠDrr2'@gsFs.guR'tMt^t:tFgwxgvy~'skD#fYj||VRUJ> nKRY`=a%0'а!% l&PҧDar]_̹a޵| NӊX"eddZ-%HT(熺&q~hF}#q^\T]9M]̋%HgՎ"\B'cFͩ@"fΩQ 'ީ)*G@\\!Dnę&0  hh^cJq*D6 VH~h#M>P>*h[hRߙ4EVBC."** 2!nӔ+w++>Lv뼮+ҫra]߽u0 hF^ 6Ğf vI,vaɷ^l@`8+p"PXHzbXُxIʵ~Œ?Q,l>i\dlXbTP`9o]R0͐EJkEBNsgN4-Jm~ڦ퇀۲Z(xX<,'i"TD % pfb&uWF.IڶfHhܶ-))Ϫl$mqşlsA큜ʋYPAc *jjQ. %­ܲ-z.x 58lg)İN8mqA2nެ+.o"έrnmDK@a.^؏PۘqnhߜM!9.)q^/aNN(J zwP `.ᄪ} hۧIdρz5بr|@n D#Jƺo Xo ܾX !ںJ8[k\pХKp5q7lj=`] 9_V(lZE% qג*`qf±#F]%=j[ޢwqYO4d)"W2,\23X֘~ߪ rI"V#.Gﮪ>/dIMQ͖g\A?n^`qܵ:p16;-nD3Mn-m_4N2G&!m9N!whU"n.3˴BFGn#jb5WR~~""˵$Y /f{-QvcDwtl׵];#`ͯqŦQݴ8ΩHb2S):5eOnUWJvpm".*Ë}BoLXv%Rdf62mvI egSi 7Yonds4׳n@VWwJ)hǽv^)&ٵE*^iYs?w\ln|kwc8M,}ĈB ٙʐ\Չ߱E+K^IzQ\r'UژCJ7._~rSHG4JEWbB,@6=_S^R8| Mo~w8(Q-v\m] a/eC͵gylx~cT~R`a0=`K9*X;s#Cw"uУY'"X鹬ҹ}ZlOyu7qvܪ&`t3hhD tĞs^w8oMVu1utAH2FzO5XnzOin!J*HCwsb6;,\O;1J۵vP[D4UpLx:e:4t %0x/J\v3UT7sswQ(y{ qr+vܐC9iةWy>qxRU>>e>=T2]};<}I̽ox"QFX^9yX++cu};eb > x0@&\`@ BH8cF9vdH0hpI'<`%ʗ0Q682˘&g<ٳAK5]MiL0QPQRi4UQV3們cɖ5{-un\s.Ko^ BKD3> <^ŋ:[iT9`i^fpsg4~飤klسn};ɻyV֢oÉp˙(:ҟS(uԟg}.9t5'Z)׫_ʲ~kM zʤ̶N[pڭ%H -0(Đò6D HQ=i滛LHM-AW0.0L cѻTS;s:jmt&f/%.>l=jZTQ\@*TKN3]K;ERGT/[lE6amQS1&aR:&L;22% R:%VWF%vW4S2AnS5P%]0 5 hY\3YהSk~ZW>Ih2p=Qc^R R#å4+mM_Q- /R. +B02\ j<-.p|-6)5haN_a@Eܰ0-m 9nn}* jʮ2τ@_jT#YIrS ֑YL(+F5!*{Jђ|diZ)f )v/LbӘ2Ya:ܥcBf/9jD4psYj2T$` O{f=6yd'!2Ѐs-ꄑÑZXd9 MUDQtL |]dXʣL9D[ƠqCP%3 #J)B[*|V4U*qGK2MgSVRU0ԫsJڌ C륯k幈UYָҥ+o V5_0Dzӟw^-!*6~+k^r&8e5lG22g+KeEQJZյ]cc[[~Le+W$XzijU _XFr_\u\̹e m҅sjuˡJMX\UA{P~Brъ$ /|]q ۍ$gp?; P UC噃azx q6`G#%NLl'uSqs^OŀINaX:QVc" O[ rc*}o-cUIj2]O#m.F:ӊ͚ ɳ68sŔr9At[gs =3z'T"޾Mo2Q=[yө~$bu:[=ߡD/FZ%t[/AWղ6e[,4&z̆٥n-#]^ڶ,vmuCb 1j4զ:6>hzTdo79^pWx,38-g 9FYq*EW)WYr'g[-Hڶm;z5:6e>'HzS}7yH \g= 1W{mv)g@xad_ş唝%5S⽦W=)ew戭 t$o^/ `'A{t=|Y %΄?d əJ/YcaB΋CIq_'d OEtIr @MVp^ FbͻxNQ O-$ ې6q31O0+C(1ID1Xb%sQq- J-I0n|Py>|QZe`&!C%wT"/ }00Td ӊdqp-$ͭj-U:1TV&]&Z0"qY,v'pv&91"q$͐vij QpLxq-F\2@CO\w(?R,Lcbpr(-%yj | Ť*Cq3,#d-L"3&S2+2/2337S3;3)*lf.6b0#NL41m cR3FH%oNx3Nv8}3Lbs#. „+6a1P-[icN'S(/<3']Q9nf5s/ch$μ3/.c2-gR@ϲną*0)elE*#CyhI0˃9IYT Q,Q'QRRϳ 6ć I,:ױa1TAHUNC{L>T|.#^h(k*F5#e!V$mE:*T!厴%*{TZOg_JH\M\_j"K)Sp?VU :Q耬ںUI"]i(1tՆ/TCɆՀ`!(gOVF2P jOEݨ)T-lk:}qʤLLcBR m#a=j"2B fzt'~P%7 hOW3PQk.B‚/f4.q2LSB"LPcl ,[v"B1ܐ;V8S07P3DcH)7T+O_vmefe%?rU4u^3+m#L]y"w0ft^Emնmz @$tW6c4x_G'n;APfqoW2zX/+z2>b>3rwyr3z5{#7pm@ud)rQ\Z1 5w{8Fa0H&aooncR]ކK⟐ 8ès/gNt.VMZcV&Qx"fZFJbvI6~o|4`bƄJO]xV'x q×y f蘏 9]T'؏q ؑ)YxزK\tն*poQt;Gq]7RVXaQxkP%ar9I~A?~Lwd!ko%Mu!$cX`&X~YuEW%ŕ-bn9b|iט7B&זA;Wvxr1RkXjWZi1|%/cg*z٩86y)t~O>)AzPz(&J? :NswGvB}Xn5 %9"ؘ,e zNP"Xoc)S?po+43<ĺ,V~gϟ^eZpSGfDY3ncZ n7zʖE_R5c`:n'eX}&#ViAQ:tZ‡*b:$HL,J"=m/Xt.;z'7)gl>|F$tYFטURõohJwiؔhZ nwFhE#=YY*>t_wUo&ce5MRLyƌd1Pu]KTcm75aXwar7V9A`:/} 4R?B8yƝB]=7r;FTtQm-a (wU8+hZv`zvf2;mp߰}f۽A:.HU4ҬmmаO2$%BGtB`:(йpX dQ*yMPcf?5DYP{ e/ F\ 8: &6ҽ\ `HyxWp&FQ)szg"M}tJ}7(J</<h1dMP' ؛W %u\${C]m,; ҋ/If뗁|qcwbjU*\"[}ܯ{>cӄ[@ڭ,7] `39dhQwZ\=owYh= }`fn]HIkY3s.?=|;̜܀JdКߊI2BK/ϖfhXo>(vb_=7?9Y>C7W{OVoAhH5>Jzl[%`}P(Q܇kL̶Ĉy\Lӓ"Pc&,;^{EwXm4zwRaW;s5>>4y'1`!q ?B/`XhG0òm".\WV6q<7SY" ,0… :|1ĉq"A0bƑ$KDxJ \ia/fa>& &8- IF8G66dR8T^G?&$QzYDbaA:N(fUi5UTTBUTzi9VzI)uT|^v'~󩷔 gVOV :S*]mI*Dlj~)E+Xꭶ뭽֧kTj&|,,^JmǾ,IuNʭn, 8,Fx`R!0TPJ4Kݣ(Q #^&<}ߥ1U=ISMxuEKŴzOS.>.AuA>^ݡawhKOvv'Wx=?iy2csoW'g,ƕ]*fWi~ HK^ 25ǫ`u2ȑp% !4蒗mOXG%vU 6O>pf O7v!&KBFa~RT:"Do~rR]Eۺ7O|gԠDžMr|G?Re_%H X=s**@KIILBEwRA$ubuhKX_W6e(2l^JJ3BLoYR[TF vel-mM\%*3YLQʰN!fSL&]썙P1 P벷0b̎#ӾdC(67?od쒩mb"Y?wĦ*3Ft}K>CuڦWYIGj |qP%`PjU&JYEU@ :@lm\0r2Xl@Ц(£,jfQϚҔTiՌ!ʮ`5VEҦ'_*T(,([6Su Er5e^M/6+[ϻn%(xgg~{XUSSlb)a^q&hUc?žײ#~3r ˪ RL쿤{KV"$EvBr.XNPfq԰(w̺[JZ2J P}[˶9%`ls Axz/Pd|٠:'ovYʒ?fE 9afjEpUZ݂5Eb*r[1b|,S;q{1:֤Gr\%p^:&9כjڹSWPTvu[d`%-\ WF62'8Ԡ^qSTrXV7l3dZ_1PUvW0Ln<)i&0L[2*oղ9g]OSZYw䳓\*#~,}qТuA-6oGd{^|T;ߟ+y4<ͷ*^U.3|˳(~י҅LEk]I+9L>=Z^ꌚYyr\\sb:yv~Ap =;2zӫ9r=zӧ>_j7=mƀa,a够058^y *=:{kW}1a|!/gi}S$6 0nO b# ?h@S>X UgRxENÃ?ҶgZ]GSVt5măm%lnt?b&lvt5y#lw6\xxP}qn''.Xh|]]i;Y,&:XCRJ$jΤ_ YH(9iɐh%ZgiD.Beb((\$9v=SHژ1NkuX!ׂpɞw{#JFaCK.jZpZ|]%qya1^[)8I}Vb?z2D /c!n)l7iX*5Aw-t1V`EqzqN<╼9C`!ag,X q,ǻ^b4CB(2Ǔ-0DMv!2)asWq,[Z,g œ/ƓLəL:ǡ,ʣib_XTXpHZF[i^xyyF ɘme ƙ,nl6 ~􋣸0 8!\`p{GxI1pL|ɟ\̝\̞Lϟ ;0t›I\7@s{-wm,*ނ 3NΒOJ -IUf,Ț@>y1}J^%QMQ^}B&"(׼4A]~jL.hm!m@O|b)>Nx< ;!Z+ jjT荮 2197mY7/@lSeGP)Bl}G=R6Ճc+$gDI'kff^nd.TО^t Ҟ^Ԏۮ+Ӗn͚(sc~'{jXV>Ú&,Qù[\,_q>\U`]57귚,eۆ>v?^ O#B j=(ع؎ 1NyF{<*OC/v(1: P]s v3=ӕ]~syLHZk[[psɠ>⽠X'1oG;ς }qΎKOK1=DyDXûWI~ $$ ~*ZFG\u.xMԧ4aět_?"L/<ןZ1I_,`;CA褧j?kl<;l A Hp`$D‚&\ŁFLX1$ő!+RJ-]SL5męSN=}TPEeQ"G#rԈæ1:U`SC"0iՑTMmZkE0WJc-i$سV {U*، 7WO"VW$ȦR82]k9ZhҥMFZjHnjᾎ?kTr|"Hχ+b[Rree6;qRE>4u|Wߊny]ywOJǟ_~@ؾR8#+,L2PkjB(t c:LK!4D2)<!S˭ vh6w!+PdI'2\+ B]+"-8\Jd;QJM <б=z ˴dB62$M.,3*h1jNSO?5'\@-/>@<HUo#(6$"^3`MU(J Y6%Y$k4*WֽC69-6]ue]Jp -\+Ķ\}$^z+ݳLH5 \=|ݝTLMJi _B]ЋDX=|ո͗!ijbfKn9eF[ЕgIRG$Ye_0iFUi fCJ1p3˵Ksv :&<.ҏ?AWYon8)=6y]t偽)fq/ ^R,!̪uz]vtj(K̊־!wbMhキ~{ѧո4Yء䉾vޯY\v'UFUV<"cK+Ϸco]=ȝk*;eH=/p؞6%x]*t^> `TBKrZ57KBֲpRi#i{ cپg;#&IeuD63Pܦ%*He'bR2]Ɋ`t Ѝoc&QF9HMKݏӿg} y`,:Ѐt"%!b$%DK-[Z,CbaktVJV25#7!0Wc1]!@Žx hLH֢&5L< d7iR0IUҜDgPƧ5ɕRB;zo BGI5qD"9 KbL rr bPMŠIL4cDLgHE:R2AΡz/B$(`h,fMD-@J'%ͅV:Ay=&8o`85q!iVՖqOZԤ'b6Uw;nSvԩ_*N(OF( C",Dm?ⴄ jd%BɵT dFgz0X7 asʹHK\+dו$l@p .ns;\(*-sw\]t\7խs].w}yK7y\/s;Y7^. Dy@\ _/6JaʁUWH|mUb[$3%fW@ Vae3{(Sm-^gb\aǏ3).+jW(~HWhT25fR@3\.׷=Ó"m6S&y U5,4a< Gi~g>6*E'7Y"UFhovS+KvREvug lTre%˩[՜OqXExgZS/aFyQJ=h tVVfb,'!k'Itg%Hj>3)eju Ӷu彟IHok2 mi+=0~/򓲓fW9.v0 *xj5Vuw,3wҒ3ȉc9KŪ"oaXWre>T!I˜Ph21W- px%3og ZIO#h0KuUjYBMs].KKR~Ģ{$ę :6(=SCLvWˌeASLy>Ow{Uf\%=5$q3zbkLl,Y;+ XG\Mae u-"? ^R6M_}Ou.6F-_efq8@䰏r,s8?'4ؠ2})8$ɘܐ0y<ɖ.+` 7`5 $ ڥ @;1=b7n7j8T7dc>K 3:Y@# B68A2>q$:2![ -);T9۫u[`> q?"Cz¤h@d;2|/zADZ5Z}Ü|"14Ks= L@C"rK)l sI '*t[}p!Q-nLX<À;CRd6I !2ZJ`|H) o*  + ;#K[@L PCw-#bO$sg*@#!"Ѣ!5`{T+TSP[<?Ĭlҫ7:m B 9A]ѾUEx ʤߠ +>ݴ4hS:#I9 lȶ¨^O7XD-eT>ŵR{r3;DGE̖5;?R QՌE,͏CBq4EHD ˜ .d&DN,Ւ0FVP{C9 Hwrݘ= !DRƪS&tٛ67/!`LQųRPu`{`G(˺?$W{Ăv9CC GYQLL!CrGODuו*"49?$?L*lʲxNKUAWfL(TߤOHpMK5d@ŠB$^VU:W[CLJZ`<ڳJay(̀T(pLO'L9P60K DK]Y8,63q֖̐CҮu5QgNoԨjިN%TtUL[րʪܘ,1247WQD@1WtAAD]X@]ϥP S_آs\]D2JWcU8 15Ү%riB,зUk!Y_D=5`;0<RL\RϝO7ܶRFIXpuk*nmz3NR͊>SN5} 0$4a lU` VTMO L팳t+X5yW.>ZyaFݎ6aX$2Q_ebpt ˿€1°"WeWfAMKvC5@-b$[Md3BU2Τ?.(fS7{\@Đd_#T9cLF)yA -4cBz^O-=%v/eQ Kdj1=9,g%g6jJ>ꯞB[H"Y~5Q#i6@iv#{뻮9쒮.j/6&./&ll"N2l/.*4N&V{hlw)궋9.֦҆ 0mp8PmPmmy ֮(nf m[wWn ۂm|n&foo45V9.<g&g܋-o o :o 1F=0Hy 홰i gгM  GqX"3 1Q Yr&O %p'gr>%,r~zF#q 2rG(?s(-W3r8GE ;G$/sHs9s3q'7s6t"5tAt_Q'u4't>^OX0ܖ+qN_/уK&@ g7^v%QphvIvv)mGw wo^nmxw{y|~}x}xi{xw~GW|/tN(qH///_'7y*y?y2xy_WlY/wXu6#Sdi$e0ţdy.w֨0 {.177۾CwI ϳ{/=;gǔO賧ٛ˽fӥVk Ŋiďd4c|]l E^f:YBأBbgy$P[җ}L}_)DԬJAZ1X*ԇqзp^ȯof.z婨A59RxdgVzUAI^IϑɄ!# Ahp $(ѡĈ^xč r$ɒ&OLr%˖._Œ)s&͚6o̩s'Ϟ> *thАD,GM.rCpLx!دǂeWl٪-bٵBuE|.5t0†#Nx1Ǝ# YR}/Ɯ9ҫc"]УmVheYxp Yogy%O.|8Ə#O&,+o~wDmW?1jfpnq=k]]fOA:ϯ?x$5`e-HQBK=Q{1B X$VzWUlxeH[F||.3X7(ԁ1CjFPqdA\!TW\%_A-$WT򘣘cYgrB RZ)]IUU6PYV ʼnQנ^Χ&BRRp_&ݡ ꧔W7՝J:ԓz69yNr)[:Zñ6i*Q٧[Fh.e,T[M&ۮ/ڛo[0s+E${m  hDӞ̆h۱r~l+lb𨧆h9j'bıC]8FU|q~pb7w5[)yh> fGݶocGM+E2-Ѓ9@rg#-\ve n=֠]0~pc曋 ]u-v*:9Փ.9muxoI԰;Vogs`?*w3w{{gD{;{S=?yN_tN3a*9*"J@iSRRqb(gKR\vJX6Ji%/{yd 0 Lb_Kf9ә\fMhbӘ$3IfmS'95Npvܦ6Ùd@.}i{8rc&4(A jP1 ](C#iU*5R(GQ@2` )IK)Td"җ4*iқ4JVS4@PJԣ5H]RzT4RU>[ Ĥ'eիbXjLsj]H `5Dˣ]s驋yՂت%l!d*q5{yM> yV*[+k6bw؏h3 ~ح8-{]@IA- V}-o4-Dak*0<zΜdX4 \jX]Yҥ]mo]A_lL]hDVHƂ;Y(EԈ*p=$n[ .~7[C^<%Dcҝ=o z%h5si-r]Z"߀KlbUFa\aךf4ǙOsyB4eJm{J^b'6y\|\GXfJ ,g+u[좱K$f2|rp^hW= J am.a Y#}Ihk$;TJ QvO!=KMg^5+5L[ [fJk֯ʓ*jLظ6}c:>SugC;d=-m2Pm9{-Yss-؎=7׽n&i6뽜z֤޷0Jwm#(lrkp|:a!^m@w;q+9Gn*O9W>/ar2wkNd9ϛK=:ыnz;libcommons-dbcp-java-1.4.orig/src/site/resources/images/uml/PoolingConnection.gif0000644000175000017500000011046511333570550030136 0ustar drazzibdrazzibGIF89a{{{{{{{{{{)1)19ƽ,IH*\ȰÇ#JHŋ?`8EArQ$ɓ(S\ɲ˗0cʜqfÚqVis%Ϟ@ JѣH?4hӦPJJuժM^ݺ SX:,ٳf2]۷pʝ;wݫ/߿~+`~ F|p^ƐKLy28̹ϠW.pLqŤQ;Vmtש]Ӱo^Mk}fȓnС^bꪟk2qOyvm󖍛ovsCtz¹@Aᝧ 6hV{vXn槡"`8~8ۈX%0(M}]{$aiftZsaC!53yg;Y?y^2'I~ğ (ĠMhġ h Ģͨ0P G 2ғ41\XҍTLi)JEt-8JNoӞ; O ԡH%R{"/HTUԙ*Fԣr^ +Ti~ tUg˘ֲ:H%*iAcp"ocv_[!WE1*,*ty$ &B.]f"mDY6r}kiǵA]Lb7 Q۲t[xۏfձq{47R .r;NteuT ܮw'"^~ׯMyV\{"ߍw/ߎם}q/W-\+ $YiJT4<7E:KVF\#VCa{ iNb/$M݇>&1u"(n@1@G\bTKS2 {R1c2Piye27Y~]pe7+ nQBe癗UpBM3hʭGkP-JS8 7at+LG:рɚ<Ըi&MhBKԤE;G|\5AWyRN .u|؁hЙg7֨PtbAP϶#j2g*JZ$%;ۊQu] NN:͛P]t4(woi'݂rhS[n7)l31X)Otnl+K6.fp_>Ë{W-u>8k漩M# K݌mr9әrY}8]K27jX3;w4f$1ٺf=n^ -Iֆp\ gGlޭ]i6'~q|VbL> iK\y_wUx@+^26\gvX4hf?=5_-zG}$.Y*-Fcl&tsF4h#,w)wu&nGuQgu<,9guB0j cs&(.R|H0j'87x"1·$'y܆Wj!;3#r%)+)F_H/42?{P(xqyp7fzGRF&c*d05'\h3_XOz?$"}5#3'3P‰†)Fh)54lfCƇ~.S*ؗRR" c0G1,'2Wbl/-G-8* c3H1b(,]Ho8ȷq!c|UӋr ㌼3zbwkf#4Ęc3rh**"sC+ıVmE)&c.W~ٌhV1.)^s/s26Ɏz(2 r4I]'5h|}.hP3 y0k2,i1wl0N!#Hs=WX4ﲕ锖2/%18&"j9p)U,4͈*".Gǔ|Y+؍2BɆX2;X0:gWhҏihU V)V`S'r3!s?9)y}92lƹ+|+yYX35G%vgtaFmYhn)Rr;LwC5V4YA#W6'yFrJ'~vh=hxujZ40pii}2zRC'W!*8(Ht/:r١Iv4.Q3lzH<{&t5!wB!278br0?M`|ٗ|KNE@C;A!Y)Jg\ qm쉆I)D3k1=<;?KbS:?W& M˶<̴L=F/DȜL6$L{sQbscaD,6|2Cܬ&t3:jm S~Ϯ;? еXeL O D̬D5[ Q\ 21?DHI&^+ms4-^137fqg8 VQYn^f^.d=%ɘ߸+:0z'!82 |D>5WYE!'-u٣*qG$xhqJÚ$Y^/##~ZiT:\8NHŜM5HR}#gB0(OZÒv')NYkWV>b;t#? |"xU~A&Myi*àc7Oj Z*ҷ|:GMQ>~xY{4I w_i l͒(*YXCZX))չ]o_o+'{qyBY{jt'(Ak!ѯX;pX$.ʒ<$$XA .BC!JH1ċ)NǏC9$HpRʔ;T2͏)AءK-k\ȟjܘ"ӈ XX*p+Uj`>!$JhQ;ߺdVn̙lg]rRm‡=)wQ N\e̙5o欐ҧAv:1ʠ|]9tј]mD#.3vQ'nRɕ~e H;:έ\^sp C nyޮ^ Eݍ$|,<@TpA'c"",N҄CꧻVJo.@ϦT/.5DzK)Z4ᒚ +m ruq,ВC:m1M,I<\ҥ =<쥡|*P7 lpM6t&$MN YOrȃƛ(4<*!>S;/3 S9UӪ| R;Q=ݴ:LЇ]on REH'X%rѤ4HrE=%*?EEhW|Yh֬]:-Y YH['ĕk#3X03YYÖRIe4R5^PQPo4U!#1 +uY[IK`;`D%iCy5nO)IMw#-V-=ÅNuWU^JK-4w;b!ꛍuX9X]c Ыi֫3BvhM].Cꨩ^;pszr9jγRZe *mUr9uV]f5t]vlYٍr^d6~ 5v/6eQݭl кHOu"m~Env+{T0R#`U4` t.0` ^PT,Xjp M &p* GB^1SAP2` M7$"B<$.0 XB!QQ !gƐ (BaKx 0rc773tbȠ[eS$ zbT+KRBp,H fj -zawBjt*]y;T6r\'my˂|vۤV(JYe1-}|Q3G(Rj.D/@`1{ո k'ExA:szHl.t5@|֤g==rZVhkɬ.F6L H-F& 9K!EЄ3{zRzRQxhnmLm1ecCfhZ'ITA%"VEMNntCU Gԩbh2Oux x'~t mXcf RoN4\vi6K*̔eH&zmu=l_Jʯ՘9[ 2fvjG@&m)D)A忊f/OC--4(ĪY@Xb(?T2 t&[R 5hjм@mq{]9]J+RZ VVLkSW%fKN-۝Z9v&H`4]Tlz_ #d>i {aƺ\4tmV@_/ĥ  5Ǖ <1G |`% iv?)QrUKXp!_WLFlGHF\ŭSݰЫbyn󳊷i-xJvTq=#}niι5گ-xxߧyw7'Ǜwd-#s%9*ۆZg87\93nvC\ ;W?iO7*ֽ{ڤQK*G> ;@ZlekG:7l r ˟rD|e!_zʬǻ{ynҰ8 khc>aklk40C۲98L:3> ~}ZJ:?٩)/9 IZ;?ʛ7yɈPLB,8 ,"\2DB!<%K  )dT3 \wBQ¿p4k@9󚴱>l*z0V!@dډᐮ).A<@&QsxDЋʸYB5RҺw(!u)r NCZ̛jx!1sauB1 ,FE$H?:Fwb)H3C`EL4aDF;%ErĻ21C ~$ FQ:QDbz4Db X< Ձ"0bGyG-br% ު[읓Y.G{KFTH93>ڭKCD3#v[ yɄǀ;dKLDKEr;㓕lI5s0<)Ґ2Ԩ,H-q"j;4> 2 K!D,KˌɾLjT[.t ﻸ;|1LkM,αI\L$8[,4NLLIüdr ( ;ȿtMtOFG(4@3(TδL A3!<\=<2/3ЧF (<ۥJR@tb+3ɬ7eYF!bGAܩdKzt))QC=zX D)VxCJ ԛ4IbCH)ӗCV|U YEԳb[BTqe&*DKMkܫNz7Et*C땂ĚMRF~ 5UnUTYVzJrK D։E5, ˬ? y]ҥQ* #IB5kQu2BD؉3TK6w3^=TDDת{jLօEL,Z+d--Z}U Գ϶Y[҄*.0 IKl=SXΌH<cU>-=Bܲk; 9Ln^kmL+m[:ϛ`k!ƐcH!DK؏ΰK3USc۸qS[N`-93c6`J->D*}US;`=܌G YBmZ,;e_LCP4 ;aWMXl?7I%@X;J][ӏ(Pn f6eOibχU&=H9MCLKM|oppJpz?56a-mU$޽>q0άav݅vӜ V/? nbohT=aMNrGĀ Gq)g diF/9\v;zjA fE'|ci5r*ш=د.g(M0G;[kOf;9΢a>knE? r$y8?7sK:OҋR8=x5&UreyL KuL/:ODJ҈H@BaCJo3GXar."u\Uݦɒd4JR8KqZ]+g3:8{nwiy)DrŲHxLJڿ^vxXwj|x~x;0y&hYUl6je_tsw~ym/[b$Ğ"I"Voy}RӮ,zI:VZ{ ?93Dw_r_޿~\_V~+a+91n6ɇxxUg4Hz 럻FcG:=@dmDX E(4A%&\8!C/jĘ#ȇ+h*Wl%̘2g|&Nr'РB-j(R H~B J-(UbT=PUu E]UWJIo2(w.ݺzIRD/7~l0Ċ3n siSq=xq2ŧ EXVAgl(C[n \92/ۺ591 n8ʗѲ"C^}zE C,F,fԻ歾{&9A ? 8`JeRg]iuw1у=Xuҕjiх|xG[}"18# 6Xt|]Fxi#>j'Q GCZEҍ&߉yEG#Q-ާRXz%adcwI5QgEGBd V nQRVٞ}盘AqR*(bneeZZei}YwiXdsibEԖkz+وgVM֎YkmqUNڈ:%k\Sq݊;.F=JY ETWVDYUYgSWZK qK~$Z.K,ӮiҽeQnz6t^Dju0 } 赂|WF,;1=ChȞ Vl*b;/X!k*e*-lB5CI6Z>}6^ȝuYE1p O Z}̱[hH}ۅh\"]<א"-fq0ڕ[kWkPY\qZzUR4uAC[۾תnk_;"^)y"bךˑ;Zjzxs=s!.ka?>_>JiIui_" W!X=v;Q\Reesv"FNZw;ioE(=&u Lҫ6u,k]EnfФթ,ɤ2ȱKk*=,#AN.OLfxy޶ #ʌ;Y&D3xE:mguGSaSβ%]ɍL\pk>2bnݜF0"9Av]&4wbIliqr m88U0_S4PƚM2y-Ӽ(I'3člkb8C:ܗ5֩KlhL:[uι{+sLP_<jwL A:@{[ Dc "inb'iPj8!N齡BV\񌊺sӞaKJ$'yա2=p6U[7-سťڇPeV$yoG^+aOl--ȖF䩟Tõ>*[l>2> qE̍kq]IIY xFUJ}^|zI)^^e{iͯP]iPf< !ͼϡM 889EIP^!f!janV%b~av!r!aFqN8„u 1` .a##NbRuRM߀Gl'r)BޭJ:+ @*-m@\K" hDXL@h2*->L@ĄX0^"d0Zlc5j@2(c2^# ;*#4#K1f@Kd@d\X.b7<@d@5f@:@f7^d:=o">$ dAD:&#$";*c9@;&Kbt:cf^X8!b_J$_채D .c}$G6fF%3L nhg&p`hNbiUhj&%@"$Ŧl!mj:`nnQo g@Ibqf܅Se6'kK#Et"rQ0gnf'mmZxy'g)r='w٧|B#}&{:\~'| Ra'b%~^'6M@'rN&VIA܆bV_"yH(.j٦it(}.-.bZwFbrhmvWz)I%τfϓ*a1it "J) K nDi.ahr ziXEZVi) ^⚮)sipѩ䩞6 g.娚!&jbHڡD%Qjb~Ki?Մ_,כĥIc.#Ѓکª ݪisg+X&ZNV+^f+6a&n++k"k*R` p+מeކF@ ڏ,˨>F[uLf,bj,zRmɾu&= ɖ,ʢQu :jAݫT]I\G{ʇŬ1m\i*j"$>-lX`,W]z T]Y!7٫2Qi+Je`Sdtlu_ux4`vmGWQ-r-m4M4XtI f٭ؕR*&F(狕js mnFPt1SPԥ,V䭮tkbf/n.Zﷆj}o/>':@O vگ]1E02[!,lݲJv[0{p'D8&].,ų'O߸ A^iE =ٸ唻d^,^@~&GՒ lp1Ĺ 1IҚ\~\UA-D4uE\@-5pq6MI Ґ1//ZCTܘ ˩'Ei(QEp*լfEdm F"{m (`#JB@2 r<,& d$[n`ɪ!Mh +U`k(w$GEq=TؑUf|hN$OG\!1d QO`r6_&1 6vNUIxlB4Apkb+ p('̬n^tu !d%WDss1Ne2 R״W3*ML *gVR5uR*0 QkHR495 qTW ,nd,QCvI'ΟlܯWz{J5,y;K[r q6}co9߾__#VJSպ3: /z?y3yve?#:u=pb3,O/`"a 2\Hp`D"NaC3>E;. qeJ+YtfL$@l9SΝ>9O< =J4SF9)Ђ9ZJVP@bV`blhrf\sֵ{o^ 4~ \a/8lxp!#ƚ+,cЛ辎IclseziמէB A-W@f=kTlG~t$}hŋ ucpm7}z5CT~|IGS@ث(9S :#j9꧵pB +ϻޠ)!Kp8DeƖ41$u IE ‘?rlJkr%C>FN'R=< IBEx< J"S1 M$9H8“@ :b7d?ֵ͕/u޹4s7}X[Vz"Zn]ޘeqs.g&R$Y\'Nc&^~ByhCK;yT;o5ǒyÚ7q[&H['zqE/]2{8Gm)ZFSq\fRC}/{W1E:NDȐ}/Lg>Qvr[?IZ0(1N ;8ͅ/RLEGg3<*PvW(Yx{pdz+phJHӉ֓3=GQyE%FTuI#Ҵ^ޕ (a j2(ZBӍ6K:[)[".ugv"l:~ mʹ Br;VHzU=>,5 P`՜/!j8FILr=.q@r?[dFul&mc*[^.E @]deIaO!Z8 Qֱ- VSh3pC)CPd:"2UŽLJoR>~/H!+TѼت,l~a~J`/2-Rya4׀zU\Jme~Ao\'.17.,FaL#K^sgA%?̫R@ m[mw3A). Tp h)mWL6s&4TgزHW֯ui=kѴ$xr|L PKye]dj^';'=;=Oo&RQ5Q9M;y?Rh?$J2ލw.̺+7L-=ShF˩ʫy݇8d*CG#R:-zqg? ȗ̔ico_ԷW d956Pz:jӲ^IVW^SG[|SYβS:'Io,REL/X-frx0›>O -"d È*CBڂF̿h, + Z̎ NfZ|.-d:^-QEr*lشl|npƂi՚PNrHOc2(d $p+Zƌ ob'.'pBvjO*E*ːJ' exD|vC7Hb-#}ZZP r21PpnG *Z:/(ZP i1GbP*n#8($- L БvΣlqTjR%,MccQ A qeZM$('v愖 K ˪hpҤ эh\p kZ*S#mi"icR|oF qϯl8'li42$#iPId &Q4O %K/ 7l&&K/"'dҢN-qLd.A$E$$)g$K 0Ⱥ O<ZvaH,q $#LJoXު*yMQk̫1 )9DŦ*w+mf3IOE%2ݑYXDP㼇j̫q..sI["۱HHm-)&Oz[ nzKFS/,x,r  oO"(DK^k\,[DB6@̕VM^5E)dA0-A[3?+(pMjEhĒmzl#1xi2?>E De[1 C% B6[~"н<4Rs2H"Lb~r,-qy3L:}+m.$pTjKl/O&` R-E #S&O+h C(R!Mp"&1ԱrRhLw<@;2ҺYZZNGLU50[@ + :6d7.C20S\\ղ<| 1D[,uvo?ԓ?$S[k&_c3,մn9cX 8Վ 1x-lEu]Ms tO8YQ`{*8p[{8f9orSBsʌbUkO.ԁl0\%h3b̬ [P?~cKUjsImU250"}[3 lj%)iFϕcZɵnN8cΦ*xeo?Z\ĝR<,';,HOeL7yr3c-®@=7Pɗ9bTJLQ]ֈ QkgINlx1gGX*e?"5̭,4Y@{YhUwTQEd6L4w}/oMgdhDz%s ļժoF w=5P}#炭qnS 4T7F[LĨPVΜ:h'v}Upi=>.$:e|4A_8+xc f٣~]f9Q;4~euDv_쉁s~&ޖ ],u&#p> ?<5O} hމ.aѹ4_&^>>S3/1nׄL[w ĖvC8AdcIkSq[c%i)tEC $(PB.XÉVHŃ+\@"ȑ$K<2ʕ,[| 3L 0`Ĝ<b64(Ģ":,P4Ġt1VAfƯ_A<6-ɚ!)YG"UnԂD5:0.şq\;56͜;{.aۅPƅARt=EKviC6=4N857--܍!r?&t܎rz/^+ x2Õ~ۿ?f͌kv8u%BBڅR%H@ !'Y{ZHadї_)[! E"A&J"C`,fib1(zѦXr2HdeqaJ.YhE 4R)8u"]]7QdWy^j`{e {EL&Y8M5RbUCTV'C':נ AiChpYMgƗ搗i_[R()SmP 9GSHhyT&i礫Fui1&Ji-NT{؝Fcvh|뤺ѯdM'wɖ(QccTbΩXꭷoY{Fhm(ʪӌ.e, c8u䈄-{V-E^Jp&iTu.c;oݽ*2g^"cr@\'7I0uL؝oז ,Cj1 tGͶLj_7mcC.*#/lsl0{t+ClLS鯖%ꃂgQTYVT؄+.$ږx㪳F"gnj7ޑ (ō :mTFYC"^鉧KNFXRb%)UvvHu}Uc&Os| DN_)jS #玫~ ۸J1[hy+F5myV$ #eW$ݿȗ88 ,Zw=KB1[0"+w0|$yT}&ܠ$'gJl(~i>C"6īYKRm/XUOC G4!ZQ$ x<cF,G@$9*eB8S^\Y:k!-ݘ̍YIB[)АU^ r:)rm#!R9pgJ+6` 5jjsټ7mbS$9yMtӜTg9Nqsf=yun$̥?}m㻉w|%!al q?T4ьhgPyrkBc'ty'sCH &S}ϙe(s!r9O]*Y]Ok*Sf4R[DoZShiG9հ}tLm"MJb69?dLO^\$|݈Wꡝ `ĞE AlkMn&[W_{*$8-j_QT&]ϊ 'V-kڎjgm/|hҺhH2wdlYE(ݖvjh-}WgnqQ^5UtE-!&/Akrvv+&YKg}!94,-iuڠ&OVlS0)̋_{ fGn g JWʍjt#1m]9M*Z2?zmqo6(K((T9AJ\JQVވ|Qjpf~=y( $]Zȕ>o72h \2{8͊nt} a@{8ARҸL3;юMO:," @䉦TI,d0E\:9FuHz`r~SSo+kԪk"qZL6q*lf{2l?D_b*Pi8-u߽!n77h2c@)Wj!zZn}BTɏj [S>׸>=^ʆT$O@H+cR+gKDA~I;9#g^й%~9|ș <nᎦ}aP^vtzRP?so5Y]kz YފDFYR%OqRG;Ev8lo$Y=3:;*sa9=r fokOJ/}Evy(cqsA^:gKV{N]e%.q9'wp ?g cCeoABC?n_}fMʹs/x] 6?_O?sodQFBUn3wf7G_%r[ynxfk {~'UX~zBBv~V%|&gp'(胭/51e#f+6kz:(0?x<(8%a/Yb1u5`]RÄ8#xTZhXcAw'?`f w xzaՇkHeI<&exe%G8zce )7g BmWI"hhhx(hiT<9A(ZfHQ(VVjlY& 4%?o6wWU؋&$TXOqQU!}B'Rhb$86yq*1'^)_1UXW><qD%oĈ]]zȇjAhE^{5%sh4&v{㸐xT)msra0[+uǎFՌ 9xz&Q:y'C'c5d.:p5i U$vtvYȓ4=Y2YG{Cu?[NPS wai;wO5$>&%&A1n78AUKVC9F8;@y3Pf .&8$yFBml9({4 Hm5!Qu"PM%PPD%Vp|yԚwtOB$I92PA(xחm%v}ULGynd uw7ȌIJYoWɉQ[2c6v!Û+YEz?Z^jU._= Jm##s'q7U-VsY07+Gi%hس">swe,E(0ɝck/&8ꓤ4syR5L_Ţy]ցZ6KڏL*lY|=C.2#,E6+RU]j#ֆKF8qS5`$#5C!-P^vX'LL| U{r`@nO韋ajpgHM)aJG)p"8}nI$bAcoy^zGvdeZVk3{؄Ids R'3j}ɪ<zᙢy{zg)g iVWIH fW.TI(Jذ;EK#+%K'+0e-/1 3 ;.6tĔRij=yA+CDAc(9 ]BM+O;1=NKPkUKI)ZՄN`Mb[d 0j{lNhM޴w۶xy˷{d[XEJ{cGk\k$ XU\+a~۸Sud9IeK}VZ[{C]$Ak2+飹5k˻bz!;ݖbQkЫQ{B֫F{K;$D+;e»'$Լ)+fOTB[2˿$$,& ,Lt(,›A”X( /X2LyzÍÈ;|7\.S6%S,iqYdORLSlUOX|[]_TMO2M6 ^DkmN\f̦gs&!S#sgJR+\gОa>=̆OL5fd5u' EDwmyaR-~'\THKWo'DAѹ"09}@};EZ"]cOFm̉i/=|W7'EiG5ZZrc[[o7#Z2 =R1}E3|ƒ1v3UzR%cCm9\'}}j:Aוk")Z}b 4&'4N]L}~x lʗ}7A I PV5}D|6PAAeۿ|ύ4\߁F4 ˽)?[-۶* JdFtN͉dsr&Sms{7&h >9ЁRBCW4mʅENk >"NtkNT/N+"6^(޶^M E% EilA[]A.t%ȟ<墜U>mVXsP!ƙL>lg6{ *[ʢ1SĴL1>`$̞%Px!f<”&eA$u9SDB@Np/sy+lkiW ei*WR]"ΈɝNQ !u4YDTՊ|V`}^:ƹrx9Jiv,V>ܞ P6g2ad-W *btQ>*1\$&*J@?r+ .jؒr'8aYؘacEV,r';YqM4MPEa.Ђ#L,1EH,ddtl?g#WS:;vbE8Mq >f/L?#V[ibHn^Cv]--55x9Cu]"k@ `>pTQFc\u5#bk_':BS݌wrfAșs&^ B?]H/V;J\HB @[RTSCh;LW/ɱ;;Dy5\^3(rxb^p'3 $% ȇta:V<Vо!B`ELG%8r,oʹ'kDUD]FҫG7p"{Jy-uwBj&-ő'f"g{2 &pi"M!n 8"ky Q,giMi',hI󠓭 >Kf8֐‰E1O[J+C l@ Øόq֊62^5$gIe7i'E-Q'|eĕ-ı ,ʶْjx޹v7mnNb]p1BqyCcq+u EdqW2!9u=u;'z -l lu5rM]N;ܰ8UvO? 9Aҩ}nu>~%:"4S: ɬӾyw8 ,hPj1s6I ?{A7fˇbUC}>,ZM_͜Xpvl>(k0pxup u nՔ{%؍Mfn)Ҳ }H-@_R%'s=x3  Ӵe)` ÓmsI5bf3I؝Y "[r"Y=i(a;q yIaLK9 txづz$l¬V!%21UAe"0Ž(&3M A ҠL*RR!-B ;,c$X#'8cɨl&o) ɑ<ʭ",ߢA={9?kɫ|ќTCfr3̠';sw)0v;t4dR:'/J`J|T|KSERaL咧ӽ8Ø$zKt*e1!; mRFF>iX!E'ϫ"/eiKCD! @)7t ,JT .+4,GRXRX+CC~ôIKLG,!x5(HL5 TҞN CEUҔPakE_? 't[E'QO9by-3z eikmY64l.)LX)L}<& `;)Ngz]xXY d̡$L 7*MxH\8Hcz1V{X=[KJE-A%Y+bE)(&?gp=$c5?<* X Jhg!S:s^+N%N |FIn 1Mt[Γyߚ] -[ [ [POLCFݴ[M' ޾=#\W$Uv1_kз۫xh͌3$A[C9;>vK934/["fk ߆QP2Jڡ]S?}lO 1nkDE6U2u<%9w' A*9=?_.: ъTJ^lU`TNGi%6Q$)q&[O9df\ fM)#}*ZSb|U&[QP;V[X|c۴H{X]TLT:l:yңmni˭=kcQΘL8c֞oF|׾>^dikg-Ҭw;KoSm~pXh6f=;vIYŔ^2.>N*"?0t!8מ񍍛ZؤMhmĬ\*uqwXtf׭h,rh.[=N[BI\]G=Kiwl PUVsyF<(\8d^t k60\~*3u5\GlXH*tj-]#;ݒ! >/yy3 ]M@o,q$AXuV;Qf& cPG˰$EgweK]u j-^87D`_He'#'#gvc]D ^l phο2fN[qœ#Kl^k/da6a|1YY%=KC lcVI9 pOx☄¢=$nqH,bW,fnqcf 2eRgGz!-cdyRHt恍M,ʒ{^TQt d-?g\F VCD^ˊcS=MBa[ Dpbz/MFRafF0@ĔT4&,HÉ):4q/.Qd$NLr%˖._Œ)s&͚6o̩s'Ϟ> *t( @I6XƐE^=x1ԋ =hMhQ+ث%RaŒ=b=lƨur؀(߾~,x0†6htӭrt1ƁMr\tnfW2a5ءk]я7 {x6ڶoέ{QOF\w5C[Vd[$r6؜];Ft!F sFޭ~=[rhaЍOUj&krH%dBsi# |v}M^w@!eUC1՟}PMXB PhHW\-d#dA)e[r٥_U}QgCMg@1ETՙל9Yj|akp9%dS*8)Rrr%RZdD +p`pPAEE<&jHV~Z;V詍-j@@NA'^ IR[m|!$@B Exh䮹Z(qS}j@66oB۪.kY|:pUP2ܰ%C:u@eTSr' ,Ć|gRkw x\̹QEE C]Kbl2 nolPCFkL[a4_?}cX7f-ls=||4ߢʬy3k[,;kx{#X6{AA裋(1I1fdn:UR~瑔fQ蜩eGYgq QGEI޼&Xgf6͹>9cg8ݸUP:+Zç7?_ C,&!0; g`iLX]d\$ D|5(" KhB(;x%h')O;DCgi’#hCJ10pJ\"Wқ ?Vu\(o=J] :93G$Xt<.agF7±y bĸIdz izVv\Y&F\#_nKla#it1cH2?Z(F̠jJ{#*qrzSPƘ7n2´VbRx[wV/gL֝iNrKFufLq*Sv/ԌU]A#;a3zP(IlM.\鲿*$;۲1٬mgAG5Z2"'G;")"er 2w3 MSh.sB]xJG0]caX)7)bV΂F=ԧ[uP+O(ڌBc,t koiΈUwqL+Z3[L5 )3 g `<gN8*ss X[+ij z-io",QTD"d9 6Q Ro|Hb*c6 Q.NUxv_eRS&{~M .J+M].{ۋbkZngg۝Ezr~ ð Q]D4ң KozlRtF. bk<>t}r1 ?Ç ~h2l62ւ;~g>qLaaKE{+f`#gxw8tyg-E{ѳ+QDS}#Z/E>Df4ϴ`C>8:.s>mBy5ʟqo~ח/  u}4_8DZQQ-\P y\I elUB`^U =SNT>WTş ] Hԏ[kyb[ɹ ۽}Gmj`δ-! >A񔒡SXA Իd\V]A .Iʽa#> _c %VDS a5h%}Ʉ:*%YrYb%Y:Y%ZJ%\¥Z%Z~e[e^eV%Ye\ΥYV(@\ ^eUvT.ecGs HN]dZQ;I$.<6G%Xc_hVN n46kpAކ6bfpܢmZKqr}rR*M^EER uş5Pwwwguygo y2Hzd8bg|O yj6}k'w#z'~Jv6Jiڄ2~ .'al$څfmJ]Ŧc8@hҩ %^xݮ0Yב !(Zڰ\}hL T(AB#D.A _P[QUXCiiW$A1JRɕH,N5Iϼ; Z߄!V˙Py)߬oQMmR\) N]W NA\N  .ԲRRVV-|yb>ҝu*fhzJEӁm4m">q-U5fmJO>'m♈m-li-fu|#u!tFY.VamᢦTB[r\.Yz[fz]@e%nTna.*ꎮ.bn ono{p@Ok@;libcommons-dbcp-java-1.4.orig/src/site/resources/images/uml/ConnectionFactory.gif0000644000175000017500000001273611333570550030140 0ustar drazzibdrazzibGIF89ab)1)19,bH*\ȰÇ#JHŋ3jȱǏ CIɓ$ @˖0_ʌIs͚8og˝@s ѣH 8 AӧNB**իVbTӦ],׳R $]˶Hazܻu޵W.޾~woÀ+න5Kʕ|3fƐC-}Q'Zujֆ2ulط%ͻZ~ 7wp/~cʏ~0D=z|x;‚=Yp _Pg#AG:#1poJtJ<VҺ ?'Ywj$h+6 q5L&X dlkahl`4H ,~fYcմr3 U` HT0Nv,\p#\մ,qT?V/ &*`C*67$bC5v\ZRD,Y2K̲ .B\%%.c L,%/yL[TfʛD d$:1dMq<$̾lm-7a7[3v|Y̅Fӆ<\dAHS3:$@*1*a] vI'f,d(fu'6e\*S:qc&6L$`Pj `gA"DT@R]Ҩ4GzXO/M9H zuGOVF5iSU`u:?O%##Iq'qT}ڈִREPI>mv |yj%IoD(OeLKRX)AjYBmKUf)? Q/<hVmQ4+<%F{m=<-վHOc VPb25-MQkZ[.{;/Ԑ7w"H:f酄-KG֢j|xkEJ(q~-\njoLuMFmp;%7QRN'$.WH#2󗓭6yug+y~?̑zIM_wˣN@WJs}xg@{$:vӖ}w;bS]nXg[4ˬ%2%L%<7}C_Maz9;tϯGۆ { ${w"G[_)<=D~ݹ?ЗA>Q\v \hWG=Ab/ֻZ|oڐ?ԯ~9(gfEV_sN 8g7s2 `;5W3uPgIszd7'ӇgNcIc\mG'E-GA DŽjy;؃#;@u+}^UUIPI89iS=AD@r#e~(U/|4~5XhY0!|)}$GODiXGY@'4@-@ȉkwl#|HےC7/ RF$QocQw.GȈ*,ǵ,#D:$C>` czĢ:8;Ba$L@hNu08j gUhgI 3Ev6TT})<&$3 9<,Ų@<@IiT0(e4OJx{$hHV>I@IT('YC!CH^1WEP3!`U%a5/-/V} {(iu8B<=)>)!qӗ 6A雝ECI\3cH1Qg(&jU9G`9:c&sR{>A+R`EгA|"aȞ&h$,9J),/#%>Z7#!vN~_03 b} _>6Ù'+S@&;Ƹz 446,[`Q脦7 =HZCٞSJjuࣝxhi:@YT1g.EFeח%Ar[۵i\bdeckjgKri;6!ejv{c W5?F8N1 xQyV%!9䜶{y뜐FS f%FOꚵL֮;cb**"i9jj5j:fKM6Kq+;[{k ^Ƽ]w;[ [t˛;ֻKkrޛzK`+JJTK 'z뿵7뗔INIE<CxyikrUF” i[x灑+0+ӺIO)VaR{Z#æ,x{+tkC9ffa8fPLŰqā^h( DKdZwe̒9:Yj[R4Ɓ=%<\"Z(%\f#2< 9!}Ck|<;J毵\U6x/NP~1gIKh+zӁI |ɁbYDǓHMB$ATNI;QDUEp%6 2#G!)DoC0:{Xw; EuL1N-DO" -S˦JlDȃjl;L$iM.Fy;Xj{7\;libcommons-dbcp-java-1.4.orig/src/site/resources/images/uml/PoolingDataSource.gif0000644000175000017500000013250411333570550030067 0ustar drazzibdrazzibGIF89aJ{{{{{{{{{{)1)19ƽƽ,J5H*\ȰÇ#JHŋ3jȱǏ)<(bɊ'Gn N4-aVݞ_j7dbrvw$`;; [ГhlTWbKЅُ{ փIiؖ=&lr-Y+ gVwۄnxgdvaE/xa5ׂI!xw7wߨ-4{Ô_^;ؒ~^@K.SU`_U[e1Z+|wV'=χVo~O)>L#%qk@Z瑒>!q6: Ā 7A0'piGRj(LR\IyaTH a"@tZQ"a¥h~'s!6X+$}̢(/MQ I"($ HW~ , 3p y@XB=cLEȅ$^<$'"0#$LH#  g|Fğ@DsbMh@ N:}HD·ZtgC/}f!cGG:ϐrr$M:MPTT0%K2әAfR:5FhUIܨZ̨ *AL*@zAթ-bXJRz`X:ְfMkY׊Vp}\J׸ի> Oj׾u_VVL2=j)aDχ6+d5.(fER&h} y Y4j5P֖U2qCV-P) i אTr{ѹ[.s"1VKםnTEȻm x8JU bzǧ{q _׷5_| o U88(}ܥt sūGav9p9_k) DrTlo-.sëC#L8*} cИDr$;Pf dJ򓧬(];Ir{ [/>r N(B1EISj^)!62hmiIZ`s yolC$ItγGHB˩345mZ#QGP N!t`Mn$MzjZ= 0t83 YMQo_@a=Fcͦ,6(+=Svoc#$ hVY;!QukHjN[}Y^wʿ}c//"&(Gtr,G3~ygso3rO5x'yS"6hWy]6t>cp|¡x$ d~v@RzG'!z!(ph'gvCv50#h1:wg{w;c~}wywsʷ77+I5X$A}w"7!07|Ey}'5^G0˲&G"GGPݗ/)7,Q3q2!!o7*Q4HtJ}W1iv-&wwt1w! z&3{`E{(:r! lwg,؇xS'3!'$w|(GTGa҉1h0u#G"07lr&_86wja0芡9hW9*܂*n"h6g#wv4W! {RÈ&F3$'ׅ.0A(?+.}x,vh)r)2)'S0B,.&Y)2EE|1 c.,+ )#sEI.=G)ג3)*")r'ɓ,y+/Y/M]Iy8P"$# 38.R0$c0WIyx Ȁs/Tax"XB2҇ )/yi0pI"~0)0/ؒ.#%aw~ҖՊ:ّ.+^y)+;S.-+KH%t`?aar2fyY/RP眗y#D"+1|342&C,y⎷_ٙY){9.Ilih0i R:)0˩bȂtl[5X.*X0ZV_U#) S+-;)D.)zxňDhؗI')$òvYYx0Y2d&u"ﳑ|h2삠򙔞ɕɥ2}x!əe2)/*zA|Fy[#ɹZɣ(3*x9)2!37H7"Ӌuo*HV22Mr,w}hui:By}SxmJ4V8IR|x%؍'⪂QHu6K䚄z&zߧ:4ΚOI7.&2zmwP| (pi'v߷g4~'2J|wwv!(CJu&ȂCt3 zCk5HG|T (7y @#+*۵t*qXcZ|kZU2Os+zu;GgS;jr"Cqj"{{P+Ȱ#f';p{ m4 @R3.{-_$9sVCy1p*aTۮOEwk#F?;yU+"c#zxˈWH#ys2 i &캱14nI""&K˳҈!?h{UǷ;v(s2{;q;?Cs 80oVdj6?\6AX!'5ށRqL(l; ,=Z/JXh@D/M_nVe  }8Xѯxҗ&$9 ](',}+0P1=64=(9MwӲ7}>Z CG jUE-A;NhO=bMղRXH^m8Ff]h}jljUx6JntM== ~"ˤ .b~1٢ǜ5}]c,5I" k*&RZ`+3.] ,by!+Q0v~2 )= ᒸSʭIWyr}<*Zڤد!a2;;܉Q2z+6{~" (K.;2nq4Y*eBb| B+x.~h  2]jѐ.y)ءB$/~lןB5痗g{.ة)ʥo!?j媬,񨉢[/"vY"nоUDGn,(+~١,J "n o!Z!1JOQhx"X+Zߣ.8yAHiLz#o[9//Cqe/8!A⽎^2Cɒb2?/>'_I(6/oY3,\ׅ y魻鳑 ZwNZ9#M4=k~uN#D~C>.`} (Ïz;gHl[^`<:o .`H ,XpC /L@bŇjp"ċ =6P)UdK1eΤYM9uOAT(ɣ *Ո$ĉ)bU;qԄ K+T%Ӫ]`M o5XYHw~taե  :`Yx"=I5ogE,vr޼ٲZ{ yQD36qӦy4]CddUUSHWĔ#dK{oDԒC^?kSLzê6Ko+@` cP Sp:˰B@B40?:z.D1Fsq`GH$DH%T',R"%T'2/I/lr++S7<-t=VkDOM)62rC-tJ(ѤS'LD'rJ)մGlM3HSUuUV[ű So#ޮ(Zעյ\mV6ayk Y PhV\LmD] C-m]}ֹW`OWw^zɾc ?~K̯WfĴ]VЗ TA^E..@A*u% ^{[vekVckF}=Tѯ*8XXo 5\n@hh6 }yݘV{m*!{onQjif`;s )q/HmC}+on[WVS ;tg=> Iဥ]o jΗsuwvz '{WV&u^W?Q~PQ*~M(Q@̇>iy@^mh}`w} 0@P#l]cцB.=E^IQdaaDeIw"4 m/" PaZӐa#J'#;xE1!H@u$-aĦE b$cGD,V@`dHEDHd7Ck e""BТk}1FXhk ,2B +",CI,/"0?iZGhFst&I#hBN"ad/M,6Cp1-,9G1Ή (0P H[uAN$Hm4"8Jt̊< 97 mXv +Ukw +S"o{knqov51L@8FX ,WԲŋ1CM,U^NE!Kf]V"N6g<WMK{.SbPBj9!mTt63Rorq͟F_kЇ&yuv]'p趲 I+Sq//wf@biq DRyb/fn)[j2>9٭H w_tsrId>bB A 3XU{b33t DVdDFF̧mn6A0ilgqre H,LL"ѳ/tͰz.KFc3v2gZMB;|^[ gf@,.侢$hs]gU!Q8(PokhlTg?$ٻ?rc#Hs )!Z"{ɢ,"KΘU¤~u;UFIWl཈®vǣvԹ:)5s|t]&Fy[(F?-[O=^˕ 5ͬF@xuh xk]Jc>- ɍ;QxߗD;jbKBT"ofi z 1N}z&0=sd}OmYq{wӹv|lٿ>##x}JZh?;پ>kOڪc/br1?:Kʖ#>jQ mJt1ü)qC C =q63@".Ȧˬ";4) 6z:H5?y\0SB(3Bs*R Bwy0=t0ش=>Dz#D:2DgAD=QDdĔ@A|?Ҏ#R)3v9,sR>IA# п /qp[%ѹ!7A‘DIq)%cݓ,H lJ ѬLHJKKLJL9B0:,8 8(0,T$ǍթR𵚸7(*:sϛ)59$a-~uG \-Bi}J4c4+a.(!3;%| rMUSv 9 C$ cɯSu\8[czĤ™V# '5L*r0J- jJ1!c-ċvw C#kj 0;JdSq#Ph=X壔*3) IZ,Z *z8츳f $ \Y؆tLJ,RԪ#0@@ҲۡԪږł4*z+"kUvB%A X-ŸK ۖ/}Cj[m[i]e }(mq2ڦ\mBM[YW 50:/ $ ۮuICF`jfbz(iCaLi: ~~}h6B h^h~hn"hk@UZ-eSh12gt6~ ɲᏚ?VvV(izNiImiϨFYE-͗Hay gnםi9;>HxIjHq^CK.knެ۫>0Jf:k6kl–=k0SՖ>Fm581׾m0ymܶmY&jVkn.Bx&IR}RF%!lnvrn=nRn븎nb oSsn6C# -|o]oQ(%Wlp n~pgV n<.BY)q n/ ?rq4^qWT$0;ipr*r/_n L?"//\r#-h:q3oQs7s^8_=%!+_s<Cc@tD>qNtIF[IrL8nMup0M'u [CNguZoWoRuZo[uG_?vJa_ldv> i;eis n?bul'wu&5:fnjkuzs҉ +djahHQS[^>Yq,ctz2Gh 1˜0j+1挛"۱)U\ϵmq^3Ԟ<3cղU[ ( S\KI#s/ڝ9LURk}=Uivt֧q]{*fNCD+B=P{o蟛.sjv;'yqc5t짖_ky f}:;x넻S2Ƌ~E)ܿWtd ,f!k1Pox?zޤE2 dP+:\.:u@|Ȏ2$y< AP B nP 3YS%h^}տm-} 9^ RXF̠Ax%2&d(ŅRsaC0Z `Z)"Uj:l5FS<XB"fNA#~"E,^ESX/k^yFpeբ>K'̘0 X*Y)R P%.iK\R+c`ڲ %+o9K\S2cTf+j2e4Mm&SReky;?I(P)0O'ҡG4ʒFD՘| T| ^ C# 8 u&dyS'HmeU2c$ yi/|"KcnLSݪ2Ґbm$ڮE7{ ,_1ۈ.M`ћP֭s9(x "Q7.k]WEvC_] 3W C5L›ޖO7%dqnS-nn._TRviL#O"vH15q[dR1̫Žmplb1 986,./]4LiY͓ V,_]IuÖ<ٹܘ.2ɱ^1ż#|gTtƍ'XSUlMI BeB,kY%!ڟTCIh*ҒuEdIr׾͒TոY}u_6vs&J:ϔ,5g%d}2tS>1#d5U%Gu8NҀfP"v(\"'J.2pks=V6tS1k$W )zR32}&ze "Z&Ed Dqs=@93'lI=)JI QH&|ϔ" ww"<٥ LACMݻAɶW22E1ͣڕvpы:|_:%Z%9A(oyH}9ingy/_w>_|7ѿ>Oz?zcaTr` O =RoY[9;NHm"("*CYAcnS`#[H=6Eb |I5pܛ6"9"(PXR cE%vN28M"JDeٸq]M\ZJ%$ @Խu{Q"T-KfSjgUL  ` Nfٌjf$Xq|%f@zb2&= r^bJ-Ǣ^SY[3Gf#dLHB>R| &y&ma MgmDŰDn~Lb^^pjJ !FD 'q~qnisP`Y ,hhJ4v.eP%L\f{&4Ň&l[*ˉ]\%迍aXs\e-&^\"3ZDF<ze` }ݮ0@Sqe` ?&%<[܅(b)['}xz U&(mnnfnI#PJfjhJIa]TCP"i6RVB\vdxՍi)[ZBʛ'$dfwyPTg>%SA Yg.M\b\)F*J[~`ƚM^tL,ĆkՈI:\ %۵$af*UIgTA"gʩaOF>XEUqFx֤UiGWFV-TtQ#elG"JfL`Pe Պ `YDך" $,[|l!66)ZTH%x \sD,Ňg9]Q>ף쨶(6c[In Uf vDY#6j-S-Y-2R9]9.E9Ů8)Rnn,ͮ/’2ͮ2*-՘Ȇ#mLe>"hJdFe)WHaZ&Jru$$DU #]]:Wv,^| "beof*:ʇ 0%"%K'vJ}bA2}%g*W"]^PfnVR-$T6%U$%PE#R^" ?HʰsY"`HV(eʟpJEpJYjƂI]МoY+oqu%>d]nȇz)"}1aQorVfRiKqѾW$"OU""KM{qXJډmj*Kpu&g&'kG2g#X83@c̋I~,R9rs Gx&&j22wı|фתbȧ#o!XnSUw6V4~w 4Fۅb1q;eʀ$fğ5(a,,&1<{N83KsPL_,J"Ųf6@QF-.ִ,tvҽKTkNxp]}LFRtLyeD+@B?i+.زnh+l^$>z UwG-cR {骟֛z-*aNJ` fI ߴT*IwJ5!;RڄzE_ޡ=jfF|&N s Vr VdiIK[Ș؞)o):%q-dw3!RkrE[r!36!!u^0sds8!zZG'.cM7Z^ŭ~,ҶDm+G,sꎃMu h 8?i$ 5?K#epejYX7# jޖEuMh6CAb{ Ʌ`$H pp FZߓu!(5aND1˶Uyun*89՝9Z`I.U砓o2,x[8A':LWDkX jpI_8㣭|ȣH ?FN5, 5M e㭵S# 0)jI5S tmGx.<H$e8^8J(Ab?* z;U+ Ѣ̪6|0N@M*2.Wz" -K 3 T;! G NRO< >4Uʠ\OO*@/nYjB(%JMA 1b"YpC[oq27[H/5d@"U $:>n!~c q(<].J=!La>g" j9j k:s(F):Q"OG pq taQ8E+D t>*TVAXC-D>K[OdJR+ ΃2k4y8kSQޓhT73} GDdp9ReE%y"pe(I9JSTe*YJWe,[PfN@%h9 *4sQ!KVA!hѤ <^7zǨ@+*JshcrLJg%D,p_cgvq;%ONK0l':GTU(AdMV"FuVy'X'2ٓNsc5ϧiVk42'TeT}hEUI8:m;#]"qQ5I/.gN%],XjVUv_kX:VYutֽ3b{?Em4W5rpb[ M`RDtb`+\9ҽtaAe8e>ldHsQd*Zɀ07!N&0Zhӝ!ŸխMK\uld3uka+^j$)GhW A*9 .;iJxi !օKT- N}L(O?42˄Y-K6Ef͝ LPr 1k -{PZ-5 &JEƤ!'(;0, U󒗰,4 ^iLF($0P#L%;yK\_fF>c?OJg-7(e Kx 6QJ+<9\%~n' e8X jHN !n?sS$2ҕ S4UԋRvƖ׻a$ = V:-QI,`XeE~~L4߶Fe! ef}a~`\Z097V!tɀi;aFWK5@4K9 FmuOEsTiEXM[nlWkJJ ߼7!1ԙN i$'^ZpfLu7ma}hmZrx󛞯;o~ rw,tot*]x4>IB=Ga[$HX`wJƗI=WG`Ŀ^vQQY}Xv7O)8]͠HsHsyq푩b*aDݹjSjy!zJ}BDQ(E \wl?+Z3JKBK R/ +쯰-ZIg,E\jk&Of@(f+`'DЎtK0|G.Ψ'fp6$'~e="$K9ʜ pv*PpBC(=`#TE>ϙKV.N/*Rd>,!R(?|Pȑm&ԠkBՎ GFip"`e꫽^epX/6,`oȌ.` 00&-'qCq#"f摒݌$#tn.$ч8(&]Pz '!I+?+1DT,2{kL-2} f)i ,yB,'7LL#eRjEs5n  -X 1%g, HE ' 9 Iܾ I̘BԂ JodQ;HoT.;p0w0-1]GS(S43# R $D "J 3ȸ%5p6r'xC\s@*8*L)} .gHĂt@["5C ofv4Ǹ09'i4 %>uB!d OOuxG"Ou4G)Gy7>+DZ/"[x+m%-T_sn4dj*bMunB4CQtXLHѬ XUXXuXCrQmQiG>UPu&ZuZuY=&,KL/mo0#,"$Q1Ε!NB6pXLLCHhaF2ɬVgL1k_6yb"v+N)*60VbG$'U[udOE[uZG,'pPCӂ蕺uf2lv8:mIhTx6^;-L/yH;FZ1@"^Ǵ`yj5LN[?k!lu'PveVeIVZmu[6.\\f\ev, .G:dN1Xט B"tjVsCNQtR}}~-,ubAQ=w|XyghUTGe"w߼@?u"h M/O:|vIdli@ɖ\bXl?ɅmXk{sx8Xiq>GI;I؈]X'{Ck -,蜣S4=I0*/G '$gp|)r7RC,biKcu9+Ax( 7'`x#7"?c.lDAD|} 8*(tΟ@|3]58ɊDSmeR0tC7:gM{a,i_fc@cO~X; ޹X2ak9G퐯RԄd_s؅-nYLVfcp0{"dj,1$ `UuODuMEH%y_>-6c'y+ %*כ-ZhdPt?)Θzbx؈Xڪ:Zs_&&eLGض 7RŖ8gBZ:zAɮؑ[m#(rspn.ʂ*RY&9d\;X5Nc^J3lzh&kSl!;EWIzة۸ ;ۇ) jp;_H|,u;QkVwuMuYpuTUTBBy5*p돓ۚ_ZrNfILL]r_ze#+ #O ;|#u HK) jkѺǰ-$F/z"|u=!'7# )<%(m",(Uyd>FM٥/i['vcIH)c/X(~Q^oi8/P9ˈًkѨ\CGfdQe8zD[:;|H? aj;.EцϷ ڄWwz|̝q=>\g n?&=Tn yr_1dןR"/\& ʆe]/ [+5-7f25_>ɝsPqoˇryK|tf-Wm5)l A쪳LBDL:.dֽB /jEjAS dr/2m磊0[rkO󳝹gOE6Z!œ\G1{e -M1/xQ3Z#Å 7 NxdXWF4+5ўLV>M=3Rxr-֝OXQ4L,2,s&{ N"6U|g3чy jg]6@&lv4Q%x e$<;ev-5k+48ʘCԂqR>n6!(Ks_Z@j˝ؾuj4ȄqLXTOsCsd[1'it*VҴS  PB 2Ā„ ' 4! #B4HB/BDᅆ &t@̙4kڼ3Ν<{eB*TXH0dR!_J`xA—z$8iӖBNP ˭-"ңP\vm+`̟tsR7^ Ć Ԯ=>Mp*D5Ni\hU½L6[vm˹{K`gj [tZCߵn˂\mڒiso[o[4XCmG+E棐%̹[im_-t_e9UA5z!yaIn!%F'D mdYI6Չp ߖ]e<-[SOqb:e)ѐ6Vȅۈ8J2eD@1V%A-Y^%wAP~Pǡ\v+2ݒUDTEAHY} 'juݺio:v'he zm51ғF]`^Ync)FU:1x!oO񿻕;%ug),L2\d\K1 9WVqu9Va.޷_G˹.b+ɕaqIuZ$c\1h!]2},6u]a=`^qtt1zTϿvU8.Ký 82tlyGߦtᶁ%t)Fx -b&Qg!I$Ua6<2g̍s&ìK)D]aXb@ThNkj<%0J4 d=^sp#$ QP#$Dv}&f͒I2Lfe I.%?'1cLOBPMӬ(9}hp8QxVt}g2:QiN?1NwTi$׌@Mf5N-]-AL:T䖫Su(v, زB(V)JE~z6F?- 'J&2τJ^ve:jILn毙p2mr\ .s * ܽ.r~ tv]r^{W5/qĬ쥁 +X$)3eCXyoqUg8q\N]k%in^%hQ%E ];NJ3IUƃ㧲JOddhSY\ڮd\\Yozf9t|:yճ =YЁst/<|>_;f6,4P'hENȷfS˸ƪnlF>K3)3t6vJ%6%tlYgzvcRlcX٨kuJMe*)Z3f%NZVb@֔ZnwOb±T{v5 X|"ӇKvI{1w$4Hl^/zǘ4x=JP6sJ411ۖەn݌$崥j-e뙊[} zU hP"m%J%HMe}Ã;CP|>% fGBδi4 e*!e=9g=ڗۤ](^y[RcM\1gmGohl/jҀ*"YmYws}>ẸykfU~2:hs~6~h G %T>-&K$kUxTGOD%f1FVPjf(-r.Xd)M2%(ϑiwI EX)KsG1(,"~5{ȂMW{ThCzc !,8(}UV;#|sPa{7 L1m^qtsxhf"B2J,_S4&HBx3Eh`s|HT/vcrh>R9|wU3r2 eX*j!b7n1Sx{_ܕ{Vm)Q'$2h[W&yS.Twj5zՆ0ĈHvX>=HTFWҌ̈'6Cz2iTI-f_i(9aHDMQ[8.ab;V5S#s3Czv}zӏ MHx>1 ATI+Ewg5T.Wނ0rا$v1{X')yK:ِ/V![&VhRz'X(\LؔgYkPF|Y#&W [V'ظ>irߓ'Gn YLA\(|yI.tea plHфI{jI9jFAb08 8Z)yėQPIHY4ʼnEhlyrDI4pDmyF"I8FcT(EfY%$iQ(ա:_Vr*7"G&%aC8YYicȟ݂eSC/)Hup1A6DsY9|ء|8m%avKVK#уT%h5ᅠs*cH?Z~RmG)T:\M͹N9BWCܩU:>x< [o1&=4d, Cn_zk@ҎFOJ2\-j)t `xqGqSp֐3rWki;f"c|k"לzꄖꍩ#4SsKd7ɁwQY'C5R'8'#Kt#iةry364ȌWd$p灏:N# wUիjhoe텮窮ʮڮ:jnb;{iDhVR0,w:D1n PB^G8aƱ;amIjƺIAI9?Z2 )$V'~^W,ȀqxoI(F'ddմbOJ%YSҶ?uWƢsnօMZD/NF/zx(rfo$%[w{${DvKwrZs+**&/ 61KA5dOh ~iQn8"CXzvq* KI"AI&`sPܡ?ZEFC՚#$sHPX(sD;,irV%?i'l~hS8|o+zH4ʪFUmįXr`72Nh_72 ~$ƓDmњaR9˕rdI6D8S !jPaA[x%KX3:Dϋ) ƪÐzr|}LSaXqD,.=̫OH뤬v;s5t*9̓iYȿkdfl\y{klRͯ¬Druc t2l**I|TيLzu9p;(CGn˧9ĵ\5A;y&g"}0>|ˀRTWiǰNKbХ:Ã)7%Eټ[X֪.{h-~uZ;^;ʂD^笉Y_9.M:I>=: ~ UnN|]>஦ׁ/)>l͏k8NǽM|!ó @v#ml{@JfaT=!.o("q+󧓱!tl㉜`ΑKN7"2*$Dš"|5ND>ziZd #VLccO`B WMRB[ͭ/쾷+ux3в^LP31̌DZz5>-u"z%5|KFR>1LGRնG-SbqS'Eyqz*U9Trte,ayӄR 𓖦4iJr:C ׸&Hi6U"hUQ2fFKN{k^K} 'OdNd"A g˞&YgG(i}ͶEf>,is lVԢCv]hHA:R'5iJ€ks (ZDR*M,Гbd6'hS{,,wVSt6)5"u-/N͌8n_*:ΰ*n/R%MU֖ fOЅB\$0JkZM x R˄A=g[RPԪureTGK !^).5=}ݤ1>1_ׂ%XVY@ HE|ruC W"L.@9;5(Mx_!~%Yc4E\1ZKNjmo;[ ˨w%^iS/,zlJeMڪhd+ [2\ 9LaJkLҮ<\<*nW綘 y9sLJRR/|c(FzC~/-` RAWV] yyNP>V7jE0Kļ L3PhɆ Z1f͌2k+ 軓]W)U[%hE)[q4E,f Ny:̍k["c -ǂ.o8Xs-`՞UzlfW6 2X]uLx!ml1~ 6ވ.J֓nSkڌx\Zg)|=G6#5'pϚ% n*#:uy .,Z ud`WFl+^JH<-ǸQHos[5sظ4j-NA3۽0_EL4ͱ7wèTv+Y5Br5oVm[* D_Guiw,R}rˉMrFkU +{\+DX:dGo3T^$oIi!uMgT2Y9l(3yfx)82B Rè礦+gP7nXk>l{Gyr`%綵s_}iVQ-;Ϊ1ʋÐQ Ucs>>Yr3mq".EJp%c$4@?뛞Q>&뀤s"`Z[k:x75Z2zZ>?""@"' l(#&7{Z&sT #- ?(,;m%-+a '-*CS /1P ?X'; G 8ۺCi1 ); ,÷>D )41@)7,Ÿ$HAj#ŲDB (X< O/s*B:$aҩ'ˆ$wѓ%+3;G;3OErn$1t,r!4|T457\Øbw BF'0q 5!B4iPQst{YA2+@pS?1PR;} r\4ٛ^xaP 1A-6u{C]T 5uFLROF$ %;~kS?u#F>&+SdL1uTA;SX]LH嫧1 [F#GFFS4?9.rt<4 Sq<yp:U-B8a"Z+?,}=m>*1u%Bb"J<8)rEd3;NpZ0Q`UTlV1(+B%BiQwW<sBDY?CiX<3wdB8U*zp%y JyBT(n}TWM6>۟6LUXTe7yٕ8x=\&6Y#6g۝- G=t~ނVK@%̖X)Agjj 1Zhu/C(_tK)x6K ylkgXSorUָl-ÜEɝtYAqZXE4PM~Ii)z~XXMnT+_D$q%ǺU6E-Y?3UUdYؗ <ٙcSoV'J,aJ+a(ͧ=^oq q[F?7PR 5W{Cػ[hs:[oDMOC~d$m<b1-'6XU:G _` [RKWlPnύ)*QN\X1+L$ߣ>\87OhI&3gә/q5t;狳k2`rtIV@QSV̷b519WZu rLG܍[LIl= ̨2Zݝvxv>n%-?ʤ4ԭnqQs;^$9sJМwNc[8{y9ZиrQimtEIDI_v̒P nsW_։`Lp̄R%>#UJL3! bM_O+G`Glvf|@qۚ&%UGX e}%bv3Q"❶qkE^wx<њ lO6+Vzic0ݓ׵ng^7I:nԈ7їUg>}ƽ\ TqXQ݋\K`&vōe GBnu@  aA ,(QÇ!JbD fxQ&OLr%˖._L`H N@h8/JS'; JΦ&G Lk:̓$c +v,ٲfϢ-ɀBIܶVnI pOKܻzM{†Y*8`1t^`PWE2Ic֚58PaQ1ŚVVfpx6퓄MT E.~H:2 18EP\x!yJYQi~-~?JAqUYGw[udh=eSw;9nUUO`VmMXT %PxVn]y֜d6sap"E3j\d! H#$zOBzG|E{Q:ɀuCNa?Tr Y)\$lυ4k4 U ~+ZWAs8PEUjCiऐ&iG<*&j䗅*w||VW*nx Y਑XAԟ,*oz2(e8܀(碿={-*l+2dD27A;M/8֋nqCdc2"c\/zSLIvq5E l9]A#ېk&YByoDvrU`Paȕ#v(o [BV=JTK35%,(h:I̴s7ZwL7zV PšEu\JV,GDIa8\eU}Ai|KXf‹n]TP“63N~ӐM\X @ F?tVʏ]g;]c)~ xo~$t  urY΃D=[Ffk]AH-yIrwY RD\! [($bZHr Т2qmWKůs+kX%!FGb|_gRDuK$/Q0!:ƅfsp'D*5x#@%Q " iH.TL gHIHrwC<&8űH0Ov+׿+%Z9CQ劊O#@yv:3itAZ"FD!-1k҆`4Sn&J\*CEOm;<'sB<95IS8=M[y:FSe7֦(H.7[lJ5'&'6;Z7ΦME_$.5] =_TD)y+:s"<(RlV$9޸ 4q`i$Q_d G#`FAaҳh5Z[E.:ҪZkD'̓wTQ UKfەi#G&!tRѤq\1W;3K26uCص.] #"/}2\1Zfd '`vbfd46;95*M; )wY;aQg{ 3-(29Ѭ*֢7ik m1NJps >ZBY#ZN+<îFj PPaHưT 0Ia _5)pN _cX=qw\s.^ՋV:1UL:M(5-A5gVAi%qqSMRXՂʣp4gOa0'2ra7lf=(?d In@3;O40ˊԥ>­w[tS8#mu—bъ(?zY;riV_-~+PPJW4{%+͚^f]j"^Yh3SEl~o's#=G&NedZMN\Pz-XDnZriP! tR>"kY<.G9gndo \' 5ij[C|QO'&@bݡWɰd1j+F/0CG٢Sy.fm}I4WC*syl~? ఠJ$*NơE$5̱&P4"|?$v.˪ @\Cv,qǘ Qc&;l8I|ITKȾj˵@L''ѹ|meOUMŰ29w^#u)4'e,̯?%2`ܼU%E\@ *橑Ŗ >qp`㩍SȔy9LTT@ahPfhDd@ 8W}dHKaa M ` IEL.ڔՍ9KOyRďe^d8ԥἈ<@8!90 :TN4Q@JA! )H`n!I0a{^Onȗ"&Tyɉo]ٚ٣}e nEVHKuXA<" awf{#yrZ#{{VeJɼ%  Sة3UէQpJڠDJ<c BhWXl' J)[xbCy}N#ihr^苺 eYjhG& , g\2YS"pDq*nqom9VK~oĨJ^[ h݅DfhYBD܆{1j5 <D3R%eQ-IIyPQ=  jAeƺJnl(}*w +sJ۞/eŊg|,d~ѝ)MV:hܮ>I"mSt 秎m%,"F^孌9))!Vbg ZaMvrtƒ"-Ʋaeք` =thhibA~kKqP*TоTкn%eb ̐oI*r6i.yՈNT N5d*]XE xv$F-/BC᪮M%Z)SPj,vz.dd iʛ(P$/9[خ\L&\ v9z/Jd+l9)ݓ&WyiodEHDNVʂYDcIalnTl5 -FL Mռͪ>pԑCҲg/ S5SyB4ZI8Z-J)WsH,톙i hj(n[3Q"zفY*~QtBuSyR$O/Q_1е#8ݡzDv5KPROv6gkR~bE?\L,* M$ } Niht3&yyEk"Z/hv*6&QKw>COE%$1T5hydS lA܏ˀ 7!ܧF gٶɬ햶H V`uY3vn%5eXAe#$Dx |_8|\VkmajӸ߭-B% M([]09ҵSVHϐk;[CR({jݒ zaXb9i+ewJi1c#D-9ʖyo)-CXuYA ^(<]i2N 09m牞mqK%`:q\iidžf橛zbw!/^ (.y S*[6kFo: Ω*z {_fU֩eEY߮^ <uaAɋ#g9b1r$!\"TuREa\*[hlE މ?uﶩ01S;{V~\ksο>zuױg~ޙHkZ]C}?z㇙-O7ko+o h@, .#{hݐNjz)(ːÚ\ [0<RJJ;n Py d :h5l-1,! ՛JK507ے+ -J( MN9q|3ChToɨ$  Дjīj* 1TM94{$;?O7d| h> n+VU*uYԢlNt:#ɤS-dI]`J5aԝhubWޣNZiL%H@`TQ'܈ *(tZhnCa o'dM sSrjT-L㌐@e㜳Yf}LM@+S.9K!3=)ymY>sƠ9:]Iw Qw m^CO7] s b cMvJrv7ﯽ"页1ixחU3<{\WM}#-K:ޜXǼ/B "}CcQWlC$pCML^+ "=cU1Uc%΃Q^>7{T#0o>#ZEE44-rByf;("``Caaٶ 'x"m^;\Uz3%dP{ PH%XjS$*T`;ے.<qg޳%JA|S3rNjx74\J5"06ۢiy"LoK (6m~%5G䈢Pq0Ϊh-l+J6yV8*]JyI z.$K UN^T FzRa/ҞWSL3*YW:a;iqg8u =8[z3el`)D%2_<یh#Q*w1T"Y!5Uy0ՙd@N@6TPɳ15nK[Sx5N6S:NEDI%'w(d[ Je$kV*׽}2FBR9(doQ(s'a~\~eTDBTM}SbBOdڙ*#.|fCIanr %14BG) mOlCxHeԃ7mrD% ~8PtPx)Xm[ )TOg6IɠZ̠XhK̥| O4K^64lj(#F m玈vp"Pj5F[~&L름„I5P<ЩM1R؆ .ࢰbjH΂g)\ sYNѽO\- AM q򩺶e+"~АC nvLmEFl(ƆۃL o3ZqyH{*ZR[XmdJh/>$$hd[V1F_ڭ*+̄[ +Rm0+-@c$=‘eP q#*+,ކ,̵IXz"F^JFfŸ:K0P!C! 8b1 eCJ&/)FЅ#5 *g܈f2*m++OoP)*|*r"Q5@r.O*-Pd+~@蛐E031s111!S1.)~|/"a r/O"]r)")5-5X4U5Qs5]S6n*6k.A337S޾ۓ>S>?S?3??@3@S@@:tt3/{<}s8ooI4==4ItJsLsMדJ3M4K JLϓHO-p6cr%1C}:QqE5S5uA{{H-9 .dHR!n-*h:7VmU\dp*rGVl$`|t%"3V?/h6lu ;C6Eo#ˏFŠ5`vfeh(VNQc+o&D<)v,.h7&GFx+FT305p=sӒDK Nh6`%kmv.f:tyw;ep)R0F|k+W .xf388ww7{{xC Cd7jPnի\ڀ0vṮlEƴL{~xQ%w `WFX1n%^uG`7%,@4@ [U{34 '9&kT/낧30('4Du]%dQ퀣K|zRWݠm*~1A5Bza$d 'ImdҌQ [k;8xQ+xjcXUK7}^NE۸FB2BA x}lYp+ fk6b9CƬ]zotx)9$dBkzx'PQ& ͑#َ8+lǐڮMN (yF\0D鼸So]9+Uf(kjvf0 c)xf2\ ŃV2yT&f`G|K4GBgD7ΜY/s0"/܌e'%Z8%("m4ya#l>Vx|Dh(DWDړ"tR`-,X8%D TCY!Nhu7y[ sOx `qT'LL5X(7:ku+5\gQie+[kuB;T-Q[<ȨU 'cNX(M~ڬ!T2:Iq ;xرE&F¯1;)ou: mCOM䉹q~]ke{9eh)X^`‚ͨ}\ َ1,6V< 91%z7Cy.:iӻrjj k &{`uS%A|E׎RUɓ&rII/ځY ̣˘|]5,o88*XmEex˓:TV~B5 hǛ5!%;UU8X|? ?5K*COȚ\;gf$mݩ%qhh VT"Ee!xގyeDiH9"F%dywGMTYғ~RdZe#Υ@p)tYؒY2$rwY~gIUǚ.hm)ibԀf馜9wIzBPxeשlRHjR 䬭t뮼اqw#l'kNvf5U"=k~JlTAYݴ.Fork钢IߑWlRZWl1|TXVĐsjG#.W,oT^,4׼U6WDZh,t7n66G-TdFxѡIefJ3̴NËAUTZHf&kez-/j܈'#ߠUG&&P"BcN6e^$騧/!9Wm\1:zvI! jw'7tgwk"%Aj"sץ/c/{q{;_; I̵3 |{@ߩt'!; Ȣ8֌'ygp W™[c Q53wXߝp"l8Č,1WD*YP JCRK!E5 SɎu9y,%әbSm:~rÚ^gH.vnU4w4*sU<-񑐌*144˚,iэHpÓr?eA_dW1e.U^fydh,MeLR I\>t/I]$I,M)uԥ{HJPCL:&MY b;`4'")·q h%QUc2:x,g3mIGZqIt@TXAQ$}1>OF 0)4u;2x2:zK'Q2D2MR-!\F Y.B+%e3Բ7;jBRvg<&Oai+kKԳ1:Urk,rIL.acf? ?tM ./heO3j'9GsiPIP,3lypK#XK<ak/RYLjˋ2DEJPB3[?+Ymny>D]{ŇW]jơyN'W=P1NQ60ʧ]ex#p8b%N}~gL HXޒNWB,AC1|Lms:AcbNY_Fҗ\䗄g{eZO)en—?뤦`TjxB^RʐW">ᬒ֊艗&*Cq mXƅސHwl'댴Xi+:(" -&Mj{ޞREgCRHkF*\^AeT[_'IՙC9uV0`//]Dc:ۻݻ흟yq߮7J0O3.GckM{\~g6p@i6Վ@ 4du qZ̯q{K6q"d&xE~Sg^Ђ_6 -uc,?C G2O7y|x):6"CZ$#+wP}:}D#Jщ~(/t%DB6E"P&fuR (hJWҖi%(#R4WO@PJԡsAќ=.0rtҡZXVd"GJ֬egeiPDY*׺hGQu)4'v-l]t(,yF;:M,b7[Xfh;f[ ԜU74 RRz6-au{ִm;RhĤ 06psXR׶nt{]rװݮoA|u5պ u;_>o>32W騮t_e!%j0woKaҖxpqt#4^ iҨs@q7\c˨ [ hpрF4|[9X-{9~q̍bԦ(Pzj`xpLg0v3u mTݠmm3ֳF3ю`hL6PtښիF!MQF` 's#=KMY:Ǔs\Ou-lG X00A Gx6Mj[ؾ6 Xl&(! f iP7p̠F0lη#A F8AÓ!伛z@C2@4A'N[G d2xB[S@uCOW&X  _М8lcvЇNM̠Pԣtko EMZ 2@׮Nva,a rTG5Axϻ!}F3t,qrz #л'O[{5qk!9Φp 3ֻ|9ARmiM9 D>O|sGpXX4-zYdQ3~_[3h~P봃`۱O ߯n H##( 8xh Ȁ Ȁ @ X@7z"aG& .؂01Ȃ2X4x /h(x3 2=ͧ ?#V Gy 3Q8HRȃVS @p t0as{, \XmxnorXqxpT(g JpPGpcx0hzxH舍 p 'xQ~ȇp-Ä@,Xhxp($0 + PȀ8^،00 6|g 30G 0Ȍ꘎Hx(Pڐ#R' FP h؎ YYI` F -&;G ` I*+9,.) 3)^x`x{3 rsH5YْFGIKi( E sȔJZٕNIٕ`%ܐM_nm9'` A(ؗt @ 0p`|'׀z3r`Xȕp>ȀGF0 Ǔ S ɖ)ٖ)c v1V"r1! G虴)y(ƠJuP[aHr.@Yܙ)P0؝i0-6@ )Ypb0g@7*ʠ *J A R0 ' :02 3j4z61;J( (H1r1Qz\=ʣ5SjUzZ\zHCj75cS%(]JlnX s*[Jw UIa0㸗uymʨxڨ5 'rEy j:J:W%N **Z*:b(H6*jj* RQCp͈ Ś:z*ڮ z`DJAR*AEqh K;[+ bjTE%'Aĺ ˰䪮; {#{ q/s$F X۳ )+ &+[G5P(y`HK?kA*;X ⠪/[{D{]T+[Y  F0 0 )*8K ' 0 S` `ȷ+蹅+k;k۹QkzB33$'%Y$(ۺ뻩˺ۻǻ{p S PK:J%'Nk۽˽⻽;; }wW'q!<lxۿ˿[Py4Ij l| _knK L"||$<#|ȫiy (xPH8 `G` Ee0? ť+ŰJSU\ Sj1H[$ ȗZ\ Vos,Ǭ{t C|z3 c! jJxl6|Ō\p|ȃ;ɒLXɘ|ɡǎƳ {^7f8BUx<ɑ 7L˚\T\˚<~ CUJĢ̬sZ< wiO|͹lɭ<x5 ހ\τ)󜌿@ (1p1CsNIz >>@ H m^ =x1,#=? \80e\%3 O-? %݌ſ 8! Ȑ?H5 MYM0=MlsDQ B]8b-ǧz}ߠ]=kI-e ֈ W^hҔ =zmt-|j3=$ف а상m_RM*m0hїݠX-RE҃1ʪ˄)h w ش dm LҶҹ`Ϲpˋ ޼ p1:&]݀ ݪk ݹPw.؄) M]7l R nÝ[ܳl|HA͆QZ _} @w  850 50c(88MKƸ Ѕ.=п)׷YfnӺ-m=V}˗/&ְ ɂ-A,_] +ѽ-!-=ˬC';S%y=Ӛ=ްHє}}݄9ߌMd_xߺc `=M5L +N XςI; Ep\{~]^S~˛\=_ZoY͠M _z}r~ h %yK<ܾ"ðȺN_ӭ=l >kΠX݌H~3"+~Y>~Ȥ)k =Q=1e^=)= UH?}Y 87n[}Fx *MWYހ;ˇ _ " C O/֥ z=M}` ~{v`  }`xM'_M'1n t/ J {xPGԾPϠ@#M0@Ҫ@` xЌnx?0 g' 7_AvD<~E8QtыHo.yABTB{JqDPtJM䰱i&wɳ%/<@Imjo kHRvOI jňʕmX~ *A&\0}MWCto]R݊g"GP(Iy%i*&9'ayu_'Ho9vDw/!ujUsGDivGRw O#9&3-yʫҶ-igmt*"d:JnYrCrE$fC12y9nK2cnUJAVYK!PRBjB(;\0.q)n(4yPYPoX I6hCB)L+ʡʢ`Di q_9K(g ɛ( gzŗ.Fv9Sۧ "blM -DWaz衤PǓ[1)ozBYe<0EVZ$T*S%Ur]U6iĒH~3Eu^z5x_֊kD)%JDPqh7Z6Y$KzPY\WV)oPCJIP֍.UL\PVPK.'z x]Qd#-'KE]TYVy,aDU@$P dMJ] >U6Qa74z8qoJ!$d <@Ha*$_"VutŹ+^[iMMa*s܄a,o,)rFVpWrj&/M~)UP9&%@#Mte]AdCz6HQAAi${"m1*D|S;6]Hѣ'mE)I>& pۈ*bX) V sMKE6GUx H#<1P@ V& AMqU<‘m844MNZ֢diH/3 qYX ! u )U0[Bk1cD%px!u0a-j *AgabJ]&rnDtZH7P =}BՇRE1\0$5G`Ȅ> Obp& Oa|Y= ;tF>3Q1K!& ;G"> 7Dy p <0Cz8X`|JEAZC ub}VP'ЉOԡwjN *N$ZAW 0O'ˉA5Cq VЁw' C`⺣PD80A jtEx^<ꗐƷu+cJ?cJEC" >;zTbD>]QXp" Q~ `pN+qK# q\)Pk{W E(P8猉_J#1 7kZp%P]I"`.* V7<RH2qH:n0'Z~"+z CPCr9Z'P1]8Re6qE+E&L$Be!aR 7'qzXpH5x3V@MN?ȃpX\C|2D 0 `9{AÐؑB@FKA\q(?z8L>2JbT@CjXrHEz\b"Sq@qۃ44Q-LCX7pL8xB59A %Sx 8 O X  x"Vx ;M|O@!bMxB(pJ?˕P$yD0˧P1>X3D[oQHXX*)QRB)BT˸7<>xoJE~*.WEObEX44}%C!~JXQ:8DPMK#M.\ <:WP\iG|ȫ@9jF)**SJ% [\)H{ȕzzx zJ Yf(k;rh:ڙ9 H%û0TNC%kҶ\)6bFyV*T\HL2CCP{@I;"xJZTAq ڥHJECh/kp:X^CA@o -4xFoZхw"?zHLЊ&8 Pë#P&[hh/(ԕ⺊n_IM`:]ITE@9ދ](7Hw&z@7@PKȸJDqEzz.OW@Hx7(+L09zPI~Zd#*IФO(KhB ʬQSbJ 8#]PQFL@*MNDB*oP}z/Kx,ۄ?Xgɕbu2H@ʄQcjIxa:TDL + Z;QKFnl\-oppS$lD$ͱ2LʞMppBO0DLHIOVIVhc'Ѣs*! ]yuM@ȑFT+T? z+qW8{z(qڅ"H;Q3ox\ɕ E̮qL]@0Xe7X5۫Ѫ:t?HxCJx7P7:NSB7:Z8+LJ#;8%X钎WbqoPW?'`cD/Ӵ:HOD 5?"[LH]7H:U74x?OA 5X7qVS;>>(|aARCAoXC 5H7O`@<rb 2Umz%7 ED%[C25;PXE:H3ݰO8Hp1޼Op;7X8,FWC C ZleAgU@@T7:F@?*pq -덃W?dC<ɼl a2@ZT8֢VPz߅W$^ =Fp =ݼ3D<<7`q-6MEp΄[@QGÅp CL@<4يVݻØr*]@Y\8SBO@ m-qr8Jٕ29qh#h) iSc YJyhjJ+Ji;꧞jqȕj%)V͕ˀ;u(e;>a.)S;1z zkr1Jijaj<@afn&yzVlF-P`T@hUnmkmkk6۞lkmlE즔kNnגl-ڦ1j% aXi">4 IVܮ1qp arNjľkzClan;6?V6JjovzY6ԺX/>H/\ɾt-jAum7>njVnqGTGn.Oa,JmU2j~[ko.l-7i}NG~snVlB/=ɕJʝ\Wɔ8h{iRʻx&nc`CBI(GOV_uGwXGuYwuYuT_u]'9Y(CBT@kUbD#RSu]v;tSu^vXu_]umou\uVvl7ʊ"R^qf%qAo?u=tjgv`wi/jwUuGv^wlu/wYGsxCu[ -!dW&oArY`W_v~_yS`oyvW u~xSgykvS~7} DcyuYx_nWYuu;pSu7x/_/m'78nyuCOx~O{o{u/Z{G}Ggs( 8~Ƀkި T[pν8{pxrVUKtQFF+]ʥ\)2ɥow~\*j)6Q0`od'7ξMߥ1~~%yoygP=].P/qGǏ߿2rXqF!D-BeDiL:s洙sC(G(=-ɐLL[J6V1bh,ڴjײUcȱ43yR+U }׊+zy 757ޖ&w5^Db 4Ԅ~KtiiT iؠķ["BrlwڴDm?S`ԙ 8Mi:tا/O>y2 ˃jxV'VѣnG7!VTZt HUgCe Re7B zN<Ҕ//P *@0@:c|/%"NndZ`?PD .] U(B#<߄ Sbd~ LfeĦiih2%j֕Q{YTzhG]ġߔ} RSCKb % Vh~Yihb*ɦbBLm_C@?JrDFǡ|vexߤWWW„A9["_ʳˬ߈ت꥚sAmKb=5ڇW /$3liDK=}C%AFuIu9fiK;eB1cM?]ګ@ֆ;z9-_r&=4LǪZ-G)a0S]g(fu8_eDiXihMm>-&ͦQC.ulda*4ĂQ 0=*K a܂rK atgAh\eTSғKVUkDc[G+IvL?f| { &C v%Q6]Cq_o\dWA{%3 @W?xp@O$0xV4(4" 5L&x2' 7 )lMúF4Q0 c 84_~/akgK9ұ2A^B[N"I|ȶ3%+` 'u|?H!0JǨY._l jO*1<2E#% >pV0+QKJs+.wبy&[!0>9,d;,uw1 '$|'~(E:eńZɞװ]UJMi,}'2gd.XVHN1d\(F ]]ML^)7RaS- P \xb* o&T|B!D4@+CD',Nlh+4O7z֣>%"* IDP塊UX9TbJqH:#(^ΙQ4T}:z%b6%,q%ĒT=`O' Ak@4jv(IhmkMb6BW!,& [aBN>Bl8.ޕ/f:4Xc.WhHV /x!B$".}K:Dׄ$ ?y}pGe)Q_TL+S<| ^R#N{_)Kc!t/A^]DP Y fOwzB]XoVKn2dVd>þ+NZRbsYquݓe%&_Ȅdd0orQKtFE&C4 !ĺOzxq% 4!B/`.дҥy[ݳ^:u geO/H44;=$ ٽTZ8ޱwݸqvޫd⺫[UH߳pc{on=no_=+FHOz9rAgXY&c1Ԁ WxhpC&!9(԰F,* &7i,L,e7݄]⨛` J!kbhv),$BA($<$B(&0*B<8• JJ}]a ^^ꥠ Ϟ 4A5u  m^  .amWJ"?Cy \.YBT[}T.]WA>胓`q;50|aCL!!b!,,Β$U" bz,87ChIՌy97̀Ҷ4+ ,F"-%R$^x/.!-"&]1H. 4?4CP^I!&b!""8~V/B<¥$0b75⟥6Q?)FGD Ly&|7,B' $PL(C"x&B='9 $=(D#dBxB#+xT%P#T7X%l L̓Gj8'4B8'MSAЃ m$T>0`,="6jYz#0F8f#,};Yc F+_΢8ElK);t48 jqc]cZe0֗<cyct0T_-5ڣ n,^^+ןIe .fl##U6"9W\V:^X8}IهK,+ B=!++A87!A+'@'"8B=!A+L$+ `$,G=@.A#A,$LUa'!+Bj+(؃ҩ7pԇN;J? Iuh&F++B\/jgu>^'V뀎gi=ܶ/:DC7;4vC4(=bBbwYN9(r >f:^;p F|DBBԄR=EٖĘC2#)zD? \8F<nN(hүί#QJ289?- /qMRQW84@9TVC5W a 4 09-L9Ж۰ p FW@ -gE^:3Xp7p p Kqp p    q_q O ?1Cp-hC?qnin@q |00pqq p4hq /p=D c 3r 0#';2=C5 @jD~oG52gr 1{0-#r. _qSMC Wq"Sq&0K1522 FF걡\.U^k=*xȎ (䈊@s䈏=<ϳ4,tC3܈DHC0lԋbYy3l1=81g1#;3-s(!Jr5`G3S3.csu(CqP C1/59F/WsQO!4Wq$c2QO4 _q!tW5tWtVǵ52p&6\C9 C34ZC` v`va#b71C3\585XeV`5 C5\3fy ,(Ca3a'kvk6l/fS6bO0 5 cl6ll#pw3 13@1LA4 19EXC?uKk_Gvp7x7p/xǶfy`wvx{|[0@37(biN1xc{{w99nz7f9+8sxw0@4>>q4Hy_899|wmcz0k;8z'zyyk;G7@ ̀ A  ::A:: z @Ar)'y6+_;go{ Ad;(8~g [7bDA Ѐ A   3;o<zA :w-<8A@<+ɓ<ʧ:>?ЫT߳z~s{ʋA< TS> D?C;~>C駃C;>C>>8(^C>~:C9~;D*,}:4p??Ӿ췃nk~[?~;\W6h_s{?.~:g? w_B~qktIlE'rqFE1]G4MƓ%cvIdΒ=l_Ą+Hsjʚ(yuM&5_tai@IYMݪGnmhD0?G 6|qFKخH3q(|Ye̺Q&*z}#]/]*ΔI̺\l._a[fj߻:ߒYiҽs>oFW~Y3xߚTڸy K~ιT_ˉi-o@RI|Z}ᇝ,,jk*6Ͽv0B -c1.'xg=21DŽrL l"'xZ}:h gg}H\23R2{R2*M6LN3lP>a~<+bGcGJ4ēI-S #(RL uKKj@!j,ʯ)%:sST]MWj!b d}:Myǟw"D0(U& 2̐38ՐrŗxTLx̕6y\na 8ذN_^ˎw7Ìs+"S1}DfM|#[]VٓKNQ٧JDO0qu栙MyIMnVe.jI&bǁݚ(VCP7,[n V)1&H-Vѡnom,[Ʊ\́/r-'nۨc=s!qH}[}p;_=Y\e,nwDQ xIG\3˥˲s{W{s/9:l>accl~޻oG@1hHRCxF1N1:LjmKV]75Qok W(Z8h@ɩG kHB.Q 4hq`6Cv&am;CgQ`CEzla44l6v(^T㖒@6Xc1;z#xh}/<=>L|#=Ғ *UGuC=0J[qm Ǡ,)FEoKu8G!P^At EZBq1ql mә& r1\<ɣ4 b zS\P<7Pک`?OVJN΃d"QHϑ _H roVRFϑx\D8|< Qumo)@y:ԞΒG ) zJQBQ׹XwMMQjTmT- 'pLX͖38 3yRҚH*nô?N&毆 MJهֻ>N[_wRy= dt'`#[ڲV ٞ Di0Uv H[8JS%}L SrUnrӐ8n:t}iWxoml-OVҟ$vETMLz ޷, ky@wy~U [Q%!`wWps*BZ,cl)ah*1t,vn gcלaI 1 t;--%diY,ans.U.$"\Dg \ B嚝B5Ct},ErMhGӖkҒ@uJv O'XAYkZJl7ʴβӯ 0jv\7W KZ}=8{bu)~ ׻ε=miZs>1ᄯvrZ2qJ æMzӛ7\j_I&8O-}pyE.v\V2$9e,g2g<} ٞvC5w\~}u+}vwkZ' :y{ut/ 7 %pD3ԭ+\XGaWGRT xdcѢs'^ؘc=y@K|X)!LxNXx#^O}X /l-ڣe|{7эC?[/Im9xE$?J~/{IS۞o-3.lhoY"^`/.30ª, p7/Z/pAF5gMPmdqF)GlD,V~my hKgǞypoPLnmh H BvOmJBzPŐG GX0pp'v>lQ QI0(OIȄ 7;oyProAA^1aQeacQwbv1ogkB 0p q _G0qn0ڪGݑ)W0 q12 I* zE1 ZH"&2M1s$#OroɜLR%q vNlrG&gr'e'(R)))(**)2+)*+)),r,R*r)-(Pg~0N "z`$b'HMBFJ0.+s10%33!44Mv<(0C5 #(PP d6gn6sS7ys6O@78{S7ds7s8S76fN`` D@88s999m;ms8e!l?gLhP4)0 2BE!8'"BK1yxB;pi%&?J#NB-zDSEWt"PEUTFa#"+(A%,E{E[tF_THetHtHi$b"ŴPVBA=43Mkp$K_˯) tA1HƯTM,%TMSN|M=أ=OPUP5Hd!v!Ρ"PQte 5p ?NUX\PS7UtJT-2"MOUEOsB'UɴKJ5g55&gJV*UX/XYeX0! "t PY}U 5[P[% Uśt17'Sq55)B15?T^ `_nB_AoNSZ`/ɾHkvz ȠoaZbCPʦcodLPas5K83? aհS deBenuPgy eL#63₾fi srFEf"m!xa u "]BDQ0o[ ,A009Hx_Y'ޙvӞG2"Q"B)⚅(AyqE(x (9taUu5Y(>ڗS/^l:@Sn0ntqZg7pzwt4"(r=yǶ))v9s/L:oDa(L(4R4Gx@aUvZc㡟w? (2Gx:4=gb3]ڣbUxY.O5~ŕG5/ԫG;QZ dhU;w4m4f1`}/yu;"q [Muso;'|e 7e_ںu,,B!Tl{/7})W!մFW[JhYT a7h{B3ۮ _ Mw7Uҳ*jAK<=ܿoVS\ Ծ{}k8oBQ|{uҗŭ)y6ȍ܁/q<:+m%})^ܵ^M ;Pх:'=->Bm<.!`lܺ ~Z dEFQ9PԝI5~)8}%xSb=] Z_^m_b/ _zW]Pϑ_37fhw{|^}약bi?X^ )~^I?^ 4(]d1i1ƍ;z2ȑ$Ki;h̙4kڔ OߵСD=je;^4ԩ]oeE\zu*4;ū@pw Ă2.Lz bz `}լ[tUlX״k$k Am dLtCKbΫ"h-1um ՛=\Ksz{cƆ_|מ?gE aya&-JՎNۆ"?ؽ2NaGbYHI-5ulYc)`qؒ}9O>Yg5 $a-YdYPgu31Flhn&5ub'vmgdK "*'z i.)6iVWᎢ"Q4i V*꛽9Ma*UJ& aErY]Xl1wl^E,:*J >7Xcَ? ꣖bj)qԎ]_i? ٥K֎Ol#]*6uk+'?령.^qK2 <}-RChsi 'Z6/G>?P:Kq(!)#/Y$2@;Kz~e@@f'l k:,D Vb?6Kɰ#9D Iz@QG7i榦I5)\\)&Lr:eE-6Ms:(ƙxlN;8qte ^B 88[)lZ#5Fd[-a "0Î}I~$W{)\ `)C~qaAaIƜJ˘HFj/5d*d3 d2sL}ձLΊL7R51!uzd;ˠ_7H{vC>O@ zЄԠ (CЂ:teFЅ.Xa W`3hHq1,d%m?aK[ ӗƧ!1P<9ɽ)B>&y[V6=jK&F.?K:ħ{d]^ ֘f\iGube[ ׷5tLQ7'/<f Op9򄅰ڥ3n(B CP2@LtZ~L` HkZԞejKYlc %mo9[ئ}-q.xA ZШP$aa, Ƞ2MXa ^r>FYG&JK[c|ˍ Tvߧj\{+mhcIpCkbcFX?,a&1M,xNbΙ"eo,eQF7͊H"kg*6BHt=ciN Nr$`[F@E ?дx3[x^qGt(Y^LJ'{O?A^4W6OTE;WN9}oɭrYܰe 6d]r/GQ=3=+KH_T;ڱ)qQZ4jOLd105DӴzfW-#^i׀ȀHM]N@?E)8-Ec#öXX~78%.`}F~!~g5w:9'=m;0c*{g(1  ȅ ﰅ.1#5f"j8,b!7 *a8. :n+ч 8Tts2T-q!.>1ux#~Ȉa7*}8,1.2.Rxd #3&hl(.(5]^svxe((_xy(\`~8cih¸dH!Jq6WQ% " ffqqǃ\5a8ˡQ%a3AlCH3SXmB+1Lߒ=^kDWV mVM-tԏF8aPOz )T YeYQ arXR1(ko:s|!II /p!(l,c[GNhL='^d;ɓ=? A)>i0:-1U Pe8ZUZUiWY[9[QYZ])`fpZ]g[9]dqbI^)iYNȵ[dLfyiNU_^iQE/V~.)F-s"Y7//HY3'! (lIy,Ci).xMÐU@Q4ROʼnɩɜ͙4RP oiٜPډݹD)#e RѨɞ I) Y}ٗ`c".; r1cFy1 b,1B/?@NLsjSsQf vkG".֢/.0:Gf,:9*; I t:ڣCyDʣ9e?a5H*BJIjSzU[J- Qe" -h׈~EaI/z/Rݱk)LJHhJ-A@Vn/`6r&abj35~ HjR)ʪ^ V3 *ګJJj')fbj1iKQ& /PHbMe-"kHظC, ƎL;瑱;A8-D9@a!e+#FM(/n 62u0I>@ 33#Ù .GoȱJA($# ?:;wdbc);E譋~5g4B{!q; G!'T[ O43=[vm:Zi7jlۦnP K['5H'9Ļ#DHCUp~ =a+B88gWLk{ i J ,:9rnwKBDJ{V} 5#PdҦ=6Kupr@AZG.]7 iJ6Z'gt5K#ߋpkٙE>](s3/A%Q2<ØSy56J1rӽlPu[.(l~?EB$b|{#N~VW83!Jþ#7 /CP1$ BslAt~xcAߒ?hCe<+n:Ps4=a64'lOF=7LN*lEQ ~vl TA7L˕GØrwA tG|10saŤ]kL>g!Ӭ}!7S!N?gda47 dqK4vLC,̾A6[{|ČL.-차E NaLLQ,eA~+U3g"yiVEX0u+]9plu,<Ǿsx\qy4t:]K N46"HrfX\,E+m-p" l,,Ra$-QEϔ~lLw97sf|mRUcgrn@s;Ȱ4H\_Dik׼WR|y!>-"7;]?8$4.- ]calkJ,!ٽ;4c}Mz"htf<~1e냍e31$a9V2wA9A^RJa$JBF 6AVAWw]M tQrjNmXcfˑ!- ]yh9~2%qT FWͼN. aWc+#&n~&Mk,ڔaQ!pn$%|IIUq})RbgCyQ̨ߚ40Sէ+Ce.+ۗ/* @QӖDhqBA$jqK -]TL}J 6X!*]>6d4>.> ^/z. }]1>Kd,,&jގaN0AxmzQ% a>K w{ >`KT8\v?$Wj#?o@By vCKM߃D/T;vi҇sdۃ^ܰfUMNkclp͎g=y2/_DAfo8H&9C/p䬗&޶?obf@[ǡ`c8u[?kk jΚsa:sgzvx&?|qcyd'' :-+lw7:~%w3sk"jmjs;JhO?Dx *t("Ç )JXp"F9fbGK iQdʓ&MB);x5[7m5q:ZDTRM>UBMT]~_ձIcUZl1J\S *|bMxNi:ѺJYzMZݚ"&*92WkWsݏ察 BiZ^'60(ARg!#YЃCX:a IB=* ֥ h8UKNx(jBbW$rkPڡ 1b Lg*&KUqcPE4zыa"F1vQplh9⑏oܣ?P"Mm !41d$19;?d>蓈>A)^ DF}{ÐҘ9 1jGmI]MJf4 >e Lf/8!F\jXZBQ /}@j-zTk#VA+}wr7l|)zM- diatҀ[4 #0K@ 6VC@B'ڣ@ Kx q $ p8K{37C>}? $gC8h BlHLw#L8̸%|BX@ɸ(8v ޻> 6(`oC8[1L (;z3C6Z t+qJJ; T7ryDMH[ȡ۷rIH˼䌼\ |Km ǼDKwCKdd,t̸4 N4v ƅС ͇۔<xp hJs3X.,* hI K|7e\хNtSN7 XN9K0 2m̡ ҄8"牉B-4$%; xzM، +ԧ4F [; J밌mTBoFE܉l@7 RV W ,HzR~!M=' MGkdBDDa7 $D\@$WzvI O Ϛ0 uh @tJm`7Uo,Oz-0NUdÐKhBtedjfH!`"L,mu;Zӵ4BWP=N҈h7XN@mHЖ(h5NXh!T#}@*suh : |G;S<+QRU :P($K]NS jc^Uo X}a]U>Q 4JdLwl qE0Wg3%O}}r{xۚclFnWaX6 ÅaHxq'm# ^rم4t5ن:A)f "6 VrH!2!}0 xxܷQ';`pTguTwUO;+QRpXuu1_uZG]u!Nsu&R<;\vUVkumvkvlpmno, \wg.xwxy`wy~zw~|7xWx梈d2rsxrxsӹ49.Z6&raH,;CxG0ESDr8A,aa8 zwzDCPgzhzzz {߲'@/{{{{ Gɝ08}RyR&@)3@i:.ɧ wh|!e!& +ۡ +[U!2}/Rg}S.0P.2\ںRz~jp~@m~it27~~wx۩1)Xz,䫡2@p„|8ПĈ xÄBȌ5dQJ.GiR%M0'4s>O(Uog?Ou4Td[$4mArdӍjrhv#zS6tDdࠃL04292<A8B"Yd?*$O NFYR.ieGإLlq>0XRyin&orY'L:q)@:Ì:8t:v¹h"(JEzDf琔F*NZ<č:UXхZENeث&SXS,l>Epa0Mc2bd˭݂;{鲻+X뭵+o0 m2W0;2VoCS<m0Øw^2"Ln6 lE]dqEHHm9Τ۰4klB#m':~*ןWc_7a06Y}4QkvfvQ_]~p? Pla[ mI#V>ClkҷA8چ4?K_A9Unyd?af+Of“B7W 4:sC)";y=M}g>PUqfomj>oA'{!p(fGp3sJe֑86If(,*I0  IȬ%L wB#C`eBp:]C 0?a!ЈDaGmIDb h%*qu#)gZ,1ksn87&oK#gz'lp% YCɐP)u8#+E?#-yqF~ĸ4ѓӕ`"CJB[a*coYя"/_*0E bc26H%dt`$;V?Sl&7⯆&2irsTg:Nr!g1N{'?׹O@ICxx`|O>?ux>T)b<-݈`=hn(95uĐSK>4^hr KSWR=)QxF= VM'D"//T]$^^&h(GPַ5r+]j׺MSsO[:w"CуB6c!٥q5,g;ς6qL;pp9P]j =;(HNJ4rmmkL3Ʀ6J"W}rRL`X"E)uvqDwkW }uq/k%M0W\+-\s`'ъRԡͧCxD!Ћ0D!,J ~KalA8UX\ R5Yiu~;hjp==#[kM) 94N&64xiS,1)M2g"9x2w ϙo C9"W<'Бzf2RE!g~04!ƐUft`k{c-ÎviNcLȰŎ4/Sa}=vByǯ2m8J*gtzͰMkH!re;bTw7p~R^5uվqH<4(dFcF?,]חieܜrkF- 6رfPkǎw`kfoC7+}qˬKE虦sLeGǯzsHͨ.V4\%KV7ٳ&ZsCxPd.H[E 7݀,9%<+-c[fzmj/MkTjvr[Zy߻2'94œu)YSG>4014ڸ8qH[nԃ{ͯǰ5w?^ȿ_lf+G;,`ӵZ 6SPYPQ ]F;P V=HL]PNW4X\UݭDL\^Z?P9^)-D!1!C(G4V F?`eޙ9InT:xTJHǵQD{X_QT bui|yZZm!˽R!N IQA_&5i?TE  hw>cy2(VaRRqAdf.<@VzR 5_8 1'I]N֭gvHʅm$mjfg{M\{>SPg9H;2? bh8Y">)eD ADB<<rw.IԈ[RiW\b˭^٦#F~B]-]mbB]7 ѕ߽&fܱE94RDi8R\Vjer_p9ܦP)Dc3*Gj4m%%<fQeq B`i"i^fM8D?lڨF4|Qak%E[-~q1 bemxNױi ś௬_^޿^ӥ&Z!ycM㳙*£i*a*-(6ޱ#>H@X(~+8?`*JϲGcY kV5nR޵jj6&X,N^z9&$'B*#BԂQ9n(nYʬN_,/:OeF6 *䫭6F-=עDR-f9fm%==cg*`;&PܮCjHU jf+٭+z+0S'pQӂFH -*J!}O!fh;_!6扢f-'zm!BS~+P폠5oM68+ lI#0bfU{Le.QYƣ:£ҤCg_:\j?c#uL_E՟9^5%1x#XBXhF6cjьjW"5VJ(.jR$"OҧMڤ1__'LٯnMIFeGg&<(_$;eC]fX,.؁p녀K|r,e6^"O1f=ӁB!)'P71D|fU$)Vd! ;Y&ﲸ3 -eeK2'˔.dC&o"֧`2ө=13>r4b.rjXI4O\WQ8iwFZfE)$g\^mcB?-r2]$iB?m)nB(jFWOO`sZHDCca^=h:~dCz4k8lvo.=f>c, %Qti0Y ifZOx5SKRUP5&[(7@̒Zx51|%lr~'γL$L%f%@PS,o^(6Ҍb)s`cs{QZv&%qjQ/whq<ȱM%"7wZӤ;-S=6;?tOQ<3aCE͞B.rd&^qYR_&y䪲Dzs:v^Ԣj>zc0인̍^ƶ0N{렖b x#"?@7@o^0jB9\8|kRnDaErU3O:i{Bn/X7Tž>b6%ҭY%${^֟j"M.z6pC:a-a [ 29O&;X\rRB:h7ϯu蓙 _*Cݍ a(Jj2 m Z7"ڒmL ^fpAe%`ͮv:@l;S(ywvN(2F"87{[+ZJʲ&`N"*pR$2IlCla78@ph/}fiWNYWÉDf'6rQWYy~v+v̏_<;*ڪ8%>>4cLǖ.歞Z&C(sT*L)mXSŅw%2RSW 6#)^3vl5+ϳ&kl %_ksZpTBS5+QpW Kvr>ctN6wB 4~G݆Y)+=|ZDr3~ kN37ckC[n)6ǐf5@`A&TaC!&D@cG?NF"-1%Ȏnc̚4qM'Ι j&B>5Ѣ Eh͟C Jh;5;lYuS1&nƕ;n]Yc亙-xIx|V8۷Ecq(?L5+n#^){iҭRd**ZTJ*۲|6<(6x(˙zui'_,IzwG7n+qnáfxҲ?v 3F;R-v*'C"dǀ†6 (6m}}Ɉ"F Fz%~4P/Bg RɏCl'r ȸJ0H3 #-j& S쉹)!,Šn*=D*r 4O4.͙< -!)-HS#TӇLzlJJoSM8ې14 4?԰ 7D&/$HSU/襫chDRQ[Ov1Ipu9IdWaPn6=DgZ.6== F'&h'Ȋ.(Iq#' FH UD%  )MFI^HIF )&?&$F,= k `a-lh9,7 k&tM¬x eHDXMl3-1ZJfj%sm-6)lkS)*z抧D\diHLZoCPA7AP*Jg{XqH;p d9IҹFѡ)mW@x?6-(Q՚+ڲTAyٔq4 #IRI`2,h5w%o'1ChAĠ!ѡg4Hױl NI:Ho=$A7Á> UeƪLUSo,TCJZȝ1zxZVGd( t-Fێ_M ]cVY#.uǪ8t[efOb,H6=v@ƏALkwxl9kRRwrWf"*B$,2~=)/Q7QR,1mzKǬ[}l<ǽYءQe4@ݵ[HJ <\$ 11Kqw{u$X}@^4`# 2_1c~`soA`9nʈgS8VK4άp&L}:YcqqBr$P&ASst:UI&NF#.^>a[%f#:Nf¥pN<%&uU;P2Abjܟݭ:yJ@w_֤3pЦW0kx3:Fm:>Jc^ٜd1{Mxwakrּ:zCj™-XwǸn۬ rNQ3NvEw\ ;awS>ǣ%u1y{e݊My< %-̗P3^{ušCUviHnFU6Y"&8 ʝMG9 yv*Y}[ !kc{0xczi}^Kl` HcOy6hО'xO>KLВ(49n\,(jn]Fs F&`|mxCj[  DHnZ*h#l3rPv|@p\Ó"pDŽI|(mz˷iDp\,|éjCϰ*⪠* ~ (sP_30THNV lkR6 k ENPgB~)DZl< Xp71,'/KQ!&e %(dWc--1z (F=0],rF mdj)B 뗨i ʱ9"<D|1#AGF21CVJ$M-EqUJsI(V/GXb.#ZS!6'h欬30Q: o@L57vOD B(n)eZo~iqL4ث-! ACAs15=e~ Ds. .Rړ-qӈH7]@6âK#/7lFq5NT}$ ɰP, jK%A5;B:دBc/ B[.O*Hߐcȱ<=jtJ9isRNtV⬺a$6ÿx ّޥu$hFąBmBœd@[j}D M *ggjffb~nEU֨]+fVTq@Nl<ٴjb#Xh̪[[%*\-b5vb96c;cOkSc/d7cUcYeM6e[f]veg6eyfeg{6ff專܀g6iVii6(`#| t 늊d"l@xIP~a%T)&@8-b-+^t+x(ְ oC<]-l=bq%?(3r-7s9r7: UW1k(Uvju~>$l]Q}xx  6£d *I"D~j-Bi"bB,@zi&b$\o$'yݖ~R)#ywk2,8w؁#X/XyfI+8X-8)]6~IxK8OxQ8mw]݂ ITSSUX HW܌~ )|5fx58|e#I'Z"IX8J~78p:(t"%sӠwщ7~8y؏8UK8W~ yy y9/3Y';YT?˓!9?YOYS W 3ٔ+s' #4 p tWkq|K6V>)7'*>|$I JHKXQ b=*5Sv^ü:IU2r. @^ju/Y6 S-1:5z3Z)ɴ=SF:INCHu8Y 쥟oFu5:-v9:z=N_ө:z3\ɺ͚)Nzٺ;ڎ! ^!sJ阷E]A:_!{%#' Z;--7۱1/;O[K{#;![!?{CsA;C?-{u9{oO][{{[{ۺ/{۷{ۻ㻻۽﻾;|m !j[{<|߻k)A\EA ̠t  əɝ<ʡ|ʥʩʭ<˱|˵˹˽<˛\̼ȫ @p`t<\|Ώ\Qv`t@ȍ=}Ћ R T =A}ͫ`~ńԼ#gi6៶fi^>dA5>!^;cb2E>䡖SW~Y^+%\\Q_>A\OqUlo>b,Ӣa `@knх6ǐIB ծbn]$ d;F:N*Şў]L~^^2^ڡ۞>  _/9jlG$'7KY?[]?a5-37'Eu#_?bQH__e5,$` A<.Irf_LM^}°-~ 7A&<(pC#6A)Bdq#FCr퟿vR9#ˎ-?jr&̛/s !ΝH{*fӋIJu:ӌW=Rj"0ѠLI,֪gV+[nמMXT`nь.lߣY v0O,!u~*K˘3k̙3yeПΨS^^&$׍2wr??{I?>\9<Ó/N9s֩;:ӻoxgw&kwLK(;q7` "(2BXRρ5f=3Ao"{5h;?B ^GdK$)n&P ƒ[yyyI&\~%f*i#u1{>gȧ?833f饘^Iie*ꨤÄ4+ njҬJ뭶뮺믾 K쮟Qy>+mNkmC;$ikn螫n Ky% "<ICF,1VYQgeDlZil(W[œa0 O78L1<_mB逪=mQ|L'HMWȮ<5үrmٞzh]/pnm7e*cBQ}ߘހ>j E3]4&7'D8ِgJckp֥nY7$7u4K>kWRNZlbi'Z +:r+˶Է +V_m~9\<~g^|~k}D:su.ήэOiϻwj1_)>l*^+`Py{g#La*y u=]I\$"ʚ\,@qqw? nPLiLOBi1fKūvO!oV!!ਲ਼0t#nH*˃y<Ho/cOM'?l!Y"6,r IRғ$e(ߠ?6)Kdqle)CɎQ6ėDڡB權D㿌E+Q `KIsd51e'.l<!wA5ӄ tE(_Ғlܙ] *4vS <$OÖLA[IOҗ4BO|z Nm ԦGI!L4QHq4c7EvT$ЂHI#^ B KXҔ&|6hChi 5VzD[`~*'Efj8}2-S= <3q]caYIqKZ1s3XӼPRWrYyJV2z;;Ƣ{ ,خ6Rv}ӛJSIk]9Pt n$nàY,UӸ(2O} 7vzFO#(Χ~A|[J?я˄)I „@)jT%[l46qρEy>LS8"!Znwg8[_a\6韵"ߓOd,C,ߚnoF-*ﬧ:FH۝")G"f b6(˘`z^x*GcdNQ.)Pc=7hI>ֿO(-8~KeFV?F1Pb'D! WVcp wlzķv{{/bpyBWp2"H(*5BFN +G*>@B8DxRbWHJ@-Dv>!K0D1t> V_YN%qeǁxL-ȃf@hSf\{>{rpuaWDb(U@8:/aLL0Hh(`d؉xȉhPfa`H) dȋX9Laha^^W` .Hm(E1Q3G85rW<8l-z@P:Ԏ 4mC )9y ِyY9y xq3# ˠ) V\0]U a)h| rMĆ#/!*zG~IGf6`C!2bS`IMXMf)TȄ>XJd)=H[`TP$ ;&Q'G7F =R&D"vox]P ̥HV3<6*+G6iB}EM\3ѤKϡ;QxO'w5n /xI> i852fH>wk97 H;!\$mb*BbV[HxA\vFf]gy9ă - DVfY W:@% :G Dg3x@I@2EG(j^5QEy <ᙄwڪ:Z(-Ekƕlvs„dv2 𐧄et;QS55&Ϡ=GV76ڭʪKkz)v x'-v'}cw؇9ѕyF+{%!Ph)5˻gl埗k|ۻ3ِKkR2xcKz|aP̀H>q?%  03%5`LP3(p§!<3ʠ*<%'L?>/E2%5|Q5 =?*P5Kx.9PYUdl4|ykXX8TbUSN f9菒 #Ȋ+=)*7ӄH(93?ȦI aɘ<3<>QzL*go<>J㸆93SI|4:`zLkjDxAך+  p)Av!"R)|REcaEB* a΅F|"w`!D{_cocХưa`SL@0%vx,f 1#~f0xJ2NW(ǟ")2Q/wr,.+0E |P40S pvL:7 WAxL d]fwV^ H=3;A71'pQr%7pm+D#xm%E|iC)&ZuxhVhpc {>Dpyf}ZuH+ q'+)bQbۻ-[tҸ-= "wR*=m]u Sp4y2 i1PGH-UYR)b6]+W߰r-Q!0=Л_(s aȆߝ3ЕJwwuÁDs$ϡ<(߀Gݬ-ɡm%*a @qル<^q pլ)r]t$P<72oäS:J]ЈXYP I%-)}zK-eڙ.8z%%\7Pz}YMІu$ [=b]`)|Fn~2TUeZm{EC .vKj3Q! (/@?8+kAus {@uy7bv+`$!nkH2jCP4):^p~6tp'>$΁ф-2YgE.*:(og}%0˰2^ɧ,HvLƒks *Dc,k&AK[R>A"<3ʘQ'ց:;T(zt*܀T vfz=,7h|B+ q'E72(qewX_2.B\O Ή!6ϴ)y<}. z5I_vXk*8 QDXJtD=>D$*;8y#bDho8 Yo:Ԇ]GL?:w15𺩀?&\C%NXE5n#‚ 9tϟvUdrVM9uRl64;pFr+0zPH [(n>DIH*Dk쬝„J)4#blQ3Zj˾L=f3FͶF+$[Z jhBbgSr_vB |tV7X_lu/W6s1wܔPፌ}[H)]TZEn186ƊDTՓ[ W[޷טTP&͉e&Y9A^Sف׼=g[pej酚g؟gChʂ{ԻL&.oGo( 3,`Jo젪Ԡ7>\rG 9:*KGnա_[u-'2"v ;libcommons-dbcp-java-1.4.orig/src/site/resources/images/uml/BasicDataSource.gif0000644000175000017500000003731111333570550027501 0ustar drazzibdrazzibGIF89a{{)1)19ƽ,%H*\ȰÇ#JHŋ3jx)$ɓ&S\%˗.cœ)&͛6s,P@@JtѢH*MtӦPJJuժXj}pQ_+Tؠf,+-ٴnњݹw}^< ʠn[#^1ǎH`-]{fuAYeӤCf;YqҕYٟc|7ݣm>\xm]>>tPСhuaF^֭sEF[2ݭ^Pt;빫뜭n[Kx}vwA^Q=Ͻd@Y % gZFtq(PJءQ*HX쩅[g fqvFxx`88^?]@'ݒ ia`;:x~hT5Q}݃>)%؅ȠW>q:CugY'[gqym9fFccuVg ~gyU *iY^)[h`V(#zI+I f 3afzfk,V+Q86)Z:v;j>NTckTr} [sKRӪF%^dQ! gXc쁊Phr52ƹrjl7sUzCZ%XNVRg@(!M="QUg5[w ]m6Tdgu-r]'} L7ҁmxAwт⃃7\˖,˙eyf 1wY\qzoǭN\/Nc_:WKŮۺ# ;+|KS{.JjKQJ}IkT>)}藯>$w$?~ڏ~_\ "9'HAv4yp G(B: D=Uس^ 'f^*tvF4@~PPIbjB:͝LtCQL 0hݕŋ]z0>kQzEpqAQPv0Xz)yb5LT) }[OsGy?_}isO~o|W|'~ȗ'ww hx 8Xx(ݗ"8$X&Hv x*y؂0284,Xw8x/9(>HyA(xAEw%?P8#UHtZYÅc`(aeg>q0fdprtXE`xy8}h7VAX!r-S8A "s84mX92r29XkT $^R!͕\ Ub*tj[Xh~+T)&k (܂B" $QVr&TFbA1?&YQ&(urD(O'`hqؕ'$Q"#heT v򱖤2Lh6R_(I%&Մ!W5ݑVqQb5sOB2:E{Q\n*QpD$t= 'UKUK^r&`$`$=ff/H^AJVx3/)<_KHraaԨr37p#@I@v>[c5WIup'stx6c7]#kHd0yAm8@>s\W#]Epgm_(Ff1Q/I FϩZ r!^EikԋfsO/!E/"σ(29K9ȚT*dj5㘴4B1l~qkh傍uŝhuq!ųGUʦݳ @`Jʸ-\IIXmJnERd{Z[&PԨ&ꆞNxkehus)5|r6bU`_ jP^2q0uJfhH\W*Y*eBZ&P6cȤgmp-O8"SMD& bQ^u *L!"9&WDSniJRdvĩ^fU֔SQDVVկYRz@%9%5JQ&Z>Q0ő9%JN'ua)N@6+NQ."U!5{[5Wb`BԱ:ukrOGD-#g`"iRPS R#k$%"cHj^etU e'hY;'㔲-K3k&1Q^KU蒁XȪ!MPk!q$G_?fƣ(6WK'D4]/CkuvHqhAfE8-JZӲ|o.V5G$,S K꼀)k嘢kK*:ʻ \ R;~a DhS(^J)bif_6F45 ¦e[4T#]4e!G )6CKi!w:<ڻF\c!JgE;8`մZ*b5v(^pԼce,M'\Wq%XTL"gYdaCI: 0}l㛝ƕn6Zql_K\{ ܬYZ<[ZQ4jtcZ=38KujNK[g|LloE_0T DՉj*):\,fYgEmƁ{0:Kǡ}C0G%Xkq_eQ;mOeS`4Mf;n\Ӛ4^RRJ Tmek:d PadFL>q鲪qy`+LcVgl/9a$=$gft*tlVF3J`֤O !;rPGG{ҳƴU7CE`ۑm3WMRȞgM\Q:]X|m`<Ωce@r\R*ά{\i}ᄛ=ҳG[2I (TUP{6kĄѮVc&#'^E5 ɇ9ƛ)" t" KH0AʦzM1]8ll#Yrqh;  lϮ!ȕv}M绢y cx=hBڡxBlqO  <8@ *d &XPD paF& 9TJ( 2K$E~txR 5gzg}.@#{ŨĠ4Kh2M)W(cĹ3*ԞSvXaΦ9َwьR\Ⱦ&b]r!pcn^t[Q*NJ'ܼS̴ĈBj&M!攜\J52ZtͲycAɣumjv˪4+9׃vm27,^Z \{C$8yN3oj8`3,,ܓ'N7̥ Cp1[7ī;:1I$O\FCEDQLR,UTsTJ%2 jM LƄTCKwU̦8=ΫfkVrRhL2/dL0PrL<r+uMj AH-*" s5FdI=}UG %![/^'?e47 m G"ԵL1%k~ʩjcX6 gO&B Y* g)g(B-;9隂#z9+)s+ZΧ N5m.h¾S;s Ib9v;kxu:lN7҈U[#sr4z ޖíAÊj7eË\Uu<Ә zbs@W(7'AZ*I;{+}-iuj93U>&E9CW6+'y"U,e$(UHƂh`#R}"ڤKOƒcQ^U2žg&4Q "dcS]Ej8խ'x0 ^L(PX %ZoEQƢnZo سLKs-+`X:@adRTǞ'm*PeçLkI@dRVC"PSy=Q!YJi^+3DJĪݪnI`g7لgJ9MDҔN)/A6A LϳZ?$tхW[0[SFUn@XKݺW$Y.JTO 6 * zK9śح1*], X֪(t=J`9)KB ^o$8eڎh ~h=מ,y3 o ?V.>T| #t'*fCHjJkS,ֹkɦ^%ZdClK9e}Ϩ~b!COvM@nJ4ۥp^%IouĢTF5Wx{kMP;TϞ N"j9$ `b'nƪ[}gk/ W\4RpШSOʅѵJz8 GɄ*RT狡l(5HE]'6We]b[YAEEq"ZﺡN,&+({\ݳyy3z갌䪾WsL񦰶]OeNbjf^Ѩ$V [VcC i:XfO<;@^bͯnYS^29|,àF1'ޚ'-`K]kH 4Ǥ˜9nFN hmkd8s5?e*Mm_ P2<ɰ{%(EW1d2kCUkd(5{\@ y "( H!6a!?1s8) lȊj˰ӴE%# "A<;䴳\3hB9Œ<:,jDy dS0:1ߺ4K 6&A8&'0cL@@2t6܌rA\ ^B첖 N>=sN M3sqEBCqd=/$"|,5P)-Qr $IőE IQr ^*3P\:؛8KǙG.9ӈ0 + %-J%qHHB,-sRn Q &³#z1ӛDۥ h_>?<K.˺Q0$`b9$8hB?4$[R:)j kUGEű3*I/말s{bySJPUsDCC{(rGhI k|N O qRJx^MJtSUK& Kl:b?;Q[tV+ UV1 B+kei X˴@kJMtL8AҜ\?\ګ --@\I !uP{?4GS֫.GO\=%$Jkw,$A̡FEZ 04:ɳ-;< wb*ARa1;J-|k=ɢeƠSYTW;PPP#Y>]2T;{K3J &˔ဨ0z)>ܴiEBtS8|_g/`W$'K|ó6U|mWt#0 `(cĐLAzVlEM1|t|5?6Ye*alzJ>)㴷[b16[ ᴶH:q25::0b{ FR9+13D8N~8OmX7bHl0Bmc)1۸#H3yK + 5ڮ>\"Y! MIůSZ{#e9iπ,3S y@! Z#G)ZD #uC*s|a#.`-; +:U1< oޕ{2_dZ2X30;t w&JLR}KCSwea"@CQfZ|wڦ3F,ڿ~(ܟ93LӀ}sZW(by=/MF:[Ÿ.'GAvM4ˣ+J{j^EkߐhDðT3>E '+mI<.ݫ/Э4婔hBU_4ͦݱfj9`tDZTP彋]>!.=MH\FR-%ݩc[=."qTSe_)nXBj&z7:1] i ٷ2=qy?].I[%7o\T5:;qC+ [zTgś3jS^5qjdJh;@땏䤖{Q_Pe9 #Vl[DZs9&jcmf:'TL2a1lA)DV$#`SapGc&S]4ᨌlY4laFldkboy䳄tbgBU%Str $?e'?madM\ti01j 'ߙ\/KX=C:`kg{9>/ CA8i!eoذH>6$21H~bKY /ж'j@ 2 aГ2QG]%:N\Еss- I7]XTI\/%Vfi# Hf00q\Uj='K16e9:5y6ȧc]'4yIV=(Zi]LOjH!hۺq:Här=lHs6tQ?-,Zl{PEIE9J z_@QvSe|!Ui5;V,Ŷj*ˢkzsZĂWՀ~pG XP ؐÂ%.EBCbhq Ã!.PdD1#JivJ(ɐ8_f(N72]YȈm>(ST hS7 @-٨A ~5UJ H1R ƨ[m8U(Hm-pЙmnG``'L mU}h .xeJGϖ:ޱ< m[ш jvۦng] $v-tǢns9ӯTnetshfLWQi4zQqg[J!hP5{Sp!Alyh?A[ זB)8!|鍷t9Vpmp=f݌l{9nE9vr[ؑaJk9]U$VYߜmUYien$oNfU*с[ٞ>W#)D/7&9mǠ{wcZe>j-5A̍sZQN÷eMԆ=ӄdV$faUgvLc-=E%> =O&:7dOFmQ-3ٖ΂nA f<()[C}v]U ߆VTqJZ3yWR*kӥժ&+N*@ LB@ʷ7ӴD7XO YXNJQ5f1G W(7irJNۚA+[jt(]#좸'K9Ȋ5B%: 2_Vl;23|F{jX-Q5k~%Ctt rt/Z䈉YǩAp|#&|"foVQ24XL=ǭ{I+10V ..[4B)iRzX^6Vlie{D1=LeØ NgzRŝN|I_w4SŹbBΧ T {kܱNɩ<}W旻\WRǑÌM0Ga'4Q#L\=ǵݙyNzWDjG`9 qI\ ZuY]1US9܀ˈ_B[BY_)zy.|@e)g mB| ŐJYL|xvQDͨV܆Ҹj~\]LqOqƝ>\_uiyHvY!~QL,FjX$]&-{]׽  HR&Ր9>"?MuJ1QXО|XZʴ|hfkF`ca]IŅXbܱ=S1#@zNCƢAܚ~bYD$N@KE͐UL裲Q4] &n4D>cܬh-H1UZX\Viiepa-r! sŽ ".e E!d:]%ۚph I1Wyd 5Xݍ^-I`$ϺE&""ݐ׊9XW=U ur펻rM`9Wڡa-Vs'wLO( kQ-!U+p'eݰX! ڐ ˒'EDfaioD訏q§͸ȱ^Aܥ1ۋPD]7jZhQ(ިF?fiޠ @臶WܵcRcZa(Zj=Z%)"a:6Y଍6쉩8)ifKF)_ZH*jj٣NjHHnj"zj @^jbꨚꥂn**j*꩞j꫺*檬*jk*j*vҜΟ^+Xj)rfk=y+fkp@V@Д#QCN6)6!mN).$]hrS\H9ZC[`$E,g?.5Ԑ1P#՞R*)P = \hYlCBQl4+_]|4łddci,lۡ(u~QTB!];ᗺnR:F4>)~&Z e,tBԚ-tϺdb%8ЎncHnԒ,ɖ띴-mQZ |ˡn"@^Y.ߺ8ny`=g 5gl' ٖ-jsf"&Ź !l1noRmF`b yP( ˇՋz-bvV.Dg+ن8F)m#;^[RU^/~~ t.p mƕnFlme`WmJB*^Űݕ^rI [pk%`pLep"^"0xX-?2F l )Jq⬭2,Q8ŰqB` Emlh/ c0C1Vm | XJyq%sXy,hWqKΟ2*G17j% ߲rQR>irr..\*i0^Y=5S*6_6= _5/*~ZY%NG87;;nDQƎ=7޳>3?r뛢T6_ 4"AB74COn6#m3FOtFot|>k4r򳸎kJw+Ԫ4MϴMgMjjMtN4PP5QQ*`R/5S7S?5TGTO5UWU_5VgVo5WwW5Xou@;libcommons-dbcp-java-1.4.orig/src/site/resources/images/uml/getConnection.gif0000644000175000017500000024062211333570550027305 0ustar drazzibdrazzibGIF89a- B B!9)J J%HB)RLRR!J)R!R%R)^Z!^%Z)c!Z!R!Z!Z)c)c)c)R1Z1c1c1n&y$lk1s 1p6{1{1)/~99) 669=!%J)J)!R!!R)R)R)!Z!!9!)B!)J!)R!)B!1J!1R!1R!9Z)c!Z)!c!!Z!)c!)Z!1Z!9c)!k!%c!1c!9q%&!1k!9}!>6).B)1R))L)3R)9Z))Z)1f)-P1)Z1=c)9p*=bB=qoIZZ\`ikgsos}|ƽƌƽƽƔƜƔƜƥΜ˟Ҝҩ֭ޥޥε֭ޭطޭ޵޽ޭ޹,[ݻOa…#Bćw6p}dHcœi̚8o괹}*{oʍH*dBv'ɓ՝Wbݪ";,٩Է(~KnZذ.f+nWwEOBD ӷ^J~<9rM=s2G_kܷiʨ-wboؑ юO{uঀ͗٭?麹!>hqWUIl#,bƎŃ.&cMpB qdрpgG)7~FyDTAhH Dg.S =Њ'U-x)U cg`VZ(gg;>;d +eT[ (aC^ dHf@acaђI_~Qiىf$F"B"nXb")fx'ΩeA_ag=At(Aew⤦:'vїYj0l?yXndU`vPaxRsX&l0:F 滍Bk-f((iRs`y&ͶrG˪6˯~V-!7#c[绨: m6n~%) ,%^ s˪{*d9e2PhԩgR(ngP*uuVq,fȝcI0u^Jjˤ BL.:y1;unccF9t_gAպ؆)՞miai z-{"˿3<ѷRF@m= YH/<ē/O~BꈤPRK6~+^K`I|kEr@e*9c %\7P)$ )$ڰD]HYP&AڒS833In+ TTD{SrEkKjT եA*CӯHat[*uU{:SwԦ]MzV *`Q{,ʆSclZ͊ؕ1-Qnu*v]oMr?w6s&Xz͢ݫLMkSrjv~}I=/Φ1PIQzu-M,pW*܇Eq [T,J(DW|ͫ_kzΗl~Y5$Xޑ*ݱ ;%J[C8/\:ԑ, ~A{=|R0Ҏ#D)T8vE=w=N}ól8=]dwbXF.uLd [X;/b t>[N35/V g2bPO|=yĨa |NtQ|b3ϻ:rwd ɭI>{ZѠ)bH#dSKVzq v} ff]k ґ Yfj6k|ld3[%ֱs-dF5mm>vfr6 h;,,j1`0Bow/i|dلIi ?[s^s\'8#/Y)Ճr5yS[ۂQR8c ]8ITzεnrX/Y%Psg}л~RǺԭ8¡0;h:vT~8@c+λaÍ}Hc3a#fϫu* mx=7oOH7^ڦRoX۰6{OH6yC#Cx/ հ 'RURU }WxH|| ڰ;ڷo*+؂,p{۷{4|0Q>?/!^a ׀N(P|S|{ 7*B҃Q8RH~yM+q@;X(eXd}ޠ~~#qw)hx|~۷ ^ G0bPG@x؉(JUTe@W^gpfGpGP؋XUSPG`ef~)q.;QKph Kؘڸg0pxa"EJwpgU`8Xe0K0j dq fI`B`h 8(^Hg`J B "98T`AQ6)&  I0xK C`bfXje!f2YF HƈT` s۠CLɉxZSp^GfЇ`YDa j`xDnɍUR0SP3@  ~ Yy  c^we 0|9i9}ٗ0i eP.g"TeT` К9Yiřé Tc$8> ęٝɘٗɜ@ G@lKb` 9Y` <`ܰI::@bnɗZǙȩ IY Fp  K` (9iA GС 8J0;@@K@l+n˥p본 P򰘁vFEq[m{sor 븈˸ۦϊPDtV0;ۺˮ뮁y8R@!Uڥmʺ;+ Ûˋp h Rx9  Wૼ+;KmZʾ R@M/֐+ۿ+~)pq p <,ھp @˴`u$zdLzY,*rˮ.;:k@,|=Òkmڱ ٩180@ò+|竱Kc;Хci{>-mӿLƂz 2U0 Ш\{[̎kf XZ ǰ L K+൭eݶeg=؆M؀hAMA 8N&3SЭkk؉ر[ؚلهقַ AW2j̾س=ڶ]۴ۃټڅٿ-Z̐#Gtfڙ-ݸ ܜ]ݷ ܝ}ݻ={[ Pd ź}ؽMވ-Lt`k ۭ ݾ-߂͵W͘pJ?]}]؏?-}+ Y@ Pg-=✍Yڪe).?N>*zѪ2p]dʹc "݉ P~\P@ e&A|z{aCXhQ[;-+{MiLԸ3q4f0u wPnݗ.] إyxĠܐ; 㱞mN߽c ]FU0 .>^'$Tq 0~~~N[ UʱGD+Q\].ѮN߅>25J"m>鷎`M$ )(^+]x.\ 8 ]g @ j p 0kXU`=VOoUyoR0 Y&ꊞ9xN tߦ~no`oz9P'agRgo?{֔Orw|螟l?ĥu 0Mg7S0 i_p__Qq^ { _My庅k`/x>) ɓ!GRI%`ɛ$[ L;UJ=hPxʪxc'߻oަ<(ПO<N'ˊ3&ؑfqʜ6Y:e0א}=kFeŊ]ϟ>tU[ͱv|N̋Ϥh̵pòӗ߿ey W+…蕞Ic^mZ'r }کKU 7:܈~nʰp|WܺRҕ+m}y2iHXr٧`n28+deGᆡ&"vYyɎNK5.ꌮ=u5![ 7&t!ȡ\rQ>l,k5M iq"H|rO&I<џWlxH\Ϥ84,>`L*}/ͱz&=~a\񮢈#/29!c4tJɜ4V\ 6 sJ…9 ܼra%q wWik18p%Q{UV: },;GrA˝(4ѢA\t<[`#]-f9y$$<;"Kt8[4c\%L IUu |Cp g>}T<w7@Mb)BdP/$q^txMNt. !J;EaYyGhBIo'KfTV·seuZ$юcRqVa%ȌIrasս >_zxܿZ*<*4C?!Hֈ]Yr'6m5G˖Q6y&g'?o#| qoצ:ū|̊bzl_gJ0$h&Y1<^_4/sYiMHEg1I7Z_o Ccf׈{A L%*~t~-z&2ƉE۟ucz0H;2fV9J)m3H\Qi~5M]Hʣ.TLq`H=^ձ}sss撾{E"B/tP!9oZ=-#:jvo!۞&xPjZ6%`KhM:1*ElJxg,}Ri # W"BXOj\-@0PfnQN{(c<:"_3#.x\K*L!q,L GzPD2"`ca:A\sܾ"RѝDv_>!G 0:r*y"!yU$&P˱b=0!nܥbvA!>ͤ@pZYҤSA,{ ]p2M?$(<'!~ Zqx`7Sb[AG;Z=<5K»HL8!$ZPPp e(fv1-?j>&+PPHpYH;@p<@IPpnNx7Ip2H!As& DR5!.aH4Ӡӻ18Yȃ>LxJE(ʑJ<ȰӤkHQі <ȃ;7+Ɂ@l4TVqI8=4/6 ;MPhܛD(̺E,I1=8(pDp␇c,铀CzH =RLyPAr@:=H(ǡ\AHhMy@DD3/WT KPEJrS)0>'Yzj.NC3xL8ZJxA@W<@>TpEY@DZH[xQYGT\J`(LPH;H LgP$&h1 1{9KTGxL OLOM@AP\=Lpg\]S:x#=T PXkIT@ǙG;Ȅ5O?'LFU1tN[$uH\S@,?IFSAL:1"d(|}ߓSGW]QZQK1֑ 5C<6i%#ĭPH7v3Xy(+(;ǒ#t2΀V7~ ف3j$PaA>D>g$σ}TPK>뢃sNP܃JGA+>G]gSKOXC apP91CABH:S]k]WOLMGHIHLp9LEWIU| [MEHKNYTI( >"'mSxrʡ=J7fvX4/7$H?MUQxEGHQSQ8EȃLXH8LxE([`HY?PFKH`MP<: ! N1c҃уt[aPMF>:XQLU68;UUQHpQ9M=ȄWY8V8UȄ<؄9TyL8HPD<sTPe$d1>/eCɻY><(P9^MԄLHSF=(,]RSAp[Sh(zAyzy^U(7hKd_dM҃99<Whp>R`JHЃHAO:;:P9xH"]9=9>CA0yrChWQLX]cH7/>՟RЃVds+KgKgqFk9KMR8(Q7EW1UUMHGXDApλV3Ѹ0EzQ(VM9Mx^=M:(+ud([ȅQKV9fŋ7pl;Hb:HJ@f5 K˴wf1Gd΃MRhypdYCh6W6 kRmMW8Cz3BPNhzꦄqNgRW8mf̟JoΎGYz:@h[@hWzoszH@y/o2\ 4!*\.r.ohJ:t6o+:H~HCzyۊ(Ot^nnM(>D9c^MXz0p0[b77)ND.N+yr=y~g.9<?0h&V{zFERdbp{Dh[hSE@pyPGЃ: p_Qgb{W\>p8x-: \ofyYe A5g(Qj /^.xT‹ wN '_+Y.%/fc\$HóJ8m"]8hc#Tp0QE5T<1SK۠Qn0O@8ijW.d /Ĝq P<5; #ůJN-7UJ"4x d$}"ap <8SޠH <2AD[􃊍z~)8TX r0kOqa_L1J4`Z>lDxx YU3>hqQ< fsc%UpH(~qS1f>!u'DJA@[\$P (`XHq! @[ q"#%>xa H =d+FY ~' a h9#@U7:aK"B%uw(X<9^v*`gPBT8F%zŠ$s .bbZVJ0-@Lب#h 8"rE‘ˋ/#!8v (Ũl19Jر5W80y(SYǯqv |yӡ]`Z< zz\ DPPkVjEI)*a]Q d9ϱtBaC 賊x dCH>}8##u]lL`1i@ X 8dخ E<8@RRBku,D(^BО-p]l -RAa^"āB FE\J$i&X5lT =m8観&|f`M };-L/T\d{ZMڶ!SgqrLtKv<S~֨k|g}>>fn(&oNpg8\vJ0`21E5Pqvȃ,JmvFi>Kj tjo:h<)oJ{fZ^DDN=NqfuHXy=) 2O|.JC= @7][JLEL%ǁ^eo\ ۮ.KKJ˺4#  K-HoXDqX? NCMǹa*Cú P../﮼Bo&/Nnnn-jJO]fơQjuoS?J o^.onj0./ !_҄M}/ҙQ ߮ 1~_Fo//vO1'qΊ=zQNk`ՔQM`v`[KNcұKﺰ*1 / =x!ɭpon _n{0&10?@ r(cHPJ 0EK#.ʩ|o E0B'^@)K=` D-$+  8/n B@}mtKtPXxldLoR=ÿ\OX)L3}p& %;/pot D0d 9Ğ.H/{0qqggjt(cXv Z8.wZ)G:ǽզQ]﵍ˠ腪]]ϵf $ -_j vsjk;6c3vlvp5n*] e6fgf?Lն~ 0VآD0H7\5p3`pc{7d0^xDz Œ. j6 yOq_x7o|wfRԚ-f_f6'xvf ~lKQf&*Pl|U(S$,99E.H^+8xSQ{vm[cRBv^ef׻V0{4^ 8(K(R 80f܃o"9 c+ zQ˖RX2xkSbٺRv6캨爁Zo.euЄ]|@,X2r1.<) &X-$qfBSw+FPLlG#;՛>}~=M-cr"!~_GPͲ.7kNMՒ>cKh-l8jWY4L\>Lr 0"k0G2o1jqC kr1&S3(P  XJ4H`y83H G}pp}+W'FDg NJ&M)Rj(/PºWZTZjIR%v;B,ǚ#Av1(Gu2(*WEبNN֨Am!'#ax:|F,>vS"ًuZemXx۵wot~݊WquEʏ<*$*Tb}Z%9BT T8O<'>d?R1B Km<¡›tYw)#uC,R|TtDDJKdAL*^; aǮdVKrF *8 UObq>rꐪnLjN{GH1N$i-yP['BS5>@4UbMQ4 \;Gb'&9SCΣ62őkg[ŬlD[ yc<ѤJC✣֖pL;'±EteRcGH'y$V'[-EHt"(y1WGGl.ꗴxN-ÍRh-[zئ*JRA쾃mVfqΕ2wEȸWJy2KA𬘩&(84+ֲA T%D)"D._]zIG٤9Zyxl=4U@@M,Ɛ/)abc m+)J.\ɳVHGV`ީ(| 5etr#bK.w/lxU /$bڥkAaScT&SŏlMOeL-=#xX/8 }zXpwJTړaaOVڢRs!xi}uQUc$F1 7 /qpEKkS /LV4i䃟#8T[acQ\d JwXPL{YLMzo9OC 0+6J0!+-2qya( KԊ"FYly(z,C" M-<чQ,B"䑉>ȃ}H<Sģ} Pg G$ zu&D u#[B5h/l:CzVAC~qm<{f'꩔pxPZs#W,#A1%[Vcdl]ytEF2P c&>\EŹ.yqS Ab#D9)75ΨJ_|{*?"}ڻP.šGiA2ZLl-z,7ײtGC*/ȓLl%5?'SHn3rիX%E5oFQis!! YH]NGxEwM+*ZPt@M̫Ot+aK{NF$ˣ!Ȋkm+HX,I^][؎ࢵ4qmc`+mm]+Xdj IdVpjtlZٽ;pmD[oTjf^5s ޏhV1l=)9q!l:wXbәVpϜFY߱sR`ǻpSpb?a}odHt.v/>{m#S-Q?9o^_0)w_$ -2wflK2zX:jnz.{Gn<'?yK~V-[9q5Pdn7|gK>K;`>S-@6`'x y@l2A2*oDaH`@@0!d2 a¨¸(¨l6"' )v5fPAA`Jdcޡnl$9iFaW]ٍy-dȑ89Z)Y 9.*j&g`8$ُ!92xYEbYٍa?$Kc(z!yw"ay"DQr/~x8l]ٜ ٨U[ٕwYW9uٙ%)Xq9A%%A Ɓ9͙v.Z&gP'Z٢ɰ"!)ADYHSm:\9C wt0DsTq ~7E Z%~98~㭋CHh9Zu%H"tjwG;*No=h!t4 CAP!A~C `Z[pš4 ZCġ8[#b[~E%-*Tj$6V!۸bxaUv#e;.`XaA%!Ĭ9)o :93dB,)!A8/9ĥ1Ï8IEG\ȃjŏ9v>\Z=ȅÕ!ʋI;Xs.n<.JWñʥͧa?ΟaEC?\/*S`+tt<+)a<ӭ3ȝwuHQ|ЫO}7=Sӟ_#"#"/:>~~/E X %I{CpaD[|9= "dPkTHTAA)"v偷[4"9WjA}YhnC# BaA} ]=C|7UÛߩnYn&O3ЋW=#K|K=W؃a]ZAɝA A&“!ONy…Aav.a!??a?1f3hƒ $61ƌ ;n92HJ{4vT#P`L4g:y3!Aۉs͡A l$ǑT?7wVDLQ9ɚ[fbdlYsM젰fUƍթ(߱ذfH. qP%VvW0e͌_?~wݶj쌛n2 p As!f |UcMtV wR !pQ zKۂv {-A6(/ LԆ>ܞ3l q&w-"MZUka:p]`1C O<+.s{t]v8~]-"g+O.W^.׊G%z"?808C=D"& Kx81iBǰ5#N.1a ;Jydr\Im[S&E dc,[@X Ѭm =ޱ@G5ilb èf3V] OTygSĦ={Ӛװ79ps,(AMj66VTJH`YPj4g6akݨIKLf^#ѐ$]JYҜt=1v\CթQyeZ\&Sٱ5fuH5jB:Tkj]-+W9Zs:Ӛ]Eqv>5]ϚoK2 X󫄝&Q#(x|嫅s!<#旣iG%|h1n4Mf2"%LK⚨c0Ϝ4;YUFs0Jns\; "]8҅1_cGawch^Hbhh(ixs8!!$b"A"n]5ww>g#Y?!?aw!4Ȉ8?Z1YbqrH0NRxl7h~K g؋!\q{'q脹x|˘MȌ+fAEOBr~S!H)$8X|xGfӀ}(.X~`ShHVЎEjnjґx(ԐHy.V)yI- OPB%}&AUh[uwK3tMpS PigȆn[y> (sI x{CB}ȔX؆?"sYpYpGwٖxi>uhBryi~X"|H\؀> 痋H(Kx4命3c8ْ4(ӗ(b(D(.&_&J99 VXyɜ)嘏yh_H>yɜ Hb1X)0~ُ㉝IGWX98Q/9WyZxYaGfB *&XWJ܈hTWUZنYy4Z9jT=Ig#b[%Ej]Kyq]B5{!!Yzs!Wɥa:Zgإw66`ơoG+ ڡj~B9zjJٝypZ'y/ R8Z嘞#qdX~qzh~:""9T1駎jڪZڪg } 1U6H:ڬz0~' j(6zGzsԸ鹮Y5jF68RãQgȣ;J 8:2="h (B|d-B7?[b:]qHYRLj>3dqGGi$:Qxt:շ̨j0%☚YʊڐZ꟫*%W82 y(6)S+cKe{IˀhmRڪnyzYz ex4PQ) ˸ -帕Y}ʮz|'*kHhw1k˪ H x[xJ֢ N#%ԅYbw+YߡXʼ%K_(uh)ihs%k#Vk];PcX&ldW{(yBܶac* '/"WbXeǘ׳Uų.\y/13\A ~5,UV~4"J7UE6,QbP,SȤܑ XW*lҜ6ܥ w9BzGA hy_ ˊdhȊ`˾}wb HSNʿ<0U' ̤Ef^fM ̦|mIy[ŷ0]=Bʇ@xeB`c{/W|P,q1z;Ě[yIfxRQdހ|,ԖgOM+P=խF ˅K3@a<L֡ױdbNQfm uVc=U x 3gL{Or sp=ٗ"U \U-؀ ڟ-ڞ]X▂YaeQM}گ-ֲB֢+ ֔tm½ (Vf (O_=۰=ٖZUU< ޮmݐ?xx. 1*Љ[+l!)! ˽ aiK^_J ^ӕ~ɲT0gaQoL1M➽B=/iy XJX/ P<-FRodq> ԀlAͻq `NTKONac^ýylnbvm6ԑB~-Wm-ֆ\έ _ x;yn^NԵ~] x>mM~eDP9TN<}苎n-Z!媾oNe|}푂zݸ^ѮN8.B^zn.xPNp"~"~"`/_P UnO !!O~N p".>n=^xn.ב>ZZ@>_ 2ũ?=+{SևmJ;Jgh}mOn/%}(QD s-?:KH%KdGYSLlN=}"ȃ7ETiЖ;&l1RUdha©WyrX;nb 9S*k۶e ܸqڝW^e!2Tv;b{ .d*g̠rMdװ赏#Sرj*eʈ) !N-:n*J%Jn׉]]ft6q^o $2O- <^UC_?3/@F:hcAvvСpB ѱ 7̐ ?1D?Ck2+QCGd -=cdvygYmuhY6:hMv9iWƦ YhznYǖ웛F:9>[ iIC#xK ;q>:ǼoW[qbjw0MN+f_4-UcԠ6|q"-=u @\N;{e'Po\W2#}G`᥹=zWoE?Cq6~7=8_twW+9}n㽗%@)S?q5S#7샻(prҡa{`2(pNAsw)S^}`Dn1dY;8 9aԡ9">FXuđ(;b%Vъk"XʝO LjD+QsK:V5F1+.!{<c>h0#P^rBA&`&7u# (Y$ Τp d"AP%leT9S3N+]r1畼e-(_)ABxlP&8X 0JQaSA2ɯm.[ww 7>I #<2%9GN j hC:Jt A#*QJj)3z*EdIH:(jY!mH53T)\ĠQ e-9ԧ=OjRT.tS:UV=dêJUjNY#≔YՌLVn"UMQem@PA+E%PjlD[P6zHG]AQ.j=|L!JqaJi٬Z9BCַ@?QՆ7 qćLv7o-hC`Ӆnz[b \\IGz-L,Hяq cXSk@!::xD%f<&(4Yzg`C xf\E,Nnb⼶w pL8*\н8+A  a7i^?KNj'|͚qR#QNS%Y&z@JamJ))d=۩)o'~% \:i@KC*c D A;X)͉$3 $@8S@l%"?xB )Ýw LKeu9 ._14.>_c0BU%xk??!KoP?Gq wDT$$}D0 1j1E|1'p"\y&LT 62Ah0 kD5:ao0j`8; x>J0ilF:1}5=69/ +0;CopM:jwXēx.np\} ko@D  O4> ST"@ŵ@,/ڱHThIqD^L8 z2–!BXpD6?T[nlQBsdF7\$fDʷ65 :K [IJ| {5T0[S1){b[>dp u,gQMpgCcF}(u0F>n5-\y!",h菻@ɴ%ԇ2΅R&:?C+@qP[Plϝ&<1_JϊO D̼T7'>KlwjI1 1Ji,W0r!".t˫2ȔR=1eT;;u{V%ou9ETr=*Ӱ39kWJ*)8WtVԔQYReMyhv"uҭ%cMj%*G}sv+XoiL-:>$EvQ[kM5cD c9X -:vZh0ƣT\'-OJ6aStVڥy1r5{[!Z:WK:;^۸j` mmjjYC攭uGk ɤBF79%.-s#kF9JsRs• %bC"%Q?:\uϲec@=R8N_Po dMSМ!fZ6dq_ފ}؇S&BR l(.=c}':?56 eSC6Ԉn7h.k8e-m K91BE!CFڮo@5ȥ~:XdNaJ*J%cKi嗀c9$)>qIJ*->:.H'*eV`ۉlȅ6BZ˲Wr RuEӇ=hNXɄV0 7p0 nwЧe JkHj&M DNڶ,nˍ}P0s]kʨclQ%.* w9 R}0V@oDmr!C6ew@i"pçVduVauQv,u<M 8%t+V Bۼ}cw.J鑍|#o+p؂-p'pf5+_fe+p}pO+0Pf d\dJ%ط}Q}dJVS~~'X]Ve55 J5%h'L&~ge-dKb/i6p 'jxÆ6\P"Ċ/Nt"Ǝ)q$ɒ{Λ)MŒ)s&͚6-\P;+t *t(Ѣ/ֲˢNBI74*׮^coܚ6u-۔9\v.]9Ak]|{۾7Qdm~.x_޾}vy7m.o9t͞q.-z[iРEoLjյ~7Ԝeϸ#7Z6zcϘZ2쮵° ;"u:ѧ'/{UDT&eDE OJxǠCwԄ;-D\qX~'޷&[w5;-F4(IXC:XV(ť[;G"K2٤O*R.I%W6i%]@yLz;3N A|e; `:k@waE>9y!-;gwQJ_|;Z!b^~?)0qQpI*R1mޙլNJ Oa[[AgˎdO!) unjΝMI- _A'xbLQMoGnChŒ5I$f4{5gТ Y'CL4?)' F; 3xʸ#򥧢l~/އ[y(?S4$FnD0)j-P?$KI#,\J-5bI)ģ~f-a,bT8jE}s{պ7r=Wm fH}cN唯Da}q{QzPwq~rH>KCf"3\}ؙ⇔^j:lߜ GrI,4D}%bؘK H돣&--fuAm(gBX?g$GL]wL~?nsd%9irR P`(Xc'Ƈ VR#%7تv+w妬pQѲdArm\aOLVC(%5c(A i)<H1EAz[%")'$)]\eHgBAH’Q\PDJX@; ;U&p<ɘtR[ֶ2|z_t#aqY9ŘT'=I*@USS^}ecM6UБȖΤZ{dÌlzAk,d U',YG =m'oz\l&gM,:qг5V;Oz26y>Ӝy5IWs6܈~E̹+06%@|E.@8>f8!k%13َv=L-o'Xc l/Æ_`Dl|5ȰXxGY$1^|+q\QQ~wirֵ.reE/ϡ4wu!C.|- ,NԖO^͇\$#Vr?ʵ10Dr&>ذQg \ ߠ0 P~c Z.Ne!x)1v{#AMquxTZ7UKLK:.-hj+=4aZ(vc0vRu*e-{z98/6\û޹CR1eLu.#^20݌i[s},́GWi'Gۅ2t7f@g8 0[\ >4Ě{3IjnZzJ#QMFaW16OGǞ (+Vm&uk0G ti\IҌP1D^Rƪk`?^HT ZM[J"ml乛!VÉ=>xɻ83 xa%b s#cK8eޭ˧W"fc2ohFbRqdjf.&qj ڀ @ t tnm\`0A^YbUDDUΚPD&|0q-QJyAO+%>H$au"q3^X iawbJcUZa9[v%N4Z)%N]iVI^H<5XH(=[<ܭ>IJSHYؑIj\ER͍1]|'5g|1E T^Br{ɔ7|_ I꟮_iYI:[LN[ٰЋ];j8AC{H=MDZ\C,io%ZZef5IsFܚ W}W!+Vɳ.9^9k'u)Fzy e:ĵ-V(D'K|m:Tg6nczc'z}dQ ̈mG^a>n)ƮIƊ[ɒ,\ ۑd ۱鸄BQFXpٕeKm lA-D_YQkp`XLX_e2Oj[lHĤU^ &ejk)fu+~xcbV+rCYZvKE| ̀A;NǘSEd1U"T܎$b[ 5Dp&0/6LWx U`֪[|Q: ̗n E|K> fPZU1p,!5mnDNzhCyR(Ա텴)ٯ>LBK3Hh|_ P4N 0\଒?|gt寤7\6KW 4|+(?,ҵK QJ L0P e0!0m{q 9?oV7Wٕ?>[Em]_o1>[֒b!1]2V". r,,2 bRxeVp@hK}+1R:@ 03/qSsRMq?@oj{q8g>3X51 TL\E!2S 2iIfYR^rܵ/6D#pUk+6k@ DI D88tLM#N48dS#WH?876SR8NV*$HnAV|߾ )ECkvn%} dChfewpr+wr3r;wsCsKwtStqwd  XF q?p78@Nۜ:Rl56f4ޜ ^O 0/_J2D}OJYeٵ6vjѷI3qt,t*c6hWgm.*]xkyV w"-Yn'OHga7Ťs-;Cy-[ s0WXG-K7ʝCsn^EDHҜ9fgDCIo qt(NՕH&78_W&klrvvdvx*[&%PEriọ0X荺ũӱ} `(5-ʡJ5 DĴ MeLz\Jĉ?II'NbpC '5l,1}"Doρ%_m;z{JFk#kGw(f  ۈ[O}|ț|<]%Ѕ {rxz[%Aێ^XGO|٭o ̀te0c\kEQ<0vV}%ỰkZj-O !CiK'wgz}m!g%,-qZ6:}yLwެC,d1gi>;Ysiӧwyݳ5jۨ'ש׿u99nސ'۷Ρ?tձ_v_oysm9~Ɨn37mjֿӨv PzʫrPi3phs~yf .1RK,nHCQ,3+4YQG8ͮ|6*#LR%l'2IjӍ} tJvЦ+vʫ3:st4TS8t;=O?ʚol Xf/n+ Ҭf*/ DOmƼy/nSR?,JQ2XtDTMR ]}Ɇq%omXѐMVZHոXQo 7!]%!jz3֠0N[ɴ=+_Z|W wV'}Ra{r8b_KZ KթXvړ{ *Qn9wBe  gVx䜍z kx&/?;S3^h ezc_жl g ,ܳMBF{flݎ)Kwnxrܷ-ÅMm7<_q#kf/}"Xo(ha̶=L|+$?qh#NujK͉w cMolDE"V 'H coH?C`m~2UH*$XIbC!_ƓF|HMJODVFk`iTQQm4>Q@2Ec7FSZ:H;Caf2` cPͨ޸DC ސSJ3_d9i|e=I(S*kLزGA4:yT˙8B|jDƆ,iehBE~52 T*:)ؕ\1uC]:F))9ۘΧ[Ӟu+xީV:jbjb7+慠vyQv6Ð.֊re+Xg֚5~WΦZV$s_{(EMZϲS$4[TyZWTUs+b(*wӫ[zo8 #I4ęޝ 1f3S Hߥ4LR#B%4Q<."*@ 1 9KF8-DUh-q՚G͖x~Ie&@QgSH=rYDEeByln=@+.Z2E?^S3'^հ+[Me=ulҙ>KgZFNYJK%\Px=.ymM6S6,3yԗVL+kdGgqGr2-Uٸˬywn)f2)wn#i34)+] 4mØNw5nƇ^@cSUγN& }me[4[C[O Sq+<z:*ޢ-F{9ue麀&aȏkÜ^,?N\O,*fkN}Rͦ <#+O/wEmsG]OⅡCVhat3"hP_ZþM\>Sيg"Χt:CAz0{ E;^ӵ,'i#.oʨ>{f|nNl8 C/.BU,H.6bdXFa+d殚1D[EpA:G 2nt Gx*~6˰P ~t)<h P̘pܞ  H!?,m-d" h|"I'qpL'qqȽt,a & &؁ h􋸔v,Off1n il *`s`5b)DN4H!ݜb'JOgeV71b[΄M'DM1I-FEF/7Xe!A dMD*zMvn߬t Nb$kV ;oF FPpL O,< iJf8Q4'8 )aLʣ+b)$(%R/rR4rMF4rL2Rč)<2(,+3N6>ʃa L:P"q\-Pk) 7@^2dNp&PPP ŨqdžޡfjR! D r( F@ X@t4R4 .ǀ $LR 6 r z7` b8s 9: :";;9;8|TDE\t3Z%qԈPd)ERHsRH# 4a 4N$mX%NCM aP  jVC%lѯfҤ_ܡSCVdy[м$U$.% ^SDgjc/35L2%2dji!,gg^gȕ3gZvb&Vxl'+%|"!wXV "l&SzuLULWzcPI9xi juG d{q%eWvel8. An=8 z@"l:nJ&U{D3or 0Hlڴ6W 7xQl'#+2H3/_2ɃOi?q.3ujRW*S%47"uW{$6~ފqJ2fyvAւKe6w_Aňu (zޯ >wH⥴g( 5BJ;ϢkV>!#(43@7?  m@U.Z]u! !ا 磮YO1K#PMdE{baOOG$,޷A,=>ˤ5u}??3/' l{*\ȰÇ#JHqbBf4mCII6˗.9QÌa괘߻Vp[НH*=;9/vtիXJu $ʄt]3ٳh瓫׃)Lx݅^j{Po_@x;`w+>_i':5Ny pƓ#_7_Dƺj~[l[-,.r7fqlb|DS85UP6UR)}sTvjMU Vh!Y>tP](bZRCqycWobqXb;;ceXZ`Eڸ?(l IN܌y.2G`~)fcH&o]I6߈tDL ֩p_垀BT7AN?]:`uM4PuEf*aP 5 ]Xc)H`}VCEW܇}gЍO"5U#F SN7,QۯA ұ(6 үaJb+ЖJ7tn(5^m)}yk_lIaоHk#A CO?upл9 *:\2T3J э7S@?,}#r·%\O '-"v~QRf?H#^' ui֙6ԊN!Y u,Cu27tU|m8\(8nޜ.䎗d^IFO9+ᠳ_⍋N䦗^9嬯] |cF,+H}Q6C,47Il7.8?_%8@}W))vtHJ78Bhbe;g (L%7.i5lCdşhu^ѢM3„$3aBz^#YRBc7!mBw+Z> a8!7:"# 4 T\*PAHD^"B"Q-)Dm| = o)+xHU&<I }>аAfs#!=%aj =LS;:N%!#AGN$I6K-o9)ԠpS%C0GķW1$w-*DjZ̦6nzf4q%4Z8vLJl`4@6q Qߠ ;d"r"=K!J l"# 9YHJ':2M-d|ֵF6Ei ,ܞ2cb)~n),RIKQ13@e"ujl18i1p VXJֲhMkZ[VZpmZָUwkYj`x[V:cl=كРZHV+< dpfս(Ƣ6s4*̅Hf4Evg9{ȝW9)eܬiZ04FlR3OXl @6FUt#1"*!U;Qnt#o~LF `'v} Rÿu<6O GL3=pfq|56*ώdހ.pa{[EfbfSFG h : ;2Wu[_@f&Qe RQ(ME (P咈BR9jg…X3zZ&p'7mhu:э#MI[ش5+-NOӜt5# r~hO69Kӯg kZӢ'@+Mk&FC?0,dVf IR0k@GMی*D3OYH8RFnGgA3#55#w$/uBF̡J3'ct̞&5w^ֲm g8/n=+Vg 4!h5l&xv1L0BL4u~e)sgt۹S~w#p2Efnq|f@5yÔ? ,4h9e:tTeqȔ?ȂZ2:A)Q^<R"4aQwN(}N#uw.|gnBFwAeܶ+1޷؀m+ pZ:lNhW 5Q#>*Rf h{mK 35(?E؈NfljgL4pQ CxqD$7`};(. ( P~lsp2ܸX(J1Ř D 1栍1Z Lr]Hó؈-^'%U |S{ p'%'0Nc]7p)05HPov ʨEɏ;ؓD.vиLK..Sٔ,89겎KvypvC+z{&XdJ89*o? 4ɗ1)gT Z6q"w}IA|~( x[ٷ+79dvgh1nQfQ'yrm@0iwP!31 S^DSx{+x>)5f!6 @&^xsLR%:2 {8Q$Cc$G f4 7@l$p~54f% ɁQ ;}4>X3Dy4ɗ+ᗻGS7i0x(s֙wVgc=XhKZْ9|Z*gNRQH\s#2HdJ [,Kf)13 &f&ʈj*qC!&iqbʫŕWZ! FOf{h 70 K 崋K! M ({6kxg+]'*y#+g;!ݐaa;[{ۺ)&`<9b6p +2:JYZٯ?A{BI;5x&)'%TKYd:f ^9PD5@%VVX;V[{ۿlKVnu/(p#>bp'(xAHhǫ7۫2Y)HʘkP{'ac֫/,eZ Bb405u"kJ i@GzޓS|J9@Gћ/2RqJ[),ok@ b$0B} \:*6ȇȄȆ@ȐlɗwSCߠqD#5P Y/zK,طYk'S(?V]XggMu*˫x L;8`#Ll\;R2c#dl^<+ffp K|Q{7*iU f${,\yY6ơ}/1q1h4s/s9Cz"=]m !3s.1* Ҽ()PZ "!loaϺA(R PQf-SlrfVE%,;.; &xv }/i&im;8#Fb:oNehg o}A(]8BK|F4DOe;RL}!]%XόKƊcWM1|n p<)r$9OMKZ!/:&yx +c\br,I{$w#}|q)L+9= & պːΐ{\7q9 u+]P:t7r*<5m:}^8^.U z*~fDJXK K(T2)*)ޝxWݸk RFB$Z:(.# 7wb^^:-S@q:u>9=w>] j:Er@hh(azAN~G->qm!i̭LTڥ!YNջذ]#ԄC +%b?!nԁAp΁<ذI75NǞsc\m+x7A3n龻i>R9Z}aC˘ <+C~HJn":`p$1רs эF.xQ3/!$c\Ú"|"!! jC8-RBюx5{dp_!K;'cǂ⿚#_k99"B7cffW#"(?)xͥEm<W@c3M sCFATg &AvR0eC-F1y'0ooDS6'4,90?E+rbj//-6%>]I918ƒjd|KQ8Wbա=Kڡ>K.68 .Pa$Xf+SkR;&~//ov,1rP/E?{N`,C $n;nߜPoE /&CSL%B,P"B}AYH-/|gr?IœozD*ITYnWaŎ%[6lR'8j]k[qNe[c1m/նɰ[O޿uB%-J;oVzH)ɡEƬagAf5X5:[׹uK]ZmэIaj'!7&d`& mD/8Cu9laOj3&?3z_1@O->p>C1;o,YƈooZX"Nw #1 C,@Bn>P 3dA"oH' p@ od2AQ_d THj֔37 h9 M6N,2?2 Zx''B/RPHGE 匠m4tSN#3r,Ц*иBfB,k JKqSƚۑo2񟌼odu핻5#omI}cU5dg3o&55dtUmei `Xo} .zt]m)yfj1RW-`s F/MTk"Zf9ӫNoyhnF)T : #M:D"Gl˪6{U ٌ plF:o!"gnsk[9w wǹHi\8s|(WFǘLUG8Zv,4q}Jr R>}2gJiok2f{ "i>͵ Qܩ,s]F5RزMJSSHI| mT*AgZ"-G8"C<02z;0_Ӧ0'zcLCqi!bāp ID !EQHiP2)LӞC!A" zą^(FQal"#)V#bC ɠmv4a 0nvzHfBi`&Id5\A W@ǧ#﹀RL_ȿ7*~CC4",\>W/;zožLmw Fsp?"S;k:?֫;Ӿ˪+%;ED@S=CA%{34sA/;A+j)<lpnHm{>̨ S /A !-ʮ/$+ 4)C?;@6P4##{k'v臡'%tb @c*[C ;Y@ۯBA4 J6s=[=N36Y l`'B6b  ,.,/<4VBL=Sf=R0CFSnȋ]0%p™txB4@(ԊcWj͒AKc\%x$RD{S| 9V<0{ ';@̊H-"-K!*I1Ų! 1Dn"س-y r䮬#Sh5¾臂!Jp8*1A$l|4lRD7As; I ɎK JɻLd˚Ȏ 4ov0Z(#-n AǣLB p:T1%Z, IKI0L8Л8|йPt8Q̴=TK-;Rs t*QdLPQ%Q4QHMRKIpQHuLیb H>a][]cUP ˺uրE;7HP_`at, 8L p2F+nnb~b)&:4b'b-b0>E1Jzb0b5".fhE`hAeCS6^ȯ YnPHi`@i!,)dPPdQ>e 41 4r80l=cRe%KnOsX;`d\KeVN]V#SegfU^finfh~ifjfkfjRֺ2G̰Yΰ|"KgSgwngxFuwzfg{g|gz~nCX^%嘤USh^Hkhfh~Nhhh舦tZB~] +&Fl=VD>9eиKނPoj.j>jNj^jf~jjkXoІTjnjkkko.k^knkV3ykk֕o؁[M ,a=5mզ.N֎vҦmHmmކj|mo n)@mnn&mi6oFoVofonNon&mvnVѶmنȁЁnKGcO? Af<$;iV GЁP2h2p'h&qw+'hqqqq !7r q$?_/)q(>+P*!*q'$!p50+r'Wh+>&Ss5r%'&0sD7r,/s,grG_ /W1FGLt@Ng'%0s/5t"U39/YtXuFwt2]XrW`avH/--s7souJ?tItHD_uPMspvqg5!Lu^iji^My4`DVl ˮ~/Gǭ/Іn kkZj/jx?f&Gyy^yxmЁ膘U<^xppK3xcPCiWx Nḃ`@9@DWnIo( Q{KW~{/{{gఋg'|w?]ʷa@2]]{ȷ$" @p؁NHD@|G=>EȤJC $qEVħh"]=W~Mo~_~{~~^Z>C4/7??4thAvŷ&~s.!ƌ7r#Ȑ"5E#Wlo)&Nj,>Qzb3'ҤJywی2j*ք5chK 5+ڴjU-Q0e"4.^(9d2nEXBmn#ߋN,1Zy?3F[r̳ν8V(ͪ~WiԲܨfy.9t؃[ej5HRh`;H|~)&!%x(Ƨ;DA^/ e҈RkNpxT*[})騦 =}Su:oiL(QܨZa/\1_O%>6Jt217mAWlӲʼ,O?AƢ7/l:1VAJRRHܓC 55Y0cv 6yqk[^jbq[8wpmw%}Z֖wXx }rtrx~CaYQWFK>/d97%qh(zM;=ƫeMe50e_N W&qU;F<yS_Jǖwӟxo&_>;/xb~SA۾}Ro4aQ;;XuRPf58dv T]0meAD-fW ҷڥ<_JXNPԸD'p"(rB8pa&B'hi,}bzD0|^6c-\i&q9Fyn'ó.ʑQGA8d')P;Ң! 42ԯjK]xL%D쀗JNؓFy:8u3@*h`C 8Dad!BXV:h!?W%+ɤ6Z4lE\B}ƛĉbB m(G]Dhj=Zns&8>y*2%6L-mJirLKi2. L%G2JyT= A53tc(;S?Rh†;fIU$LePЪ 0R'*:-# U Iuh0/JҹNTASw9Ă C9i` LA[UeXUӭTO) ~gWb)PMA_۳V) PH 5sf!H)j&Ve,]tà4>[ۍEI\ʧ3yV>#u_䎑F޸w$W."V #D:.Mkf's+U1b2EIʰVdY.k'qrZfn(†ҷ:,V2X/Z'gP9'u)n Zvus< I4wbGOx? ʶx.GF ,dXK xE1):ڮ$Asβ CO~|P4$\QMiRF`_adCLl2Xm fCw dp"4YS4̩t gA]ۏ VsǙ]&gs rܖf w/߳[ږ8C;9`x!Ȗ҄ox:2#ll&^Q`Nr uQO2R9bl"j{+\dޮ=/3it-\+/LE:aA\݋Hoܖ-ja8qGaNTx΋Dz$|Iqk_vצ/Džz_V'oxUf_.:Yter_:~X94Cxr/i ОyߐfF-Q]TDJy͔Q^XԔL\]D%f억]Xy ^@˹TMD}*1mX̕8?@[/Y2 KxL`@\) ?7I:yYdOp! "o!H) tE*/9D=MfyC?iEbv5x JTpH} `NCg%ź*6Um a]Y"%XUK="Ea076}DbxC 4:DZ^}! 5#Jblq_p) =M\Ȉk7TëjZ.ޑ<`=ռyYSa ڐ ed H#I,EL%K1ٕGi6UJ$7DI>B˼F1LL70FCUwD,;hC5|CТѬ LNl٩ڕ Fd[y$1bKHQG)N\FldF|``&aa&bJ` RP Kd(`B IfeFc =^f`ûdfIԢ"ev& qfbj&kk Ik&m֦mjj&_E`n&p'k~p'r7x6DD7ѺHI5]d\0c}\ 0Ghuٸ \Qz'Z-N,lVw'g \y t7lÁz7|6'q6z8(.hJh2j(vrhh(qF*Fhhb艞hhn聞V*h (B(nh)"*2ihh B^FĂr7hC7D*(R.i(ViZi&i:i(zC6h^ij*JUF(5th7hF*"jJf*J|*؀@7\C %y]l%EV1RgG GkJ}e ||\ذZPX8X8AZj+zkr~븆++빶kƫ++n\x @:b++++.l>FlRk\|@jRÂlÎ,ĆɒĞlƫ~x+͊Ȯ,Φ,ެ*f+jxH|@ Ϊl6->-B΀| Q<]XM RƬ2فIm!#1~[Q-Ɔ#I~Nc~C 0Y74HrFNnbz&ՇqRnn27@irmTLnnpû\QdήrҀs@7HMsp9Cm0ʪ1ܱ%`]ݺְ rޥ| Zo ߖ& \2Z 9%~cT"DJ;| l D7hP] 0;$m]>!xxjN~б~-άov 0}ް[D$?PD5bF[(1/q?GqOX@13qKq_oc1wq9:6JNaq91zı1ӱ1˱q1  c r ##72$W2%_$g$4CĎPfvЉ))oQ))+2,,r,,+_q601e(3111 23332?2;s4's3 |RpXC_zFfv0pժj ; HS ӳ8_z=׳J?=eJ7䲰zCۈCFCCCwDRtDkDCF{tGdWJH4ItKs,}`KMsMtNY1|EK uOtQ5Zee`5ܯ{w3t.:UT} .]ܢG4IQ8[\jP y7LpA3-:A"wY7P$7rP{J|Zͷw7{x~g_PXwaOc+NX-[x3`GwQox[)6wgwh`$Bj6j7j8?QxJlUo ݚ&Yf󶳏37T&Jy([X5}G}¹%/<Z\]i:!KI ܅9*9;z:O:G:sK73%;*:*2```#!Lo{|F9RkQ D < HK@۳ ޮtw՘>t~Axp~=W>_i >>۾/~\W0>?wC$=o?S4 m|C S%Z?3[ ,)VxcF9vdH 2lHЛĐ+YtfLY6@V{r[GPuF5O]RO6:}EѤIju U?%fAa-,ZjU+Wr=o +=OdXAv+Ie͕9g|3fОI6-ҩC>u9j׹_woÅ7'vzğKN;''^6>W';Qk_|?|گL A (9z % ;:m$Et!m1 v1J,jڇ)gËx|"J GёGM +'*#gtF|ҟ"*0i9wZ,7>4<ӓSPyȫ"@}PH[.C*buuhϋ)!r{=CdvCo??uwofo>MY7TL"߹F֙[ vFŦf{ " {qE^\)zto=tDiQ$,?,(@>ЁlGi ?&q  (RaIAp(,!> YB s8Ѓp ЇFL"DʬKl@DKt.Z2 `\ [PV@3jZ*C0IW6<1]a҂n#Hz|cơtg)Z&'u9ި $v.IMO'{r(Q*eJe'gZ&gJ.OxwfrшlԦwT q6) PN<:dK(Ai:w@ArO# ,%oˍ ?Չ! ipwdDY.^ to Vh;/PaC4WL CI0}ci1@MH20*ei^;ҴC67t:RX*QaT*'hjLgZӛ<)Pj6.j k̞ehQ◹ceSt7duIcO|C 8 (MZ=$ClZ.,t%ىZn Wxӛ"ФW)Ⱦ`è^C3? +׸;r+814jp;O.Mv]&cvcOuHU'lAMl椞FVT`!,bk͗НL>q[` '{J' 8 1 ^R.1?k)C.`?/ENgSfCazX҇;b Qֈ D`-+]ot,Dfэm9[Bcވ;yTƲk*Wֺ!A4},1# @L#h:SS_oaCoD̫,k%UFlM J 0luѲ*iQ> 7Qo/ef Bܓ'D`pOqrs[(ã)Pm9^'a\d2OrZpYğO"Gbsc\hήC.q.91zHYc\Fz I8 yK4,C=;G;bWH_M  #$]`f X-ln#w+ ln#_l6ww=DR/e6G<7Uu4I}i! ?"qa/ dbH/+! b[lܺ , Ng Ό0a FH.Q +d[k > ^\ @|9J'l0 6r2i/n w $c-O0'`u{#"0]fctd fBՇqȠ}Q/te5`/nP:e(6Oܪ1ϵ1 .Ȟ ߌ Q բDx$cq}\e,2+7"ѸAvc#K`#4N3#'ynt3R'Sm Q'@Q6v I2@b'jބ!Qp#i+r6 {~&.Q4ƒߐ *H" "  +l0F@\F9$?vs ɺ$0C kb6,$lmO1L:'4a<[2c uFU , RZ KfU",X5HZ!ށ.bscR06ށW6NI r" |;t66> Np@Q8GȆg("\:! 'f !`Q5+"H3#UHYkWy W( HyTd->DfBvdy,+L5%E*-hSE!hqh;cC),DWN*O2lD8,+6Ձ?:ԟ& -Q*4rB1ն_SA*a "V=PHJOs VJqqTc=3rs/V(X)GJ B!a=PJEs1Fc "L![uR#[)u\Hm'=/Ogq(kG1&It̤0WbQ}(sD+#5o9#P "dcG%u BJ+JbFbdbcT6(@$*vrobSua]`#g)VN!,86aOWJ9U`,1";̔ AhS,M7r$o4MêbwQmx1ӄ~0lP 9r5 Un3RIRbW'"E BS W-"! U*8rγqqsS)G*(7rK$g}ρиԐ6Ÿ<(J_83れ'o%wRx1scB&P2 "*4H]S:Mk2x[/-[g}[bd=7 K$#ae"$HdV-`t)27d&J1!:6f"*pxKcXvf6J .vAWP⋭2 ́ bhzk'`',)}AiH5'qnPlDU/1-U u%Q5G9w{r]3FŨA%ׁXo=fڤBnc>Fr8s)*QcȠH$Ơlmw|Q˗|Kԥgfs HZ\dn,;IId-1K(s":EgrT⭥g_l4UW['*Ph*X&K@x{\*eX9,7Eo4 Rj ѼIi19"b"$܁`;bG" S$4aqcmk \]Zk^òxk`!x("gقns*0O#FxƽD'8 Ԩ(KbpJE"Hp$<Ҝz0f!vt vl4~\1^ggxI FY~"OD9؜zٚSP'<{cQE\_;o!^@gw&+/3]'^f)/'%?}!W2ijxx Evi].i'z}Ѓ#N\LnLgZ%%.iU'r|QNj`Z * ߝ=}D ր޷ Z` ]ݷ@ > Ԁv` X ~) @ `f}~vj`Z@ < X րU BLäӰuRB&u0X @M"{SMb.|BC۝+빻r)>ޞ^~~v?!%>2Iߞ!zzfha J臾Q7<>zen#Y(ħ*,hsO/۷]۷]2=/skAgң ߻(G6ԫ'5}x^J'6wjn &^; u{߿:|1ĉ+Z1ƍ ‡9<2ʕ *dݿ3Ό{͟;ī< 5N hTVxC/̱JdݷZ.liYtTTϐskWh?|_ۃ:1Ӷ.ݧP!f!'9Xb f&=-%xyCB.([BrE۷߾}@0,XL.cԫST$Qܻ#oۻ;Lϻ/mWoGUCEXmW^nM}>;|eƘOrA_5HO:BSSy).ER{Et \X\/ G}yR|8TbD.?o d$%D6ܰh{6]BXZM8&J81XV%Dh9; iWZv_{zҚ]yÍHe(A&QM`J7^BgYYC8h^Bd>r7H9kLS7'v됝;m,`4"7g,E5䨨Ji,SU.xnx(55X;j }ҋMJZc_VT͉Kr.iOҊ :\qZ L^L\I[ ()\wm*l΅)PZ\cuZW0`C<"]7}_j1y$7d QzoeOJ ,QME+\we8CB|ؠ7Yd;BS 3?欳oGzExpo4WM vv-5=:`im#fsGbLL{ MHSjiW6B }@)ʳUC4aH~ '(C܁8&kXGw81n"@p~XŇ/LesNGHHCnY5m#&aVoiFl\R񾦭i8):}A3kM%΋Pvx[27~#/}NE_K&Ȱ#n|CH=Q> YV<̅ja}FFe _V`Íop$N0)ʄ Y8I`L ѠvNf(ZƘJ ~2cb.wB@wc o0t K0(DXB;昒3Ę5V7US7=B k.Ed\Z$T#)0/ d 'Tl8{ >h%6Hk&O1K얠z:!T#Kї]Ca61$P2< eӛu%Ciz`z2D&0qbs޾;9\O͇ä0o.9JknٮB%h~v|`RqT-~b[DYxe.QΒ`kF?ʨ CJom`ڒ^x^̉P" \cAگ7Mzo}fZچHjcQA>7- RqxG?Kת9+2an͑MB[Pq5`Ѵ?W$Ejh(7$L{WB_r('ׁ8'"kG`BL@Lh60 @[Vr]wx "4yEzaYI8rWOd0D oqz{{qzA&!uXHyUqow8t"4|h(xh{[WUdLJd@2 QX~e,/jO}E_8xzgG32s(׃3T\h?BE4h$*_rUAK &L"GapA>PT:ȍ$r$CN2sC1Ҩ49!'ehyBaF 0DUrDÏizP?dP%,ۡ(YTIi"Giĸq[1ؑ~B`Ȑh\"Ij/)O6LJQVՏj @oAӓ!uC2]wP&'蒀ihxy:Y>1 #wg)^I)D!?qwR/R~^YW$)%~~ r@QQjI`3Y-ؒ Yז@w1T~veod4AgT1&WKה!?jI)I" ^:]UG"Rx^?D= ~;QD,.,I{>Y&Ǜ^IDS/pљoo [ DKMlit4,~-'hgM]9-ix/$I4\ʩ0-XB 9z9(#58@& D 5L .LJx{%؁wQZ'T:W.̧81p'pmK""BiDܔwJ5ڞ0:#)S%zd#[~A"8{zzO: qzZh'qjaA"*|Jr٫Ƈ5;%*@-C97Èqs㹆,%"7 T_q؀!3]jx aR*\Jگڪ۪š98F:OY``[FDz8tK.'V)XfX\YjZE 03 zJ뇮J~&KJA [0jWj*rhP8QԘZ`u7mKyۂP޲?*jAz:EJRjQꪰ!{kz Kʴ({z-0ikEwI ۀ JpJQ 4w6m+i{⚇"j'Jp @3[5 9 @˹W(MPS䋺 8Ѿ+髩'&q-lg<4sGpeCP۬ L'KW2YBI$yˣRhY@|`~{@K䫯U 7ܹ۸8Lz9A5';ȦIހ#AA*6K+xK$-+ J) + +M  [-a `"[LP\\ Si:%%2q^K;zJj [O2DrlI^ A=ZIMJzCq49@·8!!;0jpēgLC!ʭG< %l:k c"l [7=8y\ZV%BT\AJ3fB*(8p@a;O#_H7HU,aw'܍#hrD=r7DaH#! i<8|xwqإxfWmU%sYm/a0 4J!e0C)1-w>!%0Lf1R٪= ]9B5_x:{5:'"IqCt<.g/8]؀MsLGt 0}h\ 12;}( ݹ']ٝusx5$2ݛY96!I* p+"Uvh/DQYqdQHY͠J#4ս-N1Sjn1YzI N9c DK ԯ̃7rY?G7:@lY`N7eX=RU=C6wO|d8=U=䢣ʳi %C桹ox#pg}[֗%7t0G}]ǔsF}ge}s.9^wn5<>f,"] ("샃 Q65Y'by%h̢#GBb&ߚ%,FюlP7qfNjp[W3fpNjf,jW`POk[o?,`GfZpMXMo`rrE?ckgNVE@pW443&4Fc>g@Nq[_@=89`4c0AO]܃?I2?8ruˎ(|\m d@'882;歹GPbxq^w nN0okF k$j@Jj /fJd nn'6o ͠ ~K8B 'lA!r[[7=pБ - zfgM=}TPEEt;ôTU^ŚU+w9UXe2-a;; ś׬ۮdحϭ^Ezcojx.&ӝ8zXfel`ΥMlO[lڵmƝ[n޽qW/txlŲq2Ч_7ؽoN{c퓲)+zﬨ j m4)ɲm20C$Tͭ֜P1ƪӰğ.[l bGD*X H#‰&J#4̟}fzD*&,!>g|l?(-n0,3 Ac:**Ӧ-54B-QEQHu4J)%2nRQ;'nA-4onjl >m|V ;e״F{m-K%X$1eo5|թ&[p&{=f3{B:ݓ?yjL,Lh;*wZ 4)nl*GBoTP1腮Ew@r YAήR[u!u.֋f\7s[w~6ZQZ_7[M/yOBg[mL@>wDRi騡fj,ƺjk}ggQ`Gio264`nmQIK LYw>\,Ia]C~46k)l0f#w-C7\/1iMIl2F'}oU>v<'3r5qo^yyGQcvֶa)ܖli3E;)ڱ(+nYK^Ž|X dǺ(?>Q10"&Gsb:Zw儤eҕV:&"?D$)5i免.Bo/!QJ), uxӉצ,ىA>'myɰ$TbI;!`}$E[kx1TӏZ *HimNVԣi:umfB)M]\bfǻskN%oGyR3ΌĤFX>fy2H4y&gT9Jܠ U@&*%pOÝkMVڄ.0;EZSh>$izBt{3f2L 7nq|DT9ōRt uEY%7:nUIZt?ӄzg:@B,Dfâ42NԱ~ 0g; o4DŽ)Ș<1k"'vu:M)McwI^צ|씈}&V޼x,IR.ʪJ tv=&`$k";#oi1.dC)5MEWnfSUIxdlA@̈́C3剓"S1 {>^xB^d`MT)Mx=Jmo5=kb1QEJڢ[ #YM([Eit>CUL;ZS)b>Q\qFȒy,Q 7N]FEd2OђޡB_Qz61]\4Զq }8.nF`}WZ1$ C&A=If+{ JW&llhkNrlg[͍ywў;}mn{6c3r;h l jt+ exkpiæ&yxE ( rFq 4r>Ũ!YDj|_Ўcs9:jt. V /d9pZ0D O D<hy Ϯd=$L{e8I6%+y1Ǝ]}{v%ߠ7f XTS1 ʕDZN F/C[lO"PP?H.l.W鹼[c#2@G7^y$q]u0%'"MJco4 04shOc~oP<'?S?ػ';!Z[maHoH-bK1ӢнӢ h06r@Cm1 #q:v0$&&4 !]T# U۩A :9|C9ɦEԣ&[ģ:]s!9a4 <)xZŨ1[\]tN DbV<8Q"CFSĿIܡDQa ;{Qz"{*eD\c 9)wdߓ)BY}E+0l! '^[@9Q<޻r#A1 '^-Zt*)'Z8J⃠[s.K:vt!*,||]L9HK Ba$9*)5<5ux"9Mʭ# (SHL|PJ͙ј|{ 250j9IIɟAqJ;LSCcQB2J\J~h2$.At˄31&8|-MԁŃ$"{YJZ{I,-ދ$5\Π4L ̓TLKJd#VIΔs>G ,D&ư v tZLOYJtN[qG(>2G0uqG)hbNI=|P*ǚd %7LvF!|5%If\Ԗ+a3ͬ"1Qx2éDD:">ZILK9ۭ3ݕYNRҜŒG^)J}c}y%vQ`zkD)OmkAQ,MC ` s6J<<O\ )R鲌 P O<Ԭ.$wx!jBm$9HqI!35ˑA&6D*M9cZ1"C3uoHvBQ2WHKĥF%*KAlNLN蜗dL\WAPu)kZ V*G' who1BO.j ;#aȖʸKI 9EPUd~К * ɠk`WI'F1# PvTj*Fw x؀L֣͊@$Qu$ m1 pi=kYUdҩZ''[܏ϺuڪVW/u9OĝH5ZstTVToZءֹ,:]a'|GMY,\ ҼeUu[v]]MzUqB $}}\z:dw Zl'&Z9#%u)%rmJ[io"ך[Ԋ#ԧm$G1ىSEb%;zR Yv|@&˿Fy MQX,e5e Jt3I ]Ġ aQ(jt=QTBFZދ1t-%-Vkn4h2n@>@Xm׭!AIn]WDPk0 E'Z#_݁!D=MI5GV>:Fid\Kf L?1[a^5D2`]FBQϱ'\ m-=9v-#ͦNkMם$k-P(39p.A`T2{A=$(g+fx]gvIwnzgYIgPe(5Z va~%0vn"`NHq#c=7]<' [qTlDʝe=YɘlЁnֻoQ#;C"046 ӗ[И6Nꭚjs*^j%HJNJE&Oɕmnx-Ae41^ ^ad4bV,A޺?N+UMH X$HK& ``0D4@' %-bfN$nkm21Hwzhގ~Nn֮>nھnӆ&T -5h2'p+e̒]G4qh#h3*f"gY'G6f_%#-|mH¨Y+Ș4q eVX|_G+'0spp/d)s@JBةlI+A;x>f[1ixWKyw؆;22 hYIYȢXO{X4K *VN֭3 BAl ^|8D  w빱gɢF"Mt)ӦNBu:wVmu+׮^n*pN`ϢMBnP#s-ݺvTN7nDf+xpә37,Kx1c9hPn%ߍfUtM&q6 o߶q,[@F/vߦ-pvK 0>ȃ?Տǭ9b1vb"nܑdxCw- 3~仇7/çYVCx#D{#} bDRttDpsE\L eXbRՄf&"Z.X?nm DXN XeҏG"%l#OvuhMM}!NuQw>k/\k޴ cNcJqSjpNBL8FcfId$wyg٧@,qhhk<if| 4Q(yMEnܴ%3~,~ OmvQQ^ez-bY\rJZfA1;TUe{c^ɥ@e-_C7M qq&%j8Al6vma.>f>A 4Y!,fnQ/_~{Hč~zKCk{moIOĂ$1 q>Ԓ#QRd= qhR dVIJ^H0¤~DT Jh+\ Z tE͈$ Ƿ#}m1b68aTs!0}mt m@@oIAI"(QP@vo")`7.h rYbcPHmC49҆%P?я2>!Q(ƯÍ iBKVoiAOR4M1z:$ip4 mf+=7NmLC+" :blGTF`hiFQ0v$A< -ͅ\ddh6L+~9DQG?(ǎCZˢ3V!s+?2ю !`(Q¤J/R)I^;8rrg$'@2E=aO %~۱7-|TVN@4r։Ard mA ,R40~:FCD"&}$,YMtl&a @D1dKƷm341H %}& n >AiA4Ja1Up]m6e.Rw4zdY V$P;TuuEBqbc4\V%|x#&ĩI woX7[ *olפ:!-?A8D +fʓb832FI2ȬK5mnؚ_ոa81aH+y!ɹF!hM#f+ryfepyAX3LLj]G>f6s| <źVüo4|>qTAoj@h LrLfi$ y鲑hbf@,.Y4a.#: Ys^FRfBFgMnCx(NdLHyؐs@Ԇ?$;y4y˴`Pˑ^7PnQՓfwm"i"heۘ3Y"iy*.bm_Yֺ!o2| 4֧T*2bڐlHN6*n0.֫\NPN۱9Cqi /u+=*r(&'݋k-; ]V6玔{IU xuN%=Q؃>s ҤFdA3+a -bGx~us|!e&bcl uSh!VKc#^e ٯ%A)o @F0_P"MF|-LJ#An U.Z$JB 9760PEbk$aeTZZ YI߉$eT%)rcӷbeDp&Yc@8XSOH;Zc"eɕ!2}X%yU e^ٜIX"tfTr7x^GR[]?XI@e0f-!C n!o q>q;wafr`t`gHQߋ]d&Tͼ[9٘f!9ɜDP5Ei'0Z (dxdXd1LRk[X T"mAy)5\$dWJ^XN mh DŽ(Z%ubrL!hhb ǔGxY#DLXUpR:L+%[7JFR> 3l靹=[؜J[a`#qTD֥%N?(ԇVpD=_HzG7rIpҡb @Ī>|(#4q~w>")EEDIW֪iCV܆9pb,d}"l]RB9[ҡP]`[Al\e^49^2ln, !f!*ԗÑd}DEBpxLhe̊4Apqepdq[8e'$mDpH@cMlV^Ѩ0eO[MV6!ƚ[!F3N,c;X K'iH~,A\c iVdZ=69Rn+߼px}dndLCqMi mJlȒd6 L9XL^_7ڣ0 4p ,.YDHOBHԇp { DBh4id<ڎP~Û-0e\RQ*g]$7Dp.)M"ڑ| @MؐvG־LیP܈5%Mf$")<]^($7m,JW#'π 4͘%ΠCXR!SO-N.-*j}$[C0sZ_;cVAFkM2Lz%d\I){2^47̀t7TlD l@#Ymݎ pN fT 4Ae 5(twZ? ΰ6<kHʬt~}\VBPDhmDe=kGl'F\p:VgM3kT.N l3PK68y+rϑX$V#Zmad FE|uL LFUǫ g{ԮAīho70Mz7a5V3vO8oe0%Q6qLؽRErU>4džG tCI|x6Z~ ;=6Js3GMà*i*xʄkYSzKy`_\!\seR{x!ǎM1eV_!N{wv;0|o? Gc%:[cXM/Qzgi['a 4Xc[z >hHtgc z>wQI|mq9;.7u/wD w~< ENhT$FtbCyC5-DyiI6Mh@ jwzze *2;1q%{⟇;(;lzeE1kΙ bhļ#s-eSSJ~}lS9;e{les>Zk|&2?*[w%w#vNˢx;T7'@8`A&TaÂaE1cGAvdI'QTeˏ$t9f͌dԹoV/(OG|g[сC9E:u>W]JŪ0 ;libcommons-dbcp-java-1.4.orig/src/site/site.xml0000644000175000017500000000513111333570550021423 0ustar drazzibdrazzib Commons DBCP /images/dbcp-logo-white.png /index.html libcommons-dbcp-java-1.4.orig/src/java/0000755000175000017500000000000011333570547017720 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/java/org/0000755000175000017500000000000011333570547020507 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/java/org/apache/0000755000175000017500000000000011333570547021730 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/0000755000175000017500000000000011333570547023403 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/jocl/0000755000175000017500000000000011337741616024333 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/jocl/package.html0000644000175000017500000000214011333570547026610 0ustar drazzibdrazzib Package Documentation for org.apache.commons.jocl

Java Object Configuration Language, an XML application for describing Java Objects to be instantiated. See {@link org.apache.commons.jocl.JOCLContentHandler}.

libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/jocl/JOCLContentHandler.java0000644000175000017500000007653211333570547030572 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.jocl; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; import java.lang.reflect.InvocationTargetException; import java.io.InputStream; import java.io.Reader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.ArrayList; // to do: // + add support for strings as CDATA (makes multiline strings easier, for example) // ? some kind of support for invoking methods? /** * A {@link org.xml.sax.ContentHandler} * for the Java Object Configuration Language. *

* JOCL provides an XML syntax for constructing arbitrary Java * {@link java.lang.Object} instances. It does not define a full * XML document type (there's no root element), but rather an * XML fragment describing the {@link java.lang.Object Objects} to be * constructed. *

* In a JOCL fragment, one may define a series of objects using * the object element. A trivial example is: *

 <object class="java.util.Date"/>
* which constructs an instance of java.util.Date * using the no-argument constructor. *

* After a "root-level" <object> element has been processed * (that is, once {@link #endElement(java.lang.String,java.lang.String,java.lang.String)} * has been invoked by the {@link XMLReader}), it will be appended to a list of Objects * maintained by the JOCLContentHandler. *

* (See {@link #size}, * {@link #clear}, * {@link #clear(int)}, * {@link #getType(int)}, * {@link #getValue(int)}, * {@link #getTypeArray}, * and * {@link #getValueArray}.) *

* You can list multiple object elements in a fragment. For example, * after processing the JOCL fragment: *

 <object class="java.util.Date"/>
 * <object class="java.util.Date"/>
* The {@link #getTypeArray} method * will return an array composed * of two instances of java.util.Date. The sequence of * {@link java.lang.Object Objects} in the array * will correspond to the sequence of <object> elements in the JOCL fragment. *

* As we've seen, when used with no child-elements, the <object> * tag will cause the no-argument constructor of the specified class to be invoked. * It is also possible to nest <object> tags to provide arguments * for the constructor. * For example, the fragment: *

 <object class="mypackage.Foo">
 *   <object class="mypackage.Bar"/>
 * </object>
* will add an instance of mypackage.Foo to the object list, constructed via * new mypackage.Foo(new mypackage.Bar()). *

* There is a special syntax available creating primitive values and arguments, * as well as for constructing {@link java.lang.String String}s. Some examples: *

*

 <byte value="3"/>
 * <boolean value="false"/>
 * <char value="c"/>
 * <double value="3.14159"/>
 * <float value="3.14"/>
 * <int value="17"/>
 * <long value="1700000"/>
 * <short value="1"/>
 * <string value="The quick brown fox..."/>
*

* When invoked at the "root" level (that is, with no <object> parent), * this will cause the corresponding "object wrapper" to be added to the list of * {@link java.lang.Object Object}s. The {@link #getType type} for these * objects will reflect the proper primitive type, however. When invoked with an * <object> parent, these will be treated as primitive arguments to the * specified {@link java.lang.Object Object}'s constructor. For example, while: *

*

 <int value="5"/>
 * <int value="26"/>
 * <int value="100"/>
*

* results in three {@link java.lang.Integer} instances being added to the * list of values, with types corresponding to {@link java.lang.Integer}, the fragment: *

*

 <int value="5"/>
 * <int value="26"/>
 * <int value="100"/>
*

* results in three {@link java.lang.Integer} instances being added to the * list of values, with types corresponding to {@link java.lang.Integer#TYPE}. *

* Hence if you want to invoke the mypackage.Foo(java.lang.Integer,java.lang.Integer,java.lang.Integer) * constructor, use: *

 <object class="mypackage.Foo"/>
 *   <object class="java.lang.Integer"><int value="5"/></object>
 *   <object class="java.lang.Integer"><int value="26"/></object>
 *   <object class="java.lang.Integer"><int value="100"/></object>
 * </object>
*

* If you want to invoke the mypackage.Foo(int,int,int) * constructor, use: *

 <object class="mypackage.Foo"/>
 *   <int value="5"/>
 *   <int value="26"/>
 *   <int value="100"/>
 * </object>
*

* If you'd like to creat a null object, use: *

 <object class="mypackage.Bar" null="true"/>
*

* Here's a simple but complete example: *

 <?xml version="1.0"?>
 * <arbitrary-root xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">
 *   <string value="Hello World!"/>
 *   <string/>
 *   <boolean/>
 *   <boolean value="true"/>
 *   <byte value="1"/>
 *   <short value="1"/>
 *   <int value="1"/>
 *   <long value="1"/>
 *   <float value="1.0"/>
 *   <double value="1.0"/>
 *   <object class="java.util.Date"/>
 *   <object class="java.util.Date">
 *    <int value="1"/>
 *    <int value="1"/>
 *    <int value="1"/>
 *   </object>
 * </arbitrary-root>
*

* Formally, a DTD for the JOCL grammar is as follows: *

*

 * <!ELEMENT object (object|array|collection|list|byte|boolean|char|double|float|int|long|short|string)*>
 * <!ATTLIST object
 *   class CDATA #REQUIRED
 *   null (true|false) "false">
 *
 * <!ELEMENT byte EMPTY>
 * <!ATTLIST byte value CDATA #REQUIRED>
 *
 * <!ELEMENT boolean EMPTY>
 * <!ATTLIST boolean value (true|false) #REQUIRED>
 *
 * <!ELEMENT char EMPTY>
 * <!ATTLIST char value CDATA #REQUIRED>
 *
 * <!ELEMENT double EMPTY>
 * <!ATTLIST double value CDATA #REQUIRED>
 *
 * <!ELEMENT float EMPTY>
 * <!ATTLIST float value CDATA #REQUIRED>
 *
 * <!ELEMENT int EMPTY>
 * <!ATTLIST int value CDATA #REQUIRED>
 *
 * <!ELEMENT long EMPTY>
 * <!ATTLIST long value CDATA #REQUIRED>
 *
 * <!ELEMENT short EMPTY>
 * <!ATTLIST short value CDATA #REQUIRED>
 *
 * <!ELEMENT string EMPTY>
 * <!ATTLIST string value CDATA #REQUIRED>
 * 
*

* This class can also be used as a base class for {@link org.xml.sax.ContentHandler}s * that include JOCL as part of their grammar. Simply extend this class, and override the * {@link #startElement}, * {@link #characters}, * and {@link #endElement} methods to handle * your tags, and invoke the method of the parent class (i.e., super.XXX for * elements and data that you don't handle. *

* A number of static methods are available for simply reading a list of objects from * a {@link InputStream}, {@link Reader} or {@link InputSource}. *

* Note that this class is not synchronized. *

* @author Rodney Waldhoff * @version $Revision: 883416 $ $Date: 2009-11-23 12:12:14 -0500 (Mon, 23 Nov 2009) $ */ public class JOCLContentHandler extends DefaultHandler { //--- Static Methods --------------------------------------------- /** * A simple tester method. Reads a JOCL document from standard in * and prints a list of the objects created to standard out. * (Use the org.xml.sax.driver system property to specify * an {@link XMLReader}. */ public static void main(String[] args) throws Exception { JOCLContentHandler jocl = JOCLContentHandler.parse(System.in,null); for(int i=0;i\t" + jocl.getValue(i)); } } /** * Parses a JOCL document from the specified file, using the * {@link XMLReader} specified by the org.xml.sax.driver * property. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param f a {@link File} containing the JOCL document * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(File f) throws SAXException, FileNotFoundException, IOException { return JOCLContentHandler.parse(new FileInputStream(f),null); } /** * Parses a JOCL document from the specified {@link Reader}, using the * {@link XMLReader} specified by the org.xml.sax.driver * property. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param in a {@link Reader} containing the JOCL document * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(Reader in) throws SAXException, IOException { return JOCLContentHandler.parse(new InputSource(in),null); } /** * Parses a JOCL document from the specified {@link InputStream}, using the * {@link XMLReader} specified by the org.xml.sax.driver * property. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param in a {@link InputStream} containing the JOCL document * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(InputStream in) throws SAXException, IOException { return JOCLContentHandler.parse(new InputSource(in),null); } /** * Parses a JOCL document from the specified {@link InputSource}, using thethe * {@link XMLReader} specified by the org.xml.sax.driver * property. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param in a {@link InputSource} containing the JOCL document * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(InputSource in) throws SAXException, IOException { return JOCLContentHandler.parse(in,null); } /** * Parses a JOCL document from the specified file, using the * {@link XMLReader} specified by the org.xml.sax.driver * property. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param f a {@link File} containing the JOCL document * @param reader the {@link XMLReader} to use to parse the file * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(File f, XMLReader reader) throws SAXException, FileNotFoundException, IOException { return JOCLContentHandler.parse(new FileInputStream(f),reader); } /** * Parses a JOCL document from the specified {@link Reader}, using the specified * {@link XMLReader}. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param in a {@link Reader} containing the JOCL document * @param reader the {@link XMLReader} to use to parse the document * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(Reader in, XMLReader reader) throws SAXException, IOException { return JOCLContentHandler.parse(new InputSource(in),reader); } /** * Parses a JOCL document from the specified {@link InputStream}, using the specified * {@link XMLReader}. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param in a {@link InputStream} containing the JOCL document * @param reader the {@link XMLReader} to use to parse the document * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(InputStream in, XMLReader reader) throws SAXException, IOException { return JOCLContentHandler.parse(new InputSource(in),reader); } /** * Parses a JOCL document from the specified {@link InputSource}, using the * specified {@link XMLReader}. * The returned {@link JOCLContentHandler} will contain the * list of objects described by the file. * @param in a {@link InputSource} containing the JOCL document * @param reader the {@link XMLReader} to use to parse the document * @return a {@link JOCLContentHandler} containing the list of objects described by the JOCL document */ public static JOCLContentHandler parse(InputSource in, XMLReader reader) throws SAXException, IOException { JOCLContentHandler jocl = new JOCLContentHandler(); if(null == reader) { reader = XMLReaderFactory.createXMLReader(); } reader.setContentHandler(jocl); reader.parse(in); return jocl; } //--- Construtors ------------------------------------------------ /** * Equivalent to {@link #JOCLContentHandler(boolean,boolean,boolean,boolean) JOCLContentHandler(true,true,true,true)}. */ public JOCLContentHandler() { this(true,true,true,true); } /** * Construct a JOCLContentHandler. * @param emptyEltNS when true I should assume any element with an empty namespace is within the JOCL namespace * @param joclEltPrefix when true I should assume any element who's prefix is jocl: and who's namespace is empty is within the JOCL namespace * @param emptyAttrNS when true I should assume any attribute with an empty namespace is within the JOCL namespace * @param joclAttrPrefix when true I should assume any attribute who's prefix is jocl: and who's namespace is empty is within the JOCL namespace */ public JOCLContentHandler(boolean emptyEltNS, boolean joclEltPrefix, boolean emptyAttrNS, boolean joclAttrPrefix) { _acceptEmptyNamespaceForElements = emptyEltNS; _acceptJoclPrefixForElements = joclEltPrefix; _acceptEmptyNamespaceForAttributes = emptyAttrNS; _acceptJoclPrefixForAttributes = joclAttrPrefix; } //--- Public Methods - Accessing Objects ------------------------- /** * Returns the number of values and types in my list. * @return the number of values and types in my list. */ public int size() { return _typeList.size(); } /** * Clears all the values and types in my list. */ public void clear() { _typeList = new ArrayList(); _valueList = new ArrayList(); } /** * Removes the value/type pair at the specified index. */ public void clear(int i) { _typeList.remove(i); _valueList.remove(i); } /** * Returns the type of the object at the specified index. */ public Class getType(int i) { return(Class)(_typeList.get(i)); } /** * Returns the value of the object at the specified index. */ public Object getValue(int i) { return _valueList.get(i); } /** * Returns a shallow copy of my list of values. */ public Object[] getValueArray() { return _valueList.toArray(); } /** * Returns a shallow copy of my list of types. */ public Object[] getTypeArray() { return _typeList.toArray(); } //--- Public Methods - DocumentHandler --------------------------- public void startElement(String uri, String localName, String qname, Attributes attr) throws SAXException { try { if(isJoclNamespace(uri,localName,qname)) { if(ELT_OBJECT.equals(localName)) { String cname = getAttributeValue(ATT_CLASS,attr); String isnullstr = getAttributeValue(ATT_ISNULL,attr,"false"); boolean isnull = ("true".equalsIgnoreCase(isnullstr) || "yes".equalsIgnoreCase(isnullstr)); _cur = new ConstructorDetails(cname,_cur,isnull); } else if(ELT_ARRAY.equals(localName)) { _cur = new ConstructorDetails(Object[].class,_cur,false,true); } else if(ELT_COLLECTION.equals(localName)) { _cur = new ConstructorDetails(Collection.class,_cur,false,true); } else if(ELT_LIST.equals(localName)) { _cur = new ConstructorDetails(List.class,_cur,false,true); } else if(ELT_BOOLEAN.equals(localName)) { String valstr = getAttributeValue(ATT_VALUE,attr,"false"); boolean val = ("true".equalsIgnoreCase(valstr) || "yes".equalsIgnoreCase(valstr)); addObject(Boolean.TYPE,Boolean.valueOf(val)); } else if(ELT_BYTE.equals(localName)) { byte val = Byte.parseByte(getAttributeValue(ATT_VALUE,attr,"0")); addObject(Byte.TYPE,new Byte(val)); } else if(ELT_CHAR.equals(localName)) { char val = '\u0000'; String valstr = getAttributeValue(ATT_VALUE,attr); if(null == valstr) { val = '\u0000'; } else if(valstr.length() > 1) { throw new SAXException("if present, char value must be exactly one character long"); } else if(valstr.length()==1) { val = valstr.charAt(0); } else if(valstr.length()==0) { throw new SAXException("if present, char value must be exactly one character long"); } addObject(Character.TYPE,new Character(val)); } else if(ELT_DOUBLE.equals(localName)) { double val = Double.parseDouble(getAttributeValue(ATT_VALUE,attr,"0")); addObject(Double.TYPE,new Double(val)); } else if(ELT_FLOAT.equals(localName)) { float val = Float.parseFloat(getAttributeValue(ATT_VALUE,attr,"0")); addObject(Float.TYPE,new Float(val)); } else if(ELT_INT.equals(localName)) { int val = Integer.parseInt(getAttributeValue(ATT_VALUE,attr,"0")); addObject(Integer.TYPE,new Integer(val)); } else if(ELT_LONG.equals(localName)) { long val = Long.parseLong(getAttributeValue(ATT_VALUE,attr,"0")); addObject(Long.TYPE,new Long(val)); } else if(ELT_SHORT.equals(localName)) { short val = Short.parseShort(getAttributeValue(ATT_VALUE,attr,"0")); addObject(Short.TYPE,new Short(val)); } else if(ELT_STRING.equals(localName)) { String val = getAttributeValue(ATT_VALUE,attr); addObject("".getClass(),val); } else { // unrecognized JOCL element warning? } } } catch(NumberFormatException e) { throw new SAXException(e); } catch(ClassNotFoundException e) { throw new SAXException(e); } } public void endElement(String uri, String localName, String qname) throws SAXException { try { if(isJoclNamespace(uri,localName,qname)) { if(ELT_OBJECT.equals(localName) || ELT_ARRAY.equals(localName) || ELT_COLLECTION.equals(localName) || ELT_LIST.equals(localName)) { ConstructorDetails temp = _cur; _cur = _cur.getParent(); if(null == _cur) { _typeList.add(temp.getType()); _valueList.add(temp.createObject()); } else { _cur.addArgument(temp.getType(),temp.createObject()); } } /* else if(ELT_BOOLEAN.equals(localName)) { // nothing to do here } else if(ELT_BYTE.equals(localName)) { // nothing to do here } else if(ELT_CHAR.equals(localName)) { // nothing to do here } else if(ELT_DOUBLE.equals(localName)) { // nothing to do here } else if(ELT_FLOAT.equals(localName)) { // nothing to do here } else if(ELT_INT.equals(localName)) { // nothing to do here } else if(ELT_LONG.equals(localName)) { // nothing to do here } else if(ELT_SHORT.equals(localName)) { // nothing to do here } else if(ELT_STRING.equals(localName)) { // nothing to do here } else { // unrecognized JOCL element warning? } */ } } catch(Exception e) { throw new SAXException(e); } } public void setDocumentLocator(Locator locator) { _locator = locator; } //--- Protected Methods ------------------------------------------ /** * Returns true if the given attributes define an * element within the JOCL namespace (according to my current * configuration.) * * @see #_acceptEmptyNamespaceForElements * @see #_acceptJoclPrefixForElements */ protected boolean isJoclNamespace(String uri, String localname, String qname) { if(JOCL_NAMESPACE_URI.equals(uri)) { return true; } else if(_acceptEmptyNamespaceForElements && (null == uri || "".equals(uri))) { return true; } else if(_acceptJoclPrefixForElements && (null == uri || "".equals(uri)) && qname.startsWith(JOCL_PREFIX)) { return true; } else { return false; } } /** * Equivalent to {@link #getAttributeValue(java.lang.String,org.xml.sax.Attributes,java.lang.String) getAttributeValue(localname,attr,null)}. */ protected String getAttributeValue(String localname, Attributes attr) { return getAttributeValue(localname,attr,null); } /** * Returns the value of attribute with the given * localname within the JOCL * namespace from the given set of {@link Attributes}. * If no such attribute can be found, returns * implied. * * @param localname the unqualified name of the attribute to look for * @param attr the Attributes in which to find the value * @param implied the default value for the attribute * @return the value of attribute with the given * localname within the JOCL * namespace from the given set of {@link Attributes}. * If no such attribute can be found, returns * implied. */ protected String getAttributeValue(String localname, Attributes attr, String implied) { String val = attr.getValue(JOCL_NAMESPACE_URI,localname); if(null == val && _acceptEmptyNamespaceForAttributes) { val = attr.getValue("",localname); } if(null == val && _acceptJoclPrefixForAttributes) { val = attr.getValue("",JOCL_PREFIX + localname); } return(null == val ? implied : val); } /** * Add the specified object either to my type/value list, or * as an argument to the object I'm currently constructing. */ protected void addObject(Class type, Object val) { if(null == _cur) { _typeList.add(type); _valueList.add(val); } else { _cur.addArgument(type,val); } } //--- Protected Attributes --------------------------------------- /** * The JOCL namespace URI, http://apache.org/xml/xmlns/jakarta/commons/jocl. */ public static final String JOCL_NAMESPACE_URI = "http://apache.org/xml/xmlns/jakarta/commons/jocl"; /** * The default JOCL prefix, jocl:. */ public static final String JOCL_PREFIX = "jocl:"; /** * A list of the types ({@link Class}es) already created via the parse. */ protected ArrayList _typeList = new ArrayList(); /** * A list of the values ({@link Object}s) already created via the parse. */ protected ArrayList _valueList = new ArrayList(); /** * The object I'm currently working on. */ protected ConstructorDetails _cur = null; /** * When true, I will treat elements with an * empty namespace URI as part of the JOCL namespace. * * @see #JOCL_NAMESPACE_URI */ protected boolean _acceptEmptyNamespaceForElements = true; /** * When true, I will treat elements with the * {@link #JOCL_PREFIX} but no namespace URI as being * mapped to the jocl namespace. * * @see #JOCL_PREFIX * @see #JOCL_NAMESPACE_URI */ protected boolean _acceptJoclPrefixForElements = true; /** * When true, I will treat attributes with an * empty namespace URI as part of the JOCL namespace. * * @see #JOCL_NAMESPACE_URI */ protected boolean _acceptEmptyNamespaceForAttributes = true; /** * When true, I will treat attributes with the * {@link #JOCL_PREFIX} but no namespace URI as being * mapped to the jocl namespace. * * @see #JOCL_PREFIX * @see #JOCL_NAMESPACE_URI */ protected boolean _acceptJoclPrefixForAttributes = true; /** My {@link Locator}. */ protected Locator _locator = null; /** The name of the "object" element. */ protected static final String ELT_OBJECT = "object"; /** The name of the "array" element. * @since 1.2.2 */ protected static final String ELT_ARRAY = "array"; /** The name of the "collection" element. * @since 1.2.2 */ protected static final String ELT_COLLECTION = "collection"; /** The name of the "list" element. * @since 1.2.2 */ protected static final String ELT_LIST = "list"; /** The name of the "object" element's "class" attribute. */ protected static final String ATT_CLASS = "class"; /** The name of the "object" element's "isnull" attribute. */ protected static final String ATT_ISNULL = "null"; /** The name of the "boolean" element. */ protected static final String ELT_BOOLEAN = "boolean"; /** The name of the "byte" element. */ protected static final String ELT_BYTE = "byte"; /** The name of the "char" element. */ protected static final String ELT_CHAR = "char"; /** The name of the "double" element. */ protected static final String ELT_DOUBLE = "double"; /** The name of the "float" element. */ protected static final String ELT_FLOAT = "float"; /** The name of the "int" element. */ protected static final String ELT_INT = "int"; /** The name of the "long" element. */ protected static final String ELT_LONG = "long"; /** The name of the "short" element. */ protected static final String ELT_SHORT = "short"; /** The name of the "string" element. */ protected static final String ELT_STRING = "string"; /** The name of the "value" attribute. */ protected static final String ATT_VALUE = "value"; static class ConstructorDetails { private ConstructorDetails _parent = null; private Class _type = null; private ArrayList _argTypes = null; private ArrayList _argValues = null; private boolean _isnull = false; private boolean _isgroup = false; public ConstructorDetails(String classname, ConstructorDetails parent) throws ClassNotFoundException { this(Class.forName(classname),parent,false,false); } public ConstructorDetails(String classname, ConstructorDetails parent, boolean isnull) throws ClassNotFoundException { this(Class.forName(classname),parent,isnull,false); } /** * @since 1.3 */ public ConstructorDetails(String classname, ConstructorDetails parent, boolean isnull, boolean isgroup) throws ClassNotFoundException { this(Class.forName(classname),parent,isnull,isgroup); } /** * @since 1.3 */ public ConstructorDetails(Class type, ConstructorDetails parent, boolean isnull, boolean isgroup) { _parent = parent; _type = type; _argTypes = new ArrayList(); _argValues = new ArrayList(); _isnull = isnull; _isgroup = isgroup; } public void addArgument(Object value) { addArgument(value.getClass(),value); } public void addArgument(Class type, Object val) { if(_isnull) { throw new NullPointerException("can't add arguments to null instances"); } _argTypes.add(type); _argValues.add(val); } public Class getType() { return _type; } public ConstructorDetails getParent() { return _parent; } public Object createObject() throws InstantiationException, IllegalAccessException, InvocationTargetException { if(_isnull) { return null; } else if( _isgroup ) { if (_type.equals(Object[].class)) { return _argValues.toArray(); } else if (_type.equals(Collection.class) || _type.equals(List.class)) { return _argValues; } else { throw new IllegalStateException("implementation error: unhandled _type:" + _type); } } else { Class k = getType(); Class[] argtypes = (Class[])_argTypes.toArray(new Class[0]); Object[] argvals = _argValues.toArray(); return ConstructorUtil.invokeConstructor(k,argtypes,argvals); } } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/jocl/ConstructorUtil.java0000644000175000017500000001012411333570547030356 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.jocl; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * Miscellaneous {@link Constructor} related utility functions. * * @author Rodney Waldhoff * @version $Revision: 479137 $ $Date: 2006-11-25 10:51:48 -0500 (Sat, 25 Nov 2006) $ */ public class ConstructorUtil { /** * Returns a {@link Constructor} for the given method signature, or null * if no such Constructor can be found. * * @param type the (non-null) type of {@link Object} the returned {@link Constructor} should create * @param argTypes a non-null array of types describing the parameters to the {@link Constructor}. * @return a {@link Constructor} for the given method signature, or null * if no such Constructor can be found. * @see #invokeConstructor */ public static Constructor getConstructor(Class type, Class[] argTypes) { if(null == type || null == argTypes) { throw new NullPointerException(); } Constructor ctor = null; try { ctor = type.getConstructor(argTypes); } catch(Exception e) { ctor = null; } if(null == ctor) { // no directly declared matching constructor, // look for something that will work // XXX this should really be more careful to // adhere to the jls mechanism for late binding Constructor[] ctors = type.getConstructors(); for(int i=0;itype * using a {@link Constructor} described by the given parameter types * and values. * * @param type the type of {@link Object} to be created * @param argTypes a non-null array of types describing the parameters to the {@link Constructor}. * @param argValues a non-null array containing the values of the parameters to the {@link Constructor}. * @return a new instance of the specified type * using a {@link Constructor} described by the given parameter types * and values. * @exception InstantiationException * @exception IllegalAccessException * @exception InvocationTargetException */ public static Object invokeConstructor(Class type, Class[] argTypes, Object[] argValues) throws InstantiationException, IllegalAccessException, InvocationTargetException { return ConstructorUtil.getConstructor(type,argTypes).newInstance(argValues); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/0000755000175000017500000000000011337741616024314 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/0000755000175000017500000000000011337741616025710 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java0000644000175000017500000002470611333570547032137 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import org.apache.commons.dbcp.DelegatingConnection; import org.apache.commons.pool.ObjectPool; import java.sql.Connection; import java.sql.SQLException; /** * ManagedConnection is responsible for managing a database connection in a transactional environment * (typically called "Container Managed"). A managed connection operates like any other connection * when no global transaction (a.k.a. XA transaction or JTA Transaction) is in progress. When a * global transaction is active a single physical connection to the database is used by all * ManagedConnections accessed in the scope of the transaction. Connection sharing means that all * data access during a transaction has a consistent view of the database. When the global transaction * is committed or rolled back the enlisted connections are committed or rolled back. Typically upon * transaction completion, a connection returns to the auto commit setting in effect before being * enlisted in the transaction, but some vendors do not properly implement this. * * When enlisted in a transaction the setAutoCommit(), commit(), rollback(), and setReadOnly() methods * throw a SQLException. This is necessary to assure that the transaction completes as a single unit. * * @author Dain Sundstrom * @version $Revision$ */ public class ManagedConnection extends DelegatingConnection { private final ObjectPool pool; private final TransactionRegistry transactionRegistry; private final boolean accessToUnderlyingConnectionAllowed; private TransactionContext transactionContext; private boolean isSharedConnection; public ManagedConnection(ObjectPool pool, TransactionRegistry transactionRegistry, boolean accessToUnderlyingConnectionAllowed) throws SQLException { super(null); this.pool = pool; this.transactionRegistry = transactionRegistry; this.accessToUnderlyingConnectionAllowed = accessToUnderlyingConnectionAllowed; updateTransactionStatus(); } protected void checkOpen() throws SQLException { super.checkOpen(); updateTransactionStatus(); } private void updateTransactionStatus() throws SQLException { // if there is a is an active transaction context, assure the transaction context hasn't changed if (transactionContext != null) { if (transactionContext.isActive()) { if (transactionContext != transactionRegistry.getActiveTransactionContext()) { throw new SQLException("Connection can not be used while enlisted in another transaction"); } return; } else { // transaction should have been cleared up by TransactionContextListener, but in // rare cases another lister could have registered which uses the connection before // our listener is called. In that rare case, trigger the transaction complete call now transactionComplete(); } } // the existing transaction context ended (or we didn't have one), get the active transaction context transactionContext = transactionRegistry.getActiveTransactionContext(); // if there is an active transaction context and it already has a shared connection, use it if (transactionContext != null && transactionContext.getSharedConnection() != null) { // A connection for the connection factory has already been enrolled // in the transaction, replace our delegate with the enrolled connection // return current connection to the pool Connection connection = getDelegateInternal(); setDelegate(null); if (connection != null) { try { pool.returnObject(connection); } catch (Exception ignored) { // whatever... try to invalidate the connection try { pool.invalidateObject(connection); } catch (Exception ignore) { // no big deal } } } // add a listener to the transaction context transactionContext.addTransactionContextListener(new CompletionListener()); // set our delegate to the shared connection setDelegate(transactionContext.getSharedConnection()); // remember that we are using a shared connection so it can be cleared after the // transaction completes isSharedConnection = true; } else { // if our delegate is null, create one if (getDelegateInternal() == null) { try { // borrow a new connection from the pool Connection connection = (Connection) pool.borrowObject(); setDelegate(connection); } catch (Exception e) { throw (SQLException) new SQLException("Unable to acquire a new connection from the pool").initCause(e); } } // if we have a transaction, out delegate becomes the shared delegate if (transactionContext != null) { // add a listener to the transaction context transactionContext.addTransactionContextListener(new CompletionListener()); // register our connection as the shared connection try { transactionContext.setSharedConnection(getDelegateInternal()); } catch (SQLException e) { // transaction is hosed transactionContext = null; throw e; } } } } public void close() throws SQLException { if (!_closed) { try { // don't actually close the connection if in a transaction // the connection will be closed by the transactionComplete method if (transactionContext == null) { getDelegateInternal().close(); } } finally { _closed = true; } } } /** * Delegates to {@link ManagedConnection#transactionComplete()} * for transaction completion events. */ protected class CompletionListener implements TransactionContextListener { public void afterCompletion(TransactionContext completedContext, boolean commited) { if (completedContext == transactionContext) { transactionComplete(); } } } protected void transactionComplete() { transactionContext = null; // if we were using a shared connection, clear the reference now that the transaction has completed if (isSharedConnection) { // for now, just set the delegate to null, it will be created later if needed setDelegate(null); isSharedConnection = false; } // if this connection was closed during the transaction and there is still a delegate present close it Connection delegate = getDelegateInternal(); if (_closed && delegate != null) { try { setDelegate(null); // don't actually close the connection if in a transaction if (!delegate.isClosed()) { // don't use super.close() because it calls passivate() which marks the // the connection as closed without returning it to the pool delegate.close(); } } catch (SQLException ignored) { // not a whole lot we can do here as connection is closed // and this is a transaction callback so there is no // way to report the error } finally { _closed = true; } } } // // The following methods can't be used while enlisted in a transaction // public void setAutoCommit(boolean autoCommit) throws SQLException { if (transactionContext != null) { throw new SQLException("Auto-commit can not be set while enrolled in a transaction"); } super.setAutoCommit(autoCommit); } public void commit() throws SQLException { if (transactionContext != null) { throw new SQLException("Commit can not be set while enrolled in a transaction"); } super.commit(); } public void rollback() throws SQLException { if (transactionContext != null) { throw new SQLException("Commit can not be set while enrolled in a transaction"); } super.rollback(); } public void setReadOnly(boolean readOnly) throws SQLException { if (transactionContext != null) { throw new SQLException("Read-only can not be set while enrolled in a transaction"); } super.setReadOnly(readOnly); } // // Methods for accessing the delegate connection // /** * If false, getDelegate() and getInnermostDelegate() will return null. * @return if false, getDelegate() and getInnermostDelegate() will return null */ public boolean isAccessToUnderlyingConnectionAllowed() { return accessToUnderlyingConnectionAllowed; } public Connection getDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return getDelegateInternal(); } else { return null; } } public Connection getInnermostDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return super.getInnermostDelegateInternal(); } else { return null; } } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/PoolableManagedConnectionFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/PoolableManagedConnectionFact0000644000175000017500000001364711333570547033475 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import java.sql.Connection; import java.util.Collection; import org.apache.commons.dbcp.AbandonedConfig; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingConnection; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.KeyedObjectPoolFactory; import org.apache.commons.pool.ObjectPool; /** * A {@link PoolableConnectionFactory} that creates {@link PoolableManagedConnection}s. * * @version $Revision$ $Date$ */ public class PoolableManagedConnectionFactory extends PoolableConnectionFactory { /** Transaction registry associated with connections created by this factory */ private final TransactionRegistry transactionRegistry; /** * Create a PoolableManagedConnectionFactory and attach it to a connection pool. * * @param connFactory XAConnectionFactory * @param pool connection pool * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling * {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. * Should return at least one row. Using null turns off validation. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s */ public PoolableManagedConnectionFactory(XAConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit) { super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit); this.transactionRegistry = connFactory.getTransactionRegistry(); } /** * Create a PoolableManagedConnectionFactory and attach it to a connection pool. * * @param connFactory XAConnectionFactory * @param pool connection pool * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling * {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. * Should return at least one row. Using null turns off validation. * @param validationQueryTimeout the number of seconds that validation queries will wait for database response * before failing. Use a value less than or equal to 0 for no timeout. * @param connectionInitSqls a Collection of SQL statements to initialize {@link Connection}s. * Using null turns off initialization. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog the default "catalog" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects */ public PoolableManagedConnectionFactory(XAConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, int validationQueryTimeout, Collection connectionInitSqls, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config) { super(connFactory, pool, stmtPoolFactory, validationQuery, validationQueryTimeout, connectionInitSqls, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog, config); this.transactionRegistry = connFactory.getTransactionRegistry(); } /** * Uses the configured XAConnectionFactory to create a {@link PoolableManagedConnection}. * Throws IllegalStateException if the connection factory returns null. * Also initializes the connection using configured initialization sql (if provided) * and sets up a prepared statement pool associated with the PoolableManagedConnection * if statement pooling is enabled. */ synchronized public Object makeObject() throws Exception { Connection conn = _connFactory.createConnection(); if (conn == null) { throw new IllegalStateException("Connection factory returned null from createConnection"); } initializeConnection(conn); if(null != _stmtPoolFactory) { KeyedObjectPool stmtpool = _stmtPoolFactory.createPool(); conn = new PoolingConnection(conn,stmtpool); stmtpool.setFactory((PoolingConnection)conn); } return new PoolableManagedConnection(transactionRegistry,conn,_pool,_config); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/package.html0000644000175000017500000000345211333570547030174 0ustar drazzibdrazzib

This package provides support for pooling of ManagedConnections. A managed connection is responsible for managing a database connection in a transactional environment (typically called Container Managed). A managed connection opperates like any other connection when no gloabal transaction (a.k.a. XA transaction or JTA Transaction) is in progress. When a global transaction is active a single physical connection to the database is used by all ManagedConnections accessed in the scope of the transaction. Connection sharing means that all data access during a transaction has a consistent view of the database. When the global transaction is committed or rolled back the enlisted connections are committed or rolled back.

This package supports full XADataSources and non-XA data sources using local transaction semantics. non-XA data sources commit and rollback as part of the transaction but are not recoverable in the case of an error because they do not implement the two-phase commit protocol.

././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/LocalXAConnectionFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/LocalXAConnectionFactory.java0000644000175000017500000003100611333570547033405 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import org.apache.commons.dbcp.ConnectionFactory; import javax.transaction.TransactionManager; import javax.transaction.xa.XAException; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; import java.sql.Connection; import java.sql.SQLException; /** * An implementation of XAConnectionFactory which manages non-XA connections in XA transactions. A non-XA connection * commits and rolls back as part of the XA transaction, but is not recoverable since the connection does not implement * the 2-phase protocol. * * @author Dain Sundstrom * @version $Revision$ */ public class LocalXAConnectionFactory implements XAConnectionFactory { protected TransactionRegistry transactionRegistry; protected ConnectionFactory connectionFactory; /** * Creates an LocalXAConnectionFactory which uses the specified connection factory to create database * connections. The connections are enlisted into transactions using the specified transaction manager. * * @param transactionManager the transaction manager in which connections will be enlisted * @param connectionFactory the connection factory from which connections will be retrieved */ public LocalXAConnectionFactory(TransactionManager transactionManager, ConnectionFactory connectionFactory) { if (transactionManager == null) throw new NullPointerException("transactionManager is null"); if (connectionFactory == null) throw new NullPointerException("connectionFactory is null"); this.transactionRegistry = new TransactionRegistry(transactionManager); this.connectionFactory = connectionFactory; } public TransactionRegistry getTransactionRegistry() { return transactionRegistry; } public Connection createConnection() throws SQLException { // create a new connection Connection connection = connectionFactory.createConnection(); // create a XAResource to manage the connection during XA transactions XAResource xaResource = new LocalXAResource(connection); // register the xa resource for the connection transactionRegistry.registerConnection(connection, xaResource); return connection; } /** * LocalXAResource is a fake XAResource for non-XA connections. When a transaction is started * the connection auto-commit is turned off. When the connection is committed or rolled back, * the commit or rollback method is called on the connection and then the original auto-commit * value is restored. *

* The LocalXAResource also respects the connection read-only setting. If the connection is * read-only the commit method will not be called, and the prepare method returns the XA_RDONLY. *

* It is assumed that the wrapper around a managed connection disables the setAutoCommit(), * commit(), rollback() and setReadOnly() methods while a transaction is in progress. */ protected static class LocalXAResource implements XAResource { private final Connection connection; private Xid currentXid; private boolean originalAutoCommit; public LocalXAResource(Connection localTransaction) { this.connection = localTransaction; } /** * Gets the current xid of the transaction branch associated with this XAResource. * * @return the current xid of the transaction branch associated with this XAResource. */ public synchronized Xid getXid() { return currentXid; } /** * Signals that a the connection has been enrolled in a transaction. This method saves off the * current auto commit flag, and then disables auto commit. The original auto commit setting is * restored when the transaction completes. * * @param xid the id of the transaction branch for this connection * @param flag either XAResource.TMNOFLAGS or XAResource.TMRESUME * @throws XAException if the connection is already enlisted in another transaction, or if auto-commit * could not be disabled */ public synchronized void start(Xid xid, int flag) throws XAException { if (flag == XAResource.TMNOFLAGS) { // first time in this transaction // make sure we aren't already in another tx if (this.currentXid != null) { throw new XAException("Already enlisted in another transaction with xid " + xid); } // save off the current auto commit flag so it can be restored after the transaction completes try { originalAutoCommit = connection.getAutoCommit(); } catch (SQLException ignored) { // no big deal, just assume it was off originalAutoCommit = true; } // update the auto commit flag try { connection.setAutoCommit(false); } catch (SQLException e) { throw (XAException) new XAException("Count not turn off auto commit for a XA transaction").initCause(e); } this.currentXid = xid; } else if (flag == XAResource.TMRESUME) { if (xid != this.currentXid) { throw new XAException("Attempting to resume in different transaction: expected " + this.currentXid + ", but was " + xid); } } else { throw new XAException("Unknown start flag " + flag); } } /** * This method does nothing. * * @param xid the id of the transaction branch for this connection * @param flag ignored * @throws XAException if the connection is already enlisted in another transaction */ public synchronized void end(Xid xid, int flag) throws XAException { if (xid == null) throw new NullPointerException("xid is null"); if (!this.currentXid.equals(xid)) throw new XAException("Invalid Xid: expected " + this.currentXid + ", but was " + xid); // This notification tells us that the application server is done using this // connection for the time being. The connection is still associated with an // open transaction, so we must still wait for the commit or rollback method } /** * This method does nothing since the LocalXAConnection does not support two-phase-commit. This method * will return XAResource.XA_RDONLY if the connection isReadOnly(). This assumes that the physical * connection is wrapped with a proxy that prevents an application from changing the read-only flag * while enrolled in a transaction. * * @param xid the id of the transaction branch for this connection * @return XAResource.XA_RDONLY if the connection.isReadOnly(); XAResource.XA_OK otherwise */ public synchronized int prepare(Xid xid) { // if the connection is read-only, then the resource is read-only // NOTE: this assumes that the outer proxy throws an exception when application code // attempts to set this in a transaction try { if (connection.isReadOnly()) { // update the auto commit flag connection.setAutoCommit(originalAutoCommit); // tell the transaction manager we are read only return XAResource.XA_RDONLY; } } catch (SQLException ignored) { // no big deal } // this is a local (one phase) only connection, so we can't prepare return XAResource.XA_OK; } /** * Commits the transaction and restores the original auto commit setting. * * @param xid the id of the transaction branch for this connection * @param flag ignored * @throws XAException if connection.commit() throws a SQLException */ public synchronized void commit(Xid xid, boolean flag) throws XAException { if (xid == null) throw new NullPointerException("xid is null"); if (!this.currentXid.equals(xid)) throw new XAException("Invalid Xid: expected " + this.currentXid + ", but was " + xid); try { // make sure the connection isn't already closed if (connection.isClosed()) { throw new XAException("Conection is closed"); } // A read only connection should not be committed if (!connection.isReadOnly()) { connection.commit(); } } catch (SQLException e) { throw (XAException) new XAException().initCause(e); } finally { try { connection.setAutoCommit(originalAutoCommit); } catch (SQLException e) { } this.currentXid = null; } } /** * Rolls back the transaction and restores the original auto commit setting. * * @param xid the id of the transaction branch for this connection * @throws XAException if connection.rollback() throws a SQLException */ public synchronized void rollback(Xid xid) throws XAException { if (xid == null) throw new NullPointerException("xid is null"); if (!this.currentXid.equals(xid)) throw new XAException("Invalid Xid: expected " + this.currentXid + ", but was " + xid); try { connection.rollback(); } catch (SQLException e) { throw (XAException) new XAException().initCause(e); } finally { try { connection.setAutoCommit(originalAutoCommit); } catch (SQLException e) { } this.currentXid = null; } } /** * Returns true if the specified XAResource == this XAResource. * * @param xaResource the XAResource to test * @return true if the specified XAResource == this XAResource; false otherwise */ public boolean isSameRM(XAResource xaResource) { return this == xaResource; } /** * Clears the currently associated transaction if it is the specified xid. * * @param xid the id of the transaction to forget */ public synchronized void forget(Xid xid) { if (xid != null && this.currentXid.equals(xid)) { this.currentXid = null; } } /** * Always returns a zero length Xid array. The LocalXAConnectionFactory can not support recovery, so no xids will ever be found. * * @param flag ignored since recovery is not supported * @return always a zero length Xid array. */ public Xid[] recover(int flag) { return new Xid[0]; } /** * Always returns 0 since we have no way to set a transaction timeout on a JDBC connection. * * @return always 0 */ public int getTransactionTimeout() { return 0; } /** * Always returns false since we have no way to set a transaction timeout on a JDBC connection. * * @param transactionTimeout ignored since we have no way to set a transaction timeout on a JDBC connection * @return always false */ public boolean setTransactionTimeout(int transactionTimeout) { return false; } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/XAConnectionFactory.java0000644000175000017500000000453211333570547032436 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import org.apache.commons.dbcp.ConnectionFactory; import java.sql.Connection; import java.sql.SQLException; /** * XAConnectionFactory is an extension of ConnectionFactory used to create connections * in a transaction managed environment. The XAConnectionFactory opperates like a normal * ConnectionFactory except an TransactionRegistry is provided from which the XAResource * for a connection can be obtained. This allows the existing DBCP pool code to work with * XAConnections and gives a the ManagedConnection a way to enlist a connection in the * the transaction. * * @author Dain Sundstrom * @author Rodney Waldhoff * @version $Revision$ */ public interface XAConnectionFactory extends ConnectionFactory { /** * Gets the TransactionRegistry for this connection factory which contains a the * XAResource for every connection created by this factory. * * @return the transaction registry for this connection factory */ TransactionRegistry getTransactionRegistry(); /** * Create a new {@link java.sql.Connection} in an implementation specific fashion. *

* An implementation can assume that the caller of this will wrap the connection in * a proxy that protects access to the setAutoCommit, commit and rollback when * enrolled in a XA transaction. * * @return a new {@link java.sql.Connection} * @throws java.sql.SQLException if a database error occurs creating the connection */ Connection createConnection() throws SQLException; } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/TransactionContext.java0000644000175000017500000001451611333570547032413 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import javax.transaction.RollbackException; import javax.transaction.Status; import javax.transaction.Synchronization; import javax.transaction.SystemException; import javax.transaction.Transaction; import javax.transaction.xa.XAResource; import java.sql.Connection; import java.sql.SQLException; import java.lang.ref.WeakReference; /** * TransactionContext represents the association between a single XAConnectionFactory and a Transaction. * This context contains a single shared connection which should be used by all ManagedConnections for * the XAConnectionFactory, the ability to listen for the transaction completion event, and a method * to check the status of the transaction. * * @author Dain Sundstrom * @version $Revision$ */ public class TransactionContext { private final TransactionRegistry transactionRegistry; private final WeakReference transactionRef; private Connection sharedConnection; /** * Creates a TransactionContext for the specified Transaction and TransactionRegistry. The * TransactionRegistry is used to obtain the XAResource for the shared connection when it is * enlisted in the transaction. * * @param transactionRegistry the TransactionRegistry used to obtain the XAResource for the * shared connection * @param transaction the transaction */ public TransactionContext(TransactionRegistry transactionRegistry, Transaction transaction) { if (transactionRegistry == null) throw new NullPointerException("transactionRegistry is null"); if (transaction == null) throw new NullPointerException("transaction is null"); this.transactionRegistry = transactionRegistry; this.transactionRef = new WeakReference(transaction); } /** * Gets the connection shared by all ManagedConnections in the transaction. Specifically, * connection using the same XAConnectionFactory from which the TransactionRegistry was * obtained. * @return the shared connection for this transaction */ public Connection getSharedConnection() { return sharedConnection; } /** * Sets the shared connection for this transaction. The shared connection is enlisted * in the transaction. * * @param sharedConnection the shared connection * @throws SQLException if a shared connection is already set, if XAResource for the connection * could not be found in the transaction registry, or if there was a problem enlisting the * connection in the transaction */ public void setSharedConnection(Connection sharedConnection) throws SQLException { if (this.sharedConnection != null) { throw new IllegalStateException("A shared connection is alredy set"); } // This is the first use of the connection in this transaction, so we must // enlist it in the transaction Transaction transaction = getTransaction(); try { XAResource xaResource = transactionRegistry.getXAResource(sharedConnection); transaction.enlistResource(xaResource); } catch (RollbackException e) { // transaction was rolled back... proceed as if there never was a transaction } catch (SystemException e) { throw (SQLException) new SQLException("Unable to enlist connection the transaction").initCause(e); } this.sharedConnection = sharedConnection; } /** * Adds a listener for transaction completion events. * * @param listener the listener to add * @throws SQLException if a problem occurs adding the listener to the transaction */ public void addTransactionContextListener(final TransactionContextListener listener) throws SQLException { try { getTransaction().registerSynchronization(new Synchronization() { public void beforeCompletion() { } public void afterCompletion(int status) { listener.afterCompletion(TransactionContext.this, status == Status.STATUS_COMMITTED); } }); } catch (RollbackException e) { // JTA spec doesn't let us register with a transaction marked rollback only // just ignore this and the tx state will be cleared another way. } catch (Exception e) { throw (SQLException) new SQLException("Unable to register transaction context listener").initCause(e); } } /** * True if the transaction is active or marked for rollback only. * @return true if the transaction is active or marked for rollback only; false otherwise * @throws SQLException if a problem occurs obtaining the transaction status */ public boolean isActive() throws SQLException { try { Transaction transaction = (Transaction) this.transactionRef.get(); if (transaction == null) { return false; } int status = transaction.getStatus(); return status == Status.STATUS_ACTIVE || status == Status.STATUS_MARKED_ROLLBACK; } catch (SystemException e) { throw (SQLException) new SQLException("Unable to get transaction status").initCause(e); } } private Transaction getTransaction() throws SQLException { Transaction transaction = (Transaction) this.transactionRef.get(); if (transaction == null) { throw new SQLException("Unable to enlist connection because the transaction has been garbage collected"); } return transaction; } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/ManagedDataSource.java0000644000175000017500000000656611333570547032076 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import org.apache.commons.pool.ObjectPool; import org.apache.commons.dbcp.PoolingDataSource; import java.sql.Connection; import java.sql.SQLException; /** * The ManagedDataSource is a PoolingDataSource that creates ManagedConnections. * * @author Dain Sundstrom * @version $Revision$ */ public class ManagedDataSource extends PoolingDataSource { private TransactionRegistry transactionRegistry; /** * Creates an uninitialized datasource. Before this data source can be used a pool and * transaction registry must be set. */ public ManagedDataSource() { } /** * Creates a ManagedDataSource which obtains connections from the specified pool and * manages them using the specified transaction registry. The TransactionRegistry must * be the transaction registry obtained from the XAConnectionFactory used to create * the connection pool. If not an error will occure when attempting to use the connection * in a global transaction because the XAResource object associated with the connection * will be unavailable. * * @param pool the connection pool * @param transactionRegistry the transaction registry obtained from the * XAConnectionFactory used to create the connection pool object factory */ public ManagedDataSource(ObjectPool pool, TransactionRegistry transactionRegistry) { super(pool); this.transactionRegistry = transactionRegistry; } /** * Sets the transaction registry from the XAConnectionFactory used to create the pool. * The transaction registry can only be set once using either a connector or this setter * method. * @param transactionRegistry the transaction registry acquired from the XAConnectionFactory * used to create the pool */ public void setTransactionRegistry(TransactionRegistry transactionRegistry) { if(this.transactionRegistry != null) throw new IllegalStateException("TransactionRegistry already set"); if(transactionRegistry == null) throw new NullPointerException("TransactionRegistry is null"); this.transactionRegistry = transactionRegistry; } public Connection getConnection() throws SQLException { if (_pool == null) throw new IllegalStateException("Pool has not been set"); if (transactionRegistry == null) throw new IllegalStateException("TransactionRegistry has not been set"); Connection connection = new ManagedConnection(_pool, transactionRegistry, isAccessToUnderlyingConnectionAllowed()); return connection; } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/TransactionRegistry.java0000644000175000017500000001167211333570547032577 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import java.sql.Connection; import java.sql.SQLException; import java.util.Map; import java.util.WeakHashMap; import javax.transaction.Status; import javax.transaction.SystemException; import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; /** * TransactionRegistry tracks Connections and XAResources in a transacted environment for a single XAConnectionFactory. *

* The TransactionRegistry hides the details of transaction processing from the existing DBCP pooling code, and gives * the ManagedConnection a way to enlist connections in a transaction, allowing for the maximal rescue of DBCP. * * @author Dain Sundstrom * @version $Revision$ */ public class TransactionRegistry { private final TransactionManager transactionManager; private final Map caches = new WeakHashMap(); private final Map xaResources = new WeakHashMap(); /** * Creates a TransactionRegistry for the specified transaction manager. * @param transactionManager the transaction manager used to enlist connections */ public TransactionRegistry(TransactionManager transactionManager) { this.transactionManager = transactionManager; } /** * Registers the association between a Connection and a XAResource. When a connection * is enlisted in a transaction, it is actually the XAResource that is given to the transaction * manager. * * @param connection the JDBC connection * @param xaResource the XAResource which managed the connection within a transaction */ public synchronized void registerConnection(Connection connection, XAResource xaResource) { if (connection == null) throw new NullPointerException("connection is null"); if (xaResource == null) throw new NullPointerException("xaResource is null"); xaResources.put(connection, xaResource); } /** * Gets the XAResource registered for the connection. * @param connection the connection * @return the XAResource registered for the connection; never null * @throws SQLException if the connection does not have a registered XAResource */ public synchronized XAResource getXAResource(Connection connection) throws SQLException { if (connection == null) throw new NullPointerException("connection is null"); XAResource xaResource = (XAResource) xaResources.get(connection); if (xaResource == null) { throw new SQLException("Connection does not have a registered XAResource " + connection); } return xaResource; } /** * Gets the active TransactionContext or null if not Transaction is active. * @return the active TransactionContext or null if not Transaction is active * @throws SQLException if an error occurs while fetching the transaction */ public TransactionContext getActiveTransactionContext() throws SQLException { Transaction transaction = null; try { transaction = transactionManager.getTransaction(); // was there a transaction? if (transaction == null) { return null; } // is it active int status = transaction.getStatus(); if (status != Status.STATUS_ACTIVE && status != Status.STATUS_MARKED_ROLLBACK) { return null; } } catch (SystemException e) { throw (SQLException) new SQLException("Unable to determine current transaction ").initCause(e); } // register the the context (or create a new one) synchronized (this) { TransactionContext cache = (TransactionContext) caches.get(transaction); if (cache == null) { cache = new TransactionContext(this, transaction); caches.put(transaction, cache); } return cache; } } /** * Unregisters a destroyed connection from {@link TransactionRegistry} * @param connection */ public synchronized void unregisterConnection(Connection connection) { xaResources.remove(connection); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/DataSourceXAConnectionFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/DataSourceXAConnectionFactory0000644000175000017500000001120411333570547033463 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import javax.sql.XAConnection; import javax.sql.XADataSource; import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; import java.sql.Connection; import java.sql.SQLException; /** * An implementation of XAConnectionFactory which uses a real XADataSource to obtain connections and XAResources. * * @author Dain Sundstrom * @version $Revision$ */ public class DataSourceXAConnectionFactory implements XAConnectionFactory { protected TransactionRegistry transactionRegistry; protected XADataSource xaDataSource; protected String username; protected String password; /** * Creates an DataSourceXAConnectionFactory which uses the specified XADataSource to create database * connections. The connections are enlisted into transactions using the specified transaction manager. * * @param transactionManager the transaction manager in which connections will be enlisted * @param xaDataSource the data source from which connections will be retrieved */ public DataSourceXAConnectionFactory(TransactionManager transactionManager, XADataSource xaDataSource) { this(transactionManager, xaDataSource, null, null); } /** * Creates an DataSourceXAConnectionFactory which uses the specified XADataSource to create database * connections. The connections are enlisted into transactions using the specified transaction manager. * * @param transactionManager the transaction manager in which connections will be enlisted * @param xaDataSource the data source from which connections will be retrieved * @param username the username used for authenticating new connections or null for unauthenticated * @param password the password used for authenticating new connections */ public DataSourceXAConnectionFactory(TransactionManager transactionManager, XADataSource xaDataSource, String username, String password) { if (transactionManager == null) throw new NullPointerException("transactionManager is null"); if (xaDataSource == null) throw new NullPointerException("xaDataSource is null"); this.transactionRegistry = new TransactionRegistry(transactionManager); this.xaDataSource = xaDataSource; this.username = username; this.password = password; } /** * Gets the username used to authenticate new connections. * @return the user name or null if unauthenticated connections are used */ public String getUsername() { return username; } /** * Sets the username used to authenticate new connections. * @param username the username used for authenticating the connection or null for unauthenticated */ public void setUsername(String username) { this.username = username; } /** * Sets the password used to authenticate new connections. * @param password the password used for authenticating the connection or null for unauthenticated */ public void setPassword(String password) { this.password = password; } public TransactionRegistry getTransactionRegistry() { return transactionRegistry; } public Connection createConnection() throws SQLException { // create a new XAConection XAConnection xaConnection; if (username == null) { xaConnection = xaDataSource.getXAConnection(); } else { xaConnection = xaDataSource.getXAConnection(username, password); } // get the real connection and XAResource from the connection Connection connection = xaConnection.getConnection(); XAResource xaResource = xaConnection.getXAResource(); // register the xa resource for the connection transactionRegistry.registerConnection(connection, xaResource); return connection; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/PoolableManagedConnection.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/PoolableManagedConnection.jav0000644000175000017500000000470011333570547033444 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.dbcp.AbandonedConfig; import org.apache.commons.dbcp.PoolableConnection; import org.apache.commons.pool.ObjectPool; /** * PoolableConnection that unregisters from TransactionRegistry on Connection real destroy. * * @see PoolableConnection * @version $Revision$ $Date$ */ public class PoolableManagedConnection extends PoolableConnection { private final TransactionRegistry transactionRegistry; /** * Create a PoolableManagedConnection. * * @param transactionRegistry transaction registry * @param conn underlying connection * @param pool connection pool * @param config abandoned configuration settings */ public PoolableManagedConnection(TransactionRegistry transactionRegistry, Connection conn, ObjectPool pool, AbandonedConfig config) { super(conn, pool, config); this.transactionRegistry = transactionRegistry; } /** * Create a PoolableManagedConnection. * * @param transactionRegistry transaction registry * @param conn underlying connection * @param pool connection pool */ public PoolableManagedConnection(TransactionRegistry transactionRegistry, Connection conn, ObjectPool pool) { super(conn, pool); this.transactionRegistry = transactionRegistry; } /** * Actually close the underlying connection. */ public void reallyClose() throws SQLException { try { super.reallyClose(); } finally { transactionRegistry.unregisterConnection(this); } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/BasicManagedDataSource.java0000644000175000017500000002154411333570547033031 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; import org.apache.commons.dbcp.AbandonedConfig; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; import org.apache.commons.pool.KeyedObjectPoolFactory; import javax.sql.XADataSource; import javax.transaction.TransactionManager; import java.sql.SQLException; /** *

BasicManagedDataSource is an extension of BasicDataSource which * creates ManagedConnections. This data source can create either * full two-phase-commit XA connections or one-phase-commit * local connections. Both types of connections are committed or * rolled back as part of the global transaction (a.k.a. XA * transaction or JTA Transaction), but only XA connections can be * recovered in the case of a system crash. *

*

BasicManagedDataSource adds the TransactionManager and XADataSource * properties. The TransactionManager property is required and is * used to elist connections in global transactions. The XADataSource * is optional and if set is the class name of the XADataSource class * for a two-phase-commit JDBC driver. If the XADataSource property * is set, the driverClassName is ignored and a DataSourceXAConnectionFactory * is created. Otherwise, a standard DriverConnectionFactory is created * and wrapped with a LocalXAConnectionFactory. *

* * @see BasicDataSource * @see ManagedConnection * @version $Revision$ */ public class BasicManagedDataSource extends BasicDataSource { /** Transaction Registry */ private TransactionRegistry transactionRegistry; /** Transaction Manager */ private transient TransactionManager transactionManager; /** XA datasource class name */ private String xaDataSource; /** XA datasource instance */ private XADataSource xaDataSourceInstance; /** * Gets the XADataSource instance used by the XAConnectionFactory. * * @return the XADataSource */ public synchronized XADataSource getXaDataSourceInstance() { return xaDataSourceInstance; } /** *

Sets the XADataSource instance used by the XAConnectionFactory.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param xaDataSourceInstance XADataSource instance */ public synchronized void setXaDataSourceInstance(XADataSource xaDataSourceInstance) { this.xaDataSourceInstance = xaDataSourceInstance; xaDataSource = xaDataSourceInstance == null ? null : xaDataSourceInstance.getClass().getName(); } /** * Gets the required transaction manager property. * @return the transaction manager used to enlist connections */ public TransactionManager getTransactionManager() { return transactionManager; } /** * Gets the transaction registry. * @return the transaction registry associating XAResources with managed connections */ protected synchronized TransactionRegistry getTransactionRegistry() { return transactionRegistry; } /** * Sets the required transaction manager property. * @param transactionManager the transaction manager used to enlist connections */ public void setTransactionManager(TransactionManager transactionManager) { this.transactionManager = transactionManager; } /** * Gets the optional XADataSource class name. * @return the optional XADataSource class name */ public synchronized String getXADataSource() { return xaDataSource; } /** * Sets the optional XADataSource class name. * @param xaDataSource the optional XADataSource class name */ public synchronized void setXADataSource(String xaDataSource) { this.xaDataSource = xaDataSource; } protected ConnectionFactory createConnectionFactory() throws SQLException { if (transactionManager == null) { throw new SQLException("Transaction manager must be set before a connection can be created"); } // If xa data source is not specified a DriverConnectionFactory is created and wrapped with a LocalXAConnectionFactory if (xaDataSource == null) { ConnectionFactory connectionFactory = super.createConnectionFactory(); XAConnectionFactory xaConnectionFactory = new LocalXAConnectionFactory(getTransactionManager(), connectionFactory); transactionRegistry = xaConnectionFactory.getTransactionRegistry(); return xaConnectionFactory; } // Create the XADataSource instance using the configured class name if it has not been set if (xaDataSourceInstance == null) { Class xaDataSourceClass = null; try { xaDataSourceClass = Class.forName(xaDataSource); } catch (Throwable t) { String message = "Cannot load XA data source class '" + xaDataSource + "'"; throw (SQLException)new SQLException(message).initCause(t); } try { xaDataSourceInstance = (XADataSource) xaDataSourceClass.newInstance(); } catch (Throwable t) { String message = "Cannot create XA data source of class '" + xaDataSource + "'"; throw (SQLException)new SQLException(message).initCause(t); } } // finally, create the XAConectionFactory using the XA data source XAConnectionFactory xaConnectionFactory = new DataSourceXAConnectionFactory(getTransactionManager(), xaDataSourceInstance, username, password); transactionRegistry = xaConnectionFactory.getTransactionRegistry(); return xaConnectionFactory; } protected void createDataSourceInstance() throws SQLException { PoolingDataSource pds = new ManagedDataSource(connectionPool, transactionRegistry); pds.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed()); pds.setLogWriter(logWriter); dataSource = pds; } /** * Creates the PoolableConnectionFactory and attaches it to the connection pool. * * @param driverConnectionFactory JDBC connection factory created by {@link #createConnectionFactory()} * @param statementPoolFactory statement pool factory (null if statement pooling is turned off) * @param abandonedConfig abandoned connection tracking configuration (null if no tracking) * @throws SQLException if an error occurs creating the PoolableConnectionFactory */ protected void createPoolableConnectionFactory(ConnectionFactory driverConnectionFactory, KeyedObjectPoolFactory statementPoolFactory, AbandonedConfig abandonedConfig) throws SQLException { PoolableConnectionFactory connectionFactory = null; try { connectionFactory = new PoolableManagedConnectionFactory((XAConnectionFactory) driverConnectionFactory, connectionPool, statementPoolFactory, validationQuery, validationQueryTimeout, connectionInitSqls, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog, abandonedConfig); validateConnectionFactory(connectionFactory); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw (SQLException)new SQLException("Cannot create PoolableConnectionFactory (" + e.getMessage() + ")").initCause(e); } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/TransactionContextListener.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/managed/TransactionContextListener.ja0000644000175000017500000000244211333570547033565 0ustar drazzibdrazzib/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.managed; /** * A listener for transaction completion events. * * @author Dain Sundstrom * @version $Revision$ */ public interface TransactionContextListener { /** * Occurs after the transaction commits or rolls back. * @param transactionContext the transaction context that completed * @param commited true if the transaction committed; false otherwise */ void afterCompletion(TransactionContext transactionContext, boolean commited); } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/PoolableCallableStatement.java0000644000175000017500000001054011333570550032212 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.apache.commons.pool.KeyedObjectPool; /** * A {@link DelegatingCallableStatement} that cooperates with * {@link PoolingConnection} to implement a pool of {@link CallableStatement}s. *

* The {@link #close} method returns this statement to its containing pool. (See {@link PoolingConnection}.) * * @see PoolingConnection * @version $Revision: 883040 $ $Date: 2009-11-22 01:01:20 -0500 (Sun, 22 Nov 2009) $ * @since 1.3 */ public class PoolableCallableStatement extends DelegatingCallableStatement implements CallableStatement { /** * The {@link KeyedObjectPool} from which this CallableStatement was obtained. */ private final KeyedObjectPool _pool; /** * Key for this statement in the containing {@link KeyedObjectPool}. */ private final Object _key; /** * Constructor. * * @param stmt the underlying {@link CallableStatement} * @param key the key for this statement in the {@link KeyedObjectPool} * @param pool the {@link KeyedObjectPool} from which this CallableStatement was obtained * @param conn the {@link Connection} that created this CallableStatement */ public PoolableCallableStatement(CallableStatement stmt, Object key, KeyedObjectPool pool, Connection conn) { super((DelegatingConnection)conn, stmt); _pool = pool; _key = key; // Remove from trace now because this statement will be // added by the activate method. if(_conn != null) { _conn.removeTrace(this); } } /** * Returns the CallableStatement to the pool. If {{@link #isClosed()}, this is a No-op. */ public void close() throws SQLException { // calling close twice should have no effect if (!isClosed()) { try { _pool.returnObject(_key,this); } catch(SQLException e) { throw e; } catch(RuntimeException e) { throw e; } catch(Exception e) { throw new SQLNestedException("Cannot close CallableStatement (return to pool failed)", e); } } } /** * Activates after retrieval from the pool. Adds a trace for this CallableStatement to the Connection * that created it. */ protected void activate() throws SQLException { _closed = false; if( _conn != null ) { _conn.addTrace( this ); } super.activate(); } /** * Passivates to prepare for return to the pool. Removes the trace associated with this CallableStatement * from the Connection that created it. Also closes any associated ResultSets. */ protected void passivate() throws SQLException { _closed = true; if( _conn != null ) { _conn.removeTrace(this); } // The JDBC spec requires that a statment close any open // ResultSet's when it is closed. // FIXME The PreparedStatement we're wrapping should handle this for us. // See DBCP-10 for what could happen when ResultSets are closed twice. List resultSets = getTrace(); if(resultSets != null) { ResultSet[] set = (ResultSet[])resultSets.toArray(new ResultSet[resultSets.size()]); for(int i = 0; i < set.length; i++) { set[i].close(); } clearTrace(); } super.passivate(); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/BasicDataSource.java0000644000175000017500000015645311333570550030162 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.PrintWriter; import java.util.Properties; import java.util.Collection; import java.util.List; import java.util.ArrayList; import java.util.Iterator; import java.util.Collections; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.pool.KeyedObjectPoolFactory; import org.apache.commons.pool.impl.GenericKeyedObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory; import org.apache.commons.pool.impl.GenericObjectPool; /** *

Basic implementation of javax.sql.DataSource that is * configured via JavaBeans properties. This is not the only way to * combine the commons-dbcp and commons-pool packages, * but provides a "one stop shopping" solution for basic requirements.

* *

Users extending this class should take care to use appropriate accessors * rather than accessing protected fields directly to ensure thread-safety.

* * @author Glenn L. Nielsen * @author Craig R. McClanahan * @author Dirk Verbeeck * @version $Revision: 895844 $ $Date: 2010-01-04 20:50:04 -0500 (Mon, 04 Jan 2010) $ */ public class BasicDataSource implements DataSource { static { // Attempt to prevent deadlocks - see DBCP - 272 DriverManager.getDrivers(); } // ------------------------------------------------------------- Properties /** * The default auto-commit state of connections created by this pool. */ protected volatile boolean defaultAutoCommit = true; /** * Returns the default auto-commit property. * * @return true if default auto-commit is enabled */ public boolean getDefaultAutoCommit() { return this.defaultAutoCommit; } /** *

Sets default auto-commit state of connections returned by this * datasource.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param defaultAutoCommit default auto-commit value */ public void setDefaultAutoCommit(boolean defaultAutoCommit) { this.defaultAutoCommit = defaultAutoCommit; this.restartNeeded = true; } /** * The default read-only state of connections created by this pool. */ protected transient Boolean defaultReadOnly = null; /** * Returns the default readOnly property. * * @return true if connections are readOnly by default */ public boolean getDefaultReadOnly() { Boolean val = defaultReadOnly; if (val != null) { return val.booleanValue(); } return false; } /** *

Sets defaultReadonly property.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param defaultReadOnly default read-only value */ public void setDefaultReadOnly(boolean defaultReadOnly) { this.defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; this.restartNeeded = true; } /** * The default TransactionIsolation state of connections created by this pool. */ protected volatile int defaultTransactionIsolation = PoolableConnectionFactory.UNKNOWN_TRANSACTIONISOLATION; /** * Returns the default transaction isolation state of returned connections. * * @return the default value for transaction isolation state * @see Connection#getTransactionIsolation */ public int getDefaultTransactionIsolation() { return this.defaultTransactionIsolation; } /** *

Sets the default transaction isolation state for returned * connections.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param defaultTransactionIsolation the default transaction isolation * state * @see Connection#getTransactionIsolation */ public void setDefaultTransactionIsolation(int defaultTransactionIsolation) { this.defaultTransactionIsolation = defaultTransactionIsolation; this.restartNeeded = true; } /** * The default "catalog" of connections created by this pool. */ protected volatile String defaultCatalog = null; /** * Returns the default catalog. * * @return the default catalog */ public String getDefaultCatalog() { return this.defaultCatalog; } /** *

Sets the default catalog.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param defaultCatalog the default catalog */ public void setDefaultCatalog(String defaultCatalog) { if ((defaultCatalog != null) && (defaultCatalog.trim().length() > 0)) { this.defaultCatalog = defaultCatalog; } else { this.defaultCatalog = null; } this.restartNeeded = true; } /** * The fully qualified Java class name of the JDBC driver to be used. */ protected String driverClassName = null; /** * Returns the jdbc driver class name. * * @return the jdbc driver class name */ public synchronized String getDriverClassName() { return this.driverClassName; } /** *

Sets the jdbc driver class name.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param driverClassName the class name of the jdbc driver */ public synchronized void setDriverClassName(String driverClassName) { if ((driverClassName != null) && (driverClassName.trim().length() > 0)) { this.driverClassName = driverClassName; } else { this.driverClassName = null; } this.restartNeeded = true; } /** * The class loader instance to use to load the JDBC driver. If not * specified, {@link Class#forName(String)} is used to load the JDBC driver. * If specified, {@link Class#forName(String, boolean, ClassLoader)} is * used. */ protected ClassLoader driverClassLoader = null; /** * Returns the class loader specified for loading the JDBC driver. Returns * null if no class loader has been explicitly specified. */ public synchronized ClassLoader getDriverClassLoader() { return this.driverClassLoader; } /** *

Sets the class loader to be used to load the JDBC driver.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param driverClassLoader the class loader with which to load the JDBC * driver */ public synchronized void setDriverClassLoader( ClassLoader driverClassLoader) { this.driverClassLoader = driverClassLoader; this.restartNeeded = true; } /** * The maximum number of active connections that can be allocated from * this pool at the same time, or negative for no limit. */ protected int maxActive = GenericObjectPool.DEFAULT_MAX_ACTIVE; /** *

Returns the maximum number of active connections that can be * allocated at the same time. *

*

A negative number means that there is no limit.

* * @return the maximum number of active connections */ public synchronized int getMaxActive() { return this.maxActive; } /** * Sets the maximum number of active connections that can be * allocated at the same time. Use a negative value for no limit. * * @param maxActive the new value for maxActive * @see #getMaxActive() */ public synchronized void setMaxActive(int maxActive) { this.maxActive = maxActive; if (connectionPool != null) { connectionPool.setMaxActive(maxActive); } } /** * The maximum number of connections that can remain idle in the * pool, without extra ones being released, or negative for no limit. * If maxIdle is set too low on heavily loaded systems it is possible you * will see connections being closed and almost immediately new connections * being opened. This is a result of the active threads momentarily closing * connections faster than they are opening them, causing the number of idle * connections to rise above maxIdle. The best value for maxIdle for heavily * loaded system will vary but the default is a good starting point. */ protected int maxIdle = GenericObjectPool.DEFAULT_MAX_IDLE; /** *

Returns the maximum number of connections that can remain idle in the * pool. *

*

A negative value indicates that there is no limit

* * @return the maximum number of idle connections */ public synchronized int getMaxIdle() { return this.maxIdle; } /** * Sets the maximum number of connections that can remain idle in the * pool. * * @see #getMaxIdle() * @param maxIdle the new value for maxIdle */ public synchronized void setMaxIdle(int maxIdle) { this.maxIdle = maxIdle; if (connectionPool != null) { connectionPool.setMaxIdle(maxIdle); } } /** * The minimum number of active connections that can remain idle in the * pool, without extra ones being created, or 0 to create none. */ protected int minIdle = GenericObjectPool.DEFAULT_MIN_IDLE; /** * Returns the minimum number of idle connections in the pool * * @return the minimum number of idle connections * @see GenericObjectPool#getMinIdle() */ public synchronized int getMinIdle() { return this.minIdle; } /** * Sets the minimum number of idle connections in the pool. * * @param minIdle the new value for minIdle * @see GenericObjectPool#setMinIdle(int) */ public synchronized void setMinIdle(int minIdle) { this.minIdle = minIdle; if (connectionPool != null) { connectionPool.setMinIdle(minIdle); } } /** * The initial number of connections that are created when the pool * is started. * * @since 1.2 */ protected int initialSize = 0; /** * Returns the initial size of the connection pool. * * @return the number of connections created when the pool is initialized */ public synchronized int getInitialSize() { return this.initialSize; } /** *

Sets the initial size of the connection pool.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param initialSize the number of connections created when the pool * is initialized */ public synchronized void setInitialSize(int initialSize) { this.initialSize = initialSize; this.restartNeeded = true; } /** * 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, or <= 0 to wait indefinitely. */ protected long maxWait = GenericObjectPool.DEFAULT_MAX_WAIT; /** *

Returns the maximum number of milliseconds that the pool will wait * for a connection to be returned before throwing an exception. *

*

A value less than or equal to zero means the pool is set to wait * indefinitely.

* * @return the maxWait property value */ public synchronized long getMaxWait() { return this.maxWait; } /** *

Sets the maxWait property. *

*

Use -1 to make the pool wait indefinitely. *

* * @param maxWait the new value for maxWait * @see #getMaxWait() */ public synchronized void setMaxWait(long maxWait) { this.maxWait = maxWait; if (connectionPool != null) { connectionPool.setMaxWait(maxWait); } } /** * Prepared statement pooling for this pool. When this property is set to true * both PreparedStatements and CallableStatements are pooled. */ protected boolean poolPreparedStatements = false; /** * Returns true if we are pooling statements. * * @return true if prepared and callable statements are pooled */ public synchronized boolean isPoolPreparedStatements() { return this.poolPreparedStatements; } /** *

Sets whether to pool statements or not.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param poolingStatements pooling on or off */ public synchronized void setPoolPreparedStatements(boolean poolingStatements) { this.poolPreparedStatements = poolingStatements; this.restartNeeded = true; } /** *

The maximum number of open statements that can be allocated from * the statement pool at the same time, or non-positive for no limit. Since * a connection usually only uses one or two statements at a time, this is * mostly used to help detect resource leaks.

* *

Note: As of version 1.3, CallableStatements (those produced by {@link Connection#prepareCall}) * are pooled along with PreparedStatements (produced by {@link Connection#prepareStatement}) * and maxOpenPreparedStatements limits the total number of prepared or callable statements * that may be in use at a given time.

*/ protected int maxOpenPreparedStatements = GenericKeyedObjectPool.DEFAULT_MAX_TOTAL; /** * Gets the value of the {@link #maxOpenPreparedStatements} property. * * @return the maximum number of open statements * @see #maxOpenPreparedStatements */ public synchronized int getMaxOpenPreparedStatements() { return this.maxOpenPreparedStatements; } /** *

Sets the value of the {@link #maxOpenPreparedStatements} * property.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param maxOpenStatements the new maximum number of prepared statements * @see #maxOpenPreparedStatements */ public synchronized void setMaxOpenPreparedStatements(int maxOpenStatements) { this.maxOpenPreparedStatements = maxOpenStatements; this.restartNeeded = true; } /** * 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. */ protected boolean testOnBorrow = true; /** * Returns the {@link #testOnBorrow} property. * * @return true if objects are validated before being borrowed from the * pool * * @see #testOnBorrow */ public synchronized boolean getTestOnBorrow() { return this.testOnBorrow; } /** * Sets the {@link #testOnBorrow} property. This property determines * whether or not the pool will validate objects before they are borrowed * from the pool. For a true value to have any effect, the * validationQuery property must be set to a non-null string. * * @param testOnBorrow new value for testOnBorrow property */ public synchronized void setTestOnBorrow(boolean testOnBorrow) { this.testOnBorrow = testOnBorrow; if (connectionPool != null) { connectionPool.setTestOnBorrow(testOnBorrow); } } /** * The indication of whether objects will be validated before being * returned to the pool. */ protected boolean testOnReturn = false; /** * Returns the value of the {@link #testOnReturn} property. * * @return true if objects are validated before being returned to the * pool * @see #testOnReturn */ public synchronized boolean getTestOnReturn() { return this.testOnReturn; } /** * Sets the testOnReturn property. This property determines * whether or not the pool will validate objects before they are returned * to the pool. For a true value to have any effect, the * validationQuery property must be set to a non-null string. * * @param testOnReturn new value for testOnReturn property */ public synchronized void setTestOnReturn(boolean testOnReturn) { this.testOnReturn = testOnReturn; if (connectionPool != null) { connectionPool.setTestOnReturn(testOnReturn); } } /** * The number of milliseconds to sleep between runs of the idle object * evictor thread. When non-positive, no idle object evictor thread will * be run. */ protected long timeBetweenEvictionRunsMillis = GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; /** * Returns the value of the {@link #timeBetweenEvictionRunsMillis} * property. * * @return the time (in miliseconds) between evictor runs * @see #timeBetweenEvictionRunsMillis */ public synchronized long getTimeBetweenEvictionRunsMillis() { return this.timeBetweenEvictionRunsMillis; } /** * Sets the {@link #timeBetweenEvictionRunsMillis} property. * * @param timeBetweenEvictionRunsMillis the new time between evictor runs * @see #timeBetweenEvictionRunsMillis */ public synchronized void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) { this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; if (connectionPool != null) { connectionPool.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); } } /** * The number of objects to examine during each run of the idle object * evictor thread (if any). */ protected int numTestsPerEvictionRun = GenericObjectPool.DEFAULT_NUM_TESTS_PER_EVICTION_RUN; /** * Returns the value of the {@link #numTestsPerEvictionRun} property. * * @return the number of objects to examine during idle object evictor * runs * @see #numTestsPerEvictionRun */ public synchronized int getNumTestsPerEvictionRun() { return this.numTestsPerEvictionRun; } /** * Sets the value of the {@link #numTestsPerEvictionRun} property. * * @param numTestsPerEvictionRun the new {@link #numTestsPerEvictionRun} * value * @see #numTestsPerEvictionRun */ public synchronized void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) { this.numTestsPerEvictionRun = numTestsPerEvictionRun; if (connectionPool != null) { connectionPool.setNumTestsPerEvictionRun(numTestsPerEvictionRun); } } /** * The minimum amount of time an object may sit idle in the pool before it * is eligable for eviction by the idle object evictor (if any). */ protected long minEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; /** * Returns the {@link #minEvictableIdleTimeMillis} property. * * @return the value of the {@link #minEvictableIdleTimeMillis} property * @see #minEvictableIdleTimeMillis */ public synchronized long getMinEvictableIdleTimeMillis() { return this.minEvictableIdleTimeMillis; } /** * Sets the {@link #minEvictableIdleTimeMillis} property. * * @param minEvictableIdleTimeMillis the minimum amount of time an object * may sit idle in the pool * @see #minEvictableIdleTimeMillis */ public synchronized void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) { this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; if (connectionPool != null) { connectionPool.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); } } /** * 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. */ protected boolean testWhileIdle = false; /** * Returns the value of the {@link #testWhileIdle} property. * * @return true if objects examined by the idle object evictor are * validated * @see #testWhileIdle */ public synchronized boolean getTestWhileIdle() { return this.testWhileIdle; } /** * Sets the testWhileIdle property. This property determines * whether or not the idle object evictor will validate connections. For a * true value to have any effect, the * validationQuery property must be set to a non-null string. * * @param testWhileIdle new value for testWhileIdle property */ public synchronized void setTestWhileIdle(boolean testWhileIdle) { this.testWhileIdle = testWhileIdle; if (connectionPool != null) { connectionPool.setTestWhileIdle(testWhileIdle); } } /** * [Read Only] The current number of active connections that have been * allocated from this data source. * * @return the current number of active connections */ public synchronized int getNumActive() { if (connectionPool != null) { return connectionPool.getNumActive(); } else { return 0; } } /** * [Read Only] The current number of idle connections that are waiting * to be allocated from this data source. * * @return the current number of idle connections */ public synchronized int getNumIdle() { if (connectionPool != null) { return connectionPool.getNumIdle(); } else { return 0; } } /** * The connection password to be passed to our JDBC driver to establish * a connection. */ protected volatile String password = null; /** * Returns the password passed to the JDBC driver to establish connections. * * @return the connection password */ public String getPassword() { return this.password; } /** *

Sets the {@link #password}.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param password new value for the password */ public void setPassword(String password) { this.password = password; this.restartNeeded = true; } /** * The connection URL to be passed to our JDBC driver to establish * a connection. */ protected String url = null; /** * Returns the JDBC connection {@link #url} property. * * @return the {@link #url} passed to the JDBC driver to establish * connections */ public synchronized String getUrl() { return this.url; } /** *

Sets the {@link #url}.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param url the new value for the JDBC connection url */ public synchronized void setUrl(String url) { this.url = url; this.restartNeeded = true; } /** * The connection username to be passed to our JDBC driver to * establish a connection. */ protected String username = null; /** * Returns the JDBC connection {@link #username} property. * * @return the {@link #username} passed to the JDBC driver to establish * connections */ public String getUsername() { return this.username; } /** *

Sets the {@link #username}.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param username the new value for the JDBC connection username */ public void setUsername(String username) { this.username = username; this.restartNeeded = true; } /** * The SQL query that will be used to validate connections from this pool * before returning them to the caller. If specified, this query * MUST be an SQL SELECT statement that returns at least * one row. */ protected volatile String validationQuery = null; /** * Returns the validation query used to validate connections before * returning them. * * @return the SQL validation query * @see #validationQuery */ public String getValidationQuery() { return this.validationQuery; } /** *

Sets the {@link #validationQuery}.

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param validationQuery the new value for the validation query */ public void setValidationQuery(String validationQuery) { if ((validationQuery != null) && (validationQuery.trim().length() > 0)) { this.validationQuery = validationQuery; } else { this.validationQuery = null; } this.restartNeeded = true; } /** * Timeout in seconds before connection validation queries fail. * * @since 1.3 */ protected volatile int validationQueryTimeout = -1; /** * Returns the validation query timeout. * * @return the timeout in seconds before connection validation queries fail. * @since 1.3 */ public int getValidationQueryTimeout() { return validationQueryTimeout; } /** * Sets the validation query timeout, the amount of time, in seconds, that * connection validation will wait for a response from the database when * executing a validation query. Use a value less than or equal to 0 for * no timeout. *

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param timeout new validation query timeout value in seconds * @since 1.3 */ public void setValidationQueryTimeout(int timeout) { this.validationQueryTimeout = timeout; restartNeeded = true; } /** * These SQL statements run once after a Connection is created. *

* This property can be used for example to run ALTER SESSION SET * NLS_SORT=XCYECH in an Oracle Database only once after connection * creation. *

* * @since 1.3 */ protected volatile List connectionInitSqls; /** * Returns the list of SQL statements executed when a physical connection * is first created. Returns an empty list if there are no initialization * statements configured. * * @return initialization SQL statements * @since 1.3 */ public Collection getConnectionInitSqls() { Collection result = connectionInitSqls; if (result == null) { return Collections.EMPTY_LIST; } return result; } /** * Sets the list of SQL statements to be executed when a physical * connection is first created. *

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param connectionInitSqls Collection of SQL statements to execute * on connection creation */ public void setConnectionInitSqls(Collection connectionInitSqls) { if ((connectionInitSqls != null) && (connectionInitSqls.size() > 0)) { ArrayList newVal = null; for (Iterator iterator = connectionInitSqls.iterator(); iterator.hasNext();) { Object o = iterator.next(); if (o != null) { String s = o.toString(); if (s.trim().length() > 0) { if (newVal == null) { newVal = new ArrayList(); } newVal.add(s); } } } this.connectionInitSqls = newVal; } else { this.connectionInitSqls = null; } this.restartNeeded = true; } /** * Controls access to the underlying connection. */ private boolean accessToUnderlyingConnectionAllowed = false; /** * Returns the value of the accessToUnderlyingConnectionAllowed property. * * @return true if access to the underlying connection is allowed, false * otherwise. */ public synchronized boolean isAccessToUnderlyingConnectionAllowed() { return this.accessToUnderlyingConnectionAllowed; } /** *

Sets the value of the accessToUnderlyingConnectionAllowed property. * It controls if the PoolGuard allows access to the underlying connection. * (Default: false)

*

* Note: this method currently has no effect once the pool has been * initialized. The pool is initialized the first time one of the * following methods is invoked: getConnection, setLogwriter, * setLoginTimeout, getLoginTimeout, getLogWriter.

* * @param allow Access to the underlying connection is granted when true. */ public synchronized void setAccessToUnderlyingConnectionAllowed(boolean allow) { this.accessToUnderlyingConnectionAllowed = allow; this.restartNeeded = true; } // ----------------------------------------------------- Instance Variables // TODO: review & make isRestartNeeded() public, restartNeeded protected /** * A property setter has been invoked that will require the connection * pool to be re-initialized. Currently, restart is not triggered, so * this property has no effect. */ private volatile boolean restartNeeded = false; /** * Returns whether or not a restart is needed. * * Note: restart is not currently triggered by property changes. * * @return true if a restart is needed */ private boolean isRestartNeeded() { return restartNeeded; } /** * The object pool that internally manages our connections. */ protected volatile GenericObjectPool connectionPool = null; /** * The connection properties that will be sent to our JDBC driver when * establishing new connections. NOTE - The "user" and * "password" properties will be passed explicitly, so they do not need * to be included here. */ protected Properties connectionProperties = new Properties(); /** * The data source we will use to manage connections. This object should * be acquired ONLY by calls to the * createDataSource() method. */ protected volatile DataSource dataSource = null; /** * The PrintWriter to which log messages should be directed. */ protected PrintWriter logWriter = new PrintWriter(System.out); // ----------------------------------------------------- DataSource Methods /** * Create (if necessary) and return a connection to the database. * * @throws SQLException if a database access error occurs * @return a database connection */ public Connection getConnection() throws SQLException { return createDataSource().getConnection(); } /** * BasicDataSource does NOT support this method. * * @param user Database user on whose behalf the Connection * is being made * @param pass The database user's password * * @throws UnsupportedOperationException * @throws SQLException if a database access error occurs * @return nothing - always throws UnsupportedOperationException */ public Connection getConnection(String user, String pass) throws SQLException { // This method isn't supported by the PoolingDataSource returned by // the createDataSource throw new UnsupportedOperationException("Not supported by BasicDataSource"); // return createDataSource().getConnection(username, password); } /** * BasicDataSource does NOT support this method. * *

Returns the login timeout (in seconds) for connecting to the database. *

*

Calls {@link #createDataSource()}, so has the side effect * of initializing the connection pool.

* * @throws SQLException if a database access error occurs * @throws UnsupportedOperationException If the DataSource implementation * does not support the login timeout feature. * @return login timeout in seconds */ public int getLoginTimeout() throws SQLException { // This method isn't supported by the PoolingDataSource returned by // the createDataSource throw new UnsupportedOperationException("Not supported by BasicDataSource"); //return createDataSource().getLoginTimeout(); } /** *

Returns the log writer being used by this data source.

*

* Calls {@link #createDataSource()}, so has the side effect * of initializing the connection pool.

* * @throws SQLException if a database access error occurs * @return log writer in use */ public PrintWriter getLogWriter() throws SQLException { return createDataSource().getLogWriter(); } /** * BasicDataSource does NOT support this method. * *

Set the login timeout (in seconds) for connecting to the * database.

*

* Calls {@link #createDataSource()}, so has the side effect * of initializing the connection pool.

* * @param loginTimeout The new login timeout, or zero for no timeout * @throws UnsupportedOperationException If the DataSource implementation * does not support the login timeout feature. * @throws SQLException if a database access error occurs */ public void setLoginTimeout(int loginTimeout) throws SQLException { // This method isn't supported by the PoolingDataSource returned by // the createDataSource throw new UnsupportedOperationException("Not supported by BasicDataSource"); //createDataSource().setLoginTimeout(loginTimeout); } /** *

Sets the log writer being used by this data source.

*

* Calls {@link #createDataSource()}, so has the side effect * of initializing the connection pool.

* * @param logWriter The new log writer * @throws SQLException if a database access error occurs */ public void setLogWriter(PrintWriter logWriter) throws SQLException { createDataSource().setLogWriter(logWriter); this.logWriter = logWriter; } private AbandonedConfig abandonedConfig; /** * Flag to remove abandoned connections if they exceed the * removeAbandonedTimout. * * Set to true or false, default false. * If set to true a connection is considered abandoned and eligible * for removal if it has been idle longer than the removeAbandonedTimeout. * Setting this to true can recover db connections from poorly written * applications which fail to close a connection. *

* Abandonded connections are identified and removed when * {@link #getConnection()} is invoked and the following conditions hold *

  • {@link #getRemoveAbandoned()} = true
  • *
  • {@link #getNumActive()} > {@link #getMaxActive()} - 3
  • *
  • {@link #getNumIdle()} < 2

*/ public boolean getRemoveAbandoned() { if (abandonedConfig != null) { return abandonedConfig.getRemoveAbandoned(); } return false; } /** * @param removeAbandoned new removeAbandoned property value * @see #getRemoveAbandoned() */ public void setRemoveAbandoned(boolean removeAbandoned) { if (abandonedConfig == null) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setRemoveAbandoned(removeAbandoned); this.restartNeeded = true; } /** * Timeout in seconds before an abandoned connection can be removed. * * Defaults to 300 seconds. * @return abandoned connection timeout */ public int getRemoveAbandonedTimeout() { if (abandonedConfig != null) { return abandonedConfig.getRemoveAbandonedTimeout(); } return 300; } /** * @param removeAbandonedTimeout new removeAbandonedTimeout value */ public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) { if (abandonedConfig == null) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setRemoveAbandonedTimeout(removeAbandonedTimeout); this.restartNeeded = true; } /** *

Flag to log stack traces for application code which abandoned * a Statement or Connection. *

*

Defaults to false. *

*

Logging of abandoned Statements and Connections adds overhead * for every Connection open or new Statement because a stack * trace has to be generated.

*/ public boolean getLogAbandoned() { if (abandonedConfig != null) { return abandonedConfig.getLogAbandoned(); } return false; } /** * @param logAbandoned new logAbandoned property value */ public void setLogAbandoned(boolean logAbandoned) { if (abandonedConfig == null) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setLogAbandoned(logAbandoned); this.restartNeeded = true; } // --------------------------------------------------------- Public Methods /** * Add a custom connection property to the set that will be passed to our * JDBC driver. This MUST be called before the first * connection is retrieved (along with all the other configuration * property setters). Calls to this method after the connection pool * has been initialized have no effect. * * @param name Name of the custom connection property * @param value Value of the custom connection property */ public void addConnectionProperty(String name, String value) { connectionProperties.put(name, value); this.restartNeeded = true; } /** * Remove a custom connection property. * * @param name Name of the custom connection property to remove * @see #addConnectionProperty(String, String) */ public void removeConnectionProperty(String name) { connectionProperties.remove(name); this.restartNeeded = true; } /** * Sets the connection properties passed to driver.connect(...). * * Format of the string must be [propertyName=property;]* * * NOTE - The "user" and "password" properties will be added * explicitly, so they do not need to be included here. * * @param connectionProperties the connection properties used to * create new connections */ public void setConnectionProperties(String connectionProperties) { if (connectionProperties == null) throw new NullPointerException("connectionProperties is null"); String[] entries = connectionProperties.split(";"); Properties properties = new Properties(); for (int i = 0; i < entries.length; i++) { String entry = entries[i]; if (entry.length() > 0) { int index = entry.indexOf('='); if (index > 0) { String name = entry.substring(0, index); String value = entry.substring(index + 1); properties.setProperty(name, value); } else { // no value is empty string which is how java.util.Properties works properties.setProperty(entry, ""); } } } this.connectionProperties = properties; this.restartNeeded = true; } protected boolean closed; /** *

Closes and releases all idle connections that are currently stored in the connection pool * associated with this data source.

* *

Connections that are checked out to clients when this method is invoked are not affected. * When client applications subsequently invoke {@link Connection#close()} to return * these connections to the pool, the underlying JDBC connections are closed.

* *

Attempts to acquire connections using {@link #getConnection()} after this method has been * invoked result in SQLExceptions.

* *

This method is idempotent - i.e., closing an already closed BasicDataSource has no effect * and does not generate exceptions.

* * @throws SQLException if an error occurs closing idle connections */ public synchronized void close() throws SQLException { closed = true; GenericObjectPool oldpool = connectionPool; connectionPool = null; dataSource = null; try { if (oldpool != null) { oldpool.close(); } } catch(SQLException e) { throw e; } catch(RuntimeException e) { throw e; } catch(Exception e) { throw new SQLNestedException("Cannot close connection pool", e); } } /** * If true, this data source is closed and no more connections can be retrieved from this datasource. * @return true, if the data source is closed; false otherwise */ public synchronized boolean isClosed() { return closed; } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return false; } public T unwrap(Class iface) throws SQLException { throw new SQLException("BasicDataSource is not a wrapper."); } /* JDBC_4_ANT_KEY_END */ // ------------------------------------------------------ Protected Methods /** *

Create (if necessary) and return the internal data source we are * using to manage our connections.

* *

IMPLEMENTATION NOTE - It is tempting to use the * "double checked locking" idiom in an attempt to avoid synchronizing * on every single call to this method. However, this idiom fails to * work correctly in the face of some optimizations that are legal for * a JVM to perform.

* * @throws SQLException if the object pool cannot be created. */ protected synchronized DataSource createDataSource() throws SQLException { if (closed) { throw new SQLException("Data source is closed"); } // Return the pool if we have already created it if (dataSource != null) { return (dataSource); } // create factory which returns raw physical connections ConnectionFactory driverConnectionFactory = createConnectionFactory(); // create a pool for our connections createConnectionPool(); // Set up statement pool, if desired GenericKeyedObjectPoolFactory statementPoolFactory = null; if (isPoolPreparedStatements()) { statementPoolFactory = new GenericKeyedObjectPoolFactory(null, -1, // unlimited maxActive (per key) GenericKeyedObjectPool.WHEN_EXHAUSTED_FAIL, 0, // maxWait 1, // maxIdle (per key) maxOpenPreparedStatements); } // Set up the poolable connection factory createPoolableConnectionFactory(driverConnectionFactory, statementPoolFactory, abandonedConfig); // Create and return the pooling data source to manage the connections createDataSourceInstance(); try { for (int i = 0 ; i < initialSize ; i++) { connectionPool.addObject(); } } catch (Exception e) { throw new SQLNestedException("Error preloading the connection pool", e); } return dataSource; } /** * Creates a JDBC connection factory for this datasource. This method only * exists so subclasses can replace the implementation class. */ protected ConnectionFactory createConnectionFactory() throws SQLException { // Load the JDBC driver class Class driverFromCCL = null; if (driverClassName != null) { try { try { if (driverClassLoader == null) { Class.forName(driverClassName); } else { Class.forName(driverClassName, true, driverClassLoader); } } catch (ClassNotFoundException cnfe) { driverFromCCL = Thread.currentThread( ).getContextClassLoader().loadClass( driverClassName); } } catch (Throwable t) { String message = "Cannot load JDBC driver class '" + driverClassName + "'"; logWriter.println(message); t.printStackTrace(logWriter); throw new SQLNestedException(message, t); } } // Create a JDBC driver instance Driver driver = null; try { if (driverFromCCL == null) { driver = DriverManager.getDriver(url); } else { // Usage of DriverManager is not possible, as it does not // respect the ContextClassLoader driver = (Driver) driverFromCCL.newInstance(); if (!driver.acceptsURL(url)) { throw new SQLException("No suitable driver", "08001"); } } } catch (Throwable t) { String message = "Cannot create JDBC driver of class '" + (driverClassName != null ? driverClassName : "") + "' for connect URL '" + url + "'"; logWriter.println(message); t.printStackTrace(logWriter); throw new SQLNestedException(message, t); } // Can't test without a validationQuery if (validationQuery == null) { setTestOnBorrow(false); setTestOnReturn(false); setTestWhileIdle(false); } // Set up the driver connection factory we will use String user = username; if (user != null) { connectionProperties.put("user", user); } else { log("DBCP DataSource configured without a 'username'"); } String pwd = password; if (pwd != null) { connectionProperties.put("password", pwd); } else { log("DBCP DataSource configured without a 'password'"); } ConnectionFactory driverConnectionFactory = new DriverConnectionFactory(driver, url, connectionProperties); return driverConnectionFactory; } /** * Creates a connection pool for this datasource. This method only exists * so subclasses can replace the implementation class. */ protected void createConnectionPool() { // Create an object pool to contain our active connections GenericObjectPool gop; if ((abandonedConfig != null) && (abandonedConfig.getRemoveAbandoned())) { gop = new AbandonedObjectPool(null,abandonedConfig); } else { gop = new GenericObjectPool(); } gop.setMaxActive(maxActive); gop.setMaxIdle(maxIdle); gop.setMinIdle(minIdle); gop.setMaxWait(maxWait); gop.setTestOnBorrow(testOnBorrow); gop.setTestOnReturn(testOnReturn); gop.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); gop.setNumTestsPerEvictionRun(numTestsPerEvictionRun); gop.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); gop.setTestWhileIdle(testWhileIdle); connectionPool = gop; } /** * Creates the actual data source instance. This method only exists so * subclasses can replace the implementation class. * * @throws SQLException if unable to create a datasource instance */ protected void createDataSourceInstance() throws SQLException { PoolingDataSource pds = new PoolingDataSource(connectionPool); pds.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed()); pds.setLogWriter(logWriter); dataSource = pds; } /** * Creates the PoolableConnectionFactory and attaches it to the connection pool. This method only exists * so subclasses can replace the default implementation. * * @param driverConnectionFactory JDBC connection factory * @param statementPoolFactory statement pool factory (null if statement pooling is turned off) * @param configuration abandoned connection tracking configuration (null if no tracking) * @throws SQLException if an error occurs creating the PoolableConnectionFactory */ protected void createPoolableConnectionFactory(ConnectionFactory driverConnectionFactory, KeyedObjectPoolFactory statementPoolFactory, AbandonedConfig configuration) throws SQLException { PoolableConnectionFactory connectionFactory = null; try { connectionFactory = new PoolableConnectionFactory(driverConnectionFactory, connectionPool, statementPoolFactory, validationQuery, validationQueryTimeout, connectionInitSqls, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog, configuration); validateConnectionFactory(connectionFactory); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Cannot create PoolableConnectionFactory (" + e.getMessage() + ")", e); } } protected static void validateConnectionFactory(PoolableConnectionFactory connectionFactory) throws Exception { Connection conn = null; try { conn = (Connection) connectionFactory.makeObject(); connectionFactory.activateObject(conn); connectionFactory.validateConnection(conn); connectionFactory.passivateObject(conn); } finally { connectionFactory.destroyObject(conn); } } /** * Not used currently */ private void restart() { try { close(); } catch (SQLException e) { log("Could not restart DataSource, cause: " + e.getMessage()); } } protected void log(String message) { if (logWriter != null) { logWriter.println(message); } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/PoolingDriver.java0000644000175000017500000004155711333570550027747 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.IOException; import java.io.InputStream; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.DriverPropertyInfo; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.HashMap; import java.util.Map; import java.util.NoSuchElementException; import java.util.Properties; import java.util.Set; import org.apache.commons.jocl.JOCLContentHandler; import org.apache.commons.pool.ObjectPool; import org.xml.sax.SAXException; /** * A {@link Driver} implementation that obtains * {@link Connection}s from a registered * {@link ObjectPool}. * * @author Rodney Waldhoff * @author Dirk Verbeeck * @version $Revision: 902692 $ $Date: 2010-01-24 22:28:54 -0500 (Sun, 24 Jan 2010) $ */ public class PoolingDriver implements Driver { /** Register myself with the {@link DriverManager}. */ static { try { DriverManager.registerDriver(new PoolingDriver()); } catch(Exception e) { } } /** The map of registered pools. */ protected static final HashMap _pools = new HashMap(); /** Controls access to the underlying connection */ private static boolean accessToUnderlyingConnectionAllowed = false; public PoolingDriver() { } /** * Returns the value of the accessToUnderlyingConnectionAllowed property. * * @return true if access to the underlying is allowed, false otherwise. */ public static synchronized boolean isAccessToUnderlyingConnectionAllowed() { return accessToUnderlyingConnectionAllowed; } /** * Sets the value of the accessToUnderlyingConnectionAllowed property. * It controls if the PoolGuard allows access to the underlying connection. * (Default: false) * * @param allow Access to the underlying connection is granted when true. */ public static synchronized void setAccessToUnderlyingConnectionAllowed(boolean allow) { accessToUnderlyingConnectionAllowed = allow; } /** * WARNING: This method throws DbcpExceptions (RuntimeExceptions) * and will be replaced by the protected getConnectionPool method. * * @deprecated This will be removed in a future version of DBCP. */ public synchronized ObjectPool getPool(String name) { try { return getConnectionPool(name); } catch (Exception e) { throw new DbcpException(e); } } public synchronized ObjectPool getConnectionPool(String name) throws SQLException { ObjectPool pool = (ObjectPool)(_pools.get(name)); if(null == pool) { InputStream in = this.getClass().getResourceAsStream(String.valueOf(name) + ".jocl"); if (in == null) { in = Thread.currentThread().getContextClassLoader( ).getResourceAsStream(String.valueOf(name) + ".jocl"); } if(null != in) { JOCLContentHandler jocl = null; try { jocl = JOCLContentHandler.parse(in); } catch (SAXException e) { throw (SQLException) new SQLException("Could not parse configuration file").initCause(e); } catch (IOException e) { throw (SQLException) new SQLException("Could not load configuration file").initCause(e); } if(jocl.getType(0).equals(String.class)) { pool = getPool((String)(jocl.getValue(0))); if(null != pool) { registerPool(name,pool); } } else { pool = ((PoolableConnectionFactory)(jocl.getValue(0))).getPool(); if(null != pool) { registerPool(name,pool); } } } else { throw new SQLException("Configuration file not found"); } } return pool; } public synchronized void registerPool(String name, ObjectPool pool) { _pools.put(name,pool); } public synchronized void closePool(String name) throws SQLException { ObjectPool pool = (ObjectPool) _pools.get(name); if (pool != null) { _pools.remove(name); try { pool.close(); } catch (Exception e) { throw (SQLException) new SQLException("Error closing pool " + name).initCause(e); } } } public synchronized String[] getPoolNames(){ Set names = _pools.keySet(); return (String[]) names.toArray(new String[names.size()]); } public boolean acceptsURL(String url) throws SQLException { try { return url.startsWith(URL_PREFIX); } catch(NullPointerException e) { return false; } } public Connection connect(String url, Properties info) throws SQLException { if(acceptsURL(url)) { ObjectPool pool = getConnectionPool(url.substring(URL_PREFIX_LEN)); if(null == pool) { throw new SQLException("No pool found for " + url + "."); } else { try { Connection conn = (Connection)(pool.borrowObject()); if (conn != null) { conn = new PoolGuardConnectionWrapper(pool, conn); } return conn; } catch(SQLException e) { throw e; } catch(NoSuchElementException e) { throw (SQLException) new SQLException("Cannot get a connection, pool error: " + e.getMessage()).initCause(e); } catch(RuntimeException e) { throw e; } catch(Exception e) { throw (SQLException) new SQLException("Cannot get a connection, general error: " + e.getMessage()).initCause(e); } } } else { return null; } } /** * Invalidates the given connection. * * @param conn connection to invalidate * @throws SQLException if the connection is not a * PoolGuardConnectionWrapper or an error occurs invalidating * the connection * @since 1.2.2 */ public void invalidateConnection(Connection conn) throws SQLException { if (conn instanceof PoolGuardConnectionWrapper) { // normal case PoolGuardConnectionWrapper pgconn = (PoolGuardConnectionWrapper) conn; ObjectPool pool = pgconn.pool; Connection delegate = pgconn.delegate; try { pool.invalidateObject(delegate); } catch (Exception e) { } pgconn.delegate = null; } else { throw new SQLException("Invalid connection class"); } } public int getMajorVersion() { return MAJOR_VERSION; } public int getMinorVersion() { return MINOR_VERSION; } public boolean jdbcCompliant() { return true; } public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) { return new DriverPropertyInfo[0]; } /** My URL prefix */ protected static final String URL_PREFIX = "jdbc:apache:commons:dbcp:"; protected static final int URL_PREFIX_LEN = URL_PREFIX.length(); // version numbers protected static final int MAJOR_VERSION = 1; protected static final int MINOR_VERSION = 0; /** * PoolGuardConnectionWrapper is a Connection wrapper that makes sure a * closed connection cannot be used anymore. */ static private class PoolGuardConnectionWrapper extends DelegatingConnection { private final ObjectPool pool; private Connection delegate; PoolGuardConnectionWrapper(ObjectPool pool, Connection delegate) { super(delegate); this.pool = pool; this.delegate = delegate; } protected void checkOpen() throws SQLException { if(delegate == null) { throw new SQLException("Connection is closed."); } } public void close() throws SQLException { if (delegate != null) { this.delegate.close(); this.delegate = null; super.setDelegate(null); } } public boolean isClosed() throws SQLException { if (delegate == null) { return true; } return delegate.isClosed(); } public void clearWarnings() throws SQLException { checkOpen(); delegate.clearWarnings(); } public void commit() throws SQLException { checkOpen(); delegate.commit(); } public Statement createStatement() throws SQLException { checkOpen(); return new DelegatingStatement(this, delegate.createStatement()); } public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new DelegatingStatement(this, delegate.createStatement(resultSetType, resultSetConcurrency)); } public boolean equals(Object obj) { if (delegate == null){ return false; } return delegate.equals(obj); } public boolean getAutoCommit() throws SQLException { checkOpen(); return delegate.getAutoCommit(); } public String getCatalog() throws SQLException { checkOpen(); return delegate.getCatalog(); } public DatabaseMetaData getMetaData() throws SQLException { checkOpen(); return delegate.getMetaData(); } public int getTransactionIsolation() throws SQLException { checkOpen(); return delegate.getTransactionIsolation(); } public Map getTypeMap() throws SQLException { checkOpen(); return delegate.getTypeMap(); } public SQLWarning getWarnings() throws SQLException { checkOpen(); return delegate.getWarnings(); } public int hashCode() { if (delegate == null){ return 0; } return delegate.hashCode(); } public boolean isReadOnly() throws SQLException { checkOpen(); return delegate.isReadOnly(); } public String nativeSQL(String sql) throws SQLException { checkOpen(); return delegate.nativeSQL(sql); } public CallableStatement prepareCall(String sql) throws SQLException { checkOpen(); return new DelegatingCallableStatement(this, delegate.prepareCall(sql)); } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new DelegatingCallableStatement(this, delegate.prepareCall(sql, resultSetType, resultSetConcurrency)); } public PreparedStatement prepareStatement(String sql) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql)); } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, resultSetType, resultSetConcurrency)); } public void rollback() throws SQLException { checkOpen(); delegate.rollback(); } public void setAutoCommit(boolean autoCommit) throws SQLException { checkOpen(); delegate.setAutoCommit(autoCommit); } public void setCatalog(String catalog) throws SQLException { checkOpen(); delegate.setCatalog(catalog); } public void setReadOnly(boolean readOnly) throws SQLException { checkOpen(); delegate.setReadOnly(readOnly); } public void setTransactionIsolation(int level) throws SQLException { checkOpen(); delegate.setTransactionIsolation(level); } public void setTypeMap(Map map) throws SQLException { checkOpen(); delegate.setTypeMap(map); } public String toString() { if (delegate == null){ return "NULL"; } return delegate.toString(); } public int getHoldability() throws SQLException { checkOpen(); return delegate.getHoldability(); } public void setHoldability(int holdability) throws SQLException { checkOpen(); delegate.setHoldability(holdability); } public java.sql.Savepoint setSavepoint() throws SQLException { checkOpen(); return delegate.setSavepoint(); } public java.sql.Savepoint setSavepoint(String name) throws SQLException { checkOpen(); return delegate.setSavepoint(name); } public void releaseSavepoint(java.sql.Savepoint savepoint) throws SQLException { checkOpen(); delegate.releaseSavepoint(savepoint); } public void rollback(java.sql.Savepoint savepoint) throws SQLException { checkOpen(); delegate.rollback(savepoint); } public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); return new DelegatingStatement(this, delegate.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability)); } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); return new DelegatingCallableStatement(this, delegate.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, autoGeneratedKeys)); } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, columnIndexes)); } public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, columnNames)); } /** * @see org.apache.commons.dbcp.DelegatingConnection#getDelegate() */ public Connection getDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return super.getDelegate(); } else { return null; } } /** * @see org.apache.commons.dbcp.DelegatingConnection#getInnermostDelegate() */ public Connection getInnermostDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return super.getInnermostDelegate(); } else { return null; } } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DriverManagerConnectionFactory.java0000644000175000017500000000616011333570550033251 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; /** * A {@link DriverManager}-based implementation of {@link ConnectionFactory}. * * @author Rodney Waldhoff * @author Ignacio J. Ortega * @author Dirk Verbeeck * @version $Revision: 746827 $ $Date: 2009-02-22 16:41:52 -0500 (Sun, 22 Feb 2009) $ */ public class DriverManagerConnectionFactory implements ConnectionFactory { static { // Related to DBCP-212 // Driver manager does not sync loading of drivers that use the service // provider interface. This will cause issues is multi-threaded // environments. This hack makes sure the drivers are loaded before // DBCP tries to use them. DriverManager.getDrivers(); } /** * Constructor for DriverManagerConnectionFactory. * @param connectUri a database url of the form * jdbc:subprotocol:subname * @param props a list of arbitrary string tag/value pairs as * connection arguments; normally at least a "user" and "password" * property should be included. */ public DriverManagerConnectionFactory(String connectUri, Properties props) { _connectUri = connectUri; _props = props; } /** * Constructor for DriverManagerConnectionFactory. * @param connectUri a database url of the form * jdbc:subprotocol:subname * @param uname the database user * @param passwd the user's password */ public DriverManagerConnectionFactory(String connectUri, String uname, String passwd) { _connectUri = connectUri; _uname = uname; _passwd = passwd; } public Connection createConnection() throws SQLException { if(null == _props) { if((_uname == null) && (_passwd == null)) { return DriverManager.getConnection(_connectUri); } else { return DriverManager.getConnection(_connectUri,_uname,_passwd); } } else { return DriverManager.getConnection(_connectUri,_props); } } protected String _connectUri = null; protected String _uname = null; protected String _passwd = null; protected Properties _props = null; } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/package.html0000644000175000017500000002637011333570550026576 0ustar drazzibdrazzib Package Documentation for org.apache.commons.dbcp

Database Connection Pool API.

Overview in Dialog Form

Q: How do I use the DBCP package?

A: There are two primary ways to access the DBCP pool, as a {@link java.sql.Driver Driver}, or as a {@link javax.sql.DataSource DataSource}. You'll want to create an instance of {@link org.apache.commons.dbcp.PoolingDriver} or {@link org.apache.commons.dbcp.PoolingDataSource}. When using one of these interfaces, you can just use your JDBC objects the way you normally would. Closing a {@link java.sql.Connection} will simply return it to its pool.

Q: But {@link org.apache.commons.dbcp.PoolingDriver PoolingDriver} and {@link org.apache.commons.dbcp.PoolingDataSource PoolingDataSource} both expect an {@link org.apache.commons.pool.ObjectPool ObjectPool} as an input. Where do I get one of those?

A: The {@link org.apache.commons.pool.ObjectPool ObjectPool} interface is defined in the {@link org.apache.commons.pool} package (Commons-Pool). The {@link org.apache.commons.pool.impl} package has a couple of implementations, and you can always create your own.

Q: Ok, I've found an {@link org.apache.commons.pool.ObjectPool ObjectPool} implementation that I think suits my connection pooling needs. But it wants a {@link org.apache.commons.pool.PoolableObjectFactory PoolableObjectFactory}. What should I use for that?

A: The DBCP package provides a class for this purpose. It's called {@link org.apache.commons.dbcp.PoolableConnectionFactory}. It implements the factory and lifecycle methods of {@link org.apache.commons.pool.PoolableObjectFactory} for {@link java.sql.Connection}s. But it doesn't create the actual database {@link java.sql.Connection}s itself, it uses a {@link org.apache.commons.dbcp.ConnectionFactory} for that. The {@link org.apache.commons.dbcp.PoolableConnectionFactory} will take {@link java.sql.Connection}s created by the {@link org.apache.commons.dbcp.ConnectionFactory} and wrap them with classes that implement the pooling behaviour.

Several implementations of {@link org.apache.commons.dbcp.ConnectionFactory} are provided--one that uses {@link java.sql.DriverManager} to create connections ({@link org.apache.commons.dbcp.DriverManagerConnectionFactory}), one that uses a {@link java.sql.Driver} to create connections ({@link org.apache.commons.dbcp.DriverConnectionFactory}), one that uses a {@link javax.sql.DataSource} to create connections ({@link org.apache.commons.dbcp.DataSourceConnectionFactory}).

Q: I think I'm starting to get it, but can you walk me though it again?

A: Sure. Let's assume you want to create a {@link javax.sql.DataSource} that pools {@link java.sql.Connection}s. Let's also assume that that those pooled {@link java.sql.Connection}s should be obtained from the {@link java.sql.DriverManager}. You'll want to create a {@link org.apache.commons.dbcp.PoolingDataSource}.

The {@link org.apache.commons.dbcp.PoolingDataSource} uses an underlying {@link org.apache.commons.pool.ObjectPool} to create and store its {@link java.sql.Connection}.

To create a {@link org.apache.commons.pool.ObjectPool}, you'll need a {@link org.apache.commons.pool.PoolableObjectFactory} that creates the actual {@link java.sql.Connection}s. That's what {@link org.apache.commons.dbcp.PoolableConnectionFactory} is for.

To create the {@link org.apache.commons.dbcp.PoolableConnectionFactory}, you'll need at least two things:

  1. A {@link org.apache.commons.dbcp.ConnectionFactory} from which the actual database {@link java.sql.Connection}s will be obtained.
  2. An empty and factory-less {@link org.apache.commons.pool.ObjectPool} in which the {@link java.sql.Connection}s will be stored.

    When you pass an {@link org.apache.commons.pool.ObjectPool} into the {@link org.apache.commons.dbcp.PoolableConnectionFactory}, it will automatically register itself as the {@link org.apache.commons.pool.PoolableObjectFactory} for that pool.
You can optionally provide a {@link org.apache.commons.pool.KeyedObjectPoolFactory} that will be used to create {@link org.apache.commons.pool.KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s for each {@link java.sql.Connection}.

In code, that might look like this:

GenericObjectPool connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string", "username", "password");
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
PoolingDataSource dataSource = new PoolingDataSource(connectionPool);

To create a {@link org.apache.commons.dbcp.PoolingDriver}, we do the same thing, except that instead of creating a {@link javax.sql.DataSource} on the last line, we create a {@link org.apache.commons.dbcp.PoolingDriver}, and register the connectionPool with it. E.g.,:

GenericObjectPool connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string", "username", "password");
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
PoolingDriver driver = new PoolingDriver();
driver.registerPool("example",connectionPool);

Since the {@link org.apache.commons.dbcp.PoolingDriver} registers itself with the {@link java.sql.DriverManager} when it is created, now you can just go to the {@link java.sql.DriverManager} to create your {@link java.sql.Connection}s, like you normally would:

Connection conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:example");

Q: Sounds complicated, is there an easier way?

A: If you're using the {@link org.apache.commons.dbcp.PoolingDriver}, you don't need to do this configuration in code. Instead, you can provide a JOCL document that describes the connection pool, and let the {@link org.apache.commons.dbcp.PoolingDriver} discover it at runtime.

Specifically, if the {@link org.apache.commons.dbcp.PoolingDriver} is asked for a {@link java.sql.Connection} from a pool that has not yet been registered, it will look for a named resource from which to read the pool's configuration, and create that pool.

For example, suppose you create a pool named "/eg" from a JOCL document. The "connect string" for this pool will be "jdbc:apache:commons:dbcp:/eg". To do this, you'll need a create a resource (just a file in your classpath) containing a JOCL description of the pool. Specifically, this JOCL document should define a {@link org.apache.commons.dbcp.PoolableConnectionFactory} from which the pool will be obtained. For example:

<object class="org.apache.commons.dbcp.PoolableConnectionFactory" xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">
   <!-- the first argument is the ConnectionFactory -->
   <object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
      <string value="jdbc:some:connect:string"/>
      <object class="java.util.Properties" null="true"/>
   </object>
   <!-- the next argument is the ObjectPool -->
   <object class="org.apache.commons.pool.impl.GenericObjectPool">
      <object class="org.apache.commons.pool.PoolableObjectFactory" null="true"/>
      <int value="10"/> <!-- max active -->
      <byte value="1"/> <!-- when exhausted action, 0 = fail, 1 = block, 2 = grow -->
      <long value="2000"/> <!-- max wait -->
      <int value="10"/> <!-- max idle -->
      <boolean value="false"/> <!-- test on borrow -->
      <boolean value="false"/> <!-- test on return -->
      <long value="10000"/> <!-- time between eviction runs -->
      <int value="5"/> <!-- number of connections to test per eviction run -->
      <long value="5000"/> <!-- min evictable idle time -->
      <boolean value="true"/> <!-- test while idle -->
   </object>
   <!-- the next argument is the KeyedObjectPoolFactory -->
   <object class="org.apache.commons.pool.impl.StackKeyedObjectPoolFactory">
      <int value="5"/> <!-- max idle -->
   </object>
   <string value="SELECT COUNT(*) FROM DUAL"/> <!-- validation query -->
   <boolean value="false"/> <!-- default read only -->
   <boolean value="true"/> <!-- default auto commit -->
</object>

Simply save that file somewhere in your classpath as eg.jocl, and the {@link org.apache.commons.dbcp.PoolingDriver} will find it automatically. You need only register the {@link org.apache.commons.dbcp.PoolingDriver} (for example, using the jdbc.drivers property), and use the the {@link java.sql.DriverManager} to create your {@link java.sql.Connection}s, like you normally would:

Connection conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:/eg");

(Note that without the leading slash, the pool must be located at org/apache/commons/dbcp/PoolingDriver/eg.jocl within your classpath. See {@link java.lang.Class#getResource} for details.)

libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/BasicDataSourceFactory.java0000644000175000017500000003454411333570550031506 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.ByteArrayInputStream; import java.sql.Connection; import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; import java.util.StringTokenizer; import java.util.Collections; import javax.naming.Context; import javax.naming.Name; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.spi.ObjectFactory; import javax.sql.DataSource; /** *

JNDI object factory that creates an instance of * BasicDataSource that has been configured based on the * RefAddr values of the specified Reference, * which must match the names and data types of the * BasicDataSource bean properties.

* * @author Craig R. McClanahan * @author Dirk Verbeeck * @version $Revision: 828639 $ $Date: 2009-10-22 06:27:43 -0400 (Thu, 22 Oct 2009) $ */ public class BasicDataSourceFactory implements ObjectFactory { private final static String PROP_DEFAULTAUTOCOMMIT = "defaultAutoCommit"; private final static String PROP_DEFAULTREADONLY = "defaultReadOnly"; private final static String PROP_DEFAULTTRANSACTIONISOLATION = "defaultTransactionIsolation"; private final static String PROP_DEFAULTCATALOG = "defaultCatalog"; private final static String PROP_DRIVERCLASSNAME = "driverClassName"; private final static String PROP_MAXACTIVE = "maxActive"; private final static String PROP_MAXIDLE = "maxIdle"; private final static String PROP_MINIDLE = "minIdle"; private final static String PROP_INITIALSIZE = "initialSize"; private final static String PROP_MAXWAIT = "maxWait"; private final static String PROP_TESTONBORROW = "testOnBorrow"; private final static String PROP_TESTONRETURN = "testOnReturn"; private final static String PROP_TIMEBETWEENEVICTIONRUNSMILLIS = "timeBetweenEvictionRunsMillis"; private final static String PROP_NUMTESTSPEREVICTIONRUN = "numTestsPerEvictionRun"; private final static String PROP_MINEVICTABLEIDLETIMEMILLIS = "minEvictableIdleTimeMillis"; private final static String PROP_TESTWHILEIDLE = "testWhileIdle"; private final static String PROP_PASSWORD = "password"; private final static String PROP_URL = "url"; private final static String PROP_USERNAME = "username"; private final static String PROP_VALIDATIONQUERY = "validationQuery"; private final static String PROP_VALIDATIONQUERY_TIMEOUT = "validationQueryTimeout"; /** * The property name for initConnectionSqls. * The associated value String must be of the form [query;]* * @since 1.3 */ private final static String PROP_INITCONNECTIONSQLS = "initConnectionSqls"; private final static String PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED = "accessToUnderlyingConnectionAllowed"; private final static String PROP_REMOVEABANDONED = "removeAbandoned"; private final static String PROP_REMOVEABANDONEDTIMEOUT = "removeAbandonedTimeout"; private final static String PROP_LOGABANDONED = "logAbandoned"; private final static String PROP_POOLPREPAREDSTATEMENTS = "poolPreparedStatements"; private final static String PROP_MAXOPENPREPAREDSTATEMENTS = "maxOpenPreparedStatements"; private final static String PROP_CONNECTIONPROPERTIES = "connectionProperties"; private final static 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_PASSWORD, PROP_URL, PROP_USERNAME, PROP_VALIDATIONQUERY, PROP_VALIDATIONQUERY_TIMEOUT, PROP_INITCONNECTIONSQLS, PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED, PROP_REMOVEABANDONED, PROP_REMOVEABANDONEDTIMEOUT, PROP_LOGABANDONED, PROP_POOLPREPAREDSTATEMENTS, PROP_MAXOPENPREPAREDSTATEMENTS, PROP_CONNECTIONPROPERTIES }; // -------------------------------------------------- ObjectFactory Methods /** *

Create and return a new BasicDataSource instance. If no * instance can be created, return null instead.

* * @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 nameCtx * @param nameCtx The context relative to which the name * parameter is specified, or null if name * 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 */ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception { // We only know how to deal with javax.naming.References // that specify a class name of "javax.sql.DataSource" if ((obj == null) || !(obj instanceof Reference)) { return null; } Reference ref = (Reference) obj; if (!"javax.sql.DataSource".equals(ref.getClassName())) { 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); } /** * Creates and configures a {@link BasicDataSource} instance based on the * given properties. * * @param properties the datasource configuration properties * @throws Exception if an error occurs creating the data source */ public static DataSource createDataSource(Properties properties) throws Exception { BasicDataSource dataSource = new BasicDataSource(); String value = null; value = properties.getProperty(PROP_DEFAULTAUTOCOMMIT); if (value != null) { dataSource.setDefaultAutoCommit(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_DEFAULTREADONLY); if (value != null) { dataSource.setDefaultReadOnly(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_DEFAULTTRANSACTIONISOLATION); if (value != null) { int level = PoolableConnectionFactory.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 = PoolableConnectionFactory.UNKNOWN_TRANSACTIONISOLATION; } } dataSource.setDefaultTransactionIsolation(level); } value = properties.getProperty(PROP_DEFAULTCATALOG); if (value != null) { dataSource.setDefaultCatalog(value); } value = properties.getProperty(PROP_DRIVERCLASSNAME); if (value != null) { dataSource.setDriverClassName(value); } value = properties.getProperty(PROP_MAXACTIVE); if (value != null) { dataSource.setMaxActive(Integer.parseInt(value)); } value = properties.getProperty(PROP_MAXIDLE); if (value != null) { dataSource.setMaxIdle(Integer.parseInt(value)); } value = properties.getProperty(PROP_MINIDLE); if (value != null) { dataSource.setMinIdle(Integer.parseInt(value)); } value = properties.getProperty(PROP_INITIALSIZE); if (value != null) { dataSource.setInitialSize(Integer.parseInt(value)); } value = properties.getProperty(PROP_MAXWAIT); if (value != null) { dataSource.setMaxWait(Long.parseLong(value)); } value = properties.getProperty(PROP_TESTONBORROW); if (value != null) { dataSource.setTestOnBorrow(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_TESTONRETURN); if (value != null) { dataSource.setTestOnReturn(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_TIMEBETWEENEVICTIONRUNSMILLIS); if (value != null) { dataSource.setTimeBetweenEvictionRunsMillis(Long.parseLong(value)); } value = properties.getProperty(PROP_NUMTESTSPEREVICTIONRUN); if (value != null) { dataSource.setNumTestsPerEvictionRun(Integer.parseInt(value)); } value = properties.getProperty(PROP_MINEVICTABLEIDLETIMEMILLIS); if (value != null) { dataSource.setMinEvictableIdleTimeMillis(Long.parseLong(value)); } value = properties.getProperty(PROP_TESTWHILEIDLE); if (value != null) { dataSource.setTestWhileIdle(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_PASSWORD); if (value != null) { dataSource.setPassword(value); } value = properties.getProperty(PROP_URL); if (value != null) { dataSource.setUrl(value); } value = properties.getProperty(PROP_USERNAME); if (value != null) { dataSource.setUsername(value); } value = properties.getProperty(PROP_VALIDATIONQUERY); if (value != null) { dataSource.setValidationQuery(value); } value = properties.getProperty(PROP_VALIDATIONQUERY_TIMEOUT); if (value != null) { dataSource.setValidationQueryTimeout(Integer.parseInt(value)); } value = properties.getProperty(PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED); if (value != null) { dataSource.setAccessToUnderlyingConnectionAllowed(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_REMOVEABANDONED); if (value != null) { dataSource.setRemoveAbandoned(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_REMOVEABANDONEDTIMEOUT); if (value != null) { dataSource.setRemoveAbandonedTimeout(Integer.parseInt(value)); } value = properties.getProperty(PROP_LOGABANDONED); if (value != null) { dataSource.setLogAbandoned(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_POOLPREPAREDSTATEMENTS); if (value != null) { dataSource.setPoolPreparedStatements(Boolean.valueOf(value).booleanValue()); } value = properties.getProperty(PROP_MAXOPENPREPAREDSTATEMENTS); if (value != null) { dataSource.setMaxOpenPreparedStatements(Integer.parseInt(value)); } value = properties.getProperty(PROP_INITCONNECTIONSQLS); if (value != null) { StringTokenizer tokenizer = new StringTokenizer(value, ";"); dataSource.setConnectionInitSqls(Collections.list(tokenizer)); } value = properties.getProperty(PROP_CONNECTIONPROPERTIES); if (value != null) { Properties p = getProperties(value); Enumeration e = p.propertyNames(); while (e.hasMoreElements()) { String propertyName = (String) e.nextElement(); dataSource.addConnectionProperty(propertyName, p.getProperty(propertyName)); } } // DBCP-215 // Trick to make sure that initialSize connections are created if (dataSource.getInitialSize() > 0) { dataSource.getLogWriter(); } // Return the configured DataSource instance return dataSource; } /** *

Parse properties from the string. Format of the string must be [propertyName=property;]*

* @param propText * @return Properties * @throws Exception */ static private Properties getProperties(String propText) throws Exception { Properties p = new Properties(); if (propText != null) { p.load(new ByteArrayInputStream(propText.replace(';', '\n').getBytes())); } return p; } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DelegatingStatement.java0000644000175000017500000003457411333570550031115 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.List; /** * A base delegating implementation of {@link Statement}. *

* All of the methods from the {@link Statement} interface * simply check to see that the {@link Statement} is active, * and call the corresponding method on the "delegate" * provided in my constructor. *

* Extends AbandonedTrace to implement Statement tracking and * logging of code which created the Statement. Tracking the * Statement ensures that the Connection which created it can * close any open Statement's on Connection close. * * @author Rodney Waldhoff * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 896443 $ $Date: 2010-01-06 08:42:27 -0500 (Wed, 06 Jan 2010) $ */ public class DelegatingStatement extends AbandonedTrace implements Statement { /** My delegate. */ protected Statement _stmt = null; /** The connection that created me. **/ protected DelegatingConnection _conn = null; /** * Create a wrapper for the Statement which traces this * Statement to the Connection which created it and the * code which created it. * * @param s the {@link Statement} to delegate all calls to. * @param c the {@link DelegatingConnection} that created this statement. */ public DelegatingStatement(DelegatingConnection c, Statement s) { super(c); _stmt = s; _conn = c; } /** * Returns my underlying {@link Statement}. * @return my underlying {@link Statement}. * @see #getInnermostDelegate */ public Statement getDelegate() { return _stmt; } /** * This method considers two objects to be equal * if the underlying jdbc objects are equal. */ public boolean equals(Object obj) { Statement delegate = getInnermostDelegate(); if (delegate == null) { return false; } if (obj instanceof DelegatingStatement) { DelegatingStatement s = (DelegatingStatement) obj; return delegate.equals(s.getInnermostDelegate()); } else { return delegate.equals(obj); } } public int hashCode() { Object obj = getInnermostDelegate(); if (obj == null) { return 0; } return obj.hashCode(); } /** * If my underlying {@link Statement} is not a * DelegatingStatement, returns it, * otherwise recursively invokes this method on * my delegate. *

* Hence this method will return the first * delegate that is not a DelegatingStatement * or null when no non-DelegatingStatement * delegate can be found by transversing this chain. *

* This method is useful when you may have nested * DelegatingStatements, and you want to make * sure to obtain a "genuine" {@link Statement}. * @see #getDelegate */ public Statement getInnermostDelegate() { Statement s = _stmt; while(s != null && s instanceof DelegatingStatement) { s = ((DelegatingStatement)s).getDelegate(); if(this == s) { return null; } } return s; } /** Sets my delegate. */ public void setDelegate(Statement s) { _stmt = s; } protected boolean _closed = false; protected void checkOpen() throws SQLException { if(isClosed()) { throw new SQLException (this.getClass().getName() + " with address: \"" + this.toString() + "\" is closed."); } } /** * Close this DelegatingStatement, and close * any ResultSets that were not explicitly closed. */ public void close() throws SQLException { try { try { if (_conn != null) { _conn.removeTrace(this); _conn = null; } // The JDBC spec requires that a statment close any open // ResultSet's when it is closed. // FIXME The PreparedStatement we're wrapping should handle this for us. // See bug 17301 for what could happen when ResultSets are closed twice. List resultSets = getTrace(); if( resultSets != null) { ResultSet[] set = (ResultSet[]) resultSets.toArray(new ResultSet[resultSets.size()]); for (int i = 0; i < set.length; i++) { set[i].close(); } clearTrace(); } _stmt.close(); } catch (SQLException e) { handleException(e); } } finally { _closed = true; } } protected void handleException(SQLException e) throws SQLException { if (_conn != null) { _conn.handleException(e); } else { throw e; } } protected void activate() throws SQLException { if(_stmt instanceof DelegatingStatement) { ((DelegatingStatement)_stmt).activate(); } } protected void passivate() throws SQLException { if(_stmt instanceof DelegatingStatement) { ((DelegatingStatement)_stmt).passivate(); } } public Connection getConnection() throws SQLException { checkOpen(); return _conn; // return the delegating connection that created this } public ResultSet executeQuery(String sql) throws SQLException { checkOpen(); try { return DelegatingResultSet.wrapResultSet(this,_stmt.executeQuery(sql)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getResultSet() throws SQLException { checkOpen(); try { return DelegatingResultSet.wrapResultSet(this,_stmt.getResultSet()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public int executeUpdate(String sql) throws SQLException { checkOpen(); try { return _stmt.executeUpdate(sql); } catch (SQLException e) { handleException(e); return 0; } } public int getMaxFieldSize() throws SQLException { checkOpen(); try { return _stmt.getMaxFieldSize(); } catch (SQLException e) { handleException(e); return 0; } } public void setMaxFieldSize(int max) throws SQLException { checkOpen(); try { _stmt.setMaxFieldSize(max); } catch (SQLException e) { handleException(e); } } public int getMaxRows() throws SQLException { checkOpen(); try { return _stmt.getMaxRows(); } catch (SQLException e) { handleException(e); return 0; } } public void setMaxRows(int max) throws SQLException { checkOpen(); try { _stmt.setMaxRows(max); } catch (SQLException e) { handleException(e); } } public void setEscapeProcessing(boolean enable) throws SQLException { checkOpen(); try { _stmt.setEscapeProcessing(enable); } catch (SQLException e) { handleException(e); } } public int getQueryTimeout() throws SQLException { checkOpen(); try { return _stmt.getQueryTimeout(); } catch (SQLException e) { handleException(e); return 0; } } public void setQueryTimeout(int seconds) throws SQLException { checkOpen(); try { _stmt.setQueryTimeout(seconds); } catch (SQLException e) { handleException(e); } } public void cancel() throws SQLException { checkOpen(); try { _stmt.cancel(); } catch (SQLException e) { handleException(e); } } public SQLWarning getWarnings() throws SQLException { checkOpen(); try { return _stmt.getWarnings(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public void clearWarnings() throws SQLException { checkOpen(); try { _stmt.clearWarnings(); } catch (SQLException e) { handleException(e); } } public void setCursorName(String name) throws SQLException { checkOpen(); try { _stmt.setCursorName(name); } catch (SQLException e) { handleException(e); } } public boolean execute(String sql) throws SQLException { checkOpen(); try { return _stmt.execute(sql); } catch (SQLException e) { handleException(e); return false; } } public int getUpdateCount() throws SQLException { checkOpen(); try { return _stmt.getUpdateCount(); } catch (SQLException e) { handleException(e); return 0; } } public boolean getMoreResults() throws SQLException { checkOpen(); try { return _stmt.getMoreResults(); } catch (SQLException e) { handleException(e); return false; } } public void setFetchDirection(int direction) throws SQLException { checkOpen(); try { _stmt.setFetchDirection(direction); } catch (SQLException e) { handleException(e); } } public int getFetchDirection() throws SQLException { checkOpen(); try { return _stmt.getFetchDirection(); } catch (SQLException e) { handleException(e); return 0; } } public void setFetchSize(int rows) throws SQLException { checkOpen(); try { _stmt.setFetchSize(rows); } catch (SQLException e) { handleException(e); } } public int getFetchSize() throws SQLException { checkOpen(); try { return _stmt.getFetchSize(); } catch (SQLException e) { handleException(e); return 0; } } public int getResultSetConcurrency() throws SQLException { checkOpen(); try { return _stmt.getResultSetConcurrency(); } catch (SQLException e) { handleException(e); return 0; } } public int getResultSetType() throws SQLException { checkOpen(); try { return _stmt.getResultSetType(); } catch (SQLException e) { handleException(e); return 0; } } public void addBatch(String sql) throws SQLException { checkOpen(); try { _stmt.addBatch(sql); } catch (SQLException e) { handleException(e); } } public void clearBatch() throws SQLException { checkOpen(); try { _stmt.clearBatch(); } catch (SQLException e) { handleException(e); } } public int[] executeBatch() throws SQLException { checkOpen(); try { return _stmt.executeBatch(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } /** * Returns a String representation of this object. * * @return String * @since 1.2.2 */ public String toString() { return _stmt.toString(); } public boolean getMoreResults(int current) throws SQLException { checkOpen(); try { return _stmt.getMoreResults(current); } catch (SQLException e) { handleException(e); return false; } } public ResultSet getGeneratedKeys() throws SQLException { checkOpen(); try { return DelegatingResultSet.wrapResultSet(this, _stmt.getGeneratedKeys()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { checkOpen(); try { return _stmt.executeUpdate(sql, autoGeneratedKeys); } catch (SQLException e) { handleException(e); return 0; } } public int executeUpdate(String sql, int columnIndexes[]) throws SQLException { checkOpen(); try { return _stmt.executeUpdate(sql, columnIndexes); } catch (SQLException e) { handleException(e); return 0; } } public int executeUpdate(String sql, String columnNames[]) throws SQLException { checkOpen(); try { return _stmt.executeUpdate(sql, columnNames); } catch (SQLException e) { handleException(e); return 0; } } public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { checkOpen(); try { return _stmt.execute(sql, autoGeneratedKeys); } catch (SQLException e) { handleException(e); return false; } } public boolean execute(String sql, int columnIndexes[]) throws SQLException { checkOpen(); try { return _stmt.execute(sql, columnIndexes); } catch (SQLException e) { handleException(e); return false; } } public boolean execute(String sql, String columnNames[]) throws SQLException { checkOpen(); try { return _stmt.execute(sql, columnNames); } catch (SQLException e) { handleException(e); return false; } } public int getResultSetHoldability() throws SQLException { checkOpen(); try { return _stmt.getResultSetHoldability(); } catch (SQLException e) { handleException(e); return 0; } } /* * Note was protected prior to JDBC 4 * TODO Consider adding build flags to make this protected unless we are * using JDBC 4. */ public boolean isClosed() throws SQLException { return _closed; } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return iface.isAssignableFrom(getClass()) || _stmt.isWrapperFor(iface); } public T unwrap(Class iface) throws SQLException { if (iface.isAssignableFrom(getClass())) { return iface.cast(this); } else if (iface.isAssignableFrom(_stmt.getClass())) { return iface.cast(_stmt); } else { return _stmt.unwrap(iface); } } public void setPoolable(boolean poolable) throws SQLException { checkOpen(); try { _stmt.setPoolable(poolable); } catch (SQLException e) { handleException(e); } } public boolean isPoolable() throws SQLException { checkOpen(); try { return _stmt.isPoolable(); } catch (SQLException e) { handleException(e); return false; } } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/overview.html0000644000175000017500000000201411333570550027036 0ustar drazzibdrazzib Overview of the org.apache.commons.dbcp component

Commons Database Connection Pooling

libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/0000755000175000017500000000000011337741616026631 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.jav0000644000175000017500000005174311333570550033530 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.IOException; import java.io.ObjectInputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.sql.ConnectionPoolDataSource; import org.apache.commons.dbcp.SQLNestedException; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; /** *

A pooling DataSource appropriate for deployment within * J2EE environment. There are many configuration options, most of which are * defined in the parent class. This datasource uses individual pools per * user, and some properties can be set specifically for a given user, if the * deployment environment can support initialization of mapped properties. * So for example, a pool of admin or write-access Connections can be * guaranteed a certain number of connections, separate from a maximum * set for users with read-only connections.

* *

User passwords can be changed without re-initializing the datasource. * When a getConnection(username, password) request is processed * with a password that is different from those used to create connections in the * pool associated with username, an attempt is made to create a * new connection using the supplied password and if this succeeds, the existing * pool is cleared and a new pool is created for connections using the new password.

* * * @author John D. McNally * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ public class PerUserPoolDataSource extends InstanceKeyDataSource { private static final long serialVersionUID = -3104731034410444060L; private int defaultMaxActive = GenericObjectPool.DEFAULT_MAX_ACTIVE; private int defaultMaxIdle = GenericObjectPool.DEFAULT_MAX_IDLE; private int defaultMaxWait = (int)Math.min(Integer.MAX_VALUE, GenericObjectPool.DEFAULT_MAX_WAIT); Map perUserDefaultAutoCommit = null; Map perUserDefaultTransactionIsolation = null; Map perUserMaxActive = null; Map perUserMaxIdle = null; Map perUserMaxWait = null; Map perUserDefaultReadOnly = null; /** * Map to keep track of Pools for a given user */ private transient Map /* */ managers = new HashMap(); /** * Default no-arg constructor for Serialization */ public PerUserPoolDataSource() { } /** * Close pool(s) being maintained by this datasource. */ public void close() { for (Iterator poolIter = managers.values().iterator(); poolIter.hasNext();) { try { ((CPDSConnectionFactory) poolIter.next()).getPool().close(); } catch (Exception closePoolException) { //ignore and try to close others. } } InstanceKeyObjectFactory.removeInstance(instanceKey); } // ------------------------------------------------------------------- // Properties /** * The maximum number of active connections that can be allocated from * this pool at the same time, or non-positive for no limit. * This value is used for any username which is not specified * in perUserMaxConnections. */ public int getDefaultMaxActive() { return (this.defaultMaxActive); } /** * The maximum number of active connections that can be allocated from * this pool at the same time, or non-positive for no limit. * This value is used for any username which is not specified * in perUserMaxConnections. The default is 8. */ public void setDefaultMaxActive(int maxActive) { assertInitializationAllowed(); this.defaultMaxActive = maxActive; } /** * The maximum number of active connections that can remain idle in the * pool, without extra ones being released, or negative for no limit. * This value is used for any username which is not specified * in perUserMaxIdle. */ public int getDefaultMaxIdle() { return (this.defaultMaxIdle); } /** * The maximum number of active connections that can remain idle in the * pool, without extra ones being released, or negative for no limit. * This value is used for any username which is not specified * in perUserMaxIdle. The default is 8. */ public void setDefaultMaxIdle(int defaultMaxIdle) { assertInitializationAllowed(); this.defaultMaxIdle = defaultMaxIdle; } /** * 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, or -1 to wait indefinitely. Will fail * immediately if value is 0. * This value is used for any username which is not specified * in perUserMaxWait. The default is -1. */ public int getDefaultMaxWait() { return (this.defaultMaxWait); } /** * 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, or -1 to wait indefinitely. Will fail * immediately if value is 0. * This value is used for any username which is not specified * in perUserMaxWait. The default is -1. */ public void setDefaultMaxWait(int defaultMaxWait) { assertInitializationAllowed(); this.defaultMaxWait = defaultMaxWait; } /** * The keys are usernames and the value is the --. Any * username specified here will override the value of defaultAutoCommit. */ public Boolean getPerUserDefaultAutoCommit(String key) { Boolean value = null; if (perUserDefaultAutoCommit != null) { value = (Boolean) perUserDefaultAutoCommit.get(key); } return value; } /** * The keys are usernames and the value is the --. Any * username specified here will override the value of defaultAutoCommit. */ public void setPerUserDefaultAutoCommit(String username, Boolean value) { assertInitializationAllowed(); if (perUserDefaultAutoCommit == null) { perUserDefaultAutoCommit = new HashMap(); } perUserDefaultAutoCommit.put(username, value); } /** * The isolation level of connections when returned from getConnection. * If null, the username will use the value of defaultTransactionIsolation. */ public Integer getPerUserDefaultTransactionIsolation(String username) { Integer value = null; if (perUserDefaultTransactionIsolation != null) { value = (Integer) perUserDefaultTransactionIsolation.get(username); } return value; } /** * The isolation level of connections when returned from getConnection. * Valid values are the constants defined in Connection. */ public void setPerUserDefaultTransactionIsolation(String username, Integer value) { assertInitializationAllowed(); if (perUserDefaultTransactionIsolation == null) { perUserDefaultTransactionIsolation = new HashMap(); } perUserDefaultTransactionIsolation.put(username, value); } /** * The maximum number of active connections that can be allocated from * this pool at the same time, or non-positive for no limit. * The keys are usernames and the value is the maximum connections. Any * username specified here will override the value of defaultMaxActive. */ public Integer getPerUserMaxActive(String username) { Integer value = null; if (perUserMaxActive != null) { value = (Integer) perUserMaxActive.get(username); } return value; } /** * The maximum number of active connections that can be allocated from * this pool at the same time, or non-positive for no limit. * The keys are usernames and the value is the maximum connections. Any * username specified here will override the value of defaultMaxActive. */ public void setPerUserMaxActive(String username, Integer value) { assertInitializationAllowed(); if (perUserMaxActive == null) { perUserMaxActive = new HashMap(); } perUserMaxActive.put(username, value); } /** * The maximum number of active connections that can remain idle in the * pool, without extra ones being released, or negative for no limit. * The keys are usernames and the value is the maximum connections. Any * username specified here will override the value of defaultMaxIdle. */ public Integer getPerUserMaxIdle(String username) { Integer value = null; if (perUserMaxIdle != null) { value = (Integer) perUserMaxIdle.get(username); } return value; } /** * The maximum number of active connections that can remain idle in the * pool, without extra ones being released, or negative for no limit. * The keys are usernames and the value is the maximum connections. Any * username specified here will override the value of defaultMaxIdle. */ public void setPerUserMaxIdle(String username, Integer value) { assertInitializationAllowed(); if (perUserMaxIdle == null) { perUserMaxIdle = new HashMap(); } perUserMaxIdle.put(username, value); } /** * 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, or -1 to wait indefinitely. Will fail * immediately if value is 0. * The keys are usernames and the value is the maximum connections. Any * username specified here will override the value of defaultMaxWait. */ public Integer getPerUserMaxWait(String username) { Integer value = null; if (perUserMaxWait != null) { value = (Integer) perUserMaxWait.get(username); } return value; } /** * 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, or -1 to wait indefinitely. Will fail * immediately if value is 0. * The keys are usernames and the value is the maximum connections. Any * username specified here will override the value of defaultMaxWait. */ public void setPerUserMaxWait(String username, Integer value) { assertInitializationAllowed(); if (perUserMaxWait == null) { perUserMaxWait = new HashMap(); } perUserMaxWait.put(username, value); } /** * The keys are usernames and the value is the --. Any * username specified here will override the value of defaultReadOnly. */ public Boolean getPerUserDefaultReadOnly(String username) { Boolean value = null; if (perUserDefaultReadOnly != null) { value = (Boolean) perUserDefaultReadOnly.get(username); } return value; } /** * The keys are usernames and the value is the --. Any * username specified here will override the value of defaultReadOnly. */ public void setPerUserDefaultReadOnly(String username, Boolean value) { assertInitializationAllowed(); if (perUserDefaultReadOnly == null) { perUserDefaultReadOnly = new HashMap(); } perUserDefaultReadOnly.put(username, value); } // ---------------------------------------------------------------------- // Instrumentation Methods /** * Get the number of active connections in the default pool. */ public int getNumActive() { return getNumActive(null, null); } /** * Get the number of active connections in the pool for a given user. */ public int getNumActive(String username, String password) { ObjectPool pool = getPool(getPoolKey(username,password)); return (pool == null) ? 0 : pool.getNumActive(); } /** * Get the number of idle connections in the default pool. */ public int getNumIdle() { return getNumIdle(null, null); } /** * Get the number of idle connections in the pool for a given user. */ public int getNumIdle(String username, String password) { ObjectPool pool = getPool(getPoolKey(username,password)); return (pool == null) ? 0 : pool.getNumIdle(); } // ---------------------------------------------------------------------- // Inherited abstract methods protected PooledConnectionAndInfo getPooledConnectionAndInfo(String username, String password) throws SQLException { final PoolKey key = getPoolKey(username,password); ObjectPool pool; PooledConnectionManager manager; synchronized(this) { manager = (PooledConnectionManager) managers.get(key); if (manager == null) { try { registerPool(username, password); manager = (PooledConnectionManager) managers.get(key); } catch (NamingException e) { throw new SQLNestedException("RegisterPool failed", e); } } pool = ((CPDSConnectionFactory) manager).getPool(); } PooledConnectionAndInfo info = null; try { info = (PooledConnectionAndInfo) pool.borrowObject(); } catch (NoSuchElementException ex) { throw new SQLNestedException( "Could not retrieve connection info from pool", ex); } catch (Exception e) { // See if failure is due to CPDSConnectionFactory authentication failure try { testCPDS(username, password); } catch (Exception ex) { throw (SQLException) new SQLException( "Could not retrieve connection info from pool").initCause(ex); } // New password works, so kill the old pool, create a new one, and borrow manager.closePool(username); synchronized (this) { managers.remove(key); } try { registerPool(username, password); pool = getPool(key); } catch (NamingException ne) { throw new SQLNestedException("RegisterPool failed", ne); } try { info = (PooledConnectionAndInfo)((ObjectPool) pool).borrowObject(); } catch (Exception ex) { throw (SQLException) new SQLException( "Could not retrieve connection info from pool").initCause(ex); } } return info; } protected void setupDefaults(Connection con, String username) throws SQLException { boolean defaultAutoCommit = isDefaultAutoCommit(); if (username != null) { Boolean userMax = getPerUserDefaultAutoCommit(username); if (userMax != null) { defaultAutoCommit = userMax.booleanValue(); } } boolean defaultReadOnly = isDefaultReadOnly(); if (username != null) { Boolean userMax = getPerUserDefaultReadOnly(username); if (userMax != null) { defaultReadOnly = userMax.booleanValue(); } } int defaultTransactionIsolation = getDefaultTransactionIsolation(); if (username != null) { Integer userMax = getPerUserDefaultTransactionIsolation(username); if (userMax != null) { defaultTransactionIsolation = userMax.intValue(); } } if (con.getAutoCommit() != defaultAutoCommit) { con.setAutoCommit(defaultAutoCommit); } if (defaultTransactionIsolation != UNKNOWN_TRANSACTIONISOLATION) { con.setTransactionIsolation(defaultTransactionIsolation); } if (con.isReadOnly() != defaultReadOnly) { con.setReadOnly(defaultReadOnly); } } protected PooledConnectionManager getConnectionManager(UserPassKey upkey) { return (PooledConnectionManager) managers.get(getPoolKey( upkey.getUsername(), upkey.getPassword())); } /** * Returns a PerUserPoolDataSource {@link Reference}. * * @since 1.2.2 */ public Reference getReference() throws NamingException { Reference ref = new Reference(getClass().getName(), PerUserPoolDataSourceFactory.class.getName(), null); ref.add(new StringRefAddr("instanceKey", instanceKey)); return ref; } private PoolKey getPoolKey(String username, String password) { return new PoolKey(getDataSourceName(), username); } private synchronized void registerPool( String username, String password) throws javax.naming.NamingException, SQLException { ConnectionPoolDataSource cpds = testCPDS(username, password); Integer userMax = getPerUserMaxActive(username); int maxActive = (userMax == null) ? getDefaultMaxActive() : userMax.intValue(); userMax = getPerUserMaxIdle(username); int maxIdle = (userMax == null) ? getDefaultMaxIdle() : userMax.intValue(); userMax = getPerUserMaxWait(username); int maxWait = (userMax == null) ? getDefaultMaxWait() : userMax.intValue(); // Create an object pool to contain our PooledConnections GenericObjectPool pool = new GenericObjectPool(null); pool.setMaxActive(maxActive); pool.setMaxIdle(maxIdle); pool.setMaxWait(maxWait); pool.setWhenExhaustedAction(whenExhaustedAction(maxActive, maxWait)); pool.setTestOnBorrow(getTestOnBorrow()); pool.setTestOnReturn(getTestOnReturn()); pool.setTimeBetweenEvictionRunsMillis( getTimeBetweenEvictionRunsMillis()); pool.setNumTestsPerEvictionRun(getNumTestsPerEvictionRun()); pool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis()); pool.setTestWhileIdle(getTestWhileIdle()); // Set up the factory we will use (passing the pool associates // the factory with the pool, so we do not have to do so // explicitly) CPDSConnectionFactory factory = new CPDSConnectionFactory(cpds, pool, getValidationQuery(), isRollbackAfterValidation(), username, password); Object old = managers.put(getPoolKey(username,password), factory); if (old != null) { throw new IllegalStateException("Pool already contains an entry for this user/password: "+username); } } /** * Supports Serialization interface. * * @param in a java.io.ObjectInputStream value * @exception IOException if an error occurs * @exception ClassNotFoundException if an error occurs */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { try { in.defaultReadObject(); PerUserPoolDataSource oldDS = (PerUserPoolDataSource) new PerUserPoolDataSourceFactory() .getObjectInstance(getReference(), null, null, null); this.managers = oldDS.managers; } catch (NamingException e) { throw new IOException("NamingException: " + e); } } /** * Returns the object pool associated with the given PoolKey. * * @param key PoolKey identifying the pool * @return the GenericObjectPool pooling connections for the username and datasource * specified by the PoolKey */ private GenericObjectPool getPool(PoolKey key) { CPDSConnectionFactory mgr = (CPDSConnectionFactory) managers.get(key); return mgr == null ? null : (GenericObjectPool) mgr.getPool(); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/package.html0000644000175000017500000001235211333570550031106 0ustar drazzibdrazzib

This package contains two DataSources: PerUserPoolDataSource and SharedPoolDataSource which provide a database connection pool. Below are a couple of usage examples. One shows deployment into a JNDI system. The other is a simple example initializing the pool using standard java code.

JNDI

Most J2EE containers will provide some way of deploying resources into JNDI. The method will vary among containers, but once the resource is available via JNDI, the application can access the resource in a container independent manner. The following example shows deployment into tomcat (catalina).

In server.xml, the following would be added to the <Context> for your webapp:


 <Resource name="jdbc/bookstore" auth="Container"
            type="org.apache.commons.dbcp.datasources.PerUserPoolPoolDataSource"/>
  <ResourceParams name="jdbc/bookstore">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.datasources.PerUserPoolDataSourceFactory</value>
    </parameter>
    <parameter>
      <name>dataSourceName</name><value>java:comp/env/jdbc/bookstoreCPDS</value>
    </parameter>
    <parameter>
      <name>defaultMaxActive</name><value>30</value>
    </parameter>

  </ResourceParams>

In web.xml. Note that elements must be given in the order of the dtd described in the servlet specification:

<resource-ref>
  <description>
    Resource reference to a factory for java.sql.Connection
    instances that may be used for talking to a particular
    database that is configured in the server.xml file.
  </description>
  <res-ref-name>
    jdbc/bookstore
  </res-ref-name>
  <res-type>
    org.apache.commons.dbcp.datasources.PerUserPoolDataSource
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>

The DataSource is now available to the application as shown below:


    Context ctx = new InitialContext();                
    DataSource ds = (DataSource)
        ctx.lookup("java:comp/env/jdbc/bookstore");
    Connection con = null;
    try
    {
        con = ds.getConnection();
        ... 
        use the connection
        ...
    }
    finally
    {
        if (con != null)
            con.close();
    }

The reference to the DataSource could be maintained, for multiple getConnection() requests. Or the DataSource can be looked up in different parts of the application code. PerUserPoolDataSourceFactory and SharedPoolDataSourceFactory will maintain the state of the pool between different lookups. This behavior may be different in other implementations.

Without JNDI

Connection pooling is useful in applications regardless of whether they run in a J2EE environment and a DataSource can be used within a simpler environment. The example below shows SharedPoolDataSource using DriverAdapterCPDS as the backend source, though any CPDS is applicable.


public class Pool
{
    private static DataSource ds;

    static
    {
        DriverAdapterCPDS cpds = new DriverAdapterCPDS();
        cpds.setDriver("org.gjt.mm.mysql.Driver");
        cpds.setUrl("jdbc:mysql://localhost:3306/bookstore");
        cpds.setUser("foo");
        cpds.setPassword(null);

        SharedPoolDataSource tds = new SharedPoolDataSource();
        tds.setConnectionPoolDataSource(cpds);
        tds.setMaxActive(10);
        tds.setMaxWait(50);

        ds = tds;
    }

    public static getConnection()
    {
        return ds.getConnection();
    }  
}

This class can then be used wherever a connection is needed:

    Connection con = null;
    try
    {
        con = Pool.getConnection();
        ... 
        use the connection
        ...
    }
    finally
    {
        if (con != null)
            con.close();
    }
././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/InstanceKeyObjectFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/InstanceKeyObjectFactory.0000644000175000017500000002062411333570550033523 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Hashtable; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import java.util.Properties; import javax.naming.Context; import javax.naming.Name; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.spi.ObjectFactory; /** * A JNDI ObjectFactory which creates SharedPoolDataSources * or PerUserPoolDataSources * * @version $Revision: 814246 $ $Date: 2009-09-12 18:44:58 -0400 (Sat, 12 Sep 2009) $ */ abstract class InstanceKeyObjectFactory implements ObjectFactory { private static final Map instanceMap = new HashMap(); synchronized static String registerNewInstance(InstanceKeyDataSource ds) { int max = 0; Iterator i = instanceMap.keySet().iterator(); while (i.hasNext()) { Object obj = i.next(); if (obj instanceof String) { try { max = Math.max(max, Integer.valueOf((String)obj).intValue()); } catch (NumberFormatException e) { // no sweat, ignore those keys } } } String instanceKey = String.valueOf(max + 1); // put a placeholder here for now, so other instances will not // take our key. we will replace with a pool when ready. instanceMap.put(instanceKey, ds); return instanceKey; } static void removeInstance(String key) { instanceMap.remove(key); } /** * Close all pools associated with this class. */ public static void closeAll() throws Exception { //Get iterator to loop over all instances of this datasource. Iterator instanceIterator = instanceMap.entrySet().iterator(); while (instanceIterator.hasNext()) { ((InstanceKeyDataSource) ((Map.Entry) instanceIterator.next()).getValue()).close(); } instanceMap.clear(); } /** * implements ObjectFactory to create an instance of SharedPoolDataSource * or PerUserPoolDataSource */ public Object getObjectInstance(Object refObj, Name name, Context context, Hashtable env) throws IOException, ClassNotFoundException { // The spec says to return null if we can't create an instance // of the reference Object obj = null; if (refObj instanceof Reference) { Reference ref = (Reference) refObj; if (isCorrectClass(ref.getClassName())) { RefAddr ra = ref.get("instanceKey"); if (ra != null && ra.getContent() != null) { // object was bound to jndi via Referenceable api. obj = instanceMap.get(ra.getContent()); } else { // tomcat jndi creates a Reference out of server.xml // configuration and passes it to an // instance of the factory given in server.xml. String key = null; if (name != null) { key = name.toString(); obj = instanceMap.get(key); } if (obj == null) { InstanceKeyDataSource ds = getNewInstance(ref); setCommonProperties(ref, ds); obj = ds; if (key != null) { instanceMap.put(key, ds); } } } } } return obj; } private void setCommonProperties(Reference ref, InstanceKeyDataSource ikds) throws IOException, ClassNotFoundException { RefAddr ra = ref.get("dataSourceName"); if (ra != null && ra.getContent() != null) { ikds.setDataSourceName(ra.getContent().toString()); } ra = ref.get("defaultAutoCommit"); if (ra != null && ra.getContent() != null) { ikds.setDefaultAutoCommit(Boolean.valueOf( ra.getContent().toString()).booleanValue()); } ra = ref.get("defaultReadOnly"); if (ra != null && ra.getContent() != null) { ikds.setDefaultReadOnly(Boolean.valueOf( ra.getContent().toString()).booleanValue()); } ra = ref.get("description"); if (ra != null && ra.getContent() != null) { ikds.setDescription(ra.getContent().toString()); } ra = ref.get("jndiEnvironment"); if (ra != null && ra.getContent() != null) { byte[] serialized = (byte[]) ra.getContent(); ikds.jndiEnvironment = (Properties) deserialize(serialized); } ra = ref.get("loginTimeout"); if (ra != null && ra.getContent() != null) { ikds.setLoginTimeout( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("testOnBorrow"); if (ra != null && ra.getContent() != null) { ikds.setTestOnBorrow(Boolean.valueOf( ra.getContent().toString()).booleanValue()); } ra = ref.get("testOnReturn"); if (ra != null && ra.getContent() != null) { ikds.setTestOnReturn(Boolean.valueOf( ra.getContent().toString()).booleanValue()); } ra = ref.get("timeBetweenEvictionRunsMillis"); if (ra != null && ra.getContent() != null) { ikds.setTimeBetweenEvictionRunsMillis( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("numTestsPerEvictionRun"); if (ra != null && ra.getContent() != null) { ikds.setNumTestsPerEvictionRun( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("minEvictableIdleTimeMillis"); if (ra != null && ra.getContent() != null) { ikds.setMinEvictableIdleTimeMillis( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("testWhileIdle"); if (ra != null && ra.getContent() != null) { ikds.setTestWhileIdle(Boolean.valueOf( ra.getContent().toString()).booleanValue()); } ra = ref.get("validationQuery"); if (ra != null && ra.getContent() != null) { ikds.setValidationQuery(ra.getContent().toString()); } } /** * @return true if and only if className is the value returned * from getClass().getName().toString() */ protected abstract boolean isCorrectClass(String className); /** * Creates an instance of the subclass and sets any properties * contained in the Reference. */ protected abstract InstanceKeyDataSource getNewInstance(Reference ref) throws IOException, ClassNotFoundException; /** * used to set some properties saved within a Reference */ protected static final Object deserialize(byte[] data) throws IOException, ClassNotFoundException { ObjectInputStream in = null; try { in = new ObjectInputStream(new ByteArrayInputStream(data)); return in.readObject(); } finally { if (in != null) { try { in.close(); } catch (IOException ex) { } } } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/InstanceKeyDataSource.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/InstanceKeyDataSource.jav0000644000175000017500000010020711333570550033514 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.Serializable; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.util.NoSuchElementException; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.naming.Referenceable; import javax.sql.ConnectionPoolDataSource; import javax.sql.DataSource; import javax.sql.PooledConnection; import org.apache.commons.dbcp.SQLNestedException; import org.apache.commons.pool.impl.GenericObjectPool; /** *

The base class for SharedPoolDataSource and * PerUserPoolDataSource. Many of the configuration properties * are shared and defined here. This class is declared public in order * to allow particular usage with commons-beanutils; do not make direct * use of it outside of commons-dbcp. *

* *

* A J2EE container will normally provide some method of initializing the * DataSource whose attributes are presented * as bean getters/setters and then deploying it via JNDI. It is then * available to an application as a source of pooled logical connections to * the database. The pool needs a source of physical connections. This * source is in the form of a ConnectionPoolDataSource that * can be specified via the {@link #setDataSourceName(String)} used to * lookup the source via JNDI. *

* *

* Although normally used within a JNDI environment, A DataSource * can be instantiated and initialized as any bean. In this case the * ConnectionPoolDataSource will likely be instantiated in * a similar manner. This class allows the physical source of connections * to be attached directly to this pool using the * {@link #setConnectionPoolDataSource(ConnectionPoolDataSource)} method. *

* *

* The dbcp package contains an adapter, * {@link org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS}, * that can be used to allow the use of DataSource's based on this * class with jdbc driver implementations that do not supply a * ConnectionPoolDataSource, but still * provide a {@link java.sql.Driver} implementation. *

* *

* The package documentation contains an * example using Apache Tomcat and JNDI and it also contains a non-JNDI example. *

* * @author John D. McNally * @version $Revision: 907428 $ $Date: 2010-02-07 09:59:08 -0500 (Sun, 07 Feb 2010) $ */ public abstract class InstanceKeyDataSource implements DataSource, Referenceable, Serializable { private static final long serialVersionUID = -4243533936955098795L; private static final String GET_CONNECTION_CALLED = "A Connection was already requested from this source, " + "further initialization is not allowed."; private static final String BAD_TRANSACTION_ISOLATION = "The requested TransactionIsolation level is invalid."; /** * Internal constant to indicate the level is not set. */ protected static final int UNKNOWN_TRANSACTIONISOLATION = -1; /** Guards property setters - once true, setters throw IllegalStateException */ private volatile boolean getConnectionCalled = false; /** Underlying source of PooledConnections */ private ConnectionPoolDataSource dataSource = null; /** DataSource Name used to find the ConnectionPoolDataSource */ private String dataSourceName = null; // Default connection properties private boolean defaultAutoCommit = false; private int defaultTransactionIsolation = UNKNOWN_TRANSACTIONISOLATION; private boolean defaultReadOnly = false; /** Description */ private String description = null; /** Environment that may be used to set up a jndi initial context. */ Properties jndiEnvironment = null; /** Login TimeOut in seconds */ private int loginTimeout = 0; /** Log stream */ private PrintWriter logWriter = null; // Pool properties private boolean _testOnBorrow = GenericObjectPool.DEFAULT_TEST_ON_BORROW; private boolean _testOnReturn = GenericObjectPool.DEFAULT_TEST_ON_RETURN; private int _timeBetweenEvictionRunsMillis = (int) Math.min(Integer.MAX_VALUE, GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS); private int _numTestsPerEvictionRun = GenericObjectPool.DEFAULT_NUM_TESTS_PER_EVICTION_RUN; private int _minEvictableIdleTimeMillis = (int) Math.min(Integer.MAX_VALUE, GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS); private boolean _testWhileIdle = GenericObjectPool.DEFAULT_TEST_WHILE_IDLE; private String validationQuery = null; private boolean rollbackAfterValidation = false; /** true iff one of the setters for testOnBorrow, testOnReturn, testWhileIdle has been called. */ private boolean testPositionSet = false; /** Instance key */ protected String instanceKey = null; /** * Default no-arg constructor for Serialization */ public InstanceKeyDataSource() { defaultAutoCommit = true; } /** * Throws an IllegalStateException, if a PooledConnection has already * been requested. */ protected void assertInitializationAllowed() throws IllegalStateException { if (getConnectionCalled) { throw new IllegalStateException(GET_CONNECTION_CALLED); } } /** * Close the connection pool being maintained by this datasource. */ public abstract void close() throws Exception; protected abstract PooledConnectionManager getConnectionManager(UserPassKey upkey); /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return false; } public T unwrap(Class iface) throws SQLException { throw new SQLException("InstanceKeyDataSource is not a wrapper."); } /* JDBC_4_ANT_KEY_END */ // ------------------------------------------------------------------- // Properties /** * Get the value of connectionPoolDataSource. This method will return * null, if the backing datasource is being accessed via jndi. * * @return value of connectionPoolDataSource. */ public ConnectionPoolDataSource getConnectionPoolDataSource() { return dataSource; } /** * Set the backend ConnectionPoolDataSource. This property should not be * set if using jndi to access the datasource. * * @param v Value to assign to connectionPoolDataSource. */ public void setConnectionPoolDataSource(ConnectionPoolDataSource v) { assertInitializationAllowed(); if (dataSourceName != null) { throw new IllegalStateException( "Cannot set the DataSource, if JNDI is used."); } if (dataSource != null) { throw new IllegalStateException( "The CPDS has already been set. It cannot be altered."); } dataSource = v; instanceKey = InstanceKeyObjectFactory.registerNewInstance(this); } /** * Get the name of the ConnectionPoolDataSource which backs this pool. * This name is used to look up the datasource from a jndi service * provider. * * @return value of dataSourceName. */ public String getDataSourceName() { return dataSourceName; } /** * Set the name of the ConnectionPoolDataSource which backs this pool. * This name is used to look up the datasource from a jndi service * provider. * * @param v Value to assign to dataSourceName. */ public void setDataSourceName(String v) { assertInitializationAllowed(); if (dataSource != null) { throw new IllegalStateException( "Cannot set the JNDI name for the DataSource, if already " + "set using setConnectionPoolDataSource."); } if (dataSourceName != null) { throw new IllegalStateException( "The DataSourceName has already been set. " + "It cannot be altered."); } this.dataSourceName = v; instanceKey = InstanceKeyObjectFactory.registerNewInstance(this); } /** * Get the value of defaultAutoCommit, which defines the state of * connections handed out from this pool. The value can be changed * on the Connection using Connection.setAutoCommit(boolean). * The default is true. * * @return value of defaultAutoCommit. */ public boolean isDefaultAutoCommit() { return defaultAutoCommit; } /** * Set the value of defaultAutoCommit, which defines the state of * connections handed out from this pool. The value can be changed * on the Connection using Connection.setAutoCommit(boolean). * The default is true. * * @param v Value to assign to defaultAutoCommit. */ public void setDefaultAutoCommit(boolean v) { assertInitializationAllowed(); this.defaultAutoCommit = v; } /** * Get the value of defaultReadOnly, which defines the state of * connections handed out from this pool. The value can be changed * on the Connection using Connection.setReadOnly(boolean). * The default is false. * * @return value of defaultReadOnly. */ public boolean isDefaultReadOnly() { return defaultReadOnly; } /** * Set the value of defaultReadOnly, which defines the state of * connections handed out from this pool. The value can be changed * on the Connection using Connection.setReadOnly(boolean). * The default is false. * * @param v Value to assign to defaultReadOnly. */ public void setDefaultReadOnly(boolean v) { assertInitializationAllowed(); this.defaultReadOnly = v; } /** * Get the value of defaultTransactionIsolation, which defines the state of * connections handed out from this pool. The value can be changed * on the Connection using Connection.setTransactionIsolation(int). * If this method returns -1, the default is JDBC driver dependent. * * @return value of defaultTransactionIsolation. */ public int getDefaultTransactionIsolation() { return defaultTransactionIsolation; } /** * Set the value of defaultTransactionIsolation, which defines the state of * connections handed out from this pool. The value can be changed * on the Connection using Connection.setTransactionIsolation(int). * The default is JDBC driver dependent. * * @param v Value to assign to defaultTransactionIsolation */ public void setDefaultTransactionIsolation(int v) { assertInitializationAllowed(); switch (v) { case Connection.TRANSACTION_NONE: case Connection.TRANSACTION_READ_COMMITTED: case Connection.TRANSACTION_READ_UNCOMMITTED: case Connection.TRANSACTION_REPEATABLE_READ: case Connection.TRANSACTION_SERIALIZABLE: break; default: throw new IllegalArgumentException(BAD_TRANSACTION_ISOLATION); } this.defaultTransactionIsolation = v; } /** * Get the description. This property is defined by jdbc as for use with * GUI (or other) tools that might deploy the datasource. It serves no * internal purpose. * * @return value of description. */ public String getDescription() { return description; } /** * Set the description. This property is defined by jdbc as for use with * GUI (or other) tools that might deploy the datasource. It serves no * internal purpose. * * @param v Value to assign to description. */ public void setDescription(String v) { this.description = v; } /** * Get the value of jndiEnvironment which is used when instantiating * a jndi InitialContext. This InitialContext is used to locate the * backend ConnectionPoolDataSource. * * @return value of jndiEnvironment. */ public String getJndiEnvironment(String key) { String value = null; if (jndiEnvironment != null) { value = jndiEnvironment.getProperty(key); } return value; } /** * Sets the value of the given JNDI environment property to be used when * instantiating a JNDI InitialContext. This InitialContext is used to * locate the backend ConnectionPoolDataSource. * * @param key the JNDI environment property to set. * @param value the value assigned to specified JNDI environment property. */ public void setJndiEnvironment(String key, String value) { if (jndiEnvironment == null) { jndiEnvironment = new Properties(); } jndiEnvironment.setProperty(key, value); } /** * Get the value of loginTimeout. * @return value of loginTimeout. */ public int getLoginTimeout() { return loginTimeout; } /** * Set the value of loginTimeout. * @param v Value to assign to loginTimeout. */ public void setLoginTimeout(int v) { this.loginTimeout = v; } /** * Get the value of logWriter. * @return value of logWriter. */ public PrintWriter getLogWriter() { if (logWriter == null) { logWriter = new PrintWriter(System.out); } return logWriter; } /** * Set the value of logWriter. * @param v Value to assign to logWriter. */ public void setLogWriter(PrintWriter v) { this.logWriter = v; } /** * @see #getTestOnBorrow */ public final boolean isTestOnBorrow() { return getTestOnBorrow(); } /** * When true, objects will be * {*link PoolableObjectFactory#validateObject validated} * before being returned by the {*link #borrowObject} * method. If the object fails to validate, * it will be dropped from the pool, and we will attempt * to borrow another. * * @see #setTestOnBorrow */ public boolean getTestOnBorrow() { return _testOnBorrow; } /** * When true, objects will be * {*link PoolableObjectFactory#validateObject validated} * before being returned by the {*link #borrowObject} * method. If the object fails to validate, * it will be dropped from the pool, and we will attempt * to borrow another. For a true value to have any effect, * the validationQuery property must be set to a non-null * string. * * @see #getTestOnBorrow */ public void setTestOnBorrow(boolean testOnBorrow) { assertInitializationAllowed(); _testOnBorrow = testOnBorrow; testPositionSet = true; } /** * @see #getTestOnReturn */ public final boolean isTestOnReturn() { return getTestOnReturn(); } /** * When true, objects will be * {*link PoolableObjectFactory#validateObject validated} * before being returned to the pool within the * {*link #returnObject}. * * @see #setTestOnReturn */ public boolean getTestOnReturn() { return _testOnReturn; } /** * When true, objects will be * {*link PoolableObjectFactory#validateObject validated} * before being returned to the pool within the * {*link #returnObject}. For a true value to have any effect, * the validationQuery property must be set to a non-null * string. * * @see #getTestOnReturn */ public void setTestOnReturn(boolean testOnReturn) { assertInitializationAllowed(); _testOnReturn = testOnReturn; testPositionSet = true; } /** * Returns the number of milliseconds to sleep between runs of the * idle object evictor thread. * When non-positive, no idle object evictor thread will be * run. * * @see #setTimeBetweenEvictionRunsMillis */ public int getTimeBetweenEvictionRunsMillis() { return _timeBetweenEvictionRunsMillis; } /** * Sets the number of milliseconds to sleep between runs of the * idle object evictor thread. * When non-positive, no idle object evictor thread will be * run. * * @see #getTimeBetweenEvictionRunsMillis */ public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) { assertInitializationAllowed(); _timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } /** * Returns the number of objects to examine during each run of the * idle object evictor thread (if any). * * @see #setNumTestsPerEvictionRun * @see #setTimeBetweenEvictionRunsMillis */ public int getNumTestsPerEvictionRun() { return _numTestsPerEvictionRun; } /** * Sets the number of objects to examine during each run of the * idle object evictor thread (if any). *

* When a negative value is supplied, ceil({*link #numIdle})/abs({*link #getNumTestsPerEvictionRun}) * tests will be run. I.e., when the value is -n, roughly one nth of the * idle objects will be tested per run. * * @see #getNumTestsPerEvictionRun * @see #setTimeBetweenEvictionRunsMillis */ public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) { assertInitializationAllowed(); _numTestsPerEvictionRun = numTestsPerEvictionRun; } /** * Returns the minimum amount of time an object may sit idle in the pool * before it is eligable for eviction by the idle object evictor * (if any). * * @see #setMinEvictableIdleTimeMillis * @see #setTimeBetweenEvictionRunsMillis */ public int getMinEvictableIdleTimeMillis() { return _minEvictableIdleTimeMillis; } /** * Sets the minimum amount of time an object may sit idle in the pool * before it is eligable for eviction by the idle object evictor * (if any). * When non-positive, no objects will be evicted from the pool * due to idle time alone. * * @see #getMinEvictableIdleTimeMillis * @see #setTimeBetweenEvictionRunsMillis */ public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) { assertInitializationAllowed(); _minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } /** * @see #getTestWhileIdle */ public final boolean isTestWhileIdle() { return getTestWhileIdle(); } /** * When true, objects will be * {*link PoolableObjectFactory#validateObject validated} * by the idle object evictor (if any). If an object * fails to validate, it will be dropped from the pool. * * @see #setTestWhileIdle * @see #setTimeBetweenEvictionRunsMillis */ public boolean getTestWhileIdle() { return _testWhileIdle; } /** * When true, objects will be * {*link PoolableObjectFactory#validateObject validated} * by the idle object evictor (if any). If an object * fails to validate, it will be dropped from the pool. For a * true value to have any effect, * the validationQuery property must be set to a non-null * string. * * @see #getTestWhileIdle * @see #setTimeBetweenEvictionRunsMillis */ public void setTestWhileIdle(boolean testWhileIdle) { assertInitializationAllowed(); _testWhileIdle = testWhileIdle; testPositionSet = true; } /** * The SQL query that will be used to validate connections from this pool * before returning them to the caller. If specified, this query * MUST be an SQL SELECT statement that returns at least * one row. */ public String getValidationQuery() { return (this.validationQuery); } /** * The SQL query that will be used to validate connections from this pool * before returning them to the caller. If specified, this query * MUST be an SQL SELECT statement that returns at least * one row. If none of the properties, testOnBorow, testOnReturn, testWhileIdle * have been previously set, calling this method sets testOnBorrow to true. */ public void setValidationQuery(String validationQuery) { assertInitializationAllowed(); this.validationQuery = validationQuery; if (!testPositionSet) { setTestOnBorrow(true); } } /** * Whether a rollback will be issued after executing the SQL query * that will be used to validate connections from this pool * before returning them to the caller. * * @return true if a rollback will be issued after executing the * validation query * @since 1.2.2 */ public boolean isRollbackAfterValidation() { return (this.rollbackAfterValidation); } /** * Whether a rollback will be issued after executing the SQL query * that will be used to validate connections from this pool * before returning them to the caller. Default behavior is NOT * to issue a rollback. The setting will only have an effect * if a validation query is set * * @param rollbackAfterValidation new property value * @since 1.2.2 */ public void setRollbackAfterValidation(boolean rollbackAfterValidation) { assertInitializationAllowed(); this.rollbackAfterValidation = rollbackAfterValidation; } // ---------------------------------------------------------------------- // Instrumentation Methods // ---------------------------------------------------------------------- // DataSource implementation /** * Attempt to establish a database connection. */ public Connection getConnection() throws SQLException { return getConnection(null, null); } /** * Attempt to retrieve a database connection using {@link #getPooledConnectionAndInfo(String, String)} * with the provided username and password. The password on the {@link PooledConnectionAndInfo} * instance returned by getPooledConnectionAndInfo is compared to the password * parameter. If the comparison fails, a database connection using the supplied username and password * is attempted. If the connection attempt fails, an SQLException is thrown, indicating that the given password * did not match the password used to create the pooled connection. If the connection attempt succeeds, this * means that the database password has been changed. In this case, the PooledConnectionAndInfo * instance retrieved with the old password is destroyed and the getPooledConnectionAndInfo is * repeatedly invoked until a PooledConnectionAndInfo instance with the new password is returned. * */ public Connection getConnection(String username, String password) throws SQLException { if (instanceKey == null) { throw new SQLException("Must set the ConnectionPoolDataSource " + "through setDataSourceName or setConnectionPoolDataSource" + " before calling getConnection."); } getConnectionCalled = true; PooledConnectionAndInfo info = null; try { info = getPooledConnectionAndInfo(username, password); } catch (NoSuchElementException e) { closeDueToException(info); throw new SQLNestedException("Cannot borrow connection from pool", e); } catch (RuntimeException e) { closeDueToException(info); throw e; } catch (SQLException e) { closeDueToException(info); throw e; } catch (Exception e) { closeDueToException(info); throw new SQLNestedException("Cannot borrow connection from pool", e); } if (!(null == password ? null == info.getPassword() : password.equals(info.getPassword()))) { // Password on PooledConnectionAndInfo does not match try { // See if password has changed by attempting connection testCPDS(username, password); } catch (SQLException ex) { // Password has not changed, so refuse client, but return connection to the pool closeDueToException(info); throw new SQLException("Given password did not match password used" + " to create the PooledConnection."); } catch (javax.naming.NamingException ne) { throw (SQLException) new SQLException( "NamingException encountered connecting to database").initCause(ne); } /* * Password must have changed -> destroy connection and keep retrying until we get a new, good one, * destroying any idle connections with the old passowrd as we pull them from the pool. */ final UserPassKey upkey = info.getUserPassKey(); final PooledConnectionManager manager = getConnectionManager(upkey); manager.invalidate(info.getPooledConnection()); // Destroy and remove from pool manager.setPassword(upkey.getPassword()); // Reset the password on the factory if using CPDSConnectionFactory info = null; for (int i = 0; i < 10; i++) { // Bound the number of retries - only needed if bad instances return try { info = getPooledConnectionAndInfo(username, password); } catch (NoSuchElementException e) { closeDueToException(info); throw new SQLNestedException("Cannot borrow connection from pool", e); } catch (RuntimeException e) { closeDueToException(info); throw e; } catch (SQLException e) { closeDueToException(info); throw e; } catch (Exception e) { closeDueToException(info); throw new SQLNestedException("Cannot borrow connection from pool", e); } if (info != null && password.equals(info.getPassword())) { break; } else { if (info != null) { manager.invalidate(info.getPooledConnection()); } info = null; } } if (info == null) { throw new SQLException("Cannot borrow connection from pool - password change failure."); } } Connection con = info.getPooledConnection().getConnection(); try { setupDefaults(con, username); con.clearWarnings(); return con; } catch (SQLException ex) { try { con.close(); } catch (Exception exc) { getLogWriter().println( "ignoring exception during close: " + exc); } throw ex; } } protected abstract PooledConnectionAndInfo getPooledConnectionAndInfo(String username, String password) throws SQLException; protected abstract void setupDefaults(Connection con, String username) throws SQLException; private void closeDueToException(PooledConnectionAndInfo info) { if (info != null) { try { info.getPooledConnection().getConnection().close(); } catch (Exception e) { // do not throw this exception because we are in the middle // of handling another exception. But record it because // it potentially leaks connections from the pool. getLogWriter().println("[ERROR] Could not return connection to " + "pool during exception handling. " + e.getMessage()); } } } protected ConnectionPoolDataSource testCPDS(String username, String password) throws javax.naming.NamingException, SQLException { // The source of physical db connections ConnectionPoolDataSource cpds = this.dataSource; if (cpds == null) { Context ctx = null; if (jndiEnvironment == null) { ctx = new InitialContext(); } else { ctx = new InitialContext(jndiEnvironment); } Object ds = ctx.lookup(dataSourceName); if (ds instanceof ConnectionPoolDataSource) { cpds = (ConnectionPoolDataSource) ds; } else { throw new SQLException("Illegal configuration: " + "DataSource " + dataSourceName + " (" + ds.getClass().getName() + ")" + " doesn't implement javax.sql.ConnectionPoolDataSource"); } } // try to get a connection with the supplied username/password PooledConnection conn = null; try { if (username != null) { conn = cpds.getPooledConnection(username, password); } else { conn = cpds.getPooledConnection(); } if (conn == null) { throw new SQLException( "Cannot connect using the supplied username/password"); } } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { // at least we could connect } } } return cpds; } protected byte whenExhaustedAction(int maxActive, int maxWait) { byte whenExhausted = GenericObjectPool.WHEN_EXHAUSTED_BLOCK; if (maxActive <= 0) { whenExhausted = GenericObjectPool.WHEN_EXHAUSTED_GROW; } else if (maxWait == 0) { whenExhausted = GenericObjectPool.WHEN_EXHAUSTED_FAIL; } return whenExhausted; } // ---------------------------------------------------------------------- // Referenceable implementation /** * Retrieves the Reference of this object. * Note: InstanceKeyDataSource subclasses * should override this method. The implementaion included below * is not robust and will be removed at the next major version DBCP * release. * * @return The non-null Reference of this object. * @exception NamingException If a naming exception was encountered * while retrieving the reference. */ // TODO: Remove the implementation of this method at next major // version release. public Reference getReference() throws NamingException { final String className = getClass().getName(); final String factoryName = className + "Factory"; // XXX: not robust Reference ref = new Reference(className, factoryName, null); ref.add(new StringRefAddr("instanceKey", instanceKey)); return ref; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/CPDSConnectionFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/CPDSConnectionFactory.jav0000644000175000017500000003075411333570550033436 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; import javax.sql.ConnectionPoolDataSource; import javax.sql.PooledConnection; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.PoolableObjectFactory; /** * A {@link PoolableObjectFactory} that creates * {@link PoolableConnection}s. * * @author John D. McNally * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ class CPDSConnectionFactory implements PoolableObjectFactory, ConnectionEventListener, PooledConnectionManager { private static final String NO_KEY_MESSAGE = "close() was called on a Connection, but " + "I have no record of the underlying PooledConnection."; private final ConnectionPoolDataSource _cpds; private final String _validationQuery; private final boolean _rollbackAfterValidation; private final ObjectPool _pool; private String _username = null; private String _password = null; /** * Map of PooledConnections for which close events are ignored. * Connections are muted when they are being validated. */ private final Map /* */ validatingMap = new HashMap(); /** * Map of PooledConnectionAndInfo instances */ private final WeakHashMap /* */ pcMap = new WeakHashMap(); /** * Create a new PoolableConnectionFactory. * * @param cpds the ConnectionPoolDataSource from which to obtain * PooledConnection's * @param pool the {@link ObjectPool} in which to pool those * {@link Connection}s * @param validationQuery a query to use to {@link #validateObject validate} * {@link Connection}s. Should return at least one row. May be * null * @param username * @param password */ public CPDSConnectionFactory(ConnectionPoolDataSource cpds, ObjectPool pool, String validationQuery, String username, String password) { this(cpds, pool, validationQuery, false, username, password); } /** * Create a new PoolableConnectionFactory. * * @param cpds the ConnectionPoolDataSource from which to obtain * PooledConnection's * @param pool the {@link ObjectPool} in which to pool those {@link * Connection}s * @param validationQuery a query to use to {@link #validateObject * validate} {@link Connection}s. Should return at least one row. * May be null * @param rollbackAfterValidation whether a rollback should be issued * after {@link #validateObject validating} {@link Connection}s. * @param username * @param password */ public CPDSConnectionFactory(ConnectionPoolDataSource cpds, ObjectPool pool, String validationQuery, boolean rollbackAfterValidation, String username, String password) { _cpds = cpds; _pool = pool; pool.setFactory(this); _validationQuery = validationQuery; _username = username; _password = password; _rollbackAfterValidation = rollbackAfterValidation; } /** * Returns the object pool used to pool connections created by this factory. * * @return ObjectPool managing pooled connections */ public ObjectPool getPool() { return _pool; } public synchronized Object makeObject() { Object obj; try { PooledConnection pc = null; if (_username == null) { pc = _cpds.getPooledConnection(); } else { pc = _cpds.getPooledConnection(_username, _password); } if (pc == null) { throw new IllegalStateException("Connection pool data source returned null from getPooledConnection"); } // should we add this object as a listener or the pool. // consider the validateObject method in decision pc.addConnectionEventListener(this); obj = new PooledConnectionAndInfo(pc, _username, _password); pcMap.put(pc, obj); } catch (SQLException e) { throw new RuntimeException(e.getMessage()); } return obj; } /** * Closes the PooledConnection and stops listening for events from it. */ public void destroyObject(Object obj) throws Exception { if (obj instanceof PooledConnectionAndInfo) { PooledConnection pc = ((PooledConnectionAndInfo)obj).getPooledConnection(); pc.removeConnectionEventListener(this); pcMap.remove(pc); pc.close(); } } public boolean validateObject(Object obj) { boolean valid = false; if (obj instanceof PooledConnectionAndInfo) { PooledConnection pconn = ((PooledConnectionAndInfo) obj).getPooledConnection(); String query = _validationQuery; if (null != query) { Connection conn = null; Statement stmt = null; ResultSet rset = null; // logical Connection from the PooledConnection must be closed // before another one can be requested and closing it will // generate an event. Keep track so we know not to return // the PooledConnection validatingMap.put(pconn, null); try { conn = pconn.getConnection(); stmt = conn.createStatement(); rset = stmt.executeQuery(query); if (rset.next()) { valid = true; } else { valid = false; } if (_rollbackAfterValidation) { conn.rollback(); } } catch (Exception e) { valid = false; } finally { if (rset != null) { try { rset.close(); } catch (Throwable t) { // ignore } } if (stmt != null) { try { stmt.close(); } catch (Throwable t) { // ignore } } if (conn != null) { try { conn.close(); } catch (Throwable t) { // ignore } } validatingMap.remove(pconn); } } else { valid = true; } } else { valid = false; } return valid; } public void passivateObject(Object obj) { } public void activateObject(Object obj) { } // *********************************************************************** // java.sql.ConnectionEventListener implementation // *********************************************************************** /** * This will be called if the Connection returned by the getConnection * method came from a PooledConnection, and the user calls the close() * method of this connection object. What we need to do here is to * release this PooledConnection from our pool... */ public void connectionClosed(ConnectionEvent event) { PooledConnection pc = (PooledConnection) event.getSource(); // if this event occured becase we were validating, ignore it // otherwise return the connection to the pool. if (!validatingMap.containsKey(pc)) { Object info = pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } try { _pool.returnObject(info); } catch (Exception e) { System.err.println("CLOSING DOWN CONNECTION AS IT COULD " + "NOT BE RETURNED TO THE POOL"); pc.removeConnectionEventListener(this); try { destroyObject(info); } catch (Exception e2) { System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + info); e2.printStackTrace(); } } } } /** * If a fatal error occurs, close the underlying physical connection so as * not to be returned in the future */ public void connectionErrorOccurred(ConnectionEvent event) { PooledConnection pc = (PooledConnection)event.getSource(); if (null != event.getSQLException()) { System.err.println( "CLOSING DOWN CONNECTION DUE TO INTERNAL ERROR (" + event.getSQLException() + ")"); } pc.removeConnectionEventListener(this); Object info = pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } try { _pool.invalidateObject(info); } catch (Exception e) { System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + info); e.printStackTrace(); } } // *********************************************************************** // PooledConnectionManager implementation // *********************************************************************** /** * Invalidates the PooledConnection in the pool. The CPDSConnectionFactory * closes the connection and pool counters are updated appropriately. * Also closes the pool. This ensures that all idle connections are closed * and connections that are checked out are closed on return. */ public void invalidate(PooledConnection pc) throws SQLException { Object info = pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } try { _pool.invalidateObject(info); // Destroy instance and update pool counters _pool.close(); // Clear any other instances in this pool and kill others as they come back } catch (Exception ex) { throw (SQLException) new SQLException("Error invalidating connection").initCause(ex); } } /** * Sets the database password used when creating new connections. * * @param password new password */ public synchronized void setPassword(String password) { _password = password; } /** * Verifies that the username matches the user whose connections are being managed by this * factory and closes the pool if this is the case; otherwise does nothing. */ public void closePool(String username) throws SQLException { synchronized (this) { if (username == null || !username.equals(_username)) { return; } } try { _pool.close(); } catch (Exception ex) { throw (SQLException) new SQLException("Error closing connection pool").initCause(ex); } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSourceFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSourceFacto0000644000175000017500000000414011333570550033534 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import javax.naming.RefAddr; import javax.naming.Reference; /** * A JNDI ObjectFactory which creates SharedPoolDataSources * @version $Revision: 479137 $ $Date: 2006-11-25 10:51:48 -0500 (Sat, 25 Nov 2006) $ */ public class SharedPoolDataSourceFactory extends InstanceKeyObjectFactory { private static final String SHARED_POOL_CLASSNAME = SharedPoolDataSource.class.getName(); protected boolean isCorrectClass(String className) { return SHARED_POOL_CLASSNAME.equals(className); } protected InstanceKeyDataSource getNewInstance(Reference ref) { SharedPoolDataSource spds = new SharedPoolDataSource(); RefAddr ra = ref.get("maxActive"); if (ra != null && ra.getContent() != null) { spds.setMaxActive( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("maxIdle"); if (ra != null && ra.getContent() != null) { spds.setMaxIdle( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("maxWait"); if (ra != null && ra.getContent() != null) { spds.setMaxWait( Integer.parseInt(ra.getContent().toString())); } return spds; } } ././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java0000644000175000017500000002277111333570550033511 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.IOException; import java.io.ObjectInputStream; import java.sql.Connection; import java.sql.SQLException; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.sql.ConnectionPoolDataSource; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; import org.apache.commons.dbcp.SQLNestedException; /** *

A pooling DataSource appropriate for deployment within * J2EE environment. There are many configuration options, most of which are * defined in the parent class. All users (based on username) share a single * maximum number of Connections in this datasource.

* *

User passwords can be changed without re-initializing the datasource. * When a getConnection(username, password) request is processed * with a password that is different from those used to create connections in the * pool associated with username, an attempt is made to create a * new connection using the supplied password and if this succeeds, idle connections * created using the old password are destroyed and new connections are created * using the new password.

* * @author John D. McNally * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ public class SharedPoolDataSource extends InstanceKeyDataSource { private static final long serialVersionUID = -8132305535403690372L; private int maxActive = GenericObjectPool.DEFAULT_MAX_ACTIVE; private int maxIdle = GenericObjectPool.DEFAULT_MAX_IDLE; private int maxWait = (int)Math.min(Integer.MAX_VALUE, GenericObjectPool.DEFAULT_MAX_WAIT); private transient KeyedObjectPool pool = null; private transient KeyedCPDSConnectionFactory factory = null; /** * Default no-arg constructor for Serialization */ public SharedPoolDataSource() { } /** * Close pool being maintained by this datasource. */ public void close() throws Exception { if (pool != null) { pool.close(); } InstanceKeyObjectFactory.removeInstance(instanceKey); } // ------------------------------------------------------------------- // Properties /** * The maximum number of active connections that can be allocated from * this pool at the same time, or non-positive for no limit. */ public int getMaxActive() { return (this.maxActive); } /** * The maximum number of active connections that can be allocated from * this pool at the same time, or non-positive for no limit. * The default is 8. */ public void setMaxActive(int maxActive) { assertInitializationAllowed(); this.maxActive = maxActive; } /** * The maximum number of active connections that can remain idle in the * pool, without extra ones being released, or negative for no limit. */ public int getMaxIdle() { return (this.maxIdle); } /** * The maximum number of active connections that can remain idle in the * pool, without extra ones being released, or negative for no limit. * The default is 8. */ public void setMaxIdle(int maxIdle) { assertInitializationAllowed(); this.maxIdle = maxIdle; } /** * 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, or -1 to wait indefinitely. Will fail * immediately if value is 0. * The default is -1. */ public int getMaxWait() { return (this.maxWait); } /** * 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, or -1 to wait indefinitely. Will fail * immediately if value is 0. * The default is -1. */ public void setMaxWait(int maxWait) { assertInitializationAllowed(); this.maxWait = maxWait; } // ---------------------------------------------------------------------- // Instrumentation Methods /** * Get the number of active connections in the pool. */ public int getNumActive() { return (pool == null) ? 0 : pool.getNumActive(); } /** * Get the number of idle connections in the pool. */ public int getNumIdle() { return (pool == null) ? 0 : pool.getNumIdle(); } // ---------------------------------------------------------------------- // Inherited abstract methods protected PooledConnectionAndInfo getPooledConnectionAndInfo(String username, String password) throws SQLException { synchronized(this) { if (pool == null) { try { registerPool(username, password); } catch (NamingException e) { throw new SQLNestedException("RegisterPool failed", e); } } } PooledConnectionAndInfo info = null; UserPassKey key = new UserPassKey(username, password); try { info = (PooledConnectionAndInfo) pool.borrowObject(key); } catch (Exception e) { throw new SQLNestedException( "Could not retrieve connection info from pool", e); } return info; } protected PooledConnectionManager getConnectionManager(UserPassKey upkey) { return factory; } /** * Returns a SharedPoolDataSource {@link Reference}. * * @since 1.2.2 */ public Reference getReference() throws NamingException { Reference ref = new Reference(getClass().getName(), SharedPoolDataSourceFactory.class.getName(), null); ref.add(new StringRefAddr("instanceKey", instanceKey)); return ref; } private void registerPool( String username, String password) throws javax.naming.NamingException, SQLException { ConnectionPoolDataSource cpds = testCPDS(username, password); // Create an object pool to contain our PooledConnections GenericKeyedObjectPool tmpPool = new GenericKeyedObjectPool(null); tmpPool.setMaxActive(getMaxActive()); tmpPool.setMaxIdle(getMaxIdle()); tmpPool.setMaxWait(getMaxWait()); tmpPool.setWhenExhaustedAction(whenExhaustedAction(maxActive, maxWait)); tmpPool.setTestOnBorrow(getTestOnBorrow()); tmpPool.setTestOnReturn(getTestOnReturn()); tmpPool.setTimeBetweenEvictionRunsMillis( getTimeBetweenEvictionRunsMillis()); tmpPool.setNumTestsPerEvictionRun(getNumTestsPerEvictionRun()); tmpPool.setMinEvictableIdleTimeMillis(getMinEvictableIdleTimeMillis()); tmpPool.setTestWhileIdle(getTestWhileIdle()); pool = tmpPool; // Set up the factory we will use (passing the pool associates // the factory with the pool, so we do not have to do so // explicitly) factory = new KeyedCPDSConnectionFactory(cpds, pool, getValidationQuery(), isRollbackAfterValidation()); } protected void setupDefaults(Connection con, String username) throws SQLException { boolean defaultAutoCommit = isDefaultAutoCommit(); if (con.getAutoCommit() != defaultAutoCommit) { con.setAutoCommit(defaultAutoCommit); } int defaultTransactionIsolation = getDefaultTransactionIsolation(); if (defaultTransactionIsolation != UNKNOWN_TRANSACTIONISOLATION) { con.setTransactionIsolation(defaultTransactionIsolation); } boolean defaultReadOnly = isDefaultReadOnly(); if (con.isReadOnly() != defaultReadOnly) { con.setReadOnly(defaultReadOnly); } } /** * Supports Serialization interface. * * @param in a java.io.ObjectInputStream value * @exception IOException if an error occurs * @exception ClassNotFoundException if an error occurs */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { try { in.defaultReadObject(); SharedPoolDataSource oldDS = (SharedPoolDataSource) new SharedPoolDataSourceFactory() .getObjectInstance(getReference(), null, null, null); this.pool = oldDS.pool; } catch (NamingException e) { throw new IOException("NamingException: " + e); } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PooledConnectionAndInfo.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PooledConnectionAndInfo.j0000644000175000017500000000376311333570550033507 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import javax.sql.PooledConnection; /** * Immutable poolable object holding a PooledConnection along with the username and password * used to create the connection. * * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ final class PooledConnectionAndInfo { private final PooledConnection pooledConnection; private final String password; private final String username; private final UserPassKey upkey; PooledConnectionAndInfo(PooledConnection pc, String username, String password) { this.pooledConnection = pc; this.username = username; this.password = password; upkey = new UserPassKey(username, password); } final PooledConnection getPooledConnection() { return pooledConnection; } final UserPassKey getUserPassKey() { return upkey; } /** * Get the value of password. * @return value of password. */ final String getPassword() { return password; } /** * Get the value of username. * @return value of username. */ final String getUsername() { return username; } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/UserPassKey.java0000644000175000017500000000636111333570550031711 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.Serializable; /** *

Holds a username, password pair. Serves as a poolable object key for the KeyedObjectPool * backing a SharedPoolDataSource. Two instances with the same username are considered equal. * This ensures that there will be only one keyed pool for each user in the pool. The password * is used (along with the username) by the KeyedCPDSConnectionFactory when creating new connections.

* *

{@link InstanceKeyDataSource#getConnection(String, String)} validates that the password used to create * a connection matches the password provided by the client.

* * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ class UserPassKey implements Serializable { private static final long serialVersionUID = 5142970911626584817L; private final String password; private final String username; UserPassKey(String username, String password) { this.username = username; this.password = password; } /** * Get the value of password. * @return value of password. */ public String getPassword() { return password; } /** * Get the value of username. * @return value of username. */ public String getUsername() { return username; } /** * @return true if the username fields for both * objects are equal. Two instances with the same username * but different passwords are considered equal. * * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (!(obj instanceof UserPassKey)) { return false; } UserPassKey key = (UserPassKey) obj; return this.username == null ? key.username == null : this.username.equals(key.username); } /** * Returns the hash of the username. */ public int hashCode() { return (this.username != null ? (this.username).hashCode() : 0); } public String toString() { StringBuffer sb = new StringBuffer(50); sb.append("UserPassKey("); sb.append(username).append(", ").append(password).append(')'); return sb.toString(); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSourceFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSourceFact0000644000175000017500000000733111333570550033541 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.IOException; import java.util.Map; import javax.naming.RefAddr; import javax.naming.Reference; /** * A JNDI ObjectFactory which creates SharedPoolDataSources * * @version $Revision: 479137 $ $Date: 2006-11-25 10:51:48 -0500 (Sat, 25 Nov 2006) $ */ public class PerUserPoolDataSourceFactory extends InstanceKeyObjectFactory { private static final String PER_USER_POOL_CLASSNAME = PerUserPoolDataSource.class.getName(); protected boolean isCorrectClass(String className) { return PER_USER_POOL_CLASSNAME.equals(className); } protected InstanceKeyDataSource getNewInstance(Reference ref) throws IOException, ClassNotFoundException { PerUserPoolDataSource pupds = new PerUserPoolDataSource(); RefAddr ra = ref.get("defaultMaxActive"); if (ra != null && ra.getContent() != null) { pupds.setDefaultMaxActive( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("defaultMaxIdle"); if (ra != null && ra.getContent() != null) { pupds.setDefaultMaxIdle( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("defaultMaxWait"); if (ra != null && ra.getContent() != null) { pupds.setDefaultMaxWait( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("perUserDefaultAutoCommit"); if (ra != null && ra.getContent() != null) { byte[] serialized = (byte[]) ra.getContent(); pupds.perUserDefaultAutoCommit = (Map) deserialize(serialized); } ra = ref.get("perUserDefaultTransactionIsolation"); if (ra != null && ra.getContent() != null) { byte[] serialized = (byte[]) ra.getContent(); pupds.perUserDefaultTransactionIsolation = (Map) deserialize(serialized); } ra = ref.get("perUserMaxActive"); if (ra != null && ra.getContent() != null) { byte[] serialized = (byte[]) ra.getContent(); pupds.perUserMaxActive = (Map) deserialize(serialized); } ra = ref.get("perUserMaxIdle"); if (ra != null && ra.getContent() != null) { byte[] serialized = (byte[]) ra.getContent(); pupds.perUserMaxIdle = (Map) deserialize(serialized); } ra = ref.get("perUserMaxWait"); if (ra != null && ra.getContent() != null) { byte[] serialized = (byte[]) ra.getContent(); pupds.perUserMaxWait = (Map) deserialize(serialized); } ra = ref.get("perUserDefaultReadOnly"); if (ra != null && ra.getContent() != null) { byte[] serialized = (byte[]) ra.getContent(); pupds.perUserDefaultReadOnly = (Map) deserialize(serialized); } return pupds; } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PoolKey.java0000644000175000017500000000421611333570550031052 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.io.Serializable; /** * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ class PoolKey implements Serializable { private static final long serialVersionUID = 2252771047542484533L; private final String datasourceName; private final String username; PoolKey(String datasourceName, String username) { this.datasourceName = datasourceName; this.username = username; } public boolean equals(Object obj) { if (obj instanceof PoolKey) { PoolKey pk = (PoolKey)obj; return (null == datasourceName ? null == pk.datasourceName : datasourceName.equals(pk.datasourceName)) && (null == username ? null == pk.username : username.equals(pk.username)); } else { return false; } } public int hashCode() { int h = 0; if (datasourceName != null) { h += datasourceName.hashCode(); } if (username != null) { h = 29 * h + username.hashCode(); } return h; } public String toString() { StringBuffer sb = new StringBuffer(50); sb.append("PoolKey("); sb.append(username).append(", ").append(datasourceName); sb.append(')'); return sb.toString(); } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/KeyedCPDSConnectionFactory.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/KeyedCPDSConnectionFactor0000644000175000017500000003162511333570550033446 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; import javax.sql.ConnectionPoolDataSource; import javax.sql.PooledConnection; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.KeyedPoolableObjectFactory; /** * A {*link PoolableObjectFactory} that creates * {*link PoolableConnection}s. * * @author John D. McNally * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ class KeyedCPDSConnectionFactory implements KeyedPoolableObjectFactory, ConnectionEventListener, PooledConnectionManager { private static final String NO_KEY_MESSAGE = "close() was called on a Connection, but " + "I have no record of the underlying PooledConnection."; private final ConnectionPoolDataSource _cpds; private final String _validationQuery; private final boolean _rollbackAfterValidation; private final KeyedObjectPool _pool; /** * Map of PooledConnections for which close events are ignored. * Connections are muted when they are being validated. */ private final Map /* */ validatingMap = new HashMap(); /** * Map of PooledConnectionAndInfo instances */ private final WeakHashMap /* */ pcMap = new WeakHashMap(); /** * Create a new KeyedPoolableConnectionFactory. * @param cpds the ConnectionPoolDataSource from which to obtain PooledConnection's * @param pool the {*link ObjectPool} in which to pool those {*link Connection}s * @param validationQuery a query to use to {*link #validateObject validate} {*link Connection}s. * Should return at least one row. May be null */ public KeyedCPDSConnectionFactory(ConnectionPoolDataSource cpds, KeyedObjectPool pool, String validationQuery) { this(cpds , pool, validationQuery, false); } /** * Create a new KeyedPoolableConnectionFactory. * @param cpds the ConnectionPoolDataSource from which to obtain * PooledConnections * @param pool the {@link KeyedObjectPool} in which to pool those * {@link Connection}s * @param validationQuery a query to use to {@link #validateObject validate} * {@link Connection}s. Should return at least one row. May be null * @param rollbackAfterValidation whether a rollback should be issued after * {@link #validateObject validating} {@link Connection}s. */ public KeyedCPDSConnectionFactory(ConnectionPoolDataSource cpds, KeyedObjectPool pool, String validationQuery, boolean rollbackAfterValidation) { _cpds = cpds; _pool = pool; pool.setFactory(this); _validationQuery = validationQuery; _rollbackAfterValidation = rollbackAfterValidation; } /** * Returns the keyed object pool used to pool connections created by this factory. * * @return KeyedObjectPool managing pooled connections */ public KeyedObjectPool getPool() { return _pool; } /** * Creates a new {@link PooledConnectionAndInfo} from the given {@link UserPassKey}. * * @param key {@link UserPassKey} containing user credentials * @throws SQLException if the connection could not be created. * @see org.apache.commons.pool.KeyedPoolableObjectFactory#makeObject(java.lang.Object) */ public synchronized Object makeObject(Object key) throws Exception { Object obj = null; UserPassKey upkey = (UserPassKey)key; PooledConnection pc = null; String username = upkey.getUsername(); String password = upkey.getPassword(); if (username == null) { pc = _cpds.getPooledConnection(); } else { pc = _cpds.getPooledConnection(username, password); } if (pc == null) { throw new IllegalStateException("Connection pool data source returned null from getPooledConnection"); } // should we add this object as a listener or the pool. // consider the validateObject method in decision pc.addConnectionEventListener(this); obj = new PooledConnectionAndInfo(pc, username, password); pcMap.put(pc, obj); return obj; } /** * Closes the PooledConnection and stops listening for events from it. */ public void destroyObject(Object key, Object obj) throws Exception { if (obj instanceof PooledConnectionAndInfo) { PooledConnection pc = ((PooledConnectionAndInfo)obj).getPooledConnection(); pc.removeConnectionEventListener(this); pcMap.remove(pc); pc.close(); } } /** * Validates a pooled connection. * * @param key ignored * @param obj {@link PooledConnectionAndInfo} containing the connection to validate * @return true if validation suceeds */ public boolean validateObject(Object key, Object obj) { boolean valid = false; if (obj instanceof PooledConnectionAndInfo) { PooledConnection pconn = ((PooledConnectionAndInfo)obj).getPooledConnection(); String query = _validationQuery; if (null != query) { Connection conn = null; Statement stmt = null; ResultSet rset = null; // logical Connection from the PooledConnection must be closed // before another one can be requested and closing it will // generate an event. Keep track so we know not to return // the PooledConnection validatingMap.put(pconn, null); try { conn = pconn.getConnection(); stmt = conn.createStatement(); rset = stmt.executeQuery(query); if (rset.next()) { valid = true; } else { valid = false; } if (_rollbackAfterValidation) { conn.rollback(); } } catch(Exception e) { valid = false; } finally { if (rset != null) { try { rset.close(); } catch (Throwable t) { // ignore } } if (stmt != null) { try { stmt.close(); } catch (Throwable t) { // ignore } } if (conn != null) { try { conn.close(); } catch (Throwable t) { // ignore } } validatingMap.remove(pconn); } } else { valid = true; } } else { valid = false; } return valid; } public void passivateObject(Object key, Object obj) { } public void activateObject(Object key, Object obj) { } // *********************************************************************** // java.sql.ConnectionEventListener implementation // *********************************************************************** /** * This will be called if the Connection returned by the getConnection * method came from a PooledConnection, and the user calls the close() * method of this connection object. What we need to do here is to * release this PooledConnection from our pool... */ public void connectionClosed(ConnectionEvent event) { PooledConnection pc = (PooledConnection)event.getSource(); // if this event occurred because we were validating, or if this // connection has been marked for removal, ignore it // otherwise return the connection to the pool. if (!validatingMap.containsKey(pc)) { PooledConnectionAndInfo info = (PooledConnectionAndInfo) pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } try { _pool.returnObject(info.getUserPassKey(), info); } catch (Exception e) { System.err.println("CLOSING DOWN CONNECTION AS IT COULD " + "NOT BE RETURNED TO THE POOL"); pc.removeConnectionEventListener(this); try { _pool.invalidateObject(info.getUserPassKey(), info); } catch (Exception e3) { System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + info); e3.printStackTrace(); } } } } /** * If a fatal error occurs, close the underlying physical connection so as * not to be returned in the future */ public void connectionErrorOccurred(ConnectionEvent event) { PooledConnection pc = (PooledConnection)event.getSource(); if (null != event.getSQLException()) { System.err .println("CLOSING DOWN CONNECTION DUE TO INTERNAL ERROR (" + event.getSQLException() + ")"); } pc.removeConnectionEventListener(this); PooledConnectionAndInfo info = (PooledConnectionAndInfo) pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } try { _pool.invalidateObject(info.getUserPassKey(), info); } catch (Exception e) { System.err.println("EXCEPTION WHILE DESTROYING OBJECT " + info); e.printStackTrace(); } } // *********************************************************************** // PooledConnectionManager implementation // *********************************************************************** /** * Invalidates the PooledConnection in the pool. The KeyedCPDSConnectionFactory * closes the connection and pool counters are updated appropriately. * Also clears any idle instances associated with the username that was used * to create the PooledConnection. Connections associated with this user * are not affected and they will not be automatically closed on return to the pool. */ public void invalidate(PooledConnection pc) throws SQLException { PooledConnectionAndInfo info = (PooledConnectionAndInfo) pcMap.get(pc); if (info == null) { throw new IllegalStateException(NO_KEY_MESSAGE); } UserPassKey key = info.getUserPassKey(); try { _pool.invalidateObject(key, info); // Destroy and update pool counters _pool.clear(key); // Remove any idle instances with this key } catch (Exception ex) { throw (SQLException) new SQLException("Error invalidating connection").initCause(ex); } } /** * Does nothing. This factory does not cache user credentials. */ public void setPassword(String password) { } /** * This implementation does not fully close the KeyedObjectPool, as * this would affect all users. Instead, it clears the pool associated * with the given user. This method is not currently used. */ public void closePool(String username) throws SQLException { try { _pool.clear(new UserPassKey(username, null)); } catch (Exception ex) { throw (SQLException) new SQLException("Error closing connection pool").initCause(ex); } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PooledConnectionManager.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/datasources/PooledConnectionManager.j0000644000175000017500000000367111333570550033541 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.datasources; import java.sql.SQLException; import javax.sql.PooledConnection; /** * Methods to manage PoolableConnections and the connection pools that source them. * * @since 1.3 * @version $Revision: 907288 $ $Date: 2010-02-06 14:42:58 -0500 (Sat, 06 Feb 2010) $ */ interface PooledConnectionManager { /** * Close the PooledConnection and remove it from the connection pool * to which it belongs, adjusting pool counters. * * @param pc PooledConnection to be invalidated * @throws SQLException if an SQL error occurs closing the connection */ void invalidate(PooledConnection pc) throws SQLException; /** * Sets the databsase password used when creating connections. * * @param password password used when authenticating to the database */ void setPassword(String password); /** * Closes the connection pool associated with the given user. * * @param username user name * @throws SQLException if an error occurs closing idle connections in the pool */ void closePool(String username) throws SQLException; } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DataSourceConnectionFactory.java0000644000175000017500000000345111333570550032555 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; /** * A {@link DataSource}-based implementation of {@link ConnectionFactory}. * * @author Rodney Waldhoff * @version $Revision: 479137 $ $Date: 2006-11-25 10:51:48 -0500 (Sat, 25 Nov 2006) $ */ public class DataSourceConnectionFactory implements ConnectionFactory { public DataSourceConnectionFactory(DataSource source) { this(source,null,null); } public DataSourceConnectionFactory(DataSource source, String uname, String passwd) { _source = source; _uname = uname; _passwd = passwd; } public Connection createConnection() throws SQLException { if(null == _uname && null == _passwd) { return _source.getConnection(); } else { return _source.getConnection(_uname,_passwd); } } protected String _uname = null; protected String _passwd = null; protected DataSource _source = null; } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/PoolingConnection.java0000644000175000017500000004264011333570550030605 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.NoSuchElementException; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.KeyedPoolableObjectFactory; /** * A {@link DelegatingConnection} that pools {@link PreparedStatement}s. *

* The {@link #prepareStatement} and {@link #prepareCall} methods, rather than creating a new PreparedStatement * each time, may actually pull the statement from a pool of unused statements. * The {@link PreparedStatement#close} method of the returned statement doesn't * actually close the statement, but rather returns it to the pool. * (See {@link PoolablePreparedStatement}, {@link PoolableCallableStatement}.) * * * @see PoolablePreparedStatement * @author Rodney Waldhoff * @author Dirk Verbeeck * @version $Revision: 885261 $ $Date: 2009-11-29 15:07:02 -0500 (Sun, 29 Nov 2009) $ */ public class PoolingConnection extends DelegatingConnection implements Connection, KeyedPoolableObjectFactory { /** Pool of {@link PreparedStatement}s. and {@link CallableStatement}s */ protected KeyedObjectPool _pstmtPool = null; /** Prepared Statement type */ private static final byte STATEMENT_PREPAREDSTMT = 0; /** Callable Statement type */ private static final byte STATEMENT_CALLABLESTMT = 1; /** * Constructor. * @param c the underlying {@link Connection}. */ public PoolingConnection(Connection c) { super(c); } /** * Constructor. * @param c the underlying {@link Connection}. * @param pool {@link KeyedObjectPool} of {@link PreparedStatement}s and {@link CallableStatement}s. */ public PoolingConnection(Connection c, KeyedObjectPool pool) { super(c); _pstmtPool = pool; } /** * Close and free all {@link PreparedStatement}s or {@link CallableStatement} from the pool, and * close the underlying connection. */ public synchronized void close() throws SQLException { if(null != _pstmtPool) { KeyedObjectPool oldpool = _pstmtPool; _pstmtPool = null; try { oldpool.close(); } catch(RuntimeException e) { throw e; } catch(SQLException e) { throw e; } catch(Exception e) { throw (SQLException) new SQLException("Cannot close connection").initCause(e); } } getInnermostDelegate().close(); } /** * Create or obtain a {@link PreparedStatement} from the pool. * @param sql the sql string used to define the PreparedStatement * @return a {@link PoolablePreparedStatement} */ public PreparedStatement prepareStatement(String sql) throws SQLException { if (null == _pstmtPool) { throw new SQLException( "Statement pool is null - closed or invalid PoolingConnection."); } try { return(PreparedStatement)(_pstmtPool.borrowObject(createKey(sql))); } catch(NoSuchElementException e) { throw (SQLException) new SQLException("MaxOpenPreparedStatements limit reached").initCause(e); } catch(RuntimeException e) { throw e; } catch(Exception e) { throw new SQLNestedException("Borrow prepareStatement from pool failed", e); } } /** * Create or obtain a {@link PreparedStatement} from the pool. * @param sql the sql string used to define the PreparedStatement * @param resultSetType result set type * @param resultSetConcurrency result set concurrency * @return a {@link PoolablePreparedStatement} */ public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { if (null == _pstmtPool) { throw new SQLException( "Statement pool is null - closed or invalid PoolingConnection."); } try { return(PreparedStatement)(_pstmtPool.borrowObject(createKey(sql,resultSetType,resultSetConcurrency))); } catch(NoSuchElementException e) { throw (SQLException) new SQLException("MaxOpenPreparedStatements limit reached").initCause(e); } catch(RuntimeException e) { throw e; } catch(Exception e) { throw (SQLException) new SQLException("Borrow prepareStatement from pool failed").initCause(e); } } /** * Create or obtain a {@link CallableStatement} from the pool. * @param sql the sql string used to define the CallableStatement * @return a {@link PoolableCallableStatement} * @throws SQLException * @since 1.3 */ public CallableStatement prepareCall(String sql) throws SQLException { try { return (CallableStatement) (_pstmtPool.borrowObject(createKey(sql, STATEMENT_CALLABLESTMT))); } catch (NoSuchElementException e) { throw new SQLNestedException("MaxOpenCallableStatements limit reached", e); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow callableStatement from pool failed", e); } } /** * Create or obtain a {@link CallableStatement} from the pool. * @param sql the sql string used to define the CallableStatement * @param resultSetType result set type * @param resultSetConcurrency result set concurrency * @return a {@link PoolableCallableStatement} * @throws SQLException * @since 1.3 */ public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { try { return (CallableStatement) (_pstmtPool.borrowObject(createKey(sql, resultSetType, resultSetConcurrency, STATEMENT_CALLABLESTMT))); } catch (NoSuchElementException e) { throw new SQLNestedException("MaxOpenCallableStatements limit reached", e); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow callableStatement from pool failed", e); } } // TODO: possible enhancement, cache these preparedStatements as well // public PreparedStatement prepareStatement(String sql, int resultSetType, // int resultSetConcurrency, // int resultSetHoldability) // throws SQLException { // return super.prepareStatement( // sql, resultSetType, resultSetConcurrency, resultSetHoldability); // } // // public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) // throws SQLException { // return super.prepareStatement(sql, autoGeneratedKeys); // } // // public PreparedStatement prepareStatement(String sql, int columnIndexes[]) // throws SQLException { // return super.prepareStatement(sql, columnIndexes); // } // // public PreparedStatement prepareStatement(String sql, String columnNames[]) // throws SQLException { // return super.prepareStatement(sql, columnNames); // } /** * Create a PStmtKey for the given arguments. * @param sql the sql string used to define the statement * @param resultSetType result set type * @param resultSetConcurrency result set concurrency */ protected Object createKey(String sql, int resultSetType, int resultSetConcurrency) { String catalog = null; try { catalog = getCatalog(); } catch (SQLException e) {} return new PStmtKey(normalizeSQL(sql), catalog, resultSetType, resultSetConcurrency); } /** * Create a PStmtKey for the given arguments. * @param sql the sql string used to define the statement * @param resultSetType result set type * @param resultSetConcurrency result set concurrency * @param stmtType statement type - either {@link #STATEMENT_CALLABLESTMT} or {@link #STATEMENT_PREPAREDSTMT} */ protected Object createKey(String sql, int resultSetType, int resultSetConcurrency, byte stmtType) { String catalog = null; try { catalog = getCatalog(); } catch (SQLException e) {} return new PStmtKey(normalizeSQL(sql), catalog, resultSetType, resultSetConcurrency, stmtType); } /** * Create a PStmtKey for the given arguments. * @param sql the sql string used to define the statement */ protected Object createKey(String sql) { String catalog = null; try { catalog = getCatalog(); } catch (SQLException e) {} return new PStmtKey(normalizeSQL(sql), catalog); } /** * Create a PStmtKey for the given arguments. * @param sql the sql string used to define the statement * @param stmtType statement type - either {@link #STATEMENT_CALLABLESTMT} or {@link #STATEMENT_PREPAREDSTMT} */ protected Object createKey(String sql, byte stmtType) { String catalog = null; try { catalog = getCatalog(); } catch (SQLException e) {} return new PStmtKey(normalizeSQL(sql), catalog, stmtType); } /** * Normalize the given SQL statement, producing a * cannonical form that is semantically equivalent to the original. */ protected String normalizeSQL(String sql) { return sql.trim(); } /** * {@link KeyedPoolableObjectFactory} method for creating * {@link PoolablePreparedStatement}s or {@link PoolableCallableStatement}s. * The stmtType field in the key determines whether * a PoolablePreparedStatement or PoolableCallableStatement is created. * * @param obj the key for the {@link PreparedStatement} to be created * @see #createKey(String, int, int, byte) */ public Object makeObject(Object obj) throws Exception { if(null == obj || !(obj instanceof PStmtKey)) { throw new IllegalArgumentException("Prepared statement key is null or invalid."); } else { PStmtKey key = (PStmtKey)obj; if( null == key._resultSetType && null == key._resultSetConcurrency ) { if (key._stmtType == STATEMENT_PREPAREDSTMT ) { return new PoolablePreparedStatement(getDelegate().prepareStatement( key._sql), key, _pstmtPool, this); } else { return new PoolableCallableStatement(getDelegate().prepareCall( key._sql), key, _pstmtPool, this); } } else { // Both _resultSetType and _resultSetConcurrency are non-null here (both or neither are set by constructors) if(key._stmtType == STATEMENT_PREPAREDSTMT) { return new PoolablePreparedStatement(getDelegate().prepareStatement( key._sql, key._resultSetType.intValue(),key._resultSetConcurrency.intValue()), key, _pstmtPool, this); } else { return new PoolableCallableStatement( getDelegate().prepareCall( key._sql,key._resultSetType.intValue(), key._resultSetConcurrency.intValue()), key, _pstmtPool, this); } } } } /** * {@link KeyedPoolableObjectFactory} method for destroying * PoolablePreparedStatements and PoolableCallableStatements. * Closes the underlying statement. * * @param key ignored * @param obj the pooled statement to be destroyed. */ public void destroyObject(Object key, Object obj) throws Exception { if(obj instanceof DelegatingPreparedStatement) { ((DelegatingPreparedStatement)obj).getInnermostDelegate().close(); } else { ((PreparedStatement)obj).close(); } } /** * {@link KeyedPoolableObjectFactory} method for validating * pooled statements. Currently always returns true. * * @param key ignored * @param obj ignored * @return true */ public boolean validateObject(Object key, Object obj) { return true; } /** * {@link KeyedPoolableObjectFactory} method for activating * pooled statements. * * @param key ignored * @param obj pooled statement to be activated */ public void activateObject(Object key, Object obj) throws Exception { ((DelegatingPreparedStatement)obj).activate(); } /** * {@link KeyedPoolableObjectFactory} method for passivating * {@link PreparedStatement}s or {@link CallableStatement}s. * Invokes {@link PreparedStatement#clearParameters}. * * @param key ignored * @param obj a {@link PreparedStatement} */ public void passivateObject(Object key, Object obj) throws Exception { ((PreparedStatement)obj).clearParameters(); ((DelegatingPreparedStatement)obj).passivate(); } public String toString() { if (_pstmtPool != null ) { return "PoolingConnection: " + _pstmtPool.toString(); } else { return "PoolingConnection: null"; } } /** * A key uniquely identifiying {@link PreparedStatement}s. */ static class PStmtKey { /** SQL defining Prepared or Callable Statement */ protected String _sql = null; /** Result set type */ protected Integer _resultSetType = null; /** Result set concurrency */ protected Integer _resultSetConcurrency = null; /** Database catalog */ protected String _catalog = null; /** * Statement type. Either STATEMENT_PREPAREDSTMT (PreparedStatement) * or STATEMENT_CALLABLESTMT (CallableStatement) */ protected byte _stmtType = STATEMENT_PREPAREDSTMT; PStmtKey(String sql) { _sql = sql; } PStmtKey(String sql, String catalog) { _sql = sql; _catalog = catalog; } PStmtKey(String sql, String catalog, byte stmtType) { _sql = sql; _catalog = catalog; _stmtType = stmtType; } PStmtKey(String sql, int resultSetType, int resultSetConcurrency) { _sql = sql; _resultSetType = new Integer(resultSetType); _resultSetConcurrency = new Integer(resultSetConcurrency); } PStmtKey(String sql, String catalog, int resultSetType, int resultSetConcurrency) { _sql = sql; _catalog = catalog; _resultSetType = new Integer(resultSetType); _resultSetConcurrency = new Integer(resultSetConcurrency); } PStmtKey(String sql, String catalog, int resultSetType, int resultSetConcurrency, byte stmtType) { _sql = sql; _catalog = catalog; _resultSetType = new Integer(resultSetType); _resultSetConcurrency = new Integer(resultSetConcurrency); _stmtType = stmtType; } public boolean equals(Object that) { try { PStmtKey key = (PStmtKey)that; return( ((null == _sql && null == key._sql) || _sql.equals(key._sql)) && ((null == _catalog && null == key._catalog) || _catalog.equals(key._catalog)) && ((null == _resultSetType && null == key._resultSetType) || _resultSetType.equals(key._resultSetType)) && ((null == _resultSetConcurrency && null == key._resultSetConcurrency) || _resultSetConcurrency.equals(key._resultSetConcurrency)) && (_stmtType == key._stmtType) ); } catch(ClassCastException e) { return false; } catch(NullPointerException e) { return false; } } public int hashCode() { if (_catalog==null) return(null == _sql ? 0 : _sql.hashCode()); else return(null == _sql ? _catalog.hashCode() : (_catalog + _sql).hashCode()); } public String toString() { StringBuffer buf = new StringBuffer(); buf.append("PStmtKey: sql="); buf.append(_sql); buf.append(", catalog="); buf.append(_catalog); buf.append(", resultSetType="); buf.append(_resultSetType); buf.append(", resultSetConcurrency="); buf.append(_resultSetConcurrency); buf.append(", statmentType="); buf.append(_stmtType); return buf.toString(); } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/PoolableConnectionFactory.java0000644000175000017500000011464611333570550032271 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; import java.util.Iterator; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.KeyedObjectPoolFactory; import org.apache.commons.pool.PoolableObjectFactory; import org.apache.commons.pool.ObjectPool; /** * A {@link PoolableObjectFactory} that creates * {@link PoolableConnection}s. * * @author Rodney Waldhoff * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 883393 $ $Date: 2009-11-23 11:18:35 -0500 (Mon, 23 Nov 2009) $ */ public class PoolableConnectionFactory implements PoolableObjectFactory { /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param connectionInitSqls a Collection of SQL statements to initialize {@link Connection}s. Using null turns off initialization. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @since 1.3 */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, Collection connectionInitSqls, boolean defaultReadOnly, boolean defaultAutoCommit) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _connectionInitSqls = connectionInitSqls; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param validationQueryTimeout the number of seconds that validation queries will wait for database response before failing. Use a value less than or equal to 0 for no timeout. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @since 1.3 */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, int validationQueryTimeout, boolean defaultReadOnly, boolean defaultAutoCommit) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _validationQueryTimeout = validationQueryTimeout; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param validationQueryTimeout the number of seconds that validation queries will wait for database response before failing. Use a value less than or equal to 0 for no timeout. * @param connectionInitSqls a Collection of SQL statements to initialize {@link Connection}s. Using null turns off initialization. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @since 1.3 */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, int validationQueryTimeout, Collection connectionInitSqls, boolean defaultReadOnly, boolean defaultAutoCommit) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _validationQueryTimeout = validationQueryTimeout; _connectionInitSqls = connectionInitSqls; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param connectionInitSqls a Collection of SQL statement to initialize {@link Connection}s. Using null turns off initialization. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @since 1.3 */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, Collection connectionInitSqls, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _connectionInitSqls = connectionInitSqls; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param validationQueryTimeout the number of seconds that validation queries will wait for database response before failing. Use a value less than or equal to 0 for no timeout. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @since 1.3 */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, int validationQueryTimeout, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _validationQueryTimeout = validationQueryTimeout; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param validationQueryTimeout the number of seconds that validation queries will wait for database response before failing. Use a value less than or equal to 0 for no timeout. * @param connectionInitSqls a Collection of SQL statement to initialize {@link Connection}s. Using null turns off initialization. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @since 1.3 */ public PoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, int validationQueryTimeout, Collection connectionInitSqls, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation) { _connFactory = connFactory; _pool = pool; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _validationQueryTimeout = validationQueryTimeout; _connectionInitSqls = connectionInitSqls; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects */ public PoolableConnectionFactory( ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, AbandonedConfig config) { _connFactory = connFactory; _pool = pool; _config = config; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects */ public PoolableConnectionFactory( ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, AbandonedConfig config) { _connFactory = connFactory; _pool = pool; _config = config; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog the default "catalog" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects */ public PoolableConnectionFactory( ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config) { _connFactory = connFactory; _pool = pool; _config = config; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; _defaultCatalog = defaultCatalog; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog the default "catalog" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects */ public PoolableConnectionFactory( ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config) { _connFactory = connFactory; _pool = pool; _config = config; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _defaultReadOnly = defaultReadOnly; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; _defaultCatalog = defaultCatalog; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param connectionInitSqls a Collection of SQL statements to initialize {@link Connection}s. Using null turns off initialization. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog the default "catalog" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects * @since 1.3 */ public PoolableConnectionFactory( ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, Collection connectionInitSqls, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config) { _connFactory = connFactory; _pool = pool; _config = config; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _connectionInitSqls = connectionInitSqls; _defaultReadOnly = defaultReadOnly; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; _defaultCatalog = defaultCatalog; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param validationQueryTimeout the number of seconds that validation queries will wait for database response before failing. Use a value less than or equal to 0 for no timeout. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog the default "catalog" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects * @since 1.3 */ public PoolableConnectionFactory( ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, int validationQueryTimeout, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config) { _connFactory = connFactory; _pool = pool; _config = config; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _validationQueryTimeout = validationQueryTimeout; _defaultReadOnly = defaultReadOnly; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; _defaultCatalog = defaultCatalog; } /** * Create a new PoolableConnectionFactory. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or null to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using null turns off validation. * @param validationQueryTimeout the number of seconds that validation queries will wait for database response before failing. Use a value less than or equal to 0 for no timeout. * @param connectionInitSqls a Collection of SQL statements to initialize {@link Connection}s. Using null turns off initialization. * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog the default "catalog" setting for returned {@link Connection}s * @param config the AbandonedConfig if tracing SQL objects * @since 1.3 */ public PoolableConnectionFactory( ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, int validationQueryTimeout, Collection connectionInitSqls, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config) { _connFactory = connFactory; _pool = pool; _config = config; _pool.setFactory(this); _stmtPoolFactory = stmtPoolFactory; _validationQuery = validationQuery; _validationQueryTimeout = validationQueryTimeout; _connectionInitSqls = connectionInitSqls; _defaultReadOnly = defaultReadOnly; _defaultAutoCommit = defaultAutoCommit; _defaultTransactionIsolation = defaultTransactionIsolation; _defaultCatalog = defaultCatalog; } /** * Sets the {@link ConnectionFactory} from which to obtain base {@link Connection}s. * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s */ public void setConnectionFactory(ConnectionFactory connFactory) { _connFactory = connFactory; } /** * Sets the query I use to {@link #validateObject validate} {@link Connection}s. * Should return at least one row. * Using null turns off validation. * @param validationQuery a query to use to {@link #validateObject validate} {@link Connection}s. */ public void setValidationQuery(String validationQuery) { _validationQuery = validationQuery; } /** * Sets the validation query timeout, the amount of time, in seconds, that * connection validation will wait for a response from the database when * executing a validation query. Use a value less than or equal to 0 for * no timeout. * * @param timeout new validation query timeout value in seconds * @since 1.3 */ public void setValidationQueryTimeout(int timeout) { _validationQueryTimeout = timeout; } /** * Sets the SQL statements I use to initialize newly created {@link Connection}s. * Using null turns off connection initialization. * @param connectionInitSqls SQL statement to initialize {@link Connection}s. * @since 1.3 */ synchronized public void setConnectionInitSql(Collection connectionInitSqls) { _connectionInitSqls = connectionInitSqls; } /** * Sets the {@link ObjectPool} in which to pool {@link Connection}s. * @param pool the {@link ObjectPool} in which to pool those {@link Connection}s */ synchronized public void setPool(ObjectPool pool) { if(null != _pool && pool != _pool) { try { _pool.close(); } catch(Exception e) { // ignored !?! } } _pool = pool; } /** * Returns the {@link ObjectPool} in which {@link Connection}s are pooled. * @return the connection pool */ public synchronized ObjectPool getPool() { return _pool; } /** * Sets the {@link KeyedObjectPoolFactory} I use to create {@link KeyedObjectPool}s * for pooling {@link java.sql.PreparedStatement}s. * Set to null to disable {@link java.sql.PreparedStatement} pooling. * @param stmtPoolFactory the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s */ public void setStatementPoolFactory(KeyedObjectPoolFactory stmtPoolFactory) { _stmtPoolFactory = stmtPoolFactory; } /** * Sets the default "read only" setting for borrowed {@link Connection}s * @param defaultReadOnly the default "read only" setting for borrowed {@link Connection}s */ public void setDefaultReadOnly(boolean defaultReadOnly) { _defaultReadOnly = defaultReadOnly ? Boolean.TRUE : Boolean.FALSE; } /** * Sets the default "auto commit" setting for borrowed {@link Connection}s * @param defaultAutoCommit the default "auto commit" setting for borrowed {@link Connection}s */ public void setDefaultAutoCommit(boolean defaultAutoCommit) { _defaultAutoCommit = defaultAutoCommit; } /** * Sets the default "Transaction Isolation" setting for borrowed {@link Connection}s * @param defaultTransactionIsolation the default "Transaction Isolation" setting for returned {@link Connection}s */ public void setDefaultTransactionIsolation(int defaultTransactionIsolation) { _defaultTransactionIsolation = defaultTransactionIsolation; } /** * Sets the default "catalog" setting for borrowed {@link Connection}s * @param defaultCatalog the default "catalog" setting for borrowed {@link Connection}s */ public void setDefaultCatalog(String defaultCatalog) { _defaultCatalog = defaultCatalog; } public Object makeObject() throws Exception { Connection conn = _connFactory.createConnection(); if (conn == null) { throw new IllegalStateException("Connection factory returned null from createConnection"); } initializeConnection(conn); if(null != _stmtPoolFactory) { KeyedObjectPool stmtpool = _stmtPoolFactory.createPool(); conn = new PoolingConnection(conn,stmtpool); stmtpool.setFactory((PoolingConnection)conn); } return new PoolableConnection(conn,_pool,_config); } protected void initializeConnection(Connection conn) throws SQLException { Collection sqls = _connectionInitSqls; if(conn.isClosed()) { throw new SQLException("initializeConnection: connection closed"); } if(null != sqls) { Statement stmt = null; try { stmt = conn.createStatement(); for (Iterator iterator = sqls.iterator(); iterator.hasNext();) { Object o = iterator.next(); if (o == null) { throw new NullPointerException("null connectionInitSqls element"); } // o might not be a String instance String sql = o.toString(); stmt.execute(sql); } } finally { if (stmt != null) { try { stmt.close(); } catch(Exception t) { // ignored } } } } } public void destroyObject(Object obj) throws Exception { if(obj instanceof PoolableConnection) { ((PoolableConnection)obj).reallyClose(); } } public boolean validateObject(Object obj) { if(obj instanceof Connection) { try { validateConnection((Connection) obj); return true; } catch(Exception e) { return false; } } else { return false; } } public void validateConnection(Connection conn) throws SQLException { String query = _validationQuery; if(conn.isClosed()) { throw new SQLException("validateConnection: connection closed"); } if(null != query) { Statement stmt = null; ResultSet rset = null; try { stmt = conn.createStatement(); if (_validationQueryTimeout > 0) { stmt.setQueryTimeout(_validationQueryTimeout); } rset = stmt.executeQuery(query); if(!rset.next()) { throw new SQLException("validationQuery didn't return a row"); } } finally { if (rset != null) { try { rset.close(); } catch(Exception t) { // ignored } } if (stmt != null) { try { stmt.close(); } catch(Exception t) { // ignored } } } } } public void passivateObject(Object obj) throws Exception { if(obj instanceof Connection) { Connection conn = (Connection)obj; if(!conn.getAutoCommit() && !conn.isReadOnly()) { conn.rollback(); } conn.clearWarnings(); if(!conn.getAutoCommit()) { conn.setAutoCommit(true); } } if(obj instanceof DelegatingConnection) { ((DelegatingConnection)obj).passivate(); } } public void activateObject(Object obj) throws Exception { if(obj instanceof DelegatingConnection) { ((DelegatingConnection)obj).activate(); } if(obj instanceof Connection) { Connection conn = (Connection)obj; if (conn.getAutoCommit() != _defaultAutoCommit) { conn.setAutoCommit(_defaultAutoCommit); } if ((_defaultTransactionIsolation != UNKNOWN_TRANSACTIONISOLATION) && (conn.getTransactionIsolation() != _defaultTransactionIsolation)) { conn.setTransactionIsolation(_defaultTransactionIsolation); } if ((_defaultReadOnly != null) && (conn.isReadOnly() != _defaultReadOnly.booleanValue())) { conn.setReadOnly(_defaultReadOnly.booleanValue()); } if ((_defaultCatalog != null) && (!_defaultCatalog.equals(conn.getCatalog()))) { conn.setCatalog(_defaultCatalog); } } } protected volatile ConnectionFactory _connFactory = null; protected volatile String _validationQuery = null; protected volatile int _validationQueryTimeout = -1; protected Collection _connectionInitSqls = null; protected volatile ObjectPool _pool = null; protected volatile KeyedObjectPoolFactory _stmtPoolFactory = null; protected Boolean _defaultReadOnly = null; protected boolean _defaultAutoCommit = true; protected int _defaultTransactionIsolation = UNKNOWN_TRANSACTIONISOLATION; protected String _defaultCatalog; /** * Configuration for removing abandoned connections. */ protected AbandonedConfig _config = null; /** * Internal constant to indicate the level is not set. */ static final int UNKNOWN_TRANSACTIONISOLATION = -1; } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DelegatingResultSet.java0000644000175000017500000012363011333570550031073 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.ResultSet; import java.math.BigDecimal; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; import java.io.InputStream; import java.sql.SQLWarning; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.io.Reader; import java.sql.Statement; import java.util.Map; import java.sql.Connection; import java.sql.Ref; import java.sql.Blob; import java.sql.Clob; import java.sql.Array; import java.util.Calendar; /* JDBC_4_ANT_KEY_BEGIN */ import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; /* JDBC_4_ANT_KEY_END */ /** * A base delegating implementation of {@link ResultSet}. *

* All of the methods from the {@link ResultSet} interface * simply call the corresponding method on the "delegate" * provided in my constructor. *

* Extends AbandonedTrace to implement result set tracking and * logging of code which created the ResultSet. Tracking the * ResultSet ensures that the Statment which created it can * close any open ResultSet's on Statement close. * * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 883941 $ $Date: 2009-11-24 19:58:50 -0500 (Tue, 24 Nov 2009) $ */ public class DelegatingResultSet extends AbandonedTrace implements ResultSet { /** My delegate. **/ private ResultSet _res; /** The Statement that created me, if any. **/ private Statement _stmt; /** The Connection that created me, if any. **/ private Connection _conn; /** * Create a wrapper for the ResultSet which traces this * ResultSet to the Statement which created it and the * code which created it. * * @param stmt Statement which created this ResultSet * @param res ResultSet to wrap */ public DelegatingResultSet(Statement stmt, ResultSet res) { super((AbandonedTrace)stmt); this._stmt = stmt; this._res = res; } /** * Create a wrapper for the ResultSet which traces this * ResultSet to the Connection which created it (via, for * example DatabaseMetadata, and the code which created it. * * @param conn Connection which created this ResultSet * @param res ResultSet to wrap */ public DelegatingResultSet(Connection conn, ResultSet res) { super((AbandonedTrace)conn); this._conn = conn; this._res = res; } public static ResultSet wrapResultSet(Statement stmt, ResultSet rset) { if(null == rset) { return null; } else { return new DelegatingResultSet(stmt,rset); } } public static ResultSet wrapResultSet(Connection conn, ResultSet rset) { if(null == rset) { return null; } else { return new DelegatingResultSet(conn,rset); } } public ResultSet getDelegate() { return _res; } public boolean equals(Object obj) { ResultSet delegate = getInnermostDelegate(); if (delegate == null) { return false; } if (obj instanceof DelegatingResultSet) { DelegatingResultSet s = (DelegatingResultSet) obj; return delegate.equals(s.getInnermostDelegate()); } else { return delegate.equals(obj); } } public int hashCode() { Object obj = getInnermostDelegate(); if (obj == null) { return 0; } return obj.hashCode(); } /** * If my underlying {@link ResultSet} is not a * DelegatingResultSet, returns it, * otherwise recursively invokes this method on * my delegate. *

* Hence this method will return the first * delegate that is not a DelegatingResultSet, * or null when no non-DelegatingResultSet * delegate can be found by transversing this chain. *

* This method is useful when you may have nested * DelegatingResultSets, and you want to make * sure to obtain a "genuine" {@link ResultSet}. */ public ResultSet getInnermostDelegate() { ResultSet r = _res; while(r != null && r instanceof DelegatingResultSet) { r = ((DelegatingResultSet)r).getDelegate(); if(this == r) { return null; } } return r; } public Statement getStatement() throws SQLException { return _stmt; } /** * Wrapper for close of ResultSet which removes this * result set from being traced then calls close on * the original ResultSet. */ public void close() throws SQLException { try { if(_stmt != null) { ((AbandonedTrace)_stmt).removeTrace(this); _stmt = null; } if(_conn != null) { ((AbandonedTrace)_conn).removeTrace(this); _conn = null; } _res.close(); } catch (SQLException e) { handleException(e); } } protected void handleException(SQLException e) throws SQLException { if ((_stmt != null) && (_stmt instanceof DelegatingStatement)) { ((DelegatingStatement)_stmt).handleException(e); } else if ((_conn != null) && (_conn instanceof DelegatingConnection)) { ((DelegatingConnection)_conn).handleException(e); } else { throw e; } } public boolean next() throws SQLException { try { return _res.next(); } catch (SQLException e) { handleException(e); return false; } } public boolean wasNull() throws SQLException { try { return _res.wasNull(); } catch (SQLException e) { handleException(e); return false; } } public String getString(int columnIndex) throws SQLException { try { return _res.getString(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public boolean getBoolean(int columnIndex) throws SQLException { try { return _res.getBoolean(columnIndex); } catch (SQLException e) { handleException(e); return false; } } public byte getByte(int columnIndex) throws SQLException { try { return _res.getByte(columnIndex); } catch (SQLException e) { handleException(e); return 0; } } public short getShort(int columnIndex) throws SQLException { try { return _res.getShort(columnIndex); } catch (SQLException e) { handleException(e); return 0; } } public int getInt(int columnIndex) throws SQLException { try { return _res.getInt(columnIndex); } catch (SQLException e) { handleException(e); return 0; } } public long getLong(int columnIndex) throws SQLException { try { return _res.getLong(columnIndex); } catch (SQLException e) { handleException(e); return 0; } } public float getFloat(int columnIndex) throws SQLException { try { return _res.getFloat(columnIndex); } catch (SQLException e) { handleException(e); return 0; } } public double getDouble(int columnIndex) throws SQLException { try { return _res.getDouble(columnIndex); } catch (SQLException e) { handleException(e); return 0; } } /** @deprecated */ public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { try { return _res.getBigDecimal(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public byte[] getBytes(int columnIndex) throws SQLException { try { return _res.getBytes(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(int columnIndex) throws SQLException { try { return _res.getDate(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(int columnIndex) throws SQLException { try { return _res.getTime(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(int columnIndex) throws SQLException { try { return _res.getTimestamp(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public InputStream getAsciiStream(int columnIndex) throws SQLException { try { return _res.getAsciiStream(columnIndex); } catch (SQLException e) { handleException(e); return null; } } /** @deprecated */ public InputStream getUnicodeStream(int columnIndex) throws SQLException { try { return _res.getUnicodeStream(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public InputStream getBinaryStream(int columnIndex) throws SQLException { try { return _res.getBinaryStream(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public String getString(String columnName) throws SQLException { try { return _res.getString(columnName); } catch (SQLException e) { handleException(e); return null; } } public boolean getBoolean(String columnName) throws SQLException { try { return _res.getBoolean(columnName); } catch (SQLException e) { handleException(e); return false; } } public byte getByte(String columnName) throws SQLException { try { return _res.getByte(columnName); } catch (SQLException e) { handleException(e); return 0; } } public short getShort(String columnName) throws SQLException { try { return _res.getShort(columnName); } catch (SQLException e) { handleException(e); return 0; } } public int getInt(String columnName) throws SQLException { try { return _res.getInt(columnName); } catch (SQLException e) { handleException(e); return 0; } } public long getLong(String columnName) throws SQLException { try { return _res.getLong(columnName); } catch (SQLException e) { handleException(e); return 0; } } public float getFloat(String columnName) throws SQLException { try { return _res.getFloat(columnName); } catch (SQLException e) { handleException(e); return 0; } } public double getDouble(String columnName) throws SQLException { try { return _res.getDouble(columnName); } catch (SQLException e) { handleException(e); return 0; } } /** @deprecated */ public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException { try { return _res.getBigDecimal(columnName); } catch (SQLException e) { handleException(e); return null; } } public byte[] getBytes(String columnName) throws SQLException { try { return _res.getBytes(columnName); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(String columnName) throws SQLException { try { return _res.getDate(columnName); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(String columnName) throws SQLException { try { return _res.getTime(columnName); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(String columnName) throws SQLException { try { return _res.getTimestamp(columnName); } catch (SQLException e) { handleException(e); return null; } } public InputStream getAsciiStream(String columnName) throws SQLException { try { return _res.getAsciiStream(columnName); } catch (SQLException e) { handleException(e); return null; } } /** @deprecated */ public InputStream getUnicodeStream(String columnName) throws SQLException { try { return _res.getUnicodeStream(columnName); } catch (SQLException e) { handleException(e); return null; } } public InputStream getBinaryStream(String columnName) throws SQLException { try { return _res.getBinaryStream(columnName); } catch (SQLException e) { handleException(e); return null; } } public SQLWarning getWarnings() throws SQLException { try { return _res.getWarnings(); } catch (SQLException e) { handleException(e); return null; } } public void clearWarnings() throws SQLException { try { _res.clearWarnings(); } catch (SQLException e) { handleException(e); } } public String getCursorName() throws SQLException { try { return _res.getCursorName(); } catch (SQLException e) { handleException(e); return null; } } public ResultSetMetaData getMetaData() throws SQLException { try { return _res.getMetaData(); } catch (SQLException e) { handleException(e); return null; } } public Object getObject(int columnIndex) throws SQLException { try { return _res.getObject(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public Object getObject(String columnName) throws SQLException { try { return _res.getObject(columnName); } catch (SQLException e) { handleException(e); return null; } } public int findColumn(String columnName) throws SQLException { try { return _res.findColumn(columnName); } catch (SQLException e) { handleException(e); return 0; } } public Reader getCharacterStream(int columnIndex) throws SQLException { try { return _res.getCharacterStream(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public Reader getCharacterStream(String columnName) throws SQLException { try { return _res.getCharacterStream(columnName); } catch (SQLException e) { handleException(e); return null; } } public BigDecimal getBigDecimal(int columnIndex) throws SQLException { try { return _res.getBigDecimal(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public BigDecimal getBigDecimal(String columnName) throws SQLException { try { return _res.getBigDecimal(columnName); } catch (SQLException e) { handleException(e); return null; } } public boolean isBeforeFirst() throws SQLException { try { return _res.isBeforeFirst(); } catch (SQLException e) { handleException(e); return false; } } public boolean isAfterLast() throws SQLException { try { return _res.isAfterLast(); } catch (SQLException e) { handleException(e); return false; } } public boolean isFirst() throws SQLException { try { return _res.isFirst(); } catch (SQLException e) { handleException(e); return false; } } public boolean isLast() throws SQLException { try { return _res.isLast(); } catch (SQLException e) { handleException(e); return false; } } public void beforeFirst() throws SQLException { try { _res.beforeFirst(); } catch (SQLException e) { handleException(e); } } public void afterLast() throws SQLException { try { _res.afterLast(); } catch (SQLException e) { handleException(e); } } public boolean first() throws SQLException { try { return _res.first(); } catch (SQLException e) { handleException(e); return false; } } public boolean last() throws SQLException { try { return _res.last(); } catch (SQLException e) { handleException(e); return false; } } public int getRow() throws SQLException { try { return _res.getRow(); } catch (SQLException e) { handleException(e); return 0; } } public boolean absolute(int row) throws SQLException { try { return _res.absolute(row); } catch (SQLException e) { handleException(e); return false; } } public boolean relative(int rows) throws SQLException { try { return _res.relative(rows); } catch (SQLException e) { handleException(e); return false; } } public boolean previous() throws SQLException { try { return _res.previous(); } catch (SQLException e) { handleException(e); return false; } } public void setFetchDirection(int direction) throws SQLException { try { _res.setFetchDirection(direction); } catch (SQLException e) { handleException(e); } } public int getFetchDirection() throws SQLException { try { return _res.getFetchDirection(); } catch (SQLException e) { handleException(e); return 0; } } public void setFetchSize(int rows) throws SQLException { try { _res.setFetchSize(rows); } catch (SQLException e) { handleException(e); } } public int getFetchSize() throws SQLException { try { return _res.getFetchSize(); } catch (SQLException e) { handleException(e); return 0; } } public int getType() throws SQLException { try { return _res.getType(); } catch (SQLException e) { handleException(e); return 0; } } public int getConcurrency() throws SQLException { try { return _res.getConcurrency(); } catch (SQLException e) { handleException(e); return 0; } } public boolean rowUpdated() throws SQLException { try { return _res.rowUpdated(); } catch (SQLException e) { handleException(e); return false; } } public boolean rowInserted() throws SQLException { try { return _res.rowInserted(); } catch (SQLException e) { handleException(e); return false; } } public boolean rowDeleted() throws SQLException { try { return _res.rowDeleted(); } catch (SQLException e) { handleException(e); return false; } } public void updateNull(int columnIndex) throws SQLException { try { _res.updateNull(columnIndex); } catch (SQLException e) { handleException(e); } } public void updateBoolean(int columnIndex, boolean x) throws SQLException { try { _res.updateBoolean(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateByte(int columnIndex, byte x) throws SQLException { try { _res.updateByte(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateShort(int columnIndex, short x) throws SQLException { try { _res.updateShort(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateInt(int columnIndex, int x) throws SQLException { try { _res.updateInt(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateLong(int columnIndex, long x) throws SQLException { try { _res.updateLong(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateFloat(int columnIndex, float x) throws SQLException { try { _res.updateFloat(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateDouble(int columnIndex, double x) throws SQLException { try { _res.updateDouble(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { try { _res.updateBigDecimal(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateString(int columnIndex, String x) throws SQLException { try { _res.updateString(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateBytes(int columnIndex, byte[] x) throws SQLException { try { _res.updateBytes(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateDate(int columnIndex, Date x) throws SQLException { try { _res.updateDate(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateTime(int columnIndex, Time x) throws SQLException { try { _res.updateTime(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { try { _res.updateTimestamp(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException { try { _res.updateAsciiStream(columnIndex, x, length); } catch (SQLException e) { handleException(e); } } public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException { try { _res.updateBinaryStream(columnIndex, x, length); } catch (SQLException e) { handleException(e); } } public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException { try { _res.updateCharacterStream(columnIndex, x, length); } catch (SQLException e) { handleException(e); } } public void updateObject(int columnIndex, Object x, int scale) throws SQLException { try { _res.updateObject(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateObject(int columnIndex, Object x) throws SQLException { try { _res.updateObject(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateNull(String columnName) throws SQLException { try { _res.updateNull(columnName); } catch (SQLException e) { handleException(e); } } public void updateBoolean(String columnName, boolean x) throws SQLException { try { _res.updateBoolean(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateByte(String columnName, byte x) throws SQLException { try { _res.updateByte(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateShort(String columnName, short x) throws SQLException { try { _res.updateShort(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateInt(String columnName, int x) throws SQLException { try { _res.updateInt(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateLong(String columnName, long x) throws SQLException { try { _res.updateLong(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateFloat(String columnName, float x) throws SQLException { try { _res.updateFloat(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateDouble(String columnName, double x) throws SQLException { try { _res.updateDouble(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException { try { _res.updateBigDecimal(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateString(String columnName, String x) throws SQLException { try { _res.updateString(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateBytes(String columnName, byte[] x) throws SQLException { try { _res.updateBytes(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateDate(String columnName, Date x) throws SQLException { try { _res.updateDate(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateTime(String columnName, Time x) throws SQLException { try { _res.updateTime(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateTimestamp(String columnName, Timestamp x) throws SQLException { try { _res.updateTimestamp(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateAsciiStream(String columnName, InputStream x, int length) throws SQLException { try { _res.updateAsciiStream(columnName, x, length); } catch (SQLException e) { handleException(e); } } public void updateBinaryStream(String columnName, InputStream x, int length) throws SQLException { try { _res.updateBinaryStream(columnName, x, length); } catch (SQLException e) { handleException(e); } } public void updateCharacterStream(String columnName, Reader reader, int length) throws SQLException { try { _res.updateCharacterStream(columnName, reader, length); } catch (SQLException e) { handleException(e); } } public void updateObject(String columnName, Object x, int scale) throws SQLException { try { _res.updateObject(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateObject(String columnName, Object x) throws SQLException { try { _res.updateObject(columnName, x); } catch (SQLException e) { handleException(e); } } public void insertRow() throws SQLException { try { _res.insertRow(); } catch (SQLException e) { handleException(e); } } public void updateRow() throws SQLException { try { _res.updateRow(); } catch (SQLException e) { handleException(e); } } public void deleteRow() throws SQLException { try { _res.deleteRow(); } catch (SQLException e) { handleException(e); } } public void refreshRow() throws SQLException { try { _res.refreshRow(); } catch (SQLException e) { handleException(e); } } public void cancelRowUpdates() throws SQLException { try { _res.cancelRowUpdates(); } catch (SQLException e) { handleException(e); } } public void moveToInsertRow() throws SQLException { try { _res.moveToInsertRow(); } catch (SQLException e) { handleException(e); } } public void moveToCurrentRow() throws SQLException { try { _res.moveToCurrentRow(); } catch (SQLException e) { handleException(e); } } public Object getObject(int i, Map map) throws SQLException { try { return _res.getObject(i, map); } catch (SQLException e) { handleException(e); return null; } } public Ref getRef(int i) throws SQLException { try { return _res.getRef(i); } catch (SQLException e) { handleException(e); return null; } } public Blob getBlob(int i) throws SQLException { try { return _res.getBlob(i); } catch (SQLException e) { handleException(e); return null; } } public Clob getClob(int i) throws SQLException { try { return _res.getClob(i); } catch (SQLException e) { handleException(e); return null; } } public Array getArray(int i) throws SQLException { try { return _res.getArray(i); } catch (SQLException e) { handleException(e); return null; } } public Object getObject(String colName, Map map) throws SQLException { try { return _res.getObject(colName, map); } catch (SQLException e) { handleException(e); return null; } } public Ref getRef(String colName) throws SQLException { try { return _res.getRef(colName); } catch (SQLException e) { handleException(e); return null; } } public Blob getBlob(String colName) throws SQLException { try { return _res.getBlob(colName); } catch (SQLException e) { handleException(e); return null; } } public Clob getClob(String colName) throws SQLException { try { return _res.getClob(colName); } catch (SQLException e) { handleException(e); return null; } } public Array getArray(String colName) throws SQLException { try { return _res.getArray(colName); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(int columnIndex, Calendar cal) throws SQLException { try { return _res.getDate(columnIndex, cal); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(String columnName, Calendar cal) throws SQLException { try { return _res.getDate(columnName, cal); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(int columnIndex, Calendar cal) throws SQLException { try { return _res.getTime(columnIndex, cal); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(String columnName, Calendar cal) throws SQLException { try { return _res.getTime(columnName, cal); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { try { return _res.getTimestamp(columnIndex, cal); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException { try { return _res.getTimestamp(columnName, cal); } catch (SQLException e) { handleException(e); return null; } } public java.net.URL getURL(int columnIndex) throws SQLException { try { return _res.getURL(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public java.net.URL getURL(String columnName) throws SQLException { try { return _res.getURL(columnName); } catch (SQLException e) { handleException(e); return null; } } public void updateRef(int columnIndex, java.sql.Ref x) throws SQLException { try { _res.updateRef(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateRef(String columnName, java.sql.Ref x) throws SQLException { try { _res.updateRef(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateBlob(int columnIndex, java.sql.Blob x) throws SQLException { try { _res.updateBlob(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateBlob(String columnName, java.sql.Blob x) throws SQLException { try { _res.updateBlob(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateClob(int columnIndex, java.sql.Clob x) throws SQLException { try { _res.updateClob(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateClob(String columnName, java.sql.Clob x) throws SQLException { try { _res.updateClob(columnName, x); } catch (SQLException e) { handleException(e); } } public void updateArray(int columnIndex, java.sql.Array x) throws SQLException { try { _res.updateArray(columnIndex, x); } catch (SQLException e) { handleException(e); } } public void updateArray(String columnName, java.sql.Array x) throws SQLException { try { _res.updateArray(columnName, x); } catch (SQLException e) { handleException(e); } } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return iface.isAssignableFrom(getClass()) || _res.isWrapperFor(iface); } public T unwrap(Class iface) throws SQLException { if (iface.isAssignableFrom(getClass())) { return iface.cast(this); } else if (iface.isAssignableFrom(_res.getClass())) { return iface.cast(_res); } else { return _res.unwrap(iface); } } public RowId getRowId(int columnIndex) throws SQLException { try { return _res.getRowId(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public RowId getRowId(String columnLabel) throws SQLException { try { return _res.getRowId(columnLabel); } catch (SQLException e) { handleException(e); return null; } } public void updateRowId(int columnIndex, RowId value) throws SQLException { try { _res.updateRowId(columnIndex, value); } catch (SQLException e) { handleException(e); } } public void updateRowId(String columnLabel, RowId value) throws SQLException { try { _res.updateRowId(columnLabel, value); } catch (SQLException e) { handleException(e); } } public int getHoldability() throws SQLException { try { return _res.getHoldability(); } catch (SQLException e) { handleException(e); return 0; } } public boolean isClosed() throws SQLException { try { return _res.isClosed(); } catch (SQLException e) { handleException(e); return false; } } public void updateNString(int columnIndex, String value) throws SQLException { try { _res.updateNString(columnIndex, value); } catch (SQLException e) { handleException(e); } } public void updateNString(String columnLabel, String value) throws SQLException { try { _res.updateNString(columnLabel, value); } catch (SQLException e) { handleException(e); } } public void updateNClob(int columnIndex, NClob value) throws SQLException { try { _res.updateNClob(columnIndex, value); } catch (SQLException e) { handleException(e); } } public void updateNClob(String columnLabel, NClob value) throws SQLException { try { _res.updateNClob(columnLabel, value); } catch (SQLException e) { handleException(e); } } public NClob getNClob(int columnIndex) throws SQLException { try { return _res.getNClob(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public NClob getNClob(String columnLabel) throws SQLException { try { return _res.getNClob(columnLabel); } catch (SQLException e) { handleException(e); return null; } } public SQLXML getSQLXML(int columnIndex) throws SQLException { try { return _res.getSQLXML(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public SQLXML getSQLXML(String columnLabel) throws SQLException { try { return _res.getSQLXML(columnLabel); } catch (SQLException e) { handleException(e); return null; } } public void updateSQLXML(int columnIndex, SQLXML value) throws SQLException { try { _res.updateSQLXML(columnIndex, value); } catch (SQLException e) { handleException(e); } } public void updateSQLXML(String columnLabel, SQLXML value) throws SQLException { try { _res.updateSQLXML(columnLabel, value); } catch (SQLException e) { handleException(e); } } public String getNString(int columnIndex) throws SQLException { try { return _res.getNString(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public String getNString(String columnLabel) throws SQLException { try { return _res.getNString(columnLabel); } catch (SQLException e) { handleException(e); return null; } } public Reader getNCharacterStream(int columnIndex) throws SQLException { try { return _res.getNCharacterStream(columnIndex); } catch (SQLException e) { handleException(e); return null; } } public Reader getNCharacterStream(String columnLabel) throws SQLException { try { return _res.getNCharacterStream(columnLabel); } catch (SQLException e) { handleException(e); return null; } } public void updateNCharacterStream(int columnIndex, Reader reader, long length) throws SQLException { try { _res.updateNCharacterStream(columnIndex, reader, length); } catch (SQLException e) { handleException(e); } } public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { try { _res.updateNCharacterStream(columnLabel, reader, length); } catch (SQLException e) { handleException(e); } } public void updateAsciiStream(int columnIndex, InputStream inputStream, long length) throws SQLException { try { _res.updateAsciiStream(columnIndex, inputStream, length); } catch (SQLException e) { handleException(e); } } public void updateBinaryStream(int columnIndex, InputStream inputStream, long length) throws SQLException { try { _res.updateBinaryStream(columnIndex, inputStream, length); } catch (SQLException e) { handleException(e); } } public void updateCharacterStream(int columnIndex, Reader reader, long length) throws SQLException { try { _res.updateCharacterStream(columnIndex, reader, length); } catch (SQLException e) { handleException(e); } } public void updateAsciiStream(String columnLabel, InputStream inputStream, long length) throws SQLException { try { _res.updateAsciiStream(columnLabel, inputStream, length); } catch (SQLException e) { handleException(e); } } public void updateBinaryStream(String columnLabel, InputStream inputStream, long length) throws SQLException { try { _res.updateBinaryStream(columnLabel, inputStream, length); } catch (SQLException e) { handleException(e); } } public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { try { _res.updateCharacterStream(columnLabel, reader, length); } catch (SQLException e) { handleException(e); } } public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { try { _res.updateBlob(columnIndex, inputStream, length); } catch (SQLException e) { handleException(e); } } public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { try { _res.updateBlob(columnLabel, inputStream, length); } catch (SQLException e) { handleException(e); } } public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { try { _res.updateClob(columnIndex, reader, length); } catch (SQLException e) { handleException(e); } } public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { try { _res.updateClob(columnLabel, reader, length); } catch (SQLException e) { handleException(e); } } public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { try { _res.updateNClob(columnIndex, reader, length); } catch (SQLException e) { handleException(e); } } public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { try { _res.updateNClob(columnLabel, reader, length); } catch (SQLException e) { handleException(e); } } public void updateNCharacterStream(int columnIndex, Reader reader) throws SQLException { try { _res.updateNCharacterStream(columnIndex, reader); } catch (SQLException e) { handleException(e); } } public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException { try { _res.updateNCharacterStream(columnLabel, reader); } catch (SQLException e) { handleException(e); } } public void updateAsciiStream(int columnIndex, InputStream inputStream) throws SQLException { try { _res.updateAsciiStream(columnIndex, inputStream); } catch (SQLException e) { handleException(e); } } public void updateBinaryStream(int columnIndex, InputStream inputStream) throws SQLException { try { _res.updateBinaryStream(columnIndex, inputStream); } catch (SQLException e) { handleException(e); } } public void updateCharacterStream(int columnIndex, Reader reader) throws SQLException { try { _res.updateCharacterStream(columnIndex, reader); } catch (SQLException e) { handleException(e); } } public void updateAsciiStream(String columnLabel, InputStream inputStream) throws SQLException { try { _res.updateAsciiStream(columnLabel, inputStream); } catch (SQLException e) { handleException(e); } } public void updateBinaryStream(String columnLabel, InputStream inputStream) throws SQLException { try { _res.updateBinaryStream(columnLabel, inputStream); } catch (SQLException e) { handleException(e); } } public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException { try { _res.updateCharacterStream(columnLabel, reader); } catch (SQLException e) { handleException(e); } } public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { try { _res.updateBlob(columnIndex, inputStream); } catch (SQLException e) { handleException(e); } } public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { try { _res.updateBlob(columnLabel, inputStream); } catch (SQLException e) { handleException(e); } } public void updateClob(int columnIndex, Reader reader) throws SQLException { try { _res.updateClob(columnIndex, reader); } catch (SQLException e) { handleException(e); } } public void updateClob(String columnLabel, Reader reader) throws SQLException { try { _res.updateClob(columnLabel, reader); } catch (SQLException e) { handleException(e); } } public void updateNClob(int columnIndex, Reader reader) throws SQLException { try { _res.updateNClob(columnIndex, reader); } catch (SQLException e) { handleException(e); } } public void updateNClob(String columnLabel, Reader reader) throws SQLException { try { _res.updateNClob(columnLabel, reader); } catch (SQLException e) { handleException(e); } } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/0000755000175000017500000000000011337741616026606 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/PooledConnectionImpl.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/PooledConnectionImpl.java0000644000175000017500000005506711333570547033551 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.cpdsadapter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Arrays; import java.util.Vector; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; import javax.sql.PooledConnection; /* JDBC_4_ANT_KEY_BEGIN */ import javax.sql.StatementEventListener; /* JDBC_4_ANT_KEY_END */ import org.apache.commons.dbcp.DelegatingConnection; import org.apache.commons.dbcp.DelegatingPreparedStatement; import org.apache.commons.dbcp.SQLNestedException; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.KeyedPoolableObjectFactory; /** * Implementation of PooledConnection that is returned by * PooledConnectionDataSource. * * @author John D. McNally * @version $Revision: 899987 $ $Date: 2010-01-16 11:51:16 -0500 (Sat, 16 Jan 2010) $ */ class PooledConnectionImpl implements PooledConnection, KeyedPoolableObjectFactory { private static final String CLOSED = "Attempted to use PooledConnection after closed() was called."; /** * The JDBC database connection that represents the physical db connection. */ private Connection connection = null; /** * A DelegatingConnection used to create a PoolablePreparedStatementStub */ private final DelegatingConnection delegatingConnection; /** * The JDBC database logical connection. */ private Connection logicalConnection = null; /** * ConnectionEventListeners */ private final Vector eventListeners; /** * StatementEventListeners */ private final Vector statementEventListeners = new Vector(); /** * flag set to true, once close() is called. */ boolean isClosed; // TODO - make private? /** My pool of {*link PreparedStatement}s. */ // TODO - make final? protected KeyedObjectPool pstmtPool = null; /** * Controls access to the underlying connection */ private boolean accessToUnderlyingConnectionAllowed = false; /** * Wrap the real connection. * @param connection the connection to be wrapped * @param pool the pool to use */ PooledConnectionImpl(Connection connection, KeyedObjectPool pool) { this.connection = connection; if (connection instanceof DelegatingConnection) { this.delegatingConnection = (DelegatingConnection) connection; } else { this.delegatingConnection = new DelegatingConnection(connection); } eventListeners = new Vector(); isClosed = false; if (pool != null) { pstmtPool = pool; pstmtPool.setFactory(this); } } /** * {@inheritDoc} */ public void addConnectionEventListener(ConnectionEventListener listener) { if (!eventListeners.contains(listener)) { eventListeners.add(listener); } } /* JDBC_4_ANT_KEY_BEGIN */ public void addStatementEventListener(StatementEventListener listener) { if (!statementEventListeners.contains(listener)) { statementEventListeners.add(listener); } } /* JDBC_4_ANT_KEY_END */ /** * Closes the physical connection and marks this * PooledConnection so that it may not be used * to generate any more logical Connections. * * @exception SQLException if an error occurs or the connection is already closed */ public void close() throws SQLException { assertOpen(); isClosed = true; try { if (pstmtPool != null) { try { pstmtPool.close(); } finally { pstmtPool = null; } } } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Cannot close connection (return to pool failed)", e); } finally { try { connection.close(); } finally { connection = null; } } } /** * Throws an SQLException, if isClosed is true */ private void assertOpen() throws SQLException { if (isClosed) { throw new SQLException(CLOSED); } } /** * Returns a JDBC connection. * * @return The database connection. * @throws SQLException if the connection is not open or the previous logical connection is still open */ public Connection getConnection() throws SQLException { assertOpen(); // make sure the last connection is marked as closed if (logicalConnection != null && !logicalConnection.isClosed()) { // should notify pool of error so the pooled connection can // be removed !FIXME! throw new SQLException("PooledConnection was reused, without" + "its previous Connection being closed."); } // the spec requires that this return a new Connection instance. logicalConnection = new ConnectionImpl( this, connection, isAccessToUnderlyingConnectionAllowed()); return logicalConnection; } /** * {@inheritDoc} */ public void removeConnectionEventListener( ConnectionEventListener listener) { eventListeners.remove(listener); } /* JDBC_4_ANT_KEY_BEGIN */ public void removeStatementEventListener(StatementEventListener listener) { statementEventListeners.remove(listener); } /* JDBC_4_ANT_KEY_END */ /** * Closes the physical connection and checks that the logical connection * was closed as well. */ protected void finalize() throws Throwable { // Closing the Connection ensures that if anyone tries to use it, // an error will occur. try { connection.close(); } catch (Exception ignored) { } // make sure the last connection is marked as closed if (logicalConnection != null && !logicalConnection.isClosed()) { throw new SQLException("PooledConnection was gc'ed, without" + "its last Connection being closed."); } } /** * sends a connectionClosed event. */ void notifyListeners() { ConnectionEvent event = new ConnectionEvent(this); Object[] listeners = eventListeners.toArray(); for (int i = 0; i < listeners.length; i++) { ((ConnectionEventListener) listeners[i]).connectionClosed(event); } } // ------------------------------------------------------------------- // The following code implements a PreparedStatement pool /** * Create or obtain a {@link PreparedStatement} from my pool. * @param sql the SQL statement * @return a {@link PoolablePreparedStatement} */ PreparedStatement prepareStatement(String sql) throws SQLException { if (pstmtPool == null) { return connection.prepareStatement(sql); } else { try { return (PreparedStatement) pstmtPool.borrowObject(createKey(sql)); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow prepareStatement from pool failed", e); } } } /** * Create or obtain a {@link PreparedStatement} from my pool. * @param sql a String object that is the SQL statement to * be sent to the database; may contain one or more '?' IN * parameters * @param resultSetType a result set type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency a concurrency type; one of * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * * @return a {@link PoolablePreparedStatement} * @see Connection#prepareStatement(String, int, int) */ PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { if (pstmtPool == null) { return connection.prepareStatement(sql, resultSetType, resultSetConcurrency); } else { try { return (PreparedStatement) pstmtPool.borrowObject( createKey(sql,resultSetType,resultSetConcurrency)); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow prepareStatement from pool failed", e); } } } /** * Create or obtain a {@link PreparedStatement} from my pool. * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param autoGeneratedKeys a flag indicating whether auto-generated keys * should be returned; one of * Statement.RETURN_GENERATED_KEYS or * Statement.NO_GENERATED_KEYS * @return a {@link PoolablePreparedStatement} * @see Connection#prepareStatement(String, int) */ PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { if (pstmtPool == null) { return connection.prepareStatement(sql, autoGeneratedKeys); } else { try { return (PreparedStatement) pstmtPool.borrowObject( createKey(sql,autoGeneratedKeys)); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow prepareStatement from pool failed", e); } } } PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { if (pstmtPool == null) { return connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); } else { try { return (PreparedStatement) pstmtPool.borrowObject( createKey(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow prepareStatement from pool failed", e); } } } PreparedStatement prepareStatement(String sql, int columnIndexes[]) throws SQLException { if (pstmtPool == null) { return connection.prepareStatement(sql, columnIndexes); } else { try { return (PreparedStatement) pstmtPool.borrowObject( createKey(sql, columnIndexes)); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow prepareStatement from pool failed", e); } } } PreparedStatement prepareStatement(String sql, String columnNames[]) throws SQLException { if (pstmtPool == null) { return connection.prepareStatement(sql, columnNames); } else { try { return (PreparedStatement) pstmtPool.borrowObject( createKey(sql, columnNames)); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new SQLNestedException("Borrow prepareStatement from pool failed", e); } } } /** * Create a {*link PooledConnectionImpl.PStmtKey} for the given arguments. */ protected Object createKey(String sql, int autoGeneratedKeys) { return new PStmtKey(normalizeSQL(sql), autoGeneratedKeys); } /** * Create a {*link PooledConnectionImpl.PStmtKey} for the given arguments. */ protected Object createKey(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) { return new PStmtKey(normalizeSQL(sql), resultSetType, resultSetConcurrency, resultSetHoldability); } /** * Create a {*link PooledConnectionImpl.PStmtKey} for the given arguments. */ protected Object createKey(String sql, int columnIndexes[]) { return new PStmtKey(normalizeSQL(sql), columnIndexes); } /** * Create a {*link PooledConnectionImpl.PStmtKey} for the given arguments. */ protected Object createKey(String sql, String columnNames[]) { return new PStmtKey(normalizeSQL(sql), columnNames); } /** * Create a {*link PooledConnectionImpl.PStmtKey} for the given arguments. */ protected Object createKey(String sql, int resultSetType, int resultSetConcurrency) { return new PStmtKey(normalizeSQL(sql), resultSetType, resultSetConcurrency); } /** * Create a {*link PooledConnectionImpl.PStmtKey} for the given arguments. */ protected Object createKey(String sql) { return new PStmtKey(normalizeSQL(sql)); } /** * Normalize the given SQL statement, producing a * cannonical form that is semantically equivalent to the original. */ protected String normalizeSQL(String sql) { return sql.trim(); } /** * My {*link KeyedPoolableObjectFactory} method for creating * {*link PreparedStatement}s. * @param obj the key for the {*link PreparedStatement} to be created */ public Object makeObject(Object obj) throws Exception { if (null == obj || !(obj instanceof PStmtKey)) { throw new IllegalArgumentException(); } else { // _openPstmts++; PStmtKey key = (PStmtKey)obj; if (null == key._resultSetType && null == key._resultSetConcurrency) { if (null == key._autoGeneratedKeys) { return new PoolablePreparedStatementStub( connection.prepareStatement(key._sql), key, pstmtPool, delegatingConnection); } else { return new PoolablePreparedStatementStub( connection.prepareStatement(key._sql, key._autoGeneratedKeys.intValue()), key, pstmtPool, delegatingConnection); } } else { return new PoolablePreparedStatementStub( connection.prepareStatement(key._sql, key._resultSetType.intValue(), key._resultSetConcurrency.intValue()), key, pstmtPool, delegatingConnection); } } } /** * My {*link KeyedPoolableObjectFactory} method for destroying * {*link PreparedStatement}s. * @param key ignored * @param obj the {*link PreparedStatement} to be destroyed. */ public void destroyObject(Object key, Object obj) throws Exception { //_openPstmts--; if (obj instanceof DelegatingPreparedStatement) { ((DelegatingPreparedStatement) obj).getInnermostDelegate().close(); } else { ((PreparedStatement) obj).close(); } } /** * My {*link KeyedPoolableObjectFactory} method for validating * {*link PreparedStatement}s. * @param key ignored * @param obj ignored * @return true */ public boolean validateObject(Object key, Object obj) { return true; } /** * My {*link KeyedPoolableObjectFactory} method for activating * {*link PreparedStatement}s. * @param key ignored * @param obj ignored */ public void activateObject(Object key, Object obj) throws Exception { ((PoolablePreparedStatementStub) obj).activate(); } /** * My {*link KeyedPoolableObjectFactory} method for passivating * {*link PreparedStatement}s. Currently invokes {*link PreparedStatement#clearParameters}. * @param key ignored * @param obj a {*link PreparedStatement} */ public void passivateObject(Object key, Object obj) throws Exception { ((PreparedStatement) obj).clearParameters(); ((PoolablePreparedStatementStub) obj).passivate(); } /** * Returns the value of the accessToUnderlyingConnectionAllowed property. * * @return true if access to the underlying is allowed, false otherwise. */ public synchronized boolean isAccessToUnderlyingConnectionAllowed() { return this.accessToUnderlyingConnectionAllowed; } /** * Sets the value of the accessToUnderlyingConnectionAllowed property. * It controls if the PoolGuard allows access to the underlying connection. * (Default: false) * * @param allow Access to the underlying connection is granted when true. */ public synchronized void setAccessToUnderlyingConnectionAllowed(boolean allow) { this.accessToUnderlyingConnectionAllowed = allow; } /** * A key uniquely identifying {*link PreparedStatement}s. */ static class PStmtKey { protected String _sql = null; protected Integer _resultSetType = null; protected Integer _resultSetConcurrency = null; protected Integer _autoGeneratedKeys = null; protected Integer _resultSetHoldability = null; protected int _columnIndexes[] = null; protected String _columnNames[] = null; PStmtKey(String sql) { _sql = sql; } PStmtKey(String sql, int resultSetType, int resultSetConcurrency) { _sql = sql; _resultSetType = new Integer(resultSetType); _resultSetConcurrency = new Integer(resultSetConcurrency); } PStmtKey(String sql, int autoGeneratedKeys) { _sql = sql; _autoGeneratedKeys = new Integer(autoGeneratedKeys); } PStmtKey(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) { _sql = sql; _resultSetType = new Integer(resultSetType); _resultSetConcurrency = new Integer(resultSetConcurrency); _resultSetHoldability = new Integer(resultSetHoldability); } PStmtKey(String sql, int columnIndexes[]) { _sql = sql; _columnIndexes = columnIndexes; } PStmtKey(String sql, String columnNames[]) { _sql = sql; _columnNames = columnNames; } public boolean equals(Object that) { try { PStmtKey key = (PStmtKey) that; return(((null == _sql && null == key._sql) || _sql.equals(key._sql)) && ((null == _resultSetType && null == key._resultSetType) || _resultSetType.equals(key._resultSetType)) && ((null == _resultSetConcurrency && null == key._resultSetConcurrency) || _resultSetConcurrency.equals(key._resultSetConcurrency)) && ((null == _autoGeneratedKeys && null == key._autoGeneratedKeys) || _autoGeneratedKeys.equals(key._autoGeneratedKeys)) && ((null == _resultSetHoldability && null == key._resultSetHoldability) || _resultSetHoldability.equals(key._resultSetHoldability)) && ((null == _columnIndexes && null == key._columnIndexes) || Arrays.equals(_columnIndexes, key._columnIndexes)) && ((null == _columnNames && null == key._columnNames) || Arrays.equals(_columnNames, key._columnNames)) ); } catch (ClassCastException e) { return false; } catch (NullPointerException e) { return false; } } public int hashCode() { return(null == _sql ? 0 : _sql.hashCode()); } public String toString() { StringBuffer buf = new StringBuffer(); buf.append("PStmtKey: sql="); buf.append(_sql); buf.append(", resultSetType="); buf.append(_resultSetType); buf.append(", resultSetConcurrency="); buf.append(_resultSetConcurrency); buf.append(", autoGeneratedKeys="); buf.append(_autoGeneratedKeys); buf.append(", resultSetHoldability="); buf.append(_resultSetHoldability); buf.append(", columnIndexes="); // JDK1.5 buf.append(Arrays.toString(_columnIndexes)); arrayToString(buf,_columnIndexes); buf.append(", columnNames="); // JDK1.5 buf.append(Arrays.toString(_columnNames)); arrayToString(buf,_columnNames); return buf.toString(); } private void arrayToString(StringBuffer sb, int[] array){ if (array == null) { sb.append("null"); return; } sb.append('['); for(int i=0; i0){ sb.append(','); } sb.append(array[i]); } sb.append(']'); } private void arrayToString(StringBuffer sb, String[] array){ if (array == null) { sb.append("null"); return; } sb.append('['); for(int i=0; i0){ sb.append(','); } sb.append(array[i]); } sb.append(']'); } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/package.html0000644000175000017500000000547211333570547031076 0ustar drazzibdrazzib

This package contains one public class which is a ConnectionPoolDataSource (CPDS) implementation that can be used to adapt older Driver based jdbc implementations. Below is an example of setting up the CPDS to be available via JNDI in the catalina servlet container.

In server.xml, the following would be added to the <Context> for your webapp:

 <Resource name="jdbc/bookstoreCPDS" auth="Container"
            type="org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS"/>
  <ResourceParams name="jdbc/bookstoreCPDS">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS</value>
    </parameter>
        <parameter><name>user</name><value>root</value></parameter>
        <parameter><name>password</name><value></value></parameter>
        <parameter>
            <name>driver</name>
            <value>org.gjt.mm.mysql.Driver</value></parameter>
        <parameter>
             <name>url</name>
             <value>jdbc:mysql://localhost:3306/bookstore</value>
        </parameter>
  </ResourceParams>

In web.xml. Note that elements must be given in the order of the dtd described in the servlet specification:

<resource-ref>
  <description>
    Resource reference to a factory for java.sql.Connection
    instances that may be used for talking to a particular
    database that is configured in the server.xml file.
  </description>
  <res-ref-name>
    jdbc/bookstoreCPDS
  </res-ref-name>
  <res-type>
    org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>

Catalina deploys all objects configured similarly to above within the java:comp/env namespace.

libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/DriverAdapterCPDS.java0000644000175000017500000006440511333570547032667 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.cpdsadapter; import java.util.Hashtable; import java.util.Properties; import java.io.PrintWriter; import java.io.Serializable; import java.sql.DriverManager; import java.sql.SQLException; import javax.sql.PooledConnection; import javax.sql.ConnectionPoolDataSource; import javax.naming.Name; import javax.naming.Context; import javax.naming.Referenceable; import javax.naming.spi.ObjectFactory; import javax.naming.Reference; import javax.naming.RefAddr; import javax.naming.StringRefAddr; import javax.naming.NamingException; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.impl.GenericKeyedObjectPool; /** *

* An adapter for jdbc drivers that do not include an implementation * of {@link javax.sql.ConnectionPoolDataSource}, but still include a * {@link java.sql.DriverManager} implementation. * ConnectionPoolDataSources are not used within general * applications. They are used by DataSource implementations * that pool Connections, such as * {@link org.apache.commons.dbcp.datasources.SharedPoolDataSource}. A J2EE * container will normally provide some method of initializing the * ConnectionPoolDataSource whose attributes are presented * as bean getters/setters and then deploying it via JNDI. It is then * available as a source of physical connections to the database, when * the pooling DataSource needs to create a new * physical connection. *

* *

* Although normally used within a JNDI environment, the DriverAdapterCPDS * can be instantiated and initialized as any bean and then attached * directly to a pooling DataSource. * Jdbc2PoolDataSource can use the * ConnectionPoolDataSource with or without the use of JNDI. *

* *

* The DriverAdapterCPDS also provides PreparedStatement pooling * which is not generally available in jbdc2 * ConnectionPoolDataSource implementation, but is * addressed within the jdbc3 specification. The PreparedStatement * pool in DriverAdapterCPDS has been in the dbcp package for some time, but * it has not undergone extensive testing in the configuration used here. * It should be considered experimental and can be toggled with the * poolPreparedStatements attribute. *

* *

* The package documentation contains an * example using catalina and JNDI. The datasources package documentation * shows how to use DriverAdapterCPDS as a source for * Jdbc2PoolDataSource without the use of JNDI. *

* * @author John D. McNally * @version $Revision: 896266 $ $Date: 2010-01-05 18:20:12 -0500 (Tue, 05 Jan 2010) $ */ public class DriverAdapterCPDS implements ConnectionPoolDataSource, Referenceable, Serializable, ObjectFactory { private static final long serialVersionUID = -4820523787212147844L; private static final String GET_CONNECTION_CALLED = "A PooledConnection was already requested from this source, " + "further initialization is not allowed."; /** Description */ private String description; /** Password */ private String password; /** Url name */ private String url; /** User name */ private String user; /** Driver class name */ private String driver; /** Login TimeOut in seconds */ private int loginTimeout; /** Log stream. NOT USED */ private transient PrintWriter logWriter = null; // PreparedStatement pool properties private boolean poolPreparedStatements; private int maxActive = 10; private int maxIdle = 10; private int _timeBetweenEvictionRunsMillis = -1; private int _numTestsPerEvictionRun = -1; private int _minEvictableIdleTimeMillis = -1; private int _maxPreparedStatements = -1; /** Whether or not getConnection has been called */ private volatile boolean getConnectionCalled = false; /** Connection properties passed to JDBC Driver */ private Properties connectionProperties = null; static { // Attempt to prevent deadlocks - see DBCP - 272 DriverManager.getDrivers(); } /** * Controls access to the underlying connection */ private boolean accessToUnderlyingConnectionAllowed = false; /** * Default no-arg constructor for Serialization */ public DriverAdapterCPDS() { } /** * Attempt to establish a database connection using the default * user and password. */ public PooledConnection getPooledConnection() throws SQLException { return getPooledConnection(getUser(), getPassword()); } /** * Attempt to establish a database connection. * @param username name to be used for the connection * @param pass password to be used fur the connection */ public PooledConnection getPooledConnection(String username, String pass) throws SQLException { getConnectionCalled = true; /* public GenericKeyedObjectPool(KeyedPoolableObjectFactory factory, int maxActive, byte whenExhaustedAction, long maxWait, int maxIdle, boolean testOnBorrow, boolean testOnReturn, long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis, boolean testWhileIdle) { */ KeyedObjectPool stmtPool = null; if (isPoolPreparedStatements()) { if (getMaxPreparedStatements() <= 0) { // since there is no limit, create a prepared statement pool with an eviction thread // evictor settings are the same as the connection pool settings. stmtPool = new GenericKeyedObjectPool(null, getMaxActive(), GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW, 0, getMaxIdle(), false, false, getTimeBetweenEvictionRunsMillis(),getNumTestsPerEvictionRun(),getMinEvictableIdleTimeMillis(), false); } else { // since there is limit, create a prepared statement pool without an eviction thread // pool has LRU functionality so when the limit is reached, 15% of the pool is cleared. // see org.apache.commons.pool.impl.GenericKeyedObjectPool.clearOldest method stmtPool = new GenericKeyedObjectPool(null, getMaxActive(), GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW, 0, getMaxIdle(), getMaxPreparedStatements(), false, false, -1,0,0, // -1 tells the pool that there should be no eviction thread. false); } } // Workaround for buggy WebLogic 5.1 classloader - ignore the // exception upon first invocation. try { PooledConnectionImpl pci = null; if (connectionProperties != null) { connectionProperties.put("user", username); connectionProperties.put("password", pass); pci = new PooledConnectionImpl( DriverManager.getConnection(getUrl(), connectionProperties), stmtPool); } else { pci = new PooledConnectionImpl( DriverManager.getConnection(getUrl(), username, pass), stmtPool); } pci.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed()); return pci; } catch (ClassCircularityError e) { PooledConnectionImpl pci = null; if (connectionProperties != null) { pci = new PooledConnectionImpl( DriverManager.getConnection(getUrl(), connectionProperties), stmtPool); } else { pci = new PooledConnectionImpl( DriverManager.getConnection(getUrl(), username, pass), stmtPool); } pci.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed()); return pci; } } // ---------------------------------------------------------------------- // Referenceable implementation /** * Referenceable implementation. */ public Reference getReference() throws NamingException { // this class implements its own factory String factory = getClass().getName(); Reference ref = new Reference(getClass().getName(), factory, null); ref.add(new StringRefAddr("description", getDescription())); ref.add(new StringRefAddr("driver", getDriver())); ref.add(new StringRefAddr("loginTimeout", String.valueOf(getLoginTimeout()))); ref.add(new StringRefAddr("password", getPassword())); ref.add(new StringRefAddr("user", getUser())); ref.add(new StringRefAddr("url", getUrl())); ref.add(new StringRefAddr("poolPreparedStatements", String.valueOf(isPoolPreparedStatements()))); ref.add(new StringRefAddr("maxActive", String.valueOf(getMaxActive()))); ref.add(new StringRefAddr("maxIdle", String.valueOf(getMaxIdle()))); ref.add(new StringRefAddr("timeBetweenEvictionRunsMillis", String.valueOf(getTimeBetweenEvictionRunsMillis()))); ref.add(new StringRefAddr("numTestsPerEvictionRun", String.valueOf(getNumTestsPerEvictionRun()))); ref.add(new StringRefAddr("minEvictableIdleTimeMillis", String.valueOf(getMinEvictableIdleTimeMillis()))); ref.add(new StringRefAddr("maxPreparedStatements", String.valueOf(getMaxPreparedStatements()))); return ref; } // ---------------------------------------------------------------------- // ObjectFactory implementation /** * implements ObjectFactory to create an instance of this class */ public Object getObjectInstance(Object refObj, Name name, Context context, Hashtable env) throws Exception { // The spec says to return null if we can't create an instance // of the reference DriverAdapterCPDS cpds = null; if (refObj instanceof Reference) { Reference ref = (Reference)refObj; if (ref.getClassName().equals(getClass().getName())) { RefAddr ra = ref.get("description"); if (ra != null && ra.getContent() != null) { setDescription(ra.getContent().toString()); } ra = ref.get("driver"); if (ra != null && ra.getContent() != null) { setDriver(ra.getContent().toString()); } ra = ref.get("url"); if (ra != null && ra.getContent() != null) { setUrl(ra.getContent().toString()); } ra = ref.get("user"); if (ra != null && ra.getContent() != null) { setUser(ra.getContent().toString()); } ra = ref.get("password"); if (ra != null && ra.getContent() != null) { setPassword(ra.getContent().toString()); } ra = ref.get("poolPreparedStatements"); if (ra != null && ra.getContent() != null) { setPoolPreparedStatements(Boolean.valueOf( ra.getContent().toString()).booleanValue()); } ra = ref.get("maxActive"); if (ra != null && ra.getContent() != null) { setMaxActive(Integer.parseInt(ra.getContent().toString())); } ra = ref.get("maxIdle"); if (ra != null && ra.getContent() != null) { setMaxIdle(Integer.parseInt(ra.getContent().toString())); } ra = ref.get("timeBetweenEvictionRunsMillis"); if (ra != null && ra.getContent() != null) { setTimeBetweenEvictionRunsMillis( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("numTestsPerEvictionRun"); if (ra != null && ra.getContent() != null) { setNumTestsPerEvictionRun( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("minEvictableIdleTimeMillis"); if (ra != null && ra.getContent() != null) { setMinEvictableIdleTimeMillis( Integer.parseInt(ra.getContent().toString())); } ra = ref.get("maxPreparedStatements"); if (ra != null && ra.getContent() != null) { setMaxPreparedStatements( Integer.parseInt(ra.getContent().toString())); } cpds = this; } } return cpds; } /** * Throws an IllegalStateException, if a PooledConnection has already * been requested. */ private void assertInitializationAllowed() throws IllegalStateException { if (getConnectionCalled) { throw new IllegalStateException(GET_CONNECTION_CALLED); } } // ---------------------------------------------------------------------- // Properties /** * Get the connection properties passed to the JDBC driver. * * @return the JDBC connection properties used when creating connections. * @since 1.3 */ public Properties getConnectionProperties() { return connectionProperties; } /** *

Set the connection properties passed to the JDBC driver.

* *

If props contains "user" and/or "password" * properties, the corresponding instance properties are set. If these * properties are not present, they are filled in using * {@link #getUser()}, {@link #getPassword()} when {@link #getPooledConnection()} * is called, or using the actual parameters to the method call when * {@link #getPooledConnection(String, String)} is called. Calls to * {@link #setUser(String)} or {@link #setPassword(String)} overwrite the values * of these properties if connectionProperties is not null.

* * @param props Connection properties to use when creating new connections. * @since 1.3 * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setConnectionProperties(Properties props) { assertInitializationAllowed(); connectionProperties = props; if (connectionProperties.containsKey("user")) { setUser(connectionProperties.getProperty("user")); } if (connectionProperties.containsKey("password")) { setPassword(connectionProperties.getProperty("password")); } } /** * Get the value of description. This property is here for use by * the code which will deploy this datasource. It is not used * internally. * * @return value of description, may be null. * @see #setDescription(String) */ public String getDescription() { return description; } /** * Set the value of description. This property is here for use by * the code which will deploy this datasource. It is not used * internally. * * @param v Value to assign to description. */ public void setDescription(String v) { this.description = v; } /** * Get the value of password for the default user. * @return value of password. */ public String getPassword() { return password; } /** * Set the value of password for the default user. * @param v Value to assign to password. * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setPassword(String v) { assertInitializationAllowed(); this.password = v; if (connectionProperties != null) { connectionProperties.setProperty("password", v); } } /** * Get the value of url used to locate the database for this datasource. * @return value of url. */ public String getUrl() { return url; } /** * Set the value of url used to locate the database for this datasource. * @param v Value to assign to url. * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setUrl(String v) { assertInitializationAllowed(); this.url = v; } /** * Get the value of default user (login or username). * @return value of user. */ public String getUser() { return user; } /** * Set the value of default user (login or username). * @param v Value to assign to user. * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setUser(String v) { assertInitializationAllowed(); this.user = v; if (connectionProperties != null) { connectionProperties.setProperty("user", v); } } /** * Get the driver classname. * @return value of driver. */ public String getDriver() { return driver; } /** * Set the driver classname. Setting the driver classname cause the * driver to be registered with the DriverManager. * @param v Value to assign to driver. * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setDriver(String v) throws ClassNotFoundException { assertInitializationAllowed(); this.driver = v; // make sure driver is registered Class.forName(v); } /** * Gets the maximum time in seconds that this data source can wait * while attempting to connect to a database. NOT USED. */ public int getLoginTimeout() { return loginTimeout; } /** * Get the log writer for this data source. NOT USED. */ public PrintWriter getLogWriter() { return logWriter; } /** * Sets the maximum time in seconds that this data source will wait * while attempting to connect to a database. NOT USED. */ public void setLoginTimeout(int seconds) { loginTimeout = seconds; } /** * Set the log writer for this data source. NOT USED. */ public void setLogWriter(java.io.PrintWriter out) { logWriter = out; } // ------------------------------------------------------------------ // PreparedStatement pool properties /** * Flag to toggle the pooling of PreparedStatements * @return value of poolPreparedStatements. */ public boolean isPoolPreparedStatements() { return poolPreparedStatements; } /** * Flag to toggle the pooling of PreparedStatements * @param v true to pool statements. * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setPoolPreparedStatements(boolean v) { assertInitializationAllowed(); this.poolPreparedStatements = v; } /** * The maximum number of active statements that can be allocated from * this pool at the same time, or non-positive for no limit. */ public int getMaxActive() { return (this.maxActive); } /** * The maximum number of active statements that can be allocated from * this pool at the same time, or non-positive for no limit. * @param maxActive the maximum number of concurrent active statements allowed * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setMaxActive(int maxActive) { assertInitializationAllowed(); this.maxActive = maxActive; } /** * The maximum number of statements that can remain idle in the * pool, without extra ones being released, or negative for no limit. * @return the value of maxIdle */ public int getMaxIdle() { return (this.maxIdle); } /** * The maximum number of statements that can remain idle in the * pool, without extra ones being released, or negative for no limit. * * @param maxIdle The maximum number of statements that can remain idle * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setMaxIdle(int maxIdle) { assertInitializationAllowed(); this.maxIdle = maxIdle; } /** * Returns the number of milliseconds to sleep between runs of the * idle object evictor thread. * When non-positive, no idle object evictor thread will be * run. * @return the value of the evictor thread timer * @see #setTimeBetweenEvictionRunsMillis(int) */ public int getTimeBetweenEvictionRunsMillis() { return _timeBetweenEvictionRunsMillis; } /** * Sets the number of milliseconds to sleep between runs of the * idle object evictor thread. * When non-positive, no idle object evictor thread will be * run. * @param timeBetweenEvictionRunsMillis * @see #getTimeBetweenEvictionRunsMillis() * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setTimeBetweenEvictionRunsMillis( int timeBetweenEvictionRunsMillis) { assertInitializationAllowed(); _timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } /** * Returns the number of statements to examine during each run of the * idle object evictor thread (if any). * * *see #setNumTestsPerEvictionRun * *see #setTimeBetweenEvictionRunsMillis */ public int getNumTestsPerEvictionRun() { return _numTestsPerEvictionRun; } /** * Sets the number of statements to examine during each run of the * idle object evictor thread (if any). *

* When a negative value is supplied, ceil({*link #numIdle})/abs({*link #getNumTestsPerEvictionRun}) * tests will be run. I.e., when the value is -n, roughly one nth of the * idle objects will be tested per run. * * @param numTestsPerEvictionRun number of statements to examine per run * @see #getNumTestsPerEvictionRun() * @see #setTimeBetweenEvictionRunsMillis(int) * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) { assertInitializationAllowed(); _numTestsPerEvictionRun = numTestsPerEvictionRun; } /** * Returns the minimum amount of time a statement may sit idle in the pool * before it is eligible for eviction by the idle object evictor * (if any). * * *see #setMinEvictableIdleTimeMillis * *see #setTimeBetweenEvictionRunsMillis */ public int getMinEvictableIdleTimeMillis() { return _minEvictableIdleTimeMillis; } /** * Sets the minimum amount of time a statement may sit idle in the pool * before it is eligable for eviction by the idle object evictor * (if any). * When non-positive, no objects will be evicted from the pool * due to idle time alone. * @param minEvictableIdleTimeMillis minimum time to set (in ms) * @see #getMinEvictableIdleTimeMillis() * @see #setTimeBetweenEvictionRunsMillis(int) * @throws IllegalStateException if {@link #getPooledConnection()} has been called */ public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) { assertInitializationAllowed(); _minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } /** * Returns the value of the accessToUnderlyingConnectionAllowed property. * * @return true if access to the underlying is allowed, false otherwise. */ public synchronized boolean isAccessToUnderlyingConnectionAllowed() { return this.accessToUnderlyingConnectionAllowed; } /** * Sets the value of the accessToUnderlyingConnectionAllowed property. * It controls if the PoolGuard allows access to the underlying connection. * (Default: false) * * @param allow Access to the underlying connection is granted when true. */ public synchronized void setAccessToUnderlyingConnectionAllowed(boolean allow) { this.accessToUnderlyingConnectionAllowed = allow; } /** * Returns the maximun number of prepared statements. * * @return maxPrepartedStatements value * @since 1.2.2 */ public int getMaxPreparedStatements() { return _maxPreparedStatements; } /** * Sets the maximum number of prepared statements. * @param maxPreparedStatements the new maximum number of prepared * statements * * @since 1.2.2 */ public void setMaxPreparedStatements(int maxPreparedStatements) { _maxPreparedStatements = maxPreparedStatements; } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/ConnectionImpl.java0000644000175000017500000001721311333570547032375 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.cpdsadapter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.apache.commons.dbcp.DelegatingConnection; import org.apache.commons.dbcp.DelegatingPreparedStatement; /** * This class is the Connection that will be returned * from PooledConnectionImpl.getConnection(). * Most methods are wrappers around the jdbc 1.x Connection. * A few exceptions include preparedStatement and close. * In accordance with the jdbc specification this Connection cannot * be used after closed() is called. Any further usage will result in an * SQLException. * * ConnectionImpl extends DelegatingConnection to enable access to the * underlying connection. * * @author John D. McNally * @version $Revision: 896266 $ $Date: 2010-01-05 18:20:12 -0500 (Tue, 05 Jan 2010) $ */ class ConnectionImpl extends DelegatingConnection { private final boolean accessToUnderlyingConnectionAllowed; /** The object that instantiated this object */ private final PooledConnectionImpl pooledConnection; /** * Creates a ConnectionImpl. * * @param pooledConnection The PooledConnection that is calling the ctor. * @param connection The JDBC 1.x Connection to wrap. * @param accessToUnderlyingConnectionAllowed if true, then access is allowed to the underlying connectiion */ ConnectionImpl(PooledConnectionImpl pooledConnection, Connection connection, boolean accessToUnderlyingConnectionAllowed) { super(connection); this.pooledConnection = pooledConnection; this.accessToUnderlyingConnectionAllowed = accessToUnderlyingConnectionAllowed; } /** * Marks the Connection as closed, and notifies the pool that the * pooled connection is available. * In accordance with the jdbc specification this Connection cannot * be used after closed() is called. Any further usage will result in an * SQLException. * * @exception SQLException The database connection couldn't be closed. */ public void close() throws SQLException { if (!_closed) { _closed = true; passivate(); pooledConnection.notifyListeners(); } } /** * If pooling of PreparedStatements is turned on in the * {@link DriverAdapterCPDS}, a pooled object may be returned, otherwise * delegate to the wrapped jdbc 1.x {@link java.sql.Connection}. * * @param sql SQL statement to be prepared * @return the prepared statement * @exception SQLException if this connection is closed or an error occurs * in the wrapped connection. */ public PreparedStatement prepareStatement(String sql) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement (this, pooledConnection.prepareStatement(sql)); } catch (SQLException e) { handleException(e); // Does not return return null; } } /** * If pooling of PreparedStatements is turned on in the * {@link DriverAdapterCPDS}, a pooled object may be returned, otherwise * delegate to the wrapped jdbc 1.x {@link java.sql.Connection}. * * @exception SQLException if this connection is closed or an error occurs * in the wrapped connection. */ public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement (this, pooledConnection.prepareStatement (sql,resultSetType,resultSetConcurrency)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, pooledConnection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, pooledConnection.prepareStatement(sql, autoGeneratedKeys)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, int columnIndexes[]) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, pooledConnection.prepareStatement(sql, columnIndexes)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, String columnNames[]) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, pooledConnection.prepareStatement(sql, columnNames)); } catch (SQLException e) { handleException(e); return null; } } // // Methods for accessing the delegate connection // /** * If false, getDelegate() and getInnermostDelegate() will return null. * @return true if access is allowed to the underlying connection * @see ConnectionImpl */ public boolean isAccessToUnderlyingConnectionAllowed() { return accessToUnderlyingConnectionAllowed; } /** * Get the delegated connection, if allowed. * @return the internal connection, or null if access is not allowed. * @see #isAccessToUnderlyingConnectionAllowed() */ public Connection getDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return getDelegateInternal(); } else { return null; } } /** * Get the innermost connection, if allowed. * @return the innermost internal connection, or null if access is not allowed. * @see #isAccessToUnderlyingConnectionAllowed() */ public Connection getInnermostDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return super.getInnermostDelegateInternal(); } else { return null; } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/PoolablePreparedStatementStub.javalibcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/cpdsadapter/PoolablePreparedStatement0000644000175000017500000000400511333570547033634 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp.cpdsadapter; import java.sql.PreparedStatement; import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.dbcp.PoolablePreparedStatement; /** * A {@link PoolablePreparedStatement} stub since activate and passivate * are declared protected and we need to be able to call them within this * package. * * @author John D. McNally * @version $Revision: 479137 $ $Date: 2006-11-25 10:51:48 -0500 (Sat, 25 Nov 2006) $ */ class PoolablePreparedStatementStub extends PoolablePreparedStatement { /** * Constructor * @param stmt my underlying {@link PreparedStatement} * @param key my key" as used by {@link KeyedObjectPool} * @param pool the {@link KeyedObjectPool} from which I was obtained. * @param conn the {@link Connection} from which I was created */ public PoolablePreparedStatementStub(PreparedStatement stmt, Object key, KeyedObjectPool pool, Connection conn) { super(stmt, key, pool, conn); } protected void activate() throws SQLException { super.activate(); } protected void passivate() throws SQLException { super.passivate(); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/AbandonedObjectPool.java0000644000175000017500000001271711333570550031014 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.pool.PoolableObjectFactory; import org.apache.commons.pool.impl.GenericObjectPool; /** *

An implementation of a Jakarta-Commons ObjectPool which * tracks JDBC connections and can recover abandoned db connections. * If logAbandoned=true, a stack trace will be printed for any * abandoned db connections recovered. * * @author Glenn L. Nielsen * @version $Revision: 899987 $ $Date: 2010-01-16 11:51:16 -0500 (Sat, 16 Jan 2010) $ */ public class AbandonedObjectPool extends GenericObjectPool { /** * DBCP AbandonedConfig */ private final AbandonedConfig config; /** * A list of connections in use */ private final List trace = new ArrayList(); /** * Create an ObjectPool which tracks db connections. * * @param factory PoolableObjectFactory used to create this * @param config configuration for abandoned db connections */ public AbandonedObjectPool(PoolableObjectFactory factory, AbandonedConfig config) { super(factory); this.config = config; } /** * Get a db connection from the pool. * * If removeAbandoned=true, recovers db connections which * have been idle > removeAbandonedTimeout and * getNumActive() > getMaxActive() - 3 and * getNumIdle() < 2 * * @return Object jdbc Connection * @throws Exception if an exception occurs retrieving a * connection from the pool */ public Object borrowObject() throws Exception { if (config != null && config.getRemoveAbandoned() && (getNumIdle() < 2) && (getNumActive() > getMaxActive() - 3) ) { removeAbandoned(); } Object obj = super.borrowObject(); if (obj instanceof AbandonedTrace) { ((AbandonedTrace) obj).setStackTrace(); } if (obj != null && config != null && config.getRemoveAbandoned()) { synchronized (trace) { trace.add(obj); } } return obj; } /** * Return a db connection to the pool. * * @param obj db Connection to return * @throws Exception if an exception occurs returning the connection * to the pool */ public void returnObject(Object obj) throws Exception { if (config != null && config.getRemoveAbandoned()) { synchronized (trace) { boolean foundObject = trace.remove(obj); if (!foundObject) { return; // This connection has already been invalidated. Stop now. } } } super.returnObject(obj); } /** * Invalidates an object from the pool. * * @param obj object to be returned * @throws Exception if an exception occurs invalidating the object */ public void invalidateObject(Object obj) throws Exception { if (config != null && config.getRemoveAbandoned()) { synchronized (trace) { boolean foundObject = trace.remove(obj); if (!foundObject) { return; // This connection has already been invalidated. Stop now. } } } super.invalidateObject(obj); } /** * Recover abandoned db connections which have been idle * greater than the removeAbandonedTimeout. */ private void removeAbandoned() { // Generate a list of abandoned connections to remove long now = System.currentTimeMillis(); long timeout = now - (config.getRemoveAbandonedTimeout() * 1000); ArrayList remove = new ArrayList(); synchronized (trace) { Iterator it = trace.iterator(); while (it.hasNext()) { AbandonedTrace pc = (AbandonedTrace) it.next(); if (pc.getLastUsed() > timeout) { continue; } if (pc.getLastUsed() > 0) { remove.add(pc); } } } // Now remove the abandoned connections Iterator it = remove.iterator(); while (it.hasNext()) { AbandonedTrace pc = (AbandonedTrace) it.next(); if (config.getLogAbandoned()) { pc.printStackTrace(); } try { invalidateObject(pc); } catch (Exception e) { e.printStackTrace(); } } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DelegatingPreparedStatement.java0000644000175000017500000004107511333570550032572 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.PreparedStatement; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Calendar; /* JDBC_4_ANT_KEY_BEGIN */ import java.io.InputStream; import java.io.Reader; import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; /* JDBC_4_ANT_KEY_END */ /** * A base delegating implementation of {@link PreparedStatement}. *

* All of the methods from the {@link PreparedStatement} interface * simply check to see that the {@link PreparedStatement} is active, * and call the corresponding method on the "delegate" * provided in my constructor. *

* Extends AbandonedTrace to implement Statement tracking and * logging of code which created the Statement. Tracking the * Statement ensures that the Connection which created it can * close any open Statement's on Connection close. * * @author Rodney Waldhoff * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 883941 $ $Date: 2009-11-24 19:58:50 -0500 (Tue, 24 Nov 2009) $ */ public class DelegatingPreparedStatement extends DelegatingStatement implements PreparedStatement { /** * Create a wrapper for the Statement which traces this * Statement to the Connection which created it and the * code which created it. * * @param s the {@link PreparedStatement} to delegate all calls to. * @param c the {@link DelegatingConnection} that created this statement. */ public DelegatingPreparedStatement(DelegatingConnection c, PreparedStatement s) { super(c, s); } public boolean equals(Object obj) { PreparedStatement delegate = (PreparedStatement) getInnermostDelegate(); if (delegate == null) { return false; } if (obj instanceof DelegatingPreparedStatement) { DelegatingPreparedStatement s = (DelegatingPreparedStatement) obj; return delegate.equals(s.getInnermostDelegate()); } else { return delegate.equals(obj); } } /** Sets my delegate. */ public void setDelegate(PreparedStatement s) { super.setDelegate(s); _stmt = s; } public ResultSet executeQuery() throws SQLException { checkOpen(); try { return DelegatingResultSet.wrapResultSet(this,((PreparedStatement)_stmt).executeQuery()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public int executeUpdate() throws SQLException { checkOpen(); try { return ((PreparedStatement)_stmt).executeUpdate(); } catch (SQLException e) { handleException(e); return 0; } } public void setNull(int parameterIndex, int sqlType) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNull(parameterIndex,sqlType); } catch (SQLException e) { handleException(e); } } public void setBoolean(int parameterIndex, boolean x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBoolean(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setByte(int parameterIndex, byte x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setByte(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setShort(int parameterIndex, short x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setShort(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setInt(int parameterIndex, int x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setInt(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setLong(int parameterIndex, long x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setLong(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setFloat(int parameterIndex, float x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setFloat(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setDouble(int parameterIndex, double x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setDouble(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBigDecimal(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setString(int parameterIndex, String x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setString(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setBytes(int parameterIndex, byte[] x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBytes(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setDate(int parameterIndex, java.sql.Date x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setDate(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setTime(int parameterIndex, java.sql.Time x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setTime(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setTimestamp(int parameterIndex, java.sql.Timestamp x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setTimestamp(parameterIndex,x); } catch (SQLException e) { handleException(e); } } public void setAsciiStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setAsciiStream(parameterIndex,x,length); } catch (SQLException e) { handleException(e); } } /** @deprecated */ public void setUnicodeStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setUnicodeStream(parameterIndex,x,length); } catch (SQLException e) { handleException(e); } } public void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBinaryStream(parameterIndex,x,length); } catch (SQLException e) { handleException(e); } } public void clearParameters() throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).clearParameters(); } catch (SQLException e) { handleException(e); } } public void setObject(int parameterIndex, Object x, int targetSqlType, int scale) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setObject(parameterIndex, x, targetSqlType, scale); } catch (SQLException e) { handleException(e); } } public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setObject(parameterIndex, x, targetSqlType); } catch (SQLException e) { handleException(e); } } public void setObject(int parameterIndex, Object x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setObject(parameterIndex, x); } catch (SQLException e) { handleException(e); } } public boolean execute() throws SQLException { checkOpen(); try { return ((PreparedStatement)_stmt).execute(); } catch (SQLException e) { handleException(e); return false; } } public void addBatch() throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).addBatch(); } catch (SQLException e) { handleException(e); } } public void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setCharacterStream(parameterIndex,reader,length); } catch (SQLException e) { handleException(e); } } public void setRef(int i, Ref x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setRef(i,x); } catch (SQLException e) { handleException(e); } } public void setBlob(int i, Blob x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBlob(i,x); } catch (SQLException e) { handleException(e); } } public void setClob(int i, Clob x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setClob(i,x); } catch (SQLException e) { handleException(e); } } public void setArray(int i, Array x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setArray(i,x); } catch (SQLException e) { handleException(e); } } public ResultSetMetaData getMetaData() throws SQLException { checkOpen(); try { return ((PreparedStatement)_stmt).getMetaData(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public void setDate(int parameterIndex, java.sql.Date x, Calendar cal) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setDate(parameterIndex,x,cal); } catch (SQLException e) { handleException(e); } } public void setTime(int parameterIndex, java.sql.Time x, Calendar cal) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setTime(parameterIndex,x,cal); } catch (SQLException e) { handleException(e); } } public void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setTimestamp(parameterIndex,x,cal); } catch (SQLException e) { handleException(e); } } public void setNull(int paramIndex, int sqlType, String typeName) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNull(paramIndex,sqlType,typeName); } catch (SQLException e) { handleException(e); } } /** * Returns a String representation of this object. * * @return String * @since 1.2.2 */ public String toString() { return _stmt.toString(); } public void setURL(int parameterIndex, java.net.URL x) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setURL(parameterIndex, x); } catch (SQLException e) { handleException(e); } } public java.sql.ParameterMetaData getParameterMetaData() throws SQLException { checkOpen(); try { return ((PreparedStatement)_stmt).getParameterMetaData(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } /* JDBC_4_ANT_KEY_BEGIN */ public void setRowId(int parameterIndex, RowId value) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setRowId(parameterIndex, value); } catch (SQLException e) { handleException(e); } } public void setNString(int parameterIndex, String value) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNString(parameterIndex, value); } catch (SQLException e) { handleException(e); } } public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNCharacterStream(parameterIndex, value, length); } catch (SQLException e) { handleException(e); } } public void setNClob(int parameterIndex, NClob value) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNClob(parameterIndex, value); } catch (SQLException e) { handleException(e); } } public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setClob(parameterIndex, reader, length); } catch (SQLException e) { handleException(e); } } public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBlob(parameterIndex, inputStream, length); } catch (SQLException e) { handleException(e); } } public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNClob(parameterIndex, reader, length); } catch (SQLException e) { handleException(e); } } public void setSQLXML(int parameterIndex, SQLXML value) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setSQLXML(parameterIndex, value); } catch (SQLException e) { handleException(e); } } public void setAsciiStream(int parameterIndex, InputStream inputStream, long length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setAsciiStream(parameterIndex, inputStream, length); } catch (SQLException e) { handleException(e); } } public void setBinaryStream(int parameterIndex, InputStream inputStream, long length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBinaryStream(parameterIndex, inputStream, length); } catch (SQLException e) { handleException(e); } } public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setCharacterStream(parameterIndex, reader, length); } catch (SQLException e) { handleException(e); } } public void setAsciiStream(int parameterIndex, InputStream inputStream) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setAsciiStream(parameterIndex, inputStream); } catch (SQLException e) { handleException(e); } } public void setBinaryStream(int parameterIndex, InputStream inputStream) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBinaryStream(parameterIndex, inputStream); } catch (SQLException e) { handleException(e); } } public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setCharacterStream(parameterIndex, reader); } catch (SQLException e) { handleException(e); } } public void setNCharacterStream(int parameterIndex, Reader reader) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNCharacterStream(parameterIndex, reader); } catch (SQLException e) { handleException(e); } } public void setClob(int parameterIndex, Reader reader) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setClob(parameterIndex, reader); } catch (SQLException e) { handleException(e); } } public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setBlob(parameterIndex, inputStream); } catch (SQLException e) { handleException(e); } } public void setNClob(int parameterIndex, Reader reader) throws SQLException { checkOpen(); try { ((PreparedStatement)_stmt).setNClob(parameterIndex, reader); } catch (SQLException e) { handleException(e); } } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DriverConnectionFactory.java0000644000175000017500000000343711333570550031762 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; import java.util.Properties; /** * A {@link Driver}-based implementation of {@link ConnectionFactory}. * * @author Rodney Waldhoff * @version $Revision: 479137 $ $Date: 2006-11-25 10:51:48 -0500 (Sat, 25 Nov 2006) $ */ public class DriverConnectionFactory implements ConnectionFactory { public DriverConnectionFactory(Driver driver, String connectUri, Properties props) { _driver = driver; _connectUri = connectUri; _props = props; } public Connection createConnection() throws SQLException { return _driver.connect(_connectUri,_props); } protected Driver _driver = null; protected String _connectUri = null; protected Properties _props = null; public String toString() { return this.getClass().getName() + " [" + String.valueOf(_driver) + ";" + String.valueOf(_connectUri) + ";" + String.valueOf(_props) + "]"; } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/ConnectionFactory.java0000644000175000017500000000265211333570550030604 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.SQLException; /** * Abstract factory interface for creating {@link java.sql.Connection}s. * * @author Rodney Waldhoff * @version $Revision: 491655 $ $Date: 2007-01-01 17:05:30 -0500 (Mon, 01 Jan 2007) $ */ public interface ConnectionFactory { /** * Create a new {@link java.sql.Connection} in an * implementation specific fashion. * * @return a new {@link java.sql.Connection} * @throws SQLException if a database error occurs creating the connection */ public abstract Connection createConnection() throws SQLException; } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DbcpException.java0000644000175000017500000000604411333570550027703 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; /** *

Subclass of RuntimeException that can be used to wrap * a SQLException using the "root cause" pattern of JDK 1.4 * exceptions, but without requiring a 1.4 runtime environment.

* * @author Jonathan Fuerth * @author Dan Fraser * @version $Revision: 883425 $ $Date: 2009-11-23 12:19:43 -0500 (Mon, 23 Nov 2009) $ * * @deprecated This will be removed in a future version of DBCP. **/ public class DbcpException extends RuntimeException { private static final long serialVersionUID = 2477800549022838103L; // ----------------------------------------------------------- Constructors /** * Construct a new runtime exception with null as its * detail message. */ public DbcpException() { super(); } /** * Construct a new runtime exception with the specified detail message. * * @param message The detail message for this exception */ public DbcpException(String message) { this(message, null); } /** * Construct a new runtime exception with the specified detail message * and cause. * * @param message The detail message for this exception * @param cause The root cause for this exception */ public DbcpException(String message, Throwable cause) { super(message); this.cause = cause; } /** * Construct a new runtime exception with the specified cause and a * detail message of (cause == null ? null : cause.toString()). * * @param cause The root cause for this exception */ public DbcpException(Throwable cause) { super((cause == null) ? (String) null : cause.toString()); this.cause = cause; } // ----------------------------------------------------- Instance Variables /** * The root cause of this exception (typically an * SQLException but this is not required). */ protected Throwable cause = null; // --------------------------------------------------------- Public Methods /** * Return the root cause of this exception (if any). */ public Throwable getCause() { return (this.cause); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/SQLNestedException.java0000644000175000017500000000330711333570550030634 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.SQLException; /** * A SQLException subclass containing another Throwable * * @author Dirk Verbeeck * @version $Revision: 894583 $ $Date: 2009-12-30 05:48:07 -0500 (Wed, 30 Dec 2009) $ * @deprecated Use '(SQLException) new SQLException(msg).initCause(e)' instead; this class will be removed in DBCP 2.0 */ public class SQLNestedException extends SQLException { private static final long serialVersionUID = 1046151479543081202L; /** * Constructs a new SQLNestedException with specified * detail message and nested Throwable. * * @param msg the error message * @param cause the exception or error that caused this exception to be * thrown */ public SQLNestedException(String msg, Throwable cause) { super(msg); if (cause != null){ initCause(cause); } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/PoolingDataSource.java0000644000175000017500000003470711333570550030545 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.PrintWriter; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.Map; import java.util.NoSuchElementException; import javax.sql.DataSource; import org.apache.commons.pool.ObjectPool; /** * A simple {@link DataSource} implementation that obtains * {@link Connection}s from the specified {@link ObjectPool}. * * @author Rodney Waldhoff * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 895844 $ $Date: 2010-01-04 20:50:04 -0500 (Mon, 04 Jan 2010) $ */ public class PoolingDataSource implements DataSource { /** Controls access to the underlying connection */ private boolean accessToUnderlyingConnectionAllowed = false; public PoolingDataSource() { this(null); } public PoolingDataSource(ObjectPool pool) { _pool = pool; } public void setPool(ObjectPool pool) throws IllegalStateException, NullPointerException { if(null != _pool) { throw new IllegalStateException("Pool already set"); } else if(null == pool) { throw new NullPointerException("Pool must not be null."); } else { _pool = pool; } } /** * Returns the value of the accessToUnderlyingConnectionAllowed property. * * @return true if access to the underlying is allowed, false otherwise. */ public boolean isAccessToUnderlyingConnectionAllowed() { return this.accessToUnderlyingConnectionAllowed; } /** * Sets the value of the accessToUnderlyingConnectionAllowed property. * It controls if the PoolGuard allows access to the underlying connection. * (Default: false) * * @param allow Access to the underlying connection is granted when true. */ public void setAccessToUnderlyingConnectionAllowed(boolean allow) { this.accessToUnderlyingConnectionAllowed = allow; } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return false; } public T unwrap(Class iface) throws SQLException { throw new SQLException("PoolingDataSource is not a wrapper."); } /* JDBC_4_ANT_KEY_END */ //--- DataSource methods ----------------------------------------- /** * Return a {@link java.sql.Connection} from my pool, * according to the contract specified by {@link ObjectPool#borrowObject}. */ public Connection getConnection() throws SQLException { try { Connection conn = (Connection)(_pool.borrowObject()); if (conn != null) { conn = new PoolGuardConnectionWrapper(conn); } return conn; } catch(SQLException e) { throw e; } catch(NoSuchElementException e) { throw new SQLNestedException("Cannot get a connection, pool error " + e.getMessage(), e); } catch(RuntimeException e) { throw e; } catch(Exception e) { throw new SQLNestedException("Cannot get a connection, general error", e); } } /** * Throws {@link UnsupportedOperationException} * @throws UnsupportedOperationException */ public Connection getConnection(String uname, String passwd) throws SQLException { throw new UnsupportedOperationException(); } /** * Returns my log writer. * @return my log writer * @see DataSource#getLogWriter */ public PrintWriter getLogWriter() { return _logWriter; } /** * Throws {@link UnsupportedOperationException}. * @throws UnsupportedOperationException As this * implementation does not support this feature. */ public int getLoginTimeout() { throw new UnsupportedOperationException("Login timeout is not supported."); } /** * Throws {@link UnsupportedOperationException}. * @throws UnsupportedOperationException As this * implementation does not support this feature. */ public void setLoginTimeout(int seconds) { throw new UnsupportedOperationException("Login timeout is not supported."); } /** * Sets my log writer. * @see DataSource#setLogWriter */ public void setLogWriter(PrintWriter out) { _logWriter = out; } /** My log writer. */ protected PrintWriter _logWriter = null; protected ObjectPool _pool = null; /** * PoolGuardConnectionWrapper is a Connection wrapper that makes sure a * closed connection cannot be used anymore. */ private class PoolGuardConnectionWrapper extends DelegatingConnection { private Connection delegate; PoolGuardConnectionWrapper(Connection delegate) { super(delegate); this.delegate = delegate; } protected void checkOpen() throws SQLException { if(delegate == null) { throw new SQLException("Connection is closed."); } } public void close() throws SQLException { if (delegate != null) { this.delegate.close(); this.delegate = null; super.setDelegate(null); } } public boolean isClosed() throws SQLException { if (delegate == null) { return true; } return delegate.isClosed(); } public void clearWarnings() throws SQLException { checkOpen(); delegate.clearWarnings(); } public void commit() throws SQLException { checkOpen(); delegate.commit(); } public Statement createStatement() throws SQLException { checkOpen(); return new DelegatingStatement(this, delegate.createStatement()); } public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new DelegatingStatement(this, delegate.createStatement(resultSetType, resultSetConcurrency)); } public boolean innermostDelegateEquals(Connection c) { Connection innerCon = super.getInnermostDelegate(); if (innerCon == null) { return c == null; } else { return innerCon.equals(c); } } public boolean getAutoCommit() throws SQLException { checkOpen(); return delegate.getAutoCommit(); } public String getCatalog() throws SQLException { checkOpen(); return delegate.getCatalog(); } public DatabaseMetaData getMetaData() throws SQLException { checkOpen(); return delegate.getMetaData(); } public int getTransactionIsolation() throws SQLException { checkOpen(); return delegate.getTransactionIsolation(); } public Map getTypeMap() throws SQLException { checkOpen(); return delegate.getTypeMap(); } public SQLWarning getWarnings() throws SQLException { checkOpen(); return delegate.getWarnings(); } public int hashCode() { if (delegate == null){ return 0; } return delegate.hashCode(); } public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } // Use superclass accessor to skip access test Connection conn = super.getInnermostDelegate(); if (conn == null) { return false; } if (obj instanceof DelegatingConnection) { DelegatingConnection c = (DelegatingConnection) obj; return c.innermostDelegateEquals(conn); } else { return conn.equals(obj); } } public boolean isReadOnly() throws SQLException { checkOpen(); return delegate.isReadOnly(); } public String nativeSQL(String sql) throws SQLException { checkOpen(); return delegate.nativeSQL(sql); } public CallableStatement prepareCall(String sql) throws SQLException { checkOpen(); return new DelegatingCallableStatement(this, delegate.prepareCall(sql)); } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new DelegatingCallableStatement(this, delegate.prepareCall(sql, resultSetType, resultSetConcurrency)); } public PreparedStatement prepareStatement(String sql) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql)); } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, resultSetType, resultSetConcurrency)); } public void rollback() throws SQLException { checkOpen(); delegate.rollback(); } public void setAutoCommit(boolean autoCommit) throws SQLException { checkOpen(); delegate.setAutoCommit(autoCommit); } public void setCatalog(String catalog) throws SQLException { checkOpen(); delegate.setCatalog(catalog); } public void setReadOnly(boolean readOnly) throws SQLException { checkOpen(); delegate.setReadOnly(readOnly); } public void setTransactionIsolation(int level) throws SQLException { checkOpen(); delegate.setTransactionIsolation(level); } public void setTypeMap(Map map) throws SQLException { checkOpen(); delegate.setTypeMap(map); } public String toString() { if (delegate == null){ return "NULL"; } return delegate.toString(); } public int getHoldability() throws SQLException { checkOpen(); return delegate.getHoldability(); } public void setHoldability(int holdability) throws SQLException { checkOpen(); delegate.setHoldability(holdability); } public java.sql.Savepoint setSavepoint() throws SQLException { checkOpen(); return delegate.setSavepoint(); } public java.sql.Savepoint setSavepoint(String name) throws SQLException { checkOpen(); return delegate.setSavepoint(name); } public void releaseSavepoint(java.sql.Savepoint savepoint) throws SQLException { checkOpen(); delegate.releaseSavepoint(savepoint); } public void rollback(java.sql.Savepoint savepoint) throws SQLException { checkOpen(); delegate.rollback(savepoint); } public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); return new DelegatingStatement(this, delegate.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability)); } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); return new DelegatingCallableStatement(this, delegate.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, autoGeneratedKeys)); } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this,delegate.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, columnIndexes)); } public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { checkOpen(); return new DelegatingPreparedStatement(this, delegate.prepareStatement(sql, columnNames)); } /** * @see org.apache.commons.dbcp.DelegatingConnection#getDelegate() */ public Connection getDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return super.getDelegate(); } else { return null; } } /** * @see org.apache.commons.dbcp.DelegatingConnection#getInnermostDelegate() */ public Connection getInnermostDelegate() { if (isAccessToUnderlyingConnectionAllowed()) { return super.getInnermostDelegate(); } else { return null; } } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/PoolableConnection.java0000644000175000017500000001066611333570550030736 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.pool.ObjectPool; /** * A delegating connection that, rather than closing the underlying * connection, returns itself to an {@link ObjectPool} when * closed. * * @author Rodney Waldhoff * @author Glenn L. Nielsen * @author James House * @version $Revision: 758745 $ $Date: 2009-03-26 13:02:20 -0400 (Thu, 26 Mar 2009) $ */ public class PoolableConnection extends DelegatingConnection { /** The pool to which I should return. */ // TODO: Correct use of the pool requires that this connection is only every returned to the pool once. protected ObjectPool _pool = null; /** * * @param conn my underlying connection * @param pool the pool to which I should return when closed */ public PoolableConnection(Connection conn, ObjectPool pool) { super(conn); _pool = pool; } /** * * @param conn my underlying connection * @param pool the pool to which I should return when closed * @param config the abandoned configuration settings */ public PoolableConnection(Connection conn, ObjectPool pool, AbandonedConfig config) { super(conn, config); _pool = pool; } /** * Returns me to my pool. */ public synchronized void close() throws SQLException { if (_closed) { // already closed return; } boolean isUnderlyingConectionClosed; try { isUnderlyingConectionClosed = _conn.isClosed(); } catch (SQLException e) { try { _pool.invalidateObject(this); // XXX should be guarded to happen at most once } catch(IllegalStateException ise) { // pool is closed, so close the connection passivate(); getInnermostDelegate().close(); } catch (Exception ie) { // DO NOTHING the original exception will be rethrown } throw (SQLException) new SQLException("Cannot close connection (isClosed check failed)").initCause(e); } if (!isUnderlyingConectionClosed) { // Normal close: underlying connection is still open, so we // simply need to return this proxy to the pool try { _pool.returnObject(this); // XXX should be guarded to happen at most once } catch(IllegalStateException e) { // pool is closed, so close the connection passivate(); getInnermostDelegate().close(); } catch(SQLException e) { throw e; } catch(RuntimeException e) { throw e; } catch(Exception e) { throw (SQLException) new SQLException("Cannot close connection (return to pool failed)").initCause(e); } } else { // Abnormal close: underlying connection closed unexpectedly, so we // must destroy this proxy try { _pool.invalidateObject(this); // XXX should be guarded to happen at most once } catch(IllegalStateException e) { // pool is closed, so close the connection passivate(); getInnermostDelegate().close(); } catch (Exception ie) { // DO NOTHING, "Already closed" exception thrown below } throw new SQLException("Already closed."); } } /** * Actually close my underlying {@link Connection}. */ public void reallyClose() throws SQLException { super.close(); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/PoolablePreparedStatement.java0000644000175000017500000001051311333570550032255 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.apache.commons.pool.KeyedObjectPool; /** * A {@link DelegatingPreparedStatement} that cooperates with * {@link PoolingConnection} to implement a pool of {@link PreparedStatement}s. *

* My {@link #close} method returns me to my containing pool. (See {@link PoolingConnection}.) * * @see PoolingConnection * @author Rodney Waldhoff * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 745860 $ $Date: 2009-02-19 08:45:07 -0500 (Thu, 19 Feb 2009) $ */ public class PoolablePreparedStatement extends DelegatingPreparedStatement implements PreparedStatement { /** * The {@link KeyedObjectPool} from which I was obtained. */ protected KeyedObjectPool _pool = null; /** * My "key" as used by {@link KeyedObjectPool}. */ protected Object _key = null; private volatile boolean batchAdded = false; /** * Constructor * @param stmt my underlying {@link PreparedStatement} * @param key my key" as used by {@link KeyedObjectPool} * @param pool the {@link KeyedObjectPool} from which I was obtained. * @param conn the {@link Connection} from which I was created */ public PoolablePreparedStatement(PreparedStatement stmt, Object key, KeyedObjectPool pool, Connection conn) { super((DelegatingConnection) conn, stmt); _pool = pool; _key = key; // Remove from trace now because this statement will be // added by the activate method. if(_conn != null) { _conn.removeTrace(this); } } /** * Add batch. */ public void addBatch() throws SQLException { super.addBatch(); batchAdded = true; } /** * Clear Batch. */ public void clearBatch() throws SQLException { batchAdded = false; super.clearBatch(); } /** * Return me to my pool. */ public void close() throws SQLException { // calling close twice should have no effect if (!isClosed()) { try { _pool.returnObject(_key,this); } catch(SQLException e) { throw e; } catch(RuntimeException e) { throw e; } catch(Exception e) { throw new SQLNestedException("Cannot close preparedstatement (return to pool failed)", e); } } } protected void activate() throws SQLException{ _closed = false; if(_conn != null) { _conn.addTrace(this); } super.activate(); } protected void passivate() throws SQLException { _closed = true; if(_conn != null) { _conn.removeTrace(this); } // The JDBC spec requires that a statment close any open // ResultSet's when it is closed. // FIXME The PreparedStatement we're wrapping should handle this for us. // See bug 17301 for what could happen when ResultSets are closed twice. List resultSets = getTrace(); if( resultSets != null) { ResultSet[] set = (ResultSet[]) resultSets.toArray(new ResultSet[resultSets.size()]); for (int i = 0; i < set.length; i++) { set[i].close(); } clearTrace(); } if (batchAdded) { clearBatch(); } super.passivate(); } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DelegatingDatabaseMetaData.java0000644000175000017500000013164611333570550032254 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; /* JDBC_4_ANT_KEY_BEGIN */ import java.sql.RowIdLifetime; /* JDBC_4_ANT_KEY_END */ import java.sql.SQLException; /** * A base delegating implementation of {@link DatabaseMetaData}. *

* Those methods that create {@link ResultSet} objects, are wrapped to * create {@link DelegatingResultSet} objects and the remaining methods * simply call the corresponding method on the "delegate" * provided in my constructor. *

* Extends AbandonedTrace to implement DatabaseMetaData tracking and * logging of code which created the DatabaseMetaData. Tracking * the DatabaseMetaData ensures that the Connection which created it can * close any associated ResultSets on Connection close. */ public class DelegatingDatabaseMetaData extends AbandonedTrace implements DatabaseMetaData { /** My delegate {@link DatabaseMetaData} */ protected DatabaseMetaData _meta; /** The connection that created me. **/ protected DelegatingConnection _conn = null; public DelegatingDatabaseMetaData(DelegatingConnection c, DatabaseMetaData m) { super(c); _conn = c; _meta = m; } public DatabaseMetaData getDelegate() { return _meta; } public boolean equals(Object obj) { DatabaseMetaData delegate = getInnermostDelegate(); if (delegate == null) { return false; } if (obj instanceof DelegatingDatabaseMetaData) { DelegatingDatabaseMetaData s = (DelegatingDatabaseMetaData) obj; return delegate.equals(s.getInnermostDelegate()); } else { return delegate.equals(obj); } } public int hashCode() { Object obj = getInnermostDelegate(); if (obj == null) { return 0; } return obj.hashCode(); } /** * If my underlying {@link ResultSet} is not a * DelegatingResultSet, returns it, * otherwise recursively invokes this method on * my delegate. *

* Hence this method will return the first * delegate that is not a DelegatingResultSet, * or null when no non-DelegatingResultSet * delegate can be found by transversing this chain. *

* This method is useful when you may have nested * DelegatingResultSets, and you want to make * sure to obtain a "genuine" {@link ResultSet}. */ public DatabaseMetaData getInnermostDelegate() { DatabaseMetaData m = _meta; while(m != null && m instanceof DelegatingDatabaseMetaData) { m = ((DelegatingDatabaseMetaData)m).getDelegate(); if(this == m) { return null; } } return m; } protected void handleException(SQLException e) throws SQLException { if (_conn != null) { _conn.handleException(e); } else { throw e; } } public boolean allProceduresAreCallable() throws SQLException { { try { return _meta.allProceduresAreCallable(); } catch (SQLException e) { handleException(e); return false; } } } public boolean allTablesAreSelectable() throws SQLException { { try { return _meta.allTablesAreSelectable(); } catch (SQLException e) { handleException(e); return false; } } } public boolean dataDefinitionCausesTransactionCommit() throws SQLException { { try { return _meta.dataDefinitionCausesTransactionCommit(); } catch (SQLException e) { handleException(e); return false; } } } public boolean dataDefinitionIgnoredInTransactions() throws SQLException { { try { return _meta.dataDefinitionIgnoredInTransactions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean deletesAreDetected(int type) throws SQLException { { try { return _meta.deletesAreDetected(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean doesMaxRowSizeIncludeBlobs() throws SQLException { { try { return _meta.doesMaxRowSizeIncludeBlobs(); } catch (SQLException e) { handleException(e); return false; } } } public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn,_meta.getAttributes( catalog, schemaPattern, typeNamePattern, attributeNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getBestRowIdentifier(catalog, schema, table, scope, nullable)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public String getCatalogSeparator() throws SQLException { { try { return _meta.getCatalogSeparator(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public String getCatalogTerm() throws SQLException { { try { return _meta.getCatalogTerm(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getCatalogs() throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getCatalogs()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getColumnPrivileges(catalog, schema, table, columnNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getColumns(catalog, schemaPattern, tableNamePattern, columnNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public Connection getConnection() throws SQLException { return _conn; } public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getCrossReference(parentCatalog, parentSchema, parentTable, foreignCatalog, foreignSchema, foreignTable)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public int getDatabaseMajorVersion() throws SQLException { { try { return _meta.getDatabaseMajorVersion(); } catch (SQLException e) { handleException(e); return 0; } } } public int getDatabaseMinorVersion() throws SQLException { { try { return _meta.getDatabaseMinorVersion(); } catch (SQLException e) { handleException(e); return 0; } } } public String getDatabaseProductName() throws SQLException { { try { return _meta.getDatabaseProductName(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public String getDatabaseProductVersion() throws SQLException { { try { return _meta.getDatabaseProductVersion(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public int getDefaultTransactionIsolation() throws SQLException { { try { return _meta.getDefaultTransactionIsolation(); } catch (SQLException e) { handleException(e); return 0; } } } public int getDriverMajorVersion() {return _meta.getDriverMajorVersion();} public int getDriverMinorVersion() {return _meta.getDriverMinorVersion();} public String getDriverName() throws SQLException { { try { return _meta.getDriverName(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public String getDriverVersion() throws SQLException { { try { return _meta.getDriverVersion(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getExportedKeys(catalog, schema, table)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public String getExtraNameCharacters() throws SQLException { { try { return _meta.getExtraNameCharacters(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public String getIdentifierQuoteString() throws SQLException { { try { return _meta.getIdentifierQuoteString(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getImportedKeys(catalog, schema, table)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getIndexInfo(catalog, schema, table, unique, approximate)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public int getJDBCMajorVersion() throws SQLException { { try { return _meta.getJDBCMajorVersion(); } catch (SQLException e) { handleException(e); return 0; } } } public int getJDBCMinorVersion() throws SQLException { { try { return _meta.getJDBCMinorVersion(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxBinaryLiteralLength() throws SQLException { { try { return _meta.getMaxBinaryLiteralLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxCatalogNameLength() throws SQLException { { try { return _meta.getMaxCatalogNameLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxCharLiteralLength() throws SQLException { { try { return _meta.getMaxCharLiteralLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxColumnNameLength() throws SQLException { { try { return _meta.getMaxColumnNameLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxColumnsInGroupBy() throws SQLException { { try { return _meta.getMaxColumnsInGroupBy(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxColumnsInIndex() throws SQLException { { try { return _meta.getMaxColumnsInIndex(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxColumnsInOrderBy() throws SQLException { { try { return _meta.getMaxColumnsInOrderBy(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxColumnsInSelect() throws SQLException { { try { return _meta.getMaxColumnsInSelect(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxColumnsInTable() throws SQLException { { try { return _meta.getMaxColumnsInTable(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxConnections() throws SQLException { { try { return _meta.getMaxConnections(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxCursorNameLength() throws SQLException { { try { return _meta.getMaxCursorNameLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxIndexLength() throws SQLException { { try { return _meta.getMaxIndexLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxProcedureNameLength() throws SQLException { { try { return _meta.getMaxProcedureNameLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxRowSize() throws SQLException { { try { return _meta.getMaxRowSize(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxSchemaNameLength() throws SQLException { { try { return _meta.getMaxSchemaNameLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxStatementLength() throws SQLException { { try { return _meta.getMaxStatementLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxStatements() throws SQLException { { try { return _meta.getMaxStatements(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxTableNameLength() throws SQLException { { try { return _meta.getMaxTableNameLength(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxTablesInSelect() throws SQLException { { try { return _meta.getMaxTablesInSelect(); } catch (SQLException e) { handleException(e); return 0; } } } public int getMaxUserNameLength() throws SQLException { { try { return _meta.getMaxUserNameLength(); } catch (SQLException e) { handleException(e); return 0; } } } public String getNumericFunctions() throws SQLException { { try { return _meta.getNumericFunctions(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getPrimaryKeys(catalog, schema, table)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getProcedureColumns(catalog, schemaPattern, procedureNamePattern, columnNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public String getProcedureTerm() throws SQLException { { try { return _meta.getProcedureTerm(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getProcedures(catalog, schemaPattern, procedureNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public int getResultSetHoldability() throws SQLException { { try { return _meta.getResultSetHoldability(); } catch (SQLException e) { handleException(e); return 0; } } } public String getSQLKeywords() throws SQLException { { try { return _meta.getSQLKeywords(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public int getSQLStateType() throws SQLException { { try { return _meta.getSQLStateType(); } catch (SQLException e) { handleException(e); return 0; } } } public String getSchemaTerm() throws SQLException { { try { return _meta.getSchemaTerm(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getSchemas() throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getSchemas()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public String getSearchStringEscape() throws SQLException { { try { return _meta.getSearchStringEscape(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public String getStringFunctions() throws SQLException { { try { return _meta.getStringFunctions(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getSuperTables(catalog, schemaPattern, tableNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getSuperTypes(catalog, schemaPattern, typeNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public String getSystemFunctions() throws SQLException { { try { return _meta.getSystemFunctions(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getTablePrivileges(catalog, schemaPattern, tableNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getTableTypes() throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getTableTypes()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getTables(catalog, schemaPattern, tableNamePattern, types)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public String getTimeDateFunctions() throws SQLException { { try { return _meta.getTimeDateFunctions(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getTypeInfo() throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getTypeInfo()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getUDTs(catalog, schemaPattern, typeNamePattern, types)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public String getURL() throws SQLException { { try { return _meta.getURL(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public String getUserName() throws SQLException { { try { return _meta.getUserName(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getVersionColumns(catalog, schema, table)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public boolean insertsAreDetected(int type) throws SQLException { { try { return _meta.insertsAreDetected(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean isCatalogAtStart() throws SQLException { { try { return _meta.isCatalogAtStart(); } catch (SQLException e) { handleException(e); return false; } } } public boolean isReadOnly() throws SQLException { { try { return _meta.isReadOnly(); } catch (SQLException e) { handleException(e); return false; } } } public boolean locatorsUpdateCopy() throws SQLException { { try { return _meta.locatorsUpdateCopy(); } catch (SQLException e) { handleException(e); return false; } } } public boolean nullPlusNonNullIsNull() throws SQLException { { try { return _meta.nullPlusNonNullIsNull(); } catch (SQLException e) { handleException(e); return false; } } } public boolean nullsAreSortedAtEnd() throws SQLException { { try { return _meta.nullsAreSortedAtEnd(); } catch (SQLException e) { handleException(e); return false; } } } public boolean nullsAreSortedAtStart() throws SQLException { { try { return _meta.nullsAreSortedAtStart(); } catch (SQLException e) { handleException(e); return false; } } } public boolean nullsAreSortedHigh() throws SQLException { { try { return _meta.nullsAreSortedHigh(); } catch (SQLException e) { handleException(e); return false; } } } public boolean nullsAreSortedLow() throws SQLException { { try { return _meta.nullsAreSortedLow(); } catch (SQLException e) { handleException(e); return false; } } } public boolean othersDeletesAreVisible(int type) throws SQLException { { try { return _meta.othersDeletesAreVisible(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean othersInsertsAreVisible(int type) throws SQLException { { try { return _meta.othersInsertsAreVisible(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean othersUpdatesAreVisible(int type) throws SQLException { { try { return _meta.othersUpdatesAreVisible(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean ownDeletesAreVisible(int type) throws SQLException { { try { return _meta.ownDeletesAreVisible(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean ownInsertsAreVisible(int type) throws SQLException { { try { return _meta.ownInsertsAreVisible(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean ownUpdatesAreVisible(int type) throws SQLException { { try { return _meta.ownUpdatesAreVisible(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean storesLowerCaseIdentifiers() throws SQLException { { try { return _meta.storesLowerCaseIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean storesLowerCaseQuotedIdentifiers() throws SQLException { { try { return _meta.storesLowerCaseQuotedIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean storesMixedCaseIdentifiers() throws SQLException { { try { return _meta.storesMixedCaseIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { { try { return _meta.storesMixedCaseQuotedIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean storesUpperCaseIdentifiers() throws SQLException { { try { return _meta.storesUpperCaseIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean storesUpperCaseQuotedIdentifiers() throws SQLException { { try { return _meta.storesUpperCaseQuotedIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsANSI92EntryLevelSQL() throws SQLException { { try { return _meta.supportsANSI92EntryLevelSQL(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsANSI92FullSQL() throws SQLException { { try { return _meta.supportsANSI92FullSQL(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsANSI92IntermediateSQL() throws SQLException { { try { return _meta.supportsANSI92IntermediateSQL(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsAlterTableWithAddColumn() throws SQLException { { try { return _meta.supportsAlterTableWithAddColumn(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsAlterTableWithDropColumn() throws SQLException { { try { return _meta.supportsAlterTableWithDropColumn(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsBatchUpdates() throws SQLException { { try { return _meta.supportsBatchUpdates(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsCatalogsInDataManipulation() throws SQLException { { try { return _meta.supportsCatalogsInDataManipulation(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsCatalogsInIndexDefinitions() throws SQLException { { try { return _meta.supportsCatalogsInIndexDefinitions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException { { try { return _meta.supportsCatalogsInPrivilegeDefinitions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsCatalogsInProcedureCalls() throws SQLException { { try { return _meta.supportsCatalogsInProcedureCalls(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsCatalogsInTableDefinitions() throws SQLException { { try { return _meta.supportsCatalogsInTableDefinitions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsColumnAliasing() throws SQLException { { try { return _meta.supportsColumnAliasing(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsConvert() throws SQLException { { try { return _meta.supportsConvert(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsConvert(int fromType, int toType) throws SQLException { { try { return _meta.supportsConvert(fromType, toType); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsCoreSQLGrammar() throws SQLException { { try { return _meta.supportsCoreSQLGrammar(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsCorrelatedSubqueries() throws SQLException { { try { return _meta.supportsCorrelatedSubqueries(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException { { try { return _meta.supportsDataDefinitionAndDataManipulationTransactions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsDataManipulationTransactionsOnly() throws SQLException { { try { return _meta.supportsDataManipulationTransactionsOnly(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsDifferentTableCorrelationNames() throws SQLException { { try { return _meta.supportsDifferentTableCorrelationNames(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsExpressionsInOrderBy() throws SQLException { { try { return _meta.supportsExpressionsInOrderBy(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsExtendedSQLGrammar() throws SQLException { { try { return _meta.supportsExtendedSQLGrammar(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsFullOuterJoins() throws SQLException { { try { return _meta.supportsFullOuterJoins(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsGetGeneratedKeys() throws SQLException { { try { return _meta.supportsGetGeneratedKeys(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsGroupBy() throws SQLException { { try { return _meta.supportsGroupBy(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsGroupByBeyondSelect() throws SQLException { { try { return _meta.supportsGroupByBeyondSelect(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsGroupByUnrelated() throws SQLException { { try { return _meta.supportsGroupByUnrelated(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsIntegrityEnhancementFacility() throws SQLException { { try { return _meta.supportsIntegrityEnhancementFacility(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsLikeEscapeClause() throws SQLException { { try { return _meta.supportsLikeEscapeClause(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsLimitedOuterJoins() throws SQLException { { try { return _meta.supportsLimitedOuterJoins(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsMinimumSQLGrammar() throws SQLException { { try { return _meta.supportsMinimumSQLGrammar(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsMixedCaseIdentifiers() throws SQLException { { try { return _meta.supportsMixedCaseIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException { { try { return _meta.supportsMixedCaseQuotedIdentifiers(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsMultipleOpenResults() throws SQLException { { try { return _meta.supportsMultipleOpenResults(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsMultipleResultSets() throws SQLException { { try { return _meta.supportsMultipleResultSets(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsMultipleTransactions() throws SQLException { { try { return _meta.supportsMultipleTransactions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsNamedParameters() throws SQLException { { try { return _meta.supportsNamedParameters(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsNonNullableColumns() throws SQLException { { try { return _meta.supportsNonNullableColumns(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsOpenCursorsAcrossCommit() throws SQLException { { try { return _meta.supportsOpenCursorsAcrossCommit(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsOpenCursorsAcrossRollback() throws SQLException { { try { return _meta.supportsOpenCursorsAcrossRollback(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsOpenStatementsAcrossCommit() throws SQLException { { try { return _meta.supportsOpenStatementsAcrossCommit(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsOpenStatementsAcrossRollback() throws SQLException { { try { return _meta.supportsOpenStatementsAcrossRollback(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsOrderByUnrelated() throws SQLException { { try { return _meta.supportsOrderByUnrelated(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsOuterJoins() throws SQLException { { try { return _meta.supportsOuterJoins(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsPositionedDelete() throws SQLException { { try { return _meta.supportsPositionedDelete(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsPositionedUpdate() throws SQLException { { try { return _meta.supportsPositionedUpdate(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException { { try { return _meta.supportsResultSetConcurrency(type, concurrency); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsResultSetHoldability(int holdability) throws SQLException { { try { return _meta.supportsResultSetHoldability(holdability); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsResultSetType(int type) throws SQLException { { try { return _meta.supportsResultSetType(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSavepoints() throws SQLException { { try { return _meta.supportsSavepoints(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSchemasInDataManipulation() throws SQLException { { try { return _meta.supportsSchemasInDataManipulation(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSchemasInIndexDefinitions() throws SQLException { { try { return _meta.supportsSchemasInIndexDefinitions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException { { try { return _meta.supportsSchemasInPrivilegeDefinitions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSchemasInProcedureCalls() throws SQLException { { try { return _meta.supportsSchemasInProcedureCalls(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSchemasInTableDefinitions() throws SQLException { { try { return _meta.supportsSchemasInTableDefinitions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSelectForUpdate() throws SQLException { { try { return _meta.supportsSelectForUpdate(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsStatementPooling() throws SQLException { { try { return _meta.supportsStatementPooling(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsStoredProcedures() throws SQLException { { try { return _meta.supportsStoredProcedures(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSubqueriesInComparisons() throws SQLException { { try { return _meta.supportsSubqueriesInComparisons(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSubqueriesInExists() throws SQLException { { try { return _meta.supportsSubqueriesInExists(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSubqueriesInIns() throws SQLException { { try { return _meta.supportsSubqueriesInIns(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsSubqueriesInQuantifieds() throws SQLException { { try { return _meta.supportsSubqueriesInQuantifieds(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsTableCorrelationNames() throws SQLException { { try { return _meta.supportsTableCorrelationNames(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsTransactionIsolationLevel(int level) throws SQLException { { try { return _meta.supportsTransactionIsolationLevel(level); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsTransactions() throws SQLException { { try { return _meta.supportsTransactions(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsUnion() throws SQLException { { try { return _meta.supportsUnion(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsUnionAll() throws SQLException { { try { return _meta.supportsUnionAll(); } catch (SQLException e) { handleException(e); return false; } } } public boolean updatesAreDetected(int type) throws SQLException { { try { return _meta.updatesAreDetected(type); } catch (SQLException e) { handleException(e); return false; } } } public boolean usesLocalFilePerTable() throws SQLException { { try { return _meta.usesLocalFilePerTable(); } catch (SQLException e) { handleException(e); return false; } } } public boolean usesLocalFiles() throws SQLException { { try { return _meta.usesLocalFiles(); } catch (SQLException e) { handleException(e); return false; } } } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return iface.isAssignableFrom(getClass()) || _meta.isWrapperFor(iface); } public T unwrap(Class iface) throws SQLException { if (iface.isAssignableFrom(getClass())) { return iface.cast(this); } else if (iface.isAssignableFrom(_meta.getClass())) { return iface.cast(_meta); } else { return _meta.unwrap(iface); } } public RowIdLifetime getRowIdLifetime() throws SQLException { { try { return _meta.getRowIdLifetime(); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } } public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getSchemas(catalog, schemaPattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public boolean autoCommitFailureClosesAllResultSets() throws SQLException { { try { return _meta.autoCommitFailureClosesAllResultSets(); } catch (SQLException e) { handleException(e); return false; } } } public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException { { try { return _meta.supportsStoredFunctionsUsingCallSyntax(); } catch (SQLException e) { handleException(e); return false; } } } public ResultSet getClientInfoProperties() throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getClientInfoProperties()); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getFunctions(catalog, schemaPattern, functionNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException { _conn.checkOpen(); try { return DelegatingResultSet.wrapResultSet(_conn, _meta.getFunctionColumns(catalog, schemaPattern, functionNamePattern, columnNamePattern)); } catch (SQLException e) { handleException(e); throw new AssertionError(); } } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DelegatingCallableStatement.java0000644000175000017500000007320311333570550032525 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.net.URL; import java.sql.CallableStatement; import java.math.BigDecimal; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; import java.util.Map; import java.sql.Ref; import java.sql.Blob; import java.sql.Clob; import java.sql.Array; import java.util.Calendar; import java.io.InputStream; import java.io.Reader; import java.sql.SQLException; /* JDBC_4_ANT_KEY_BEGIN */ import java.sql.NClob; import java.sql.RowId; import java.sql.SQLXML; /* JDBC_4_ANT_KEY_END */ /** * A base delegating implementation of {@link CallableStatement}. *

* All of the methods from the {@link CallableStatement} interface * simply call the corresponding method on the "delegate" * provided in my constructor. *

* Extends AbandonedTrace to implement Statement tracking and * logging of code which created the Statement. Tracking the * Statement ensures that the Connection which created it can * close any open Statement's on Connection close. * * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 883941 $ $Date: 2009-11-24 19:58:50 -0500 (Tue, 24 Nov 2009) $ */ public class DelegatingCallableStatement extends DelegatingPreparedStatement implements CallableStatement { /** * Create a wrapper for the Statement which traces this * Statement to the Connection which created it and the * code which created it. * * @param c the {@link DelegatingConnection} that created this statement * @param s the {@link CallableStatement} to delegate all calls to */ public DelegatingCallableStatement(DelegatingConnection c, CallableStatement s) { super(c, s); } public boolean equals(Object obj) { CallableStatement delegate = (CallableStatement) getInnermostDelegate(); if (delegate == null) { return false; } if (obj instanceof DelegatingCallableStatement) { DelegatingCallableStatement s = (DelegatingCallableStatement) obj; return delegate.equals(s.getInnermostDelegate()); } else { return delegate.equals(obj); } } /** Sets my delegate. */ public void setDelegate(CallableStatement s) { super.setDelegate(s); _stmt = s; } public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).registerOutParameter( parameterIndex, sqlType); } catch (SQLException e) { handleException(e); } } public void registerOutParameter(int parameterIndex, int sqlType, int scale) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).registerOutParameter( parameterIndex, sqlType, scale); } catch (SQLException e) { handleException(e); } } public boolean wasNull() throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).wasNull(); } catch (SQLException e) { handleException(e); return false; } } public String getString(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getString( parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public boolean getBoolean(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBoolean( parameterIndex); } catch (SQLException e) { handleException(e); return false; } } public byte getByte(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getByte( parameterIndex); } catch (SQLException e) { handleException(e); return 0; } } public short getShort(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getShort( parameterIndex); } catch (SQLException e) { handleException(e); return 0; } } public int getInt(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getInt( parameterIndex); } catch (SQLException e) { handleException(e); return 0; } } public long getLong(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getLong( parameterIndex); } catch (SQLException e) { handleException(e); return 0; } } public float getFloat(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getFloat( parameterIndex); } catch (SQLException e) { handleException(e); return 0; } } public double getDouble(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getDouble( parameterIndex); } catch (SQLException e) { handleException(e); return 0; } } /** @deprecated */ public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBigDecimal( parameterIndex, scale); } catch (SQLException e) { handleException(e); return null; } } public byte[] getBytes(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBytes( parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getDate( parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTime( parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTimestamp( parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public Object getObject(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getObject( parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public BigDecimal getBigDecimal(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBigDecimal( parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public Object getObject(int i, Map map) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getObject( i, map); } catch (SQLException e) { handleException(e); return null; } } public Ref getRef(int i) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getRef( i); } catch (SQLException e) { handleException(e); return null; } } public Blob getBlob(int i) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBlob( i); } catch (SQLException e) { handleException(e); return null; } } public Clob getClob(int i) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getClob( i); } catch (SQLException e) { handleException(e); return null; } } public Array getArray(int i) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getArray( i); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(int parameterIndex, Calendar cal) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getDate( parameterIndex, cal); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(int parameterIndex, Calendar cal) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTime( parameterIndex, cal); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(int parameterIndex, Calendar cal) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTimestamp( parameterIndex, cal); } catch (SQLException e) { handleException(e); return null; } } public void registerOutParameter(int paramIndex, int sqlType, String typeName) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).registerOutParameter( paramIndex, sqlType, typeName); } catch (SQLException e) { handleException(e); } } public void registerOutParameter(String parameterName, int sqlType) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).registerOutParameter(parameterName, sqlType); } catch (SQLException e) { handleException(e); } } public void registerOutParameter(String parameterName, int sqlType, int scale) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).registerOutParameter(parameterName, sqlType, scale); } catch (SQLException e) { handleException(e); } } public void registerOutParameter(String parameterName, int sqlType, String typeName) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).registerOutParameter(parameterName, sqlType, typeName); } catch (SQLException e) { handleException(e); } } public URL getURL(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getURL(parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public void setURL(String parameterName, URL val) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setURL(parameterName, val); } catch (SQLException e) { handleException(e); } } public void setNull(String parameterName, int sqlType) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNull(parameterName, sqlType); } catch (SQLException e) { handleException(e); } } public void setBoolean(String parameterName, boolean x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBoolean(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setByte(String parameterName, byte x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setByte(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setShort(String parameterName, short x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setShort(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setInt(String parameterName, int x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setInt(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setLong(String parameterName, long x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setLong(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setFloat(String parameterName, float x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setFloat(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setDouble(String parameterName, double x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setDouble(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setBigDecimal(String parameterName, BigDecimal x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBigDecimal(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setString(String parameterName, String x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setString(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setBytes(String parameterName, byte [] x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBytes(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setDate(String parameterName, Date x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setDate(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setTime(String parameterName, Time x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setTime(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setTimestamp(String parameterName, Timestamp x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setTimestamp(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setAsciiStream(String parameterName, InputStream x, int length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setAsciiStream(parameterName, x, length); } catch (SQLException e) { handleException(e); } } public void setBinaryStream(String parameterName, InputStream x, int length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBinaryStream(parameterName, x, length); } catch (SQLException e) { handleException(e); } } public void setObject(String parameterName, Object x, int targetSqlType, int scale) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setObject(parameterName, x, targetSqlType, scale); } catch (SQLException e) { handleException(e); } } public void setObject(String parameterName, Object x, int targetSqlType) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setObject(parameterName, x, targetSqlType); } catch (SQLException e) { handleException(e); } } public void setObject(String parameterName, Object x) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setObject(parameterName, x); } catch (SQLException e) { handleException(e); } } public void setCharacterStream(String parameterName, Reader reader, int length) throws SQLException { checkOpen(); ((CallableStatement)_stmt).setCharacterStream(parameterName, reader, length); } public void setDate(String parameterName, Date x, Calendar cal) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setDate(parameterName, x, cal); } catch (SQLException e) { handleException(e); } } public void setTime(String parameterName, Time x, Calendar cal) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setTime(parameterName, x, cal); } catch (SQLException e) { handleException(e); } } public void setTimestamp(String parameterName, Timestamp x, Calendar cal) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setTimestamp(parameterName, x, cal); } catch (SQLException e) { handleException(e); } } public void setNull(String parameterName, int sqlType, String typeName) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNull(parameterName, sqlType, typeName); } catch (SQLException e) { handleException(e); } } public String getString(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getString(parameterName); } catch (SQLException e) { handleException(e); return null; } } public boolean getBoolean(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBoolean(parameterName); } catch (SQLException e) { handleException(e); return false; } } public byte getByte(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getByte(parameterName); } catch (SQLException e) { handleException(e); return 0; } } public short getShort(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getShort(parameterName); } catch (SQLException e) { handleException(e); return 0; } } public int getInt(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getInt(parameterName); } catch (SQLException e) { handleException(e); return 0; } } public long getLong(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getLong(parameterName); } catch (SQLException e) { handleException(e); return 0; } } public float getFloat(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getFloat(parameterName); } catch (SQLException e) { handleException(e); return 0; } } public double getDouble(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getDouble(parameterName); } catch (SQLException e) { handleException(e); return 0; } } public byte[] getBytes(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBytes(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getDate(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTime(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTimestamp(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Object getObject(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getObject(parameterName); } catch (SQLException e) { handleException(e); return null; } } public BigDecimal getBigDecimal(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBigDecimal(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Object getObject(String parameterName, Map map) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getObject(parameterName, map); } catch (SQLException e) { handleException(e); return null; } } public Ref getRef(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getRef(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Blob getBlob(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getBlob(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Clob getClob(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getClob(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Array getArray(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getArray(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Date getDate(String parameterName, Calendar cal) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getDate(parameterName, cal); } catch (SQLException e) { handleException(e); return null; } } public Time getTime(String parameterName, Calendar cal) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTime(parameterName, cal); } catch (SQLException e) { handleException(e); return null; } } public Timestamp getTimestamp(String parameterName, Calendar cal) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getTimestamp(parameterName, cal); } catch (SQLException e) { handleException(e); return null; } } public URL getURL(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getURL(parameterName); } catch (SQLException e) { handleException(e); return null; } } /* JDBC_4_ANT_KEY_BEGIN */ public RowId getRowId(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getRowId(parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public RowId getRowId(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getRowId(parameterName); } catch (SQLException e) { handleException(e); return null; } } public void setRowId(String parameterName, RowId value) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setRowId(parameterName, value); } catch (SQLException e) { handleException(e); } } public void setNString(String parameterName, String value) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNString(parameterName, value); } catch (SQLException e) { handleException(e); } } public void setNCharacterStream(String parameterName, Reader reader, long length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNCharacterStream(parameterName, reader, length); } catch (SQLException e) { handleException(e); } } public void setNClob(String parameterName, NClob value) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNClob(parameterName, value); } catch (SQLException e) { handleException(e); } } public void setClob(String parameterName, Reader reader, long length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setClob(parameterName, reader, length); } catch (SQLException e) { handleException(e); } } public void setBlob(String parameterName, InputStream inputStream, long length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBlob(parameterName, inputStream, length); } catch (SQLException e) { handleException(e); } } public void setNClob(String parameterName, Reader reader, long length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNClob(parameterName, reader, length); } catch (SQLException e) { handleException(e); } } public NClob getNClob(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getNClob(parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public NClob getNClob(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getNClob(parameterName); } catch (SQLException e) { handleException(e); return null; } } public void setSQLXML(String parameterName, SQLXML value) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setSQLXML(parameterName, value); } catch (SQLException e) { handleException(e); } } public SQLXML getSQLXML(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getSQLXML(parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public SQLXML getSQLXML(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getSQLXML(parameterName); } catch (SQLException e) { handleException(e); return null; } } public String getNString(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getNString(parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public String getNString(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getNString(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Reader getNCharacterStream(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getNCharacterStream(parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public Reader getNCharacterStream(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getNCharacterStream(parameterName); } catch (SQLException e) { handleException(e); return null; } } public Reader getCharacterStream(int parameterIndex) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getCharacterStream(parameterIndex); } catch (SQLException e) { handleException(e); return null; } } public Reader getCharacterStream(String parameterName) throws SQLException { checkOpen(); try { return ((CallableStatement)_stmt).getCharacterStream(parameterName); } catch (SQLException e) { handleException(e); return null; } } public void setBlob(String parameterName, Blob blob) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBlob(parameterName, blob); } catch (SQLException e) { handleException(e); } } public void setClob(String parameterName, Clob clob) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setClob(parameterName, clob); } catch (SQLException e) { handleException(e); } } public void setAsciiStream(String parameterName, InputStream inputStream, long length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setAsciiStream(parameterName, inputStream, length); } catch (SQLException e) { handleException(e); } } public void setBinaryStream(String parameterName, InputStream inputStream, long length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBinaryStream(parameterName, inputStream, length); } catch (SQLException e) { handleException(e); } } public void setCharacterStream(String parameterName, Reader reader, long length) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setCharacterStream(parameterName, reader, length); } catch (SQLException e) { handleException(e); } } public void setAsciiStream(String parameterName, InputStream inputStream) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setAsciiStream(parameterName, inputStream); } catch (SQLException e) { handleException(e); } } public void setBinaryStream(String parameterName, InputStream inputStream) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBinaryStream(parameterName, inputStream); } catch (SQLException e) { handleException(e); } } public void setCharacterStream(String parameterName, Reader reader) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setCharacterStream(parameterName, reader); } catch (SQLException e) { handleException(e); } } public void setNCharacterStream(String parameterName, Reader reader) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNCharacterStream(parameterName, reader); } catch (SQLException e) { handleException(e); } } public void setClob(String parameterName, Reader reader) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setClob(parameterName, reader); } catch (SQLException e) { handleException(e); } } public void setBlob(String parameterName, InputStream inputStream) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setBlob(parameterName, inputStream); } catch (SQLException e) { handleException(e); } } public void setNClob(String parameterName, Reader reader) throws SQLException { checkOpen(); try { ((CallableStatement)_stmt).setNClob(parameterName, reader); } catch (SQLException e) { handleException(e); } } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/DelegatingConnection.java0000644000175000017500000005403411333570550031241 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.Iterator; import java.util.List; import java.util.Map; import java.sql.ResultSet; /* JDBC_4_ANT_KEY_BEGIN */ import java.sql.Array; import java.sql.Blob; import java.sql.ClientInfoStatus; import java.sql.Clob; import java.sql.NClob; import java.sql.SQLClientInfoException; import java.sql.SQLXML; import java.sql.Struct; import java.util.Collections; import java.util.Properties; /* JDBC_4_ANT_KEY_END */ /** * A base delegating implementation of {@link Connection}. *

* All of the methods from the {@link Connection} interface * simply check to see that the {@link Connection} is active, * and call the corresponding method on the "delegate" * provided in my constructor. *

* Extends AbandonedTrace to implement Connection tracking and * logging of code which created the Connection. Tracking the * Connection ensures that the AbandonedObjectPool can close * this connection and recycle it if its pool of connections * is nearing exhaustion and this connection's last usage is * older than the removeAbandonedTimeout. * * @author Rodney Waldhoff * @author Glenn L. Nielsen * @author James House * @author Dirk Verbeeck * @version $Revision: 896719 $ $Date: 2010-01-06 18:42:22 -0500 (Wed, 06 Jan 2010) $ */ public class DelegatingConnection extends AbandonedTrace implements Connection { /* JDBC_4_ANT_KEY_BEGIN */ private static final Map EMPTY_FAILED_PROPERTIES = Collections.emptyMap(); /* JDBC_4_ANT_KEY_END */ /** My delegate {@link Connection}. */ protected Connection _conn = null; protected boolean _closed = false; /** * Create a wrapper for the Connection which traces this * Connection in the AbandonedObjectPool. * * @param c the {@link Connection} to delegate all calls to. */ public DelegatingConnection(Connection c) { super(); _conn = c; } /** * Create a wrapper for the Connection which traces * the Statements created so that any unclosed Statements * can be closed when this Connection is closed. * * @param c the {@link Connection} to delegate all calls to. * @param config the configuration for tracing abandoned objects */ public DelegatingConnection(Connection c, AbandonedConfig config) { super(config); _conn = c; } /** * Returns a string representation of the metadata associated with * the innnermost delegate connection. * * @since 1.2.2 */ public String toString() { String s = null; Connection c = this.getInnermostDelegateInternal(); if (c != null) { try { if (c.isClosed()) { s = "connection is closed"; } else { DatabaseMetaData meta = c.getMetaData(); if (meta != null) { StringBuffer sb = new StringBuffer(); sb.append(meta.getURL()); sb.append(", UserName="); sb.append(meta.getUserName()); sb.append(", "); sb.append(meta.getDriverName()); s = sb.toString(); } } } catch (SQLException ex) { // Ignore } } if (s == null) { s = super.toString(); } return s; } /** * Returns my underlying {@link Connection}. * @return my underlying {@link Connection}. */ public Connection getDelegate() { return getDelegateInternal(); } /** * Should be final but can't be for compatibility with previous releases. */ protected Connection getDelegateInternal() { return _conn; } /** * Compares innermost delegate to the given connection. * * @param c connection to compare innermost delegate with * @return true if innermost delegate equals c * @since 1.2.2 */ public boolean innermostDelegateEquals(Connection c) { Connection innerCon = getInnermostDelegateInternal(); if (innerCon == null) { return c == null; } else { return innerCon.equals(c); } } /** * This method considers two objects to be equal * if the underlying jdbc objects are equal. */ public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } Connection delegate = getInnermostDelegateInternal(); if (delegate == null) { return false; } if (obj instanceof DelegatingConnection) { DelegatingConnection c = (DelegatingConnection) obj; return c.innermostDelegateEquals(delegate); } else { return delegate.equals(obj); } } public int hashCode() { Object obj = getInnermostDelegateInternal(); if (obj == null) { return 0; } return obj.hashCode(); } /** * If my underlying {@link Connection} is not a * DelegatingConnection, returns it, * otherwise recursively invokes this method on * my delegate. *

* Hence this method will return the first * delegate that is not a DelegatingConnection, * or null when no non-DelegatingConnection * delegate can be found by traversing this chain. *

* This method is useful when you may have nested * DelegatingConnections, and you want to make * sure to obtain a "genuine" {@link Connection}. */ public Connection getInnermostDelegate() { return getInnermostDelegateInternal(); } protected final Connection getInnermostDelegateInternal() { Connection c = _conn; while(c != null && c instanceof DelegatingConnection) { c = ((DelegatingConnection)c).getDelegateInternal(); if(this == c) { return null; } } return c; } /** Sets my delegate. */ public void setDelegate(Connection c) { _conn = c; } /** * Closes the underlying connection, and close * any Statements that were not explicitly closed. */ public void close() throws SQLException { passivate(); _conn.close(); } protected void handleException(SQLException e) throws SQLException { throw e; } public Statement createStatement() throws SQLException { checkOpen(); try { return new DelegatingStatement(this, _conn.createStatement()); } catch (SQLException e) { handleException(e); return null; } } public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); try { return new DelegatingStatement (this, _conn.createStatement(resultSetType,resultSetConcurrency)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement (this, _conn.prepareStatement(sql)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement (this, _conn.prepareStatement (sql,resultSetType,resultSetConcurrency)); } catch (SQLException e) { handleException(e); return null; } } public CallableStatement prepareCall(String sql) throws SQLException { checkOpen(); try { return new DelegatingCallableStatement(this, _conn.prepareCall(sql)); } catch (SQLException e) { handleException(e); return null; } } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkOpen(); try { return new DelegatingCallableStatement (this, _conn.prepareCall(sql, resultSetType,resultSetConcurrency)); } catch (SQLException e) { handleException(e); return null; } } public void clearWarnings() throws SQLException { checkOpen(); try { _conn.clearWarnings(); } catch (SQLException e) { handleException(e); } } public void commit() throws SQLException { checkOpen(); try { _conn.commit(); } catch (SQLException e) { handleException(e); } } public boolean getAutoCommit() throws SQLException { checkOpen(); try { return _conn.getAutoCommit(); } catch (SQLException e) { handleException(e); return false; } } public String getCatalog() throws SQLException { checkOpen(); try { return _conn.getCatalog(); } catch (SQLException e) { handleException(e); return null; } } public DatabaseMetaData getMetaData() throws SQLException { checkOpen(); try { return new DelegatingDatabaseMetaData(this, _conn.getMetaData()); } catch (SQLException e) { handleException(e); return null; } } public int getTransactionIsolation() throws SQLException { checkOpen(); try { return _conn.getTransactionIsolation(); } catch (SQLException e) { handleException(e); return -1; } } public Map getTypeMap() throws SQLException { checkOpen(); try { return _conn.getTypeMap(); } catch (SQLException e) { handleException(e); return null; } } public SQLWarning getWarnings() throws SQLException { checkOpen(); try { return _conn.getWarnings(); } catch (SQLException e) { handleException(e); return null; } } public boolean isReadOnly() throws SQLException { checkOpen(); try { return _conn.isReadOnly(); } catch (SQLException e) { handleException(e); return false; } } public String nativeSQL(String sql) throws SQLException { checkOpen(); try { return _conn.nativeSQL(sql); } catch (SQLException e) { handleException(e); return null; } } public void rollback() throws SQLException { checkOpen(); try { _conn.rollback(); } catch (SQLException e) { handleException(e); } } public void setAutoCommit(boolean autoCommit) throws SQLException { checkOpen(); try { _conn.setAutoCommit(autoCommit); } catch (SQLException e) { handleException(e); } } public void setCatalog(String catalog) throws SQLException { checkOpen(); try { _conn.setCatalog(catalog); } catch (SQLException e) { handleException(e); } } public void setReadOnly(boolean readOnly) throws SQLException { checkOpen(); try { _conn.setReadOnly(readOnly); } catch (SQLException e) { handleException(e); } } public void setTransactionIsolation(int level) throws SQLException { checkOpen(); try { _conn.setTransactionIsolation(level); } catch (SQLException e) { handleException(e); } } public void setTypeMap(Map map) throws SQLException { checkOpen(); try { _conn.setTypeMap(map); } catch (SQLException e) { handleException(e); } } public boolean isClosed() throws SQLException { return _closed || _conn.isClosed(); } protected void checkOpen() throws SQLException { if(_closed) { if (null != _conn) { String label = ""; try { label = _conn.toString(); } catch (Exception ex) { // ignore, leave label empty } throw new SQLException ("Connection " + label + " is closed."); } else { throw new SQLException ("Connection is null."); } } } protected void activate() { _closed = false; setLastUsed(); if(_conn instanceof DelegatingConnection) { ((DelegatingConnection)_conn).activate(); } } protected void passivate() throws SQLException { try { // The JDBC spec requires that a Connection close any open // Statement's when it is closed. // DBCP-288. Not all the traced objects will be statements List traces = getTrace(); if(traces != null) { Iterator traceIter = traces.iterator(); while (traceIter.hasNext()) { Object trace = traceIter.next(); if (trace instanceof Statement) { ((Statement) trace).close(); } else if (trace instanceof ResultSet) { // DBCP-265: Need to close the result sets that are // generated via DatabaseMetaData ((ResultSet) trace).close(); } } clearTrace(); } setLastUsed(0); if(_conn instanceof DelegatingConnection) { ((DelegatingConnection)_conn).passivate(); } } finally { _closed = true; } } public int getHoldability() throws SQLException { checkOpen(); try { return _conn.getHoldability(); } catch (SQLException e) { handleException(e); return 0; } } public void setHoldability(int holdability) throws SQLException { checkOpen(); try { _conn.setHoldability(holdability); } catch (SQLException e) { handleException(e); } } public java.sql.Savepoint setSavepoint() throws SQLException { checkOpen(); try { return _conn.setSavepoint(); } catch (SQLException e) { handleException(e); return null; } } public java.sql.Savepoint setSavepoint(String name) throws SQLException { checkOpen(); try { return _conn.setSavepoint(name); } catch (SQLException e) { handleException(e); return null; } } public void rollback(java.sql.Savepoint savepoint) throws SQLException { checkOpen(); try { _conn.rollback(savepoint); } catch (SQLException e) { handleException(e); } } public void releaseSavepoint(java.sql.Savepoint savepoint) throws SQLException { checkOpen(); try { _conn.releaseSavepoint(savepoint); } catch (SQLException e) { handleException(e); } } public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); try { return new DelegatingStatement(this, _conn.createStatement( resultSetType, resultSetConcurrency, resultSetHoldability)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, _conn.prepareStatement( sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } catch (SQLException e) { handleException(e); return null; } } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkOpen(); try { return new DelegatingCallableStatement(this, _conn.prepareCall( sql, resultSetType, resultSetConcurrency, resultSetHoldability)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, _conn.prepareStatement( sql, autoGeneratedKeys)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, int columnIndexes[]) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, _conn.prepareStatement( sql, columnIndexes)); } catch (SQLException e) { handleException(e); return null; } } public PreparedStatement prepareStatement(String sql, String columnNames[]) throws SQLException { checkOpen(); try { return new DelegatingPreparedStatement(this, _conn.prepareStatement( sql, columnNames)); } catch (SQLException e) { handleException(e); return null; } } /* JDBC_4_ANT_KEY_BEGIN */ public boolean isWrapperFor(Class iface) throws SQLException { return iface.isAssignableFrom(getClass()) || _conn.isWrapperFor(iface); } public T unwrap(Class iface) throws SQLException { if (iface.isAssignableFrom(getClass())) { return iface.cast(this); } else if (iface.isAssignableFrom(_conn.getClass())) { return iface.cast(_conn); } else { return _conn.unwrap(iface); } } public Array createArrayOf(String typeName, Object[] elements) throws SQLException { checkOpen(); try { return _conn.createArrayOf(typeName, elements); } catch (SQLException e) { handleException(e); return null; } } public Blob createBlob() throws SQLException { checkOpen(); try { return _conn.createBlob(); } catch (SQLException e) { handleException(e); return null; } } public Clob createClob() throws SQLException { checkOpen(); try { return _conn.createClob(); } catch (SQLException e) { handleException(e); return null; } } public NClob createNClob() throws SQLException { checkOpen(); try { return _conn.createNClob(); } catch (SQLException e) { handleException(e); return null; } } public SQLXML createSQLXML() throws SQLException { checkOpen(); try { return _conn.createSQLXML(); } catch (SQLException e) { handleException(e); return null; } } public Struct createStruct(String typeName, Object[] attributes) throws SQLException { checkOpen(); try { return _conn.createStruct(typeName, attributes); } catch (SQLException e) { handleException(e); return null; } } public boolean isValid(int timeout) throws SQLException { checkOpen(); try { return _conn.isValid(timeout); } catch (SQLException e) { handleException(e); return false; } } public void setClientInfo(String name, String value) throws SQLClientInfoException { try { checkOpen(); _conn.setClientInfo(name, value); } catch (SQLClientInfoException e) { throw e; } catch (SQLException e) { throw new SQLClientInfoException("Connection is closed.", EMPTY_FAILED_PROPERTIES, e); } } public void setClientInfo(Properties properties) throws SQLClientInfoException { try { checkOpen(); _conn.setClientInfo(properties); } catch (SQLClientInfoException e) { throw e; } catch (SQLException e) { throw new SQLClientInfoException("Connection is closed.", EMPTY_FAILED_PROPERTIES, e); } } public Properties getClientInfo() throws SQLException { checkOpen(); try { return _conn.getClientInfo(); } catch (SQLException e) { handleException(e); return null; } } public String getClientInfo(String name) throws SQLException { checkOpen(); try { return _conn.getClientInfo(name); } catch (SQLException e) { handleException(e); return null; } } /* JDBC_4_ANT_KEY_END */ } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/AbandonedTrace.java0000644000175000017500000001442211333570550030005 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; /** * Tracks db connection usage for recovering and reporting * abandoned db connections. * * The JDBC Connection, Statement, and ResultSet classes * extend this class. * * @author Glenn L. Nielsen * @version $Revision: 899987 $ $Date: 2010-01-16 11:51:16 -0500 (Sat, 16 Jan 2010) $ */ public class AbandonedTrace { /** DBCP AbandonedConfig */ private final AbandonedConfig config; /** A stack trace of the code that created me (if in debug mode) */ private volatile Exception createdBy; /** A list of objects created by children of this object */ private final List traceList = new ArrayList(); /** Last time this connection was used */ private volatile long lastUsed = 0; /** * Create a new AbandonedTrace without config and * without doing abandoned tracing. */ public AbandonedTrace() { this.config = null; init(null); } /** * Construct a new AbandonedTrace with no parent object. * * @param config AbandonedConfig */ public AbandonedTrace(AbandonedConfig config) { this.config = config; init(null); } /** * Construct a new AbandonedTrace with a parent object. * * @param parent AbandonedTrace parent object */ public AbandonedTrace(AbandonedTrace parent) { this.config = parent.getConfig(); init(parent); } /** * Initialize abandoned tracing for this object. * * @param parent AbandonedTrace parent object */ private void init(AbandonedTrace parent) { if (parent != null) { parent.addTrace(this); } if (config == null) { return; } if (config.getLogAbandoned()) { createdBy = new AbandonedObjectException(); } } /** * Get the abandoned config for this object. * * @return AbandonedConfig for this object */ protected AbandonedConfig getConfig() { return config; } /** * Get the last time this object was used in ms. * * @return long time in ms */ protected long getLastUsed() { return lastUsed; } /** * Set the time this object was last used to the * current time in ms. */ protected void setLastUsed() { lastUsed = System.currentTimeMillis(); } /** * Set the time in ms this object was last used. * * @param time time in ms */ protected void setLastUsed(long time) { lastUsed = time; } /** * If logAbandoned=true generate a stack trace * for this object then add this object to the parent * object trace list. */ protected void setStackTrace() { if (config == null) { return; } if (config.getLogAbandoned()) { createdBy = new AbandonedObjectException(); } } /** * Add an object to the list of objects being * traced. * * @param trace AbandonedTrace object to add */ protected void addTrace(AbandonedTrace trace) { synchronized (this.traceList) { this.traceList.add(trace); } setLastUsed(); } /** * Clear the list of objects being traced by this * object. */ protected void clearTrace() { synchronized(this.traceList) { this.traceList.clear(); } } /** * Get a list of objects being traced by this object. * * @return List of objects */ protected List getTrace() { synchronized (this.traceList) { return new ArrayList(traceList); } } /** * Prints a stack trace of the code that * created this object. */ public void printStackTrace() { if (createdBy != null && config != null) { createdBy.printStackTrace(config.getLogWriter()); } synchronized(this.traceList) { Iterator it = this.traceList.iterator(); while (it.hasNext()) { AbandonedTrace at = (AbandonedTrace)it.next(); at.printStackTrace(); } } } /** * Remove a child object this object is tracing. * * @param trace AbandonedTrace object to remove */ protected void removeTrace(AbandonedTrace trace) { synchronized(this.traceList) { this.traceList.remove(trace); } } static class AbandonedObjectException extends Exception { private static final long serialVersionUID = 7398692158058772916L; /** Date format */ //@GuardedBy("this") private static final SimpleDateFormat format = new SimpleDateFormat ("'DBCP object created' yyyy-MM-dd HH:mm:ss " + "'by the following code was never closed:'"); private final long _createdTime; public AbandonedObjectException() { _createdTime = System.currentTimeMillis(); } // Override getMessage to avoid creating objects and formatting // dates unless the log message will actually be used. public String getMessage() { String msg; synchronized(format) { msg = format.format(new Date(_createdTime)); } return msg; } } } libcommons-dbcp-java-1.4.orig/src/java/org/apache/commons/dbcp/AbandonedConfig.java0000644000175000017500000001233011333570550030150 0ustar drazzibdrazzib/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.dbcp; import java.io.PrintWriter; /** * Configuration settings for handling abandoned db connections. * * @author Glenn L. Nielsen * @version $Revision: 758745 $ $Date: 2009-03-26 13:02:20 -0400 (Thu, 26 Mar 2009) $ */ public class AbandonedConfig { /** * Whether or not a connection is considered abandoned and eligible * for removal if it has been idle longer than the removeAbandonedTimeout */ private boolean removeAbandoned = false; /** * Flag to remove abandoned connections if they exceed the * removeAbandonedTimeout. * * Set to true or false, default false. * If set to true a connection is considered abandoned and eligible * for removal if it has been idle longer than the removeAbandonedTimeout. * Setting this to true can recover db connections from poorly written * applications which fail to close a connection. * * @return true if abandoned connections are to be removed */ public boolean getRemoveAbandoned() { return (this.removeAbandoned); } /** * Flag to remove abandoned connections if they exceed the * removeAbandonedTimeout. * * Set to true or false, default false. * If set to true a connection is considered abandoned and eligible * for removal if it has been idle longer than the removeAbandonedTimeout. * Setting this to true can recover db connections from poorly written * applications which fail to close a connection. * * @param removeAbandoned true means abandoned connections will be * removed */ public void setRemoveAbandoned(boolean removeAbandoned) { this.removeAbandoned = removeAbandoned; } /** * Timeout in seconds before an abandoned connection can be removed */ private int removeAbandonedTimeout = 300; /** * Timeout in seconds before an abandoned connection can be removed. * * Defaults to 300 seconds. * * @return abandoned timeout in seconds */ public int getRemoveAbandonedTimeout() { return (this.removeAbandonedTimeout); } /** * Timeout in seconds before an abandoned connection can be removed. * * Defaults to 300 seconds. * * @param removeAbandonedTimeout abandoned timeout in seconds */ public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) { this.removeAbandonedTimeout = removeAbandonedTimeout; } /** * Determines whether or not to log stack traces for application code * which abandoned a Statement or Connection. */ private boolean logAbandoned = false; /** * Flag to log stack traces for application code which abandoned * a Statement or Connection. * * Defaults to false. * Logging of abandoned Statements and Connections adds overhead * for every Connection open or new Statement because a stack * trace has to be generated. * * @return boolean true if stack trace logging is turned on for abandoned * Statements or Connections * */ public boolean getLogAbandoned() { return (this.logAbandoned); } /** * Flag to log stack traces for application code which abandoned * a Statement or Connection. * * Defaults to false. * Logging of abandoned Statements and Connections adds overhead * for every Connection open or new Statement because a stack * trace has to be generated. * @param logAbandoned true turns on abandoned stack trace logging * */ public void setLogAbandoned(boolean logAbandoned) { this.logAbandoned = logAbandoned; } /** * PrintWriter to use to log information on abandoned objects. */ private PrintWriter logWriter = new PrintWriter(System.out); /** * Returns the log writer being used by this configuration to log * information on abandoned objects. If not set, a PrintWriter based on * System.out is used. * * @return log writer in use */ public PrintWriter getLogWriter() { return logWriter; } /** * Sets the log writer to be used by this configuration to log * information on abandoned objects. * * @param logWriter The new log writer */ public void setLogWriter(PrintWriter logWriter) { this.logWriter = logWriter; } } libcommons-dbcp-java-1.4.orig/doc/0000755000175000017500000000000011333570550016747 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/doc/static_structure_dia.gif0000644000175000017500000002364311333570550023672 0ustar drazzibdrazzibGIF89a#@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`𠠤!,#@ H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗ƌ)pA q>YR˟@obQGw:0EFA JիXj:5b׏>6@Vֳ ͪT%۶pʝKҦ2Y^5m7< &};K1Ę{w0əg82d~IW|y2{VxymmÜ N8Ȯo+4УKN^νO^{ӫ_v;#ßO}돺B_"U&J.x`F(AH^vx~(vω(,0(4h!hނ&@)7O=9d=(%QJeVfPZ|Mّy^_bd=Wg\rfSz ']Y$砄jf2$衐F*韋VjxkM馜R*m}V5du*p 묨¨ӘEꮼ꒩ =Z. N(l6;#vmJU7Pf-ƵlLƪ뜲'nfFfN^{rY Ӥ‹n+k +op}ڋ_t0*1wLt{,$2I',#H/,4i\ϼL(M+FJ'mt_M=8{lնןɖZl1Q\{Vm`a - ^m3| U7x9vm{U,؆YFAq^ڠw= h6v梡沅:䗫6۩O8j;?{A̧uzG/ɷ =g}xwqƖI}6 ֟.y?, ;)Mj׺xzWF5%3XIUd4Ah'9..)xP8 E%@NH"8=<DP"(*Z{T|Ph+zAY΀57i&&p+ڈF;QPmJc %}.HH!F:r9N$IJ̤&mXNJx(Y4Mz@MhVɍ[G(+]FPpe (WqkڻL"ҔV(7PNτ6mz '8INe]L:Aڱ_[ .z:IgJSS"IP1: P,$Jъ.AF7zo^$F$κq,3KF'ǡkߜ.4qLyS`6Y{PtS4WLj,F<6#Z)S!"*W(g]Ymz԰5sjiP Ցb^j䔨ezVnl*R:y},E#+3JSbF0` 8N3FLy$gh4--be+:֦SHZt]*/pK ՑFK>SgAR.% .[t׆)#[P|7h%z3Y|ߋ̾(~ 0`_>! "4KɔQJe<rЖzmdN A_.pNs 2Eܩ ¢DNڸq c y-B0&.vі\eg(GN'\"g\梗#VWas)DQ 3&>l4Ҍz*`٪H l7p]qL)&tלfNd&tQӝ>-RԦNiZ\Oj*U[կ7O .'>bCo塡L)A*bu]jTmZְiVnO[;ݧ TdOw_u<؎[Fwgo bzuYUHZ Ox[ӑ7iǰhx(N}Wײ].sK~Dlny(tfJOv͓Ys{;D% lb9@ M/zl`Q/= 򵟯n_ʵYk۽ӽ9R}]Agl`|b'w5>ɜջ2OvSyBgړQ._` Yi2~! ڧ,iŗG~;OR5w~Elxw\=?c?7sYN.vt8}Kw@ hKPa3.w~}w81S"j5&4o\EZR[߶VQFXY1UV[w{'^9\*hm>ER%!yPS866,(pXZ4heUVpm@ՂQxEjX2Gx;a98Tns9SnsmA~d2(CWpS;8pss8Up;?8F޴]e䅉‰Ȇ5[ms[YU(WHYo&Kh48T]8o1/3%FbW9ÌU[nu6xx&7USVoȸ8c[_TnSp8qk%"0U%Lju8㘌<;qm);IY Y;׌w:cVhE[ֈVf8f=en؋:[s,y3؎Ȓuu;oX2ZՓ)p< 趂1iwLQb!e]Q QTWI`֕^ca9"Xwe~햖%l k E&H{vyxDG|i\Pf9p=(!duDVZ3u)o6کP:Ҫ: v貎Kˠ;KiC[c)&׹Z_񤭀 *F5C-ڡ}_rBr#Z'kt麴WZ?Gy t};wx$O yԷy7+t1ܷr$ xˢ&~v6rlFO4Z[Cͅ . k>\Q{0Z&Y~˸$LOX(|,lR0|1LHdzg]ۜTŁ^gĩdjƱ{nBqzl|ǢYMzg |,~ۺOʷ+ɝ+BZ}NKg' \Z|y*GKc˜e,{Oܘ+(D8Rʰ ,T {mTq ΅j\ZR蜖sܗI++2Xl$<0pttOv4ilrt =W'۽,gsKgLdэ:P]D=z+-r 1=7]6B^D]ڕGc VL%)ptx69kŊFI=4y/Ի]#cHَ]ȏpdρ Vcuw^6՘C鳯:^K# x}I^[]MɕqocX ֏}٘HGqkmHYPTX8U&AP*ZԸعؼi5ѭas݌+M\!E\ܽ`-nճbGY5},F6S:iX6ߍXd{ލ\qWᾼ 2.F#9F RbYlֽ\%('T*ɍHnߪUHַNǘ iz*7_abM޳F|-kۮQڤj5p퓊.x_ 5NJl# nk11 \k)km.8 ;낏/#9IdGi}գa3V)+y?؈ tƝt͏=9Z۸֥oESv퓮.`2eX83I2$@2x\NHJXWRIT_2\Q^gb#ZeojKOlnprq_&x/|~O}/džU/9?*q{D?fX`XO2}c\>Q)!ߦϙ/Yk&ȟJZcLef[,힠ڨ_ڽhvJa$Ҍf}oYkulTʛ Y 0`A*40!‡ "pE5nؑ`?$YdH)U)K1eΤYM9ueODF+"ԩELJ'PYnҪa lS!'j"[b5Ux_1n9װAuhZl2VK1Ùq5\V4i\kرegm tjaol]q޿*sׯw#^zRٵs~䰙o'_goyC_]}J 4@#0/tPiKpB +B 3)B{C8JD K4DST'Y[IkFs a챣1 }kP9qI&txŧ k"*{G:2NJJ24L4}*<ȴ 2((rP0C3M>%C$"S4D%:<sO@+RL ԦG?GTtӖ25TTST>U͐dUUkVLiUX{KWpvXb% XxuP3YhٗeZeI[iEZl}K<Uw]\vEr13yOw_ܵ^~}z%ā xl`$3;87:eW˓=+>M]$v/˒"NdD([{Sg޲-.Y~$EĎ!6rˠ1l1Dz3wSh+rl$˪t;)g6ZydQˇԶZ-ў3NZ!dD ɶnLC|[1%.ҙSE}qlLW?u.0IBw6vNuWЎ>}y7C^ꗇa{Ad}|3Dq^|Qw_Px@&P2@Ft`-x&`=AM#$a %BP+,CBP+rfxCA5 }C A$b&Kdb;D;IDH?(J_Th,nEQ xF脱7q{ZFȂ2 (]j>WF݋5PǭRcn %Dv)pQIY*w% -.Y"9Ar`z~G1$ؽ> *)]Mѕ,e-GA9:Eqm YfwaZQelIW.ml%+IW攱UhiiRlf.Kq✣:v\;+ F¢VP*LWkڜK0rl8W=ܮx n^޳[b+bGrmqZwCk%UJ].[[^)piF 5]Բ 5*zĿS2Zl8YR2`NI0| a`5 ]M|#Ά-%>qiXݒX34Icݡ}c!8@&rGYKyd(Gy4M|eQXrC7b/kx\Zfb@2לN5V͂\lᐙqXihH٢mQTqJlמW x)x >:Cg^;Mod^w)LYzƱ}%d^)})'~{g_|'W~E_G?̗~H}g}' _~g? ~ڄ.W>3 ;GC41t4ES@Vİ۴Y\ }I@]7^3˒ A7@ 9yAO3{[vg8[97b9k[6}ct@Gqts8ABxS8B$̠ ؍$B\)C$ C1,3T04YC6lC%:tA?C@ DADB,DC<@1CElyÿDG ?IICLDaDNwDP-#J$;EBEVQlEX4UXxE[/CD^E_E` 9yFcmҪʊTY5A*mU.TuVpT&/z/q jU:*VaEauTJWUJBUX꒩dVWD2)|-؜2Ve=ׅWQ:f YR,l-WY'ZEZjUY-%YوEUZَ]ZD-ESURڙZZa Z:VyPE֣SUx-(UbWe`ݯME׸su?0%S\M8z!Tm\B&J1Ow=+L/Uی%L\eEXeʍY]ۻS%REX`=]^{% wL^\C6\mJX֢^L۪uW}Z ڦ^=]Z X-߳տmO[,Oۺ*>%]f_eAܜ!~` ? ;libcommons-dbcp-java-1.4.orig/doc/test.jocl0000644000175000017500000000416011333570550020600 0ustar drazzibdrazzib libcommons-dbcp-java-1.4.orig/doc/JOCLPoolingDriverExample.java0000644000175000017500000001051011333570550024356 0ustar drazzibdrazzib/* * 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. */ import java.sql.DriverManager; import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; // // Here's a simple example of how to use the PoolingDriver. // In this example, we'll construct the PoolingDriver implictly // using the JOCL configuration mechanism. // // Note that there is absolutely nothing DBCP specific about // this code, it's just straight JDBC. You can simply // switch connection strings to use the "native" drivers // directly. // // // To compile this example, you'll need nothing but the JDK (1.2+) // in your classpath. // // To run this example, you'll want: // * commons-pool-1.5.4.jar // * commons-dbcp-1.2.2.jar // * the classes for your (underlying) JDBC driver // * sax2.jar (the SAX 2 API) // * a SAX2 friendly XML parser (jaxp.jar and parser.jar, // for example) // * the JOCL configuration for your database connection pool // (poolingDriverExample.jocl, for example) // in your classpath. // // Invoke the class using two arguments: // * the connect string for the JDBC driver (see below) // * the query you'd like to execute // You'll also want to ensure your both your underlying JDBC // driver and the org.apache.commons.dbcp.PoolingDriver // are registered. You can use the "jdbc.drivers" // property to do this. Note that jdbc.drivers is colon // seperated list, on all platforms. // // Depending upon your XML parser, you may need to register // the "default" SAX driver, using the "org.xml.sax.driver" // property. // // For example, to invoke this class with an Oracle driver only // (no pooling): // // java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver \ // -classpath oracle-jdbc.jar:. \ // JOCLPoolingDriverExample \ // "jdbc:oracle:thin:scott/tiger@myhost:1521:mysid" \ // "SELECT * FROM DUAL" // // For pooling: // // java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver:org.apache.commons.dbcp.PoolingDriver \ // -classpath commons-pool-1.5.4.jar:commons-dbcp-1.2.2.jar:oracle-jdbc.jar:jaxp.jar:parser.jar:sax2.jar:. \ // JOCLPoolingDriverExample \ // "jdbc:apache:commons:dbcp:/poolingDriverExample" \ // "SELECT * FROM DUAL" // // The last token in DBCP connect string (when suffixed with ".jocl") // is the resource the PoolingDriver reads as the JOCL configuration. // See Class.getResource for details on resource loading. // public class JOCLPoolingDriverExample { public static void main(String[] args) { // // Just plain-old JDBC. // Connection conn = null; Statement stmt = null; ResultSet rset = null; try { System.out.println("Creating connection."); conn = DriverManager.getConnection(args[0]); System.out.println("Creating statement."); stmt = conn.createStatement(); System.out.println("Executing statement."); rset = stmt.executeQuery(args[1]); System.out.println("Results:"); int numcols = rset.getMetaData().getColumnCount(); while(rset.next()) { for(int i=1;i<=numcols;i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch(SQLException e) { e.printStackTrace(); } finally { try { if (rset != null) rset.close(); } catch(Exception e) { } try { if (stmt != null) stmt.close(); } catch(Exception e) { } try { if (conn != null) conn.close(); } catch(Exception e) { } } } } libcommons-dbcp-java-1.4.orig/doc/abandon.jsp0000644000175000017500000001112111333570550021063 0ustar drazzibdrazzib Couldn't build an initial context : " + e); return null; } try { Object value = ctx.lookup("java:/comp/env/jdbc/abandoned"); out.println("
DataSource lookup"); out.println("
jdbc value : " + value); out.println("
jdbc class : " + value.getClass().getName()); out.println("
"); if (value instanceof DataSource) { return (DataSource) value; } else { return null; } } catch (NamingException e) { out.println("
JNDI lookup failed : " + e); return null; } } private void getConnection1(DataSource ds, JspWriter out) throws Exception { System.err.println("BEGIN getConnection1()"); out.println("
BEGIN getConnection1()"); Connection conn = ds.getConnection(); System.err.println("conn: " + conn); out.println("
conn: " + conn); System.err.println("END getConnection1()"); out.println("
END getConnection1()"); } private void getConnection2(DataSource ds, JspWriter out) throws Exception { System.err.println("BEGIN getConnection2()"); out.println("
BEGIN getConnection2()"); Connection conn = ds.getConnection(); System.err.println("conn: " + conn); out.println("
conn: " + conn); System.err.println("END getConnection2()"); out.println("
END getConnection2()"); } private void getConnection3(DataSource ds, JspWriter out) throws Exception { System.err.println("BEGIN getConnection3()"); out.println("
BEGIN getConnection3()"); Connection conn = ds.getConnection(); System.err.println("conn: " + conn); out.println("
conn: " + conn); System.err.println("END getConnection3()"); out.println("
END getConnection3()"); } ]]>
DBCP Abandoned Connection Test

DBCP Abandoned Connection Test


DataSource ds = getDataSource(out); if (ds != null) { getConnection1(ds, out); getConnection2(ds, out); getConnection3(ds, out); }

OK
libcommons-dbcp-java-1.4.orig/doc/README.txt0000644000175000017500000000354611333570550020455 0ustar drazzibdrazzib=================================================================================== Before running these examples make sure you have registered the database driver you want to use. If you don't you will get the following error: "org.apache.commons.dbcp.DbcpException: java.sql.SQLException: No suitable driver" The DriverManager class will attempt to load the driver classes referenced in the "jdbc.drivers" system property. For example you might specify -Djdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver as command line argument to the java VM. A program can also explicitly load JDBC drivers at any time. For example, the my.sql.Driver is loaded with the following statement: Class.forName("my.sql.Driver"); =================================================================================== ManualPoolingDriverExample.java Provides a simple example of how to use the DBCP package with a manually configured PoolingDriver. Look at the comments with that file for instructions on how to build and run it. ManualPoolingDataSource.java Provides a simple example of how to use the DBCP package with a manually configured PoolingDataSource. Look at the comments with that file for instructions on how to build and run it. JOCLPoolingDriverExample.java poolingDriverExample.jocl.sample Provides an example JOCL configuration and JDBC client that shows how to use the DBCP PoolingDriver with an external configuration. (JOCL will be replaced by Digester when it is available in jakarta-commons.) Look at the comments with those files for instructions on how to build and run it. See also the JavaDoc documentation (use "ant doc" to generate it), especially the package documentation for org.apache.commons.dbcp for an overview of how it all works. The test cases (the source files whose names start with "Test") provide some additional examples. libcommons-dbcp-java-1.4.orig/doc/ManualPoolingDataSourceExample.java0000644000175000017500000001423211333570550025650 0ustar drazzibdrazzib/* * 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. */ import javax.sql.DataSource; import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; // // Here are the dbcp-specific classes. // Note that they are only used in the setupDataSource // method. In normal use, your classes interact // only with the standard JDBC API // import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.DriverManagerConnectionFactory; // // Here's a simple example of how to use the PoolingDataSource. // In this example, we'll construct the PoolingDataSource manually, // just to show how the pieces fit together, but you could also // configure it using an external conifguration file in // JOCL format (and eventually Digester). // // // Note that this example is very similiar to the PoolingDriver // example. In fact, you could use the same pool in both a // PoolingDriver and a PoolingDataSource // // // To compile this example, you'll want: // * commons-pool-1.5.4.jar // * commons-dbcp-1.2.2.jar // * j2ee.jar (for the javax.sql classes) // in your classpath. // // To run this example, you'll want: // * commons-pool-1.5.4.jar // * commons-dbcp-1.2.2.jar // * j2ee.jar (for the javax.sql classes) // * the classes for your (underlying) JDBC driver // in your classpath. // // Invoke the class using two arguments: // * the connect string for your underlying JDBC driver // * the query you'd like to execute // You'll also want to ensure your underlying JDBC driver // is registered. You can use the "jdbc.drivers" // property to do this. // // For example: // java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver \ // -classpath commons-pool-1.5.4.jar:commons-dbcp-1.2.2.jar:j2ee.jar:oracle-jdbc.jar:. \ // ManualPoolingDataSourceExample \ // "jdbc:oracle:thin:scott/tiger@myhost:1521:mysid" \ // "SELECT * FROM DUAL" // public class ManualPoolingDataSourceExample { public static void main(String[] args) { // // First we load the underlying JDBC driver. // You need this if you don't use the jdbc.drivers // system property. // System.out.println("Loading underlying JDBC driver."); try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("Done."); // // Then, we set up the PoolingDataSource. // Normally this would be handled auto-magically by // an external configuration, but in this example we'll // do it manually. // System.out.println("Setting up data source."); DataSource dataSource = setupDataSource(args[0]); System.out.println("Done."); // // Now, we can use JDBC DataSource as we normally would. // Connection conn = null; Statement stmt = null; ResultSet rset = null; try { System.out.println("Creating connection."); conn = dataSource.getConnection(); System.out.println("Creating statement."); stmt = conn.createStatement(); System.out.println("Executing statement."); rset = stmt.executeQuery(args[1]); System.out.println("Results:"); int numcols = rset.getMetaData().getColumnCount(); while(rset.next()) { for(int i=1;i<=numcols;i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch(SQLException e) { e.printStackTrace(); } finally { try { if (rset != null) rset.close(); } catch(Exception e) { } try { if (stmt != null) stmt.close(); } catch(Exception e) { } try { if (conn != null) conn.close(); } catch(Exception e) { } } } public static DataSource setupDataSource(String connectURI) { // // First, we'll need a ObjectPool that serves as the // actual pool of connections. // // We'll use a GenericObjectPool instance, although // any ObjectPool implementation will suffice. // ObjectPool connectionPool = new GenericObjectPool(null); // // Next, we'll create a ConnectionFactory that the // pool will use to create Connections. // We'll use the DriverManagerConnectionFactory, // using the connect string passed in the command line // arguments. // ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null); // // Now we'll create the PoolableConnectionFactory, which wraps // the "real" Connections created by the ConnectionFactory with // the classes that implement the pooling functionality. // PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true); // // Finally, we create the PoolingDriver itself, // passing in the object pool we created. // PoolingDataSource dataSource = new PoolingDataSource(connectionPool); return dataSource; } } libcommons-dbcp-java-1.4.orig/doc/BasicDataSourceExample.java0000644000175000017500000001117311333570550024125 0ustar drazzibdrazzib/* * 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. */ import javax.sql.DataSource; import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; // // Here are the dbcp-specific classes. // Note that they are only used in the setupDataSource // method. In normal use, your classes interact // only with the standard JDBC API // import org.apache.commons.dbcp.BasicDataSource; // // Here's a simple example of how to use the BasicDataSource. // In this example, we'll construct the BasicDataSource manually, // but you could also configure it using an external conifguration file. // // // Note that this example is very similiar to the PoolingDriver // example. // // To compile this example, you'll want: // * commons-pool-1.5.4.jar // * commons-dbcp-1.2.2.jar // * j2ee.jar (for the javax.sql classes) // in your classpath. // // To run this example, you'll want: // * commons-pool-1.5.4.jar // * commons-dbcp-1.2.2.jar // * j2ee.jar (for the javax.sql classes) // * the classes for your (underlying) JDBC driver // in your classpath. // // Invoke the class using two arguments: // * the connect string for your underlying JDBC driver // * the query you'd like to execute // You'll also want to ensure your underlying JDBC driver // is registered. You can use the "jdbc.drivers" // property to do this. // // For example: // java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver \ // -classpath commons-pool-1.5.3.jar:commons-dbcp-1.2.2.jar:j2ee.jar:oracle-jdbc.jar:. \ // ManualPoolingDataSourceExample // "jdbc:oracle:thin:scott/tiger@myhost:1521:mysid" // "SELECT * FROM DUAL" // public class BasicDataSourceExample { public static void main(String[] args) { // First we set up the BasicDataSource. // Normally this would be handled auto-magically by // an external configuration, but in this example we'll // do it manually. // System.out.println("Setting up data source."); DataSource dataSource = setupDataSource(args[0]); System.out.println("Done."); // // Now, we can use JDBC DataSource as we normally would. // Connection conn = null; Statement stmt = null; ResultSet rset = null; try { System.out.println("Creating connection."); conn = dataSource.getConnection(); System.out.println("Creating statement."); stmt = conn.createStatement(); System.out.println("Executing statement."); rset = stmt.executeQuery(args[1]); System.out.println("Results:"); int numcols = rset.getMetaData().getColumnCount(); while(rset.next()) { for(int i=1;i<=numcols;i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch(SQLException e) { e.printStackTrace(); } finally { try { if (rset != null) rset.close(); } catch(Exception e) { } try { if (stmt != null) stmt.close(); } catch(Exception e) { } try { if (conn != null) conn.close(); } catch(Exception e) { } } } public static DataSource setupDataSource(String connectURI) { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); ds.setUsername("scott"); ds.setPassword("tiger"); ds.setUrl(connectURI); return ds; } public static void printDataSourceStats(DataSource ds) { BasicDataSource bds = (BasicDataSource) ds; System.out.println("NumActive: " + bds.getNumActive()); System.out.println("NumIdle: " + bds.getNumIdle()); } public static void shutdownDataSource(DataSource ds) throws SQLException { BasicDataSource bds = (BasicDataSource) ds; bds.close(); } } libcommons-dbcp-java-1.4.orig/doc/ManualPoolingDriverExample.java0000644000175000017500000001652511333570550025060 0ustar drazzibdrazzib/* * 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. */ import java.sql.DriverManager; import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; // // Here are the dbcp-specific classes. // Note that they are only used in the setupDriver // method. In normal use, your classes interact // only with the standard JDBC API // import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.PoolingDriver; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.DriverManagerConnectionFactory; // // Here's a simple example of how to use the PoolingDriver. // In this example, we'll construct the PoolingDriver manually, // just to show how the pieces fit together, but you could also // configure it using an external conifguration file in // JOCL format (and eventually Digester). // // // To compile this example, you'll want: // * commons-pool-1.5.4.jar // * commons-dbcp-1.2.2.jar // in your classpath. // // To run this example, you'll want: // * commons-collections.jar // * commons-pool-1.5.4.jar // * commons-dbcp-1.2.2.jar // * the classes for your (underlying) JDBC driver // in your classpath. // // Invoke the class using two arguments: // * the connect string for your underlying JDBC driver // * the query you'd like to execute // You'll also want to ensure your underlying JDBC driver // is registered. You can use the "jdbc.drivers" // property to do this. // // For example: // java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver \ // -classpath commons-pool-1.5.3.jar:commons-dbcp-1.2.2.jar:oracle-jdbc.jar:. \ // ManualPoolingDriverExample \ // "jdbc:oracle:thin:scott/tiger@myhost:1521:mysid" \ // "SELECT * FROM DUAL" // public class ManualPoolingDriverExample { public static void main(String[] args) { // // First we load the underlying JDBC driver. // You need this if you don't use the jdbc.drivers // system property. // System.out.println("Loading underlying JDBC driver."); try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("Done."); // // Then we set up and register the PoolingDriver. // Normally this would be handled auto-magically by // an external configuration, but in this example we'll // do it manually. // System.out.println("Setting up driver."); try { setupDriver(args[0]); } catch (Exception e) { e.printStackTrace(); } System.out.println("Done."); // // Now, we can use JDBC as we normally would. // Using the connect string // jdbc:apache:commons:dbcp:example // The general form being: // jdbc:apache:commons:dbcp: // Connection conn = null; Statement stmt = null; ResultSet rset = null; try { System.out.println("Creating connection."); conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:example"); System.out.println("Creating statement."); stmt = conn.createStatement(); System.out.println("Executing statement."); rset = stmt.executeQuery(args[1]); System.out.println("Results:"); int numcols = rset.getMetaData().getColumnCount(); while(rset.next()) { for(int i=1;i<=numcols;i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch(SQLException e) { e.printStackTrace(); } finally { try { if (rset != null) rset.close(); } catch(Exception e) { } try { if (stmt != null) stmt.close(); } catch(Exception e) { } try { if (conn != null) conn.close(); } catch(Exception e) { } } // Display some pool statistics try { printDriverStats(); } catch (Exception e) { e.printStackTrace(); } // closes the pool try { shutdownDriver(); } catch (Exception e) { e.printStackTrace(); } } public static void setupDriver(String connectURI) throws Exception { // // First, we'll need a ObjectPool that serves as the // actual pool of connections. // // We'll use a GenericObjectPool instance, although // any ObjectPool implementation will suffice. // ObjectPool connectionPool = new GenericObjectPool(null); // // Next, we'll create a ConnectionFactory that the // pool will use to create Connections. // We'll use the DriverManagerConnectionFactory, // using the connect string passed in the command line // arguments. // ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null); // // Now we'll create the PoolableConnectionFactory, which wraps // the "real" Connections created by the ConnectionFactory with // the classes that implement the pooling functionality. // PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true); // // Finally, we create the PoolingDriver itself... // Class.forName("org.apache.commons.dbcp.PoolingDriver"); PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); // // ...and register our pool with it. // driver.registerPool("example",connectionPool); // // Now we can just use the connect string "jdbc:apache:commons:dbcp:example" // to access our pool of Connections. // } public static void printDriverStats() throws Exception { PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); ObjectPool connectionPool = driver.getConnectionPool("example"); System.out.println("NumActive: " + connectionPool.getNumActive()); System.out.println("NumIdle: " + connectionPool.getNumIdle()); } public static void shutdownDriver() throws Exception { PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); driver.closePool("example"); } } libcommons-dbcp-java-1.4.orig/doc/poolingDriverExample.jocl.sample0000644000175000017500000000626711333570550025252 0ustar drazzibdrazzib libcommons-dbcp-java-1.4.orig/xdocs/0000755000175000017500000000000011333570547017330 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/xdocs/style/0000755000175000017500000000000011337741616020471 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/xdocs/style/project.css0000644000175000017500000000010211333570547022641 0ustar drazzibdrazzib@import url("http://commons.apache.org/style/commons-maven.css"); libcommons-dbcp-java-1.4.orig/xdocs/downloads.xml0000644000175000017500000000317711333570547022054 0ustar drazzibdrazzib Downloads

Download the Latest Release of Commons DBCP.

For details of whats new in each version see the Release History.

Older releases are retained by the Apache Software Foundation but are moved into a special archive area.

libcommons-dbcp-java-1.4.orig/xdocs/release-notes-1.1.xml0000644000175000017500000004474311333570547023131 0ustar drazzibdrazzib Release notes for Commons-DBCP 1.1 Commons Documentation Team $Id: release-notes-1.1.xml 561230 2007-07-31 04:17:09Z rahul $

There were a lot changes since the 1.0 release on 12 Aug 2002.

  • All existing features can now be configured by JNDI Context providers (Tomcat)

  • The double close() of a pooled connection is more effectively blocked (you may experience more "Already closed" SQLExceptions)

  • Prepared statement pooling is now implemented in BasicDataSource (set poolPreparedStatements=true, maxOpenPreparedStatements=xxx)

  • Access to the underlying connection is blocked by default You can access the underlying connection by setting accessToUnderlyingConnectionAllowed=true and by using the following construct: Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();

  • New minIdle parameter for a minimum number of idle connections ready for use

  • New connection default properties: defaultCatalog and defaultTransactionIsolation

  • Missing driverClassName will now give the following error "No suitable driver"

  • Bad validationQuery will produce a meaningful SQLException

  • UML Class and sequence diagrams, configuration documentation

  • The following issues were resolved since v1.0: (see Bugzilla for complete description)
    IDDateSevStateSummary
    69342003-09-20BloDUPLSQLTransformer.java - infinite loop in getConnection
    70382002-03-18NorFIXEDBCP does not build under JDK 1.4
    77272002-04-20MajFIXEInfinite loop (stack overflow) in BasicDataSource
    77282002-04-20MajFIXEBasicDataSource cannot use many JDBC drivers
    86202002-04-29NorINVAClosed Connection Exception on setAutoCommit
    90732002-07-20NorFIXEBasicDataSource - invalid connections are not checked
    98502002-07-20NorFIXENo way to get at SQLException if connection to database fail
    105922002-07-20NorDUPLdataSource.getConnection never returns in Tomcat using DBCP
    106142002-07-20NorFIXEDBCP connection pooling broken in Tomcat-4.1.7 (regression)
    106882002-07-20MinFIXEVersion in the Manifest
    109692002-07-20MajFIXEBasicDataSource defaults are unusable
    115072002-08-06NorINVACleanup dead connections
    120472002-11-01NorINVAvalidationQuery + MSSQL
    124002002-11-07NorWORKsame connections
    124092002-11-01BloFIXEConnection can be closed twice
    127332003-02-06NorFIXE[DBCP][PATCH]Statement.getResultSet() doesn't return null if
    128692002-11-01MajFIXEAbandoned Connections are never closed
    130772002-11-07EnhFIXEJdbc2PoolDataSource issues
    131292002-11-01NorFIXECPDSConnectionFactory prints invalid error messages
    131552002-10-30NorDUPLunexpected "exausted pool" error
    132352002-11-16BloFIXEreferenced UserPassKey instances get erroneously returned to
    139302003-03-06EnhFIXEAdding connection parameters to BasicDataSourceFactory
    139882003-03-17EnhDUPLpermission error makes connection loop
    142672003-04-28MajINVADBCP doesn't work on Tomcat 4.1.12 and Oracle JDBC driver
    145922002-11-15EnhINVADBCP must be robust against e.g. database shutdowns
    146632003-05-14NorREMITomcat5 server hangs when trying to get the database connect
    151232003-08-21MajFIXEIncorrect stack trace shown when abandoned connections are c
    155392003-02-06MajDUPLStrange Result Set on output
    162832003-02-01NorWONTInproper use of Exception
    165812003-03-06MajFIXEDeadlock in AbandonedObjectPool when firewall closes connect
    166292003-03-06NorFIXEorg.apache.commons.dbcp.jdbc2pool.Jdbc2PoolDataSource: setti
    169872003-08-11MajFIXErace condition in PoolableConnection.close()
    170152003-03-06NorFIXEGenericObjectPool.invalidateObject() doesn't work with Aband
    172002003-03-06MajFIXEDBCP: org.apache.commons.dbcp.cpdsadapter.PooledConnectionIm
    173012003-04-08NorWONTNPE in Oracle driver when using DBCP PoolingDataSource
    174562003-04-08EnhFIXEBasicDataSource should use commons-logging
    176352003-03-06MinFIXEPoolableConnectionFactory-Construction declared to throw Exc
    176772003-05-31MajINVAPooled connection architecture vulnerable to double use
    176782003-04-01MajFIXEDBCP Fails silently in many cases
    176802003-03-13MajINVAPoolableConnection.reallyClose() doesn't decrement active co
    179112003-04-07MajWONTProblem with getConnection() and Informix
    180122003-08-26EnhFIXEBasicDataSource doesn't include PreparedStmt Pooling
    184832003-04-08NorWONTAbandonedObjectPool.removeAbandoned never cleans up the trac
    185022003-03-30BloINVAjava.lang.ClassNotFoundException: org.apache.commons.pool.St
    185502003-08-25EnhFIXEAdd defaultTransactionIsolation to BasicDataSource
    188342003-04-08NorFIXEJdbc2PoolDataSource throws a RuntimeException when database
    189052003-08-11NorFIXECouldn't get connection (Jdbc2PoolDataSource)
    189212003-08-11EnhFIXEPer User methods not working in Jdbc2PoolDataSource
    189822003-04-13MajINVABinary distribution missing package
    193742003-08-11NorFIXEPotential for DelegateStatement, DelegateResultSet to be lef
    196142003-08-13MajFIXEPoor performance under load
    196152003-05-02MajINVAUnecessary global synchronized in AbandonedObjectPool method
    197062003-08-26EnhWONTAdd Initial Commons Logging to DBCP
    206492003-08-11CriINVAdeadlock when acquiring connections from a pool
    211322003-08-11CriDUPLBroken pipe despite validation query set
    211822003-08-21NorINVA[dbcp] removing a webapp does not force connections closed
    212292003-08-11NorFIXEConnectionFactory throws SQLException but implementations do
    212732003-08-11NorFIXEMemory-leak like behaviour in DBCP due to warnings chained t
    214182003-08-11MinFIXEExample code
    214532003-08-11MajINVANullPointerException in DBCP when used for client-server ap
    214582003-08-11NorFIXEStatements and connections don't implement equals()/hashCode
    217482003-08-11NorFIXEBasicDataSource.close() throws NPE
    220782003-08-12NorFIXE[DBCP] testOnBorrow fails if setAutoCommit() throws an excep
    220792003-08-13NorFIXE[DBCP] if connection closed twice *closed* connection is ret
    222142003-08-11MajFIXEDelegating ResultSet causing NPE
    222292003-08-13CriFIXEFoul connection causes livelock of all pool operations
    225982003-08-21EnhFIXEminIdle Functionality for DBCP via Patches Posted for common
    227362003-08-29MajINVAvalidationQuery parameter hangs getConnection method.
    227502003-08-27NorFIXEBasicDataSource always sets testOnBorrow if given a validati
    227762003-09-20NorWONTDBCP should not be writing messages to stderr or stdout
    230662003-09-13MajFIXEDriverManager.getConnection() throws DbcpException
    230812003-09-20NorFIXEDBCP - Bad DB Validation Query Hangs Everything
    231382003-09-13NorFIXEgetDelegate no longer useful since v1.7 of PoolingDataSource
    231572003-09-20EnhFIXEadd defaultCatalog to BasicDataSource
    231852003-09-21NorWONTPoolableConnection.close() won't allow multiple close
    232912003-09-20NorFIXEimpossible to turn off all validation tests when a validatio
    232932003-09-20NorFIXEsetAutoCommit(true) when returning connection to the pool
    233042003-09-21NorFIXENullpointerException when no driverClassName is specified

  • The following issues were resolved since v1.1RC1:
    IDDateSevStateSummary
    227762003-09-30NorFIXEDBCP should not be writing messages to stderr or stdout (removed unneeded logging in AbandonedObjectPool)
    234912003-10-13CriFIXECan't configure PerUserPoolDataSource for use with tomcat, more...

  • The following issues were resolved since v1.1RC2:
    IDDateSevStateSummary
    238432003-10-20BloFIXEPerUserPoolDataSource.getConnection(username, pw) may return connection under wrong username

libcommons-dbcp-java-1.4.orig/xdocs/changes.xml0000644000175000017500000005252511333570547021473 0ustar drazzibdrazzib Commons DBCP Release Notes Eliminated poolKeys cache from PerUserPoolDataSource. Eliminated userKeys LRUMap cache from SharedPoolDataSource. Made private fields final where possible. PerUserPoolDataSource.getPooledConnectionAndInfo multi-threading bug. Remove throws clause from method that does not throw an exception. Remove code that catches and ignores Exceptions when calling PooledConnection.removeConnectionEventListener(ConnectionEventListener) as the method does not throw any Exceptions. Remove impossible null check. Renamed variables with duplicate names in different scopes. Clarified javadoc for BasicDataSource close() method. Made PoolingConnection pool CallableStatements. When BasicDataSource's poolPreparedStatements property is true, CallableStatements are now pooled along with PreparedStatements. The maxOpenPreparedStatements property limits the combined number of Callable and Prepared statements that can be in use at a given time. Use an API specific exception for logging abandoned objects to make scanning the logs for these exceptions simpler and to provide a better message that includes the creation time of the abandoned object. Ensure Statement.getGeneratedKeys() works correctly with the CPDS adapter. Removed incorrectly advertised ClassNotFoundException from JOCLContentHandler.ConstructorDetails.createObject(). Make the class loader used to load the JDBC driver configurable for the BasicDatasource. Handle user password changes for InstanceKeyDataSources. Made XADataSource configurable in BasicManagedDataSource. Added PoolableManagedConnection and PoolableManagedConnectionFactory so that pooled managed connections can unregister themselves from transaction registries, avoiding resource leaks. Added connectionProperties property to DriverAdapterCPDS. Added a validationQueryTimeout configuration parameter to BasicDataSource allowing the user to specify a timeout value (in seconds) for connection validation queries. Added a connectionInitSqls configuration parameter to BasicDataSource allowing the user to specify a collection of SQL statements to execute one time when a physical database connection is first opened. PoolableConnectionFactory.makeObject() is no longer synchronized. This provides improved response times when load spikes at the cost of a faster rise in database server load. This change was made as a partial fix for DBCP-212. The synchronization changes in Commons Pool 1.5 complete the fix for this issue. Reverted DelegatingConnection close to 1.2.2 version to ensure open statements are closed before the underlying connection is closed. Refactor DelegatingConnection and ManagedConnection enable overridden equals() and hashcode() to work correctly. Add a DelegatingDatabaseMetaData to track ResultSets returned from DatabaseMetaData objects. Modified BasicDataSourceFactory to complete initialization of the pool by creating initialSize connections rather than leaving this to lazy initialization when the pool is used. Eliminated masked _stmt field in descendents of DelegatingStatement. Modified DBCP sources to support compilation under JDK 1.4-1.6 using Ant flags to do conditional compilation. Added a static initializer to BasicDatasource that calls DriverManager.getDrivers() to force initialization before we ever do anything that might use Class.forName() to load (and register) a JDBC driver. Eliminated direct System.out calls in AbandonedTrace. Modified DelegatingStatment close to clear open batches. Eliminated unused private "parent" field in AbandonedTrace. Fixed errors handling boolean-valued Reference properties in InstanceKeyObjectFactory, DriverAdapterCPDS that were causing testOnBorrow and poolPreparedStatements properties to be incorrectly set when creating objects from javax.naming.Reference instances. Made private instance fields of AbandonedTrace volatile (parent, createdBy, lastUsed, createdTime) or final (trace). Narrowed synchronization in AbandonedTrace to resolve an Evictor deadlock. Corrected Javadoc to state that getLoginTimeout and setLoginTimeout are NOT supported by BasicDataSource. Added Maven 2 pom.xml. Removed a block of code from TestJOCLed that set the Xerces parser manually. This was to support early JDKs. The 1.3 version of DBCP requires JDK 1.4+. Added support for pooling managed connections. Added BasicManagedDataSource, extending BasicDataSource. Also improved extensibility of BasicDataSource by encapsulating methods to create object pool, connection factory and datasource instance previously embedded in createDataSource. Changed behavior to allow Connection, Statement, PreparedStatement, CallableStatement and ResultSet to be closed multiple times. The first time close is called the resource is closed and any subsequent calls have no effect. This behavior is required as per the JavaDocs for these classes. Also added tests for closing all types multiple times and updated any tests that incorrectly assert that a resource can not be closed more then once. Fixes DBCP-3, DBCP-5, DBCP-23 and DBCP-134. Modified PoolingDataSource, PoolingDriver and DelegatingStatement to assure that all returned Statements, PreparedStatements, CallableStatements and ResultSets are wrapped with a delegating object, which already properly handle the back pointers for Connection and Statement. Also added tests to to assure that the *same* object used to create the statement or result set is returned from either getConnection() or getStatement(). SQLNestedException has been deprecated and will be replaced in DBCP 2.0 with SQLException and standard Java exception chaining. BasicDataSource.close() now permanently marks the data source as closed, and no new connections can be obtained from the data source. At close all idle connections are destroyed and the method returns. As the remaining active connections are closed, they are destroyed. Eliminated potential sources of NullPointerExceptions in PoolingConnection. Improved error recovery and listener cleanup in KeyedCPDSConnectionFactory. Substituted calls to destroyObject with _pool.invalidateObject on error to ensure pool active count is decremented on error events. Ensured that events from closed or invalid connections are ignored and listeners are cleaned up. Fixed error in SharedPoolDataSource causing incorrect passwords to be stored under certain conditions. Added exception handler to ensure that PooledConnections are not orphaned when an exception occurs in setUpDefaults or clearWarnings in IntanceKeyDataSource.getConnection. Made getPool synchronized in PoolableConnectionFactory. Fixes inconsistent synchronization accessing _pool. Fixed inconsistent synchronization on _rollbackAfterValidation, _validationQuery and _pool in CPDSConnectionFactory and KeyedCPDSConnectionFactory by making the first two volatile and making both getter and setter for _pool synchronized. See <a href="changes-report.html#a1.4">DBCP 1.4 Changes </a> for details. Version 1.3 is identical to 1.4, other than JDBC 4 methods being filtered out of the DBCP 1.3 sources. Changes Since 1.2.2 are the same for 1.3 and 1.4. Add a <i>JNDI How To</i> to the User Guide. DriverManagerConnectionFactory: blank username/password handling. Broken behaviour for BasicDataSource.setMaxActive(0). BasicDataSource does not work with getConnection(String, String). Enhancements to prepared statement in DriverAdapterCPDS. Better messages and docs for LoginTimeout UnsupportedOperationException. Error in JOCL snippet in org.apache.commons.dbcp package javadoc. Added toString() methods to DelegatingPreparedStatement and DelegatingStatement Changes to make DBCP compile on JDK 1.5 by adding source="1.4" to compiler arguments (there are compiler errors in JDK 5.0 without this source switch that cannot be fixed without JDK 5.0-specific syntax). Per-user pooling with Oracle driver and default isolation settings. Error in JOCL document in javadoc. Added toString() method to DelegatingConnection. Add DriverManager.invalidateConnection(). Improved Exception nesting in ConnectionPool. Fix broken website links for examples. Modified PoolableConnection close method to invalidate instance when invoked on an already closed connection. Inserted null checks to avoid NPE in close operations. Changed getReference method in InstanceKeyDataSource to return a concrete factory and added implementations of getReference in concrete subclasses. Inserted null check in close method of SharedPoolDataSource to avoid NPE when invoked on non-initialized pool. Document fact that true values for testOnBorrow, testOnReturn, testWhileIdle only have effect when validationQuery is set to a non-null string. Modified activateObject in PoolableConnection to test connection properties before resetting to defaults. Corrected maxActive documentation in configuration.html. Upgraded dependency to Pool 1.3. Added connection info to SQLException messages when closed connections (resp stmts) are accessed in DelegatingConnection, DelegatingStatement. Fixed errors in pool parameter documentation and made 0 value for _maxPreparedStatements in DriverAdapterCPDS behave like a negative value, to be consistent with documentation and pool behavior. Made userKeys an instance variable (i.e., not static) in SharedPoolDataSource. Changed implementation of equals in PoolingDataSource.PoolGuardConnectionWrapper to ensure it is reflexive, even when wrapped connections are not DelegatingConnections. Added rollbackAfterValidation property and code to issue a rollback on a connection after validation when this property is set to true to eliminate Oracle driver exceptions. Default property value is false. Removed dependency on Commons Collections by adding collections 2.1 sources for LRUMap and SequencedHashMap with package scope to datasources package. Removed synchronization from prepareStatement methods in PoolingConnection. Synchronization in these methods was causing deadlocks. No resources other than the prepared statement pool are accessed by these methods, and the pool methods are synchronized. Also fixes DBCP-202. See <a href="release-notes-1.2.1.html">DBCP 1.2.1 Release Notes</a> for details. See <a href="release-notes-1.2.html">DBCP 1.2 Release Notes</a> for details. See <a href="release-notes-1.1.html">DBCP 1.1 Release Notes</a> for details. Initial Release libcommons-dbcp-java-1.4.orig/xdocs/configuration.xml0000644000175000017500000002674111333570547022733 0ustar drazzibdrazzib Configuration Commons Documentation Team

ParameterDescription
username The connection username to be passed to our JDBC driver to establish a connection.
password The connection password to be passed to our JDBC driver to establish a connection.
url The connection URL to be passed to our JDBC driver to establish a connection.
driverClassName The fully qualified Java class name of the JDBC driver to be used.
connectionProperties 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.

ParameterDefaultDescription
defaultAutoCommit true The default auto-commit state of connections created by this pool.
defaultReadOnly driver default The default read-only state of connections created by this pool. If not set then the setReadOnly method will not be called. (Some drivers don't support read only mode, ex: Informix)
defaultTransactionIsolation driver default The default TransactionIsolation state of connections created by this pool. One of the following: (see javadoc)
  • NONE
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
defaultCatalog The default catalog of connections created by this pool.

ParameterDefaultDescription
initialSize 0 The initial number of connections that are created when the pool is started.
Since: 1.2
maxActive 8 The maximum number of active connections that can be allocated from this pool at the same time, or negative for no limit.
maxIdle 8 The maximum number of connections that can remain idle in the pool, without extra ones being released, or negative for no limit.
minIdle 0 The minimum number of connections that can remain idle in the pool, without extra ones being created, or zero to create none.
maxWait indefinitely 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, or -1 to wait indefinitely.

NOTE: If maxIdle is set too low on heavily loaded systems it is possible you will see connections being closed and almost immediately new connections being opened. This is a result of the active threads momentarily closing connections faster than they are opening them, causing the number of idle connections to rise above maxIdle. The best value for maxIdle for heavily loaded system will vary but the default is a good starting point.


ParameterDefaultDescription
validationQuery The SQL query that will be used to validate connections from this pool before returning them to the caller. If specified, this query MUST be an SQL SELECT statement that returns at least one row.
testOnBorrow true 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.
testOnReturn false The indication of whether objects will be validated before being returned to the pool.
NOTE - for a true value to have any effect, the validationQuery parameter must be set to a non-null string.
testWhileIdle false 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 validationQuery parameter must be set to a non-null string.
timeBetweenEvictionRunsMillis -1 The number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, no idle object evictor thread will be run.
numTestsPerEvictionRun 3 The number of objects to examine during each run of the idle object evictor thread (if any).
minEvictableIdleTimeMillis 1000 * 60 * 30 The minimum amount of time an object may sit idle in the pool before it is eligable for eviction by the idle object evictor (if any).
connectionInitSqls null A Collection of SQL statements that will be used to initialize physical connections when they are first created. These statements are executed only once - when the configured connection factory creates the connection.

ParameterDefaultDescription
poolPreparedStatements false Enable prepared statement pooling for this pool.
maxOpenPreparedStatements unlimited The maximum number of open statements that can be allocated from the statement pool at the same time, or zero for no limit.

This component has also the ability to pool PreparedStatements. When enabled a statement pool will be created for each Connection and PreparedStatements created by one of the following methods will be pooled:

  • public PreparedStatement prepareStatement(String sql)
  • public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

NOTE - Make sure your connection has some resources left for the other statements. Pooling PreparedStatements may keep their cursors open in the database, causing a connection to run out of cursors, especially if maxOpenPreparedStatements is left at the default (unlimited) and an application opens a large number of different PreparedStatements per connection. To avoid this problem, maxOpenPreparedStatements should be set to a value less than the maximum number of cursors that can be open on a Connection.


ParameterDefaultDescription
accessToUnderlyingConnectionAllowed false Controls if the PoolGuard allows access to the underlying connection.

When allowed you can access the underlying connection using the following construct:

Connection conn = ds.getConnection(); Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate(); ... conn.close()

Default is false, it is a potential dangerous operation and misbehaving programs can do harmfull things. (closing the underlying or continue using it when the guarded connection is already closed) Be carefull and only use when you need direct access to driver specific extentions.

NOTE: Do not close the underlying connection, only the original one.


ParameterDefaultDescription
removeAbandoned false 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 idle longer than the removeAbandonedTimeout. Setting this to true can recover db connections from poorly written applications which fail to close a connection.
removeAbandonedTimeout 300 Timeout in seconds before an abandoned connection can be removed.
logAbandoned false Flag to log stack traces for application code which abandoned a Statement or Connection.
Logging of abandoned Statements and Connections adds overhead for every Connection open or new Statement because a stack trace has to be generated.

If you have enabled "removeAbandoned" then it is possible that a connection is reclaimed by the pool because it is considered to be abandoned. This mechanism is triggered when (getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)

For example maxActive=20 and 18 active connections and 1 idle connection would trigger the "removeAbandoned". But only the active connections that aren't used for more then "removeAbandonedTimeout" seconds are removed, default (300 sec). Traversing a resultset doesn't count as being used.

libcommons-dbcp-java-1.4.orig/xdocs/building.xml0000644000175000017500000000422211333570547021647 0ustar drazzibdrazzib Building Commons Documentation Team

Commons DBCP uses Maven or Ant as a build system. The maven build requires maven 2 and JDK 1.6. The Ant build works with JDK 1.4, 1.5 or 1.6.

To build a jar file, change into DBCP's root directory and run mvn package. The result will be in the "target" subdirectory.

To build the Javadocs, run mvn javadoc:javadoc. The result will be in "target/site/apidocs/".

To build the full website, run mvn site. The result will be in "target/site".

To build a jar file and the javadocs, change into DBCP's root directory and run ant dist. The result will be in the "dist" subdirectory.

libcommons-dbcp-java-1.4.orig/xdocs/download_dbcp.xml0000644000175000017500000002345211333570547022657 0ustar drazzibdrazzib Download Commons DBCP Commons Documentation Team

We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be available from the mirrors.

You are currently using [preferred]. If you encounter a problem with this mirror, please select another mirror. If all mirrors are failing, there are backup mirrors (at the end of the mirrors list) that should be available.

[if-any logo][end]

Other mirrors:

The KEYS link links to the code signing keys used to sign the product. The PGP link downloads the OpenPGP compatible signature from our main site. The MD5 link downloads the checksum from the main site.

For more information concerning Commons DBCP, see the Commons DBCP web site.

libcommons-dbcp-java-1.4.orig/xdocs/release-notes-1.2.1.xml0000644000175000017500000000453611333570547023265 0ustar drazzibdrazzib Release notes for Commons-DBCP 1.2.1 Commons Documentation Team $Id: release-notes-1.2.1.xml 560804 2007-07-29 20:14:22Z bayard $

NOTE: DBCP v1.2.1 requires Pool v1.2, make sure you use the correct version!


DBCP 1.2.1 is a maintenance release to restore full JDK 1.3 compatibility.

The problem lies in the improper use of a JDK 1.4 method: java.lang.Boolean.valueOf(boolean)

This method was used in the defaultReadOnly property processing.

We recommend to upgrade to DBCP 1.2.1 to avoid this problem altogether.


If you use the defaultReadOnly property in a JRE <1.4, you will get the following error: java.lang.NoSuchMethodError at org.apache.commons.dbcp.BasicDataSource.setDefaultReadOnly(BasicDataSource.java:75) at org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(BasicDataSourceFactory.java:162) at org.apache.commons.dbcp.BasicDataSourceFactory.getObjectInstance(BasicDataSourceFactory.java:144) at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:176)

The simple workaround is not to use this property. For example remove the following from the tomcat config.xml. defaultReadOnly true ]]>

libcommons-dbcp-java-1.4.orig/xdocs/cvs-usage.xml0000644000175000017500000000354711333570547021760 0ustar drazzibdrazzib Source repository Commons Documentation Team

Apache Commons DBCP is hosted on the Apache subversion repository.

The project URL is:
http://svn.apache.org/repos/asf/commons/proper/dbcp/trunk

The best way to view the repository is via the subversion viewer.

The alternative is to use the native subversion display.

For more information on subversion and creating patches see the Apache Contributors Guide.

libcommons-dbcp-java-1.4.orig/xdocs/images/0000755000175000017500000000000011337741616020576 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/xdocs/images/dbcp-logo-blue.jpg0000644000175000017500000001256711333570547024105 0ustar drazzibdrazzibJFIF``C  !"$"$CF" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?-CUa{5ƻpC#Fle8ebp_ =w_7??jɯYM^gZ#_i?|M_ =w*4;/:ݑ4_]o&i?|M|E4;u#_i/|M_ =w*?hw?vG޿ =u?᤾z5Udi쏽᤾z4I% k(ɡ_ ӭzI|% hKATQCA[>KA %/&w|Nd} '_/K/_7_QGMnK/_7G4_]o& :ݑ4_]o&i/|M|E4;u#_i?|M_ =w*?hw?vG޿_ =w?z5Udi쏽%Gi ?z҅ٽ}Y>h'эY5/Okَ% (>|qo:246ٴkS+dn ~CǃhmֳX*u}q UHНG;٣hzYX|k03n^~a^TS~gvfGj_ %.4ՙYtoG߲_xYӵ¨KBm']ĩYkt:dcWv]ÿf<]o-\c/.GYNT U6y5U/+M(kZ^Ve=l ЫyA5|cO n[,cucFO Tg迳O MxVR$y9#iGJO?eðҧM,K#3g +gǯCxFτ|7WW]V!eF<&|$9ZXuoy$:VmGi$8\r+ό:~QҌSЂөm , 2 =0W?ٻWu1C tE]TNOPn*|77E& AH#_>[5Zw ~Sp# P*g/(u<VL]8TaSp0З>uh 6$ͫ f  A^[[_ 2̛APl1~guW^ԵFP渐s\*'KvGkîZkgEtS>MŧX[@*Bq5e-kP Fܵόt/=x¿Ɩ'ӭ/I"z#pz;?M:|Iv(DqB1 үR .HӥZ~f3[#1INN7Xdzֿzc63B?^+n-xj?XWI]Cgl표)߱cVV&L&]'xmRJe+z}|sKSּ5qZaa`-# 031_Wܟċ ¶# |;ۆC_ ^XW9sMTQE_VUmrzXn2Y1&e#~a cVMtdsKvQE1xV=g]߈nbI wGr'*%wֵ4oJ\(aFl`g ŎxWߜu?>g&}4 O~cstumb+f[h X/y^ :5㤛FC'p󃟛08jߏO/ fpP` &:/Aջ+k{_QսDg}[D9/ۋgNo5'I>PpDp'y~wK ^8uAjǠFo.= 1=@0yn.'Y\rYI$s#Z;Ԧ@PcY(>>yk㎋SGH;OGn*s2QҼa.\B㵍b_gΟgMekmdv` $.=EGvNjam%揻2MyYy"?6xу0jTcRծ*،EJϡ _t85/a}>% `ARRĂ̠5ij/qEin_k\LAܐ'y⏅dž4T^(Ċ2@?v>@#jkk_w_ze¬{;xDN\3ێ MOh򹯷r9sM~ƿ bծ`&n&RCJW ~Ե9xv.juIsS׮[6/nBmYiNG9#v3 ~x$J$ŝ=I=m_Ze2ĿRTcex3ώȘ#/#a^q[Sm:t120~Kֳ{w!y9go Th$<QEm|_V.'Ն|/Ok[_7k?F5dLvG4aES/'Ntτ^u{kK l*B$ 'rZƻ;&%׉'IZ]3-ǜ|A_x7zwm׋5켿+j2[1Kcn8J*9krnrG,(꺳>/~,r~WȔ`U}, x}WJ)G J7pѿD^1 [v 8di>ZZ)QQW~eUթyI&I;bz{'^őx+ w {D1PT8 +5RNnԗC?^$/ ~%O5+QA@e*ᕰd`kf ~K%$$__ahe+`Ȯ}+$^Hima܃7F}׌|Mw+coi;sZRrGй׍[PLmj{wU|kKsilqщHJkm}n hy ^jwȈـ.ON@+XմK߷huipɴ7W5=bt)v$TUTJ$e:(0((k*q=7SɼWSxUo4{3 &p\Vg*_d(3/I¥?O")\?Rt'G*_d(y*T#'Q ?(Aʃ/I¥?O"(rK?E|G?O9?Rt'G*_d(y*T#'Q ?(Aʃ/I¥?O"(rK?E|G?O9?Rt'G*_d(y*??Rt'Es9P¥?O"T#'QET|G?O?տo&+7Նlibcommons-dbcp-java-1.4.orig/xdocs/images/dbcp-logo-white.xcf0000644000175000017500000005610511333570547024272 0ustar drazzibdrazzibgimp xcf filePBB;/ gimp-commentCreated with The GIMP!-0UYx[[nDBCP     j%7Snkn8U UU88Uq ƪUU 8U8Uq qUU Uq U8 U  8qUU  U UU U  U q8 qU  U  U UU UUqUU UU Uq8UU 8UUU  88U  8U U8 U  UUqU 8q UUU  qU  U 8 UUUU U q8 U8 q 8ƪ8 q U UMdddU8UU U qUUqqUUU qUq8UUq8qUUU8 Uq8 qUUqUUU8UUUqUUUUUUU8UUUUUqUUqUUUƪUUU UU U U U qU UqU q U U 8U UU UU UqUƍUUq8q888 qUU7<Drop-Shadow#2     c8 z< !!!<                               !!  !!   $&()('&$#!  #&())('&%$##"" "&+.010/-+)'&%%$#!  #'*-/11/.,+**) !'-2588631.,+**+*)'%#"!"$'*.258998753211 &-39=?@?<9630/../01221/-+))+.15:=@AA@><98778 ")18>CEEDA=9631012467898753100148<@DGHGFCA><;<<>? $-5=CHJJHE@<74212469;>??>=;9778;>BGJMNMKHEB@??ACE &/8@GKNMKGB<8411247;>BDEEDB@>>ADHLPRRQOLHECBCEGJ (1:CJNQPMHB<730/037;@DHJKKIGEEGIMQTVWURNJGEDEGKN (2;DKPRQNHB;50-,.15:@FJNPPOMLJJLNRUXZZXUPLIFFGJNR )3FMSWYYXWUTUVY\^__\YTPLIIKNSW  )3=FMQSQMF>6.($#$'-45.'#""&+2:CKRX[\\[YXXY\^`a`]YSNIFEFINS  )3=FMQSRMG?70*&%&).5DKOSTTSQPOPRUX[\[YUOJEA@ACHM (2DIMOOMKJJLNRUXZYWSNHD@>?AFK (1;CJOQQMHB<62/./15:>CGIJJIGEEGJNRUWWUQLGB?==@CH &09AHLONLGB<73100369=ACDEDB@?>?AEIMQSSQNJEA><<>AE %-6>DIKKIFA<74101358:=>><:9879;?DHLNONKGC?<::<>A "*2:@DGGEB>:63100135788753101259>BFHIHFC?<9889:=  '.5;?ABA>;741/../01221/-+*)*,/37;8644568 #)/48:;:8630.,++,+)(&$#"#%(,058;<<;86420012 $)-02331/-*)'&&%$#" "%)-024431/-,+**+ "&)*++*(&%#"!  "%(*+,+*)'&%$$ !##"!  "#$##!                           @*                      !""!  !   !#%')**)('&%$"! ('%" !""!"#$%&(*,/1233210/.-,*(&#  1/-*'#!#%&''&%$$%&&'(())*+,.1479;<;;98765421.+'"8763/+&""$')+,,+*)(&&'()*+,--.0247;>ACCBA?>=<;:963/)$@?>;73.*&$$%&),.011/-+)'&&'(*+-./01369=ADGIJJIGEDCBB@>;60*#FFEC?:61.++,.03577642/,)'%%&')+-/02369=AEJMOPONLJIHHGEB=70)!LMLJFB=8522357:<<:73/+(%#"#$%'),.0247;?DIMQSTTRPNMLLMM;KHD=6-%QRRQMID?<:9:5+"Y[\[XTOKHFFGIKLLJFA:3,& !$'*.39?FMSX[\[YVTSRSUVWVTOH@7-#\^`_\XTPMLLMOQQPMHB:2*##'+07>EMSY\]\ZXUTSTUWXWUPIA7-$^acb_\XTRPQRTUUTPJB:1(!"'-44+"begfda]ZXXYZ\\[XSKB8.% !(08BKSY]__]ZWTSRRSRQNIB:1( dghhfc_][[\]__^ZTLB8-$  %.7AJRY^`_]ZWTRPPONLID=5-%dgiigda_]]^`aa`\UMB8-#  #,6@IRY^`_]ZVROMLJIFC=70(!dgiihec`__`bcca\VMC8-#  "+5?IRY^`_]YTPLIGEB?;60*#cgiihfdbaacdda]VMC8-$  !*4?IQY]_^[WRMHDA>;84/)$aehihgecbbdb^WND:/%  !*4>HQX\^]ZUOID?;740,'"_cghhgecbbcddb^WOE;0&  !*4>HQW\][WRLE?940,($  \aeggfecaabcca]XPG<2)   "*4>HPVZ[YUOH@93.)%! Y_cefeca`__``_\WPH>5+# #+4>HPVYYWRKD<4.(# V\`bcba^]\\]ZVPI@7.& $,5>GOTWWTOH@80(" SY]_`_][YWWXXYYXUPIB91*#%,5>FNSUURLE<4+$ PUY[[ZXVSRQRSTUTRNIC<4-'!%-5=ELQSROIB90(  MQTVVUROMKJKLNOONLHC=70*%  &-46-$ IMOPPNKHECCEGHJJIFB=82-($  &,3:AGKMKHB;2*! EGIIHFC@=;:;CGHGD>7/' ?ABB@>;75322479<>?>=;840,(%"#(.49>ABA>92+# 9:;:852/,*)*,.146898752/,)%#  %*/49<=<84.'  31/-*&$"!"$&),/12321/-*'$"!%*.25542-(" +*)'$!!$')+,,*)'$"  $(+-.-+'# $##!"$%&&%$"!!$&&%$!                          Qk                  F#commons     !!0=0I" &* .8qU8Uq8q8q q UU88UU8qUqUUUqUUUqUUq8U8 UU 8q8U8 q   8U 8U UU UU UU 8UU U 8 88 U q 8888 q8 q8qUUUUUqU UUUU U 8qUq q8UqUU8qU 8q8U8 8UqU8qqq88qqUUqUUUqƪUqUUUU8Uqq q8UUU 88UUqq UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU UUUU qUq qUqU8qU88qU8UƍUUUU8q qq q8  8qUU88qU 88 8UU UUUU8U8UUUUUUUUU8q 8UqUUU UUUUU 8UUUU UUUUU UUUU UUUU UUUUUU UUUUUU UUUUU UUUUUU UUUUU8 UUUU qUUUUq UUUUq8UUUUUUUUqUqU88UUqqU8q8qUU 8Uq8 q 8VVV UU ⪪88888Uqqq88  q 8 qU  qU qq8qƪq888UUk 58 Drop-Shadow     9081Y`Yl815;F2Q U                    !#$%%$# !"##$%%$"   "$&')*+,,+*'%"!#$&'())*+,,*(&#! !$&(*+-.01221.,)&#! !#$'(*+,--./0234431.,)  #'),-/01346787642/,)(''(*,./11223568:;;9752 !&*-/12334679:;<;9742/..0245677665668:=?ABCB@=: "',02456678:<=>>=;97544579;<==<:9878:>=;:99:<>ABCCB@=;988:=@EIMOPONK &-38;==<:8655679;<=>==>@BEGIIHFC?;9779<@FKPSUVTR $+29=@AA>;853223579:;<==?ADGKMOOMJE@;7556:?EKQVZ[ZX  (08>CEED@<830..024689;=@CGLPSTSQLGA;63237=CKRX\__] $,5=CGJIGB=72.+))*,.1369<@EJOTWXWTOHA:40/04:AJRY^aba '09AHLNMID>71+(%%'),/26:@FLRW[\[WQIA93.,-17?HQY_cdd  )3=ELPRPLF?70*%"!!"$'*.38?FMTZ^_^YSJA92-*+/5=FOX_dfe ",6@HOTUSOIA81*$!!#'+06>ENU\`a`[TKB91,))-3;DNW^cff #-8BKSWYWRLC;2+% !$(.55-'" #'-471,)&%&'*.3:AJRZ_bc`ZSJA93/-/28@HOUY[[ !+6ALV]bdd`[TME>83/,*)*+.38?GOV\`a_ZTLC<610149@FMRUWW (3>IS[aeec_ZSLE?:52/--/27=DKRX\]\YSME>94336:?EJOQRR %/:EOX_ceeb^XRLFA<741/./149?FMSWYYWSMF@;7557;?CGKLML !+5@JS[`dec`\WQLFA<741/./15:@FLQTUSPLGB=9778;>ADFGGF &0:DMU\`bba]YTOID?:51.-,.04:?EJMOOMJFA=:88:<>@AA@? !*3=FNUZ]_^\YUPJE?:50-*))+.27=AEHIHFC@=:87789:;;:98 $-5>FMRVYYXVRNIC>83.*'%$%(+059=@BBA?=:8755421 &-5=DINPRQPMID?:4/*%" !$(,048:;;:875321100/.,+* %,3:?CFHIHEB>94/*%! $(,/13310/.-,+*('%$# $*059<>?><:62.)$  #&)+,,+*)('&%#"  !&+.134431.*&"!#$%%$$#"!  !$')**)'%"                    "                              !!"#$$%%$#"!  !"##! !!"#$%!$&'))*+,-.//.-,*))()*+,,*(%!"$&())**+,-. #&*-/123345789987642112345531-*&" #'*-012334567'%%&(+/369;<==<<=>@ACCDCB@><::;=>>=:62.)&$$%'+/37:;<=<<=>@/--.037<@CEFFEDDFGIKMMKIGECAABCDFGFEC?:51-+*,.27<@CEFFEDDEFH86558;@DILNOOMLKJJLNPSUVVTROMJHGGIJLMNMKGB=841125:?DILNONMKJJKLN@>==?CHLQTVWVTRPOOPRUX[\]\YVSPMLLMOQSTTRNID?:778;@FKPTVVUSQOOQSHEDDFJNSX[]][YVSRQRUX\_aba_\XTQONOQTVXXWTPJE@=<=@EKQWZ\\ZXUSQQSVOLKJLOTY]`ba_\XUSRSUY^adfec_[VRPOPRUX[\[YUOJEA@ADJPV[_``^ZWTRRTWUSQPQTY]adedb^YURQRUY^bfhgea\WSONOQUY\^^\XSNHECDHMSY_bcb`\WTQQSV[XUU;X\`dggfc^YTPOPSW]bfhhfb\WRNLMPTX\_`_[VQLHFGJOU\aded`[WRPOQT_\YXY[^bfhhfb]WRNLMPU[`ehhfb\VPLJKNRW\_a`]YSNJHHKPW]befd`[UPMLNRb_\[[]`dgiifb\UPKIJMRY_dggea[TNJHHKPU[_ba_ZUPKIJLQW]beec_YSNJIKOca^\\^adgiheaZTMIGGJPV]befd`YSLHEFINTZ_ab`\VQLJJMRX]beeb^WQKHGHLda_]]^adghhe`YRKGDEHMT[`dec^XQKFCDGLRY^ab`\WQMJJMRW]bdda\VOIFDFJda_]]^adghgd^XPJEBCFLRY_cdb]WPIDBBEKQX^aba]XRNKKMRW]adc`[UNHDBDHc`^\\^`cfgfc^WOICAAEJQX^bca\VOHCAADJPW]aba]XSNKKMRW]acc`ZTMFBABG`^\[[]_cegfc]VNHC@@DJQX^aba\UNHB@@DIPW]aba^YSOLLNRW]acc_ZSLFB@BF][YXY[^befeb\UNGB?@CIPW]ab`\UNGB@@CIPW]aba^YSOLLNRW\`cb_YRKEA@AEZXVVWY]`deea\UNGB?@CIPW]ab`[UNGB@@CIOW]aba^YTOLLNRW\`bb_YRKEA?AEUTRRTW[_bdda[UMGB?@CIPW\`a`[UNGB@@CIOV\`ba^YTOMLNRW\`ba^YRKEA?AEPONNPTX]acb_[TMFB?@CHOV\_`_ZTMGB@@CHOV\`a`]YTPMMNRW\_a`]XQJEA?AEJIIJLPUZ^``^YSLFA??CHNU[^_^YTMGB@@CHNU[_`_\XSOMLNRV[^`_\WQJD@?ADD2EHMRW[^^\WQKEA>?BGMSY\]\XRLFA??BGMSY]^][WRNLLMQUY]^]ZUOIC@>@D>=>@CHMSWZZXTNHC?==@EKQVYZXUOJD@>>AEKQVY[ZXTPLJIKNRVY[ZWRLFA>=>B778:>CHNRUUTPKE@=;;>BHMRUVTQLGB><<>CHMRUWVTPLIGGHKOSUVVSOID?<;CHLOPNKGB>:88;>CHLOPPNKHECCDFJMOPPMID?;878;))+.27BFHIHEA=96446:>BFHJIGEB?>>?ADGIIGC?:64347"#$'+059=?@?<952/..037;>@A@>:731//147;>@AA@=;9878:=?AA?<841/./1!$(-146641.+)((*,/2578752/,*))*-035788753100134688630-*)()+!%(+-.-+)'$#""#%(*-./.,*(%$##$&(+-.//.-+*))+,.//-+)&$""$!#$%$#!  #$%&%$" !#$&&%$#"!!"#$%&&%#!                         9 ,                     %%$#"!  !""##"    !"#//.,+*)(()*+,,+)&# !"#$%%$#!"$')+,,89987532112245542/+'" "$%&'()*+,--,+*(&#"!!"$'*.13566BCDCCA?=;::;<=>><84/*&" "%')*+,-./01234420.,*))*-037;=?@@JLMMLKIFDBAABCEFGFDA=83.)&%%&(*,.0112234689;<<;975321358=AEGIJJQSUVUTQNLIHGHIKMNNLJE@;61.,,-/24567665679<>ABCCB@><::;>AFJNQSSVY[\\[XUROMLLMORSTSQMHC>964468:;==<;9889;>BEHJKJIGECBCFINRVY[[ZZ]`bba^ZVRPNNPRUWYYWTOJEA><=>@ACCB@>;9889;?CHLOQQPOMKJKMQUY]`aa_[_cefeb^YUQOOQSWZ\]\ZVQLHFDEFGIIGD@=9778;?DIOSVWWVTRQRTW[_cefebZ_dghgd`ZUQONPSV[^``^[WSOMLLMOPONKGB=86458=CIPUZ\]\ZYWWY\_cghigdY^cghhe`ZUPMLNQUZ^acb_\XUSRSTUVURNIC=74236;AIPW\`aa`^\\]`cfikjhdW]bfhhe`ZTOKJLOTY_bdec`][YXYZ[[ZVQJC<61/028?GOW^bdedb``acehklkhcT[`eggd_XRMIHIMRX^cfgfda_^^=`a`^ZTLD<50--055.*(*.5>HQZaeggfeddegijjhc]LSZ_bb_ZSLFA@AFLS[bgijjhggijkkid]TJ@70+)+/5>GPX_ceedcbbdfhiigb\LSY_bb_YSLEA@AELS[afijihffhijjid^ULB92-+,/5=FNV\`bba``bdghhfb\KRY^aa^YRKEA?AEKSZafhihfeddeghigd^VMD<50-.16=EMTY]^^]]^`ceggea[KRY^aa^YRKEA@AEKSZ`eghfdbaabdefeb^WOF>830037=DKQVXZYYXYZ]`cefd`ZKQX]``]XRKEA@AEKRY_dffdb_^]^_abb`\WPHA:63358>CINRTTUWZ]addc_ZJQW\__\WQKEA@AEJQX^bcca^[YXYZ\]^]ZUOIC=86569=BGJMNONNPRVZ^aba^XIOUZ]]ZVPJDA?@DIPV[_``]ZWTSRSUWXXVSNIC>:878:=@DFHIHHJMRV[^_^[WGMRWYYWSMHB?>?BGMSX[\[XUQNLLNPQRQOLGC?;9889;>@ABBABDHLQVY[ZXSDJOSUUSOJE@=<=@DJOSVWVSOKHEDEFHIKKJGDA>;97789:;<<;::<>BGLPTVVSO@EIMOOMJE@<989<@EIMPPOLHD@><<=?ABCCB@>;976556543357;@EJMOOMJ;?CGHIGD@;85457;?CFHIGDA=9654568:;<;:9754221100/.-,+,.049>BFHHFC48?@><-14677641.+*))+.13677530,)&%$$%'(*+,,+*)('&%$"!  "&*.256764&)+-./.,)'%##$&)+-..,*(%" "#$%%$#"! #&),-.-+!#$%%#" !#$%%$" !#$%$#                        !   *                  #$$%$"  -.-,)&"  678753/+'"!#$%&&%$#! @?@AA@?<84/*%" !#%(*,--,+*(&# IHGGHIIGEA<71,)&%&'*-/1344321/-*'# QPNNOPPOMJE?94/-,,.1479:;::8641.*&! WUSRRSTUVVTQLF@;632247;>@AA?=;851-(# \YVUUWYZ[ZWRMGA<978:=ADFHHGEB?<840*% _[XVUVX[]^^\XRLFA><=?BFJLNNMKHD@<72,'! _[WUTUX[^`a_\VPJEB@ACGKNQSSRPMID@:5/(" _ZVSRSVZ^aba^YTMHDCCFINRUWXWURNID>81*$ ^XSPOQTX]acc`\VPJFDEGKPTXZ\[YWSNHB<4-& \VQNMNRV\`cca]WQKGEEGKPUY\^^][WSMG@91)" ZTNKJKOTZ_bcb^XRLGEDFJOTY]`aa_\XSLE=5-% YRLIGIMSY^bcb^XRLGDCDHMRW\_bcb`\XRKC:1)  WPJGFGLQX^bcb^XRKFBABEJOUZ^acdc`\WPH?6-$ VOIEDFJPW]acb^XQKEA?@BFKQV[_bddc`[UMD;1( UNHDCEJPV]acb^XQJD@==?CGMRW\`bdcb^XQH?5+" UNHDCEIPV\acb^XQJD?<;;:;=@EINSX\_aa_[UMD:0& TMGDCEIOV\`bb^XQJD>;99;>AEJNSW[]^]ZUNE;1( SMGDCEIOU[`ba^XQJD>;98:<>BFJNRVYZZXSMD;1( RLGCCDINUZ_a`]WQJD>;989::8789:@CFIJJIE@:2*" JEA?>?CHMRUWVSOJD?;75445678:<>@BCCB?:4-& EA=;:BFHJIGC?;630/../0123455430,'" 95311247;>@AA?<840.+*))*+,--..-+)%! 1.,**+-025787630-*'%$$%&'&%$! )'%$$&(*-./.-+(&#!  ! !"$%&%$#!                    z=,d Background     Z,dZ?[7[C[O,dZsZZZZZZ[[[':        &>>Q            00002K% PSelection Mask[P[\-\9P\ \\\\\!\%\) `s(9libcommons-dbcp-java-1.4.orig/xdocs/images/dbcp-logo-white.png0000644000175000017500000003047511333570547024300 0ustar drazzibdrazzibPNG  IHDRP bKGD pHYs  ~tIME-e IDATx}ytUEF}}6P([Xb[=УGtj?h.9r/2 ޶m۰uVl۶cnnշV\>9q_m۰b L>]+m6=z`СX͛7_R$G 7oKbd3tPo.M#GСCcCR0tP\qNL>i61hƌy@k:dW45hԘZSWWgyfܸqOmmYl:tֲeLmm1hl޼tw͙3g|ԩSUUUV*SUUe]SSc>33}tӣG 6mZ`~3gΘo=PT.W/{;lڴTWW[iIc߲e?~5^zɓ˿/3nܸ@ZtO.qVC5CƚPzIr3c[nw-[x8t |ɒ%o]}'b_?~ټyF:t<Wy`^|EXJWn7|cN>mN>mz-Wt7.⻰~N@:t(Ѐ+//7///zرcʹF>Gfٲe|k<8p._x4D4n\y=>}:p|s͛-Y]]m6mי3gw} *0Z/,Fu>kk:u5L: > k~ gرffȐ!,]߿?==݌3WW죏>jKꫯ_mufʓ&zҥ^ݺu3SLڵZĜ9`4M4ڵ˓Iyy)++3eeeK.z ,ƍݺu󼟦NkMTJlݺ={#-- ף>>:@R~~>rrr(B(..FVVW[nx뭷SN(--U p8p8L\|ō$ĢEԱM4 eggcܹ|C~~>&Md[v-222G7!!k׮7sѢE0`Wo׮]}s";;;+?WڱcG=z+~/ "yO0ͳA~~ Yp!rrr,]%1(..:|y4'駟 4K,A(( 7t P^^n%e@*c?kh(P__:֢555Arr2:wTFhӥK{.}שS'̜9UUUΫZ5X_|>|M<ת*w}kT9:u;vj(bΜ9( d|EC!55sݺuضmfҤIkUyڴi^QQ:ϼn߾ h3~\4yyF`9s&91끱^e=w\KgFbbo2>"gl.,CϟoqQI<'&&zr9Cyq_7=ٳg[I"èAE?,R_~e]Z( 6k [lѣGc jjj|{2$ Z Gj/++ /_7p(/&G18r䈵۽{w3(!{Q $ob_B^۷5i\46L0ѨpsJ2 Zr BD"ů d90L\asq9Ś#%%Ǐ***B>}|dCP(F"_H$k=U~ĉ(((>;cl۶-jjjx3xUPrpJkM–a'zK\ w9-bkΧD\oS0u`LHH>]cÖ198X+.ťDTG 8}JBq^:۹s'zeE8x!0d<& E.M47ވ%KXu1dt 3f@RR5F-i|V~X[ʺG} D.@𒓓q RlW/cr`cy==pФ&$$@u"+ȵ V"Ґp%$KKJJ|e]7Z6899=~&J ȺV{9ƍDZa_ݝ;wk 7܀믿IIIo% ~iE1VLI$d^6^~XH+ ^]u8oҤݻ}ki4@|J`*1v1zh,_v˱|rp0pUI(**o#0^u3&.ILka YG \J%ΚB4׺ ~^q]g***.ٸ UQr%/1ʕ+OLLC=MH0ֺcv]}ܸq(--F[ Ѡv܉QFa>`CD%%%())@bZp!h"8U&xxZ+aQ<$br^Ve]Mʯ^Z]|֒\r<O?UەWff& dխPIZXFcǎ1}q̘1ǎsm?#5 ;wF.]qBBt/;CS-?#55UM\<'%P1],u9~5'+y|lSO8?~NII' 26o+2P՗H-T/S7nȑ#k.gY__ŋcС8v͛ zꩧ|},_;$$8^jj*>'0T)xwe\}y YStԟ s%.4lh*_YY|G+|I2*XXBs hٲUJrem<*ceee;v,n̛7. oc̙ׯN xꩧ`iii5kGy[&dw>wx:55;| kJ'=FA 7^CqX;|!s= _RM^Ǐ9{l\~qˣVUW+VLu6'Oӗ kѲA`9l̼fL2<&Ne˖yGfΜ{OBץ E2rM6Ŕ)S||QYY (z9sпu--a4޽ͰΙ35S0W^չ+5'\Qoə8pug~<{ TKMLVV,Yb-[`(((&z+goT^|9RRRgBB>UYYBy_ݲ2˗/-))Qs\^WT@N5 iӦW\}_YYQFaɒ%ؿ?s{n̚5 8qRRR0k,\{NPrp+>֮]3}wUKB >vC4O?(Ы WAIPMM>:Q]]> cƌ'|pnn. ͛ .\[0$cB4?e˖۷wߍΝ;{֊oƍQVVM6a޽j{͚5CVгgO+xA߿ꫯo[4i^z)`߾}8pl⬛-Z@&MpEa߾}طo{=@6mЪU+h w8p7ov0)) hѢZh/߿?n۶m/opEyVz}aѢE]o7|+t?FII VZMfгgOh38x }lٲK6mpUWgϞBMJ$%%!{ NNNn6`ƍޘ~cȐ!QF pZO}|(**[oyMED$kܸu\sK/ZVVf۶mѡCdddXsI 7_|wLq^Ncp[yn[B8p)))HKKxOQ^^]vyeĵɍ$MI2"#c~H^Kg׎A$ö+A'}a¡DŽ&,}6f8ظSy>ȮdP +Zۮ8xI/)=4r2D!+߭vjf R}/[9V-ʵ4>|JZ?0,97i\H+C^N55&M8gF|HHHP7PI)9KZVy+֗6R~Fsp˄'Q pP:D"vxm"+7\q%r{2ė !վ;\JNBUwyw+RМ?zr΃BZv@ 97)+ .Z]>NnxɓS%l͈ufXґ~"negmͨR) zui(]!(Gݥ eb񉢊T,Z|.-$dR\Rdr& ԗ.{qɌ.՗u\VYK!@3$oaȾdtρHC'eW^\4PjSdEVV(QMqPJILqdEN>W2jONٯI8yڤrEJ%\JEej;vTUJP(E ҊKC=uTPǚ _}^&?~8V^kѣVH1ydt0ĉ(** ("M.]\<$=tVKQȠy ΈdBYқ m˵KxoXט%ipymc>i9PZZ222cjW#-}LYWEӧopBO!\1X`д4+HOOW稴giO>׭[=F _ٳq8"/]]vֈriy<rrr3Ϩs!Ley4Ee 0bK\% _ѧRpJr DMڟ"rbdu) .^k5h_VkÕv^O>rTF8-܂5kX/%ݱcHu\(^oJJJBAAϣҫ]fժU(`ҥ֭Wo/NO"nI^{/1bo^eFf\!Lh2Z`,jW1˄UP_Ac/y%;;S{Lrr2>CdddxJKKq뭷á" ^Nx駭z7oEUp7zƎR* e9響'c!mk>|-?dʷ%8ϳb)Pց jG[im(dzv%=>9bWܬʾ}>^n f~#=rzz:`9p!zHKKSs*'iԩU_|w<"ASıDs.' ؋kCHd3D<V;Xz@P"ަ%ti Im=^88. Mh"HIcɂ4N|ۯ9m߾w9#I3k-\JTSS&ɖ2%ۘEKMM M$eeeY!'Wv wrm활ȝR[d >'OxR erքA|\hԒE=O*pSAss{. %^Bм/֣C?#l߾nr9!=x}n?;Zov-&zȓ "i|85`}PSS㍁+ζP=4&[nŷ?izN8|,ʪs~dR47Bܚɏ}Q(kQߒ|1DP3(NNNưa<>9x7޺ /LiP[VvY!֘r'CHٸ'˓^_3f@۶m}[سg6mdo׮L$~v2|rFUn% m[fXjUF֭}.yE78J03 J>$WXنP-[7{㑘h)Wޒ㓛r{JOhO>{/ڴiM'Nʕ+''&&+233-Z N0A3D.%  %17oFeeB]v;v,ZnKӷ)4&6CA%%%p^^zY&EfƥQ" ߹\ݺukwM4ANNݚ5kTJ\O>e1Hz`zY-Zp8e۬N2)rw}ת׬Y3$&&mXڊ Y&@+wu]?~ hkJŷ_ _ū`cƌ=g$|pOi&|V}zJ{ӦMqM7Y-Z-[XI~~a\}x饗b:qjIJh9k%$Ǐꫯzߥ{P<5}Сp6m=2W^ݻ1*={⮻M>^\9r{ԩSѭ[׿AJ"ǔ=y<8-!9cPRRo6bرɾ7$K8kɓܷo1yd^޽1yd^W^۪?}tL6 VoP詧B֭[2ҫJپkrr F{r$T/s<PoV\KNNF۶m-k;0`7o)5 mUUUUߵؽ{7LbԪU+4k\srrP W)"jEj:D{իw^,9ݻws?f@r;d۪U+ 2;='+Q\7֒^xu/tɳK~!$'+^DiODEw zB"޶+De}߸gKIIAjjREFnHvHpV[{J_~PڿtwyI9`$ 畷L2t3/oos0˧ B{*Ѳr'9гuhiuoM[ZY~ A(?Ѣ)k[y=fct\!{x ZΓ+{, (:,ҀHby^TiS '?Bt#iʩ{ue2$wh׼YHpZUKJ-ICӤ!\JIRbN" Gpŗ|kwH~9I~2͚& y.jyHZ+0~RWFaŕZ*)}dz;=Ԙgq]^e(yLy0BڦO%K2O Ǖ cQ0cGYH-I4E6xX+@@$Ap',D|ZǕA}~x;A4oI1hFJK0 g%㡟30C_=tϽb԰[ކT|(Aa˳R(I ˽\q+y<}2.xO0e4A'x"!˘hUd\l"}rʩ` NT( 0eK[[Ӽ$iH5 <(b<&ԾhJ@)3Ak-kkB05W|* P_=M[2ROWWgF*,$&ܠm3q{'b克\r:f7.3cg?gV?M{*եryG~O\I`5va|5˺EO 6{H1d%m.p@MWЦi ct2c:Nj^ߟQxgb 8[sX:BK.5L攡3M_^}b;9@Z py/o݀8{v~#>oK\x]o=978y[NF#]}L5w6JU չ9I '+j8nEvh=vs+-tL,S©f(YNwkV90bo5@g0.5={`iC:rc;p+DcY*j3/Ь{drO΅>=Oި{gs,8ewWeܠSO\+C>;"/Srnw?/P+7_UG=cؗ:0;/6eT7 XX8r'|&5L3vI{ۣԥWy@|6Jp,GxMNfTx{WlGȃbi-*COthG2mU聫#>씃ZFT|iR+;hg#fvS>lal|D1(&ow~i'D蕈'3Ff*O8Z+cS}TNF$i3SAnub3hvBR]"6I\ȄscM,=؃H4R0@7FS\v@tW'DnAsN6T[X|&8.he<'mG{ʗ4X-zEjAc?lnxB ad`*puNuFS6Z2VSgtdh֑0&zx IuB8$Ƒ' z#POPR!t)YtCWevd:,D٨JeZV~H1H{oq"pwo\q[q7-pdpeq pp b9 bKjgV7;RdIF42UJmV#62. S"y䲄9BA%U7%0fv|?UH 7TQ39i~r܄M)2({5X9한w*#%$0tkh7pb=Ԝ+}Mg靔Ty1%%՜x=a=.B0R2a.x1B s /!`SًIx0"ZhmyRMT>x,W[3uuuTob$xI,[@BM8H:Jg7%%)3$.#y>?Ԝ4f(_)_.j( :Ȕ3WbN衙JئXysu,&4=UN64XvTm;/Z S5IR)wL7vcGP'@&|8*Jz9WB1DTe7S-$sW) iG8:UȞhr-PXA3j19O;W;HO .:3v9'7qrwqږt9vqa'hIriznɖ˰[Q8:hdNVT%Lelu%"xV]DYR`g:24EHlV<%g ʦQtbN.ܵ턘*EWMe܆53n00ݵhflY4F4u6C:ZzÁʼqʩIM9;TZVSb+cxS-5/v?Dc۟zbbd3Jt;D lJjRM*t:6S<_/st %<8[@o3t9:Lc,ڞE)=U%Qzk2A;`/e7:0ѺtLxHf}ċ6Zf}Ǟ2zt,Ү+\n=,bdi=eyźK5[OгŐhiZO0ͧkncۈf;;=<9`mHm.^-a;U0%xnKs; D'!ӫ-G'Ӽq 88lZծbR߂+bdgk3k~FT^i2,G,݆mX9QV(2rf㇅ƻ:C~$ukGcscgyFc }U|k+8'޸$t%3[e+$RͬVȂ4e޹>yGv/x"eȣ[D f#37Z,.L涜o}}F:u|xgktꨫޫ>3*~˙|۷ .y3<:7wx1KNE#N T/a/,_r|=4Y'{a=zPቿKH N ̘\/~ TE;⧅vДUwI逝#, 4}?>v.HS*>U2=1@a2R)# h` j8С%C 5\\hТGz j!˕*c\Id͘2K\OA%Zh50˓*_2|T dV,ijU'Liom[l=͵ { ]`ߒUZj)^2Caqt\3\#yCE1ȗ?&piD|im#YF7­Rg;;s]޽wsѓ]*Yf8x/)|˫]ʟk~m,.0M*6ʤ A =ԩ, J8B-)j$8`($M.5C,otND&` P<,+Bq;vlwz)r@ CH#l3Ml/0 ״<&Z#p mN=[I'<hlq!k$"O][ʫNYlQ":Uԏ|K4\Hov-cNDiSKM&C|7%\TDOʅ(Q"(.xʘB-0ey#rIz21}r!`CD7ud1j jTsreQلgwb fG6 c8,5KdevRUA$ l(HJ~2 (sG?./d!E ~:["a_dCaR&s&5r7 ~{C&sFS#G/jx'?aT@;rP qU?kaTEbG&a\ne[ Ү Md6[%5˜b&{JURJQW#jd4JfBt*]&mx$>{ϦjǓ٤jvQ*U,3"*o9VV)QAM TG=Ωn?kK(J #UgS n4iLB7=hK)^Sr;{e<̞>K:33@2_hPھ3ԨE̲>o-`R2>($;Z :Stոh+*lrTUV;qK]]RkM!mdвХErɈC,TMk_urr8cR!E5͘l|њU^<R *a/R)&_Џ[_^lz :5}(n_lǶCF5 o%$@f- z`әe\\S5] hTEQ*ji؆Y)VZ$%BKF"Zs0c=YuC}#ԷNSC`=*fE &zxb7Muu ڈu5VuPy'*KvLܹIƕls(_ UbǡJ}4SKdH/BG 4~&㱃f@DcWCr#vG&L'`WYzU?۰@!]; [:Tz݆Kʡ{`8bPO!G8Jj%xXwsV2rm$i%9cyW-xGQS?:i Ք㽽/+\DMr4 tХs'餉kgզ/@pw0yvN{7<xC~w#o<9Ƀ>ownciSt5|zyV$5$ #9PVә#Q6~A=qKA rú)ќ I4IsAҿ@AS$87 1")i3)\C Cۣ5{JC: xS19[A೗J[r!x+Ծ c+̕Jį"0|YfC,ADrăc;7|ŗ[[E\E_E`Ej;a F`l :3,4BR5EDnt+D3"PXB3$, bJ4v"ӱ=Iܑ4: CK#?]D\,HHٻE ƀHU( 4J8j|+35W<-KGȜRP[!"ZS-: k526L6D-`X θ܃APJs \dVC(>K1ޘDZ$4#3铐݉5޳)FB&{sH;\}ۚFq2IdG,k& u 3# Ԓk3,B>"#yLt,ˠ2Zk FWDCCZI o*>#A ? 26_\ђ*+&ԭBP"͊u<+@ @*,- pXQ0UyQīD{,d@71uƾ||3̓d7BNڶY DX?DNv;LSRdz.LbiWS`RJ)  a,iDIEP- ?K@Orէ)ڡF^CcQt~bLtG)G͑$+͏4+AY)0]aRMrUy!u riKr;m{c9pL;3ZO\u$sXDDl|Sd ՂIFM3L-Q@)d*CTlryx X-s5ڡ`-8Hʈu6ԌseXC*\|KzXc 3N5/1؂ X[[*R(e)8;q퀛 M \\ܖ})aqC,ɴ#|D2}>ѽBtJbKİ](VX%Zik,sX("4BsbL[2bE%Y \5TCUT/FX1OrsOiܣZZXAn*SBH%$:Ke#)DyD8*"DŽ\NvDQrJ8Rݓ[xb"M8Z:p #~Eׯ jՊS܍tZS a8իL\<`Dﴟ[2 N{=74:>Oٟ@&hF7$)" -.Ia> #ma ոK'Dxʺh%إ%v$ɪZɜSǛiL@:Z(һ=1qtcUK"9?!z](> -1$ґJ:r)] _F UPι̊ɛ-3ÿRY%SYdf@'9 B)[`=3GDC}'kO^rTKVl5CxVE|KL\ٝLגAށ9{`dNIM1k=sCQ)D[ᬣ*Bˆ*2F\hzf~}1:RZchwm<PFf Z AOիcgP5cYM֏ڒ1b%{bY.BK\=^uF"]?_zR}Di6b_e@Jݲu Wڅ 7'kLYCl桪514z#zTN1*js2K.6Ms.G ð(lle$ڛ@4k[:\ۅ6 iJi7m7lc8Z57i:ɱr4{ )mgXr@wIQraF .Ns++<%; )h $txxd-l߂_|37_OzS;8u)&£ʚarSqo3*0:8q4uܓgz[5fBbcѰQ9z{Qzs~Ih㠲/qy׫>;eH+j."iW`jX&i"qkl}L/z{%qVpl2CmeʿQ14j_ՆV@&-7hPo 6@ &D`CN(E+rQaƐAt(qA*;,h ^j$H%Cv|PÅA5p@9e q L5$ɏX^bbǒ-klKn*i۶;yj %HjlԈk&W]Ժx`Bg'SlYeyj8!M6ؐt҉q{Ek:"Y0J穹iE8e}e#2#%inWRB^{U&iY8*覫0j.ndUv׈uB٬%%S2# .zzu.7]Hd &dP1wl(LYp/ gga1n~&"{<~9;sUmtF] pwg= 2ؕ[4p}r*]rVҟ.OI&Erי7Z_Gs_9!kn[~ A{眮Wֵ1I*]3ˣ[&|~Љl9"xy{vħ* '2MO,*NV'WJά򕺱Q6VQ2L_rON/)lI"' Q}>"-fqئčPK|"%Z4 "31eN] _-Pe?ɎlIrG (Q ! EAQ-nIνt4$ "w*0TƢFtJQ\:$oF-Uv#c ᤐBpv hGL dX8 BKW 538lpװ̅09v0#JBAuN ſӝ:eRHI= ҽe,?%7YGcsA1}_J" /`"9 uh%yIJvY(CR0F)M<$>'X'&O+ʛ(aP$Ō(:51 ƖBl}zjaBRo3+6z՞u]6gxQjm椊DZfǺz!+UljU֭@TSBή2?U*Scr|Jc+'Io(bЀ̶ pmsvo{+\v5nqkwMp+2m@skB7ϵXGF`>UZ,Kyȵ'{WׁN+F,bO=cU`}0/l$=N6P΅J0bɦBѣeHHRlg̑WDq1KA1\%!ǩlHRyTy7|6e܈vCIrR)|{ $ ׌+ʚ6 L)>w_}6UQS6oɓ*52|kj== v;9A)N a1߿ i^@=a_EXH`a_b[ 3}Nѯč_d]0KɞjۡDK[Db}HՀGZЉɠ`Zǧb\Z7em5`D=uA\D]I ܇TVQ^dKA2yW͞x`-mUI6o ]Ćt}ٌ#kՋMDXE689!xAY`%N \Ni"~Pνe ]\M$#RRHazF0ιgqHi29@t$QfNcD !*"&'qO3S!npٙ'щ٪hV D.! G^^#LX4&a ב)Y'EHњ%AQ,Fʸ0wpM[1t0MIRP?!٭B$aےqm=_a#:A `A#c7֘\ۨM b#"S#$|-#EkHO%1M]V$qqlmenƂlvҖ~˞֬vj)\ ,a͔#|lK1>œ >::jH,fh-8i Ec0d!Fվ-Q,[mlgQd;cݝtlL֣?& nVmkVn'|bEcG}EI֬dn mƮnKf. FC]]%Vޅ( RB.l&^o,]V$Kы$Я%j5JoVjbnzh DV]ʒ!N^JFBoRnN0E -EJNMf\H&h`뀩2.iR0 YlhܗM(n7PWj`061\0G::? rO'!i{*[\ZaW,E/3iogC q)(u+1 Ԯ@q12#/*k{5xL:2$?r#G&c%GG&2 (py*7NcҶR*ϲ,r*G(E";qsuv 1sr%svuWqAW:Ws=3uAs1+2k52S31w35Wm /e=Dz293;;3Ka^HSEcIW/G4HR%t&t4ӴLKcH4OL4P{DK4tE5#5/SI+5TGCK*GT_2uti5Vgz5X[XXYuu)[7[s\/W\5^uu^5uXS_F[vA5`b#v;6dCLdo]OP egf^ogc8WA6isiwi3P6i7vjkOkǶ6mlsVn߶osokXo6q;q_:7sksOIn=w&wa7_ug7v_wnvw7xCy7zywz{7|[7CS U'&_23'w&0mҀxw6P.838'+}mO*vxz88wچjx8w'Je0d 3r%F7٠d1α]DŸ$Y]O *}~o1hG"xyzjQWXHg)Il BZOrf7 $lOi+sdE1'噣k{blǬ TĞ0bH0nz O2- b{\:OҭzdxVG.!P]8._~8tT } ZM,]ߌ)%xȑzcB;;{h2,^!zK`oXN쀩 p.0[ǥ9Ȧpq>  h;è.."=ܛSX+=3dO<~ 3~)M{+uhߘ닔,yOcA9}.:~@\K8񧽣~/~u, ݿn6lP`B 6daD5XhcF9vdH#I4yrI+Yfl`̅2Ҕ9慁; 'PBy 'ϤJ}8ҡDu_#BL$1&8MܑB#YS ϩ>L1@*=P9:mK2 55 aP.j,mGo=UB9,OWiR,yU3EsUв6 j ZE6Y?5V5D=tRt"3lmUUq& /RDM=6ZTW#v}T^饉oR_e7o+&!]&8]^EY饓nbkWf0UUKSŗ;Zv~zfjvjꮧv6;쩫Zj.׮{ovln_\lkU\#Rl= gapS1i&[Bwd&ÙW0*NZQ>r40A$!C>h"񈀚P d0}e"aÀ'lNrW6al׭h4ʉ9Td:7G;q!i֣4Du+H/5"52-GlL^&_&FS #I)PbʜW ZAdUj%-Q4}ga/5^G !&$Igߨ9MkVf6m~ӛ66I=/U!SaCvi2?2N\񙭾C{@!a`hLp2,[eBPʡKLƬІ.Nt4(Fz40̠I4Y#5pw*Cq ; ''Mo294P:3F~ ݃d g^{U[窂6k*lˆuO]9RRmb;1L~֌fO?T͟O13dZX&40P}3W(eHֽ>x+"5gb,Z4NFH-8y>./hKH4q轱FA ʞJH?D\*RYhS7=Bbl&&n,=Pa`l}HR Y,IR|i0 YvG(p"ﴎ,kp]l@ ̏ M=+ mdI2-&Rh* 2p4hPD zjнξ 0 в,Ћt/R+Ǵٍ̼#wCȰA0,101t '`C+.K8(pj+8++йLh>nW kc2.E P-Lv,&-Y L,+K <,0њ"{yr*}Bp1 lNoqt/JwklLQJ*FrBb~l| OPNo ( 7Nb10 (#dJ)DU**D "~8 *ga1ϊfۈ6mxCF-"V-b8(irR-R]`p?p-FMiܐ`vRHr.HpE产Dd*E-4an4E j-}1(PN8\ED1Q^ODNH~R$K $$9/51=-H>I-6l:$odP(R1K,K~3ا4S+(HRXOBfgp㣸f)).iQِ’,J^ -"&> C9-N o69J,FblK(C;TtF> 6.1دZDVGD/YmE3(='6ë-bu) (,*C )E+9SbYD..%dZoZ#B[, ي? yygjj$ci-z4Fk#k=7vB Z/%ezBe/^'b;]cr#M /MNOmz[YA,;e֭/p:-y%VN1`æ5c/CU0hy :wϬ]CE CH/1Jl\bɄ]1`\9>b*)R.PO锧q)5{d7^w{DEAs \z91Ĕ Uqcc9{=,^']^^ǽ4JO󾧎_"]MGOyL;?C/ 'JA/AOu_kogOAZ\_M#q'mn#Gk_m_?EoN_{n3?$_ <0… :|1C$Z1ƍ;z2ȑ$K<2ʕ,[| 3̙4kڼ3Ν<{;libcommons-dbcp-java-1.4.orig/xdocs/images/uml/prepareStatement.gif0000644000175000017500000013632311333570547025414 0ustar drazzibdrazzibGIF89at!)!11!9%B!JDJ!B)R R!J!NZ!ZZZ!J)N)R)R1Z)Z)Z)Z1e g!f )q&c1p 1{+s)!+13)536R!N! B!J!R!Z!J!!R!!1!)9!)B!)J!)R!)B!1J!1R!1c!Z!!c!!Z!)Z!1c1c!)g1k!m.k9s9{9{!19?H)R)!1))R))B)1J)1R)1J)9Z) R)9Z!9c!9e) m)/k!9y!>H1*V-9]1 f15N5BZ5Bc)9m,@rnI^`kkq{ƔƜÙ˙ΜƽʥΥҩֵֵ֭ޭޭޭ޵޵޽޽,tKOa…#BDK#okH?~Pj׮0)ƴ(&͛3sԉ>}Νw{*tӥOBew$}UYf|+ԯRz v!ۨAG3ӘݱxUxr`ƌ[߻|2/ǎ#,k6xuB\ꯝç;e J~ $xF~\Eo,xaǗf5t 0v (;c{' qߺn%hw\sسew7yug!i zR;WnvWmWqM疅m_]%8jz-Bi iQAumF'#߱gs8czYj?c;htډFɱ)ob#nIͥmW*z~٩(qDmIB 6PUe_kEaI Ցs`ΑmЬ)驸:QVj걿;`%ufY\>!m+..;иkZ,\'Aoql '믿>]9@hȪ;p 54BR4e2p0If/z1 bsLXouOWQ-i:ITW Zjee\X͹I*r?lKV_ǍZ-7KZko\iZM]g_!-Ob=7z7܆8Յ}x ~xՆ'](4`g^8Zw{:^.zޖ5ުkuz~#֨ε?"`s9)YB;ͯ.w#W4oJo1 n>7^{ `%,]^F2%$IRӔd{_|/yL]RSĦ0S #X Vd#4kAԩmLGG: PD;wZs (( *xғ 4> o|Ffâ FHG*ҒhGҔ^Jld#7IMӝ@PJԡh6%hQzԪRVjIAftS=RUh=Z:RԦHj66O|dh^ٺ־67QC\ZQ:}d RG#a GFҎMjWZ+ (S) pKE`#؁ FpZM#La S T&dMzUk@ h`jXgiT037 0qFL ;&E*o pv;N! L`!(cHqɡ 0UbrX2r(\f r3N&;KVƑ1TS@2.{9a1ޠ6.6L*ϧ0iINlcCeLg1 ')ƅ'M/,s@ |3axcԣG/V ^իu_MXԵ=gX<P;;$G@1=~ qОueMZK՞m{[(nnn7-zǻa0Q7Mo.nh"̞GxK򔟼3b1ayΛ~󨯼5ηZw=q `qb`.\ {(|"L6@_=zuQk}CNo|Otq?E{uwpWa0aI{kw׀agt(x7`W j lpv S@H)ȁxX/1(3F~picbꆂ-+HChHGhMȄFtV Rgby: A(E.vwu .h% `uF'n1b(IȄvDȁ{5x`h FjgLG  jtl6jXu~yGo@X@ lodR7\NJ芲XWtx#A p(Hxv@~FhP tK&lxȸ،8uWWCha@~FXXxxP{j ,ftHHȐy&nsl Y0 aHlζjqφ DPX 7FSrb' SG u*iV؍A(Wl`nDXK XIv~ht|@Nqɔ+\@9yj^_gf{1Ћr wYaqH_gtH1Q qAУpJٖY(ntSwt^Həojl@W 70 I|S'6JiК@l gQQttXjɛ)YJ')ٝ qij깛ɞ9RP%ɞ¹ܩ9ϖ jéٛvt *% V  yj"J* I&P 1*4'{(*z%z'z %I{=lcؐpj ڞ2-z:ON*gʤI3.ʢ#J j> 'P ~(mJyY A ej('wpfZ|9'5DI雀JS:+ڪGn>zgf8 j))z*v .IV`ڞjHʬs 7uɦjy *FxxqI"笞|D٦ʢu ?3+5(x* v:Ίʰ+˅ڱ&[,{utE rHyj` `j `C FuJ+ ` jfސZdI ydGYJ td[ 9f+x?umKnp kpYf{Q0 'jF|Njo˷Hwbljq;t K Tij0 qslJ&?kJDȴf`jdKfCK[XS(ujjǩPt+vJ۴F{LkjN {`0Ii,H|7fK$K p{?; kCk {j [e{BK$bwj Kjk #t[ H0:+7YkVP`j@Y)wQ Á볦. +t)(Z›+c%\¦ 2|¸&j<@4년{nuhVƶkœ[϶n+ɋkF}*VCJeK391gS */Cӎ?6EѢX=DpɐI(I䃶O?4!┈ҞP|(9 $zpѫH <,9%DŇCK~H@R"U$55i%\,KE~?$.?*CDpIn҄UPIHHQ-NhBdZN15UCNB4"NvjLN𰧒?8񣓑&CI0$^܏^ġv`$qzh+   X\jqlm͟^*(l{x1nY*q $ K$$z@aeA:YB"T#BED}tuN"إO ED<$A CP"(BO!C(QX4& b!¡& ]"+Ѝ;Bb)Z rEQRzqC#,A+Y|pPD/bCDX@!@ez=&*G0q\28"{`!3"KkE( ,c `#yhnCթ' PzcѫG87;uvױpal]҆q8Z`%Ú{\r0򖺺4W$zjğm g^ q[^=WV}%(NtnsιDz:DGnр&Lʬ$HHHD2 >I;Cj M~p$*: Cpx"Bc#(/$qp &"3sR!KT"H'xz5!" Ws>a_{GA aŜiá}  ;QQ ؃,Ua=p 8nJPR\ O"NjOtU+3g \b<\b"T<x p!_<"yYb@8*!jEgO2cyMѨxO܌E2{"<&5{]ЉyHa BC+<{.mNX+Ԕq}BRv›vqސch@& }}]QaOdUqTyG/ G1m\UI^$%*Uġ:ɑUTԃl={T|tvXxy6IG( W~Xs(^qU{-?ۥy8) _ zC8կ2>=̃y D"9! $.IԙN+>@K6x_Z0*@Uwhe+\1(QU &zAm2[١X[97zD(23Ah(*s(yGHK挔#ؤ8<3ֱ<VWi)ְ#o:YaFg 8 +)zx I "`*κz0z7g,\\h @a8LBa$R~ȍtўv,<C +{Cr,(- 6@Y*ڜ⠙ ꞜZ(W0@>[; O<MKa#@T8?C@;2S,A6{z Vh{]  Kpp)2nAk) [=f j;I hil!|G}41~|G|;#H41,~E.-Qsss`rP|pR/Up<Ќ G < CH;=aϬʪSO!PUQ(QUP[UòD4řT=2 |$I;XI7͑Сhk gslÕ-RS"c @{ZWt%Aay5wxWw5 TW;tutwDSAH KAҨ=6؀}y%:%A(ׂX);X}أ٣XYuT H& }6TVieVǠɀ ښ hID{DH֕5eHE+  zDdHENT IhşhEېؤ iPԚ %٭ )Xu4E~\'u-ؒMѨUqAu]zUyU'1 s#zZwI;|:N#qopqPcCViMSz-=ydUCq5_~U@0ɩX\QR(`$[M]AF( ^ ,Eb$ú]l Ib`928%-x]c9Sb4ޱ*\8^حYV[b >P"TvTL Wtc5:B_U(`cˮx]ڏ)uF K 7U QAI%ۣ^vܽS 1աu%dQJ9n4eQ-\f\]WPHdtB 9tSXZ庌Q u"r[`Ob& u# f `gg6U8 >[a]eӾz9 ĊSE9h3mA`~2z'f݅x 0NG\&kcEHh8C>g%9>UlFƢF^M KauOE<"U_£* {2xZ ^0ՏEq0mKރǘB7[Sn=k=~kl.ܚSՀFn=znlgN`gO eqy UX, s$y^~ln~lt|Nnk 9.콶mk.>kW@MJMzߓ[ه C ZZpt'^ eԱ,'^')a ~bȫfe Yi7s:msDa2C3#=bf2ؤ"e[j<1#`A" 5 +rD&1Mk"2t' Xj9aIGcY޲Ҏk{[Opqpc93@d2RCqZr2~:B1>J83ZJ`2B#h`+pĥ=I|#¬\hJ[T"HH R댴;h,7VPxZL5XSd@ }>zV0JkZA e.d 0GCqᦷR( wVqʚcTdPZfF/dF=J{9ow̏gUZWDL>́tHu3KG;h|fF1Dcщn tpЪUǎ? ?g}hLSҚn5_Jz֮hGctsmX:ľt8Ѝ?}##k}as{6{=DkC6]s;F]3{/ z|&c 8%/"=E 'QZZ;IMYD^;ā6@*>V>,^ V V ݌" QUVZd7<}x x_XD RĮCy!O!~!ڡ"!E!Z # "#lS$>bbb#fՓ}-ZKd)>BԊdb<3pdrb+ (.ob(G0Gb0dЎSWQq!B&b!*e%r ^Z9c&;&a<HR^>FL|ƒ7AB#;&bO$%%ʣ;#&"4AF ?n$IJ$:>j>z#CRT#G$M $(b)Jd͘ _^ԊN,"B ƈ .ڢʈ SL\-"RcOnWZ`.#nc>#c*=[d&^Xey!Z$\=<=d#$_f !"az`^!2$He*⼑aEZ)cf$:b$Rg&=.7L$hfehTBbfVk&ifkb7ojf=&[N4X{4SؓtJWI@'4Fgvnǰ@y픩5cn'zMdR's"鎔sRGuJO^&:w6NŘi# 郊f^cO]芲Ga}b}T_(i&{桝ibąa)WY!j(hjh~pfjm:l2=vmC&ɶɂ,n,Ɋb޽fvhr̾,Ƭ-͆2m-眖ʐvEOJ~2+Bif+VnW^'rَƗզFVΨ-!ޜ!J<:m:䢬fU)l-JmG6(H5R)-f&,LRҮĴ!FyhGn. o.b"oF[Fxt`ElR/Vo*^j6"]J/!EooF/ȟeC@Ư// l6jEHntzRk~TObq'dd'N|N**/baFD۩Q`] ߯)fl]rzfop?h̰00.&fz_ha"fgL6ư_^Gίr1qnVgoޱq G /oo G  2!!%*\2'WM'p(C(){2*2)'2**,G'r+C .۲8 Ryz/'!$pl쒰r2r&~, q4C4s7Kr$p lw383:n[ rv(&;EhÉvvhth>s\ 4B(eB 4ckCOQ>SQm4GR+mGw4GUH4.U%1$uJH4LtHtG1L䱃jBz,P8Rt4z4Q'u#>iRGuQs&>KVk5AJnX$V"Y(}Z Hdhgu\5^u^ߵ^5_ @\ӵ]ib+vb?6c H D L 2D[u%'=uZ6iYa[iiƦ6kǶr]lvB+7ⶊ|!ڥ7qq)rrs]ݺ9wr37q;7wg7twsm9HT'G6{u{6gK|o5DX}oᾎ5/87?x>3@8g^4]Fu}[OzE7c{7B*6%7Ǔ*ɋϷ9k1o&;p9E6ԁ6\+y/{< 1+KyWl ?X]VR% W2|CF*RyR3X~4nrv6A6q,*95ig5<8`j6u;rW5~#`6;f'欿`^#R?49*6qxwg:O=}?~C4s#Q=W}[^$7~{`)C׾-%6~Whz#|\RlY47R QV,~wy'W>C=ꃡ3H;nk?!Vv@ 6tbD)FBx6[ݿs +4y?de/cœ)M9y HxOȲNJt}z*?(n1e?}izmZk^ƌڦo^qU.lQ% xX!b \xl97pac3fX!b)uuzifدF@kʍ3 taHg%6;o򉷐G9F1t.>~V󛊴fp҅:\~~kj\Oۏ@+}؁+A Z51&ې5bg6;,!G!@Q PFc ѡBNJl%r&l9)Ԓ,\O't#0ч#\MB:-,vTjc bdM 54D@29A"P0)V V^$oĪ#xP`Y&QzzKd p@{d 8C9\5C*2A "VCxS;(iM'*h.)e$P9de|xL \;j$d8u` &X' c wMH (A1dDc8"@3A e4@; Ͷ}(PzpiU!!OδwѴ; E:q܈zz1TsKe`oXh#ՏWfXu_KӼ芉8aA`٦Li?x0Y] M&jG6j*$B\PD s, ; pmDU͒b #XM G`xMJ5f2HUR0Eb{ P,D:I% uY8ɆdiuV =-&y%ElLC:!=f+z5R%|p U%OKS;m< iS#\67:y48FeM_LEYeI $y;".s]櫽SAZ(U G* rfm/qlyt*ECVᰁV[2}M=b$eFr`gPUf88Zc )KQ%! :EG5q ʨ7!/ؠU( oE G5ywӞְjdG*9y^=crQ;@<&Tm@L!dV-E\[zCNAU7z#2-=z-ת`}8B69G:x^`vPnTU6L`BnUCӶz Qqb)EE"%RXO#%c:| JM`')6.gS6D4<00DH71*OJP36l4@T&VdB|.ހ/\tzbMTMX4mln8bAe*Ioj klwX*X1C$bkpNDŽ'ah0rԤ&I%3^DDQ3_U^$p01BdD`NIBHIrbzIVtt'gNFpqvk$!V``>f x7 gw(+N.'%X4+XŒQXi"4h%F|hd* E[&lp|0DfMdbD ca8 C gF<[I:`#B\LXHpCLPn$Mf1-RJ%]" A`7*%4hhlɮh,(r ɂ(ƪh2vǜ2V)Zrv (yRJPuiH0e2@&   T%mF!4er./aHSe2!5 @bYR.%D9xC3tZbkM\H5OW%Yv/#Lڨֺۘ| r|3ݤ֜ ڞ87{S٘7omS;m۸ r r:HH__`bUr^R1c$8_:`H/1f B AM|35B3'?RqoW~nR1F4DO5U7%Z ^ ` n T Gn^Tn vGkt@ \`rR` t舎T R@G FstKnKUDt ԠLNvG\܀ R @t.z`d @h`G 4!FTb;i1Ն`Rrm͆mZ%!0"[S2&FcT# zr21T/^E?Md%a7(IةBhʠ$-njR)(NJNJYPh~,Z*iY[7BDvz ͓̊ʀA<l2/':p%!;0f_&B,rrU7ePc%0PH;\I~&܄}#7}3uA^aHOTZ&ӧQz5X]:= ԫ˱l^5R-j| M[P~At#?~4Ōk 9ǒ)G 伉ƴdO[=S*_E ;U~#RDu6Xz{I}]>~_ |<S;؁Xw>Et]oQP~v>ah"O(XVr=/HS\U8M6.΄iSu) w8ꔕ?3%sO&V$*_W2eG ה'mhM'@cSMJ,.Vo4%N;,hlԎX*^Vr/sNa,(S Xh&O?~t~ɜsk|a'c6OsP%6nn8cPr軚Z?0S: O nSk0r&-Y\Ý>d smIņ:O5Weg|9Rs\5*Х n; N&:.Քsrw|$UIR#@Iw,| ~^?/}W)%TjM fWwTh6wYƶ~R]R>BS @H4a r~c" N됀,/@ Iн}@xk?q)`k c< a.H%NvaT&&$̀;IV;-!QM-[ԑ-&%M6%FtEPVٲ;=ET)xP{ Ҋx&JMɑ%OBuzf oXVCS|#u setnl'-m#VǹN@4rpʋۑg/EuWkb;0li[iO|S(̈́˩ƝLr@!tɂmBjfHl7GT%JRȅ_WݎڈC8d]\FBIڑIf*ܥ~N~*9j%̉x~UBawm I"1{ޫ St}4n47xJAI'A;hC aEzn>=V&K*RxY4>' ͒Ijih2XTL\θ$kU1Xltٹ3V˧J`fiy3cG;(Pۻu*ZЯJo$g~LL^Zn7* 7xrgX6iizNV9.*Z/wэ߈'yԗ6shޜ/7`ow6 NX}ʼnJ=s Mn1ЂuYh6y#Zt,˙NוFZuW1R3q*b~ʫgfXJux+CsjgG'IǜPߜ툯y^1;>C;{ܠ3s M(V8Fo~rnW0_xCZ?5O0J.Z!GH0 MM.e&/Q/F*>.JCd8^`>38N+';k~e8%vvtG(iwW 04 KVfa*1$QCA8q!P` gR"hdOA/O9vFF1'A ?.C\zK1/sd%*Q/3uXm'(k)ts]Vh":4#N$OG0IHONAC,#+ޡ `@ 0#3 @Y4Zc,.3S"#!ɕ_3 8Zu׆(7Qd:͒^9hLW]'jڱ%5#[Ii:`<Ktn!H'By<(iA$qQ 0@CS/N  ?΀<cSyybQ$8(SΦ7ׄhqRĔmmmqd1L"jIW/#%&iA'5GHsYY3 6CSU!1 5[ @HeB$%=4B5&:%t7ʝ߉zz 8*7!AQω>ERht0p9Mq_ (Y/H/F57S4TSAN;;5DDSu (jẐ=Ox9W 'e\|Wt)pdr#[ +ٕtnn6 z=c֐+ %#K!K: 5F \(gr`97Zmzmdz=c0w1$h/Hgki;) bOB;[4&b2\nvjQRK(KK:qyuv@+Kk50P * ژG9¢TFyBwZZZL/w뻿΢@˻zQ(ۻz n (*Հ׋ \ z(†jyUDgLXVech/ۼ ,Ll ـ \ + l 0  ;p ܼ 5 ذ+- 3|5L !;P5 l|wqF? _`VctFV[K[{eZkԫ[@/Pc,elfgikflqTk"@vmOPOv\_POTw \vq}T)`kq|ɡɣ,wL=?9н[-pKPj@^lKM@H<jiW[L}y;V,K\ lGr་ v g4{ ^ltAEL)"Ka'it)7q)k$ex,.dSie+By9cc#M%$!+ҵ <88 4<ܹPq k8Vzz' '+tJ-ɬgXK}ZvrzF1Ma$"~$W&qzq=tF[]{8zUy}owVbq>Ay4zMc7$b[Qlж~0yi{nJ7to Ѐ+݇7Q-%Mi"Х;}Tv.Qum8kq-!$7"IW٤6q =teT`/{zvMqwR.w-u&-ؿVdОgvb])=bνԭrq!"JśTՉ̧`kj#jKZc]Fg!,,"'\n>f܍`mҵf/% bםs]TbJ}\=]wf}Q'L4H֪1K#;q7,CQ}Tv{Xh~KaQ|@XG=>Wotc+2Z)amctF{,˙]}qp]F-?_B@bT:vX{1ִ=ftװ~Xl]wv..hPއS^zZ/u1E w缾Cn}f2I)}Wc&ʣÌeQ<`~2'+IqoWMhv]3ުr>+ǕÞ٪H7d;g贸"o'Ǖ1$.,d.3?MƃM2@Sf?рfo,K- #kVhVk?pESx\Cap%ATt:*p`AD3!z~Pg(jQ2,O%M#lͫ٠jP*6 aFMa @ 'a/Sb<L[Rj bfɿo M ge ܑMJ,#l>"b ͟ "lrv!v cO[CASpv8*'@Sh߾Tek-a6m$M<}TPEEZt?߾p󶂊o߰٤7!ޘOc~7o6CRPfa3k&lGK,nexYkܙg>Mn/-p7lު YlС>-vȓYlrmnzzjWg^8+*XS%i>_?q D0A:oR0±:kA- 7ܐ+9%liƎ4 2舩3RC'Xxa c*#8J H'̸/2H8#vH#TI'k2iH30j2:jFx.*X#$$i*2-G#9T'tT"HԒSJuTLL,HHӤK+flqoJM/0Xj46٤,gѪC֭Ya'k q75l":P:șf%QUMyf!^j %_'!:H5їtC>B_ X ~*Mybݗy ͦQ38v*`ʛ'zٮP+HplCD&5mڇ/x'bjZy>K4ߩƩy#?;Z}r*\l4gGDO"\mh!5QMj(ʺf"glBFo I%FžG].) J.@DJekYAxLPpt586Ȕ5tCFPt@UGD2Ј"`t,){dE~ZϢr3 kP>ۡZr\]"a/c> ]Y( R " xVͫ]I9r%"JR ck9;x r<2gKqrۤ;iIPJr;P-ow\\w>6?!F<ʏX?)_ Qhgm~SXr[|xW=zbFMb\ʉ9{Y Iϻ/(OylOF t(b2(?E'$k'~Osn(RJJ7N&+ dGtXVk،<6Q3:n=O0Գskh B56RC jOZF6ըI kXT)aAŧϓڴCSj)U}/UdpzNX1^l?pe(@z-leZѳȕ=Kf5S6. l竆M5V,- `mKBimҳ>`(ŏBב6LmtJm( M55nV{QJE/Yj,4 e4B[2ZUg?b $JQV7}o`N A'^ g6ʄV3C]\WXA/m]\܆mhz Rփym5 v*ܝV+6]-J[0e-ivAcjd>J~uvvZh~ : :܍d. ݫЙZ 5W%+Ywu,m6sYJ~4- PK#5uE\va,;XmwRSW0|g,ja莭H#pbk;lwvwj_XCTbd9vYe_zAtd#u{zZכ7%HtLo+-$!BsxTiBy#L/;Jpϼ1|>\m51rwlT*Γ;x:C*,}Kg + ovFp߶4ٺb?87R~w׎%C `}P!x)g=\au@,pGRpQ/:֏tF;Y-o|RX^PfTx7dqşdۡB2BW˭<7x?O|q|!)BRi3## NgŴ6nW^Cǵ<] =l9s>2 ;`u PiP=;)9[<2S >[j Y?H1Iw+A cJA3 3= )%vp<+B;ۻ9‹  C tҸ= l!)dC !&gz"<آS,5&K=])'AXB۝D+pB0TCd  `9hB*;;YBɀ5>k>{>lDi>L56 C9t7:p?2Aƣ38I:ƃ҆! 1|XCgXC[,hŃę;0}(+dv2[EYD tEC @]tX$,*f%h Ơ <5p>4 ?FT*S{|Fh9G`ZM ]TDDt|p<HĚtJpFH|Y0E'\D<ț HɛD5|yŢIXĦTs4Hx8=Th40b/'X[2=ck;BDRAHJIo\JrdVlE}0J5Jxhz 2$G ~ K LJtL̓PLd GeYHlK:T$ ^k5[ɠF2F0LDśW JDMrTL̛4q˴0 HLMolG[JƴM;TØL#\L'̰ Hp;Lj 1#1CA?@ILhp HDWQ<~\ vtQ,VFJ(<ej* S3*({DSb'dKc=>LlD@@#EYv #h3TSќ"4Vnt/>/#\1h3mUWU4F"[MN\Ku"֓NϪ3EF,/>3pD1CCs<=C)ńc9Dlwv}Q2xMUFZz Q\,QX Le ;se>[ͱ w`0EPR<4DVo5#W>=V$gNDlZ[ؒ?zS2 W_*-+2P>C2%餘kPTiŘ)"}ٽŃ;V=]9]X2:œeթ\Mۥ].{ܵ]u9QYj76}m7UQ=S,.,[* -(;E dHe]vPeb5Ը^ڍ9%+͘+0ʺx%Ϛ^酰a+12`ƯQ~+ ?PA~N($S v p_ua+ҐQLmxy<Gw8\ͨjII_%FVb&6Nx6@j`17{=K^ٝb_ʂc2 z"% ul `@HPn kSP Ⴭ>)L܍bqNN/ S@A48w2 &2霞4pc f䞌DI0TfW\5LPtO< `ŝ ɪl  ?RԛۋМh{4ߺ}Sxe||Ca&h)sY%#c3c~c8͏PlNV)ЬG]u8߹V2"\Cx` ӜfPQ8YϴXqBf$i**hj&9my{X32kS]`'4JKk'JibkA 6H(GvX;ho` 0̓Xzsfm0lVJ!Zl k%_Um&4n>n&n`P tjA]We aW+a8vx@@RkHuMҶ~I(Gt`X퓀vRX܄J|v~C _N`Q_.gJ"<N˹N .Fqrh(q~%dGL#/u"Gpn?O;)m' WLmR1+? u[b?5s9g~,-('Hj䅨qBV޺j]D^;ƬY<DqI`a7e5 9N\p8;Le9>[PpHNGu\W1v ^z`}⨛>|e^SYc'v6脶vN?lmMr6Ktvnf0vvvz/}4B'zЩ#=:2t62&gxxKqxjֽ"G;;i'pGZsX }$+뒞$@ųO zuwzz{-`3:ҥ|8vwGJ^AjC;К'7ßQ ƿopІpo{Q|xB||_'}ҟ|Wgw}/ȁ-5(vh/i>c|=tWzlhk( ]q~]ʐlx ]Y'8l ~')~]m7 "<0!Å~M`l߲aspƎ?z rȒCG=jX6o̩s'Ϟ>Lxff4(ӦN2QHU^ Sꓣo];lʋU7/߽~+80 XCΚ.Sbn'Ox掊5PAaǎf*j̨io5|[6'/,[B1i*whN[9Λ7ru?xݿw5łPnvF<>rɏh֩ϯ*XY?Uy'}|'}yh{zC_ML6s(:X6v|JSj:UVJ%}jgxZjh*hgljh(l",F4#5԰E7iqbMܕYW]u#U7iuE[Xh7ZpSab/3EpՖju7TdS%zYK^z|XWlz > 0.˲y/7m3T}?([◮}WGrg5fgjYY1]X)2m]TWMUPޝּ5Q=\.ɇu+͸MZx7ޒsQ@=NEy~Ic?m;w/Y[ejU`Wv̷_n8|#ucE.MO0Q2!=XQm_[|hۨM-}{Y y7VpYz)@e%|Y-Gv󈝬f%Mr0uz\hPFs) 7Iٞ OS̫?WuNptJYB(@Znd)޹2Zh6D2)TjSkoFknf1r#ZzFOCP}(1U? ayGIt4KMV%+XtDRX:Av&y8kQݛ>Y( G;`.MqyǴGv \ZZBY-vj~Uɤ\+7ؑuPj&`]CY8 ]eҎw(7QG EV{tk~(K82FQ\"r{ʼnuq]䮵Y VΒ` QWTZ=QAp}\P7Ѝ(":npt%GpB2WdFFuI>E졛YQV,.Ɩ:]d@[^nnD!ra:P4쪌i E麢27KCъ @NF-B LCehL2!":CƜeH1nT4I8}#'!KnB,iMu4;5ҨV5] X(g0Cpڸ!ޠb9i)k? cj8k 8k:}~fe7ci{#ߐƃq"žС/ Ʉ GzL\(ja ?R2p"(#o` /Xmt|p-ޛs{u6&qU)Bac i@|S7%6NbLJ\%g(+ߡ:Cj((T kM ,L~Ď=e @lDD m+6ˮkn p}mP*_m")$5;Q:k0"Yxw,dCA=#*NJ[M_vȵP F TgY(Jh-#'ؤBJo䍿jVF<ʮEZ_ɚ:hf񟟌ߠ dĤ\fqˁ<a<^ZL;A`7LBB_ ))מAOǠ ! Z<-YmYiU G%aQR TbKԗy!`  OԤ$JLߩKܤS>QyTNXEWtMM yx Ԟ0=S!:a:bvX"YUdPEJ>YQ@b$MU!&$1TZ?d LaP *,-L6 R,!^"K#)F ӿ͠rq zbO]KRcHHn QcV#VU AfJ590R?d`E}I?*BF$K.( L ]# E[T:ZPQd FpIJor?`]N9"j$8ZWbO"^k7͉'aRAn!"w n8YZz雐 wz!i΄5R+>g4P_[>hH UNKDxYi*'YTx)e>d*YXOjI*;C?8?kVQ)櫙ސΩ3 ;*}YEy&R:azETKW&L`ֳy>A5&}RTԦb,VafgQ?ibݐÜC3C8V,V6CUĬى6UcWlV¸Ճr'"h^Q\/UyLJfdVjbp}*v ¬ߚ)Inf)b i-&UCMrȅnlk]r}È7,R9zrZ$M)~ƮĬpTL=q ~?|%kmՍH Ej^iz|>d`lG;`7 H)k򋩬p I͚&ޯM/Ω3U/M@J|wNFÁbtnqQt>Y؛\: r\x>LIcjnY߼qj"ua "zX|"[q=h"26o>dEsۤS6x%WI W1gJ1 1<ܩ|5KzUr w|@IӠ\ś5vU?CۊRǶ0#݌hHA[6lA 1N}"'ZMi.q2r`"ǡ*:L/[b[|X&B<ʋ6#qxE7tCyC p Ȇ ?C'A'[Y,n77);ūps 95uel?@!p-'n݉AVD_XIXWɹ_]Y`:jM?עSXĥUXYYfy=Q]gZ(3fǝhUJǵ 99@c: -hR[wy ئLz{bXpcx#LNokm7o޸IQG*͒Qr2gHWi0B 5xʤZCߜɝz߯c3mnex.\q7̓h ۖ*`Ê{6c#k2!Կ -ϤLp@ĂlBP ![Z(5PB *^5poÀ(rP(3ȉtLH̚,%̀fIQ$(j~&7? 9l"st?ݤMB![pJTPKhNOg!0;'JhUX?ՕHSxP׈zu$dRuӦ>D\ z?v@8ŊV[;#3?CÅCVMa]!i?}\JR)iStb0w LT*;f '2g Cp>iS1ìY*ݔbϖO&k4>O9]бH͸<ٽmisgi>RuSNk_ 1ø$k]۱|&ȿki[6M)ʷ;~s}Ώ/ 01[u4:zOmO{~4Z _B=C/γybjcVa}^* =CJvv] =AiQ1b;[s7lk$0[)V@%{7C~ Q (ȐpdYJA"nNNR>&@th[bZ@n" ϒ-@:F U)2od^S bKXnnO'v]D)*v_vY2/ljG@FP" )0ZR'%qe(J!ްYJA$&lGX%>l ;yLe ,0yia`.UFō3|(˷IN.HCdqʲA 7K;a*ahq`&qoP $rF udn,dItRE ;Lju(LcRSI4i |NyYu6e!k'dNx)\csJwD)ZŘ8;1;DJ7PĘ3P:j3h$&P6RxlC\һLDt]B>."߬?JRť˙4,JOru mU3TA*#gu)dqiE+ؒ+[r8͛o! :=UzM5d@7TIE8Hp] X4C Y=tYRբtN}tH0W6֭2X[`VxWݐ Xgjh^E4Z>?2dIsgn!2ڑ`pڹ J{fPx 1=|gZS. 1p,cbc:Q61S[L$0226 Tj$ ,Q~wplM)+}ַja:^8foʯa)OdQO_މ.Zio??IS)&ذy?/LS`af,fwЍwdf'~b:y]^|}D3 P(QUN?@=P.t՗d,;l̜ P'@"#.˶gSo/Tѻt״>/|S%ѿ<BN̾/+Hac,RʦK>o{$ !G.%4+ҫzϙ`CǘL 1@&vǪ/+ t Q"gL'F 5 d8bF !fXT ` JTh c a!_VFLˢ#)bx`Hi)uHr `@!aB"P*a? J5kJ̠2LȊB!|SJEGd4n<. -PDĂ@Zίzk5VHFD6xF lt SZB72"#4B!B6"&!D!!!%nq!e"=#)Ij" d1 ,Q+%f?hmd`^K_کD $@t~t6*J*J+2+R+2,+2+2-HEPR,UB'Z%&DC&7_ wgWҎR"%04 ` D` j`v)} x * Nc4E4I4M35Qs5U5Y5]36Q h4i  ^ހdH0ql0o.$@Vrvd~'Q|0~ r;@ )l 1==3>s>s>;Z*ȁp0(9d,!"x)M^:E2N6BT2JtCA vl (]ԑT4EQE_EY H01{_lt)TA@;+z&G^"B$$,=D'j'%LfLL}K4MєMM۔Msp#XP2X2@E_B'4>V:eh\ɨ b~"&,Fv|zS1T)GTA@BSTQlO94,$&"Pn.dX'\"(BمIIaD%r&UpkSU*$мOR[5\Yk\\e\x]\U]͵]5a~,!TAq~ 폐Vb_QR,cf _·HjEkvq Nwvth-iN Y4>P3tԎ2Z '`FQHgMgEev$eGbej)䅃`e'D)m뚮@sOMnP~L]QU]T(Gcdj7E]v|ՑwshPTw&'7O$ Q86Nd24buotw}Vi\rh;=$7~XWk㾰hA$e7qm%dȀs?%ВfyVh yNz7.{no"A)B6xi-n~d~f&酊rTȀ D"giu&sVG?7P$t7EiBd3d33A6lDfE…wwY~.Xn$R=\ B%5yښ7sin4Y;Ԁ6`\` \`V rL!cLUYX zbYUY&~f=!($)A l4Mv"l¸@C y wR1[#Ei;A Ȁ5 X"`T` tI:Ҡ ; 89!b:Lfc`' L (h2Ykkp?x2-F_$# :H23p|#G!:C!PKmGF1&Z8![I& SJY2WW\TzGimtKB5%Ur&zٹGCƒ2o"‡HueGbIa.%C'[6,!Lp'r>IZ`rzw 㩦_kg!xT$sU k6c(p<{Tt&j`NQsbʹEF?F!0wpBaw.LڀYd]PLGv_42"a*qa[Cd`E_aP}[##O~Qb \l}ZaphK\?[TrfN0_7p)<%B^H`J!lȋpn ϟ£ A|Ë3jȱǏ /a3J\ɲ˗0w3ϟ@E$YP7'A*Be{:sի1>q( o[OaMDe a۵ZRZqߺ8ߋgP$DU^3kYu`8ٸLcg ]ƦO[XRJҩfY`Yvc|?}G6͇{lΡw^]Po^I߿c3f$= .UE{*EWav`uW[A`m5mvVzYԔ %!dc B<9wPEr͇{c͕l0F?Fӎ1%#zЎ=vNB>(cG6jF 䟇I??U~ WIHqެgi$Wmr` 7WM6d8v7Ύ&$6m:됥s"N6F4ɭJ}e cF>54!w(0j϶P.P(\cFi vO`&E$ RѸ&ceGwL,ͿmMZc$ӽs_}x>fjT "fBmki ?*\Ʃ3Ȍd,I3 wyA6h2{\x/y%ڛIcsVНmEE,YX5ԇ$\/7) "Ω̣#FI?(IE-Y&J GN&}slKJ%~4c6ls։mظtʳK pg;4-" ҏصltӅ7|# >[Zuj( T %$f?PHk^wZ6wM SŒzNr:KA&Lۛ#8e~K'c!x|ԋtcZ(WT:DC'f~Wi| J\hІvjGph A7ʐ Xyz E?:?Sum/Pʐ'ā qHA鑊ݸ3Ę>ƭҰƌ*3Z7h{5E `CM'mi7ekND-kRkWچ| M64ڃ+4ltLZoL<93yx،ipQ+:m99<p@pFۘks{'1DyE CD o^x0'2YɶB 8^b/ |{%FG;@Gg;vl[c0>tYG7g~a[57q(w0) UI5&J)Dhr$Y8jVT"Y8EV8/uN0QQOGxNJ#1UܢB<9D:p_K#BU!VJ$"S !!)"{U"W8#WdHHشG5I/@DRpsՇ &d]U0`׆+q 7P2\(ғM-TU]H9cR#k?"vZ4s5Y sbh\"[ȎQсMA߀+Ir6+\d3.AR6Gg%$X~%I[ SEb&1"-!Or9SՂ|}Yb1&a 1kwE_PYG5ON(UUynAC@(KU\4 `#-29xqn,%zdf>"Gg|D$ZgRĖQnv exx ]M3FH}0t.I-e|eEg)f'9\.` g9FaT@)?2>e\nQqfEVŐ?ST~LDV{R%"gXYnDq%IK9QUle!P`^ )4s̕_i1YF5~CZڐ(jC 4AYq }9miWA)k5ܤ' V"DU`\y]BAy0Bn@zgo#WءACN4&1v'hZJD BjR2؞4a\0gL*6)kK١ߠ\`5 f?fP v3+LP+;*<è5s[ zZmd @Wp0.)٣q!%*\z:&sGbCp b/nCؠ( |N-Q{EzY3J}2{F6Gc+WPݷ;ʞa(8C$,u 2wF/p%Nd1^rCYI;/ % 1%;n!#K)ہPr*4 :) B[0G.頗.HPZʬFMkinJJڂ0azSd)FjI}P431ފ( 5 |3 Dk?F*25DQ&z9q T"id@bƉi1#;I$Sc}kP/5W[F+]f c]r갞UN+[LTptj"LPѼ5l[KQiՋjA q .ziah%aV=B.LgSd Dj;*o)[{o>te|DtGaʦ4" Bg9Zԡ{ʞKb(F_K*i!oBnVo1v)W3?ZArCqF0Bem*@`  \UxE b«YgW`tahoq0l'ǀ|3pe\Ȇ|Ȉ8xT~ȎȐb,ɖl!;libcommons-dbcp-java-1.4.orig/xdocs/images/uml/Delegating.gif0000644000175000017500000010520111333570547024123 0ustar drazzibdrazzibGIF89a)1)19,!H*\ȰÇ#JHŋ3jȱǏ C.L HT)eF X̙8sɳϟ@ JѣoIsҦ)իXjʵׯ` P`ٲhɪMv۶xKܲ wmڻ|,mN*^̸ǐ#Kf\A-c|3ϞCs| 3Ӣ5F3fիc-;e&ͻk:iǑwVrơ#.tˣ3]Nӫ2\Z_;!ހh&XPe}1@}^Yi^faw6v`(,(ZWuh`#ȣuY@θ#I#UPF)+2h#X.9h &0d]iuhye H埀*蠺U'@rqN8dhxvfi=ᚚٹ}CVc=ew&j$LꪬOV(zzpz_iek`v:lxVkf`FܖJ짚{>j B&GUf$ @κ0n. #Īnr'w $l2oB.18;_^r"lH'T /l۱>J w&Jpz:-f~*lQ{z)Y}6PͷB{Wی7$PwiZjzW_ڐ%3hɕ*Yʰn $o|hf|j 8 Gmܳqg |>~:r(!no]d7i̓x@[BF/z1Z,s!K2 z#Єl72 1%F@io󝍓eAI:>= FCVZ"\0.H1(І:DJDJъ&\JJ4Q HLD$hINz0uKPRGibbӞ>}JԢH RԦfTSJ@U^jUլh"_IXJֲeA+Njֶ?akIֺq]W!I`J^3Y5b՞ #edلT6ͬfrكt6 mh?;O%-'MVmEdUZR+TijAEq:Wmnt+Rͮuzx;EVH25|K_ů~ ڀҶ /p&15B`w{ ilU4Xii)Qtd@,RyrZ$fO␶ĺydLQ26^3?xGvgܕ%݄2P)GS bv9} f`Yd.sP66jv 8uθyk .`D+9 \a&&Nb-r’LR*NH+fPSѓδsD.ANuukSַy#jFՍN"\;iMg ˎDg{6kkk{ƵWmsIy6's\J7ukt[ܾ&TwEw5 çQ%Nm@ GV('K[/Og<]Ÿi~s1:)t=O/{+PWzѥƨ#SǺ"I@%&֍qTK]E{섂bv:][LnƐ2x;y&>U&]UnH6'R9`SuLۛ0'2y#szL*WR/-ђ{^K—?|/ΏpI.~}.߾?,O%׏}/oÐ:s$e#x/M$X#҃hxO%88"h!$%-424f!!H&c9@:t"':89tC2HA9-zR>g!CaDh7r"x7q)=H4&`87h0qjWt'e75>-#=ib'I<a$8(s'L34aR!#_r@xᅕWxhx;-K?79́>a/(="~8Wd6D-h)2h6hC42bc9@?*W؍8#H#808F㉥XVɣR?߸7$#VH)@lx*iւ}ሺxy8(9H!h?rs7r@s'(&*%:roa`4S5=e(΁&z+ڡڬELjZ9 ȱ9Z 6>ӊ1*1z3*5p*v 'J1B5_:{<=k^BK94!30)+ [%)Zz[#Oth[dFf[`;cjAҶc~d GFXHoʮ93V.a)8ѫJ!ɤV# m*ZS._ʟ8z#1B\UIi`2ʪ{`3' Zkxc>B^z,>ڮ${+K%i1 I63CyA("Y3+> M:(#IHDؾZ~] a(?H<2 J@› 0[ٛ8+ zx gq_ᩓi$ͩq*$H";kZ'x(ӑY;J;῾jA}[Uq!4bY9p";>-JM7I+K<"[-acHxR*@c֬ᩞd+#lfpzmYj惀y s'{zO +,G(̒ ١NHb?sDOEʼ$Z'OI@l}ٚ==9*t~24D5 еA;l<>(-;S0_7 `"prMv$FkJ=LL,jg$BtB.\_BBb`0XtB?/=R"FQK%` ?Et8 qNqAwaڧ|T4`/EH`F% EGPQ!or=-g iUI䱏 O= oXʯ~4n?_T_VDˍTqGAfa2ʽMuēBIqSf @H0pdC%NXE5n8G!E(I)Ud%I/eΤYM2|```8%Jr΢I:SQm6Zբ hUIaŮ:,Hgծe+l[q29ٺw/[fi^‰U6mcȑo\C_挑qA&Qti}5NǦtmboN]p7oC=8-/LsvGrzuś_v_>lqW~ {jǯOjI@+|*T>.B BϮ.РA9L+DET1E alEk h 2 _G!lHT"3hѡ'tr" % sL(Y%, 쵲$6CJ(6㒳NT, sJ>rJ΀ƻ G,oϸ5k 4;FQsT 9T< ӥ6uLTZHSkTlGJj&H E=_ PaR}5׿z˿.ٸj[m[pq5\tUt]7v}\wEWDW^{7xஶ:_v8[ fXێ3y〯//i`pa9ey{nsg磍饕&:f馡zk:曹jlmf!Q [nN;m{o] X o~8 gG=moه?<{p#hRv~w7<׵Knhv0Q#iBsEbvf !)R} K0y˽{:{؋ @ثYӁ-SқHA*"s*|&zMv*4! ?LBE|-/7"D*ۣ;N̍AݸA'@B.Y?9ţjOB$ &DBPd&bJ+tԜbGxrGD-Үڔw[H.?4t(%"!dF")@lBQD+G:Djt?dAT=Ⱥ1ȯF?,:t(] EleԦII` q`H8jFBeGAG?B%25l!FK`) tKsnˏL Lo1~qkQLl˯ t\LĴLm銼$*00T̽t̻͏ M|M͜ތMĄ ̐pMKoJ˂1׌dThξKvΜN͌N\LLLoNT̉rp,ə]C;HkħtP)=4#$)J-u|āLZK^ZFe:s R|J!F1ZSdAHG*mcĠIhC^P u ̥/I?j*=RˢS?)*[uD,.$-DMR@jQt39DD;Tzi#3r56@SP @rt%~}T_{L\}"'"j4ȲLPQI-4PAݩaRܸQd ?Uo["qMWH*ʦUY1=5W}%W DWXy#)LBѼ"X׆ S"tkJzX}ꚡI׎nNH >{*H@\!Q+.ig >[yk K`Q724]i]l4|\eimAX~`J.deMnbY m1eƽ4Z&1=2i:)8-gY8~3nǞ &G d,1&iavg7"&/VychIe- טGRciof뼮NޯR dI-0`{8V38^,0rm-cIщD =%^ViJkhfh!VN#^jj=~ho&doݺl'c%Ġ$e&jN-pϹA*}n~oFa7l^\ξj".ihj-ֳRf޷{.93*gӹR:f1]Tq@좉Ln+gJ>r;4^V_o1 8^`͝DIs7p@$_vl7>B^\/hr-7N3bCW&%odn(ɚ}ˡ9~FPmqķ<7Į~?Q*e#.t(DO b+:R#dQ\2G:l1j0bc'vh dyvv$Iv$YjvjCvl*uP+%uiT-«nV2# p,MI kyrlᲤW%֣?F?F#>m"+6H~!Y>.D\$UdNhTܽ 4bs%AVy:V-pttiX4JY%N UwIai~lqǔH5CEqHsZy%uRJ'Z ТA5 qZ+-,XP^ꊐwgbNw(ZlPu+h׈ +Ⱦ:u9Jd.oShZƎqoeg!"Au@ε$-v[E%.F9+ Gd+8}GL=5NtI R[Wu_'mp3A`ν[ۼugǾЋ)s%t&3%@\ dA|q>^ޗO78":~H'PuVf\slA@.4hBg;ڎ^yvC.GwKE%L aVQ%U%x 5;hg<>$\-'q0`</$}H$B',Kk,}]j9\Cf#)cDS`X$0QE@/RҍR/؛z%WٷfRr,aMMj1Ҥ)M 3u^-VxV\qaM'ęMXHՐ{"WxOݛ'id;VIC8}SW\› ŲkXA]6,xZ霏80]lβex7G F2uZi!d+hg/+s]ٕ5sN1z+yWOD$8&-P#w$ iv˫q$t . li$-I)ѧM1PnzY-P*_6Աjɗ@A yʭkM (D$E`kW4;Jjr!O b-rJ4hoHtӫ< blU~b{4\޶k{ݕ"a91B{mӝomϊn]U1xEϹ(S]RWP.쎌/ٍ(Eo'2 C&vGJSM".KSD-'::sn}kRBSl^f;wIn/Hܟnkؿb4Qᅯ2ޭk _㖿ñ^q4C$JY2 S}pMvT"+桯y;=:riP>236о#q\YXѓ k6ܢZdNZmaK%JʹAۡt`pa E#C4j}10p=cQ#:ZTvX5#X#31b^VX hR"! D-1&.Mg)*B@b9KE"L$M֤Mj0MF"cCF2f0ŗa`L0ISaiR$d?2V⽋=XS(%B%Y%?zbN~E W$^IeZ[%:^wgY]"nE-)%Ud3>E֑fRg>$!M\&J c;Cj%UE]XH8ȑcR;% W ڠDrr2'@gsFs.guR'tMt^t:tFgwxgvy~'skD#fYj||VRUJ> nKRY`=a%0'а!% l&PҧDar]_̹a޵| NӊX"eddZ-%HT(熺&q~hF}#q^\T]9M]̋%HgՎ"\B'cFͩ@"fΩQ 'ީ)*G@\\!Dnę&0  hh^cJq*D6 VH~h#M>P>*h[hRߙ4EVBC."** 2!nӔ+w++>Lv뼮+ҫra]߽u0 hF^ 6Ğf vI,vaɷ^l@`8+p"PXHzbXُxIʵ~Œ?Q,l>i\dlXbTP`9o]R0͐EJkEBNsgN4-Jm~ڦ퇀۲Z(xX<,'i"TD % pfb&uWF.IڶfHhܶ-))Ϫl$mqşlsA큜ʋYPAc *jjQ. %­ܲ-z.x 58lg)İN8mqA2nެ+.o"έrnmDK@a.^؏PۘqnhߜM!9.)q^/aNN(J zwP `.ᄪ} hۧIdρz5بr|@n D#Jƺo Xo ܾX !ںJ8[k\pХKp5q7lj=`] 9_V(lZE% qג*`qf±#F]%=j[ޢwqYO4d)"W2,\23X֘~ߪ rI"V#.Gﮪ>/dIMQ͖g\A?n^`qܵ:p16;-nD3Mn-m_4N2G&!m9N!whU"n.3˴BFGn#jb5WR~~""˵$Y /f{-QvcDwtl׵];#`ͯqŦQݴ8ΩHb2S):5eOnUWJvpm".*Ë}BoLXv%Rdf62mvI egSi 7Yonds4׳n@VWwJ)hǽv^)&ٵE*^iYs?w\ln|kwc8M,}ĈB ٙʐ\Չ߱E+K^IzQ\r'UژCJ7._~rSHG4JEWbB,@6=_S^R8| Mo~w8(Q-v\m] a/eC͵gylx~cT~R`a0=`K9*X;s#Cw"uУY'"X鹬ҹ}ZlOyu7qvܪ&`t3hhD tĞs^w8oMVu1utAH2FzO5XnzOin!J*HCwsb6;,\O;1J۵vP[D4UpLx:e:4t %0x/J\v3UT7sswQ(y{ qr+vܐC9iةWy>qxRU>>e>=T2]};<}I̽ox"QFX^9yX++cu};eb > x0@&\`@ BH8cF9vdH0hpI'<`%ʗ0Q682˘&g<ٳAK5]MiL0QPQRi4UQV3們cɖ5{-un\s.Ko^ BKD3> <^ŋ:[iT9`i^fpsg4~飤klسn};ɻyV֢oÉp˙(:ҟS(uԟg}.9t5'Z)׫_ʲ~kM zʤ̶N[pڭ%H -0(Đò6D HQ=i滛LHM-AW0.0L cѻTS;s:jmt&f/%.>l=jZTQ\@*TKN3]K;ERGT/[lE6amQS1&aR:&L;22% R:%VWF%vW4S2AnS5P%]0 5 hY\3YהSk~ZW>Ih2p=Qc^R R#å4+mM_Q- /R. +B02\ j<-.p|-6)5haN_a@Eܰ0-m 9nn}* jʮ2τ@_jT#YIrS ֑YL(+F5!*{Jђ|diZ)f )v/LbӘ2Ya:ܥcBf/9jD4psYj2T$` O{f=6yd'!2Ѐs-ꄑÑZXd9 MUDQtL |]dXʣL9D[ƠqCP%3 #J)B[*|V4U*qGK2MgSVRU0ԫsJڌ C륯k幈UYָҥ+o V5_0Dzӟw^-!*6~+k^r&8e5lG22g+KeEQJZյ]cc[[~Le+W$XzijU _XFr_\u\̹e m҅sjuˡJMX\UA{P~Brъ$ /|]q ۍ$gp?; P UC噃azx q6`G#%NLl'uSqs^OŀINaX:QVc" O[ rc*}o-cUIj2]O#m.F:ӊ͚ ɳ68sŔr9At[gs =3z'T"޾Mo2Q=[yө~$bu:[=ߡD/FZ%t[/AWղ6e[,4&z̆٥n-#]^ڶ,vmuCb 1j4զ:6>hzTdo79^pWx,38-g 9FYq*EW)WYr'g[-Hڶm;z5:6e>'HzS}7yH \g= 1W{mv)g@xad_ş唝%5S⽦W=)ew戭 t$o^/ `'A{t=|Y %΄?d əJ/YcaB΋CIq_'d OEtIr @MVp^ FbͻxNQ O-$ ې6q31O0+C(1ID1Xb%sQq- J-I0n|Py>|QZe`&!C%wT"/ }00Td ӊdqp-$ͭj-U:1TV&]&Z0"qY,v'pv&91"q$͐vij QpLxq-F\2@CO\w(?R,Lcbpr(-%yj | Ť*Cq3,#d-L"3&S2+2/2337S3;3)*lf.6b0#NL41m cR3FH%oNx3Nv8}3Lbs#. „+6a1P-[icN'S(/<3']Q9nf5s/ch$μ3/.c2-gR@ϲną*0)elE*#CyhI0˃9IYT Q,Q'QRRϳ 6ć I,:ױa1TAHUNC{L>T|.#^h(k*F5#e!V$mE:*T!厴%*{TZOg_JH\M\_j"K)Sp?VU :Q耬ںUI"]i(1tՆ/TCɆՀ`!(gOVF2P jOEݨ)T-lk:}qʤLLcBR m#a=j"2B fzt'~P%7 hOW3PQk.B‚/f4.q2LSB"LPcl ,[v"B1ܐ;V8S07P3DcH)7T+O_vmefe%?rU4u^3+m#L]y"w0ft^Emնmz @$tW6c4x_G'n;APfqoW2zX/+z2>b>3rwyr3z5{#7pm@ud)rQ\Z1 5w{8Fa0H&aooncR]ކK⟐ 8ès/gNt.VMZcV&Qx"fZFJbvI6~o|4`bƄJO]xV'x q×y f蘏 9]T'؏q ؑ)YxزK\tն*poQt;Gq]7RVXaQxkP%ar9I~A?~Lwd!ko%Mu!$cX`&X~YuEW%ŕ-bn9b|iט7B&זA;Wvxr1RkXjWZi1|%/cg*z٩86y)t~O>)AzPz(&J? :NswGvB}Xn5 %9"ؘ,e zNP"Xoc)S?po+43<ĺ,V~gϟ^eZpSGfDY3ncZ n7zʖE_R5c`:n'eX}&#ViAQ:tZ‡*b:$HL,J"=m/Xt.;z'7)gl>|F$tYFטURõohJwiؔhZ nwFhE#=YY*>t_wUo&ce5MRLyƌd1Pu]KTcm75aXwar7V9A`:/} 4R?B8yƝB]=7r;FTtQm-a (wU8+hZv`zvf2;mp߰}f۽A:.HU4ҬmmаO2$%BGtB`:(йpX dQ*yMPcf?5DYP{ e/ F\ 8: &6ҽ\ `HyxWp&FQ)szg"M}tJ}7(J</<h1dMP' ؛W %u\${C]m,; ҋ/If뗁|qcwbjU*\"[}ܯ{>cӄ[@ڭ,7] `39dhQwZ\=owYh= }`fn]HIkY3s.?=|;̜܀JdКߊI2BK/ϖfhXo>(vb_=7?9Y>C7W{OVoAhH5>Jzl[%`}P(Q܇kL̶Ĉy\Lӓ"Pc&,;^{EwXm4zwRaW;s5>>4y'1`!q ?B/`XhG0òm".\WV6q<7SY" ,0… :|1ĉq"A0bƑ$KDxJ \ia/fa>& &8- IF8G66dR8T^G?&$QzYDbaA:N(fUi5UTTBUTzi9VzI)uT|^v'~󩷔 gVOV :S*]mI*Dlj~)E+Xꭶ뭽֧kTj&|,,^JmǾ,IuNʭn, 8,Fx`R!0TPJ4Kݣ(Q #^&<}ߥ1U=ISMxuEKŴzOS.>.AuA>^ݡawhKOvv'Wx=?iy2csoW'g,ƕ]*fWi~ HK^ 25ǫ`u2ȑp% !4蒗mOXG%vU 6O>pf O7v!&KBFa~RT:"Do~rR]Eۺ7O|gԠDžMr|G?Re_%H X=s**@KIILBEwRA$ubuhKX_W6e(2l^JJ3BLoYR[TF vel-mM\%*3YLQʰN!fSL&]썙P1 P벷0b̎#ӾdC(67?od쒩mb"Y?wĦ*3Ft}K>CuڦWYIGj |qP%`PjU&JYEU@ :@lm\0r2Xl@Ц(£,jfQϚҔTiՌ!ʮ`5VEҦ'_*T(,([6Su Er5e^M/6+[ϻn%(xgg~{XUSSlb)a^q&hUc?žײ#~3r ˪ RL쿤{KV"$EvBr.XNPfq԰(w̺[JZ2J P}[˶9%`ls Axz/Pd|٠:'ovYʒ?fE 9afjEpUZ݂5Eb*r[1b|,S;q{1:֤Gr\%p^:&9כjڹSWPTvu[d`%-\ WF62'8Ԡ^qSTrXV7l3dZ_1PUvW0Ln<)i&0L[2*oղ9g]OSZYw䳓\*#~,}qТuA-6oGd{^|T;ߟ+y4<ͷ*^U.3|˳(~י҅LEk]I+9L>=Z^ꌚYyr\\sb:yv~Ap =;2zӫ9r=zӧ>_j7=mƀa,a够058^y *=:{kW}1a|!/gi}S$6 0nO b# ?h@S>X UgRxENÃ?ҶgZ]GSVt5măm%lnt?b&lvt5y#lw6\xxP}qn''.Xh|]]i;Y,&:XCRJ$jΤ_ YH(9iɐh%ZgiD.Beb((\$9v=SHژ1NkuX!ׂpɞw{#JFaCK.jZpZ|]%qya1^[)8I}Vb?z2D /c!n)l7iX*5Aw-t1V`EqzqN<╼9C`!ag,X q,ǻ^b4CB(2Ǔ-0DMv!2)asWq,[Z,g œ/ƓLəL:ǡ,ʣib_XTXpHZF[i^xyyF ɘme ƙ,nl6 ~􋣸0 8!\`p{GxI1pL|ɟ\̝\̞Lϟ ;0t›I\7@s{-wm,*ނ 3NΒOJ -IUf,Ț@>y1}J^%QMQ^}B&"(׼4A]~jL.hm!m@O|b)>Nx< ;!Z+ jjT荮 2197mY7/@lSeGP)Bl}G=R6Ճc+$gDI'kff^nd.TО^t Ҟ^Ԏۮ+Ӗn͚(sc~'{jXV>Ú&,Qù[\,_q>\U`]57귚,eۆ>v?^ O#B j=(ع؎ 1NyF{<*OC/v(1: P]s v3=ӕ]~syLHZk[[psɠ>⽠X'1oG;ς }qΎKOK1=DyDXûWI~ $$ ~*ZFG\u.xMԧ4aět_?"L/<ןZ1I_,`;CA褧j?kl<;l A Hp`$D‚&\ŁFLX1$ő!+RJ-]SL5męSN=}TPEeQ"G#rԈæ1:U`SC"0iՑTMmZkE0WJc-i$سV {U*، 7WO"VW$ȦR82]k9ZhҥMFZjHnjᾎ?kTr|"Hχ+b[Rree6;qRE>4u|Wߊny]ywOJǟ_~@ؾR8#+,L2PkjB(t c:LK!4D2)<!S˭ vh6w!+PdI'2\+ B]+"-8\Jd;QJM <б=z ˴dB62$M.,3*h1jNSO?5'\@-/>@<HUo#(6$"^3`MU(J Y6%Y$k4*WֽC69-6]ue]Jp -\+Ķ\}$^z+ݳLH5 \=|ݝTLMJi _B]ЋDX=|ո͗!ijbfKn9eF[ЕgIRG$Ye_0iFUi fCJ1p3˵Ksv :&<.ҏ?AWYon8)=6y]t偽)fq/ ^R,!̪uz]vtj(K̊־!wbMhキ~{ѧո4Yء䉾vޯY\v'UFUV<"cK+Ϸco]=ȝk*;eH=/p؞6%x]*t^> `TBKrZ57KBֲpRi#i{ cپg;#&IeuD63Pܦ%*He'bR2]Ɋ`t Ѝoc&QF9HMKݏӿg} y`,:Ѐt"%!b$%DK-[Z,CbaktVJV25#7!0Wc1]!@Žx hLH֢&5L< d7iR0IUҜDgPƧ5ɕRB;zo BGI5qD"9 KbL rr bPMŠIL4cDLgHE:R2AΡz/B$(`h,fMD-@J'%ͅV:Ay=&8o`85q!iVՖqOZԤ'b6Uw;nSvԩ_*N(OF( C",Dm?ⴄ jd%BɵT dFgz0X7 asʹHK\+dו$l@p .ns;\(*-sw\]t\7խs].w}yK7y\/s;Y7^. Dy@\ _/6JaʁUWH|mUb[$3%fW@ Vae3{(Sm-^gb\aǏ3).+jW(~HWhT25fR@3\.׷=Ó"m6S&y U5,4a< Gi~g>6*E'7Y"UFhovS+KvREvug lTre%˩[՜OqXExgZS/aFyQJ=h tVVfb,'!k'Itg%Hj>3)eju Ӷu彟IHok2 mi+=0~/򓲓fW9.v0 *xj5Vuw,3wҒ3ȉc9KŪ"oaXWre>T!I˜Ph21W- px%3og ZIO#h0KuUjYBMs].KKR~Ģ{$ę :6(=SCLvWˌeASLy>Ow{Uf\%=5$q3zbkLl,Y;+ XG\Mae u-"? ^R6M_}Ou.6F-_efq8@䰏r,s8?'4ؠ2})8$ɘܐ0y<ɖ.+` 7`5 $ ڥ @;1=b7n7j8T7dc>K 3:Y@# B68A2>q$:2![ -);T9۫u[`> q?"Cz¤h@d;2|/zADZ5Z}Ü|"14Ks= L@C"rK)l sI '*t[}p!Q-nLX<À;CRd6I !2ZJ`|H) o*  + ;#K[@L PCw-#bO$sg*@#!"Ѣ!5`{T+TSP[<?Ĭlҫ7:m B 9A]ѾUEx ʤߠ +>ݴ4hS:#I9 lȶ¨^O7XD-eT>ŵR{r3;DGE̖5;?R QՌE,͏CBq4EHD ˜ .d&DN,Ւ0FVP{C9 Hwrݘ= !DRƪS&tٛ67/!`LQųRPu`{`G(˺?$W{Ăv9CC GYQLL!CrGODuו*"49?$?L*lʲxNKUAWfL(TߤOHpMK5d@ŠB$^VU:W[CLJZ`<ڳJay(̀T(pLO'L9P60K DK]Y8,63q֖̐CҮu5QgNoԨjިN%TtUL[րʪܘ,1247WQD@1WtAAD]X@]ϥP S_آs\]D2JWcU8 15Ү%riB,зUk!Y_D=5`;0<RL\RϝO7ܶRFIXpuk*nmz3NR͊>SN5} 0$4a lU` VTMO L팳t+X5yW.>ZyaFݎ6aX$2Q_ebpt ˿€1°"WeWfAMKvC5@-b$[Md3BU2Τ?.(fS7{\@Đd_#T9cLF)yA -4cBz^O-=%v/eQ Kdj1=9,g%g6jJ>ꯞB[H"Y~5Q#i6@iv#{뻮9쒮.j/6&./&ll"N2l/.*4N&V{hlw)궋9.֦҆ 0mp8PmPmmy ֮(nf m[wWn ۂm|n&foo45V9.<g&g܋-o o :o 1F=0Hy 홰i gгM  GqX"3 1Q Yr&O %p'gr>%,r~zF#q 2rG(?s(-W3r8GE ;G$/sHs9s3q'7s6t"5tAt_Q'u4't>^OX0ܖ+qN_/уK&@ g7^v%QphvIvv)mGw wo^nmxw{y|~}x}xi{xw~GW|/tN(qH///_'7y*y?y2xy_WlY/wXu6#Sdi$e0ţdy.w֨0 {.177۾CwI ϳ{/=;gǔO賧ٛ˽fӥVk Ŋiďd4c|]l E^f:YBأBbgy$P[җ}L}_)DԬJAZ1X*ԇqзp^ȯof.z婨A59RxdgVzUAI^IϑɄ!# Ahp $(ѡĈ^xč r$ɒ&OLr%˖._Œ)s&͚6o̩s'Ϟ> *thАD,GM.rCpLx!دǂeWl٪-bٵBuE|.5t0†#Nx1Ǝ# YR}/Ɯ9ҫc"]УmVheYxp Yogy%O.|8Ə#O&,+o~wDmW?1jfpnq=k]]fOA:ϯ?x$5`e-HQBK=Q{1B X$VzWUlxeH[F||.3X7(ԁ1CjFPqdA\!TW\%_A-$WT򘣘cYgrB RZ)]IUU6PYV ʼnQנ^Χ&BRRp_&ݡ ꧔W7՝J:ԓz69yNr)[:Zñ6i*Q٧[Fh.e,T[M&ۮ/ڛo[0s+E${m  hDӞ̆h۱r~l+lb𨧆h9j'bıC]8FU|q~pb7w5[)yh> fGݶocGM+E2-Ѓ9@rg#-\ve n=֠]0~pc曋 ]u-v*:9Փ.9muxoI԰;Vogs`?*w3w{{gD{;{S=?yN_tN3a*9*"J@iSRRqb(gKR\vJX6Ji%/{yd 0 Lb_Kf9ә\fMhbӘ$3IfmS'95Npvܦ6Ùd@.}i{8rc&4(A jP1 ](C#iU*5R(GQ@2` )IK)Td"җ4*iқ4JVS4@PJԣ5H]RzT4RU>[ Ĥ'eիbXjLsj]H `5Dˣ]s驋yՂت%l!d*q5{yM> yV*[+k6bw؏h3 ~ح8-{]@IA- V}-o4-Dak*0<zΜdX4 \jX]Yҥ]mo]A_lL]hDVHƂ;Y(EԈ*p=$n[ .~7[C^<%Dcҝ=o z%h5si-r]Z"߀KlbUFa\aךf4ǙOsyB4eJm{J^b'6y\|\GXfJ ,g+u[좱K$f2|rp^hW= J am.a Y#}Ihk$;TJ QvO!=KMg^5+5L[ [fJk֯ʓ*jLظ6}c:>SugC;d=-m2Pm9{-Yss-؎=7׽n&i6뽜z֤޷0Jwm#(lrkp|:a!^m@w;q+9Gn*O9W>/ar2wkNd9ϛK=:ыnz;libcommons-dbcp-java-1.4.orig/xdocs/images/uml/PoolingConnection.gif0000644000175000017500000011046511333570547025517 0ustar drazzibdrazzibGIF89a{{{{{{{{{{)1)19ƽ,IH*\ȰÇ#JHŋ?`8EArQ$ɓ(S\ɲ˗0cʜqfÚqVis%Ϟ@ JѣH?4hӦPJJuժM^ݺ SX:,ٳf2]۷pʝ;wݫ/߿~+`~ F|p^ƐKLy28̹ϠW.pLqŤQ;Vmtש]Ӱo^Mk}fȓnС^bꪟk2qOyvm󖍛ovsCtz¹@Aᝧ 6hV{vXn槡"`8~8ۈX%0(M}]{$aiftZsaC!53yg;Y?y^2'I~ğ (ĠMhġ h Ģͨ0P G 2ғ41\XҍTLi)JEt-8JNoӞ; O ԡH%R{"/HTUԙ*Fԣr^ +Ti~ tUg˘ֲ:H%*iAcp"ocv_[!WE1*,*ty$ &B.]f"mDY6r}kiǵA]Lb7 Q۲t[xۏfձq{47R .r;NteuT ܮw'"^~ׯMyV\{"ߍw/ߎם}q/W-\+ $YiJT4<7E:KVF\#VCa{ iNb/$M݇>&1u"(n@1@G\bTKS2 {R1c2Piye27Y~]pe7+ nQBe癗UpBM3hʭGkP-JS8 7at+LG:рɚ<Ըi&MhBKԤE;G|\5AWyRN .u|؁hЙg7֨PtbAP϶#j2g*JZ$%;ۊQu] NN:͛P]t4(woi'݂rhS[n7)l31X)Otnl+K6.fp_>Ë{W-u>8k漩M# K݌mr9әrY}8]K27jX3;w4f$1ٺf=n^ -Iֆp\ gGlޭ]i6'~q|VbL> iK\y_wUx@+^26\gvX4hf?=5_-zG}$.Y*-Fcl&tsF4h#,w)wu&nGuQgu<,9guB0j cs&(.R|H0j'87x"1·$'y܆Wj!;3#r%)+)F_H/42?{P(xqyp7fzGRF&c*d05'\h3_XOz?$"}5#3'3P‰†)Fh)54lfCƇ~.S*ؗRR" c0G1,'2Wbl/-G-8* c3H1b(,]Ho8ȷq!c|UӋr ㌼3zbwkf#4Ęc3rh**"sC+ıVmE)&c.W~ٌhV1.)^s/s26Ɏz(2 r4I]'5h|}.hP3 y0k2,i1wl0N!#Hs=WX4ﲕ锖2/%18&"j9p)U,4͈*".Gǔ|Y+؍2BɆX2;X0:gWhҏihU V)V`S'r3!s?9)y}92lƹ+|+yYX35G%vgtaFmYhn)Rr;LwC5V4YA#W6'yFrJ'~vh=hxujZ40pii}2zRC'W!*8(Ht/:r١Iv4.Q3lzH<{&t5!wB!278br0?M`|ٗ|KNE@C;A!Y)Jg\ qm쉆I)D3k1=<;?KbS:?W& M˶<̴L=F/DȜL6$L{sQbscaD,6|2Cܬ&t3:jm S~Ϯ;? еXeL O D̬D5[ Q\ 21?DHI&^+ms4-^137fqg8 VQYn^f^.d=%ɘ߸+:0z'!82 |D>5WYE!'-u٣*qG$xhqJÚ$Y^/##~ZiT:\8NHŜM5HR}#gB0(OZÒv')NYkWV>b;t#? |"xU~A&Myi*àc7Oj Z*ҷ|:GMQ>~xY{4I w_i l͒(*YXCZX))չ]o_o+'{qyBY{jt'(Ak!ѯX;pX$.ʒ<$$XA .BC!JH1ċ)NǏC9$HpRʔ;T2͏)AءK-k\ȟjܘ"ӈ XX*p+Uj`>!$JhQ;ߺdVn̙lg]rRm‡=)wQ N\e̙5o欐ҧAv:1ʠ|]9tј]mD#.3vQ'nRɕ~e H;:έ\^sp C nyޮ^ Eݍ$|,<@TpA'c"",N҄CꧻVJo.@ϦT/.5DzK)Z4ᒚ +m ruq,ВC:m1M,I<\ҥ =<쥡|*P7 lpM6t&$MN YOrȃƛ(4<*!>S;/3 S9UӪ| R;Q=ݴ:LЇ]on REH'X%rѤ4HrE=%*?EEhW|Yh֬]:-Y YH['ĕk#3X03YYÖRIe4R5^PQPo4U!#1 +uY[IK`;`D%iCy5nO)IMw#-V-=ÅNuWU^JK-4w;b!ꛍuX9X]c Ыi֫3BvhM].Cꨩ^;pszr9jγRZe *mUr9uV]f5t]vlYٍr^d6~ 5v/6eQݭl кHOu"m~Env+{T0R#`U4` t.0` ^PT,Xjp M &p* GB^1SAP2` M7$"B<$.0 XB!QQ !gƐ (BaKx 0rc773tbȠ[eS$ zbT+KRBp,H fj -zawBjt*]y;T6r\'my˂|vۤV(JYe1-}|Q3G(Rj.D/@`1{ո k'ExA:szHl.t5@|֤g==rZVhkɬ.F6L H-F& 9K!EЄ3{zRzRQxhnmLm1ecCfhZ'ITA%"VEMNntCU Gԩbh2Oux x'~t mXcf RoN4\vi6K*̔eH&zmu=l_Jʯ՘9[ 2fvjG@&m)D)A忊f/OC--4(ĪY@Xb(?T2 t&[R 5hjм@mq{]9]J+RZ VVLkSW%fKN-۝Z9v&H`4]Tlz_ #d>i {aƺ\4tmV@_/ĥ  5Ǖ <1G |`% iv?)QrUKXp!_WLFlGHF\ŭSݰЫbyn󳊷i-xJvTq=#}niι5گ-xxߧyw7'Ǜwd-#s%9*ۆZg87\93nvC\ ;W?iO7*ֽ{ڤQK*G> ;@ZlekG:7l r ˟rD|e!_zʬǻ{ynҰ8 khc>aklk40C۲98L:3> ~}ZJ:?٩)/9 IZ;?ʛ7yɈPLB,8 ,"\2DB!<%K  )dT3 \wBQ¿p4k@9󚴱>l*z0V!@dډᐮ).A<@&QsxDЋʸYB5RҺw(!u)r NCZ̛jx!1sauB1 ,FE$H?:Fwb)H3C`EL4aDF;%ErĻ21C ~$ FQ:QDbz4Db X< Ձ"0bGyG-br% ު[읓Y.G{KFTH93>ڭKCD3#v[ yɄǀ;dKLDKEr;㓕lI5s0<)Ґ2Ԩ,H-q"j;4> 2 K!D,KˌɾLjT[.t ﻸ;|1LkM,αI\L$8[,4NLLIüdr ( ;ȿtMtOFG(4@3(TδL A3!<\=<2/3ЧF (<ۥJR@tb+3ɬ7eYF!bGAܩdKzt))QC=zX D)VxCJ ԛ4IbCH)ӗCV|U YEԳb[BTqe&*DKMkܫNz7Et*C땂ĚMRF~ 5UnUTYVzJrK D։E5, ˬ? y]ҥQ* #IB5kQu2BD؉3TK6w3^=TDDת{jLօEL,Z+d--Z}U Գ϶Y[҄*.0 IKl=SXΌH<cU>-=Bܲk; 9Ln^kmL+m[:ϛ`k!ƐcH!DK؏ΰK3USc۸qS[N`-93c6`J->D*}US;`=܌G YBmZ,;e_LCP4 ;aWMXl?7I%@X;J][ӏ(Pn f6eOibχU&=H9MCLKM|oppJpz?56a-mU$޽>q0άav݅vӜ V/? nbohT=aMNrGĀ Gq)g diF/9\v;zjA fE'|ci5r*ш=د.g(M0G;[kOf;9΢a>knE? r$y8?7sK:OҋR8=x5&UreyL KuL/:ODJ҈H@BaCJo3GXar."u\Uݦɒd4JR8KqZ]+g3:8{nwiy)DrŲHxLJڿ^vxXwj|x~x;0y&hYUl6je_tsw~ym/[b$Ğ"I"Voy}RӮ,zI:VZ{ ?93Dw_r_޿~\_V~+a+91n6ɇxxUg4Hz 럻FcG:=@dmDX E(4A%&\8!C/jĘ#ȇ+h*Wl%̘2g|&Nr'РB-j(R H~B J-(UbT=PUu E]UWJIo2(w.ݺzIRD/7~l0Ċ3n siSq=xq2ŧ EXVAgl(C[n \92/ۺ591 n8ʗѲ"C^}zE C,F,fԻ歾{&9A ? 8`JeRg]iuw1у=Xuҕjiх|xG[}"18# 6Xt|]Fxi#>j'Q GCZEҍ&߉yEG#Q-ާRXz%adcwI5QgEGBd V nQRVٞ}盘AqR*(bneeZZei}YwiXdsibEԖkz+وgVM֎YkmqUNڈ:%k\Sq݊;.F=JY ETWVDYUYgSWZK qK~$Z.K,ӮiҽeQnz6t^Dju0 } 赂|WF,;1=ChȞ Vl*b;/X!k*e*-lB5CI6Z>}6^ȝuYE1p O Z}̱[hH}ۅh\"]<א"-fq0ڕ[kWkPY\qZzUR4uAC[۾תnk_;"^)y"bךˑ;Zjzxs=s!.ka?>_>JiIui_" W!X=v;Q\Reesv"FNZw;ioE(=&u Lҫ6u,k]EnfФթ,ɤ2ȱKk*=,#AN.OLfxy޶ #ʌ;Y&D3xE:mguGSaSβ%]ɍL\pk>2bnݜF0"9Av]&4wbIliqr m88U0_S4PƚM2y-Ӽ(I'3člkb8C:ܗ5֩KlhL:[uι{+sLP_<jwL A:@{[ Dc "inb'iPj8!N齡BV\񌊺sӞaKJ$'yա2=p6U[7-سťڇPeV$yoG^+aOl--ȖF䩟Tõ>*[l>2> qE̍kq]IIY xFUJ}^|zI)^^e{iͯP]iPf< !ͼϡM 889EIP^!f!janV%b~av!r!aFqN8„u 1` .a##NbRuRM߀Gl'r)BޭJ:+ @*-m@\K" hDXL@h2*->L@ĄX0^"d0Zlc5j@2(c2^# ;*#4#K1f@Kd@d\X.b7<@d@5f@:@f7^d:=o">$ dAD:&#$";*c9@;&Kbt:cf^X8!b_J$_채D .c}$G6fF%3L nhg&p`hNbiUhj&%@"$Ŧl!mj:`nnQo g@Ibqf܅Se6'kK#Et"rQ0gnf'mmZxy'g)r='w٧|B#}&{:\~'| Ra'b%~^'6M@'rN&VIA܆bV_"yH(.j٦it(}.-.bZwFbrhmvWz)I%τfϓ*a1it "J) K nDi.ahr ziXEZVi) ^⚮)sipѩ䩞6 g.娚!&jbHڡD%Qjb~Ki?Մ_,כĥIc.#Ѓکª ݪisg+X&ZNV+^f+6a&n++k"k*R` p+מeކF@ ڏ,˨>F[uLf,bj,zRmɾu&= ɖ,ʢQu :jAݫT]I\G{ʇŬ1m\i*j"$>-lX`,W]z T]Y!7٫2Qi+Je`Sdtlu_ux4`vmGWQ-r-m4M4XtI f٭ؕR*&F(狕js mnFPt1SPԥ,V䭮tkbf/n.Zﷆj}o/>':@O vگ]1E02[!,lݲJv[0{p'D8&].,ų'O߸ A^iE =ٸ唻d^,^@~&GՒ lp1Ĺ 1IҚ\~\UA-D4uE\@-5pq6MI Ґ1//ZCTܘ ˩'Ei(QEp*լfEdm F"{m (`#JB@2 r<,& d$[n`ɪ!Mh +U`k(w$GEq=TؑUf|hN$OG\!1d QO`r6_&1 6vNUIxlB4Apkb+ p('̬n^tu !d%WDss1Ne2 R״W3*ML *gVR5uR*0 QkHR495 qTW ,nd,QCvI'ΟlܯWz{J5,y;K[r q6}co9߾__#VJSպ3: /z?y3yve?#:u=pb3,O/`"a 2\Hp`D"NaC3>E;. qeJ+YtfL$@l9SΝ>9O< =J4SF9)Ђ9ZJVP@bV`blhrf\sֵ{o^ 4~ \a/8lxp!#ƚ+,cЛ辎IclseziמէB A-W@f=kTlG~t$}hŋ ucpm7}z5CT~|IGS@ث(9S :#j9꧵pB +ϻޠ)!Kp8DeƖ41$u IE ‘?rlJkr%C>FN'R=< IBEx< J"S1 M$9H8“@ :b7d?ֵ͕/u޹4s7}X[Vz"Zn]ޘeqs.g&R$Y\'Nc&^~ByhCK;yT;o5ǒyÚ7q[&H['zqE/]2{8Gm)ZFSq\fRC}/{W1E:NDȐ}/Lg>Qvr[?IZ0(1N ;8ͅ/RLEGg3<*PvW(Yx{pdz+phJHӉ֓3=GQyE%FTuI#Ҵ^ޕ (a j2(ZBӍ6K:[)[".ugv"l:~ mʹ Br;VHzU=>,5 P`՜/!j8FILr=.q@r?[dFul&mc*[^.E @]deIaO!Z8 Qֱ- VSh3pC)CPd:"2UŽLJoR>~/H!+TѼت,l~a~J`/2-Rya4׀zU\Jme~Ao\'.17.,FaL#K^sgA%?̫R@ m[mw3A). Tp h)mWL6s&4TgزHW֯ui=kѴ$xr|L PKye]dj^';'=;=Oo&RQ5Q9M;y?Rh?$J2ލw.̺+7L-=ShF˩ʫy݇8d*CG#R:-zqg? ȗ̔ico_ԷW d956Pz:jӲ^IVW^SG[|SYβS:'Io,REL/X-frx0›>O -"d È*CBڂF̿h, + Z̎ NfZ|.-d:^-QEr*lشl|npƂi՚PNrHOc2(d $p+Zƌ ob'.'pBvjO*E*ːJ' exD|vC7Hb-#}ZZP r21PpnG *Z:/(ZP i1GbP*n#8($- L БvΣlqTjR%,MccQ A qeZM$('v愖 K ˪hpҤ эh\p kZ*S#mi"icR|oF qϯl8'li42$#iPId &Q4O %K/ 7l&&K/"'dҢN-qLd.A$E$$)g$K 0Ⱥ O<ZvaH,q $#LJoXު*yMQk̫1 )9DŦ*w+mf3IOE%2ݑYXDP㼇j̫q..sI["۱HHm-)&Oz[ nzKFS/,x,r  oO"(DK^k\,[DB6@̕VM^5E)dA0-A[3?+(pMjEhĒmzl#1xi2?>E De[1 C% B6[~"н<4Rs2H"Lb~r,-qy3L:}+m.$pTjKl/O&` R-E #S&O+h C(R!Mp"&1ԱrRhLw<@;2ҺYZZNGLU50[@ + :6d7.C20S\\ղ<| 1D[,uvo?ԓ?$S[k&_c3,մn9cX 8Վ 1x-lEu]Ms tO8YQ`{*8p[{8f9orSBsʌbUkO.ԁl0\%h3b̬ [P?~cKUjsImU250"}[3 lj%)iFϕcZɵnN8cΦ*xeo?Z\ĝR<,';,HOeL7yr3c-®@=7Pɗ9bTJLQ]ֈ QkgINlx1gGX*e?"5̭,4Y@{YhUwTQEd6L4w}/oMgdhDz%s ļժoF w=5P}#炭qnS 4T7F[LĨPVΜ:h'v}Upi=>.$:e|4A_8+xc f٣~]f9Q;4~euDv_쉁s~&ޖ ],u&#p> ?<5O} hމ.aѹ4_&^>>S3/1nׄL[w ĖvC8AdcIkSq[c%i)tEC $(PB.XÉVHŃ+\@"ȑ$K<2ʕ,[| 3L 0`Ĝ<b64(Ģ":,P4Ġt1VAfƯ_A<6-ɚ!)YG"UnԂD5:0.şq\;56͜;{.aۅPƅARt=EKviC6=4N857--܍!r?&t܎rz/^+ x2Õ~ۿ?f͌kv8u%BBڅR%H@ !'Y{ZHadї_)[! E"A&J"C`,fib1(zѦXr2HdeqaJ.YhE 4R)8u"]]7QdWy^j`{e {EL&Y8M5RbUCTV'C':נ AiChpYMgƗ搗i_[R()SmP 9GSHhyT&i礫Fui1&Ji-NT{؝Fcvh|뤺ѯdM'wɖ(QccTbΩXꭷoY{Fhm(ʪӌ.e, c8u䈄-{V-E^Jp&iTu.c;oݽ*2g^"cr@\'7I0uL؝oז ,Cj1 tGͶLj_7mcC.*#/lsl0{t+ClLS鯖%ꃂgQTYVT؄+.$ږx㪳F"gnj7ޑ (ō :mTFYC"^鉧KNFXRb%)UvvHu}Uc&Os| DN_)jS #玫~ ۸J1[hy+F5myV$ #eW$ݿȗ88 ,Zw=KB1[0"+w0|$yT}&ܠ$'gJl(~i>C"6īYKRm/XUOC G4!ZQ$ x<cF,G@$9*eB8S^\Y:k!-ݘ̍YIB[)АU^ r:)rm#!R9pgJ+6` 5jjsټ7mbS$9yMtӜTg9Nqsf=yun$̥?}m㻉w|%!al q?T4ьhgPyrkBc'ty'sCH &S}ϙe(s!r9O]*Y]Ok*Sf4R[DoZShiG9հ}tLm"MJb69?dLO^\$|݈Wꡝ `ĞE AlkMn&[W_{*$8-j_QT&]ϊ 'V-kڎjgm/|hҺhH2wdlYE(ݖvjh-}WgnqQ^5UtE-!&/Akrvv+&YKg}!94,-iuڠ&OVlS0)̋_{ fGn g JWʍjt#1m]9M*Z2?zmqo6(K((T9AJ\JQVވ|Qjpf~=y( $]Zȕ>o72h \2{8͊nt} a@{8ARҸL3;юMO:," @䉦TI,d0E\:9FuHz`r~SSo+kԪk"qZL6q*lf{2l?D_b*Pi8-u߽!n77h2c@)Wj!zZn}BTɏj [S>׸>=^ʆT$O@H+cR+gKDA~I;9#g^й%~9|ș <nᎦ}aP^vtzRP?so5Y]kz YފDFYR%OqRG;Ev8lo$Y=3:;*sa9=r fokOJ/}Evy(cqsA^:gKV{N]e%.q9'wp ?g cCeoABC?n_}fMʹs/x] 6?_O?sodQFBUn3wf7G_%r[ynxfk {~'UX~zBBv~V%|&gp'(胭/51e#f+6kz:(0?x<(8%a/Yb1u5`]RÄ8#xTZhXcAw'?`f w xzaՇkHeI<&exe%G8zce )7g BmWI"hhhx(hiT<9A(ZfHQ(VVjlY& 4%?o6wWU؋&$TXOqQU!}B'Rhb$86yq*1'^)_1UXW><qD%oĈ]]zȇjAhE^{5%sh4&v{㸐xT)msra0[+uǎFՌ 9xz&Q:y'C'c5d.:p5i U$vtvYȓ4=Y2YG{Cu?[NPS wai;wO5$>&%&A1n78AUKVC9F8;@y3Pf .&8$yFBml9({4 Hm5!Qu"PM%PPD%Vp|yԚwtOB$I92PA(xחm%v}ULGynd uw7ȌIJYoWɉQ[2c6v!Û+YEz?Z^jU._= Jm##s'q7U-VsY07+Gi%hس">swe,E(0ɝck/&8ꓤ4syR5L_Ţy]ցZ6KڏL*lY|=C.2#,E6+RU]j#ֆKF8qS5`$#5C!-P^vX'LL| U{r`@nO韋ajpgHM)aJG)p"8}nI$bAcoy^zGvdeZVk3{؄Ids R'3j}ɪ<zᙢy{zg)g iVWIH fW.TI(Jذ;EK#+%K'+0e-/1 3 ;.6tĔRij=yA+CDAc(9 ]BM+O;1=NKPkUKI)ZՄN`Mb[d 0j{lNhM޴w۶xy˷{d[XEJ{cGk\k$ XU\+a~۸Sud9IeK}VZ[{C]$Ak2+飹5k˻bz!;ݖbQkЫQ{B֫F{K;$D+;e»'$Լ)+fOTB[2˿$$,& ,Lt(,›A”X( /X2LyzÍÈ;|7\.S6%S,iqYdORLSlUOX|[]_TMO2M6 ^DkmN\f̦gs&!S#sgJR+\gОa>=̆OL5fd5u' EDwmyaR-~'\THKWo'DAѹ"09}@};EZ"]cOFm̉i/=|W7'EiG5ZZrc[[o7#Z2 =R1}E3|ƒ1v3UzR%cCm9\'}}j:Aוk")Z}b 4&'4N]L}~x lʗ}7A I PV5}D|6PAAeۿ|ύ4\߁F4 ˽)?[-۶* JdFtN͉dsr&Sms{7&h >9ЁRBCW4mʅENk >"NtkNT/N+"6^(޶^M E% EilA[]A.t%ȟ<墜U>mVXsP!ƙL>lg6{ *[ʢ1SĴL1>`$̞%Px!f<”&eA$u9SDB@Np/sy+lkiW ei*WR]"ΈɝNQ !u4YDTՊ|V`}^:ƹrx9Jiv,V>ܞ P6g2ad-W *btQ>*1\$&*J@?r+ .jؒr'8aYؘacEV,r';YqM4MPEa.Ђ#L,1EH,ddtl?g#WS:;vbE8Mq >f/L?#V[ibHn^Cv]--55x9Cu]"k@ `>pTQFc\u5#bk_':BS݌wrfAșs&^ B?]H/V;J\HB @[RTSCh;LW/ɱ;;Dy5\^3(rxb^p'3 $% ȇta:V<Vо!B`ELG%8r,oʹ'kDUD]FҫG7p"{Jy-uwBj&-ő'f"g{2 &pi"M!n 8"ky Q,giMi',hI󠓭 >Kf8֐‰E1O[J+C l@ Øόq֊62^5$gIe7i'E-Q'|eĕ-ı ,ʶْjx޹v7mnNb]p1BqyCcq+u EdqW2!9u=u;'z -l lu5rM]N;ܰ8UvO? 9Aҩ}nu>~%:"4S: ɬӾyw8 ,hPj1s6I ?{A7fˇbUC}>,ZM_͜Xpvl>(k0pxup u nՔ{%؍Mfn)Ҳ }H-@_R%'s=x3  Ӵe)` ÓmsI5bf3I؝Y "[r"Y=i(a;q yIaLK9 txづz$l¬V!%21UAe"0Ž(&3M A ҠL*RR!-B ;,c$X#'8cɨl&o) ɑ<ʭ",ߢA={9?kɫ|ќTCfr3̠';sw)0v;t4dR:'/J`J|T|KSERaL咧ӽ8Ø$zKt*e1!; mRFF>iX!E'ϫ"/eiKCD! @)7t ,JT .+4,GRXRX+CC~ôIKLG,!x5(HL5 TҞN CEUҔPakE_? 't[E'QO9by-3z eikmY64l.)LX)L}<& `;)Ngz]xXY d̡$L 7*MxH\8Hcz1V{X=[KJE-A%Y+bE)(&?gp=$c5?<* X Jhg!S:s^+N%N |FIn 1Mt[Γyߚ] -[ [ [POLCFݴ[M' ޾=#\W$Uv1_kз۫xh͌3$A[C9;>vK934/["fk ߆QP2Jڡ]S?}lO 1nkDE6U2u<%9w' A*9=?_.: ъTJ^lU`TNGi%6Q$)q&[O9df\ fM)#}*ZSb|U&[QP;V[X|c۴H{X]TLT:l:yңmni˭=kcQΘL8c֞oF|׾>^dikg-Ҭw;KoSm~pXh6f=;vIYŔ^2.>N*"?0t!8מ񍍛ZؤMhmĬ\*uqwXtf׭h,rh.[=N[BI\]G=Kiwl PUVsyF<(\8d^t k60\~*3u5\GlXH*tj-]#;ݒ! >/yy3 ]M@o,q$AXuV;Qf& cPG˰$EgweK]u j-^87D`_He'#'#gvc]D ^l phο2fN[qœ#Kl^k/da6a|1YY%=KC lcVI9 pOx☄¢=$nqH,bW,fnqcf 2eRgGz!-cdyRHt恍M,ʒ{^TQt d-?g\F VCD^ˊcS=MBa[ Dpbz/MFRafF0@ĔT4&,HÉ):4q/.Qd$NLr%˖._Œ)s&͚6o̩s'Ϟ> *t( @I6XƐE^=x1ԋ =hMhQ+ث%RaŒ=b=lƨur؀(߾~,x0†6htӭrt1ƁMr\tnfW2a5ءk]я7 {x6ڶoέ{QOF\w5C[Vd[$r6؜];Ft!F sFޭ~=[rhaЍOUj&krH%dBsi# |v}M^w@!eUC1՟}PMXB PhHW\-d#dA)e[r٥_U}QgCMg@1ETՙל9Yj|akp9%dS*8)Rrr%RZdD +p`pPAEE<&jHV~Z;V詍-j@@NA'^ IR[m|!$@B Exh䮹Z(qS}j@66oB۪.kY|:pUP2ܰ%C:u@eTSr' ,Ć|gRkw x\̹QEE C]Kbl2 nolPCFkL[a4_?}cX7f-ls=||4ߢʬy3k[,;kx{#X6{AA裋(1I1fdn:UR~瑔fQ蜩eGYgq QGEI޼&Xgf6͹>9cg8ݸUP:+Zç7?_ C,&!0; g`iLX]d\$ D|5(" KhB(;x%h')O;DCgi’#hCJ10pJ\"Wқ ?Vu\(o=J] :93G$Xt<.agF7±y bĸIdz izVv\Y&F\#_nKla#it1cH2?Z(F̠jJ{#*qrzSPƘ7n2´VbRx[wV/gL֝iNrKFufLq*Sv/ԌU]A#;a3zP(IlM.\鲿*$;۲1٬mgAG5Z2"'G;")"er 2w3 MSh.sB]xJG0]caX)7)bV΂F=ԧ[uP+O(ڌBc,t koiΈUwqL+Z3[L5 )3 g `<gN8*ss X[+ij z-io",QTD"d9 6Q Ro|Hb*c6 Q.NUxv_eRS&{~M .J+M].{ۋbkZngg۝Ezr~ ð Q]D4ң KozlRtF. bk<>t}r1 ?Ç ~h2l62ւ;~g>qLaaKE{+f`#gxw8tyg-E{ѳ+QDS}#Z/E>Df4ϴ`C>8:.s>mBy5ʟqo~ח/  u}4_8DZQQ-\P y\I elUB`^U =SNT>WTş ] Hԏ[kyb[ɹ ۽}Gmj`δ-! >A񔒡SXA Իd\V]A .Iʽa#> _c %VDS a5h%}Ʉ:*%YrYb%Y:Y%ZJ%\¥Z%Z~e[e^eV%Ye\ΥYV(@\ ^eUvT.ecGs HN]dZQ;I$.<6G%Xc_hVN n46kpAކ6bfpܢmZKqr}rR*M^EER uş5Pwwwguygo y2Hzd8bg|O yj6}k'w#z'~Jv6Jiڄ2~ .'al$څfmJ]Ŧc8@hҩ %^xݮ0Yב !(Zڰ\}hL T(AB#D.A _P[QUXCiiW$A1JRɕH,N5Iϼ; Z߄!V˙Py)߬oQMmR\) N]W NA\N  .ԲRRVV-|yb>ҝu*fhzJEӁm4m">q-U5fmJO>'m♈m-li-fu|#u!tFY.VamᢦTB[r\.Yz[fz]@e%nTna.*ꎮ.bn ono{p@Ok@;libcommons-dbcp-java-1.4.orig/xdocs/images/uml/ConnectionFactory.gif0000644000175000017500000001273611333570547025521 0ustar drazzibdrazzibGIF89ab)1)19,bH*\ȰÇ#JHŋ3jȱǏ CIɓ$ @˖0_ʌIs͚8og˝@s ѣH 8 AӧNB**իVbTӦ],׳R $]˶Hazܻu޵W.޾~woÀ+න5Kʕ|3fƐC-}Q'Zujֆ2ulط%ͻZ~ 7wp/~cʏ~0D=z|x;‚=Yp _Pg#AG:#1poJtJ<VҺ ?'Ywj$h+6 q5L&X dlkahl`4H ,~fYcմr3 U` HT0Nv,\p#\մ,qT?V/ &*`C*67$bC5v\ZRD,Y2K̲ .B\%%.c L,%/yL[TfʛD d$:1dMq<$̾lm-7a7[3v|Y̅Fӆ<\dAHS3:$@*1*a] vI'f,d(fu'6e\*S:qc&6L$`Pj `gA"DT@R]Ҩ4GzXO/M9H zuGOVF5iSU`u:?O%##Iq'qT}ڈִREPI>mv |yj%IoD(OeLKRX)AjYBmKUf)? Q/<hVmQ4+<%F{m=<-վHOc VPb25-MQkZ[.{;/Ԑ7w"H:f酄-KG֢j|xkEJ(q~-\njoLuMFmp;%7QRN'$.WH#2󗓭6yug+y~?̑zIM_wˣN@WJs}xg@{$:vӖ}w;bS]nXg[4ˬ%2%L%<7}C_Maz9;tϯGۆ { ${w"G[_)<=D~ݹ?ЗA>Q\v \hWG=Ab/ֻZ|oڐ?ԯ~9(gfEV_sN 8g7s2 `;5W3uPgIszd7'ӇgNcIc\mG'E-GA DŽjy;؃#;@u+}^UUIPI89iS=AD@r#e~(U/|4~5XhY0!|)}$GODiXGY@'4@-@ȉkwl#|HےC7/ RF$QocQw.GȈ*,ǵ,#D:$C>` czĢ:8;Ba$L@hNu08j gUhgI 3Ev6TT})<&$3 9<,Ų@<@IiT0(e4OJx{$hHV>I@IT('YC!CH^1WEP3!`U%a5/-/V} {(iu8B<=)>)!qӗ 6A雝ECI\3cH1Qg(&jU9G`9:c&sR{>A+R`EгA|"aȞ&h$,9J),/#%>Z7#!vN~_03 b} _>6Ù'+S@&;Ƹz 446,[`Q脦7 =HZCٞSJjuࣝxhi:@YT1g.EFeח%Ar[۵i\bdeckjgKri;6!ejv{c W5?F8N1 xQyV%!9䜶{y뜐FS f%FOꚵL֮;cb**"i9jj5j:fKM6Kq+;[{k ^Ƽ]w;[ [t˛;ֻKkrޛzK`+JJTK 'z뿵7뗔INIE<CxyikrUF” i[x灑+0+ӺIO)VaR{Z#æ,x{+tkC9ffa8fPLŰqā^h( DKdZwe̒9:Yj[R4Ɓ=%<\"Z(%\f#2< 9!}Ck|<;J毵\U6x/NP~1gIKh+zӁI |ɁbYDǓHMB$ATNI;QDUEp%6 2#G!)DoC0:{Xw; EuL1N-DO" -S˦JlDȃjl;L$iM.Fy;Xj{7\;libcommons-dbcp-java-1.4.orig/xdocs/images/uml/PoolingDataSource.gif0000644000175000017500000013250411333570547025450 0ustar drazzibdrazzibGIF89aJ{{{{{{{{{{)1)19ƽƽ,J5H*\ȰÇ#JHŋ3jȱǏ)<(bɊ'Gn N4-aVݞ_j7dbrvw$`;; [ГhlTWbKЅُ{ փIiؖ=&lr-Y+ gVwۄnxgdvaE/xa5ׂI!xw7wߨ-4{Ô_^;ؒ~^@K.SU`_U[e1Z+|wV'=χVo~O)>L#%qk@Z瑒>!q6: Ā 7A0'piGRj(LR\IyaTH a"@tZQ"a¥h~'s!6X+$}̢(/MQ I"($ HW~ , 3p y@XB=cLEȅ$^<$'"0#$LH#  g|Fğ@DsbMh@ N:}HD·ZtgC/}f!cGG:ϐrr$M:MPTT0%K2әAfR:5FhUIܨZ̨ *AL*@zAթ-bXJRz`X:ְfMkY׊Vp}\J׸ի> Oj׾u_VVL2=j)aDχ6+d5.(fER&h} y Y4j5P֖U2qCV-P) i אTr{ѹ[.s"1VKםnTEȻm x8JU bzǧ{q _׷5_| o U88(}ܥt sūGav9p9_k) DrTlo-.sëC#L8*} cИDr$;Pf dJ򓧬(];Ir{ [/>r N(B1EISj^)!62hmiIZ`s yolC$ItγGHB˩345mZ#QGP N!t`Mn$MzjZ= 0t83 YMQo_@a=Fcͦ,6(+=Svoc#$ hVY;!QukHjN[}Y^wʿ}c//"&(Gtr,G3~ygso3rO5x'yS"6hWy]6t>cp|¡x$ d~v@RzG'!z!(ph'gvCv50#h1:wg{w;c~}wywsʷ77+I5X$A}w"7!07|Ey}'5^G0˲&G"GGPݗ/)7,Q3q2!!o7*Q4HtJ}W1iv-&wwt1w! z&3{`E{(:r! lwg,؇xS'3!'$w|(GTGa҉1h0u#G"07lr&_86wja0芡9hW9*܂*n"h6g#wv4W! {RÈ&F3$'ׅ.0A(?+.}x,vh)r)2)'S0B,.&Y)2EE|1 c.,+ )#sEI.=G)ג3)*")r'ɓ,y+/Y/M]Iy8P"$# 38.R0$c0WIyx Ȁs/Tax"XB2҇ )/yi0pI"~0)0/ؒ.#%aw~ҖՊ:ّ.+^y)+;S.-+KH%t`?aar2fyY/RP眗y#D"+1|342&C,y⎷_ٙY){9.Ilih0i R:)0˩bȂtl[5X.*X0ZV_U#) S+-;)D.)zxňDhؗI')$òvYYx0Y2d&u"ﳑ|h2삠򙔞ɕɥ2}x!əe2)/*zA|Fy[#ɹZɣ(3*x9)2!37H7"Ӌuo*HV22Mr,w}hui:By}SxmJ4V8IR|x%؍'⪂QHu6K䚄z&zߧ:4ΚOI7.&2zmwP| (pi'v߷g4~'2J|wwv!(CJu&ȂCt3 zCk5HG|T (7y @#+*۵t*qXcZ|kZU2Os+zu;GgS;jr"Cqj"{{P+Ȱ#f';p{ m4 @R3.{-_$9sVCy1p*aTۮOEwk#F?;yU+"c#zxˈWH#ys2 i &캱14nI""&K˳҈!?h{UǷ;v(s2{;q;?Cs 80oVdj6?\6AX!'5ށRqL(l; ,=Z/JXh@D/M_nVe  }8Xѯxҗ&$9 ](',}+0P1=64=(9MwӲ7}>Z CG jUE-A;NhO=bMղRXH^m8Ff]h}jljUx6JntM== ~"ˤ .b~1٢ǜ5}]c,5I" k*&RZ`+3.] ,by!+Q0v~2 )= ᒸSʭIWyr}<*Zڤد!a2;;܉Q2z+6{~" (K.;2nq4Y*eBb| B+x.~h  2]jѐ.y)ءB$/~lןB5痗g{.ة)ʥo!?j媬,񨉢[/"vY"nоUDGn,(+~١,J "n o!Z!1JOQhx"X+Zߣ.8yAHiLz#o[9//Cqe/8!A⽎^2Cɒb2?/>'_I(6/oY3,\ׅ y魻鳑 ZwNZ9#M4=k~uN#D~C>.`} (Ïz;gHl[^`<:o .`H ,XpC /L@bŇjp"ċ =6P)UdK1eΤYM9uOAT(ɣ *Ո$ĉ)bU;qԄ K+T%Ӫ]`M o5XYHw~taե  :`Yx"=I5ogE,vr޼ٲZ{ yQD36qӦy4]CddUUSHWĔ#dK{oDԒC^?kSLzê6Ko+@` cP Sp:˰B@B40?:z.D1Fsq`GH$DH%T',R"%T'2/I/lr++S7<-t=VkDOM)62rC-tJ(ѤS'LD'rJ)մGlM3HSUuUV[ű So#ޮ(Zעյ\mV6ayk Y PhV\LmD] C-m]}ֹW`OWw^zɾc ?~K̯WfĴ]VЗ TA^E..@A*u% ^{[vekVckF}=Tѯ*8XXo 5\n@hh6 }yݘV{m*!{onQjif`;s )q/HmC}+on[WVS ;tg=> Iဥ]o jΗsuwvz '{WV&u^W?Q~PQ*~M(Q@̇>iy@^mh}`w} 0@P#l]cцB.=E^IQdaaDeIw"4 m/" PaZӐa#J'#;xE1!H@u$-aĦE b$cGD,V@`dHEDHd7Ck e""BТk}1FXhk ,2B +",CI,/"0?iZGhFst&I#hBN"ad/M,6Cp1-,9G1Ή (0P H[uAN$Hm4"8Jt̊< 97 mXv +Ukw +S"o{knqov51L@8FX ,WԲŋ1CM,U^NE!Kf]V"N6g<WMK{.SbPBj9!mTt63Rorq͟F_kЇ&yuv]'p趲 I+Sq//wf@biq DRyb/fn)[j2>9٭H w_tsrId>bB A 3XU{b33t DVdDFF̧mn6A0ilgqre H,LL"ѳ/tͰz.KFc3v2gZMB;|^[ gf@,.侢$hs]gU!Q8(PokhlTg?$ٻ?rc#Hs )!Z"{ɢ,"KΘU¤~u;UFIWl཈®vǣvԹ:)5s|t]&Fy[(F?-[O=^˕ 5ͬF@xuh xk]Jc>- ɍ;QxߗD;jbKBT"ofi z 1N}z&0=sd}OmYq{wӹv|lٿ>##x}JZh?;پ>kOڪc/br1?:Kʖ#>jQ mJt1ü)qC C =q63@".Ȧˬ";4) 6z:H5?y\0SB(3Bs*R Bwy0=t0ش=>Dz#D:2DgAD=QDdĔ@A|?Ҏ#R)3v9,sR>IA# п /qp[%ѹ!7A‘DIq)%cݓ,H lJ ѬLHJKKLJL9B0:,8 8(0,T$ǍթR𵚸7(*:sϛ)59$a-~uG \-Bi}J4c4+a.(!3;%| rMUSv 9 C$ cɯSu\8[czĤ™V# '5L*r0J- jJ1!c-ċvw C#kj 0;JdSq#Ph=X壔*3) IZ,Z *z8츳f $ \Y؆tLJ,RԪ#0@@ҲۡԪږł4*z+"kUvB%A X-ŸK ۖ/}Cj[m[i]e }(mq2ڦ\mBM[YW 50:/ $ ۮuICF`jfbz(iCaLi: ~~}h6B h^h~hn"hk@UZ-eSh12gt6~ ɲᏚ?VvV(izNiImiϨFYE-͗Hay gnםi9;>HxIjHq^CK.knެ۫>0Jf:k6kl–=k0SՖ>Fm581׾m0ymܶmY&jVkn.Bx&IR}RF%!lnvrn=nRn븎nb oSsn6C# -|o]oQ(%Wlp n~pgV n<.BY)q n/ ?rq4^qWT$0;ipr*r/_n L?"//\r#-h:q3oQs7s^8_=%!+_s<Cc@tD>qNtIF[IrL8nMup0M'u [CNguZoWoRuZo[uG_?vJa_ldv> i;eis n?bul'wu&5:fnjkuzs҉ +djahHQS[^>Yq,ctz2Gh 1˜0j+1挛"۱)U\ϵmq^3Ԟ<3cղU[ ( S\KI#s/ڝ9LURk}=Uivt֧q]{*fNCD+B=P{o蟛.sjv;'yqc5t짖_ky f}:;x넻S2Ƌ~E)ܿWtd ,f!k1Pox?zޤE2 dP+:\.:u@|Ȏ2$y< AP B nP 3YS%h^}տm-} 9^ RXF̠Ax%2&d(ŅRsaC0Z `Z)"Uj:l5FS<XB"fNA#~"E,^ESX/k^yFpeբ>K'̘0 X*Y)R P%.iK\R+c`ڲ %+o9K\S2cTf+j2e4Mm&SReky;?I(P)0O'ҡG4ʒFD՘| T| ^ C# 8 u&dyS'HmeU2c$ yi/|"KcnLSݪ2Ґbm$ڮE7{ ,_1ۈ.M`ћP֭s9(x "Q7.k]WEvC_] 3W C5L›ޖO7%dqnS-nn._TRviL#O"vH15q[dR1̫Žmplb1 986,./]4LiY͓ V,_]IuÖ<ٹܘ.2ɱ^1ż#|gTtƍ'XSUlMI BeB,kY%!ڟTCIh*ҒuEdIr׾͒TոY}u_6vs&J:ϔ,5g%d}2tS>1#d5U%Gu8NҀfP"v(\"'J.2pks=V6tS1k$W )zR32}&ze "Z&Ed Dqs=@93'lI=)JI QH&|ϔ" ww"<٥ LACMݻAɶW22E1ͣڕvpы:|_:%Z%9A(oyH}9ingy/_w>_|7ѿ>Oz?zcaTr` O =RoY[9;NHm"("*CYAcnS`#[H=6Eb |I5pܛ6"9"(PXR cE%vN28M"JDeٸq]M\ZJ%$ @Խu{Q"T-KfSjgUL  ` Nfٌjf$Xq|%f@zb2&= r^bJ-Ǣ^SY[3Gf#dLHB>R| &y&ma MgmDŰDn~Lb^^pjJ !FD 'q~qnisP`Y ,hhJ4v.eP%L\f{&4Ň&l[*ˉ]\%迍aXs\e-&^\"3ZDF<ze` }ݮ0@Sqe` ?&%<[܅(b)['}xz U&(mnnfnI#PJfjhJIa]TCP"i6RVB\vdxՍi)[ZBʛ'$dfwyPTg>%SA Yg.M\b\)F*J[~`ƚM^tL,ĆkՈI:\ %۵$af*UIgTA"gʩaOF>XEUqFx֤UiGWFV-TtQ#elG"JfL`Pe Պ `YDך" $,[|l!66)ZTH%x \sD,Ňg9]Q>ף쨶(6c[In Uf vDY#6j-S-Y-2R9]9.E9Ů8)Rnn,ͮ/’2ͮ2*-՘Ȇ#mLe>"hJdFe)WHaZ&Jru$$DU #]]:Wv,^| "beof*:ʇ 0%"%K'vJ}bA2}%g*W"]^PfnVR-$T6%U$%PE#R^" ?HʰsY"`HV(eʟpJEpJYjƂI]МoY+oqu%>d]nȇz)"}1aQorVfRiKqѾW$"OU""KM{qXJډmj*Kpu&g&'kG2g#X83@c̋I~,R9rs Gx&&j22wı|фתbȧ#o!XnSUw6V4~w 4Fۅb1q;eʀ$fğ5(a,,&1<{N83KsPL_,J"Ųf6@QF-.ִ,tvҽKTkNxp]}LFRtLyeD+@B?i+.زnh+l^$>z UwG-cR {骟֛z-*aNJ` fI ߴT*IwJ5!;RڄzE_ޡ=jfF|&N s Vr VdiIK[Ș؞)o):%q-dw3!RkrE[r!36!!u^0sds8!zZG'.cM7Z^ŭ~,ҶDm+G,sꎃMu h 8?i$ 5?K#epejYX7# jޖEuMh6CAb{ Ʌ`$H pp FZߓu!(5aND1˶Uyun*89՝9Z`I.U砓o2,x[8A':LWDkX jpI_8㣭|ȣH ?FN5, 5M e㭵S# 0)jI5S tmGx.<H$e8^8J(Ab?* z;U+ Ѣ̪6|0N@M*2.Wz" -K 3 T;! G NRO< >4Uʠ\OO*@/nYjB(%JMA 1b"YpC[oq27[H/5d@"U $:>n!~c q(<].J=!La>g" j9j k:s(F):Q"OG pq taQ8E+D t>*TVAXC-D>K[OdJR+ ΃2k4y8kSQޓhT73} GDdp9ReE%y"pe(I9JSTe*YJWe,[PfN@%h9 *4sQ!KVA!hѤ <^7zǨ@+*JshcrLJg%D,p_cgvq;%ONK0l':GTU(AdMV"FuVy'X'2ٓNsc5ϧiVk42'TeT}hEUI8:m;#]"qQ5I/.gN%],XjVUv_kX:VYutֽ3b{?Em4W5rpb[ M`RDtb`+\9ҽtaAe8e>ldHsQd*Zɀ07!N&0Zhӝ!ŸխMK\uld3uka+^j$)GhW A*9 .;iJxi !օKT- N}L(O?42˄Y-K6Ef͝ LPr 1k -{PZ-5 &JEƤ!'(;0, U󒗰,4 ^iLF($0P#L%;yK\_fF>c?OJg-7(e Kx 6QJ+<9\%~n' e8X jHN !n?sS$2ҕ S4UԋRvƖ׻a$ = V:-QI,`XeE~~L4߶Fe! ef}a~`\Z097V!tɀi;aFWK5@4K9 FmuOEsTiEXM[nlWkJJ ߼7!1ԙN i$'^ZpfLu7ma}hmZrx󛞯;o~ rw,tot*]x4>IB=Ga[$HX`wJƗI=WG`Ŀ^vQQY}Xv7O)8]͠HsHsyq푩b*aDݹjSjy!zJ}BDQ(E \wl?+Z3JKBK R/ +쯰-ZIg,E\jk&Of@(f+`'DЎtK0|G.Ψ'fp6$'~e="$K9ʜ pv*PpBC(=`#TE>ϙKV.N/*Rd>,!R(?|Pȑm&ԠkBՎ GFip"`e꫽^epX/6,`oȌ.` 00&-'qCq#"f摒݌$#tn.$ч8(&]Pz '!I+?+1DT,2{kL-2} f)i ,yB,'7LL#eRjEs5n  -X 1%g, HE ' 9 Iܾ I̘BԂ JodQ;HoT.;p0w0-1]GS(S43# R $D "J 3ȸ%5p6r'xC\s@*8*L)} .gHĂt@["5C ofv4Ǹ09'i4 %>uB!d OOuxG"Ou4G)Gy7>+DZ/"[x+m%-T_sn4dj*bMunB4CQtXLHѬ XUXXuXCrQmQiG>UPu&ZuZuY=&,KL/mo0#,"$Q1Ε!NB6pXLLCHhaF2ɬVgL1k_6yb"v+N)*60VbG$'U[udOE[uZG,'pPCӂ蕺uf2lv8:mIhTx6^;-L/yH;FZ1@"^Ǵ`yj5LN[?k!lu'PveVeIVZmu[6.\\f\ev, .G:dN1Xט B"tjVsCNQtR}}~-,ubAQ=w|XyghUTGe"w߼@?u"h M/O:|vIdli@ɖ\bXl?ɅmXk{sx8Xiq>GI;I؈]X'{Ck -,蜣S4=I0*/G '$gp|)r7RC,biKcu9+Ax( 7'`x#7"?c.lDAD|} 8*(tΟ@|3]58ɊDSmeR0tC7:gM{a,i_fc@cO~X; ޹X2ak9G퐯RԄd_s؅-nYLVfcp0{"dj,1$ `UuODuMEH%y_>-6c'y+ %*כ-ZhdPt?)Θzbx؈Xڪ:Zs_&&eLGض 7RŖ8gBZ:zAɮؑ[m#(rspn.ʂ*RY&9d\;X5Nc^J3lzh&kSl!;EWIzة۸ ;ۇ) jp;_H|,u;QkVwuMuYpuTUTBBy5*p돓ۚ_ZrNfILL]r_ze#+ #O ;|#u HK) jkѺǰ-$F/z"|u=!'7# )<%(m",(Uyd>FM٥/i['vcIH)c/X(~Q^oi8/P9ˈًkѨ\CGfdQe8zD[:;|H? aj;.EцϷ ڄWwz|̝q=>\g n?&=Tn yr_1dןR"/\& ʆe]/ [+5-7f25_>ɝsPqoˇryK|tf-Wm5)l A쪳LBDL:.dֽB /jEjAS dr/2m磊0[rkO󳝹gOE6Z!œ\G1{e -M1/xQ3Z#Å 7 NxdXWF4+5ўLV>M=3Rxr-֝OXQ4L,2,s&{ N"6U|g3чy jg]6@&lv4Q%x e$<;ev-5k+48ʘCԂqR>n6!(Ks_Z@j˝ؾuj4ȄqLXTOsCsd[1'it*VҴS  PB 2Ā„ ' 4! #B4HB/BDᅆ &t@̙4kڼ3Ν<{eB*TXH0dR!_J`xA—z$8iӖBNP ˭-"ңP\vm+`̟tsR7^ Ć Ԯ=>Mp*D5Ni\hU½L6[vm˹{K`gj [tZCߵn˂\mڒiso[o[4XCmG+E棐%̹[im_-t_e9UA5z!yaIn!%F'D mdYI6Չp ߖ]e<-[SOqb:e)ѐ6Vȅۈ8J2eD@1V%A-Y^%wAP~Pǡ\v+2ݒUDTEAHY} 'juݺio:v'he zm51ғF]`^Ync)FU:1x!oO񿻕;%ug),L2\d\K1 9WVqu9Va.޷_G˹.b+ɕaqIuZ$c\1h!]2},6u]a=`^qtt1zTϿvU8.Ký 82tlyGߦtᶁ%t)Fx -b&Qg!I$Ua6<2g̍s&ìK)D]aXb@ThNkj<%0J4 d=^sp#$ QP#$Dv}&f͒I2Lfe I.%?'1cLOBPMӬ(9}hp8QxVt}g2:QiN?1NwTi$׌@Mf5N-]-AL:T䖫Su(v, زB(V)JE~z6F?- 'J&2τJ^ve:jILn毙p2mr\ .s * ܽ.r~ tv]r^{W5/qĬ쥁 +X$)3eCXyoqUg8q\N]k%in^%hQ%E ];NJ3IUƃ㧲JOddhSY\ڮd\\Yozf9t|:yճ =YЁst/<|>_;f6,4P'hENȷfS˸ƪnlF>K3)3t6vJ%6%tlYgzvcRlcX٨kuJMe*)Z3f%NZVb@֔ZnwOb±T{v5 X|"ӇKvI{1w$4Hl^/zǘ4x=JP6sJ411ۖەn݌$崥j-e뙊[} zU hP"m%J%HMe}Ã;CP|>% fGBδi4 e*!e=9g=ڗۤ](^y[RcM\1gmGohl/jҀ*"YmYws}>ẸykfU~2:hs~6~h G %T>-&K$kUxTGOD%f1FVPjf(-r.Xd)M2%(ϑiwI EX)KsG1(,"~5{ȂMW{ThCzc !,8(}UV;#|sPa{7 L1m^qtsxhf"B2J,_S4&HBx3Eh`s|HT/vcrh>R9|wU3r2 eX*j!b7n1Sx{_ܕ{Vm)Q'$2h[W&yS.Twj5zՆ0ĈHvX>=HTFWҌ̈'6Cz2iTI-f_i(9aHDMQ[8.ab;V5S#s3Czv}zӏ MHx>1 ATI+Ewg5T.Wނ0rا$v1{X')yK:ِ/V![&VhRz'X(\LؔgYkPF|Y#&W [V'ظ>irߓ'Gn YLA\(|yI.tea plHфI{jI9jFAb08 8Z)yėQPIHY4ʼnEhlyrDI4pDmyF"I8FcT(EfY%$iQ(ա:_Vr*7"G&%aC8YYicȟ݂eSC/)Hup1A6DsY9|ء|8m%avKVK#уT%h5ᅠs*cH?Z~RmG)T:\M͹N9BWCܩU:>x< [o1&=4d, Cn_zk@ҎFOJ2\-j)t `xqGqSp֐3rWki;f"c|k"לzꄖꍩ#4SsKd7ɁwQY'C5R'8'#Kt#iةry364ȌWd$p灏:N# wUիjhoe텮窮ʮڮ:jnb;{iDhVR0,w:D1n PB^G8aƱ;amIjƺIAI9?Z2 )$V'~^W,ȀqxoI(F'ddմbOJ%YSҶ?uWƢsnօMZD/NF/zx(rfo$%[w{${DvKwrZs+**&/ 61KA5dOh ~iQn8"CXzvq* KI"AI&`sPܡ?ZEFC՚#$sHPX(sD;,irV%?i'l~hS8|o+zH4ʪFUmįXr`72Nh_72 ~$ƓDmњaR9˕rdI6D8S !jPaA[x%KX3:Dϋ) ƪÐzr|}LSaXqD,.=̫OH뤬v;s5t*9̓iYȿkdfl\y{klRͯ¬Druc t2l**I|TيLzu9p;(CGn˧9ĵ\5A;y&g"}0>|ˀRTWiǰNKbХ:Ã)7%Eټ[X֪.{h-~uZ;^;ʂD^笉Y_9.M:I>=: ~ UnN|]>஦ׁ/)>l͏k8NǽM|!ó @v#ml{@JfaT=!.o("q+󧓱!tl㉜`ΑKN7"2*$Dš"|5ND>ziZd #VLccO`B WMRB[ͭ/쾷+ux3в^LP31̌DZz5>-u"z%5|KFR>1LGRնG-SbqS'Eyqz*U9Trte,ayӄR 𓖦4iJr:C ׸&Hi6U"hUQ2fFKN{k^K} 'OdNd"A g˞&YgG(i}ͶEf>,is lVԢCv]hHA:R'5iJ€ks (ZDR*M,Гbd6'hS{,,wVSt6)5"u-/N͌8n_*:ΰ*n/R%MU֖ fOЅB\$0JkZM x R˄A=g[RPԪureTGK !^).5=}ݤ1>1_ׂ%XVY@ HE|ruC W"L.@9;5(Mx_!~%Yc4E\1ZKNjmo;[ ˨w%^iS/,zlJeMڪhd+ [2\ 9LaJkLҮ<\<*nW綘 y9sLJRR/|c(FzC~/-` RAWV] yyNP>V7jE0Kļ L3PhɆ Z1f͌2k+ 軓]W)U[%hE)[q4E,f Ny:̍k["c -ǂ.o8Xs-`՞UzlfW6 2X]uLx!ml1~ 6ވ.J֓nSkڌx\Zg)|=G6#5'pϚ% n*#:uy .,Z ud`WFl+^JH<-ǸQHos[5sظ4j-NA3۽0_EL4ͱ7wèTv+Y5Br5oVm[* D_Guiw,R}rˉMrFkU +{\+DX:dGo3T^$oIi!uMgT2Y9l(3yfx)82B Rè礦+gP7nXk>l{Gyr`%綵s_}iVQ-;Ϊ1ʋÐQ Ucs>>Yr3mq".EJp%c$4@?뛞Q>&뀤s"`Z[k:x75Z2zZ>?""@"' l(#&7{Z&sT #- ?(,;m%-+a '-*CS /1P ?X'; G 8ۺCi1 ); ,÷>D )41@)7,Ÿ$HAj#ŲDB (X< O/s*B:$aҩ'ˆ$wѓ%+3;G;3OErn$1t,r!4|T457\Øbw BF'0q 5!B4iPQst{YA2+@pS?1PR;} r\4ٛ^xaP 1A-6u{C]T 5uFLROF$ %;~kS?u#F>&+SdL1uTA;SX]LH嫧1 [F#GFFS4?9.rt<4 Sq<yp:U-B8a"Z+?,}=m>*1u%Bb"J<8)rEd3;NpZ0Q`UTlV1(+B%BiQwW<sBDY?CiX<3wdB8U*zp%y JyBT(n}TWM6>۟6LUXTe7yٕ8x=\&6Y#6g۝- G=t~ނVK@%̖X)Agjj 1Zhu/C(_tK)x6K ylkgXSorUָl-ÜEɝtYAqZXE4PM~Ii)z~XXMnT+_D$q%ǺU6E-Y?3UUdYؗ <ٙcSoV'J,aJ+a(ͧ=^oq q[F?7PR 5W{Cػ[hs:[oDMOC~d$m<b1-'6XU:G _` [RKWlPnύ)*QN\X1+L$ߣ>\87OhI&3gә/q5t;狳k2`rtIV@QSV̷b519WZu rLG܍[LIl= ̨2Zݝvxv>n%-?ʤ4ԭnqQs;^$9sJМwNc[8{y9ZиrQimtEIDI_v̒P nsW_։`Lp̄R%>#UJL3! bM_O+G`Glvf|@qۚ&%UGX e}%bv3Q"❶qkE^wx<њ lO6+Vzic0ݓ׵ng^7I:nԈ7їUg>}ƽ\ TqXQ݋\K`&vōe GBnu@  aA ,(QÇ!JbD fxQ&OLr%˖._L`H N@h8/JS'; JΦ&G Lk:̓$c +v,ٲfϢ-ɀBIܶVnI pOKܻzM{†Y*8`1t^`PWE2Ic֚58PaQ1ŚVVfpx6퓄MT E.~H:2 18EP\x!yJYQi~-~?JAqUYGw[udh=eSw;9nUUO`VmMXT %PxVn]y֜d6sap"E3j\d! H#$zOBzG|E{Q:ɀuCNa?Tr Y)\$lυ4k4 U ~+ZWAs8PEUjCiऐ&iG<*&j䗅*w||VW*nx Y਑XAԟ,*oz2(e8܀(碿={-*l+2dD27A;M/8֋nqCdc2"c\/zSLIvq5E l9]A#ېk&YByoDvrU`Paȕ#v(o [BV=JTK35%,(h:I̴s7ZwL7zV PšEu\JV,GDIa8\eU}Ai|KXf‹n]TP“63N~ӐM\X @ F?tVʏ]g;]c)~ xo~$t  urY΃D=[Ffk]AH-yIrwY RD\! [($bZHr Т2qmWKůs+kX%!FGb|_gRDuK$/Q0!:ƅfsp'D*5x#@%Q " iH.TL gHIHrwC<&8űH0Ov+׿+%Z9CQ劊O#@yv:3itAZ"FD!-1k҆`4Sn&J\*CEOm;<'sB<95IS8=M[y:FSe7֦(H.7[lJ5'&'6;Z7ΦME_$.5] =_TD)y+:s"<(RlV$9޸ 4q`i$Q_d G#`FAaҳh5Z[E.:ҪZkD'̓wTQ UKfەi#G&!tRѤq\1W;3K26uCص.] #"/}2\1Zfd '`vbfd46;95*M; )wY;aQg{ 3-(29Ѭ*֢7ik m1NJps >ZBY#ZN+<îFj PPaHưT 0Ia _5)pN _cX=qw\s.^ՋV:1UL:M(5-A5gVAi%qqSMRXՂʣp4gOa0'2ra7lf=(?d In@3;O40ˊԥ>­w[tS8#mu—bъ(?zY;riV_-~+PPJW4{%+͚^f]j"^Yh3SEl~o's#=G&NedZMN\Pz-XDnZriP! tR>"kY<.G9gndo \' 5ij[C|QO'&@bݡWɰd1j+F/0CG٢Sy.fm}I4WC*syl~? ఠJ$*NơE$5̱&P4"|?$v.˪ @\Cv,qǘ Qc&;l8I|ITKȾj˵@L''ѹ|meOUMŰ29w^#u)4'e,̯?%2`ܼU%E\@ *橑Ŗ >qp`㩍SȔy9LTT@ahPfhDd@ 8W}dHKaa M ` IEL.ڔՍ9KOyRďe^d8ԥἈ<@8!90 :TN4Q@JA! )H`n!I0a{^Onȗ"&Tyɉo]ٚ٣}e nEVHKuXA<" awf{#yrZ#{{VeJɼ%  Sة3UէQpJڠDJ<c BhWXl' J)[xbCy}N#ihr^苺 eYjhG& , g\2YS"pDq*nqom9VK~oĨJ^[ h݅DfhYBD܆{1j5 <D3R%eQ-IIyPQ=  jAeƺJnl(}*w +sJ۞/eŊg|,d~ѝ)MV:hܮ>I"mSt 秎m%,"F^孌9))!Vbg ZaMvrtƒ"-Ʋaeք` =thhibA~kKqP*TоTкn%eb ̐oI*r6i.yՈNT N5d*]XE xv$F-/BC᪮M%Z)SPj,vz.dd iʛ(P$/9[خ\L&\ v9z/Jd+l9)ݓ&WyiodEHDNVʂYDcIalnTl5 -FL Mռͪ>pԑCҲg/ S5SyB4ZI8Z-J)WsH,톙i hj(n[3Q"zفY*~QtBuSyR$O/Q_1е#8ݡzDv5KPROv6gkR~bE?\L,* M$ } Niht3&yyEk"Z/hv*6&QKw>COE%$1T5hydS lA܏ˀ 7!ܧF gٶɬ햶H V`uY3vn%5eXAe#$Dx |_8|\VkmajӸ߭-B% M([]09ҵSVHϐk;[CR({jݒ zaXb9i+ewJi1c#D-9ʖyo)-CXuYA ^(<]i2N 09m牞mqK%`:q\iidžf橛zbw!/^ (.y S*[6kFo: Ω*z {_fU֩eEY߮^ <uaAɋ#g9b1r$!\"TuREa\*[hlE މ?uﶩ01S;{V~\ksο>zuױg~ޙHkZ]C}?z㇙-O7ko+o h@, .#{hݐNjz)(ːÚ\ [0<RJJ;n Py d :h5l-1,! ՛JK507ے+ -J( MN9q|3ChToɨ$  Дjīj* 1TM94{$;?O7d| h> n+VU*uYԢlNt:#ɤS-dI]`J5aԝhubWޣNZiL%H@`TQ'܈ *(tZhnCa o'dM sSrjT-L㌐@e㜳Yf}LM@+S.9K!3=)ymY>sƠ9:]Iw Qw m^CO7] s b cMvJrv7ﯽ"页1ixחU3<{\WM}#-K:ޜXǼ/B "}CcQWlC$pCML^+ "=cU1Uc%΃Q^>7{T#0o>#ZEE44-rByf;("``Caaٶ 'x"m^;\Uz3%dP{ PH%XjS$*T`;ے.<qg޳%JA|S3rNjx74\J5"06ۢiy"LoK (6m~%5G䈢Pq0Ϊh-l+J6yV8*]JyI z.$K UN^T FzRa/ҞWSL3*YW:a;iqg8u =8[z3el`)D%2_<یh#Q*w1T"Y!5Uy0ՙd@N@6TPɳ15nK[Sx5N6S:NEDI%'w(d[ Je$kV*׽}2FBR9(doQ(s'a~\~eTDBTM}SbBOdڙ*#.|fCIanr %14BG) mOlCxHeԃ7mrD% ~8PtPx)Xm[ )TOg6IɠZ̠XhK̥| O4K^64lj(#F m玈vp"Pj5F[~&L름„I5P<ЩM1R؆ .ࢰbjH΂g)\ sYNѽO\- AM q򩺶e+"~АC nvLmEFl(ƆۃL o3ZqyH{*ZR[XmdJh/>$$hd[V1F_ڭ*+̄[ +Rm0+-@c$=‘eP q#*+,ކ,̵IXz"F^JFfŸ:K0P!C! 8b1 eCJ&/)FЅ#5 *g܈f2*m++OoP)*|*r"Q5@r.O*-Pd+~@蛐E031s111!S1.)~|/"a r/O"]r)")5-5X4U5Qs5]S6n*6k.A337S޾ۓ>S>?S?3??@3@S@@:tt3/{<}s8ooI4==4ItJsLsMדJ3M4K JLϓHO-p6cr%1C}:QqE5S5uA{{H-9 .dHR!n-*h:7VmU\dp*rGVl$`|t%"3V?/h6lu ;C6Eo#ˏFŠ5`vfeh(VNQc+o&D<)v,.h7&GFx+FT305p=sӒDK Nh6`%kmv.f:tyw;ep)R0F|k+W .xf388ww7{{xC Cd7jPnի\ڀ0vṮlEƴL{~xQ%w `WFX1n%^uG`7%,@4@ [U{34 '9&kT/낧30('4Du]%dQ퀣K|zRWݠm*~1A5Bza$d 'ImdҌQ [k;8xQ+xjcXUK7}^NE۸FB2BA x}lYp+ fk6b9CƬ]zotx)9$dBkzx'PQ& ͑#َ8+lǐڮMN (yF\0D鼸So]9+Uf(kjvf0 c)xf2\ ŃV2yT&f`G|K4GBgD7ΜY/s0"/܌e'%Z8%("m4ya#l>Vx|Dh(DWDړ"tR`-,X8%D TCY!Nhu7y[ sOx `qT'LL5X(7:ku+5\gQie+[kuB;T-Q[<ȨU 'cNX(M~ڬ!T2:Iq ;xرE&F¯1;)ou: mCOM䉹q~]ke{9eh)X^`‚ͨ}\ َ1,6V< 91%z7Cy.:iӻrjj k &{`uS%A|E׎RUɓ&rII/ځY ̣˘|]5,o88*XmEex˓:TV~B5 hǛ5!%;UU8X|? ?5K*COȚ\;gf$mݩ%qhh VT"Ee!xގyeDiH9"F%dywGMTYғ~RdZe#Υ@p)tYؒY2$rwY~gIUǚ.hm)ibԀf馜9wIzBPxeשlRHjR 䬭t뮼اqw#l'kNvf5U"=k~JlTAYݴ.Fork钢IߑWlRZWl1|TXVĐsjG#.W,oT^,4׼U6WDZh,t7n66G-TdFxѡIefJ3̴NËAUTZHf&kez-/j܈'#ߠUG&&P"BcN6e^$騧/!9Wm\1:zvI! jw'7tgwk"%Aj"sץ/c/{q{;_; I̵3 |{@ߩt'!; Ȣ8֌'ygp W™[c Q53wXߝp"l8Č,1WD*YP JCRK!E5 SɎu9y,%әbSm:~rÚ^gH.vnU4w4*sU<-񑐌*144˚,iэHpÓr?eA_dW1e.U^fydh,MeLR I\>t/I]$I,M)uԥ{HJPCL:&MY b;`4'")·q h%QUc2:x,g3mIGZqIt@TXAQ$}1>OF 0)4u;2x2:zK'Q2D2MR-!\F Y.B+%e3Բ7;jBRvg<&Oai+kKԳ1:Urk,rIL.acf? ?tM ./heO3j'9GsiPIP,3lypK#XK<ak/RYLjˋ2DEJPB3[?+Ymny>D]{ŇW]jơyN'W=P1NQ60ʧ]ex#p8b%N}~gL HXޒNWB,AC1|Lms:AcbNY_Fҗ\䗄g{eZO)en—?뤦`TjxB^RʐW">ᬒ֊艗&*Cq mXƅސHwl'댴Xi+:(" -&Mj{ޞREgCRHkF*\^AeT[_'IՙC9uV0`//]Dc:ۻݻ흟yq߮7J0O3.GckM{\~g6p@i6Վ@ 4du qZ̯q{K6q"d&xE~Sg^Ђ_6 -uc,?C G2O7y|x):6"CZ$#+wP}:}D#Jщ~(/t%DB6E"P&fuR (hJWҖi%(#R4WO@PJԡsAќ=.0rtҡZXVd"GJ֬egeiPDY*׺hGQu)4'v-l]t(,yF;:M,b7[Xfh;f[ ԜU74 RRz6-au{ִm;RhĤ 06psXR׶nt{]rװݮoA|u5պ u;_>o>32W騮t_e!%j0woKaҖxpqt#4^ iҨs@q7\c˨ [ hpрF4|[9X-{9~q̍bԦ(Pzj`xpLg0v3u mTݠmm3ֳF3ю`hL6PtښիF!MQF` 's#=KMY:Ǔs\Ou-lG X00A Gx6Mj[ؾ6 Xl&(! f iP7p̠F0lη#A F8AÓ!伛z@C2@4A'N[G d2xB[S@uCOW&X  _М8lcvЇNM̠Pԣtko EMZ 2@׮Nva,a rTG5Axϻ!}F3t,qrz #л'O[{5qk!9Φp 3ֻ|9ARmiM9 D>O|sGpXX4-zYdQ3~_[3h~P봃`۱O ߯n H##( 8xh Ȁ Ȁ @ X@7z"aG& .؂01Ȃ2X4x /h(x3 2=ͧ ?#V Gy 3Q8HRȃVS @p t0as{, \XmxnorXqxpT(g JpPGpcx0hzxH舍 p 'xQ~ȇp-Ä@,Xhxp($0 + PȀ8^،00 6|g 30G 0Ȍ꘎Hx(Pڐ#R' FP h؎ YYI` F -&;G ` I*+9,.) 3)^x`x{3 rsH5YْFGIKi( E sȔJZٕNIٕ`%ܐM_nm9'` A(ؗt @ 0p`|'׀z3r`Xȕp>ȀGF0 Ǔ S ɖ)ٖ)c v1V"r1! G虴)y(ƠJuP[aHr.@Yܙ)P0؝i0-6@ )Ypb0g@7*ʠ *J A R0 ' :02 3j4z61;J( (H1r1Qz\=ʣ5SjUzZ\zHCj75cS%(]JlnX s*[Jw UIa0㸗uymʨxڨ5 'rEy j:J:W%N **Z*:b(H6*jj* RQCp͈ Ś:z*ڮ z`DJAR*AEqh K;[+ bjTE%'Aĺ ˰䪮; {#{ q/s$F X۳ )+ &+[G5P(y`HK?kA*;X ⠪/[{D{]T+[Y  F0 0 )*8K ' 0 S` `ȷ+蹅+k;k۹QkzB33$'%Y$(ۺ뻩˺ۻǻ{p S PK:J%'Nk۽˽⻽;; }wW'q!<lxۿ˿[Py4Ij l| _knK L"||$<#|ȫiy (xPH8 `G` Ee0? ť+ŰJSU\ Sj1H[$ ȗZ\ Vos,Ǭ{t C|z3 c! jJxl6|Ō\p|ȃ;ɒLXɘ|ɡǎƳ {^7f8BUx<ɑ 7L˚\T\˚<~ CUJĢ̬sZ< wiO|͹lɭ<x5 ހ\τ)󜌿@ (1p1CsNIz >>@ H m^ =x1,#=? \80e\%3 O-? %݌ſ 8! Ȑ?H5 MYM0=MlsDQ B]8b-ǧz}ߠ]=kI-e ֈ W^hҔ =zmt-|j3=$ف а상m_RM*m0hїݠX-RE҃1ʪ˄)h w ش dm LҶҹ`Ϲpˋ ޼ p1:&]݀ ݪk ݹPw.؄) M]7l R nÝ[ܳl|HA͆QZ _} @w  850 50c(88MKƸ Ѕ.=п)׷YfnӺ-m=V}˗/&ְ ɂ-A,_] +ѽ-!-=ˬC';S%y=Ӛ=ްHє}}݄9ߌMd_xߺc `=M5L +N XςI; Ep\{~]^S~˛\=_ZoY͠M _z}r~ h %yK<ܾ"ðȺN_ӭ=l >kΠX݌H~3"+~Y>~Ȥ)k =Q=1e^=)= UH?}Y 87n[}Fx *MWYހ;ˇ _ " C O/֥ z=M}` ~{v`  }`xM'_M'1n t/ J {xPGԾPϠ@#M0@Ҫ@` xЌnx?0 g' 7_AvD<~E8QtыHo.yABTB{JqDPtJM䰱i&wɳ%/<@Imjo kHRvOI jňʕmX~ *A&\0}MWCto]R݊g"GP(Iy%i*&9'ayu_'Ho9vDw/!ujUsGDivGRw O#9&3-yʫҶ-igmt*"d:JnYrCrE$fC12y9nK2cnUJAVYK!PRBjB(;\0.q)n(4yPYPoX I6hCB)L+ʡʢ`Di q_9K(g ɛ( gzŗ.Fv9Sۧ "blM -DWaz衤PǓ[1)ozBYe<0EVZ$T*S%Ur]U6iĒH~3Eu^z5x_֊kD)%JDPqh7Z6Y$KzPY\WV)oPCJIP֍.UL\PVPK.'z x]Qd#-'KE]TYVy,aDU@$P dMJ] >U6Qa74z8qoJ!$d <@Ha*$_"VutŹ+^[iMMa*s܄a,o,)rFVpWrj&/M~)UP9&%@#Mte]AdCz6HQAAi${"m1*D|S;6]Hѣ'mE)I>& pۈ*bX) V sMKE6GUx H#<1P@ V& AMqU<‘m844MNZ֢diH/3 qYX ! u )U0[Bk1cD%px!u0a-j *AgabJ]&rnDtZH7P =}BՇRE1\0$5G`Ȅ> Obp& Oa|Y= ;tF>3Q1K!& ;G"> 7Dy p <0Cz8X`|JEAZC ub}VP'ЉOԡwjN *N$ZAW 0O'ˉA5Cq VЁw' C`⺣PD80A jtEx^<ꗐƷu+cJ?cJEC" >;zTbD>]QXp" Q~ `pN+qK# q\)Pk{W E(P8猉_J#1 7kZp%P]I"`.* V7<RH2qH:n0'Z~"+z CPCr9Z'P1]8Re6qE+E&L$Be!aR 7'qzXpH5x3V@MN?ȃpX\C|2D 0 `9{AÐؑB@FKA\q(?z8L>2JbT@CjXrHEz\b"Sq@qۃ44Q-LCX7pL8xB59A %Sx 8 O X  x"Vx ;M|O@!bMxB(pJ?˕P$yD0˧P1>X3D[oQHXX*)QRB)BT˸7<>xoJE~*.WEObEX44}%C!~JXQ:8DPMK#M.\ <:WP\iG|ȫ@9jF)**SJ% [\)H{ȕzzx zJ Yf(k;rh:ڙ9 H%û0TNC%kҶ\)6bFyV*T\HL2CCP{@I;"xJZTAq ڥHJECh/kp:X^CA@o -4xFoZхw"?zHLЊ&8 Pë#P&[hh/(ԕ⺊n_IM`:]ITE@9ދ](7Hw&z@7@PKȸJDqEzz.OW@Hx7(+L09zPI~Zd#*IФO(KhB ʬQSbJ 8#]PQFL@*MNDB*oP}z/Kx,ۄ?Xgɕbu2H@ʄQcjIxa:TDL + Z;QKFnl\-oppS$lD$ͱ2LʞMppBO0DLHIOVIVhc'Ѣs*! ]yuM@ȑFT+T? z+qW8{z(qڅ"H;Q3ox\ɕ E̮qL]@0Xe7X5۫Ѫ:t?HxCJx7P7:NSB7:Z8+LJ#;8%X钎WbqoPW?'`cD/Ӵ:HOD 5?"[LH]7H:U74x?OA 5X7qVS;>>(|aARCAoXC 5H7O`@<rb 2Umz%7 ED%[C25;PXE:H3ݰO8Hp1޼Op;7X8,FWC C ZleAgU@@T7:F@?*pq -덃W?dC<ɼl a2@ZT8֢VPz߅W$^ =Fp =ݼ3D<<7`q-6MEp΄[@QGÅp CL@<4يVݻØr*]@Y\8SBO@ m-qr8Jٕ29qh#h) iSc YJyhjJ+Ji;꧞jqȕj%)V͕ˀ;u(e;>a.)S;1z zkr1Jijaj<@afn&yzVlF-P`T@hUnmkmkk6۞lkmlE즔kNnגl-ڦ1j% aXi">4 IVܮ1qp arNjľkzClan;6?V6JjovzY6ԺX/>H/\ɾt-jAum7>njVnqGTGn.Oa,JmU2j~[ko.l-7i}NG~snVlB/=ɕJʝ\Wɔ8h{iRʻx&nc`CBI(GOV_uGwXGuYwuYuT_u]'9Y(CBT@kUbD#RSu]v;tSu^vXu_]umou\uVvl7ʊ"R^qf%qAo?u=tjgv`wi/jwUuGv^wlu/wYGsxCu[ -!dW&oArY`W_v~_yS`oyvW u~xSgykvS~7} DcyuYx_nWYuu;pSu7x/_/m'78nyuCOx~O{o{u/Z{G}Ggs( 8~Ƀkި T[pν8{pxrVUKtQFF+]ʥ\)2ɥow~\*j)6Q0`od'7ξMߥ1~~%yoygP=].P/qGǏ߿2rXqF!D-BeDiL:s洙sC(G(=-ɐLL[J6V1bh,ڴjײUcȱ43yR+U }׊+zy 757ޖ&w5^Db 4Ԅ~KtiiT iؠķ["BrlwڴDm?S`ԙ 8Mi:tا/O>y2 ˃jxV'VѣnG7!VTZt HUgCe Re7B zN<Ҕ//P *@0@:c|/%"NndZ`?PD .] U(B#<߄ Sbd~ LfeĦiih2%j֕Q{YTzhG]ġߔ} RSCKb % Vh~Yihb*ɦbBLm_C@?JrDFǡ|vexߤWWW„A9["_ʳˬ߈ت꥚sAmKb=5ڇW /$3liDK=}C%AFuIu9fiK;eB1cM?]ګ@ֆ;z9-_r&=4LǪZ-G)a0S]g(fu8_eDiXihMm>-&ͦQC.ulda*4ĂQ 0=*K a܂rK atgAh\eTSғKVUkDc[G+IvL?f| { &C v%Q6]Cq_o\dWA{%3 @W?xp@O$0xV4(4" 5L&x2' 7 )lMúF4Q0 c 84_~/akgK9ұ2A^B[N"I|ȶ3%+` 'u|?H!0JǨY._l jO*1<2E#% >pV0+QKJs+.wبy&[!0>9,d;,uw1 '$|'~(E:eńZɞװ]UJMi,}'2gd.XVHN1d\(F ]]ML^)7RaS- P \xb* o&T|B!D4@+CD',Nlh+4O7z֣>%"* IDP塊UX9TbJqH:#(^ΙQ4T}:z%b6%,q%ĒT=`O' Ak@4jv(IhmkMb6BW!,& [aBN>Bl8.ޕ/f:4Xc.WhHV /x!B$".}K:Dׄ$ ?y}pGe)Q_TL+S<| ^R#N{_)Kc!t/A^]DP Y fOwzB]XoVKn2dVd>þ+NZRbsYquݓe%&_Ȅdd0orQKtFE&C4 !ĺOzxq% 4!B/`.дҥy[ݳ^:u geO/H44;=$ ٽTZ8ޱwݸqvޫd⺫[UH߳pc{on=no_=+FHOz9rAgXY&c1Ԁ WxhpC&!9(԰F,* &7i,L,e7݄]⨛` J!kbhv),$BA($<$B(&0*B<8• JJ}]a ^^ꥠ Ϟ 4A5u  m^  .amWJ"?Cy \.YBT[}T.]WA>胓`q;50|aCL!!b!,,Β$U" bz,87ChIՌy97̀Ҷ4+ ,F"-%R$^x/.!-"&]1H. 4?4CP^I!&b!""8~V/B<¥$0b75⟥6Q?)FGD Ly&|7,B' $PL(C"x&B='9 $=(D#dBxB#+xT%P#T7X%l L̓Gj8'4B8'MSAЃ m$T>0`,="6jYz#0F8f#,};Yc F+_΢8ElK);t48 jqc]cZe0֗<cyct0T_-5ڣ n,^^+ןIe .fl##U6"9W\V:^X8}IهK,+ B=!++A87!A+'@'"8B=!A+L$+ `$,G=@.A#A,$LUa'!+Bj+(؃ҩ7pԇN;J? Iuh&F++B\/jgu>^'V뀎gi=ܶ/:DC7;4vC4(=bBbwYN9(r >f:^;p F|DBBԄR=EٖĘC2#)zD? \8F<nN(hүί#QJ289?- /qMRQW84@9TVC5W a 4 09-L9Ж۰ p FW@ -gE^:3Xp7p p Kqp p    q_q O ?1Cp-hC?qnin@q |00pqq p4hq /p=D c 3r 0#';2=C5 @jD~oG52gr 1{0-#r. _qSMC Wq"Sq&0K1522 FF걡\.U^k=*xȎ (䈊@s䈏=<ϳ4,tC3܈DHC0lԋbYy3l1=81g1#;3-s(!Jr5`G3S3.csu(CqP C1/59F/WsQO!4Wq$c2QO4 _q!tW5tWtVǵ52p&6\C9 C34ZC` v`va#b71C3\585XeV`5 C5\3fy ,(Ca3a'kvk6l/fS6bO0 5 cl6ll#pw3 13@1LA4 19EXC?uKk_Gvp7x7p/xǶfy`wvx{|[0@37(biN1xc{{w99nz7f9+8sxw0@4>>q4Hy_899|wmcz0k;8z'zyyk;G7@ ̀ A  ::A:: z @Ar)'y6+_;go{ Ad;(8~g [7bDA Ѐ A   3;o<zA :w-<8A@<+ɓ<ʧ:>?ЫT߳z~s{ʋA< TS> D?C;~>C駃C;>C>>8(^C>~:C9~;D*,}:4p??Ӿ췃nk~[?~;\W6h_s{?.~:g? w_B~qktIlE'rqFE1]G4MƓ%cvIdΒ=l_Ą+Hsjʚ(yuM&5_tai@IYMݪGnmhD0?G 6|qFKخH3q(|Ye̺Q&*z}#]/]*ΔI̺\l._a[fj߻:ߒYiҽs>oFW~Y3xߚTڸy K~ιT_ˉi-o@RI|Z}ᇝ,,jk*6Ͽv0B -c1.'xg=21DŽrL l"'xZ}:h gg}H\23R2{R2*M6LN3lP>a~<+bGcGJ4ēI-S #(RL uKKj@!j,ʯ)%:sST]MWj!b d}:Myǟw"D0(U& 2̐38ՐrŗxTLx̕6y\na 8ذN_^ˎw7Ìs+"S1}DfM|#[]VٓKNQ٧JDO0qu栙MyIMnVe.jI&bǁݚ(VCP7,[n V)1&H-Vѡnom,[Ʊ\́/r-'nۨc=s!qH}[}p;_=Y\e,nwDQ xIG\3˥˲s{W{s/9:l>accl~޻oG@1hHRCxF1N1:LjmKV]75Qok W(Z8h@ɩG kHB.Q 4hq`6Cv&am;CgQ`CEzla44l6v(^T㖒@6Xc1;z#xh}/<=>L|#=Ғ *UGuC=0J[qm Ǡ,)FEoKu8G!P^At EZBq1ql mә& r1\<ɣ4 b zS\P<7Pک`?OVJN΃d"QHϑ _H roVRFϑx\D8|< Qumo)@y:ԞΒG ) zJQBQ׹XwMMQjTmT- 'pLX͖38 3yRҚH*nô?N&毆 MJهֻ>N[_wRy= dt'`#[ڲV ٞ Di0Uv H[8JS%}L SrUnrӐ8n:t}iWxoml-OVҟ$vETMLz ޷, ky@wy~U [Q%!`wWps*BZ,cl)ah*1t,vn gcלaI 1 t;--%diY,ans.U.$"\Dg \ B嚝B5Ct},ErMhGӖkҒ@uJv O'XAYkZJl7ʴβӯ 0jv\7W KZ}=8{bu)~ ׻ε=miZs>1ᄯvrZ2qJ æMzӛ7\j_I&8O-}pyE.v\V2$9e,g2g<} ٞvC5w\~}u+}vwkZ' :y{ut/ 7 %pD3ԭ+\XGaWGRT xdcѢs'^ؘc=y@K|X)!LxNXx#^O}X /l-ڣe|{7эC?[/Im9xE$?J~/{IS۞o-3.lhoY"^`/.30ª, p7/Z/pAF5gMPmdqF)GlD,V~my hKgǞypoPLnmh H BvOmJBzPŐG GX0pp'v>lQ QI0(OIȄ 7;oyProAA^1aQeacQwbv1ogkB 0p q _G0qn0ڪGݑ)W0 q12 I* zE1 ZH"&2M1s$#OroɜLR%q vNlrG&gr'e'(R)))(**)2+)*+)),r,R*r)-(Pg~0N "z`$b'HMBFJ0.+s10%33!44Mv<(0C5 #(PP d6gn6sS7ys6O@78{S7ds7s8S76fN`` D@88s999m;ms8e!l?gLhP4)0 2BE!8'"BK1yxB;pi%&?J#NB-zDSEWt"PEUTFa#"+(A%,E{E[tF_THetHtHi$b"ŴPVBA=43Mkp$K_˯) tA1HƯTM,%TMSN|M=أ=OPUP5Hd!v!Ρ"PQte 5p ?NUX\PS7UtJT-2"MOUEOsB'UɴKJ5g55&gJV*UX/XYeX0! "t PY}U 5[P[% Uśt17'Sq55)B15?T^ `_nB_AoNSZ`/ɾHkvz ȠoaZbCPʦcodLPas5K83? aհS deBenuPgy eL#63₾fi srFEf"m!xa u "]BDQ0o[ ,A009Hx_Y'ޙvӞG2"Q"B)⚅(AyqE(x (9taUu5Y(>ڗS/^l:@Sn0ntqZg7pzwt4"(r=yǶ))v9s/L:oDa(L(4R4Gx@aUvZc㡟w? (2Gx:4=gb3]ڣbUxY.O5~ŕG5/ԫG;QZ dhU;w4m4f1`}/yu;"q [Muso;'|e 7e_ںu,,B!Tl{/7})W!մFW[JhYT a7h{B3ۮ _ Mw7Uҳ*jAK<=ܿoVS\ Ծ{}k8oBQ|{uҗŭ)y6ȍ܁/q<:+m%})^ܵ^M ;Pх:'=->Bm<.!`lܺ ~Z dEFQ9PԝI5~)8}%xSb=] Z_^m_b/ _zW]Pϑ_37fhw{|^}약bi?X^ )~^I?^ 4(]d1i1ƍ;z2ȑ$Ki;h̙4kڔ OߵСD=je;^4ԩ]oeE\zu*4;ū@pw Ă2.Lz bz `}լ[tUlX״k$k Am dLtCKbΫ"h-1um ՛=\Ksz{cƆ_|מ?gE aya&-JՎNۆ"?ؽ2NaGbYHI-5ulYc)`qؒ}9O>Yg5 $a-YdYPgu31Flhn&5ub'vmgdK "*'z i.)6iVWᎢ"Q4i V*꛽9Ma*UJ& aErY]Xl1wl^E,:*J >7Xcَ? ꣖bj)qԎ]_i? ٥K֎Ol#]*6uk+'?령.^qK2 <}-RChsi 'Z6/G>?P:Kq(!)#/Y$2@;Kz~e@@f'l k:,D Vb?6Kɰ#9D Iz@QG7i榦I5)\\)&Lr:eE-6Ms:(ƙxlN;8qte ^B 88[)lZ#5Fd[-a "0Î}I~$W{)\ `)C~qaAaIƜJ˘HFj/5d*d3 d2sL}ձLΊL7R51!uzd;ˠ_7H{vC>O@ zЄԠ (CЂ:teFЅ.Xa W`3hHq1,d%m?aK[ ӗƧ!1P<9ɽ)B>&y[V6=jK&F.?K:ħ{d]^ ֘f\iGube[ ׷5tLQ7'/<f Op9򄅰ڥ3n(B CP2@LtZ~L` HkZԞejKYlc %mo9[ئ}-q.xA ZШP$aa, Ƞ2MXa ^r>FYG&JK[c|ˍ Tvߧj\{+mhcIpCkbcFX?,a&1M,xNbΙ"eo,eQF7͊H"kg*6BHt=ciN Nr$`[F@E ?дx3[x^qGt(Y^LJ'{O?A^4W6OTE;WN9}oɭrYܰe 6d]r/GQ=3=+KH_T;ڱ)qQZ4jOLd105DӴzfW-#^i׀ȀHM]N@?E)8-Ec#öXX~78%.`}F~!~g5w:9'=m;0c*{g(1  ȅ ﰅ.1#5f"j8,b!7 *a8. :n+ч 8Tts2T-q!.>1ux#~Ȉa7*}8,1.2.Rxd #3&hl(.(5]^svxe((_xy(\`~8cih¸dH!Jq6WQ% " ffqqǃ\5a8ˡQ%a3AlCH3SXmB+1Lߒ=^kDWV mVM-tԏF8aPOz )T YeYQ arXR1(ko:s|!II /p!(l,c[GNhL='^d;ɓ=? A)>i0:-1U Pe8ZUZUiWY[9[QYZ])`fpZ]g[9]dqbI^)iYNȵ[dLfyiNU_^iQE/V~.)F-s"Y7//HY3'! (lIy,Ci).xMÐU@Q4ROʼnɩɜ͙4RP oiٜPډݹD)#e RѨɞ I) Y}ٗ`c".; r1cFy1 b,1B/?@NLsjSsQf vkG".֢/.0:Gf,:9*; I t:ڣCyDʣ9e?a5H*BJIjSzU[J- Qe" -h׈~EaI/z/Rݱk)LJHhJ-A@Vn/`6r&abj35~ HjR)ʪ^ V3 *ګJJj')fbj1iKQ& /PHbMe-"kHظC, ƎL;瑱;A8-D9@a!e+#FM(/n 62u0I>@ 33#Ù .GoȱJA($# ?:;wdbc);E譋~5g4B{!q; G!'T[ O43=[vm:Zi7jlۦnP K['5H'9Ļ#DHCUp~ =a+B88gWLk{ i J ,:9rnwKBDJ{V} 5#PdҦ=6Kupr@AZG.]7 iJ6Z'gt5K#ߋpkٙE>](s3/A%Q2<ØSy56J1rӽlPu[.(l~?EB$b|{#N~VW83!Jþ#7 /CP1$ BslAt~xcAߒ?hCe<+n:Ps4=a64'lOF=7LN*lEQ ~vl TA7L˕GØrwA tG|10saŤ]kL>g!Ӭ}!7S!N?gda47 dqK4vLC,̾A6[{|ČL.-차E NaLLQ,eA~+U3g"yiVEX0u+]9plu,<Ǿsx\qy4t:]K N46"HrfX\,E+m-p" l,,Ra$-QEϔ~lLw97sf|mRUcgrn@s;Ȱ4H\_Dik׼WR|y!>-"7;]?8$4.- ]calkJ,!ٽ;4c}Mz"htf<~1e냍e31$a9V2wA9A^RJa$JBF 6AVAWw]M tQrjNmXcfˑ!- ]yh9~2%qT FWͼN. aWc+#&n~&Mk,ڔaQ!pn$%|IIUq})RbgCyQ̨ߚ40Sէ+Ce.+ۗ/* @QӖDhqBA$jqK -]TL}J 6X!*]>6d4>.> ^/z. }]1>Kd,,&jގaN0AxmzQ% a>K w{ >`KT8\v?$Wj#?o@By vCKM߃D/T;vi҇sdۃ^ܰfUMNkclp͎g=y2/_DAfo8H&9C/p䬗&޶?obf@[ǡ`c8u[?kk jΚsa:sgzvx&?|qcyd'' :-+lw7:~%w3sk"jmjs;JhO?Dx *t("Ç )JXp"F9fbGK iQdʓ&MB);x5[7m5q:ZDTRM>UBMT]~_ձIcUZl1J\S *|bMxNi:ѺJYzMZݚ"&*92WkWsݏ察 BiZ^'60(ARg!#YЃCX:a IB=* ֥ h8UKNx(jBbW$rkPڡ 1b Lg*&KUqcPE4zыa"F1vQplh9⑏oܣ?P"Mm !41d$19;?d>蓈>A)^ DF}{ÐҘ9 1jGmI]MJf4 >e Lf/8!F\jXZBQ /}@j-zTk#VA+}wr7l|)zM- diatҀ[4 #0K@ 6VC@B'ڣ@ Kx q $ p8K{37C>}? $gC8h BlHLw#L8̸%|BX@ɸ(8v ޻> 6(`oC8[1L (;z3C6Z t+qJJ; T7ryDMH[ȡ۷rIH˼䌼\ |Km ǼDKwCKdd,t̸4 N4v ƅС ͇۔<xp hJs3X.,* hI K|7e\хNtSN7 XN9K0 2m̡ ҄8"牉B-4$%; xzM، +ԧ4F [; J밌mTBoFE܉l@7 RV W ,HzR~!M=' MGkdBDDa7 $D\@$WzvI O Ϛ0 uh @tJm`7Uo,Oz-0NUdÐKhBtedjfH!`"L,mu;Zӵ4BWP=N҈h7XN@mHЖ(h5NXh!T#}@*suh : |G;S<+QRU :P($K]NS jc^Uo X}a]U>Q 4JdLwl qE0Wg3%O}}r{xۚclFnWaX6 ÅaHxq'm# ^rم4t5ن:A)f "6 VrH!2!}0 xxܷQ';`pTguTwUO;+QRpXuu1_uZG]u!Nsu&R<;\vUVkumvkvlpmno, \wg.xwxy`wy~zw~|7xWx梈d2rsxrxsӹ49.Z6&raH,;CxG0ESDr8A,aa8 zwzDCPgzhzzz {߲'@/{{{{ Gɝ08}RyR&@)3@i:.ɧ wh|!e!& +ۡ +[U!2}/Rg}S.0P.2\ںRz~jp~@m~it27~~wx۩1)Xz,䫡2@p„|8ПĈ xÄBȌ5dQJ.GiR%M0'4s>O(Uog?Ou4Td[$4mArdӍjrhv#zS6tDdࠃL04292<A8B"Yd?*$O NFYR.ieGإLlq>0XRyin&orY'L:q)@:Ì:8t:v¹h"(JEzDf琔F*NZ<č:UXхZENeث&SXS,l>Epa0Mc2bd˭݂;{鲻+X뭵+o0 m2W0;2VoCS<m0Øw^2"Ln6 lE]dqEHHm9Τ۰4klB#m':~*ןWc_7a06Y}4QkvfvQ_]~p? Pla[ mI#V>ClkҷA8چ4?K_A9Unyd?af+Of“B7W 4:sC)";y=M}g>PUqfomj>oA'{!p(fGp3sJe֑86If(,*I0  IȬ%L wB#C`eBp:]C 0?a!ЈDaGmIDb h%*qu#)gZ,1ksn87&oK#gz'lp% YCɐP)u8#+E?#-yqF~ĸ4ѓӕ`"CJB[a*coYя"/_*0E bc26H%dt`$;V?Sl&7⯆&2irsTg:Nr!g1N{'?׹O@ICxx`|O>?ux>T)b<-݈`=hn(95uĐSK>4^hr KSWR=)QxF= VM'D"//T]$^^&h(GPַ5r+]j׺MSsO[:w"CуB6c!٥q5,g;ς6qL;pp9P]j =;(HNJ4rmmkL3Ʀ6J"W}rRL`X"E)uvqDwkW }uq/k%M0W\+-\s`'ъRԡͧCxD!Ћ0D!,J ~KalA8UX\ R5Yiu~;hjp==#[kM) 94N&64xiS,1)M2g"9x2w ϙo C9"W<'Бzf2RE!g~04!ƐUft`k{c-ÎviNcLȰŎ4/Sa}=vByǯ2m8J*gtzͰMkH!re;bTw7p~R^5uվqH<4(dFcF?,]חieܜrkF- 6رfPkǎw`kfoC7+}qˬKE虦sLeGǯzsHͨ.V4\%KV7ٳ&ZsCxPd.H[E 7݀,9%<+-c[fzmj/MkTjvr[Zy߻2'94œu)YSG>4014ڸ8qH[nԃ{ͯǰ5w?^ȿ_lf+G;,`ӵZ 6SPYPQ ]F;P V=HL]PNW4X\UݭDL\^Z?P9^)-D!1!C(G4V F?`eޙ9InT:xTJHǵQD{X_QT bui|yZZm!˽R!N IQA_&5i?TE  hw>cy2(VaRRqAdf.<@VzR 5_8 1'I]N֭gvHʅm$mjfg{M\{>SPg9H;2? bh8Y">)eD ADB<<rw.IԈ[RiW\b˭^٦#F~B]-]mbB]7 ѕ߽&fܱE94RDi8R\Vjer_p9ܦP)Dc3*Gj4m%%<fQeq B`i"i^fM8D?lڨF4|Qak%E[-~q1 bemxNױi ś௬_^޿^ӥ&Z!ycM㳙*£i*a*-(6ޱ#>H@X(~+8?`*JϲGcY kV5nR޵jj6&X,N^z9&$'B*#BԂQ9n(nYʬN_,/:OeF6 *䫭6F-=עDR-f9fm%==cg*`;&PܮCjHU jf+٭+z+0S'pQӂFH -*J!}O!fh;_!6扢f-'zm!BS~+P폠5oM68+ lI#0bfU{Le.QYƣ:£ҤCg_:\j?c#uL_E՟9^5%1x#XBXhF6cjьjW"5VJ(.jR$"OҧMڤ1__'LٯnMIFeGg&<(_$;eC]fX,.؁p녀K|r,e6^"O1f=ӁB!)'P71D|fU$)Vd! ;Y&ﲸ3 -eeK2'˔.dC&o"֧`2ө=13>r4b.rjXI4O\WQ8iwFZfE)$g\^mcB?-r2]$iB?m)nB(jFWOO`sZHDCca^=h:~dCz4k8lvo.=f>c, %Qti0Y ifZOx5SKRUP5&[(7@̒Zx51|%lr~'γL$L%f%@PS,o^(6Ҍb)s`cs{QZv&%qjQ/whq<ȱM%"7wZӤ;-S=6;?tOQ<3aCE͞B.rd&^qYR_&y䪲Dzs:v^Ԣj>zc0인̍^ƶ0N{렖b x#"?@7@o^0jB9\8|kRnDaErU3O:i{Bn/X7Tž>b6%ҭY%${^֟j"M.z6pC:a-a [ 29O&;X\rRB:h7ϯu蓙 _*Cݍ a(Jj2 m Z7"ڒmL ^fpAe%`ͮv:@l;S(ywvN(2F"87{[+ZJʲ&`N"*pR$2IlCla78@ph/}fiWNYWÉDf'6rQWYy~v+v̏_<;*ڪ8%>>4cLǖ.歞Z&C(sT*L)mXSŅw%2RSW 6#)^3vl5+ϳ&kl %_ksZpTBS5+QpW Kvr>ctN6wB 4~G݆Y)+=|ZDr3~ kN37ckC[n)6ǐf5@`A&TaC!&D@cG?NF"-1%Ȏnc̚4qM'Ι j&B>5Ѣ Eh͟C Jh;5;lYuS1&nƕ;n]Yc亙-xIx|V8۷Ecq(?L5+n#^){iҭRd**ZTJ*۲|6<(6x(˙zui'_,IzwG7n+qnáfxҲ?v 3F;R-v*'C"dǀ†6 (6m}}Ɉ"F Fz%~4P/Bg RɏCl'r ȸJ0H3 #-j& S쉹)!,Šn*=D*r 4O4.͙< -!)-HS#TӇLzlJJoSM8ې14 4?԰ 7D&/$HSU/襫chDRQ[Ov1Ipu9IdWaPn6=DgZ.6== F'&h'Ȋ.(Iq#' FH UD%  )MFI^HIF )&?&$F,= k `a-lh9,7 k&tM¬x eHDXMl3-1ZJfj%sm-6)lkS)*z抧D\diHLZoCPA7AP*Jg{XqH;p d9IҹFѡ)mW@x?6-(Q՚+ڲTAyٔq4 #IRI`2,h5w%o'1ChAĠ!ѡg4Hױl NI:Ho=$A7Á> UeƪLUSo,TCJZȝ1zxZVGd( t-Fێ_M ]cVY#.uǪ8t[efOb,H6=v@ƏALkwxl9kRRwrWf"*B$,2~=)/Q7QR,1mzKǬ[}l<ǽYءQe4@ݵ[HJ <\$ 11Kqw{u$X}@^4`# 2_1c~`soA`9nʈgS8VK4άp&L}:YcqqBr$P&ASst:UI&NF#.^>a[%f#:Nf¥pN<%&uU;P2Abjܟݭ:yJ@w_֤3pЦW0kx3:Fm:>Jc^ٜd1{Mxwakrּ:zCj™-XwǸn۬ rNQ3NvEw\ ;awS>ǣ%u1y{e݊My< %-̗P3^{ušCUviHnFU6Y"&8 ʝMG9 yv*Y}[ !kc{0xczi}^Kl` HcOy6hО'xO>KLВ(49n\,(jn]Fs F&`|mxCj[  DHnZ*h#l3rPv|@p\Ó"pDŽI|(mz˷iDp\,|éjCϰ*⪠* ~ (sP_30THNV lkR6 k ENPgB~)DZl< Xp71,'/KQ!&e %(dWc--1z (F=0],rF mdj)B 뗨i ʱ9"<D|1#AGF21CVJ$M-EqUJsI(V/GXb.#ZS!6'h欬30Q: o@L57vOD B(n)eZo~iqL4ث-! ACAs15=e~ Ds. .Rړ-qӈH7]@6âK#/7lFq5NT}$ ɰP, jK%A5;B:دBc/ B[.O*Hߐcȱ<=jtJ9isRNtV⬺a$6ÿx ّޥu$hFąBmBœd@[j}D M *ggjffb~nEU֨]+fVTq@Nl<ٴjb#Xh̪[[%*\-b5vb96c;cOkSc/d7cUcYeM6e[f]veg6eyfeg{6ff專܀g6iVii6(`#| t 늊d"l@xIP~a%T)&@8-b-+^t+x(ְ oC<]-l=bq%?(3r-7s9r7: UW1k(Uvju~>$l]Q}xx  6£d *I"D~j-Bi"bB,@zi&b$\o$'yݖ~R)#ywk2,8w؁#X/XyfI+8X-8)]6~IxK8OxQ8mw]݂ ITSSUX HW܌~ )|5fx58|e#I'Z"IX8J~78p:(t"%sӠwщ7~8y؏8UK8W~ yy y9/3Y';YT?˓!9?YOYS W 3ٔ+s' #4 p tWkq|K6V>)7'*>|$I JHKXQ b=*5Sv^ü:IU2r. @^ju/Y6 S-1:5z3Z)ɴ=SF:INCHu8Y 쥟oFu5:-v9:z=N_ө:z3\ɺ͚)Nzٺ;ڎ! ^!sJ阷E]A:_!{%#' Z;--7۱1/;O[K{#;![!?{CsA;C?-{u9{oO][{{[{ۺ/{۷{ۻ㻻۽﻾;|m !j[{<|߻k)A\EA ̠t  əɝ<ʡ|ʥʩʭ<˱|˵˹˽<˛\̼ȫ @p`t<\|Ώ\Qv`t@ȍ=}Ћ R T =A}ͫ`~ńԼ#gi6៶fi^>dA5>!^;cb2E>䡖SW~Y^+%\\Q_>A\OqUlo>b,Ӣa `@knх6ǐIB ծbn]$ d;F:N*Şў]L~^^2^ڡ۞>  _/9jlG$'7KY?[]?a5-37'Eu#_?bQH__e5,$` A<.Irf_LM^}°-~ 7A&<(pC#6A)Bdq#FCr퟿vR9#ˎ-?jr&̛/s !ΝH{*fӋIJu:ӌW=Rj"0ѠLI,֪gV+[nמMXT`nь.lߣY v0O,!u~*K˘3k̙3yeПΨS^^&$׍2wr??{I?>\9<Ó/N9s֩;:ӻoxgw&kwLK(;q7` "(2BXRρ5f=3Ao"{5h;?B ^GdK$)n&P ƒ[yyyI&\~%f*i#u1{>gȧ?833f饘^Iie*ꨤÄ4+ njҬJ뭶뮺믾 K쮟Qy>+mNkmC;$ikn螫n Ky% "<ICF,1VYQgeDlZil(W[œa0 O78L1<_mB逪=mQ|L'HMWȮ<5үrmٞzh]/pnm7e*cBQ}ߘހ>j E3]4&7'D8ِgJckp֥nY7$7u4K>kWRNZlbi'Z +:r+˶Է +V_m~9\<~g^|~k}D:su.ήэOiϻwj1_)>l*^+`Py{g#La*y u=]I\$"ʚ\,@qqw? nPLiLOBi1fKūvO!oV!!ਲ਼0t#nH*˃y<Ho/cOM'?l!Y"6,r IRғ$e(ߠ?6)Kdqle)CɎQ6ėDڡB權D㿌E+Q `KIsd51e'.l<!wA5ӄ tE(_Ғlܙ] *4vS <$OÖLA[IOҗ4BO|z Nm ԦGI!L4QHq4c7EvT$ЂHI#^ B KXҔ&|6hChi 5VzD[`~*'Efj8}2-S= <3q]caYIqKZ1s3XӼPRWrYyJV2z;;Ƣ{ ,خ6Rv}ӛJSIk]9Pt n$nàY,UӸ(2O} 7vzFO#(Χ~A|[J?я˄)I „@)jT%[l46qρEy>LS8"!Znwg8[_a\6韵"ߓOd,C,ߚnoF-*ﬧ:FH۝")G"f b6(˘`z^x*GcdNQ.)Pc=7hI>ֿO(-8~KeFV?F1Pb'D! WVcp wlzķv{{/bpyBWp2"H(*5BFN +G*>@B8DxRbWHJ@-Dv>!K0D1t> V_YN%qeǁxL-ȃf@hSf\{>{rpuaWDb(U@8:/aLL0Hh(`d؉xȉhPfa`H) dȋX9Laha^^W` .Hm(E1Q3G85rW<8l-z@P:Ԏ 4mC )9y ِyY9y xq3# ˠ) V\0]U a)h| rMĆ#/!*zG~IGf6`C!2bS`IMXMf)TȄ>XJd)=H[`TP$ ;&Q'G7F =R&D"vox]P ̥HV3<6*+G6iB}EM\3ѤKϡ;QxO'w5n /xI> i852fH>wk97 H;!\$mb*BbV[HxA\vFf]gy9ă - DVfY W:@% :G Dg3x@I@2EG(j^5QEy <ᙄwڪ:Z(-Ekƕlvs„dv2 𐧄et;QS55&Ϡ=GV76ڭʪKkz)v x'-v'}cw؇9ѕyF+{%!Ph)5˻gl埗k|ۻ3ِKkR2xcKz|aP̀H>q?%  03%5`LP3(p§!<3ʠ*<%'L?>/E2%5|Q5 =?*P5Kx.9PYUdl4|ykXX8TbUSN f9菒 #Ȋ+=)*7ӄH(93?ȦI aɘ<3<>QzL*go<>J㸆93SI|4:`zLkjDxAך+  p)Av!"R)|REcaEB* a΅F|"w`!D{_cocХưa`SL@0%vx,f 1#~f0xJ2NW(ǟ")2Q/wr,.+0E |P40S pvL:7 WAxL d]fwV^ H=3;A71'pQr%7pm+D#xm%E|iC)&ZuxhVhpc {>Dpyf}ZuH+ q'+)bQbۻ-[tҸ-= "wR*=m]u Sp4y2 i1PGH-UYR)b6]+W߰r-Q!0=Л_(s aȆߝ3ЕJwwuÁDs$ϡ<(߀Gݬ-ɡm%*a @qル<^q pլ)r]t$P<72oäS:J]ЈXYP I%-)}zK-eڙ.8z%%\7Pz}YMІu$ [=b]`)|Fn~2TUeZm{EC .vKj3Q! (/@?8+kAus {@uy7bv+`$!nkH2jCP4):^p~6tp'>$΁ф-2YgE.*:(og}%0˰2^ɧ,HvLƒks *Dc,k&AK[R>A"<3ʘQ'ց:;T(zt*܀T vfz=,7h|B+ q'E72(qewX_2.B\O Ή!6ϴ)y<}. z5I_vXk*8 QDXJtD=>D$*;8y#bDho8 Yo:Ԇ]GL?:w15𺩀?&\C%NXE5n#‚ 9tϟvUdrVM9uRl64;pFr+0zPH [(n>DIH*Dk쬝„J)4#blQ3Zj˾L=f3FͶF+$[Z jhBbgSr_vB |tV7X_lu/W6s1wܔPፌ}[H)]TZEn186ƊDTՓ[ W[޷טTP&͉e&Y9A^Sف׼=g[pej酚g؟gChʂ{ԻL&.oGo( 3,`Jo젪Ԡ7>\rG 9:*KGnա_[u-'2"v ;libcommons-dbcp-java-1.4.orig/xdocs/images/uml/BasicDataSource.gif0000644000175000017500000003731111333570547025062 0ustar drazzibdrazzibGIF89a{{)1)19ƽ,%H*\ȰÇ#JHŋ3jx)$ɓ&S\%˗.cœ)&͛6s,P@@JtѢH*MtӦPJJuժXj}pQ_+Tؠf,+-ٴnњݹw}^< ʠn[#^1ǎH`-]{fuAYeӤCf;YqҕYٟc|7ݣm>\xm]>>tPСhuaF^֭sEF[2ݭ^Pt;빫뜭n[Kx}vwA^Q=Ͻd@Y % gZFtq(PJءQ*HX쩅[g fqvFxx`88^?]@'ݒ ia`;:x~hT5Q}݃>)%؅ȠW>q:CugY'[gqym9fFccuVg ~gyU *iY^)[h`V(#zI+I f 3afzfk,V+Q86)Z:v;j>NTckTr} [sKRӪF%^dQ! gXc쁊Phr52ƹrjl7sUzCZ%XNVRg@(!M="QUg5[w ]m6Tdgu-r]'} L7ҁmxAwт⃃7\˖,˙eyf 1wY\qzoǭN\/Nc_:WKŮۺ# ;+|KS{.JjKQJ}IkT>)}藯>$w$?~ڏ~_\ "9'HAv4yp G(B: D=Uس^ 'f^*tvF4@~PPIbjB:͝LtCQL 0hݕŋ]z0>kQzEpqAQPv0Xz)yb5LT) }[OsGy?_}isO~o|W|'~ȗ'ww hx 8Xx(ݗ"8$X&Hv x*y؂0284,Xw8x/9(>HyA(xAEw%?P8#UHtZYÅc`(aeg>q0fdprtXE`xy8}h7VAX!r-S8A "s84mX92r29XkT $^R!͕\ Ub*tj[Xh~+T)&k (܂B" $QVr&TFbA1?&YQ&(urD(O'`hqؕ'$Q"#heT v򱖤2Lh6R_(I%&Մ!W5ݑVqQb5sOB2:E{Q\n*QpD$t= 'UKUK^r&`$`$=ff/H^AJVx3/)<_KHraaԨr37p#@I@v>[c5WIup'stx6c7]#kHd0yAm8@>s\W#]Epgm_(Ff1Q/I FϩZ r!^EikԋfsO/!E/"σ(29K9ȚT*dj5㘴4B1l~qkh傍uŝhuq!ųGUʦݳ @`Jʸ-\IIXmJnERd{Z[&PԨ&ꆞNxkehus)5|r6bU`_ jP^2q0uJfhH\W*Y*eBZ&P6cȤgmp-O8"SMD& bQ^u *L!"9&WDSniJRdvĩ^fU֔SQDVVկYRz@%9%5JQ&Z>Q0ő9%JN'ua)N@6+NQ."U!5{[5Wb`BԱ:ukrOGD-#g`"iRPS R#k$%"cHj^etU e'hY;'㔲-K3k&1Q^KU蒁XȪ!MPk!q$G_?fƣ(6WK'D4]/CkuvHqhAfE8-JZӲ|o.V5G$,S K꼀)k嘢kK*:ʻ \ R;~a DhS(^J)bif_6F45 ¦e[4T#]4e!G )6CKi!w:<ڻF\c!JgE;8`մZ*b5v(^pԼce,M'\Wq%XTL"gYdaCI: 0}l㛝ƕn6Zql_K\{ ܬYZ<[ZQ4jtcZ=38KujNK[g|LloE_0T DՉj*):\,fYgEmƁ{0:Kǡ}C0G%Xkq_eQ;mOeS`4Mf;n\Ӛ4^RRJ Tmek:d PadFL>q鲪qy`+LcVgl/9a$=$gft*tlVF3J`֤O !;rPGG{ҳƴU7CE`ۑm3WMRȞgM\Q:]X|m`<Ωce@r\R*ά{\i}ᄛ=ҳG[2I (TUP{6kĄѮVc&#'^E5 ɇ9ƛ)" t" KH0AʦzM1]8ll#Yrqh;  lϮ!ȕv}M绢y cx=hBڡxBlqO  <8@ *d &XPD paF& 9TJ( 2K$E~txR 5gzg}.@#{ŨĠ4Kh2M)W(cĹ3*ԞSvXaΦ9َwьR\Ⱦ&b]r!pcn^t[Q*NJ'ܼS̴ĈBj&M!攜\J52ZtͲycAɣumjv˪4+9׃vm27,^Z \{C$8yN3oj8`3,,ܓ'N7̥ Cp1[7ī;:1I$O\FCEDQLR,UTsTJ%2 jM LƄTCKwU̦8=ΫfkVrRhL2/dL0PrL<r+uMj AH-*" s5FdI=}UG %![/^'?e47 m G"ԵL1%k~ʩjcX6 gO&B Y* g)g(B-;9隂#z9+)s+ZΧ N5m.h¾S;s Ib9v;kxu:lN7҈U[#sr4z ޖíAÊj7eË\Uu<Ә zbs@W(7'AZ*I;{+}-iuj93U>&E9CW6+'y"U,e$(UHƂh`#R}"ڤKOƒcQ^U2žg&4Q "dcS]Ej8խ'x0 ^L(PX %ZoEQƢnZo سLKs-+`X:@adRTǞ'm*PeçLkI@dRVC"PSy=Q!YJi^+3DJĪݪnI`g7لgJ9MDҔN)/A6A LϳZ?$tхW[0[SFUn@XKݺW$Y.JTO 6 * zK9śح1*], X֪(t=J`9)KB ^o$8eڎh ~h=מ,y3 o ?V.>T| #t'*fCHjJkS,ֹkɦ^%ZdClK9e}Ϩ~b!COvM@nJ4ۥp^%IouĢTF5Wx{kMP;TϞ N"j9$ `b'nƪ[}gk/ W\4RpШSOʅѵJz8 GɄ*RT狡l(5HE]'6We]b[YAEEq"ZﺡN,&+({\ݳyy3z갌䪾WsL񦰶]OeNbjf^Ѩ$V [VcC i:XfO<;@^bͯnYS^29|,àF1'ޚ'-`K]kH 4Ǥ˜9nFN hmkd8s5?e*Mm_ P2<ɰ{%(EW1d2kCUkd(5{\@ y "( H!6a!?1s8) lȊj˰ӴE%# "A<;䴳\3hB9Œ<:,jDy dS0:1ߺ4K 6&A8&'0cL@@2t6܌rA\ ^B첖 N>=sN M3sqEBCqd=/$"|,5P)-Qr $IőE IQr ^*3P\:؛8KǙG.9ӈ0 + %-J%qHHB,-sRn Q &³#z1ӛDۥ h_>?<K.˺Q0$`b9$8hB?4$[R:)j kUGEű3*I/말s{bySJPUsDCC{(rGhI k|N O qRJx^MJtSUK& Kl:b?;Q[tV+ UV1 B+kei X˴@kJMtL8AҜ\?\ګ --@\I !uP{?4GS֫.GO\=%$Jkw,$A̡FEZ 04:ɳ-;< wb*ARa1;J-|k=ɢeƠSYTW;PPP#Y>]2T;{K3J &˔ဨ0z)>ܴiEBtS8|_g/`W$'K|ó6U|mWt#0 `(cĐLAzVlEM1|t|5?6Ye*alzJ>)㴷[b16[ ᴶH:q25::0b{ FR9+13D8N~8OmX7bHl0Bmc)1۸#H3yK + 5ڮ>\"Y! MIůSZ{#e9iπ,3S y@! Z#G)ZD #uC*s|a#.`-; +:U1< oޕ{2_dZ2X30;t w&JLR}KCSwea"@CQfZ|wڦ3F,ڿ~(ܟ93LӀ}sZW(by=/MF:[Ÿ.'GAvM4ˣ+J{j^EkߐhDðT3>E '+mI<.ݫ/Э4婔hBU_4ͦݱfj9`tDZTP彋]>!.=MH\FR-%ݩc[=."qTSe_)nXBj&z7:1] i ٷ2=qy?].I[%7o\T5:;qC+ [zTgś3jS^5qjdJh;@땏䤖{Q_Pe9 #Vl[DZs9&jcmf:'TL2a1lA)DV$#`SapGc&S]4ᨌlY4laFldkboy䳄tbgBU%Str $?e'?madM\ti01j 'ߙ\/KX=C:`kg{9>/ CA8i!eoذH>6$21H~bKY /ж'j@ 2 aГ2QG]%:N\Еss- I7]XTI\/%Vfi# Hf00q\Uj='K16e9:5y6ȧc]'4yIV=(Zi]LOjH!hۺq:Här=lHs6tQ?-,Zl{PEIE9J z_@QvSe|!Ui5;V,Ŷj*ˢkzsZĂWՀ~pG XP ؐÂ%.EBCbhq Ã!.PdD1#JivJ(ɐ8_f(N72]YȈm>(ST hS7 @-٨A ~5UJ H1R ƨ[m8U(Hm-pЙmnG``'L mU}h .xeJGϖ:ޱ< m[ш jvۦng] $v-tǢns9ӯTnetshfLWQi4zQqg[J!hP5{Sp!Alyh?A[ זB)8!|鍷t9Vpmp=f݌l{9nE9vr[ؑaJk9]U$VYߜmUYien$oNfU*с[ٞ>W#)D/7&9mǠ{wcZe>j-5A̍sZQN÷eMԆ=ӄdV$faUgvLc-=E%> =O&:7dOFmQ-3ٖ΂nA f<()[C}v]U ߆VTqJZ3yWR*kӥժ&+N*@ LB@ʷ7ӴD7XO YXNJQ5f1G W(7irJNۚA+[jt(]#좸'K9Ȋ5B%: 2_Vl;23|F{jX-Q5k~%Ctt rt/Z䈉YǩAp|#&|"foVQ24XL=ǭ{I+10V ..[4B)iRzX^6Vlie{D1=LeØ NgzRŝN|I_w4SŹbBΧ T {kܱNɩ<}W旻\WRǑÌM0Ga'4Q#L\=ǵݙyNzWDjG`9 qI\ ZuY]1US9܀ˈ_B[BY_)zy.|@e)g mB| ŐJYL|xvQDͨV܆Ҹj~\]LqOqƝ>\_uiyHvY!~QL,FjX$]&-{]׽  HR&Ր9>"?MuJ1QXО|XZʴ|hfkF`ca]IŅXbܱ=S1#@zNCƢAܚ~bYD$N@KE͐UL裲Q4] &n4D>cܬh-H1UZX\Viiepa-r! sŽ ".e E!d:]%ۚph I1Wyd 5Xݍ^-I`$ϺE&""ݐ׊9XW=U ur펻rM`9Wڡa-Vs'wLO( kQ-!U+p'eݰX! ڐ ˒'EDfaioD訏q§͸ȱ^Aܥ1ۋPD]7jZhQ(ިF?fiޠ @臶WܵcRcZa(Zj=Z%)"a:6Y଍6쉩8)ifKF)_ZH*jj٣NjHHnj"zj @^jbꨚꥂn**j*꩞j꫺*檬*jk*j*vҜΟ^+Xj)rfk=y+fkp@V@Д#QCN6)6!mN).$]hrS\H9ZC[`$E,g?.5Ԑ1P#՞R*)P = \hYlCBQl4+_]|4łddci,lۡ(u~QTB!];ᗺnR:F4>)~&Z e,tBԚ-tϺdb%8ЎncHnԒ,ɖ띴-mQZ |ˡn"@^Y.ߺ8ny`=g 5gl' ٖ-jsf"&Ź !l1noRmF`b yP( ˇՋz-bvV.Dg+ن8F)m#;^[RU^/~~ t.p mƕnFlme`WmJB*^Űݕ^rI [pk%`pLep"^"0xX-?2F l )Jq⬭2,Q8ŰqB` Emlh/ c0C1Vm | XJyq%sXy,hWqKΟ2*G17j% ߲rQR>irr..\*i0^Y=5S*6_6= _5/*~ZY%NG87;;nDQƎ=7޳>3?r뛢T6_ 4"AB74COn6#m3FOtFot|>k4r򳸎kJw+Ԫ4MϴMgMjjMtN4PP5QQ*`R/5S7S?5TGTO5UWU_5VgVo5WwW5Xou@;libcommons-dbcp-java-1.4.orig/xdocs/images/uml/getConnection.gif0000644000175000017500000024062211333570547024666 0ustar drazzibdrazzibGIF89a- B B!9)J J%HB)RLRR!J)R!R%R)^Z!^%Z)c!Z!R!Z!Z)c)c)c)R1Z1c1c1n&y$lk1s 1p6{1{1)/~99) 669=!%J)J)!R!!R)R)R)!Z!!9!)B!)J!)R!)B!1J!1R!1R!9Z)c!Z)!c!!Z!)c!)Z!1Z!9c)!k!%c!1c!9q%&!1k!9}!>6).B)1R))L)3R)9Z))Z)1f)-P1)Z1=c)9p*=bB=qoIZZ\`ikgsos}|ƽƌƽƽƔƜƔƜƥΜ˟Ҝҩ֭ޥޥε֭ޭطޭ޵޽ޭ޹,[ݻOa…#Bćw6p}dHcœi̚8o괹}*{oʍH*dBv'ɓ՝Wbݪ";,٩Է(~KnZذ.f+nWwEOBD ӷ^J~<9rM=s2G_kܷiʨ-wboؑ юO{uঀ͗٭?麹!>hqWUIl#,bƎŃ.&cMpB qdрpgG)7~FyDTAhH Dg.S =Њ'U-x)U cg`VZ(gg;>;d +eT[ (aC^ dHf@acaђI_~Qiىf$F"B"nXb")fx'ΩeA_ag=At(Aew⤦:'vїYj0l?yXndU`vPaxRsX&l0:F 滍Bk-f((iRs`y&ͶrG˪6˯~V-!7#c[绨: m6n~%) ,%^ s˪{*d9e2PhԩgR(ngP*uuVq,fȝcI0u^Jjˤ BL.:y1;unccF9t_gAպ؆)՞miai z-{"˿3<ѷRF@m= YH/<ē/O~BꈤPRK6~+^K`I|kEr@e*9c %\7P)$ )$ڰD]HYP&AڒS833In+ TTD{SrEkKjT եA*CӯHat[*uU{:SwԦ]MzV *`Q{,ʆSclZ͊ؕ1-Qnu*v]oMr?w6s&Xz͢ݫLMkSrjv~}I=/Φ1PIQzu-M,pW*܇Eq [T,J(DW|ͫ_kzΗl~Y5$Xޑ*ݱ ;%J[C8/\:ԑ, ~A{=|R0Ҏ#D)T8vE=w=N}ól8=]dwbXF.uLd [X;/b t>[N35/V g2bPO|=yĨa |NtQ|b3ϻ:rwd ɭI>{ZѠ)bH#dSKVzq v} ff]k ґ Yfj6k|ld3[%ֱs-dF5mm>vfr6 h;,,j1`0Bow/i|dلIi ?[s^s\'8#/Y)Ճr5yS[ۂQR8c ]8ITzεnrX/Y%Psg}л~RǺԭ8¡0;h:vT~8@c+λaÍ}Hc3a#fϫu* mx=7oOH7^ڦRoX۰6{OH6yC#Cx/ հ 'RURU }WxH|| ڰ;ڷo*+؂,p{۷{4|0Q>?/!^a ׀N(P|S|{ 7*B҃Q8RH~yM+q@;X(eXd}ޠ~~#qw)hx|~۷ ^ G0bPG@x؉(JUTe@W^gpfGpGP؋XUSPG`ef~)q.;QKph Kؘڸg0pxa"EJwpgU`8Xe0K0j dq fI`B`h 8(^Hg`J B "98T`AQ6)&  I0xK C`bfXje!f2YF HƈT` s۠CLɉxZSp^GfЇ`YDa j`xDnɍUR0SP3@  ~ Yy  c^we 0|9i9}ٗ0i eP.g"TeT` К9Yiřé Tc$8> ęٝɘٗɜ@ G@lKb` 9Y` <`ܰI::@bnɗZǙȩ IY Fp  K` (9iA GС 8J0;@@K@l+n˥p본 P򰘁vFEq[m{sor 븈˸ۦϊPDtV0;ۺˮ뮁y8R@!Uڥmʺ;+ Ûˋp h Rx9  Wૼ+;KmZʾ R@M/֐+ۿ+~)pq p <,ھp @˴`u$zdLzY,*rˮ.;:k@,|=Òkmڱ ٩180@ò+|竱Kc;Хci{>-mӿLƂz 2U0 Ш\{[̎kf XZ ǰ L K+൭eݶeg=؆M؀hAMA 8N&3SЭkk؉ر[ؚلهقַ AW2j̾س=ڶ]۴ۃټڅٿ-Z̐#Gtfڙ-ݸ ܜ]ݷ ܝ}ݻ={[ Pd ź}ؽMވ-Lt`k ۭ ݾ-߂͵W͘pJ?]}]؏?-}+ Y@ Pg-=✍Yڪe).?N>*zѪ2p]dʹc "݉ P~\P@ e&A|z{aCXhQ[;-+{MiLԸ3q4f0u wPnݗ.] إyxĠܐ; 㱞mN߽c ]FU0 .>^'$Tq 0~~~N[ UʱGD+Q\].ѮN߅>25J"m>鷎`M$ )(^+]x.\ 8 ]g @ j p 0kXU`=VOoUyoR0 Y&ꊞ9xN tߦ~no`oz9P'agRgo?{֔Orw|螟l?ĥu 0Mg7S0 i_p__Qq^ { _My庅k`/x>) ɓ!GRI%`ɛ$[ L;UJ=hPxʪxc'߻oަ<(ПO<N'ˊ3&ؑfqʜ6Y:e0א}=kFeŊ]ϟ>tU[ͱv|N̋Ϥh̵pòӗ߿ey W+…蕞Ic^mZ'r }کKU 7:܈~nʰp|WܺRҕ+m}y2iHXr٧`n28+deGᆡ&"vYyɎNK5.ꌮ=u5![ 7&t!ȡ\rQ>l,k5M iq"H|rO&I<џWlxH\Ϥ84,>`L*}/ͱz&=~a\񮢈#/29!c4tJɜ4V\ 6 sJ…9 ܼra%q wWik18p%Q{UV: },;GrA˝(4ѢA\t<[`#]-f9y$$<;"Kt8[4c\%L IUu |Cp g>}T<w7@Mb)BdP/$q^txMNt. !J;EaYyGhBIo'KfTV·seuZ$юcRqVa%ȌIrasս >_zxܿZ*<*4C?!Hֈ]Yr'6m5G˖Q6y&g'?o#| qoצ:ū|̊bzl_gJ0$h&Y1<^_4/sYiMHEg1I7Z_o Ccf׈{A L%*~t~-z&2ƉE۟ucz0H;2fV9J)m3H\Qi~5M]Hʣ.TLq`H=^ձ}sss撾{E"B/tP!9oZ=-#:jvo!۞&xPjZ6%`KhM:1*ElJxg,}Ri # W"BXOj\-@0PfnQN{(c<:"_3#.x\K*L!q,L GzPD2"`ca:A\sܾ"RѝDv_>!G 0:r*y"!yU$&P˱b=0!nܥbvA!>ͤ@pZYҤSA,{ ]p2M?$(<'!~ Zqx`7Sb[AG;Z=<5K»HL8!$ZPPp e(fv1-?j>&+PPHpYH;@p<@IPpnNx7Ip2H!As& DR5!.aH4Ӡӻ18Yȃ>LxJE(ʑJ<ȰӤkHQі <ȃ;7+Ɂ@l4TVqI8=4/6 ;MPhܛD(̺E,I1=8(pDp␇c,铀CzH =RLyPAr@:=H(ǡ\AHhMy@DD3/WT KPEJrS)0>'Yzj.NC3xL8ZJxA@W<@>TpEY@DZH[xQYGT\J`(LPH;H LgP$&h1 1{9KTGxL OLOM@AP\=Lpg\]S:x#=T PXkIT@ǙG;Ȅ5O?'LFU1tN[$uH\S@,?IFSAL:1"d(|}ߓSGW]QZQK1֑ 5C<6i%#ĭPH7v3Xy(+(;ǒ#t2΀V7~ ف3j$PaA>D>g$σ}TPK>뢃sNP܃JGA+>G]gSKOXC apP91CABH:S]k]WOLMGHIHLp9LEWIU| [MEHKNYTI( >"'mSxrʡ=J7fvX4/7$H?MUQxEGHQSQ8EȃLXH8LxE([`HY?PFKH`MP<: ! N1c҃уt[aPMF>:XQLU68;UUQHpQ9M=ȄWY8V8UȄ<؄9TyL8HPD<sTPe$d1>/eCɻY><(P9^MԄLHSF=(,]RSAp[Sh(zAyzy^U(7hKd_dM҃99<Whp>R`JHЃHAO:;:P9xH"]9=9>CA0yrChWQLX]cH7/>՟RЃVds+KgKgqFk9KMR8(Q7EW1UUMHGXDApλV3Ѹ0EzQ(VM9Mx^=M:(+ud([ȅQKV9fŋ7pl;Hb:HJ@f5 K˴wf1Gd΃MRhypdYCh6W6 kRmMW8Cz3BPNhzꦄqNgRW8mf̟JoΎGYz:@h[@hWzoszH@y/o2\ 4!*\.r.ohJ:t6o+:H~HCzyۊ(Ot^nnM(>D9c^MXz0p0[b77)ND.N+yr=y~g.9<?0h&V{zFERdbp{Dh[hSE@pyPGЃ: p_Qgb{W\>p8x-: \ofyYe A5g(Qj /^.xT‹ wN '_+Y.%/fc\$HóJ8m"]8hc#Tp0QE5T<1SK۠Qn0O@8ijW.d /Ĝq P<5; #ůJN-7UJ"4x d$}"ap <8SޠH <2AD[􃊍z~)8TX r0kOqa_L1J4`Z>lDxx YU3>hqQ< fsc%UpH(~qS1f>!u'DJA@[\$P (`XHq! @[ q"#%>xa H =d+FY ~' a h9#@U7:aK"B%uw(X<9^v*`gPBT8F%zŠ$s .bbZVJ0-@Lب#h 8"rE‘ˋ/#!8v (Ũl19Jر5W80y(SYǯqv |yӡ]`Z< zz\ DPPkVjEI)*a]Q d9ϱtBaC 賊x dCH>}8##u]lL`1i@ X 8dخ E<8@RRBku,D(^BО-p]l -RAa^"āB FE\J$i&X5lT =m8観&|f`M };-L/T\d{ZMڶ!SgqrLtKv<S~֨k|g}>>fn(&oNpg8\vJ0`21E5Pqvȃ,JmvFi>Kj tjo:h<)oJ{fZ^DDN=NqfuHXy=) 2O|.JC= @7][JLEL%ǁ^eo\ ۮ.KKJ˺4#  K-HoXDqX? NCMǹa*Cú P../﮼Bo&/Nnnn-jJO]fơQjuoS?J o^.onj0./ !_҄M}/ҙQ ߮ 1~_Fo//vO1'qΊ=zQNk`ՔQM`v`[KNcұKﺰ*1 / =x!ɭpon _n{0&10?@ r(cHPJ 0EK#.ʩ|o E0B'^@)K=` D-$+  8/n B@}mtKtPXxldLoR=ÿ\OX)L3}p& %;/pot D0d 9Ğ.H/{0qqggjt(cXv Z8.wZ)G:ǽզQ]﵍ˠ腪]]ϵf $ -_j vsjk;6c3vlvp5n*] e6fgf?Lն~ 0VآD0H7\5p3`pc{7d0^xDz Œ. j6 yOq_x7o|wfRԚ-f_f6'xvf ~lKQf&*Pl|U(S$,99E.H^+8xSQ{vm[cRBv^ef׻V0{4^ 8(K(R 80f܃o"9 c+ zQ˖RX2xkSbٺRv6캨爁Zo.euЄ]|@,X2r1.<) &X-$qfBSw+FPLlG#;՛>}~=M-cr"!~_GPͲ.7kNMՒ>cKh-l8jWY4L\>Lr 0"k0G2o1jqC kr1&S3(P  XJ4H`y83H G}pp}+W'FDg NJ&M)Rj(/PºWZTZjIR%v;B,ǚ#Av1(Gu2(*WEبNN֨Am!'#ax:|F,>vS"ًuZemXx۵wot~݊WquEʏ<*$*Tb}Z%9BT T8O<'>d?R1B Km<¡›tYw)#uC,R|TtDDJKdAL*^; aǮdVKrF *8 UObq>rꐪnLjN{GH1N$i-yP['BS5>@4UbMQ4 \;Gb'&9SCΣ62őkg[ŬlD[ yc<ѤJC✣֖pL;'±EteRcGH'y$V'[-EHt"(y1WGGl.ꗴxN-ÍRh-[zئ*JRA쾃mVfqΕ2wEȸWJy2KA𬘩&(84+ֲA T%D)"D._]zIG٤9Zyxl=4U@@M,Ɛ/)abc m+)J.\ɳVHGV`ީ(| 5etr#bK.w/lxU /$bڥkAaScT&SŏlMOeL-=#xX/8 }zXpwJTړaaOVڢRs!xi}uQUc$F1 7 /qpEKkS /LV4i䃟#8T[acQ\d JwXPL{YLMzo9OC 0+6J0!+-2qya( KԊ"FYly(z,C" M-<чQ,B"䑉>ȃ}H<Sģ} Pg G$ zu&D u#[B5h/l:CzVAC~qm<{f'꩔pxPZs#W,#A1%[Vcdl]ytEF2P c&>\EŹ.yqS Ab#D9)75ΨJ_|{*?"}ڻP.šGiA2ZLl-z,7ײtGC*/ȓLl%5?'SHn3rիX%E5oFQis!! YH]NGxEwM+*ZPt@M̫Ot+aK{NF$ˣ!Ȋkm+HX,I^][؎ࢵ4qmc`+mm]+Xdj IdVpjtlZٽ;pmD[oTjf^5s ޏhV1l=)9q!l:wXbәVpϜFY߱sR`ǻpSpb?a}odHt.v/>{m#S-Q?9o^_0)w_$ -2wflK2zX:jnz.{Gn<'?yK~V-[9q5Pdn7|gK>K;`>S-@6`'x y@l2A2*oDaH`@@0!d2 a¨¸(¨l6"' )v5fPAA`Jdcޡnl$9iFaW]ٍy-dȑ89Z)Y 9.*j&g`8$ُ!92xYEbYٍa?$Kc(z!yw"ay"DQr/~x8l]ٜ ٨U[ٕwYW9uٙ%)Xq9A%%A Ɓ9͙v.Z&gP'Z٢ɰ"!)ADYHSm:\9C wt0DsTq ~7E Z%~98~㭋CHh9Zu%H"tjwG;*No=h!t4 CAP!A~C `Z[pš4 ZCġ8[#b[~E%-*Tj$6V!۸bxaUv#e;.`XaA%!Ĭ9)o :93dB,)!A8/9ĥ1Ï8IEG\ȃjŏ9v>\Z=ȅÕ!ʋI;Xs.n<.JWñʥͧa?ΟaEC?\/*S`+tt<+)a<ӭ3ȝwuHQ|ЫO}7=Sӟ_#"#"/:>~~/E X %I{CpaD[|9= "dPkTHTAA)"v偷[4"9WjA}YhnC# BaA} ]=C|7UÛߩnYn&O3ЋW=#K|K=W؃a]ZAɝA A&“!ONy…Aav.a!??a?1f3hƒ $61ƌ ;n92HJ{4vT#P`L4g:y3!Aۉs͡A l$ǑT?7wVDLQ9ɚ[fbdlYsM젰fUƍթ(߱ذfH. qP%VvW0e͌_?~wݶj쌛n2 p As!f |UcMtV wR !pQ zKۂv {-A6(/ LԆ>ܞ3l q&w-"MZUka:p]`1C O<+.s{t]v8~]-"g+O.W^.׊G%z"?808C=D"& Kx81iBǰ5#N.1a ;Jydr\Im[S&E dc,[@X Ѭm =ޱ@G5ilb èf3V] OTygSĦ={Ӛװ79ps,(AMj66VTJH`YPj4g6akݨIKLf^#ѐ$]JYҜt=1v\CթQyeZ\&Sٱ5fuH5jB:Tkj]-+W9Zs:Ӛ]Eqv>5]ϚoK2 X󫄝&Q#(x|嫅s!<#旣iG%|h1n4Mf2"%LK⚨c0Ϝ4;YUFs0Jns\; "]8҅1_cGawch^Hbhh(ixs8!!$b"A"n]5ww>g#Y?!?aw!4Ȉ8?Z1YbqrH0NRxl7h~K g؋!\q{'q脹x|˘MȌ+fAEOBr~S!H)$8X|xGfӀ}(.X~`ShHVЎEjnjґx(ԐHy.V)yI- OPB%}&AUh[uwK3tMpS PigȆn[y> (sI x{CB}ȔX؆?"sYpYpGwٖxi>uhBryi~X"|H\؀> 痋H(Kx4命3c8ْ4(ӗ(b(D(.&_&J99 VXyɜ)嘏yh_H>yɜ Hb1X)0~ُ㉝IGWX98Q/9WyZxYaGfB *&XWJ܈hTWUZنYy4Z9jT=Ig#b[%Ej]Kyq]B5{!!Yzs!Wɥa:Zgإw66`ơoG+ ڡj~B9zjJٝypZ'y/ R8Z嘞#qdX~qzh~:""9T1駎jڪZڪg } 1U6H:ڬz0~' j(6zGzsԸ鹮Y5jF68RãQgȣ;J 8:2="h (B|d-B7?[b:]qHYRLj>3dqGGi$:Qxt:շ̨j0%☚YʊڐZ꟫*%W82 y(6)S+cKe{IˀhmRڪnyzYz ex4PQ) ˸ -帕Y}ʮz|'*kHhw1k˪ H x[xJ֢ N#%ԅYbw+YߡXʼ%K_(uh)ihs%k#Vk];PcX&ldW{(yBܶac* '/"WbXeǘ׳Uų.\y/13\A ~5,UV~4"J7UE6,QbP,SȤܑ XW*lҜ6ܥ w9BzGA hy_ ˊdhȊ`˾}wb HSNʿ<0U' ̤Ef^fM ̦|mIy[ŷ0]=Bʇ@xeB`c{/W|P,q1z;Ě[yIfxRQdހ|,ԖgOM+P=խF ˅K3@a<L֡ױdbNQfm uVc=U x 3gL{Or sp=ٗ"U \U-؀ ڟ-ڞ]X▂YaeQM}گ-ֲB֢+ ֔tm½ (Vf (O_=۰=ٖZUU< ޮmݐ?xx. 1*Љ[+l!)! ˽ aiK^_J ^ӕ~ɲT0gaQoL1M➽B=/iy XJX/ P<-FRodq> ԀlAͻq `NTKONac^ýylnbvm6ԑB~-Wm-ֆ\έ _ x;yn^NԵ~] x>mM~eDP9TN<}苎n-Z!媾oNe|}푂zݸ^ѮN8.B^zn.xPNp"~"~"`/_P UnO !!O~N p".>n=^xn.ב>ZZ@>_ 2ũ?=+{SևmJ;Jgh}mOn/%}(QD s-?:KH%KdGYSLlN=}"ȃ7ETiЖ;&l1RUdha©WyrX;nb 9S*k۶e ܸqڝW^e!2Tv;b{ .d*g̠rMdװ赏#Sرj*eʈ) !N-:n*J%Jn׉]]ft6q^o $2O- <^UC_?3/@F:hcAvvСpB ѱ 7̐ ?1D?Ck2+QCGd -=cdvygYmuhY6:hMv9iWƦ YhznYǖ웛F:9>[ iIC#xK ;q>:ǼoW[qbjw0MN+f_4-UcԠ6|q"-=u @\N;{e'Po\W2#}G`᥹=zWoE?Cq6~7=8_twW+9}n㽗%@)S?q5S#7샻(prҡa{`2(pNAsw)S^}`Dn1dY;8 9aԡ9">FXuđ(;b%Vъk"XʝO LjD+QsK:V5F1+.!{<c>h0#P^rBA&`&7u# (Y$ Τp d"AP%leT9S3N+]r1畼e-(_)ABxlP&8X 0JQaSA2ɯm.[ww 7>I #<2%9GN j hC:Jt A#*QJj)3z*EdIH:(jY!mH53T)\ĠQ e-9ԧ=OjRT.tS:UV=dêJUjNY#≔YՌLVn"UMQem@PA+E%PjlD[P6zHG]AQ.j=|L!JqaJi٬Z9BCַ@?QՆ7 qćLv7o-hC`Ӆnz[b \\IGz-L,Hяq cXSk@!::xD%f<&(4Yzg`C xf\E,Nnb⼶w pL8*\н8+A  a7i^?KNj'|͚qR#QNS%Y&z@JamJ))d=۩)o'~% \:i@KC*c D A;X)͉$3 $@8S@l%"?xB )Ýw LKeu9 ._14.>_c0BU%xk??!KoP?Gq wDT$$}D0 1j1E|1'p"\y&LT 62Ah0 kD5:ao0j`8; x>J0ilF:1}5=69/ +0;CopM:jwXēx.np\} ko@D  O4> ST"@ŵ@,/ڱHThIqD^L8 z2–!BXpD6?T[nlQBsdF7\$fDʷ65 :K [IJ| {5T0[S1){b[>dp u,gQMpgCcF}(u0F>n5-\y!",h菻@ɴ%ԇ2΅R&:?C+@qP[Plϝ&<1_JϊO D̼T7'>KlwjI1 1Ji,W0r!".t˫2ȔR=1eT;;u{V%ou9ETr=*Ӱ39kWJ*)8WtVԔQYReMyhv"uҭ%cMj%*G}sv+XoiL-:>$EvQ[kM5cD c9X -:vZh0ƣT\'-OJ6aStVڥy1r5{[!Z:WK:;^۸j` mmjjYC攭uGk ɤBF79%.-s#kF9JsRs• %bC"%Q?:\uϲec@=R8N_Po dMSМ!fZ6dq_ފ}؇S&BR l(.=c}':?56 eSC6Ԉn7h.k8e-m K91BE!CFڮo@5ȥ~:XdNaJ*J%cKi嗀c9$)>qIJ*->:.H'*eV`ۉlȅ6BZ˲Wr RuEӇ=hNXɄV0 7p0 nwЧe JkHj&M DNڶ,nˍ}P0s]kʨclQ%.* w9 R}0V@oDmr!C6ew@i"pçVduVauQv,u<M 8%t+V Bۼ}cw.J鑍|#o+p؂-p'pf5+_fe+p}pO+0Pf d\dJ%ط}Q}dJVS~~'X]Ve55 J5%h'L&~ge-dKb/i6p 'jxÆ6\P"Ċ/Nt"Ǝ)q$ɒ{Λ)MŒ)s&͚6-\P;+t *t(Ѣ/ֲˢNBI74*׮^coܚ6u-۔9\v.]9Ak]|{۾7Qdm~.x_޾}vy7m.o9t͞q.-z[iРEoLjյ~7Ԝeϸ#7Z6zcϘZ2쮵° ;"u:ѧ'/{UDT&eDE OJxǠCwԄ;-D\qX~'޷&[w5;-F4(IXC:XV(ť[;G"K2٤O*R.I%W6i%]@yLz;3N A|e; `:k@waE>9y!-;gwQJ_|;Z!b^~?)0qQpI*R1mޙլNJ Oa[[AgˎdO!) unjΝMI- _A'xbLQMoGnChŒ5I$f4{5gТ Y'CL4?)' F; 3xʸ#򥧢l~/އ[y(?S4$FnD0)j-P?$KI#,\J-5bI)ģ~f-a,bT8jE}s{պ7r=Wm fH}cN唯Da}q{QzPwq~rH>KCf"3\}ؙ⇔^j:lߜ GrI,4D}%bؘK H돣&--fuAm(gBX?g$GL]wL~?nsd%9irR P`(Xc'Ƈ VR#%7تv+w妬pQѲdArm\aOLVC(%5c(A i)<H1EAz[%")'$)]\eHgBAH’Q\PDJX@; ;U&p<ɘtR[ֶ2|z_t#aqY9ŘT'=I*@USS^}ecM6UБȖΤZ{dÌlzAk,d U',YG =m'oz\l&gM,:qг5V;Oz26y>Ӝy5IWs6܈~E̹+06%@|E.@8>f8!k%13َv=L-o'Xc l/Æ_`Dl|5ȰXxGY$1^|+q\QQ~wirֵ.reE/ϡ4wu!C.|- ,NԖO^͇\$#Vr?ʵ10Dr&>ذQg \ ߠ0 P~c Z.Ne!x)1v{#AMquxTZ7UKLK:.-hj+=4aZ(vc0vRu*e-{z98/6\û޹CR1eLu.#^20݌i[s},́GWi'Gۅ2t7f@g8 0[\ >4Ě{3IjnZzJ#QMFaW16OGǞ (+Vm&uk0G ti\IҌP1D^Rƪk`?^HT ZM[J"ml乛!VÉ=>xɻ83 xa%b s#cK8eޭ˧W"fc2ohFbRqdjf.&qj ڀ @ t tnm\`0A^YbUDDUΚPD&|0q-QJyAO+%>H$au"q3^X iawbJcUZa9[v%N4Z)%N]iVI^H<5XH(=[<ܭ>IJSHYؑIj\ER͍1]|'5g|1E T^Br{ɔ7|_ I꟮_iYI:[LN[ٰЋ];j8AC{H=MDZ\C,io%ZZef5IsFܚ W}W!+Vɳ.9^9k'u)Fzy e:ĵ-V(D'K|m:Tg6nczc'z}dQ ̈mG^a>n)ƮIƊ[ɒ,\ ۑd ۱鸄BQFXpٕeKm lA-D_YQkp`XLX_e2Oj[lHĤU^ &ejk)fu+~xcbV+rCYZvKE| ̀A;NǘSEd1U"T܎$b[ 5Dp&0/6LWx U`֪[|Q: ̗n E|K> fPZU1p,!5mnDNzhCyR(Ա텴)ٯ>LBK3Hh|_ P4N 0\଒?|gt寤7\6KW 4|+(?,ҵK QJ L0P e0!0m{q 9?oV7Wٕ?>[Em]_o1>[֒b!1]2V". r,,2 bRxeVp@hK}+1R:@ 03/qSsRMq?@oj{q8g>3X51 TL\E!2S 2iIfYR^rܵ/6D#pUk+6k@ DI D88tLM#N48dS#WH?876SR8NV*$HnAV|߾ )ECkvn%} dChfewpr+wr3r;wsCsKwtStqwd  XF q?p78@Nۜ:Rl56f4ޜ ^O 0/_J2D}OJYeٵ6vjѷI3qt,t*c6hWgm.*]xkyV w"-Yn'OHga7Ťs-;Cy-[ s0WXG-K7ʝCsn^EDHҜ9fgDCIo qt(NՕH&78_W&klrvvdvx*[&%PEriọ0X荺ũӱ} `(5-ʡJ5 DĴ MeLz\Jĉ?II'NbpC '5l,1}"Doρ%_m;z{JFk#kGw(f  ۈ[O}|ț|<]%Ѕ {rxz[%Aێ^XGO|٭o ̀te0c\kEQ<0vV}%ỰkZj-O !CiK'wgz}m!g%,-qZ6:}yLwެC,d1gi>;Ysiӧwyݳ5jۨ'ש׿u99nސ'۷Ρ?tձ_v_oysm9~Ɨn37mjֿӨv PzʫrPi3phs~yf .1RK,nHCQ,3+4YQG8ͮ|6*#LR%l'2IjӍ} tJvЦ+vʫ3:st4TS8t;=O?ʚol Xf/n+ Ҭf*/ DOmƼy/nSR?,JQ2XtDTMR ]}Ɇq%omXѐMVZHոXQo 7!]%!jz3֠0N[ɴ=+_Z|W wV'}Ra{r8b_KZ KթXvړ{ *Qn9wBe  gVx䜍z kx&/?;S3^h ezc_жl g ,ܳMBF{flݎ)Kwnxrܷ-ÅMm7<_q#kf/}"Xo(ha̶=L|+$?qh#NujK͉w cMolDE"V 'H coH?C`m~2UH*$XIbC!_ƓF|HMJODVFk`iTQQm4>Q@2Ec7FSZ:H;Caf2` cPͨ޸DC ސSJ3_d9i|e=I(S*kLزGA4:yT˙8B|jDƆ,iehBE~52 T*:)ؕ\1uC]:F))9ۘΧ[Ӟu+xީV:jbjb7+慠vyQv6Ð.֊re+Xg֚5~WΦZV$s_{(EMZϲS$4[TyZWTUs+b(*wӫ[zo8 #I4ęޝ 1f3S Hߥ4LR#B%4Q<."*@ 1 9KF8-DUh-q՚G͖x~Ie&@QgSH=rYDEeByln=@+.Z2E?^S3'^հ+[Me=ulҙ>KgZFNYJK%\Px=.ymM6S6,3yԗVL+kdGgqGr2-Uٸˬywn)f2)wn#i34)+] 4mØNw5nƇ^@cSUγN& }me[4[C[O Sq+<z:*ޢ-F{9ue麀&aȏkÜ^,?N\O,*fkN}Rͦ <#+O/wEmsG]OⅡCVhat3"hP_ZþM\>Sيg"Χt:CAz0{ E;^ӵ,'i#.oʨ>{f|nNl8 C/.BU,H.6bdXFa+d殚1D[EpA:G 2nt Gx*~6˰P ~t)<h P̘pܞ  H!?,m-d" h|"I'qpL'qqȽt,a & &؁ h􋸔v,Off1n il *`s`5b)DN4H!ݜb'JOgeV71b[΄M'DM1I-FEF/7Xe!A dMD*zMvn߬t Nb$kV ;oF FPpL O,< iJf8Q4'8 )aLʣ+b)$(%R/rR4rMF4rL2Rč)<2(,+3N6>ʃa L:P"q\-Pk) 7@^2dNp&PPP ŨqdžޡfjR! D r( F@ X@t4R4 .ǀ $LR 6 r z7` b8s 9: :";;9;8|TDE\t3Z%qԈPd)ERHsRH# 4a 4N$mX%NCM aP  jVC%lѯfҤ_ܡSCVdy[м$U$.% ^SDgjc/35L2%2dji!,gg^gȕ3gZvb&Vxl'+%|"!wXV "l&SzuLULWzcPI9xi juG d{q%eWvel8. An=8 z@"l:nJ&U{D3or 0Hlڴ6W 7xQl'#+2H3/_2ɃOi?q.3ujRW*S%47"uW{$6~ފqJ2fyvAւKe6w_Aňu (zޯ >wH⥴g( 5BJ;ϢkV>!#(43@7?  m@U.Z]u! !ا 磮YO1K#PMdE{baOOG$,޷A,=>ˤ5u}??3/' l{*\ȰÇ#JHqbBf4mCII6˗.9QÌa괘߻Vp[НH*=;9/vtիXJu $ʄt]3ٳh瓫׃)Lx݅^j{Po_@x;`w+>_i':5Ny pƓ#_7_Dƺj~[l[-,.r7fqlb|DS85UP6UR)}sTvjMU Vh!Y>tP](bZRCqycWobqXb;;ceXZ`Eڸ?(l IN܌y.2G`~)fcH&o]I6߈tDL ֩p_垀BT7AN?]:`uM4PuEf*aP 5 ]Xc)H`}VCEW܇}gЍO"5U#F SN7,QۯA ұ(6 үaJb+ЖJ7tn(5^m)}yk_lIaоHk#A CO?upл9 *:\2T3J э7S@?,}#r·%\O '-"v~QRf?H#^' ui֙6ԊN!Y u,Cu27tU|m8\(8nޜ.䎗d^IFO9+ᠳ_⍋N䦗^9嬯] |cF,+H}Q6C,47Il7.8?_%8@}W))vtHJ78Bhbe;g (L%7.i5lCdşhu^ѢM3„$3aBz^#YRBc7!mBw+Z> a8!7:"# 4 T\*PAHD^"B"Q-)Dm| = o)+xHU&<I }>аAfs#!=%aj =LS;:N%!#AGN$I6K-o9)ԠpS%C0GķW1$w-*DjZ̦6nzf4q%4Z8vLJl`4@6q Qߠ ;d"r"=K!J l"# 9YHJ':2M-d|ֵF6Ei ,ܞ2cb)~n),RIKQ13@e"ujl18i1p VXJֲhMkZ[VZpmZָUwkYj`x[V:cl=كРZHV+< dpfս(Ƣ6s4*̅Hf4Evg9{ȝW9)eܬiZ04FlR3OXl @6FUt#1"*!U;Qnt#o~LF `'v} Rÿu<6O GL3=pfq|56*ώdހ.pa{[EfbfSFG h : ;2Wu[_@f&Qe RQ(ME (P咈BR9jg…X3zZ&p'7mhu:э#MI[ش5+-NOӜt5# r~hO69Kӯg kZӢ'@+Mk&FC?0,dVf IR0k@GMی*D3OYH8RFnGgA3#55#w$/uBF̡J3'ct̞&5w^ֲm g8/n=+Vg 4!h5l&xv1L0BL4u~e)sgt۹S~w#p2Efnq|f@5yÔ? ,4h9e:tTeqȔ?ȂZ2:A)Q^<R"4aQwN(}N#uw.|gnBFwAeܶ+1޷؀m+ pZ:lNhW 5Q#>*Rf h{mK 35(?E؈NfljgL4pQ CxqD$7`};(. ( P~lsp2ܸX(J1Ř D 1栍1Z Lr]Hó؈-^'%U |S{ p'%'0Nc]7p)05HPov ʨEɏ;ؓD.vиLK..Sٔ,89겎KvypvC+z{&XdJ89*o? 4ɗ1)gT Z6q"w}IA|~( x[ٷ+79dvgh1nQfQ'yrm@0iwP!31 S^DSx{+x>)5f!6 @&^xsLR%:2 {8Q$Cc$G f4 7@l$p~54f% ɁQ ;}4>X3Dy4ɗ+ᗻGS7i0x(s֙wVgc=XhKZْ9|Z*gNRQH\s#2HdJ [,Kf)13 &f&ʈj*qC!&iqbʫŕWZ! FOf{h 70 K 崋K! M ({6kxg+]'*y#+g;!ݐaa;[{ۺ)&`<9b6p +2:JYZٯ?A{BI;5x&)'%TKYd:f ^9PD5@%VVX;V[{ۿlKVnu/(p#>bp'(xAHhǫ7۫2Y)HʘkP{'ac֫/,eZ Bb405u"kJ i@GzޓS|J9@Gћ/2RqJ[),ok@ b$0B} \:*6ȇȄȆ@ȐlɗwSCߠqD#5P Y/zK,طYk'S(?V]XggMu*˫x L;8`#Ll\;R2c#dl^<+ffp K|Q{7*iU f${,\yY6ơ}/1q1h4s/s9Cz"=]m !3s.1* Ҽ()PZ "!loaϺA(R PQf-SlrfVE%,;.; &xv }/i&im;8#Fb:oNehg o}A(]8BK|F4DOe;RL}!]%XόKƊcWM1|n p<)r$9OMKZ!/:&yx +c\br,I{$w#}|q)L+9= & պːΐ{\7q9 u+]P:t7r*<5m:}^8^.U z*~fDJXK K(T2)*)ޝxWݸk RFB$Z:(.# 7wb^^:-S@q:u>9=w>] j:Er@hh(azAN~G->qm!i̭LTڥ!YNջذ]#ԄC +%b?!nԁAp΁<ذI75NǞsc\m+x7A3n龻i>R9Z}aC˘ <+C~HJn":`p$1רs эF.xQ3/!$c\Ú"|"!! jC8-RBюx5{dp_!K;'cǂ⿚#_k99"B7cffW#"(?)xͥEm<W@c3M sCFATg &AvR0eC-F1y'0ooDS6'4,90?E+rbj//-6%>]I918ƒjd|KQ8Wbա=Kڡ>K.68 .Pa$Xf+SkR;&~//ov,1rP/E?{N`,C $n;nߜPoE /&CSL%B,P"B}AYH-/|gr?IœozD*ITYnWaŎ%[6lR'8j]k[qNe[c1m/նɰ[O޿uB%-J;oVzH)ɡEƬagAf5X5:[׹uK]ZmэIaj'!7&d`& mD/8Cu9laOj3&?3z_1@O->p>C1;o,YƈooZX"Nw #1 C,@Bn>P 3dA"oH' p@ od2AQ_d THj֔37 h9 M6N,2?2 Zx''B/RPHGE 匠m4tSN#3r,Ц*иBfB,k JKqSƚۑo2񟌼odu핻5#omI}cU5dg3o&55dtUmei `Xo} .zt]m)yfj1RW-`s F/MTk"Zf9ӫNoyhnF)T : #M:D"Gl˪6{U ٌ plF:o!"gnsk[9w wǹHi\8s|(WFǘLUG8Zv,4q}Jr R>}2gJiok2f{ "i>͵ Qܩ,s]F5RزMJSSHI| mT*AgZ"-G8"C<02z;0_Ӧ0'zcLCqi!bāp ID !EQHiP2)LӞC!A" zą^(FQal"#)V#bC ɠmv4a 0nvzHfBi`&Id5\A W@ǧ#﹀RL_ȿ7*~CC4",\>W/;zožLmw Fsp?"S;k:?֫;Ӿ˪+%;ED@S=CA%{34sA/;A+j)<lpnHm{>̨ S /A !-ʮ/$+ 4)C?;@6P4##{k'v臡'%tb @c*[C ;Y@ۯBA4 J6s=[=N36Y l`'B6b  ,.,/<4VBL=Sf=R0CFSnȋ]0%p™txB4@(ԊcWj͒AKc\%x$RD{S| 9V<0{ ';@̊H-"-K!*I1Ų! 1Dn"س-y r䮬#Sh5¾臂!Jp8*1A$l|4lRD7As; I ɎK JɻLd˚Ȏ 4ov0Z(#-n AǣLB p:T1%Z, IKI0L8Л8|йPt8Q̴=TK-;Rs t*QdLPQ%Q4QHMRKIpQHuLیb H>a][]cUP ˺uրE;7HP_`at, 8L p2F+nnb~b)&:4b'b-b0>E1Jzb0b5".fhE`hAeCS6^ȯ YnPHi`@i!,)dPPdQ>e 41 4r80l=cRe%KnOsX;`d\KeVN]V#SegfU^finfh~ifjfkfjRֺ2G̰Yΰ|"KgSgwngxFuwzfg{g|gz~nCX^%嘤USh^Hkhfh~Nhhh舦tZB~] +&Fl=VD>9eиKނPoj.j>jNj^jf~jjkXoІTjnjkkko.k^knkV3ykk֕o؁[M ,a=5mզ.N֎vҦmHmmކj|mo n)@mnn&mi6oFoVofonNon&mvnVѶmنȁЁnKGcO? Af<$;iV GЁP2h2p'h&qw+'hqqqq !7r q$?_/)q(>+P*!*q'$!p50+r'Wh+>&Ss5r%'&0sD7r,/s,grG_ /W1FGLt@Ng'%0s/5t"U39/YtXuFwt2]XrW`avH/--s7souJ?tItHD_uPMspvqg5!Lu^iji^My4`DVl ˮ~/Gǭ/Іn kkZj/jx?f&Gyy^yxmЁ膘U<^xppK3xcPCiWx Nḃ`@9@DWnIo( Q{KW~{/{{gఋg'|w?]ʷa@2]]{ȷ$" @p؁NHD@|G=>EȤJC $qEVħh"]=W~Mo~_~{~~^Z>C4/7??4thAvŷ&~s.!ƌ7r#Ȑ"5E#Wlo)&Nj,>Qzb3'ҤJywی2j*ք5chK 5+ڴjU-Q0e"4.^(9d2nEXBmn#ߋN,1Zy?3F[r̳ν8V(ͪ~WiԲܨfy.9t؃[ej5HRh`;H|~)&!%x(Ƨ;DA^/ e҈RkNpxT*[})騦 =}Su:oiL(QܨZa/\1_O%>6Jt217mAWlӲʼ,O?AƢ7/l:1VAJRRHܓC 55Y0cv 6yqk[^jbq[8wpmw%}Z֖wXx }rtrx~CaYQWFK>/d97%qh(zM;=ƫeMe50e_N W&qU;F<yS_Jǖwӟxo&_>;/xb~SA۾}Ro4aQ;;XuRPf58dv T]0meAD-fW ҷڥ<_JXNPԸD'p"(rB8pa&B'hi,}bzD0|^6c-\i&q9Fyn'ó.ʑQGA8d')P;Ң! 42ԯjK]xL%D쀗JNؓFy:8u3@*h`C 8Dad!BXV:h!?W%+ɤ6Z4lE\B}ƛĉbB m(G]Dhj=Zns&8>y*2%6L-mJirLKi2. L%G2JyT= A53tc(;S?Rh†;fIU$LePЪ 0R'*:-# U Iuh0/JҹNTASw9Ă C9i` LA[UeXUӭTO) ~gWb)PMA_۳V) PH 5sf!H)j&Ve,]tà4>[ۍEI\ʧ3yV>#u_䎑F޸w$W."V #D:.Mkf's+U1b2EIʰVdY.k'qrZfn(†ҷ:,V2X/Z'gP9'u)n Zvus< I4wbGOx? ʶx.GF ,dXK xE1):ڮ$Asβ CO~|P4$\QMiRF`_adCLl2Xm fCw dp"4YS4̩t gA]ۏ VsǙ]&gs rܖf w/߳[ږ8C;9`x!Ȗ҄ox:2#ll&^Q`Nr uQO2R9bl"j{+\dޮ=/3it-\+/LE:aA\݋Hoܖ-ja8qGaNTx΋Dz$|Iqk_vצ/Džz_V'oxUf_.:Yter_:~X94Cxr/i ОyߐfF-Q]TDJy͔Q^XԔL\]D%f억]Xy ^@˹TMD}*1mX̕8?@[/Y2 KxL`@\) ?7I:yYdOp! "o!H) tE*/9D=MfyC?iEbv5x JTpH} `NCg%ź*6Um a]Y"%XUK="Ea076}DbxC 4:DZ^}! 5#Jblq_p) =M\Ȉk7TëjZ.ޑ<`=ռyYSa ڐ ed H#I,EL%K1ٕGi6UJ$7DI>B˼F1LL70FCUwD,;hC5|CТѬ LNl٩ڕ Fd[y$1bKHQG)N\FldF|``&aa&bJ` RP Kd(`B IfeFc =^f`ûdfIԢ"ev& qfbj&kk Ik&m֦mjj&_E`n&p'k~p'r7x6DD7ѺHI5]d\0c}\ 0Ghuٸ \Qz'Z-N,lVw'g \y t7lÁz7|6'q6z8(.hJh2j(vrhh(qF*Fhhb艞hhn聞V*h (B(nh)"*2ihh B^FĂr7hC7D*(R.i(ViZi&i:i(zC6h^ij*JUF(5th7hF*"jJf*J|*؀@7\C %y]l%EV1RgG GkJ}e ||\ذZPX8X8AZj+zkr~븆++빶kƫ++n\x @:b++++.l>FlRk\|@jRÂlÎ,ĆɒĞlƫ~x+͊Ȯ,Φ,ެ*f+jxH|@ Ϊl6->-B΀| Q<]XM RƬ2فIm!#1~[Q-Ɔ#I~Nc~C 0Y74HrFNnbz&ՇqRnn27@irmTLnnpû\QdήrҀs@7HMsp9Cm0ʪ1ܱ%`]ݺְ rޥ| Zo ߖ& \2Z 9%~cT"DJ;| l D7hP] 0;$m]>!xxjN~б~-άov 0}ް[D$?PD5bF[(1/q?GqOX@13qKq_oc1wq9:6JNaq91zı1ӱ1˱q1  c r ##72$W2%_$g$4CĎPfvЉ))oQ))+2,,r,,+_q601e(3111 23332?2;s4's3 |RpXC_zFfv0pժj ; HS ӳ8_z=׳J?=eJ7䲰zCۈCFCCCwDRtDkDCF{tGdWJH4ItKs,}`KMsMtNY1|EK uOtQ5Zee`5ܯ{w3t.:UT} .]ܢG4IQ8[\jP y7LpA3-:A"wY7P$7rP{J|Zͷw7{x~g_PXwaOc+NX-[x3`GwQox[)6wgwh`$Bj6j7j8?QxJlUo ݚ&Yf󶳏37T&Jy([X5}G}¹%/<Z\]i:!KI ܅9*9;z:O:G:sK73%;*:*2```#!Lo{|F9RkQ D < HK@۳ ޮtw՘>t~Axp~=W>_i >>۾/~\W0>?wC$=o?S4 m|C S%Z?3[ ,)VxcF9vdH 2lHЛĐ+YtfLY6@V{r[GPuF5O]RO6:}EѤIju U?%fAa-,ZjU+Wr=o +=OdXAv+Ie͕9g|3fОI6-ҩC>u9j׹_woÅ7'vzğKN;''^6>W';Qk_|?|گL A (9z % ;:m$Et!m1 v1J,jڇ)gËx|"J GёGM +'*#gtF|ҟ"*0i9wZ,7>4<ӓSPyȫ"@}PH[.C*buuhϋ)!r{=CdvCo??uwofo>MY7TL"߹F֙[ vFŦf{ " {qE^\)zto=tDiQ$,?,(@>ЁlGi ?&q  (RaIAp(,!> YB s8Ѓp ЇFL"DʬKl@DKt.Z2 `\ [PV@3jZ*C0IW6<1]a҂n#Hz|cơtg)Z&'u9ި $v.IMO'{r(Q*eJe'gZ&gJ.OxwfrшlԦwT q6) PN<:dK(Ai:w@ArO# ,%oˍ ?Չ! ipwdDY.^ to Vh;/PaC4WL CI0}ci1@MH20*ei^;ҴC67t:RX*QaT*'hjLgZӛ<)Pj6.j k̞ehQ◹ceSt7duIcO|C 8 (MZ=$ClZ.,t%ىZn Wxӛ"ФW)Ⱦ`è^C3? +׸;r+814jp;O.Mv]&cvcOuHU'lAMl椞FVT`!,bk͗НL>q[` '{J' 8 1 ^R.1?k)C.`?/ENgSfCazX҇;b Qֈ D`-+]ot,Dfэm9[Bcވ;yTƲk*Wֺ!A4},1# @L#h:SS_oaCoD̫,k%UFlM J 0luѲ*iQ> 7Qo/ef Bܓ'D`pOqrs[(ã)Pm9^'a\d2OrZpYğO"Gbsc\hήC.q.91zHYc\Fz I8 yK4,C=;G;bWH_M  #$]`f X-ln#w+ ln#_l6ww=DR/e6G<7Uu4I}i! ?"qa/ dbH/+! b[lܺ , Ng Ό0a FH.Q +d[k > ^\ @|9J'l0 6r2i/n w $c-O0'`u{#"0]fctd fBՇqȠ}Q/te5`/nP:e(6Oܪ1ϵ1 .Ȟ ߌ Q բDx$cq}\e,2+7"ѸAvc#K`#4N3#'ynt3R'Sm Q'@Q6v I2@b'jބ!Qp#i+r6 {~&.Q4ƒߐ *H" "  +l0F@\F9$?vs ɺ$0C kb6,$lmO1L:'4a<[2c uFU , RZ KfU",X5HZ!ށ.bscR06ށW6NI r" |;t66> Np@Q8GȆg("\:! 'f !`Q5+"H3#UHYkWy W( HyTd->DfBvdy,+L5%E*-hSE!hqh;cC),DWN*O2lD8,+6Ձ?:ԟ& -Q*4rB1ն_SA*a "V=PHJOs VJqqTc=3rs/V(X)GJ B!a=PJEs1Fc "L![uR#[)u\Hm'=/Ogq(kG1&It̤0WbQ}(sD+#5o9#P "dcG%u BJ+JbFbdbcT6(@$*vrobSua]`#g)VN!,86aOWJ9U`,1";̔ AhS,M7r$o4MêbwQmx1ӄ~0lP 9r5 Un3RIRbW'"E BS W-"! U*8rγqqsS)G*(7rK$g}ρиԐ6Ÿ<(J_83れ'o%wRx1scB&P2 "*4H]S:Mk2x[/-[g}[bd=7 K$#ae"$HdV-`t)27d&J1!:6f"*pxKcXvf6J .vAWP⋭2 ́ bhzk'`',)}AiH5'qnPlDU/1-U u%Q5G9w{r]3FŨA%ׁXo=fڤBnc>Fr8s)*QcȠH$Ơlmw|Q˗|Kԥgfs HZ\dn,;IId-1K(s":EgrT⭥g_l4UW['*Ph*X&K@x{\*eX9,7Eo4 Rj ѼIi19"b"$܁`;bG" S$4aqcmk \]Zk^òxk`!x("gقns*0O#FxƽD'8 Ԩ(KbpJE"Hp$<Ҝz0f!vt vl4~\1^ggxI FY~"OD9؜zٚSP'<{cQE\_;o!^@gw&+/3]'^f)/'%?}!W2ijxx Evi].i'z}Ѓ#N\LnLgZ%%.iU'r|QNj`Z * ߝ=}D ր޷ Z` ]ݷ@ > Ԁv` X ~) @ `f}~vj`Z@ < X րU BLäӰuRB&u0X @M"{SMb.|BC۝+빻r)>ޞ^~~v?!%>2Iߞ!zzfha J臾Q7<>zen#Y(ħ*,hsO/۷]۷]2=/skAgң ߻(G6ԫ'5}x^J'6wjn &^; u{߿:|1ĉ+Z1ƍ ‡9<2ʕ *dݿ3Ό{͟;ī< 5N hTVxC/̱JdݷZ.liYtTTϐskWh?|_ۃ:1Ӷ.ݧP!f!'9Xb f&=-%xyCB.([BrE۷߾}@0,XL.cԫST$Qܻ#oۻ;Lϻ/mWoGUCEXmW^nM}>;|eƘOrA_5HO:BSSy).ER{Et \X\/ G}yR|8TbD.?o d$%D6ܰh{6]BXZM8&J81XV%Dh9; iWZv_{zҚ]yÍHe(A&QM`J7^BgYYC8h^Bd>r7H9kLS7'v됝;m,`4"7g,E5䨨Ji,SU.xnx(55X;j }ҋMJZc_VT͉Kr.iOҊ :\qZ L^L\I[ ()\wm*l΅)PZ\cuZW0`C<"]7}_j1y$7d QzoeOJ ,QME+\we8CB|ؠ7Yd;BS 3?欳oGzExpo4WM vv-5=:`im#fsGbLL{ MHSjiW6B }@)ʳUC4aH~ '(C܁8&kXGw81n"@p~XŇ/LesNGHHCnY5m#&aVoiFl\R񾦭i8):}A3kM%΋Pvx[27~#/}NE_K&Ȱ#n|CH=Q> YV<̅ja}FFe _V`Íop$N0)ʄ Y8I`L ѠvNf(ZƘJ ~2cb.wB@wc o0t K0(DXB;昒3Ę5V7US7=B k.Ed\Z$T#)0/ d 'Tl8{ >h%6Hk&O1K얠z:!T#Kї]Ca61$P2< eӛu%Ciz`z2D&0qbs޾;9\O͇ä0o.9JknٮB%h~v|`RqT-~b[DYxe.QΒ`kF?ʨ CJom`ڒ^x^̉P" \cAگ7Mzo}fZچHjcQA>7- RqxG?Kת9+2an͑MB[Pq5`Ѵ?W$Ejh(7$L{WB_r('ׁ8'"kG`BL@Lh60 @[Vr]wx "4yEzaYI8rWOd0D oqz{{qzA&!uXHyUqow8t"4|h(xh{[WUdLJd@2 QX~e,/jO}E_8xzgG32s(׃3T\h?BE4h$*_rUAK &L"GapA>PT:ȍ$r$CN2sC1Ҩ49!'ehyBaF 0DUrDÏizP?dP%,ۡ(YTIi"Giĸq[1ؑ~B`Ȑh\"Ij/)O6LJQVՏj @oAӓ!uC2]wP&'蒀ihxy:Y>1 #wg)^I)D!?qwR/R~^YW$)%~~ r@QQjI`3Y-ؒ Yז@w1T~veod4AgT1&WKה!?jI)I" ^:]UG"Rx^?D= ~;QD,.,I{>Y&Ǜ^IDS/pљoo [ DKMlit4,~-'hgM]9-ix/$I4\ʩ0-XB 9z9(#58@& D 5L .LJx{%؁wQZ'T:W.̧81p'pmK""BiDܔwJ5ڞ0:#)S%zd#[~A"8{zzO: qzZh'qjaA"*|Jr٫Ƈ5;%*@-C97Èqs㹆,%"7 T_q؀!3]jx aR*\Jگڪ۪š98F:OY``[FDz8tK.'V)XfX\YjZE 03 zJ뇮J~&KJA [0jWj*rhP8QԘZ`u7mKyۂP޲?*jAz:EJRjQꪰ!{kz Kʴ({z-0ikEwI ۀ JpJQ 4w6m+i{⚇"j'Jp @3[5 9 @˹W(MPS䋺 8Ѿ+髩'&q-lg<4sGpeCP۬ L'KW2YBI$yˣRhY@|`~{@K䫯U 7ܹ۸8Lz9A5';ȦIހ#AA*6K+xK$-+ J) + +M  [-a `"[LP\\ Si:%%2q^K;zJj [O2DrlI^ A=ZIMJzCq49@·8!!;0jpēgLC!ʭG< %l:k c"l [7=8y\ZV%BT\AJ3fB*(8p@a;O#_H7HU,aw'܍#hrD=r7DaH#! i<8|xwqإxfWmU%sYm/a0 4J!e0C)1-w>!%0Lf1R٪= ]9B5_x:{5:'"IqCt<.g/8]؀MsLGt 0}h\ 12;}( ݹ']ٝusx5$2ݛY96!I* p+"Uvh/DQYqdQHY͠J#4ս-N1Sjn1YzI N9c DK ԯ̃7rY?G7:@lY`N7eX=RU=C6wO|d8=U=䢣ʳi %C桹ox#pg}[֗%7t0G}]ǔsF}ge}s.9^wn5<>f,"] ("샃 Q65Y'by%h̢#GBb&ߚ%,FюlP7qfNjp[W3fpNjf,jW`POk[o?,`GfZpMXMo`rrE?ckgNVE@pW443&4Fc>g@Nq[_@=89`4c0AO]܃?I2?8ruˎ(|\m d@'882;歹GPbxq^w nN0okF k$j@Jj /fJd nn'6o ͠ ~K8B 'lA!r[[7=pБ - zfgM=}TPEEt;ôTU^ŚU+w9UXe2-a;; ś׬ۮdحϭ^Ezcojx.&ӝ8zXfel`ΥMlO[lڵmƝ[n޽qW/txlŲq2Ч_7ؽoN{c퓲)+zﬨ j m4)ɲm20C$Tͭ֜P1ƪӰğ.[l bGD*X H#‰&J#4̟}fzD*&,!>g|l?(-n0,3 Ac:**Ӧ-54B-QEQHu4J)%2nRQ;'nA-4onjl >m|V ;e״F{m-K%X$1eo5|թ&[p&{=f3{B:ݓ?yjL,Lh;*wZ 4)nl*GBoTP1腮Ew@r YAήR[u!u.֋f\7s[w~6ZQZ_7[M/yOBg[mL@>wDRi騡fj,ƺjk}ggQ`Gio264`nmQIK LYw>\,Ia]C~46k)l0f#w-C7\/1iMIl2F'}oU>v<'3r5qo^yyGQcvֶa)ܖli3E;)ڱ(+nYK^Ž|X dǺ(?>Q10"&Gsb:Zw儤eҕV:&"?D$)5i免.Bo/!QJ), uxӉצ,ىA>'myɰ$TbI;!`}$E[kx1TӏZ *HimNVԣi:umfB)M]\bfǻskN%oGyR3ΌĤFX>fy2H4y&gT9Jܠ U@&*%pOÝkMVڄ.0;EZSh>$izBt{3f2L 7nq|DT9ōRt uEY%7:nUIZt?ӄzg:@B,Dfâ42NԱ~ 0g; o4DŽ)Ș<1k"'vu:M)McwI^צ|씈}&V޼x,IR.ʪJ tv=&`$k";#oi1.dC)5MEWnfSUIxdlA@̈́C3剓"S1 {>^xB^d`MT)Mx=Jmo5=kb1QEJڢ[ #YM([Eit>CUL;ZS)b>Q\qFȒy,Q 7N]FEd2OђޡB_Qz61]\4Զq }8.nF`}WZ1$ C&A=If+{ JW&llhkNrlg[͍ywў;}mn{6c3r;h l jt+ exkpiæ&yxE ( rFq 4r>Ũ!YDj|_Ўcs9:jt. V /d9pZ0D O D<hy Ϯd=$L{e8I6%+y1Ǝ]}{v%ߠ7f XTS1 ʕDZN F/C[lO"PP?H.l.W鹼[c#2@G7^y$q]u0%'"MJco4 04shOc~oP<'?S?ػ';!Z[maHoH-bK1ӢнӢ h06r@Cm1 #q:v0$&&4 !]T# U۩A :9|C9ɦEԣ&[ģ:]s!9a4 <)xZŨ1[\]tN DbV<8Q"CFSĿIܡDQa ;{Qz"{*eD\c 9)wdߓ)BY}E+0l! '^[@9Q<޻r#A1 '^-Zt*)'Z8J⃠[s.K:vt!*,||]L9HK Ba$9*)5<5ux"9Mʭ# (SHL|PJ͙ј|{ 250j9IIɟAqJ;LSCcQB2J\J~h2$.At˄31&8|-MԁŃ$"{YJZ{I,-ދ$5\Π4L ̓TLKJd#VIΔs>G ,D&ư v tZLOYJtN[qG(>2G0uqG)hbNI=|P*ǚd %7LvF!|5%If\Ԗ+a3ͬ"1Qx2éDD:">ZILK9ۭ3ݕYNRҜŒG^)J}c}y%vQ`zkD)OmkAQ,MC ` s6J<<O\ )R鲌 P O<Ԭ.$wx!jBm$9HqI!35ˑA&6D*M9cZ1"C3uoHvBQ2WHKĥF%*KAlNLN蜗dL\WAPu)kZ V*G' who1BO.j ;#aȖʸKI 9EPUd~К * ɠk`WI'F1# PvTj*Fw x؀L֣͊@$Qu$ m1 pi=kYUdҩZ''[܏ϺuڪVW/u9OĝH5ZstTVToZءֹ,:]a'|GMY,\ ҼeUu[v]]MzUqB $}}\z:dw Zl'&Z9#%u)%rmJ[io"ך[Ԋ#ԧm$G1ىSEb%;zR Yv|@&˿Fy MQX,e5e Jt3I ]Ġ aQ(jt=QTBFZދ1t-%-Vkn4h2n@>@Xm׭!AIn]WDPk0 E'Z#_݁!D=MI5GV>:Fid\Kf L?1[a^5D2`]FBQϱ'\ m-=9v-#ͦNkMם$k-P(39p.A`T2{A=$(g+fx]gvIwnzgYIgPe(5Z va~%0vn"`NHq#c=7]<' [qTlDʝe=YɘlЁnֻoQ#;C"046 ӗ[И6Nꭚjs*^j%HJNJE&Oɕmnx-Ae41^ ^ad4bV,A޺?N+UMH X$HK& ``0D4@' %-bfN$nkm21Hwzhގ~Nn֮>nھnӆ&T -5h2'p+e̒]G4qh#h3*f"gY'G6f_%#-|mH¨Y+Ș4q eVX|_G+'0spp/d)s@JBةlI+A;x>f[1ixWKyw؆;22 hYIYȢXO{X4K *VN֭3 BAl ^|8D  w빱gɢF"Mt)ӦNBu:wVmu+׮^n*pN`ϢMBnP#s-ݺvTN7nDf+xpә37,Kx1c9hPn%ߍfUtM&q6 o߶q,[@F/vߦ-pvK 0>ȃ?Տǭ9b1vb"nܑdxCw- 3~仇7/çYVCx#D{#} bDRttDpsE\L eXbRՄf&"Z.X?nm DXN XeҏG"%l#OvuhMM}!NuQw>k/\k޴ cNcJqSjpNBL8FcfId$wyg٧@,qhhk<if| 4Q(yMEnܴ%3~,~ OmvQQ^ez-bY\rJZfA1;TUe{c^ɥ@e-_C7M qq&%j8Al6vma.>f>A 4Y!,fnQ/_~{Hč~zKCk{moIOĂ$1 q>Ԓ#QRd= qhR dVIJ^H0¤~DT Jh+\ Z tE͈$ Ƿ#}m1b68aTs!0}mt m@@oIAI"(QP@vo")`7.h rYbcPHmC49҆%P?я2>!Q(ƯÍ iBKVoiAOR4M1z:$ip4 mf+=7NmLC+" :blGTF`hiFQ0v$A< -ͅ\ddh6L+~9DQG?(ǎCZˢ3V!s+?2ю !`(Q¤J/R)I^;8rrg$'@2E=aO %~۱7-|TVN@4r։Ard mA ,R40~:FCD"&}$,YMtl&a @D1dKƷm341H %}& n >AiA4Ja1Up]m6e.Rw4zdY V$P;TuuEBqbc4\V%|x#&ĩI woX7[ *olפ:!-?A8D +fʓb832FI2ȬK5mnؚ_ոa81aH+y!ɹF!hM#f+ryfepyAX3LLj]G>f6s| <źVüo4|>qTAoj@h LrLfi$ y鲑hbf@,.Y4a.#: Ys^FRfBFgMnCx(NdLHyؐs@Ԇ?$;y4y˴`Pˑ^7PnQՓfwm"i"heۘ3Y"iy*.bm_Yֺ!o2| 4֧T*2bڐlHN6*n0.֫\NPN۱9Cqi /u+=*r(&'݋k-; ]V6玔{IU xuN%=Q؃>s ҤFdA3+a -bGx~us|!e&bcl uSh!VKc#^e ٯ%A)o @F0_P"MF|-LJ#An U.Z$JB 9760PEbk$aeTZZ YI߉$eT%)rcӷbeDp&Yc@8XSOH;Zc"eɕ!2}X%yU e^ٜIX"tfTr7x^GR[]?XI@e0f-!C n!o q>q;wafr`t`gHQߋ]d&Tͼ[9٘f!9ɜDP5Ei'0Z (dxdXd1LRk[X T"mAy)5\$dWJ^XN mh DŽ(Z%ubrL!hhb ǔGxY#DLXUpR:L+%[7JFR> 3l靹=[؜J[a`#qTD֥%N?(ԇVpD=_HzG7rIpҡb @Ī>|(#4q~w>")EEDIW֪iCV܆9pb,d}"l]RB9[ҡP]`[Al\e^49^2ln, !f!*ԗÑd}DEBpxLhe̊4Apqepdq[8e'$mDpH@cMlV^Ѩ0eO[MV6!ƚ[!F3N,c;X K'iH~,A\c iVdZ=69Rn+߼px}dndLCqMi mJlȒd6 L9XL^_7ڣ0 4p ,.YDHOBHԇp { DBh4id<ڎP~Û-0e\RQ*g]$7Dp.)M"ڑ| @MؐvG־LیP܈5%Mf$")<]^($7m,JW#'π 4͘%ΠCXR!SO-N.-*j}$[C0sZ_;cVAFkM2Lz%d\I){2^47̀t7TlD l@#Ymݎ pN fT 4Ae 5(twZ? ΰ6<kHʬt~}\VBPDhmDe=kGl'F\p:VgM3kT.N l3PK68y+rϑX$V#Zmad FE|uL LFUǫ g{ԮAīho70Mz7a5V3vO8oe0%Q6qLؽRErU>4džG tCI|x6Z~ ;=6Js3GMà*i*xʄkYSzKy`_\!\seR{x!ǎM1eV_!N{wv;0|o? Gc%:[cXM/Qzgi['a 4Xc[z >hHtgc z>wQI|mq9;.7u/wD w~< ENhT$FtbCyC5-DyiI6Mh@ jwzze *2;1q%{⟇;(;lzeE1kΙ bhļ#s-eSSJ~}lS9;e{les>Zk|&2?*[w%w#vNˢx;T7'@8`A&TaÂaE1cGAvdI'QTeˏ$t9f͌dԹoV/(OG|g[сC9E:u>W]JŪ0 ;libcommons-dbcp-java-1.4.orig/xdocs/index.xml0000644000175000017500000000704611333570547021170 0ustar drazzibdrazzib Overview Commons Documentation Team

Many Apache projects support interaction with a relational database. Creating a new connection for each user can be time consuming (often requiring multiple seconds of clock time), in order to perform a database transaction that might take milliseconds. Opening a connection per user can be unfeasible in a publicly-hosted Internet application where the number of simultaneous users can be very large. Accordingly, developers often wish to share a "pool" of open connections between all of the application's current users. The number of users actually performing a request at any given time is usually a very small percentage of the total number of active users, and during request processing is the only time that a database connection is required. The application itself logs into the DBMS, and handles any user account issues internally.

There are several Database Connection Pools already available, both within Apache products and elsewhere. This Commons package provides an opportunity to coordinate the efforts required to create and maintain an efficient, feature-rich package under the ASF license.

The commons-dbcp package relies on code in the commons-pool package to provide the underlying object pool mechanisms that it utilizes.

DBCP now comes in two different versions, one to support JDBC 3 and one to support JDBC 4. Here is how it works:

  • DBCP 1.4 compiles and runs under JDK 1.6 only (JDBC 4)
  • DBCP 1.3 compiles and runs under JDK 1.4-1.5 only (JDBC 3)

DBCP 1.4 binaries should be used by applications running under JDK 1.6.

DBCP 1.3 should be used when running under JDK 1.4 or 1.5.

There is no difference in the codebase supporting these two versions, other than that the code implementing methods added to support JDBC 4 has been filtered out of the DBCP 1.3 sources.

The JavaDoc API documents are available online. In particular, you should read the package overview of the org.apache.commons.dbcp package for an overview of how to use DBCP.

There are several examples of using DBCP available.

libcommons-dbcp-java-1.4.orig/xdocs/issue-tracking.xml0000644000175000017500000001322111333570547023001 0ustar drazzibdrazzib Commons DBCP Issue tracking Commons Documentation Team

Commons DBCP uses ASF JIRA for tracking issues. See the Commons DBCP JIRA project page.

To use JIRA you may need to create an account (if you have previously created/updated Commons issues using Bugzilla an account will have been automatically created and you can use the Forgot Password page to get a new password).

If you would like to report a bug, or raise an enhancement request with Commons DBCP please do the following:

  1. Search existing open bugs. If you find your issue listed then please add a comment with your details.
  2. Search the mailing list archive(s). You may find your issue or idea has already been discussed.
  3. Decide if your issue is a bug or an enhancement.
  4. Submit either a bug report or enhancement request.

Please also remember these points:

  • the more information you provide, the better we can help you
  • test cases are vital, particularly for any proposed enhancements
  • the developers of Commons DBCP are all unpaid volunteers

For more information on subversion and creating patches see the Apache Contributors Guide.

You may also find these links useful:

libcommons-dbcp-java-1.4.orig/xdocs/guide/0000755000175000017500000000000011337741616020426 5ustar drazzibdrazziblibcommons-dbcp-java-1.4.orig/xdocs/guide/jndi-howto.xml0000644000175000017500000001046311333570547023235 0ustar drazzibdrazzib JNDI Howto Commons Documentation Team

The Java Naming and Directory Interface (JNDI) is part of the Java platform, providing applications based on Java technology with a unified interface to multiple naming and directory services. You can build powerful and portable directory-enabled applications using this industry standard.

When you deploy your application inside an application server, the container will setup the JNDI tree for you. But if you are writing a framework or just a standalone application, then the following examples will show you how to construct and bind references to DBCP datasources.

The following examples are using the sun filesystem JNDI service provider. You can download it from the JNDI software download page.

libcommons-dbcp-java-1.4.orig/xdocs/guide/classdiagrams.xml0000644000175000017500000000256411333570547023773 0ustar drazzibdrazzib Class Diagrams Commons Documentation Team
libcommons-dbcp-java-1.4.orig/xdocs/guide/sequencediagrams.xml0000644000175000017500000000242511333570547024472 0ustar drazzibdrazzib Sequence Diagrams Commons Documentation Team
libcommons-dbcp-java-1.4.orig/xdocs/guide/index.xml0000644000175000017500000000233611333570547022262 0ustar drazzibdrazzib Developers Guide Commons Documentation Team
libcommons-dbcp-java-1.4.orig/xdocs/release-notes-1.2.xml0000644000175000017500000002045511333570547023124 0ustar drazzibdrazzib Release notes for Commons-DBCP 1.2 Commons Documentation Team $Id: release-notes-1.2.xml 560804 2007-07-29 20:14:22Z bayard $

NOTE: DBCP v1.2 requires Pool v1.2, make sure you use the correct version!

There were some new features were added since the 1.1 release on 20 October 2003.

  • Performance optimizations for the PoolableConnectionFactory of BasicDataSource.

  • Add BasicDataSourceFactory.createDataSource(Properties properties) for creating a BasicDataSource.

  • Add initialSize parameter to do pre-loading of the connection.

  • Refactoring of the DelegatingStatement classes.

  • Make some properties dynamic (changeble at runtime), this will be completed in next release.

  • Improvements to the prepared statement pooling.

  • Driver specific changes/optimizations for: Oracle, Informix, DaffodilDB.

  • Several fixes for PerUserPoolDataSource

  • PoolingDriver uses now a PoolGuardConnectionWrapper by default. If access to the underlying connection is needed, you have to enable it: PoolingDriver.setAccessToUnderlyingConnectionAllowed(true)

  • The following issues were resolved since v1.1: (see Bugzilla for complete description)
    IDDateSevStateSummary
    245622003-11-10EnhFIXEPoolingDriver needs a closePool method
    243282003-11-10NorFIXEPooledConnectionImpl ignores resultsetType and Concurrency
    246782003-11-14MajINVADelegatingStatement.getResultSet() never returns null
    250962003-11-30EnhFIXEPoolableConnectionFactory synchronized methods
    250012003-11-30NorFIXEOracle 9i and default isolation settings
    257622003-12-26NorFIXESharedPoolDataSource getConnection() throws ClassCastException
    250672003-12-26NorFIXEPlease give possibility to acecss ObjectPools from PoolingDriver
    257952003-12-29NorDUPLNumberFormatException: For input string: "myDB"
    257942003-12-29NorFIXEClassNotFoundException: org.apache.xerces.parsers.SAXParser
    249662004-01-06NorFIXENullPointer with Oracle 9 driver
    260722004-01-18NorFIXENull pointer exception being thrown in SQLNestedException
    262622004-01-20MinFIXEDBCP log message in tomcat has incorrect day
    264222004-01-25EnhFIXEAdd BasicDataSourceFactory.createDataSource(Properties properties)
    255142004-02-07EnhFIXEAdd initialSize parameter to do pre-loading of the connection
    240822004-02-28BloFIXENumberFormatException: For input string: "myDB"
    241362004-02-28NorFIXEClassCastException in DriverAdapterCPDS when setPoolPreparedStatements(true)
    272142004-02-29EnhFIXEbad &gt; entity in javadoc
    273202004-02-29NorFIXEDBCP 1.1 incompatible with Informix (driver doesn't support setReadOnly(...))
    274652004-03-07MajFIXEmemory leak in KeyedCPDSConnectionFactory
    269662004-03-07NorWORKConnectionpool's connections always returns same hashCode
    272462004-03-07NorFIXEPreparedStatement cache should be different depending on the Catalog
    274362004-03-08EnhFIXEWith Oracle jdbc driver, an unnecessary SQL "set transaction read write" is issued each time a connection is retrieved from the pool
    285792004-04-25NorFIXENumActive can become incorrect when removeAbandoned=true
    285802004-04-25EnhFIXEAbandonedObjectPool/Trace should log to stdout
    282512004-05-01NorFIXEReturning dead database connections to BasicDataSource
    286882004-05-01CriINVACant Deserialize the Class PerUserPoolDataSource
    288932004-05-12MinFIXEPoolableConnectionFactory has incomplete javadoc on validationQuery
    289122004-05-17MajFIXEConnection re-use conflates logical and physical connections
    290542004-05-20NorFIXEsetTestOnReturn(boolean)
    290552004-05-20NorFIXEAutoCommit and ReadOnly

libcommons-dbcp-java-1.4.orig/test-jar.xml0000644000175000017500000001626211333570550020464 0ustar drazzibdrazzib Checking dependencies

See the downloads page for information on obtaining releases.

Apache Tomcat deploys all objects configured similarly to above within the java:comp/env namespace. So the JNDI path given for the dataSourceName parameter is valid for a ConnectionPoolDataSource that is deployed as given in the cpdsadapter example