<?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 Release Notes</title>
  </properties>
  <body>
  <release version="2.10.0" date="2021-05-28" description="This is a MMMM release (Java 8).">
    <!-- ADD -->
    <action dev="ggregory" type="add" due-to="Gary Gregory">
      Add and use java.time.Duration APIs timeouts instead of using ints for seconds.
      See the site and its API comparison report for a list of the new Duration-based APIs.
    </action>
    <action dev="ggregory" type="add" due-to="JSurf, Gary Gregory, Phil Steitz">
      Implement AbandonedConfig for GenericKeyedObjectPool #67.
    </action>
    <!-- FIXES -->
    <action dev="ggregory" type="fix" due-to="Arturo Bernal">
      Simplify Assertions in tests #77.
    </action>
    <action dev="ggregory" type="fix" due-to="Arturo Bernal">
      Replace C-style array declaration with Java style #80.
    </action>
    <action dev="ggregory" type="fix" due-to="Arturo Bernal">
      Use Objects.equals(); Use Anonymous type; Use method reference instead Lambda; Replace Loop with Collection.removeIf(). #81. 
    </action>
    <action dev="ggregory" type="fix" due-to="Arturo Bernal">
      Use diamond operator. #82. 
    </action>
    <action dev="ggregory" type="fix" due-to="Arturo Bernal">
      Code clean ups. #83.
    </action>
    <!-- UPDATE -->
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump spotbugs-maven-plugin from 4.0.4 to 4.2.1 #48, #53, #59, #62.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
      Bump actions/setup-java from v1.4.2 to v2, #47.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump junit from 4.13 to 4.13.1 #50.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump biz.aQute.bndlib from 5.1.2 to 5.3.0, #51, #66.
    </action>
    <action dev="ggregory" type="update" due-to="Arturo Bernal" issue="POOL-389">
      Migrate to JUnit 5 #57.
    </action>
    <action dev="ggregory" type="update" due-to="Arturo Bernal" issue="POOL-389">
      Minor Improvements #58, #60.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump actions/checkout from v2.3.3 to v2.3.4 #54.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump maven-pmd-plugin from 3.13.0 to 3.14.0 #55.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update commons.japicmp.version 0.14.3 -> 0.15.3.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
      Bump actions/cache from v2 to v2.1.6 #65, #75, #84.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump maven-checkstyle-plugin from 3.1.1 to 3.1.2 #61.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump asm-util from 9.0 to 9.1 #64.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump spotbugs from 4.2.1 to 4.2.3 #68, #73, #74.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
      Bump junit-bom from 5.7.1 to 5.8.0-M1 #76.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump maven-bundle-plugin from 5.1.1 to 5.1.2 #70.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Bump animal-sniffer-maven-plugin from 1.19 to 1.20.
    </action>
  </release>
  <release version="2.9.0" date="2020-09-25" description="This is a minor release (Java 8).">
    <action issue="POOL-387" dev="ggregory" type="update" due-to=" Phil Steitz">
      Object factory destroy method should carry information on activation context.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Update spotbugs from 4.0.6 to 4.1.3, #37, #41, #46.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Update actions/checkout from v2.3.1 to v2.3.3 #56, #45.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Update actions/setup-java from v1.4.0 to v1.4.2 #42.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Update optional asm-util from 8.0.1 to 9.0 #44.
    </action>
  </release>
  <release version="2.8.1" date="2020-07-27" description="This is a maintenance release (Java 8).">
    <action dev="ggregory" issue="POOL-386" type="fix" due-to="Phil Steitz, Mark Thomas">
      Refactored EvictionTimer usage tracking to fix POOL-386 and handle abandoned pools. #32.
    </action>
    <action dev="ggregory" type="fix" due-to="Prodigysov, Gary Gregory">
      [Javadoc] Add missing @throws comment in PoolUtils. #27.
    </action>
    <action dev="ggregory" issue="POOL-384" type="update" due-to="Gary Gregory">
      Update optional library org.ow2.asm:asm-util from 7.2 to 8.0.1.
    </action>
    <action dev="ggregory" issue="POOL-385" type="add" due-to="scholzi100">
      Added Automatic-Module-Name to support JPMS #31.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update site reports from org.apache.bcel:bcel 6.4.1 to 6.5.0.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update site reports from maven-pmd-plugin 3.12.0 to 3.13.0.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update build from biz.aQute.bnd:biz.aQute.bndlib 5.1.0 -> 5.1.2.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Update actions/checkout from v1 to v2.3.1 #33.
    </action>
    <action dev="ggregory" type="update" due-to="Dependabot">
      Update commons-parent from 50 to 51 #36.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update Checkstyle plugin from 3.0.0 to 3.1.1.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update JApiCmp from 0.14.1 to 0.14.3.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update animal-sniffer-maven-plugin from 1.16 to 1.19.
    </action>
  </release>
  <release version="2.8.0" date="2019-12-05" description="This is a maintenance release (Java 8).">
    <action dev="ggregory" issue="POOL-374" type="fix" due-to="Gary Gregory, Phil Steitz">
       org.apache.commons.pool2.impl.GenericKeyedObjectPool.returnObject(K, T) should throw IllegalStateException instead of NullPointerException when a key is not found in the pool map.
    </action>
    <action dev="ggregory" issue="POOL-375" type="update" due-to="Gary Gregory">
       Update optional library cglib from 3.2.12 to 3.3.0.
    </action>
    <action dev="psteitz" issue="POOL-376" type="fix" due-to="Sazzadul Hoque, Phil Steitz">
      Fixed regression from original fix for POOL-356 which could result in NPE when destroying objects.
    </action>
    <action dev="psteitz" issue="POOL-326" type="fix" due-to="Phil Steitz">
      Eliminated NPE / ISE exceptions due to keyed pools being prematurely removed.
    </action>
    <action dev="ggregory" type="update" due-to="Gary Gregory">
      Update site build from Apache Commons BCEL 6.3.1 to 6.4.1.
    </action>
    <action dev="ggregory" issue="POOL-377" type="update" due-to="Gary Gregory">
      Update optional library org.ow2.asm:asm-util from 7.1 to 7.2.
    </action>
    <action dev="ggregory" issue="POOL-378" type="add" due-to="Gary Gregory">
      Deprecate PoolUtils.prefill(ObjectPool, int) in favor of ObjectPool.addObjects(int).
    </action>
    <action dev="ggregory" issue="POOL-379" type="add" due-to="Gary Gregory">
      Deprecate PoolUtils.prefill(KeyedObjectPool, K, int) in favor of KeyedObjectPool.addObjects(K, int).
    </action>
    <action dev="ggregory" issue="POOL-380" type="add" due-to="Gary Gregory">
      Deprecate PoolUtils.prefill(KeyedObjectPool, Collection, int) in favor of KeyedObjectPool.addObjects(Collection, int).
    </action>
    <action dev="ggregory" type="fix" due-to="emopers">
      Close BufferedOutputStream in test before calling toString on underlying BufferedOutputStream #26.
    </action>
    <action dev="ggregory" type="fix" due-to="Prodigysov">
      [Javadoc] Add missing @throws comment in SoftReferenceObjectPool. #28.
    </action>
  </release>
  <release version="2.7.0" date="2019-07-25" description="This is a feature release (Java 8).">
    <action dev="ggregory" issue="POOL-364" type="update" due-to="Gary Gregory">
       Update from Java 7 to Java 8.
    </action>
    <action dev="ggregory" issue="POOL-365" type="update" due-to="Gary Gregory">
       Update ASM from 7.0 to 7.1
    </action>
    <action dev="ggregory" issue="POOL-366" type="update" due-to="Gary Gregory">
      Update optional library cglib from 3.2.10 to 3.2.12.
    </action>
    <action dev="ggregory" issue="POOL-367" type="update" due-to="Per Lundberg">
      Fix typo in package private method name stopEvitor() -> stopEvictor() #22.
    </action>
    <action dev="ggregory" issue="POOL-361" type="fix" due-to="Pablo, Phil Steitz, Bruno P. Kinoshita">
      Move validation for newly created objects into create(). Fixes #23.
    </action>
    <action dev="ggregory" type="add" issue="POOL-370" due-to="Mark Thomas, Gary Gregory">
      Add org.apache.commons.pool2.PooledObject#getBorrowedCount().
    </action>
    <action dev="ggregory" type="add" issue="POOL-371" due-to="Matt Sicker, Gary Gregory">
      Add org.apache.commons.pool2.PooledObject#setRequireFullStackTrace(boolean).
    </action>
    <action dev="ggregory" type="fix" issue="POOL-352" due-to=" Volker Kleinschmidt">
      CallStackUtils mishandles security manager check part 1.
    </action>
  </release>
  <release version="2.6.2" date="2019-03-05" description="This is a maintenance release (Java 7).">
    <action dev="ggregory" issue="POOL-362" type="fix">
       Always null out org.apache.commons.pool2.impl.BaseGenericObjectPool.evictionIterator to match org.apache.commons.pool2.impl.BaseGenericObjectPool.evictor.
    </action>
    <action dev="ggregory" issue="POOL-363" type="fix" due-to="Josh Landin">
       Evictor Thread prevents Spring Context shutdown in standalone app.
    </action>
    <action dev="ggregory" issue="POOL-348" type="fix" due-to="Josh Landin">
       The commons-pool-evictor-thread should run as a Deamon.
    </action>
  </release>
  <release version="2.6.1" date="2019-02-08" description="This is a maintenance release (Java 7).">
    <action dev="struberg" issue="POOL-340" type="fix" due-to="Pavel Kolesov">
      Correct validateObject with concurrent borrowObject
    </action>
    <action dev="struberg" issue="POOL-356" type="fix">
      Fix deadlock on massive concurrent requests
    </action>
    <action dev="ggregory" issue="POOL-345" type="update">
      Update optional library cglib from 3.2.6 to 3.2.9.
    </action>
    <action dev="ggregory" issue="POOL-346" type="update" due-to="Michael Chen">
      Move common configuration setter to BaseGenericObjectPool #9.
    </action>
    <action dev="ggregory" issue="POOL-347" type="fix" due-to="Shunsuke Nakamura">
      Method borrowObject waits for maxWaitMillis over in pool full.
    </action>
    <action dev="ggregory" issue="POOL-349" type="update">
      Update optional library asm-util from 6.2 to 7.0.
    </action>
    <action dev="ggregory" issue="POOL-359" type="fix" due-to="Michael Wintermeyer, Gary Gregory">
      NullPointerException closing multiple GenericObjectPools.
    </action>
    <action dev="ggregory" issue="POOL-360" type="update">
      Update optional library cglib from 3.2.9 to 3.2.10.
    </action>
    <action dev="ggregory" issue="POOL-326" type="fix" due-to="Chris Allison, Phil Steitz">
      Threading issue, NullPointerException and IllegalStateException in GenericKeyedObjectPool.
    </action>
    <action dev="ggregory" issue="POOL-352" type="fix" due-to="Volker Kleinschmidt, Gary Gregory">
      CallStackUtils mishandles security manager check (partial fix.)
    </action>
  </release>  
  <release version="2.6.0" date="2018-07-06" description="This is a maintenance release (Java 7).">
    <action dev="ggregory" issue="POOL-336" type="update" due-to="Wolfgang Glas">
      GenericObjectPool's borrowObject lock if create() fails with Error.
    </action>
    <action dev="ggregory" issue="POOL-339" type="update">
      Update optional library cglib from 3.2.5 to 3.2.6.
    </action>
    <action dev="markt" issue="POOL-337" type="fix" due-to="Reinald Verheij">
      Ensure cancelled eviction tasks are removed from scheduler.
    </action>
    <action dev="ggregory" issue="POOL-341" type="update">
      Update optional library asm-util from 6.0 to 6.1.1.
    </action>
    <action dev="ggregory" issue="POOL-342" type="update">
      Update optional library asm-util from 6.1.1 to 6.2.
    </action>
    <action dev="ggregory" issue="POOL-338" type="fix" due-to="Michael C, Gary Gregory">
      GenericObjectPool constructor may throw an exception under OSGi.
    </action>
    <action dev="ggregory" issue="POOL-324" type="fix" due-to="Jay Xu, Gary Gregory">
      org.apache.commons.pool2.impl.GenericObjectPool.getFactoryType() throws java.lang.ClassCastException.
    </action>
    <action dev="ggregory" issue="POOL-344" type="fix" due-to="Yulin Wang">
      Delete repeated call startEvictor.
    </action>
  </release>
  <release version="2.5.0" date="2017-12-16" description="This is a minor release (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>
    <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 (Java 6).">
    <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 any 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 (Java 6).">
    <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 (Java 6), 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 (Java 6).">
    <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 (Java 6).">  
    <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 (Java 6) 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 (Java 6) 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 (Java 6) 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 behavior 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 synchronized 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 behavior 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 (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>
