Prepare for release.
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index dd5eaab..1e225fb 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -1,715 +1,715 @@
-<?xml version="1.0"?>

-<!--

-     Licensed to the Apache Software Foundation (ASF) under one or more

-     contributor license agreements.  See the NOTICE file distributed with

-     this work for additional information regarding copyright ownership.

-     The ASF licenses this file to You under the Apache License, Version 2.0

-     (the "License"); you may not use this file except in compliance with

-     the License.  You may obtain a copy of the License at

-    

-          http://www.apache.org/licenses/LICENSE-2.0

-    

-     Unless required by applicable law or agreed to in writing, software

-     distributed under the License is distributed on an "AS IS" BASIS,

-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-     See the License for the specific language governing permissions and

-     limitations under the License.

-  -->

-

-<!--

-This file is also used by the maven-changes-plugin to generate the release notes.

-Useful ways of finding items to add to this file are:

-

-1.  Add items when you fix a bug or add a feature (this makes the 

-release process easy :-).

-

-2.  Do a JIRA search for tickets closed since the previous release.

-

-3.  Use the report generated by the maven-changelog-plugin to see all

-SVN commits. TBA how to use this with SVN.

-

-To generate the release notes from this file:

-

-mvn changes:announcement-generate -Prelease-notes [-Dchanges.version=nnn]

-

-then tweak the formatting if necessary 

-and commit

-

-The <action> type attribute can be add,update,fix,remove.

--->

-

-<document>

-  <properties>

-    <title>Apache Commons Pool Changes</title>

-  </properties>

-  <body>

-  <release version="2.5.0" date="2017-12-16" description="This is a patch release, including bug fixes only.">

-    <action dev="ggregory" issue="POOL-331" type="update">

-      Update from Java 6 to 7.

-    </action>

-    <action dev="ggregory" issue="POOL-330" type="delete">

-      Drop Ant build.

-    </action>

-    <action dev="ggregory" issue="POOL-332" type="add">

-      ObjectPool and KeyedObject pool should extend Closeable.

-    </action>

-    <action dev="ggregory" issue="POOL-333" type="update">

-      Update optional dependency asm-util from 5.2 to 6.0.

-    </action>

-    <action dev="ggregory" issue="POOL-334" type="update">

-      org.apache.commons.pool2.impl.ThrowableCallStack.Snapshot is missing serialVersionUID.

-    </action>

-    <action dev="mattsicker" issue="POOL-335" type="add">

-      Make abandoned logging stack trace requirements configurable. This also reverts

-      the default behavior introduced by POOL-320.

-    </action>

-  </release>

-  <release version="2.4.3" date="2017-10-24" description="This is a patch release, including bug fixes only.">

-    <action dev="ggregory" issue="POOL-328" type="fix" due-to="Lorenzo Solano Martinez">

-      Documentation with repeated words (sources, tests, and examples).

-    </action>

-    <action dev="ggregory" issue="POOL-317" type="fix" due-to="KeiichiFujino">

-      Correction of default value of softMinEvictableIdleTimeMillis in BaseObjectPoolConfig.

-    </action>

-    <action dev="ggregory" issue="POOL-309" type="fix" due-to="jolestar, Roopam Patekar">

-      Fix misspellings from "destory" to "destroy".

-    </action>

-    <action dev="markt" issue="POOL-306" type="fix" due-to="Adrian Crum">

-      Ensure BaseGenericObjectPool.IdentityWrapper#equals() follows the expected

-      contract for equals(). 

-    </action>

-    <action dev="markt" issue="POOL-303" type="fix">

-      Ensure that threads do not block indefinitely if more than maxTotal

-      threads try to borrow an object at the same time and the factory fails to

-      create any objects. 

-    </action>

-    <action dev="markt" issue="POOL-280" type="update" due-to="Jacopo Cappellato">

-      Small refactoring of borrowObject() to reduce code duplication.

-    </action>

-    <action dev="markt" issue="POOL-307" type="update" due-to="Anthony Whitford">

-      Replace inefficient use of keySet with entrySet in GKOP.

-    </action>

-    <action dev="markt" issue="POOL-310" type="fix" due-to="Ivan Iliev">

-      Ensure that threads using GKOP do not block indefinitely if more than

-      maxTotal threads try to borrow objects with different keys at the same

-      time and the factory destroys objects on return. 

-    </action>

-    <action dev="markt" type="fix">

-      Ensure that any class name used for evictionPolicyClassName represents a

-      class that implements EvictionPolicy.

-    </action>

-    <action dev="markt" issue="POOL-315" type="fix" due-to="KeiichiFujino">

-      Add a configurable delay (default 10 seconds) to wait when shutting down

-      an Evictor to allow the associated thread time to complete and current

-      evictions and to terminate.

-    </action>

-    <action dev="markt" type="fix">

-      Ensure that a call to GKOP preparePool() takes account of other threads

-      that might create objects concurrently, particularly the Evictor.

-    </action>

-    <action dev="mattsicker" issue="POOL-320" type="add">

-      Use more efficient stack walking mechanisms for usage tracking when possible.

-    </action>

-    <action dev="ggregory" issue="POOL-322" type="update">

-      Update optional cglib library from 3.1 to 3.2.5.

-    </action>

-    <action dev="ggregory" issue="POOL-323" type="update">

-      Update optional OW2 ASM from 5.0.4 to 5.2.

-    </action>

-  </release>

-  <release version="2.4.2" date="2015-08-01" description=

- "This is a patch release, including bug fixes only.">

-    <action dev="psteitz" issue="POOL-298" type="fix">

-      Changed default jmxNameBase in BaseObjectPoolConfig to the correct (null)

-      default.

-    </action>

-    <action dev="psteitz" issue="POOL-300" type="fix">

-      Added PrintWriter flush to DefaultPooledObject's printStackTrace method.

-    </action>

-  </release>

-  <release version="2.4.1" date="2015-05-30" description=

- "This is a patch release, replacing a defective binary jar in version 2.4. Other

-than the build configuration, the source distribution for version 2.4.1 is identical

-to version 2.4.">

-    <action dev="psteitz" issue="POOL-297" type="fix">

-      Reverted cobertura plugin update that caused binary jar corruption.

-    </action>

-  </release>

-  <release version="2.4" date="2015-05-27" description=

- "This is a maintenance release that includes bug fixes and minor enhancements.">

-    <action dev="psteitz" type="fix" issue="POOL-287" due-to="Caleb Spare and Thomas Neidhart">

-      Fixed capacity leak when an object is offered from a GenericKeyedObjectPool while it is

-      being validated by the evictor. 

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-283">

-      Eliminated the requirement that objects managed by GenericObjectPool or

-      GenericKeyedObjectPool be discernible by equals.  Prior to this fix,

-      equal but distinct object instances could not be stored in the same pool.

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-284">

-      Eliminated the requirement that object equality and hashcodes do not change

-      while objects are under management by GenericObjectPool or GenericKeyedObjectPool.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-289" due-to="Luke Winkenbach">

-      Fixed class loading for custom EvictionPolicy implementations that may not

-      be present in the class loader hierarchy of the Pool classes by falling

-      back to the class loader of the current class.

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-285">

-      Ensured that when an instance that has already been returned to a pool is

-      returned again, the expected IllegalStateException is generated before the

-      returning object is re-validated or re-passivated.

-    </action>

-    <action dev="psteitz" type="add" issue="POOL-286">

-      Added preparePool method to GenericObjectPool.

-    </action>

-    <action dev="ggregory" type="update" issue="POOL-296">

-      Update asm-util from 5.0.3 to 5.0.4.

-    </action>

-    <action dev="psteitz" type="update" issue="POOL-293">

-      Exposed getEvictionPolicy as protected in BaseGenericObjectPool.

-    </action>

-  </release>

-  <release version="2.3" date="2014-12-30" description=

-"This is a maintenance release that includes bug fixes and minor enhancements.">  

-    <action dev="psteitz" type="fix" issue="POOL-279" due-to="Jacopo Cappellato">

-      Eliminated possibility that DefaultPoolObject#getIdleTimeMillis() could

-      return a negative value. Use by pool implementations would not hit this

-      bug. 

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-275">

-      Made wrapped BaseProxyHandler.pooledObject volatile.

-    </action>

-    <action dev="ecki" type="fix" issue="POOL-277" due-to="Lucas Pouzac">

-      Replace synchronisation with lock-free maxBorrowWaitTimeMillis to

-      increase scalability.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-276">

