This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch POOL_2_X in repository https://gitbox.apache.org/repos/asf/commons-pool.git
commit 09c781359a2d3558711635ded47a7453f6ea5545 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Tue Jun 10 13:54:23 2025 -0400 >Add org.apache.commons.pool2.PooledObject.nonNull(PooledObject) --- pom.xml | 8 +++--- src/changes/changes.xml | 3 ++- .../org/apache/commons/pool2/PooledObject.java | 15 +++++++++-- .../commons/pool2/impl/GenericKeyedObjectPool.java | 8 +++--- .../commons/pool2/impl/GenericObjectPool.java | 4 +-- ...edPool407Factory.java => PooledObjectTest.java} | 30 ++++++++++++++-------- .../pool2/pool407/AbstractKeyedPool407Factory.java | 2 +- .../pool2/pool407/AbstractPool407Factory.java | 2 +- 8 files changed, 46 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index d988fc43..f51c8a04 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ <version>81</version> </parent> <artifactId>commons-pool2</artifactId> - <version>2.12.2-SNAPSHOT</version> + <version>2.13.0-SNAPSHOT</version> <name>Apache Commons Pool</name> <inceptionYear>2001</inceptionYear> <description>The Apache Commons Object Pooling Library.</description> @@ -92,8 +92,8 @@ <commons.rc.version>RC3</commons.rc.version> <checkstyle.suppress.file>${basedir}/src/conf/checkstyle-suppressions.xml</checkstyle.suppress.file> <!-- Java 8 --> - <commons.release.version>2.12.1</commons.release.version> - <commons.release.next>2.12.2</commons.release.next> + <commons.release.version>2.13.0</commons.release.version> + <commons.release.next>2.13.1</commons.release.next> <commons.release.desc>(Java 8 or above)</commons.release.desc> <!-- Java 7 --> <commons.release.2.version>2.6.2</commons.release.2.version> @@ -103,7 +103,7 @@ <commons.scmPubCheckoutDirectory>site-content</commons.scmPubCheckoutDirectory> <commons.osgi.import>net.sf.cglib.proxy;resolution:=optional,*</commons.osgi.import> <!-- Commons Release Plugin --> - <commons.bc.version>2.12.0</commons.bc.version> + <commons.bc.version>2.12.1</commons.bc.version> <commons.release.isDistModule>true</commons.release.isDistModule> <japicmp.skip>false</japicmp.skip> <spotbugs.skip>false</spotbugs.skip> diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 4c4b1abd..0a68f635 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -45,7 +45,7 @@ The <action> type attribute can be add,update,fix,remove. <title>Apache Commons Pool Release Notes</title> </properties> <body> - <release version="2.12.2" date="YYYY-MM-DD" description="This is a feature and maintenance release. Java 8 or later is required."> + <release version="2.13.0" date="YYYY-MM-DD" description="This is a feature and maintenance release. Java 8 or later is required."> <!-- FIX --> <action type="fix" issue="POOL-290" dev="psteitz" due-to="Serge Angelov">TestSoftRefOutOfMemory (unit test) can loop infinitely on failure.</action> <action type="fix" issue="POOL-419" dev="psteitz" due-to="Raju Gupta, Phil Steitz">GenericObjectPool counters and object collections can be corrupted when returnObject and invalidate are invoked concurrently by client threads on the same pooled object.</action> @@ -62,6 +62,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="fix" dev="ggregory" due-to="Gary Gregory">Operation on the "idleHighWaterMark" shared variable in "ErodingFactor" class is not atomic [org.apache.commons.pool2.PoolUtils$ErodingFactor] At PoolUtils.java:[line 98] AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE.</action> <action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.commons.pool2.impl.GenericObjectPool.create(Duration) should normalize a negative duration to zero.</action> <!-- ADD --> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.commons.pool2.PooledObject.nonNull(PooledObject).</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 79 to 81.</action> </release> diff --git a/src/main/java/org/apache/commons/pool2/PooledObject.java b/src/main/java/org/apache/commons/pool2/PooledObject.java index c9a2b578..c76871e1 100644 --- a/src/main/java/org/apache/commons/pool2/PooledObject.java +++ b/src/main/java/org/apache/commons/pool2/PooledObject.java @@ -34,16 +34,27 @@ import java.util.Deque; public interface PooledObject<T> extends Comparable<PooledObject<T>> { /** - * Tests whether the given PooledObject is null <em>or</em> contains a null. + * Tests whether the given PooledObject is null <em>or</em> wraps a null. * * @param pooledObject the PooledObject to test. - * @return whether the given PooledObject is null <em>or</em> contains a null. + * @return whether the given PooledObject is null <em>or</em> wraps a null. * @since 2.12.0 */ static boolean isNull(final PooledObject<?> pooledObject) { return pooledObject == null || pooledObject.getObject() == null; } + /** + * Tests whether the given PooledObject isn't null <em>and</em> doesn't wraps a null. + * + * @param pooledObject the PooledObject to test. + * @return whether the given PooledObject isn't null <em>and</em> doesn't wraps a null. + * @since 2.13.0 + */ + static boolean nonNull(final PooledObject<?> pooledObject) { + return pooledObject != null && pooledObject.getObject() != null; + } + /** * Allocates the object. * diff --git a/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java b/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java index 5c43b097..4895f2ca 100644 --- a/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java +++ b/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java @@ -297,7 +297,7 @@ public class GenericKeyedObjectPool<K, T> extends BaseGenericObjectPool<T> * @throws Exception If the associated factory fails to passivate the object */ private void addIdleObject(final K key, final PooledObject<T> p) throws Exception { - if (!PooledObject.isNull(p)) { + if (PooledObject.nonNull(p)) { factory.passivateObject(key, p); final LinkedBlockingDeque<PooledObject<T>> idleObjects = poolMap.get(key).getIdleObjects(); if (getLifo()) { @@ -445,7 +445,7 @@ public class GenericKeyedObjectPool<K, T> extends BaseGenericObjectPool<T> p = objectDeque.getIdleObjects().pollFirst(); if (p == null) { p = create(key, remainingWaitDuration); - if (!PooledObject.isNull(p)) { + if (PooledObject.nonNull(p)) { create = true; } remainingWaitDuration = maxWaitDuration.minus(durationSince(startInstant)); @@ -466,7 +466,7 @@ public class GenericKeyedObjectPool<K, T> extends BaseGenericObjectPool<T> p = null; } - if (!PooledObject.isNull(p)) { + if (PooledObject.nonNull(p)) { try { factory.activateObject(key, p); } catch (final Exception e) { @@ -483,7 +483,7 @@ public class GenericKeyedObjectPool<K, T> extends BaseGenericObjectPool<T> throw nsee; } } - if (!PooledObject.isNull(p) && getTestOnBorrow()) { + if (PooledObject.nonNull(p) && getTestOnBorrow()) { boolean validate = false; Throwable validationThrowable = null; try { diff --git a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java index d40f67fb..e86e8384 100644 --- a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java +++ b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java @@ -186,7 +186,7 @@ public class GenericObjectPool<T> extends BaseGenericObjectPool<T> * @throws Exception If the factory fails to passivate the object */ private void addIdleObject(final PooledObject<T> p) throws Exception { - if (!PooledObject.isNull(p)) { + if (PooledObject.nonNull(p)) { factory.passivateObject(p); if (getLifo()) { idleObjects.addFirst(p); @@ -300,7 +300,7 @@ public class GenericObjectPool<T> extends BaseGenericObjectPool<T> p = idleObjects.pollFirst(); if (p == null) { p = create(remainingWaitDuration); - if (!PooledObject.isNull(p)) { + if (PooledObject.nonNull(p)) { create = true; } } diff --git a/src/test/java/org/apache/commons/pool2/pool407/AbstractKeyedPool407Factory.java b/src/test/java/org/apache/commons/pool2/PooledObjectTest.java similarity index 51% copy from src/test/java/org/apache/commons/pool2/pool407/AbstractKeyedPool407Factory.java copy to src/test/java/org/apache/commons/pool2/PooledObjectTest.java index 9f2001e4..634bfa45 100644 --- a/src/test/java/org/apache/commons/pool2/pool407/AbstractKeyedPool407Factory.java +++ b/src/test/java/org/apache/commons/pool2/PooledObjectTest.java @@ -15,22 +15,30 @@ * limitations under the License. */ -package org.apache.commons.pool2.pool407; +package org.apache.commons.pool2; -import org.apache.commons.pool2.BaseKeyedPooledObjectFactory; -import org.apache.commons.pool2.PooledObject; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.junit.jupiter.api.Test; /** - * Tests POOL-407. + * Tests {@link PooledObject}. */ -public abstract class AbstractKeyedPool407Factory extends BaseKeyedPooledObjectFactory<String, KeyedPool407Fixture> { - - abstract boolean isDefaultMakeObject(); +public class PooledObjectTest { - @Override - public boolean validateObject(final String key, final PooledObject<KeyedPool407Fixture> p) { - // TODO Should this be enough even if wrap() does throw and returns a DefaultPooledObject wrapping a null? - return !PooledObject.isNull(p); + @Test + void testIsNull() { + assertTrue(PooledObject.isNull(null)); + assertTrue(PooledObject.isNull(new DefaultPooledObject<>(null))); + assertFalse(PooledObject.isNull(new DefaultPooledObject<>("a"))); } + @Test + void testNonNull() { + assertFalse(PooledObject.nonNull(null)); + assertFalse(PooledObject.nonNull(new DefaultPooledObject<>(null))); + assertTrue(PooledObject.nonNull(new DefaultPooledObject<>("a"))); + } } diff --git a/src/test/java/org/apache/commons/pool2/pool407/AbstractKeyedPool407Factory.java b/src/test/java/org/apache/commons/pool2/pool407/AbstractKeyedPool407Factory.java index 9f2001e4..c9b2706c 100644 --- a/src/test/java/org/apache/commons/pool2/pool407/AbstractKeyedPool407Factory.java +++ b/src/test/java/org/apache/commons/pool2/pool407/AbstractKeyedPool407Factory.java @@ -30,7 +30,7 @@ public abstract class AbstractKeyedPool407Factory extends BaseKeyedPooledObjectF @Override public boolean validateObject(final String key, final PooledObject<KeyedPool407Fixture> p) { // TODO Should this be enough even if wrap() does throw and returns a DefaultPooledObject wrapping a null? - return !PooledObject.isNull(p); + return PooledObject.nonNull(p); } } diff --git a/src/test/java/org/apache/commons/pool2/pool407/AbstractPool407Factory.java b/src/test/java/org/apache/commons/pool2/pool407/AbstractPool407Factory.java index 2f2b6b43..f8e3310f 100644 --- a/src/test/java/org/apache/commons/pool2/pool407/AbstractPool407Factory.java +++ b/src/test/java/org/apache/commons/pool2/pool407/AbstractPool407Factory.java @@ -43,7 +43,7 @@ public abstract class AbstractPool407Factory extends BasePooledObjectFactory<Poo @Override public boolean validateObject(final PooledObject<Pool407Fixture> p) { // TODO Should this be enough even if wrap() does throw and returns a DefaultPooledObject wrapping a null? - return !PooledObject.isNull(p); + return PooledObject.nonNull(p); } }