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);
     }
 
 }

Reply via email to