-      Ensure that objects are not validated on borrow when testOnBorrow is set

-      to false, testOnCreate is set to true and the pool is exhausted at the

-      point borrowObject() is called.

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-270" due-to="Michael Berman">

-      Fixed error in GenericKeyedObjectPool constructor causing minEvictableIdleTimeMillis

-      to be used in place of timeBetweenEvictionRunsMillis in eviction timer setup

-      when a GenericKeyedObjectPoolConfig instance is supplied to the constructor.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-263">

-      Fix a threading issue that meant that concurrent calls to close() and

-      returnObject() could result in some returned objects not being destroyed.

-    </action>

-    <action dev="psteitz" type="add" issue="POOL-262">

-      Made fairness configurable for GenericObjectPool, GenericKeyedObjectPool.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-261">

-      Correctly mark cglib as an optional dependency and ensure that the OSGi

-      manifest information reflects that.

-    </action>

-    <action dev="markt" type="fix">

-      Improve performance of statistics collection for pools that extend

-      BaseGenericObjectPool.

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-259">

-      Made client wait time statistics accurate when pools are configured to

-      block indefinitely.  Also modified computation to include latency clients

-      experience due to waiting on factory methods.

-    </action>

-    <action dev="ggregory" type="update" issue="POOL-273">

-      Update cglib to 3.1 from 3.0.

-    </action>

-    <action dev="ggregory" type="update" issue="POOL-274">

-      Update asm-util to 5.0.3 from 4.0.

-    </action>

-    <action dev="markt" type="fix">

-      Prevent potential memory leaks when the Pool is dereferenced without being

-      closed.

-    </action>

-    <action dev="markt" type="fix">

-      Prevent potential memory leaks with using an Evictor in a container

-      environment.

-    </action>

-    <action dev="markt" type="fix">

-      Protect against a user provided eviction policy throwing an exception and

-      stopping the Evictor thread.

-    </action>

-    <action dev="markt" type="fix">

-      Use the thread context class loader to load custom eviction policies. This

-      allows application provided eviction policies to be used in a container

-      environment when the pooling implementation is provided by the container.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-281">

-      Fix a potential infinite loop in the underlying Deque implementation.

-    </action>

-  </release>

-  <release version="2.2" date="2014-02-24" description=

-"This is a maintenance release that adds a new testOnCreate configuration option

-and fixes a small number of bugs.">

-    <action issue="POOL-248" dev="markt" type="fix" due-to="Warren Chen">

-      Ensure that if an attempt is made to return an object multiple times that

-      the current active and idle object counts are not corrupted.

-    </action>

-    <action issue="POOL-249" dev="markt" type="fix" due-to="Ville Skyttä">

-      Fix Javadoc issues when building docs with Java 8.

-    </action>

-    <action dev="markt" type="fix">

-      Fix the remaining Javadoc warnings.

-    </action>

-    <action dev="markt" type="add">

-      Add a new validation configuration option testOnCreate that tests an

-      object immediately after it is created.

-    </action>

-  </release>

-   <release version="2.1" date="2013-12-30" description=

-"This is a maintenance release that includes a small number of new features as well as 

-including bugfixes and test case improvements.">

-    <action issue="POOL-243" dev="psteitz" type="fix" due-to="Michal Sabo">

-      Added missing create counter decrement in GenericKeyedObjectPool create method on factory

-      exception path. Prior to this fix, exceptions thrown by factory makeObject calls could leak

-      per key capacity.

-    </action>

-    <action issue="POOL-240" dev="psteitz" type="fix" due-to="Dan McNulty">

-      Ensured that blocked threads waiting on a depleted pool get served when

-      objects are destroyed due to validation or passivation failures in

-      returnObject or when a checked out instance is invalidated.

-    </action>

-    <action issue="POOL-241" dev="markt" type="add" due-to="Bruno P. Kinoshita">

-      Expand the coverage of the unit tests.

-    </action>

-    <action dev="markt" type="add">

-      Provide more control over the names under which Pools are registered in

-      JMX so components using the pools can register the pools they use under a

-      related name.

-    </action>

-    <action dev="markt" type="add">

-      Include the number of times an object has been borrowed from the Pool when

-      the DefaultPooledObject wrapper is used and expose this property via JMX.

-    </action>

-    <action issue="POOL-245" dev="markt" type="fix" due-to="Bruno P. Kinoshita">

-      Remove a duplicate null check and fix some typos in PoolUtils.

-    </action>

-    <action issue="POOL-246" dev="markt" type="fix" due-to="Bruno P. Kinoshita">

-      Make the toString() method of ErodingKeyedObjectPool consistent with the

-      other pools.

-    </action>

-    <action issue="POOL-245" dev="markt" type="add" due-to="Bruno P. Kinoshita">

-      Further expansion of the coverage of the unit tests.

-    </action>

-  </release>

-  <release version="2.0" date="2013-11-11" description=

-"This is a major new release that provides significant performance improvements

-in high concurrency environments. Pools now provide a mechanism for tracking

-objects that have been borrowed from the pool but not returned. There have been

-numerous API changes to support these and other new features as well as to

-clarify behaviour and improve consistency across the API. This release requires

-JDK level 1.6 or above.">

-    <action issue="POOL-211" dev="markt" type="add" due-to="Brad Koehn">

-      Add support for proxy wrappers to ObjectPool and KeyedObjectPool. The

-      primary advantage of these wrappers is that use of pooled objects is

-      prevented after they have been returned to the pool.

-    </action>

-    <action issue="POOL-229" dev="psteitz" type="update">

-      Added abandoned object removal (moved from DBCP) to GenericObjectPool.

-    </action>

-    <action issue="POOL-221" dev="markt" type="fix" >

-      PooledObject.state does not need to be volatile

-    </action>

-    <action issue="POOL-220" dev="markt" type="fix">

-      Suppress a FindBugs warning

-    </action>

-    <action issue="POOL-217" dev="markt" type="update"  due-to="sebb">

-      Use an IODH for PoolUtils.MIN_IDLE_TIMER

-    </action>

-    <action issue="POOL-216" dev="markt" type="update" >

-      GenericKeyedObjectPool.ensureMinIdle(K) does not need to check getMinIdlePerKey().

-    </action>

-    <action issue="POOL-215" dev="markt" type="fix" >

-      GenericKeyedObjectPool - multiple mutable fields not published safely.

-    </action>

-    <action issue="POOL-214" dev="markt" type="fix" >

-      GenericObjectPool.evictionPolicy not thread-safe

-    </action>

-    <action issue="POOL-212" dev="markt" type="fix" >

-      GenericObjectPool allows maxIdle &lt; minIdle

-    </action>

-    <action issue="POOL-207" dev="markt" type="fix" >

-      GenericKeyedObjectPool.clear() has unnecessary null check of objectDequeue

-    </action>

-    <action issue="POOL-201" dev="markt" type="fix" >

-      Classes Generic[Keyed]ObjectPoolConfig are generic - but why? 

-    </action>

-    <action issue="POOL-200" dev="markt" type="fix" >

-      GOP/GKOP don't consistently use getters to access fields

-    </action>

-    <action issue="POOL-199" dev="markt" type="fix" >

-      GOP/GKOP evict() method is not synchronised and is not thread-safe

-    </action>

-    <action issue="POOL-197" dev="markt" type="fix" >

-      PooledObject: risky init of lastBorrowTime &amp; lastReturnTime

-    </action>

-    <action issue="POOL-196" dev="markt" type="fix" >

-      PooledObject.getActiveTimeMillis() does not synch. access to lastReturnTime and lastBorrowTime

-    </action>

-    <action issue="POOL-194" dev="simonetripodi" type="update" date="2011-12-12">

-      Replace synchronized blocks in PoolUtils with Read/Write locks.

-    </action>

-    <action issue="POOL-83" dev="simonetripodi" type="update" date="2011-04-28">

-      Support Java 1.5 Generics.

-    </action>

-    <action issue="POOL-186" dev="simonetripodi" type="update" date="2011-04-28">

-      Developer documentation and examples have to be updated once the 2.0 repackaging has been done

-    </action>

-    <action dev="markt" type="update">

-      Switch GOP to use a pooling mechanism based on java.util.concurrent and a

-      LinkedBlockingQueue implementation from Apache Harmony (originally by Doug

-      Lea and the JSR-166 expert group).

-    </action>

-    <action dev="markt" type="update">

-      Make deprecated protected attributes private, requiring that access is via

-      the appropriate getters. 

-    </action>

-    <action dev="markt" type="update">

-      Code clean-up. Add missing @Override annotations, remove unused code,

-      remove deprecated code and unnecessary code.

-    </action>

-    <action dev="markt" type="update">

-      Introduce an Enum (WhenExhaustedAction) to control pool behaviour when no

-      more objects are available to allocate.

-    </action>

-    <action dev="markt" type="update">

-      Remove WhenExhuastedAction.GROW since it is equivalent to

-      WhenExhuastedAction.FAIL with a maxActive value of Integer.MAX_VALUE. 

-    </action>

-    <action issue="POOL-188" dev="markt" type="fix" due-to="sebb">

-      Remove confusing method PoolUtils.ErodingKeyedObjectPool.numIdle(K key).

-    </action>

-    <action issue="POOL-155" dev="markt" type="update">

-      Guard against multiple returns of the same object to the pool and ensure

-      that only objects borrowed from the pool are returned to it.

-    </action>

-    <action issue="POOL-150" dev="markt" type="fix">

-      Ensure GKOP.preparePool() throws an exception if no factory has been

-      defined.

-    </action>

-    <action issue="POOL-134" dev="markt" type="fix">

-      Add the ability to specify a per call wait time when borrowing an object.

-    </action>

-    <action issue="POOL-121" dev="markt" type="fix">

-      Provide a name for the eviction timer thread.

-    </action>

-    <action dev="markt" type="update">

-      Remove setFactory() method from GOP.

-    </action>

-    <action issue="POOL-173" dev="markt" type="fix">

-      Reduce duplication in configuration code.

-    </action>

-    <action issue="POOL-178" dev="markt" type="fix">

-      Re-factor common code into common base classes.

-    </action>

-    <action issue="POOL-172" dev="markt" type="update">

-      Expose GOP and GKOP attributes via JMX.

-    </action>

-    <action issue="POOL-98" dev="markt" type="update">

-      Add additional attributes (also accessible via JMX) for monitoring.

-    </action>

-    <action dev="markt" type="update">

-      Change meaning of zero for maxWait to a maximum wait of zero milliseconds

-      rather than the unexpected infinite wait.

-    </action>

-    <action issue="POOL-100" dev="markt" type="fix">

-      Allow custom eviction policies to be defined.

-    </action>

-    <action issue="POOL-211" dev="markt" type="add" due-to="Brad Koehn">

-      Add support for proxy wrappers for ObjectPool and KeyedObjectPool. The

-      primary advantage of using these wrappers is that use of pooled objects

-      is prevented after they have been returned to the pool.  

-    </action>

-  </release>

-  <release version="1.6" date="2012-01-07" description="Adds generics and requires Java 5.">

-    <action dev="ggregory" type="add" issue="POOL-208">

-      Support Java 1.5 Generics in version 1.x.

-    </action>

-  </release>

-  <release version="1.5.7" date="2011-12-20" description="This is a patch release, including bugfixes only.">

-    <action dev="psteitz" type="fix" issue="POOL-189" due-to="Bill Speirs">

-      Awaken threads waiting on borrowObject when a pool has been closed and have them throw

-      IllegalStateException.  Prior to the fix for this issue, threads waiting in borrowObject when

-      close was invoked on GOP or GKOP would block indefinitely.

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-192" due-to="Helge Dannenberg">

-      Corrected total internal processing counter update in destroy.  Prior to the fix

-      for this issue, clear(key) was leaking capacity associated with elements in the

-      pool being cleared.

-    </action>

-  </release>

-  <release version="1.5.6" date="2011-04-03" description="This is a patch release, including bugfixes only.">

-    <action dev="markt" type="fix" issue="POOL-179" due-to="Axel Grossmann">

-      Correctly handle an InterruptedException when waiting for an object from

-      the pool.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-180">

-      Only stop tracking objects for a key when there are no idle objects, no

-      active objects and no objects being processed.

-    </action>

-    <action dev="markt" type="update" issue="POOL-181">

-      Make BaseObjectPool.isClosed() public.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-184" due-to="Adrian Nistor">

-      Correct bug that could lead to inappropriate pool starvation when evict()

-      and borrowObject() are called concurrently.

-    </action>

-    <action dev="markt" type="fix" due-to="psteitz">

-      Fix performance issues when object destruction has latency.

-    </action>

-  </release>

-  <release version="1.5.5" date="2010-09-10" description=

-     "This is a patch release, including bugfixes, documentation improvements and some deprecations

-      in preparation for pool 2.0.">

-    <action dev="psteitz" type="update" issue="POOL-169">

-      In preparation for pool 2.0, deprecated direct access to protected fields

-      and setFactory methods.  In pool 2.0, pool object factories will be immutable.

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-158">

-      Made GenericKeyedObjectPool._minIdle volatile.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-161">

-      Made the default context class loader for the eviction thread the same loader that loads

-      the library to prevent memory leaks in multiple class loader environments.

-    </action>

-    <action dev="sebb" type="update" issue="POOL-166">

-      GenericKeyedObjectPool.destroy could use entrySet() rather than keySet() followed by get()

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-157" due-to="David Hu">

-      GenericObjectPool and GenericKeyedObjectPool setFactory methods destroy idle instances

-      in the pool by contract. Prior to the fix for this issue, newly set factories were being

-      used to destroy idle instances, rather than the factories used to create them.  The 

-      setFactory methods have also been deprecated, to be removed in version 2.0.

-    </action>

-    <action dev="sebb" type="update" issue="POOL-156">

-      ObjectPool classes can ignore Throwable. Added consistent handling for Throwables

-      that are normally swallowed including always re-throwing certain Throwables (e.g. ThreadDeath).

-    </action>

-    <action dev="markt" type="fix" issue="POOL-162">

-      When waiting threads are interrupted, GOP, GKOP may leak capacity.

-    </action>

-    <action dev="psteitz" type="fix" issue="POOL-154" due-to="Glen Mazza">

-      Documentation for the close method in GenericObjectPool and GenericKeyedObjectPool

-      incorrectly states that this method does not clear the pool.

-    </action>

-  </release>

-  <release version="1.5.4" date="2009-11-20" description=

- "This is a patch release containing a fix for POOL-152, a regression

-introduced in version 1.5.">

-    <action dev="markt" type="fix" issue="POOL-152" due-to="Bushov Alexander">

-      GenericObjectPool can block forever in borrowObject when the pool is exhausted and a newly created

-      object fails validation. When borrowing an object if a new object is created but validate fails,

-      the latch should not be returned to the queue as an exception will be thrown.

-    </action>

-  </release>

-  <release version="1.5.3" date="2009-09-21" description=

-"This is a patch release containing a fix for POOL-149, a regression

-introduced in version 1.5.">

-    <action dev="markt" type="fix" issue="POOL-149" due-to="Shuyang Zhou">

-      Fix case where a thread could end up waiting indefinitely even if objects

-      were available. Also fixes a couple of leaks in the internal processing

-      object count that could lead to pool exhaustion.

-    </action>

-  </release>

-  <release version="1.5.2" date="2009-07-12" description=

-"This is a patch release containing fixes for POOL-146 and POOL-147, regressions

-introduced in version 1.5.">

-    <action dev="markt" type="fix" issue="POOL-146">

-      Handle the case where one key has reached maxActive but other keys have not.

-      Prior to the fix for this issue, threads waiting on objects from keyed pools

-      still having instances available could be blocked by a thread requesting an

-      instance from an exhausted pool.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-147" due-to="Giambattista Bloisi">

-      Fix case where a thread could end up waiting indefinitely even if objects

-      were available.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-145">

-      Ensure that the GenericKeyedObjectPool idle object evictor does not visit the

-      same instance more than once per eviction run.

-    </action>

-  </release>

-  <release version="1.5.1" date="2009-06-16" description=

-"This is a patch release containing a fix for POOL-144, a regression introduced

-in version 1.5.">

-    <action dev="markt" type="fix" issue="POOL-144">

-      When exhausted action is set to WHEN_EXHAUSTED_BLOCK, maxwait is positive and

-      client threads time out waiting for idle objects, capacity can be "leaked"

-      from GenericObjectPools and GeneritCkeyedObjectPools. 

-    </action>

-  </release>

-  <release version="1.5" date="2009-06-10" description=

-"This is a maintenance release including several important bug fixes. This release

-is source and binary compatible with versions 1.3 and 1.4 of commons pool. In addition

-to resolving some important concurrency-related bugs (POOL-135, POOL-125, POOL-29

-POOL-107) this release implements a fairness algorithm to ensure that threads waiting

-for available object instances from GenericObjectPools and GenericKeyedObjectPools are served

-in request arrival order.">

-    <action dev="markt" type="fix" issue="POOL-139" due-to="Sebastian Bazley">

-      StackKeyedObjectPool.getNumActive() needs to be synchronized.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-137" due-to="Sebastian Bazley">

-      Inconsistent synchronization in GenericObjectPool; constant fields should be final.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-75" due-to="Takayuki Kaneko and Gordon Mohr">

-       GenericObjectPool not FIFO with respect to borrowing threads.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-135">

-      _numActive > _maxActive under load

-    </action>

-    <action dev="markt" type="fix" issue="POOL-125">

-      Insufficient control over concurrent access to pooled objects by Evictor, client threads.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-107">

-      Number of connections created has crossed more than maxActive.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-122">

-      java.util.Timer in EvictionTimer does not recover from OutOfMemoryError in Evictor.

-    </action>

-    <action dev="markt" type="fix" issue="POOL-133">

-      Failed object creation may result in invalid active count in GKOP.

-    </action>

-  </release>

-  <release version="1.4" date="2008-01-15" description=

-"This is a maintenance release including numerous bug fixes. This release

-is source and binary compatible with version 1.3 of commons pool, but

-there are some behavior changes introduced to resolve bugs, remove ambiguity

-or improve robustness. Among these are the change in default behavior of

-GenericObjectPool and GenericKeyedObjectPool from FIFO back to LIFO queues

-(as in 1.2 and earlier). The LIFO/FIFO behavior is now configurable. Some of

-the extra synchronization included in version 1.3 was removed / refactored to

-improve performance. The javadoc has also been made more complete and explicit.

-See the detailed list of changes below for specifics on fixed bugs and behavior

-changes in Commons Pool 1.4. This version of Commons Pool depends only on

-JDK version 1.3 or higher. Classes implementing pools are all intended to be

-threadsafe.">

-      <action dev="sandymac" type="fix">

-        Fixed constructor which was ignoring maxTotal parameter: 

-          GenericKeyedObjectPool(KeyedPoolableObjectFactory factory, int maxActive, byte whenExhaustedAction,

-          long maxWait, int maxIdle, int maxTotal, boolean testOnBorrow, boolean testOnReturn,

-          long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis,

-          boolean testWhileIdle)

-      </action>

-      <action dev="sandymac" type="fix">

-        Changed StackKeyedObjectPool to discard stalest, not freshest, idle object when maxSleeping is reached.

-      </action>

-      <action dev="psteitz" type="fix" issue="POOL-102" due-to="John Sumsion">

-        Allowed blocked threads in GenericObjectPool borrowObject to be interrupted.

-      </action>

-      <action dev="psteitz" type="fix" issue="POOL-86">

-        Fixes to address idle object eviction and LIFO/FIFO behavior reported

-        in POOL-86. Made LIFO/FIFO behavior configurable for GenericObjectPool and

-        GenericKeyedObjectPool, with default set back to LIFO (reverting to 1.2 behavior).

-        Fixed GOP, GKOP evict method and added tests to ensure objects are visited in

-        oldest-to-youngest order. Changed backing store for GOP, GKOP pools back to Commons

-        Collections CursorableLinkedList (brought this class in, repackaged with package scope).

-      </action>

-      <action dev="psteitz" type="fix" issue="POOL-110" due-to="Alexander Pogrebnyak">

-        Changed the default setting for Config.softMinEvictableIdleTimeMillis to

-        GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS (was

-        being incorrectly defaulted to DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS).

-      </action>

-      <action dev="psteitz" type="fix" issue="POOL-97" due-to="Mark Thomas">

-         Added a wrapper for the shared idle object eviction timer for all

-         pools. The wrapper class wraps the Timer and keeps track of how many

-         pools are using it. If no pools are using the timer, it is canceled.

-         This prevents a thread being left running which, in application server

-         environments, can lead to memory leaks and/or prevent applications

-         from shutting down or reloading cleanly.

-      </action>

-      <action dev="psteitz" type="fix" issue="POOL-93"  

-      due-to="Mark Thomas">

-        Reduced synchronization in GenericObjectPool, GenericKeyedObjectPool.

-        Factory method activations within synchronized blocks were causing

-        performance problems in DBCP and other applications where factory

-        methods could block. Fixes both POOL-93 and POOL-108.

-      </action>

-      <action dev="psteitz" type="fix" issue="POOL-113">

-        Made _testOnBorrow, _testOnReturn volatile and removed synchronization

-        in associated getters and setters in GenericObjectPool,

-        GenericKeyedObjectPool. Made getNumIdle synchronized in

-        StackKeyedObjectPool. 

-      </action>

-      <action dev="psteitz" type="fix" issue="POOL-116">

-        Fixed an error in the GenericKeyedObjectPool constructor that takes

-        a Config instance as a parameter. The minIdle setting in the Config

-        was being ignored by the constructor.

-      </action>

-      <action def="psteitz" type="fix" issue="POOL-117">

-        Made behavior on instance validation failure consistent across pools,

-        eliminating possible infinite loops in StackObjectPool,

-        StackKeyedObjectPool, SoftReferenceObjectPool when factory fails to

-        create valid objects. 

-      </action>

-      <action dev="sandymac" type="update">

-        When no factory has been defined, addObject now throws 

-        IllegalStateExecption instead of NullPointerException for all pools.

-      </action>

-      <action dev="sandymac" type="update">

-        SoftReferenceObjectPool. Improved the accuracy of getNumIdle by

-        "pruning" references to objects that have been garbage collected.

-      </action>

-      <action dev="sandymac" type="update">

-        GenericObjectPool, GenericKeyedObjectPool, SoftReferenceObjectPool,

-        StackObjectPool. Eliminated IllegalStateExceptions when the following

-        operations are attempted on a closed pool: getNumActive, getNumIdle, 

-        returnObject, invalidateObject.  In each case, the operation is allowed

-        to proceed, reporting the state of the pool that is being shut down, or

-        destroying objects returning to the closed pool.

-      </action>

-      <action dev="sandymac" type="update">

-        StackObjectPool, SoftReferenceObjectPool, GenericKeyedObjectPool. Allowed

-        borrowObject to continue (either examining additional idle instances or

-        with makeObject) when an exception is encountered activating an idle

-        object instead of propagating the exception to the client.  Also made

-        addObject propagate (not swallow) exceptions when passivating newly

-        created instances. 

-      </action>

-      <action dev="psteitz" type="update">

-        StackKeyedObjectPool. Added validation check for objects returned

-        from borrowObject. 

-      </action>

-      <action dev="sandymac" type="update">

-        BaseObjectPool, BaseKeyedObjectPool. Instead of throwing 

-        UnsupportedOperationException, the base class implementations

-        of getNumIdle and getNumActive return negative values. The

-        base implementation of close in BaseObjectPool no longer throws

-        IllegalStateException when invoked on an already closed pool.

-      </action>

-      

-    </release>

-

-    <release version="1.3" date="2006-04-06" description="1.x bugfix release">

-      <action type="fix">A large number of bug fixes. See release notes for changes.</action>

-    </release>

-

-    <release version="1.2" date="2004-06-07" description="bugfixes">

-      <action dev="dirkv" type="fix">

-           GenericKeyedObjectPoolFactory Config Constructor is incorrect

-      </action>

-      <action dev="dirkv" type="fix">

-        Not possible to extend GenericObjectPool.returnObject() without affecting addObject()

-      </action>

-    </release>

-

-    <release version="1.1" date="2003-10-20" description="bugfixes">

-      <action type="fix">A lot of corner cases were fixed</action>

-      <action type="fix">Performance improvement by optimizing pool synchronization, the critical code paths were optimized by reducing pool synchronization but we also added more synchronization where needed</action>

-      <action type="fix">New minIdle feature: the minimum number of objects allowed in the pool before the evictor thread (if active) spawns new objects. (Note no objects are created when: numActive + numIdle >= maxActive)</action>

-      <action type="fix">New maxTotal feature: a cap on the total number of instances controlled by a pool. Only for GenericKeyedObjectPool where maxActive is a cap on the number of active instances from the pool (per key).</action>

-      <action type="fix">UML Class and sequence diagrams</action>

-      <action type="fix">See bugzilla for more changes</action>

-    </release>

-

-    <release version="1.0.1" date="2002-08-12">

-      <action type="fix">No change log available.</action>

-    </release>

-

-    <release version="1.0" date="2002-05-04">

-      <action type="add">No change log available.</action>

-    </release>

-  </body>

-</document>

+<?xml version="1.0"?>
+<!--
+     Licensed to the Apache Software Foundation (ASF) under one or more
+     contributor license agreements.  See the NOTICE file distributed with
+     this work for additional information regarding copyright ownership.
+     The ASF licenses this file to You under the Apache License, Version 2.0
+     (the "License"); you may not use this file except in compliance with
+     the License.  You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+  -->
+
+<!--
+This file is also used by the maven-changes-plugin to generate the release notes.
+Useful ways of finding items to add to this file are:
+
+1.  Add items when you fix a bug or add a feature (this makes the 
+release process easy :-).
+
+2.  Do a JIRA search for tickets closed since the previous release.
+
+3.  Use the report generated by the maven-changelog-plugin to see all
+SVN commits. TBA how to use this with SVN.
+
+To generate the release notes from this file:
+
+mvn changes:announcement-generate -Prelease-notes [-Dchanges.version=nnn]
+
+then tweak the formatting if necessary 
+and commit
+
+The <action> type attribute can be add,update,fix,remove.
+-->
+
+<document>
+  <properties>
+    <title>Apache Commons Pool Changes</title>
+  </properties>
+  <body>
+  <release version="2.5.0" date="2017-12-16" description="This is a minor release, updating to Java 7.">
+    <action dev="ggregory" issue="POOL-331" type="update">
+      Update from Java 6 to 7.
+    </action>
+    <action dev="ggregory" issue="POOL-330" type="delete">
+      Drop Ant build.
+    </action>
+    <action dev="ggregory" issue="POOL-332" type="add">
+      ObjectPool and KeyedObject pool should extend Closeable.
+    </action>
+    <action dev="ggregory" issue="POOL-333" type="update">
+      Update optional dependency asm-util from 5.2 to 6.0.
+    </action>
+    <action dev="ggregory" issue="POOL-334" type="update">
+      org.apache.commons.pool2.impl.ThrowableCallStack.Snapshot is missing serialVersionUID.
+    </action>
+    <action dev="mattsicker" issue="POOL-335" type="add">
+      Make abandoned logging stack trace requirements configurable. This also reverts
+      the default behavior introduced by POOL-320.
+    </action>
+  </release>
+  <release version="2.4.3" date="2017-10-24" description="This is a patch release, including bug fixes only.">
+    <action dev="ggregory" issue="POOL-328" type="fix" due-to="Lorenzo Solano Martinez">
+      Documentation with repeated words (sources, tests, and examples).
+    </action>
+    <action dev="ggregory" issue="POOL-317" type="fix" due-to="KeiichiFujino">
+      Correction of default value of softMinEvictableIdleTimeMillis in BaseObjectPoolConfig.
+    </action>
+    <action dev="ggregory" issue="POOL-309" type="fix" due-to="jolestar, Roopam Patekar">
+      Fix misspellings from "destory" to "destroy".
+    </action>
+    <action dev="markt" issue="POOL-306" type="fix" due-to="Adrian Crum">
+      Ensure BaseGenericObjectPool.IdentityWrapper#equals() follows the expected
+      contract for equals(). 
+    </action>
+    <action dev="markt" issue="POOL-303" type="fix">
+      Ensure that threads do not block indefinitely if more than maxTotal
+      threads try to borrow an object at the same time and the factory fails to
+      create any objects. 
+    </action>
+    <action dev="markt" issue="POOL-280" type="update" due-to="Jacopo Cappellato">
+      Small refactoring of borrowObject() to reduce code duplication.
+    </action>
+    <action dev="markt" issue="POOL-307" type="update" due-to="Anthony Whitford">
+      Replace inefficient use of keySet with entrySet in GKOP.
+    </action>
+    <action dev="markt" issue="POOL-310" type="fix" due-to="Ivan Iliev">
+      Ensure that threads using GKOP do not block indefinitely if more than
+      maxTotal threads try to borrow objects with different keys at the same
+      time and the factory destroys objects on return. 
+    </action>
+    <action dev="markt" type="fix">
+      Ensure that any class name used for evictionPolicyClassName represents a
+      class that implements EvictionPolicy.
+    </action>
+    <action dev="markt" issue="POOL-315" type="fix" due-to="KeiichiFujino">
+      Add a configurable delay (default 10 seconds) to wait when shutting down
+      an Evictor to allow the associated thread time to complete and current
+      evictions and to terminate.
+    </action>
+    <action dev="markt" type="fix">
+      Ensure that a call to GKOP preparePool() takes account of other threads
+      that might create objects concurrently, particularly the Evictor.
+    </action>
+    <action dev="mattsicker" issue="POOL-320" type="add">
+      Use more efficient stack walking mechanisms for usage tracking when possible.
+    </action>
+    <action dev="ggregory" issue="POOL-322" type="update">
+      Update optional cglib library from 3.1 to 3.2.5.
+    </action>
+    <action dev="ggregory" issue="POOL-323" type="update">
+      Update optional OW2 ASM from 5.0.4 to 5.2.
+    </action>
+  </release>
+  <release version="2.4.2" date="2015-08-01" description=
+ "This is a patch release, including bug fixes only.">
+    <action dev="psteitz" issue="POOL-298" type="fix">
+      Changed default jmxNameBase in BaseObjectPoolConfig to the correct (null)
+      default.
+    </action>
+    <action dev="psteitz" issue="POOL-300" type="fix">
+      Added PrintWriter flush to DefaultPooledObject's printStackTrace method.
+    </action>
+  </release>
+  <release version="2.4.1" date="2015-05-30" description=
+ "This is a patch release, replacing a defective binary jar in version 2.4. Other
+than the build configuration, the source distribution for version 2.4.1 is identical
+to version 2.4.">
+    <action dev="psteitz" issue="POOL-297" type="fix">
+      Reverted cobertura plugin update that caused binary jar corruption.
+    </action>
+  </release>
+  <release version="2.4" date="2015-05-27" description=
+ "This is a maintenance release that includes bug fixes and minor enhancements.">
+    <action dev="psteitz" type="fix" issue="POOL-287" due-to="Caleb Spare and Thomas Neidhart">
+      Fixed capacity leak when an object is offered from a GenericKeyedObjectPool while it is
+      being validated by the evictor. 
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-283">
+      Eliminated the requirement that objects managed by GenericObjectPool or
+      GenericKeyedObjectPool be discernible by equals.  Prior to this fix,
+      equal but distinct object instances could not be stored in the same pool.
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-284">
+      Eliminated the requirement that object equality and hashcodes do not change
+      while objects are under management by GenericObjectPool or GenericKeyedObjectPool.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-289" due-to="Luke Winkenbach">
+      Fixed class loading for custom EvictionPolicy implementations that may not
+      be present in the class loader hierarchy of the Pool classes by falling
+      back to the class loader of the current class.
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-285">
+      Ensured that when an instance that has already been returned to a pool is
+      returned again, the expected IllegalStateException is generated before the
+      returning object is re-validated or re-passivated.
+    </action>
+    <action dev="psteitz" type="add" issue="POOL-286">
+      Added preparePool method to GenericObjectPool.
+    </action>
+    <action dev="ggregory" type="update" issue="POOL-296">
+      Update asm-util from 5.0.3 to 5.0.4.
+    </action>
+    <action dev="psteitz" type="update" issue="POOL-293">
+      Exposed getEvictionPolicy as protected in BaseGenericObjectPool.
+    </action>
+  </release>
+  <release version="2.3" date="2014-12-30" description=
+"This is a maintenance release that includes bug fixes and minor enhancements.">  
+    <action dev="psteitz" type="fix" issue="POOL-279" due-to="Jacopo Cappellato">
+      Eliminated possibility that DefaultPoolObject#getIdleTimeMillis() could
+      return a negative value. Use by pool implementations would not hit this
+      bug. 
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-275">
+      Made wrapped BaseProxyHandler.pooledObject volatile.
+    </action>
+    <action dev="ecki" type="fix" issue="POOL-277" due-to="Lucas Pouzac">
+      Replace synchronisation with lock-free maxBorrowWaitTimeMillis to
+      increase scalability.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-276">
+      Ensure that objects are not validated on borrow when testOnBorrow is set
+      to false, testOnCreate is set to true and the pool is exhausted at the
+      point borrowObject() is called.
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-270" due-to="Michael Berman">
+      Fixed error in GenericKeyedObjectPool constructor causing minEvictableIdleTimeMillis
+      to be used in place of timeBetweenEvictionRunsMillis in eviction timer setup
+      when a GenericKeyedObjectPoolConfig instance is supplied to the constructor.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-263">
+      Fix a threading issue that meant that concurrent calls to close() and
+      returnObject() could result in some returned objects not being destroyed.
+    </action>
+    <action dev="psteitz" type="add" issue="POOL-262">
+      Made fairness configurable for GenericObjectPool, GenericKeyedObjectPool.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-261">
+      Correctly mark cglib as an optional dependency and ensure that the OSGi
+      manifest information reflects that.
+    </action>
+    <action dev="markt" type="fix">
+      Improve performance of statistics collection for pools that extend
+      BaseGenericObjectPool.
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-259">
+      Made client wait time statistics accurate when pools are configured to
+      block indefinitely.  Also modified computation to include latency clients
+      experience due to waiting on factory methods.
+    </action>
+    <action dev="ggregory" type="update" issue="POOL-273">
+      Update cglib to 3.1 from 3.0.
+    </action>
+    <action dev="ggregory" type="update" issue="POOL-274">
+      Update asm-util to 5.0.3 from 4.0.
+    </action>
+    <action dev="markt" type="fix">
+      Prevent potential memory leaks when the Pool is dereferenced without being
+      closed.
+    </action>
+    <action dev="markt" type="fix">
+      Prevent potential memory leaks with using an Evictor in a container
+      environment.
+    </action>
+    <action dev="markt" type="fix">
+      Protect against a user provided eviction policy throwing an exception and
+      stopping the Evictor thread.
+    </action>
+    <action dev="markt" type="fix">
+      Use the thread context class loader to load custom eviction policies. This
+      allows application provided eviction policies to be used in a container
+      environment when the pooling implementation is provided by the container.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-281">
+      Fix a potential infinite loop in the underlying Deque implementation.
+    </action>
+  </release>
+  <release version="2.2" date="2014-02-24" description=
+"This is a maintenance release that adds a new testOnCreate configuration option
+and fixes a small number of bugs.">
+    <action issue="POOL-248" dev="markt" type="fix" due-to="Warren Chen">
+      Ensure that if an attempt is made to return an object multiple times that
+      the current active and idle object counts are not corrupted.
+    </action>
+    <action issue="POOL-249" dev="markt" type="fix" due-to="Ville Skyttä">
+      Fix Javadoc issues when building docs with Java 8.
+    </action>
+    <action dev="markt" type="fix">
+      Fix the remaining Javadoc warnings.
+    </action>
+    <action dev="markt" type="add">
+      Add a new validation configuration option testOnCreate that tests an
+      object immediately after it is created.
+    </action>
+  </release>
+   <release version="2.1" date="2013-12-30" description=
+"This is a maintenance release that includes a small number of new features as well as 
+including bugfixes and test case improvements.">
+    <action issue="POOL-243" dev="psteitz" type="fix" due-to="Michal Sabo">
+      Added missing create counter decrement in GenericKeyedObjectPool create method on factory
+      exception path. Prior to this fix, exceptions thrown by factory makeObject calls could leak
+      per key capacity.
+    </action>
+    <action issue="POOL-240" dev="psteitz" type="fix" due-to="Dan McNulty">
+      Ensured that blocked threads waiting on a depleted pool get served when
+      objects are destroyed due to validation or passivation failures in
+      returnObject or when a checked out instance is invalidated.
+    </action>
+    <action issue="POOL-241" dev="markt" type="add" due-to="Bruno P. Kinoshita">
+      Expand the coverage of the unit tests.
+    </action>
+    <action dev="markt" type="add">
+      Provide more control over the names under which Pools are registered in
+      JMX so components using the pools can register the pools they use under a
+      related name.
+    </action>
+    <action dev="markt" type="add">
+      Include the number of times an object has been borrowed from the Pool when
+      the DefaultPooledObject wrapper is used and expose this property via JMX.
+    </action>
+    <action issue="POOL-245" dev="markt" type="fix" due-to="Bruno P. Kinoshita">
+      Remove a duplicate null check and fix some typos in PoolUtils.
+    </action>
+    <action issue="POOL-246" dev="markt" type="fix" due-to="Bruno P. Kinoshita">
+      Make the toString() method of ErodingKeyedObjectPool consistent with the
+      other pools.
+    </action>
+    <action issue="POOL-245" dev="markt" type="add" due-to="Bruno P. Kinoshita">
+      Further expansion of the coverage of the unit tests.
+    </action>
+  </release>
+  <release version="2.0" date="2013-11-11" description=
+"This is a major new release that provides significant performance improvements
+in high concurrency environments. Pools now provide a mechanism for tracking
+objects that have been borrowed from the pool but not returned. There have been
+numerous API changes to support these and other new features as well as to
+clarify behaviour and improve consistency across the API. This release requires
+JDK level 1.6 or above.">
+    <action issue="POOL-211" dev="markt" type="add" due-to="Brad Koehn">
+      Add support for proxy wrappers to ObjectPool and KeyedObjectPool. The
+      primary advantage of these wrappers is that use of pooled objects is
+      prevented after they have been returned to the pool.
+    </action>
+    <action issue="POOL-229" dev="psteitz" type="update">
+      Added abandoned object removal (moved from DBCP) to GenericObjectPool.
+    </action>
+    <action issue="POOL-221" dev="markt" type="fix" >
+      PooledObject.state does not need to be volatile
+    </action>
+    <action issue="POOL-220" dev="markt" type="fix">
+      Suppress a FindBugs warning
+    </action>
+    <action issue="POOL-217" dev="markt" type="update"  due-to="sebb">
+      Use an IODH for PoolUtils.MIN_IDLE_TIMER
+    </action>
+    <action issue="POOL-216" dev="markt" type="update" >
+      GenericKeyedObjectPool.ensureMinIdle(K) does not need to check getMinIdlePerKey().
+    </action>
+    <action issue="POOL-215" dev="markt" type="fix" >
+      GenericKeyedObjectPool - multiple mutable fields not published safely.
+    </action>
+    <action issue="POOL-214" dev="markt" type="fix" >
+      GenericObjectPool.evictionPolicy not thread-safe
+    </action>
+    <action issue="POOL-212" dev="markt" type="fix" >
+      GenericObjectPool allows maxIdle &lt; minIdle
+    </action>
+    <action issue="POOL-207" dev="markt" type="fix" >
+      GenericKeyedObjectPool.clear() has unnecessary null check of objectDequeue
+    </action>
+    <action issue="POOL-201" dev="markt" type="fix" >
+      Classes Generic[Keyed]ObjectPoolConfig are generic - but why? 
+    </action>
+    <action issue="POOL-200" dev="markt" type="fix" >
+      GOP/GKOP don't consistently use getters to access fields
+    </action>
+    <action issue="POOL-199" dev="markt" type="fix" >
+      GOP/GKOP evict() method is not synchronised and is not thread-safe
+    </action>
+    <action issue="POOL-197" dev="markt" type="fix" >
+      PooledObject: risky init of lastBorrowTime &amp; lastReturnTime
+    </action>
+    <action issue="POOL-196" dev="markt" type="fix" >
+      PooledObject.getActiveTimeMillis() does not synch. access to lastReturnTime and lastBorrowTime
+    </action>
+    <action issue="POOL-194" dev="simonetripodi" type="update" date="2011-12-12">
+      Replace synchronized blocks in PoolUtils with Read/Write locks.
+    </action>
+    <action issue="POOL-83" dev="simonetripodi" type="update" date="2011-04-28">
+      Support Java 1.5 Generics.
+    </action>
+    <action issue="POOL-186" dev="simonetripodi" type="update" date="2011-04-28">
+      Developer documentation and examples have to be updated once the 2.0 repackaging has been done
+    </action>
+    <action dev="markt" type="update">
+      Switch GOP to use a pooling mechanism based on java.util.concurrent and a
+      LinkedBlockingQueue implementation from Apache Harmony (originally by Doug
+      Lea and the JSR-166 expert group).
+    </action>
+    <action dev="markt" type="update">
+      Make deprecated protected attributes private, requiring that access is via
+      the appropriate getters. 
+    </action>
+    <action dev="markt" type="update">
+      Code clean-up. Add missing @Override annotations, remove unused code,
+      remove deprecated code and unnecessary code.
+    </action>
+    <action dev="markt" type="update">
+      Introduce an Enum (WhenExhaustedAction) to control pool behaviour when no
+      more objects are available to allocate.
+    </action>
+    <action dev="markt" type="update">
+      Remove WhenExhuastedAction.GROW since it is equivalent to
+      WhenExhuastedAction.FAIL with a maxActive value of Integer.MAX_VALUE. 
+    </action>
+    <action issue="POOL-188" dev="markt" type="fix" due-to="sebb">
+      Remove confusing method PoolUtils.ErodingKeyedObjectPool.numIdle(K key).
+    </action>
+    <action issue="POOL-155" dev="markt" type="update">
+      Guard against multiple returns of the same object to the pool and ensure
+      that only objects borrowed from the pool are returned to it.
+    </action>
+    <action issue="POOL-150" dev="markt" type="fix">
+      Ensure GKOP.preparePool() throws an exception if no factory has been
+      defined.
+    </action>
+    <action issue="POOL-134" dev="markt" type="fix">
+      Add the ability to specify a per call wait time when borrowing an object.
+    </action>
+    <action issue="POOL-121" dev="markt" type="fix">
+      Provide a name for the eviction timer thread.
+    </action>
+    <action dev="markt" type="update">
+      Remove setFactory() method from GOP.
+    </action>
+    <action issue="POOL-173" dev="markt" type="fix">
+      Reduce duplication in configuration code.
+    </action>
+    <action issue="POOL-178" dev="markt" type="fix">
+      Re-factor common code into common base classes.
+    </action>
+    <action issue="POOL-172" dev="markt" type="update">
+      Expose GOP and GKOP attributes via JMX.
+    </action>
+    <action issue="POOL-98" dev="markt" type="update">
+      Add additional attributes (also accessible via JMX) for monitoring.
+    </action>
+    <action dev="markt" type="update">
+      Change meaning of zero for maxWait to a maximum wait of zero milliseconds
+      rather than the unexpected infinite wait.
+    </action>
+    <action issue="POOL-100" dev="markt" type="fix">
+      Allow custom eviction policies to be defined.
+    </action>
+    <action issue="POOL-211" dev="markt" type="add" due-to="Brad Koehn">
+      Add support for proxy wrappers for ObjectPool and KeyedObjectPool. The
+      primary advantage of using these wrappers is that use of pooled objects
+      is prevented after they have been returned to the pool.  
+    </action>
+  </release>
+  <release version="1.6" date="2012-01-07" description="Adds generics and requires Java 5.">
+    <action dev="ggregory" type="add" issue="POOL-208">
+      Support Java 1.5 Generics in version 1.x.
+    </action>
+  </release>
+  <release version="1.5.7" date="2011-12-20" description="This is a patch release, including bugfixes only.">
+    <action dev="psteitz" type="fix" issue="POOL-189" due-to="Bill Speirs">
+      Awaken threads waiting on borrowObject when a pool has been closed and have them throw
+      IllegalStateException.  Prior to the fix for this issue, threads waiting in borrowObject when
+      close was invoked on GOP or GKOP would block indefinitely.
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-192" due-to="Helge Dannenberg">
+      Corrected total internal processing counter update in destroy.  Prior to the fix
+      for this issue, clear(key) was leaking capacity associated with elements in the
+      pool being cleared.
+    </action>
+  </release>
+  <release version="1.5.6" date="2011-04-03" description="This is a patch release, including bugfixes only.">
+    <action dev="markt" type="fix" issue="POOL-179" due-to="Axel Grossmann">
+      Correctly handle an InterruptedException when waiting for an object from
+      the pool.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-180">
+      Only stop tracking objects for a key when there are no idle objects, no
+      active objects and no objects being processed.
+    </action>
+    <action dev="markt" type="update" issue="POOL-181">
+      Make BaseObjectPool.isClosed() public.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-184" due-to="Adrian Nistor">
+      Correct bug that could lead to inappropriate pool starvation when evict()
+      and borrowObject() are called concurrently.
+    </action>
+    <action dev="markt" type="fix" due-to="psteitz">
+      Fix performance issues when object destruction has latency.
+    </action>
+  </release>
+  <release version="1.5.5" date="2010-09-10" description=
+     "This is a patch release, including bugfixes, documentation improvements and some deprecations
+      in preparation for pool 2.0.">
+    <action dev="psteitz" type="update" issue="POOL-169">
+      In preparation for pool 2.0, deprecated direct access to protected fields
+      and setFactory methods.  In pool 2.0, pool object factories will be immutable.
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-158">
+      Made GenericKeyedObjectPool._minIdle volatile.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-161">
+      Made the default context class loader for the eviction thread the same loader that loads
+      the library to prevent memory leaks in multiple class loader environments.
+    </action>
+    <action dev="sebb" type="update" issue="POOL-166">
+      GenericKeyedObjectPool.destroy could use entrySet() rather than keySet() followed by get()
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-157" due-to="David Hu">
+      GenericObjectPool and GenericKeyedObjectPool setFactory methods destroy idle instances
+      in the pool by contract. Prior to the fix for this issue, newly set factories were being
+      used to destroy idle instances, rather than the factories used to create them.  The 
+      setFactory methods have also been deprecated, to be removed in version 2.0.
+    </action>
+    <action dev="sebb" type="update" issue="POOL-156">
+      ObjectPool classes can ignore Throwable. Added consistent handling for Throwables
+      that are normally swallowed including always re-throwing certain Throwables (e.g. ThreadDeath).
+    </action>
+    <action dev="markt" type="fix" issue="POOL-162">
+      When waiting threads are interrupted, GOP, GKOP may leak capacity.
+    </action>
+    <action dev="psteitz" type="fix" issue="POOL-154" due-to="Glen Mazza">
+      Documentation for the close method in GenericObjectPool and GenericKeyedObjectPool
+      incorrectly states that this method does not clear the pool.
+    </action>
+  </release>
+  <release version="1.5.4" date="2009-11-20" description=
+ "This is a patch release containing a fix for POOL-152, a regression
+introduced in version 1.5.">
+    <action dev="markt" type="fix" issue="POOL-152" due-to="Bushov Alexander">
+      GenericObjectPool can block forever in borrowObject when the pool is exhausted and a newly created
+      object fails validation. When borrowing an object if a new object is created but validate fails,
+      the latch should not be returned to the queue as an exception will be thrown.
+    </action>
+  </release>
+  <release version="1.5.3" date="2009-09-21" description=
+"This is a patch release containing a fix for POOL-149, a regression
+introduced in version 1.5.">
+    <action dev="markt" type="fix" issue="POOL-149" due-to="Shuyang Zhou">
+      Fix case where a thread could end up waiting indefinitely even if objects
+      were available. Also fixes a couple of leaks in the internal processing
+      object count that could lead to pool exhaustion.
+    </action>
+  </release>
+  <release version="1.5.2" date="2009-07-12" description=
+"This is a patch release containing fixes for POOL-146 and POOL-147, regressions
+introduced in version 1.5.">
+    <action dev="markt" type="fix" issue="POOL-146">
+      Handle the case where one key has reached maxActive but other keys have not.
+      Prior to the fix for this issue, threads waiting on objects from keyed pools
+      still having instances available could be blocked by a thread requesting an
+      instance from an exhausted pool.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-147" due-to="Giambattista Bloisi">
+      Fix case where a thread could end up waiting indefinitely even if objects
+      were available.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-145">
+      Ensure that the GenericKeyedObjectPool idle object evictor does not visit the
+      same instance more than once per eviction run.
+    </action>
+  </release>
+  <release version="1.5.1" date="2009-06-16" description=
+"This is a patch release containing a fix for POOL-144, a regression introduced
+in version 1.5.">
+    <action dev="markt" type="fix" issue="POOL-144">
+      When exhausted action is set to WHEN_EXHAUSTED_BLOCK, maxwait is positive and
+      client threads time out waiting for idle objects, capacity can be "leaked"
+      from GenericObjectPools and GeneritCkeyedObjectPools. 
+    </action>
+  </release>
+  <release version="1.5" date="2009-06-10" description=
+"This is a maintenance release including several important bug fixes. This release
+is source and binary compatible with versions 1.3 and 1.4 of commons pool. In addition
+to resolving some important concurrency-related bugs (POOL-135, POOL-125, POOL-29
+POOL-107) this release implements a fairness algorithm to ensure that threads waiting
+for available object instances from GenericObjectPools and GenericKeyedObjectPools are served
+in request arrival order.">
+    <action dev="markt" type="fix" issue="POOL-139" due-to="Sebastian Bazley">
+      StackKeyedObjectPool.getNumActive() needs to be synchronized.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-137" due-to="Sebastian Bazley">
+      Inconsistent synchronization in GenericObjectPool; constant fields should be final.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-75" due-to="Takayuki Kaneko and Gordon Mohr">
+       GenericObjectPool not FIFO with respect to borrowing threads.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-135">
+      _numActive > _maxActive under load
+    </action>
+    <action dev="markt" type="fix" issue="POOL-125">
+      Insufficient control over concurrent access to pooled objects by Evictor, client threads.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-107">
+      Number of connections created has crossed more than maxActive.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-122">
+      java.util.Timer in EvictionTimer does not recover from OutOfMemoryError in Evictor.
+    </action>
+    <action dev="markt" type="fix" issue="POOL-133">
+      Failed object creation may result in invalid active count in GKOP.
+    </action>
+  </release>
+  <release version="1.4" date="2008-01-15" description=
+"This is a maintenance release including numerous bug fixes. This release
+is source and binary compatible with version 1.3 of commons pool, but
+there are some behavior changes introduced to resolve bugs, remove ambiguity
+or improve robustness. Among these are the change in default behavior of
+GenericObjectPool and GenericKeyedObjectPool from FIFO back to LIFO queues
+(as in 1.2 and earlier). The LIFO/FIFO behavior is now configurable. Some of
+the extra synchronization included in version 1.3 was removed / refactored to
+improve performance. The javadoc has also been made more complete and explicit.
+See the detailed list of changes below for specifics on fixed bugs and behavior
+changes in Commons Pool 1.4. This version of Commons Pool depends only on
+JDK version 1.3 or higher. Classes implementing pools are all intended to be
+threadsafe.">
+      <action dev="sandymac" type="fix">
+        Fixed constructor which was ignoring maxTotal parameter: 
+          GenericKeyedObjectPool(KeyedPoolableObjectFactory factory, int maxActive, byte whenExhaustedAction,
+          long maxWait, int maxIdle, int maxTotal, boolean testOnBorrow, boolean testOnReturn,
+          long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis,
+          boolean testWhileIdle)
+      </action>
+      <action dev="sandymac" type="fix">
+        Changed StackKeyedObjectPool to discard stalest, not freshest, idle object when maxSleeping is reached.
+      </action>
+      <action dev="psteitz" type="fix" issue="POOL-102" due-to="John Sumsion">
+        Allowed blocked threads in GenericObjectPool borrowObject to be interrupted.
+      </action>
+      <action dev="psteitz" type="fix" issue="POOL-86">
+        Fixes to address idle object eviction and LIFO/FIFO behavior reported
+        in POOL-86. Made LIFO/FIFO behavior configurable for GenericObjectPool and
+        GenericKeyedObjectPool, with default set back to LIFO (reverting to 1.2 behavior).
+        Fixed GOP, GKOP evict method and added tests to ensure objects are visited in
+        oldest-to-youngest order. Changed backing store for GOP, GKOP pools back to Commons
+        Collections CursorableLinkedList (brought this class in, repackaged with package scope).
+      </action>
+      <action dev="psteitz" type="fix" issue="POOL-110" due-to="Alexander Pogrebnyak">
+        Changed the default setting for Config.softMinEvictableIdleTimeMillis to
+        GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS (was
+        being incorrectly defaulted to DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS).
+      </action>
+      <action dev="psteitz" type="fix" issue="POOL-97" due-to="Mark Thomas">
+         Added a wrapper for the shared idle object eviction timer for all
+         pools. The wrapper class wraps the Timer and keeps track of how many
+         pools are using it. If no pools are using the timer, it is canceled.
+         This prevents a thread being left running which, in application server
+         environments, can lead to memory leaks and/or prevent applications
+         from shutting down or reloading cleanly.
+      </action>
+      <action dev="psteitz" type="fix" issue="POOL-93"  
+      due-to="Mark Thomas">
+        Reduced synchronization in GenericObjectPool, GenericKeyedObjectPool.
+        Factory method activations within synchronized blocks were causing
+        performance problems in DBCP and other applications where factory
+        methods could block. Fixes both POOL-93 and POOL-108.
+      </action>
+      <action dev="psteitz" type="fix" issue="POOL-113">
+        Made _testOnBorrow, _testOnReturn volatile and removed synchronization
+        in associated getters and setters in GenericObjectPool,
+        GenericKeyedObjectPool. Made getNumIdle synchronized in
+        StackKeyedObjectPool. 
+      </action>
+      <action dev="psteitz" type="fix" issue="POOL-116">
+        Fixed an error in the GenericKeyedObjectPool constructor that takes
+        a Config instance as a parameter. The minIdle setting in the Config
+        was being ignored by the constructor.
+      </action>
+      <action def="psteitz" type="fix" issue="POOL-117">
+        Made behavior on instance validation failure consistent across pools,
+        eliminating possible infinite loops in StackObjectPool,
+        StackKeyedObjectPool, SoftReferenceObjectPool when factory fails to
+        create valid objects. 
+      </action>
+      <action dev="sandymac" type="update">
+        When no factory has been defined, addObject now throws 
+        IllegalStateExecption instead of NullPointerException for all pools.
+      </action>
+      <action dev="sandymac" type="update">
+        SoftReferenceObjectPool. Improved the accuracy of getNumIdle by
+        "pruning" references to objects that have been garbage collected.
+      </action>
+      <action dev="sandymac" type="update">
+        GenericObjectPool, GenericKeyedObjectPool, SoftReferenceObjectPool,
+        StackObjectPool. Eliminated IllegalStateExceptions when the following
+        operations are attempted on a closed pool: getNumActive, getNumIdle, 
+        returnObject, invalidateObject.  In each case, the operation is allowed
+        to proceed, reporting the state of the pool that is being shut down, or
+        destroying objects returning to the closed pool.
+      </action>
+      <action dev="sandymac" type="update">
+        StackObjectPool, SoftReferenceObjectPool, GenericKeyedObjectPool. Allowed
+        borrowObject to continue (either examining additional idle instances or
+        with makeObject) when an exception is encountered activating an idle
+        object instead of propagating the exception to the client.  Also made
+        addObject propagate (not swallow) exceptions when passivating newly
+        created instances. 
+      </action>
+      <action dev="psteitz" type="update">
+        StackKeyedObjectPool. Added validation check for objects returned
+        from borrowObject. 
+      </action>
+      <action dev="sandymac" type="update">
+        BaseObjectPool, BaseKeyedObjectPool. Instead of throwing 
+        UnsupportedOperationException, the base class implementations
+        of getNumIdle and getNumActive return negative values. The
+        base implementation of close in BaseObjectPool no longer throws
+        IllegalStateException when invoked on an already closed pool.
+      </action>
+      
+    </release>
+
+    <release version="1.3" date="2006-04-06" description="1.x bugfix release">
+      <action type="fix">A large number of bug fixes. See release notes for changes.</action>
+    </release>
+
+    <release version="1.2" date="2004-06-07" description="bugfixes">
+      <action dev="dirkv" type="fix">
+           GenericKeyedObjectPoolFactory Config Constructor is incorrect
+      </action>
+      <action dev="dirkv" type="fix">
+        Not possible to extend GenericObjectPool.returnObject() without affecting addObject()
+      </action>
+    </release>
+
+    <release version="1.1" date="2003-10-20" description="bugfixes">
+      <action type="fix">A lot of corner cases were fixed</action>
+      <action type="fix">Performance improvement by optimizing pool synchronization, the critical code paths were optimized by reducing pool synchronization but we also added more synchronization where needed</action>
+      <action type="fix">New minIdle feature: the minimum number of objects allowed in the pool before the evictor thread (if active) spawns new objects. (Note no objects are created when: numActive + numIdle >= maxActive)</action>
+      <action type="fix">New maxTotal feature: a cap on the total number of instances controlled by a pool. Only for GenericKeyedObjectPool where maxActive is a cap on the number of active instances from the pool (per key).</action>
+      <action type="fix">UML Class and sequence diagrams</action>
+      <action type="fix">See bugzilla for more changes</action>
+    </release>
+
+    <release version="1.0.1" date="2002-08-12">
+      <action type="fix">No change log available.</action>
+    </release>
+
+    <release version="1.0" date="2002-05-04">
+      <action type="add">No change log available.</action>
+    </release>
+  </body>
+</document>