You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2025/06/10 17:54:44 UTC

(commons-pool) branch POOL_2_X updated (6ee92988 -> 6b7c8e0d)

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a change to branch POOL_2_X
in repository https://gitbox.apache.org/repos/asf/commons-pool.git


    from 6ee92988 Fix typo in comment
     new 9bf05020 Use try with resources
     new 222ca987 Fix typo in comment
     new a745f6b9 Use final
     new 09c78135 >Add org.apache.commons.pool2.PooledObject.nonNull(PooledObject)
     new 6b7c8e0d Add missing @Deprecated

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 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      |  5 ++-
 ...ledObjectFactory.java => PooledObjectTest.java} | 30 +++++++--------
 .../pool2/impl/TestGenericKeyedObjectPool.java     | 43 ++++++++++------------
 .../pool2/pool407/AbstractKeyedPool407Factory.java |  2 +-
 .../pool2/pool407/AbstractPool407Factory.java      |  2 +-
 9 files changed, 61 insertions(+), 55 deletions(-)
 copy src/test/java/org/apache/commons/pool2/{TestBaseKeyedPooledObjectFactory.java => PooledObjectTest.java} (57%)


(commons-pool) 05/05: Add missing @Deprecated

Posted by gg...@apache.org.
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 6b7c8e0d0636edb8d5f51142bd40ecfc30cd14c6
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Jun 10 13:54:38 2025 -0400

    Add missing @Deprecated
---
 src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java | 1 +
 1 file changed, 1 insertion(+)

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 e86e8384..cb6941cc 100644
--- a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
+++ b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
@@ -413,6 +413,7 @@ public class GenericObjectPool<T> extends BaseGenericObjectPool<T>
      *                   error
      * @deprecated Use {@link #borrowObject(Duration)}.
      */
+    @Deprecated
     public T borrowObject(final long maxWaitMillis) throws Exception {
         return borrowObject(Duration.ofMillis(maxWaitMillis));
     }


(commons-pool) 04/05: >Add org.apache.commons.pool2.PooledObject.nonNull(PooledObject)

Posted by gg...@apache.org.
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 <ga...@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);
     }
 
 }


(commons-pool) 01/05: Use try with resources

Posted by gg...@apache.org.
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 9bf0502021c76dc9ac54e313c05ef4b84d74c449
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Jun 10 13:10:28 2025 -0400

    Use try with resources
---
 .../pool2/impl/TestGenericKeyedObjectPool.java     | 39 ++++++++++------------
 1 file changed, 18 insertions(+), 21 deletions(-)

diff --git a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
index da15c3e4..f7dbd0d1 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
@@ -2109,28 +2109,25 @@ public class TestGenericKeyedObjectPool extends AbstractTestKeyedObjectPool {
         factory.makeLatency = 500;
         factory.setValidationEnabled(true); // turn on factory-level validatiom
         factory.setValid(false); // make validation fail uniformly
-        final GenericKeyedObjectPool<String, String> pool = new GenericKeyedObjectPool<>(factory);
-
-        pool.setBlockWhenExhausted(true);
-        pool.setMaxWait(maxWaitDuration);
-        pool.setMaxTotalPerKey(1);
-        pool.setMaxTotal(1);
-        pool.setTestOnCreate(true);
-        final Instant startTime = Instant.now();
-
-        // Try to borrow an object.  Validation will fail.
-        // Then we will wait on the pool.
-        try {
-            pool.borrowObject("a");
-        } catch (NoSuchElementException ex) {
-            // expected
+        try (GenericKeyedObjectPool<String, String> pool = new GenericKeyedObjectPool<>(factory)) {
+            pool.setBlockWhenExhausted(true);
+            pool.setMaxWait(maxWaitDuration);
+            pool.setMaxTotalPerKey(1);
+            pool.setMaxTotal(1);
+            pool.setTestOnCreate(true);
+            final Instant startTime = Instant.now();
+            // Try to borrow an object. Validation will fail.
+            // Then we will wait on the pool.
+            try {
+                pool.borrowObject("a");
+            } catch (NoSuchElementException ex) {
+                // expected
+            }
+            // Should have timed out after 1000 ms from the start time
+            final Duration duration = Duration.between(startTime, Instant.now());
+            assertTrue(duration.toMillis() < maxWaitDuration.toMillis() + 10, // allow for some timing delay
+                    "Thread A should have timed out after " + maxWaitDuration.toMillis() + " ms, but took " + duration.toMillis() + " ms");
         }
-
-        // Should have timed out after 1000 ms from the start time
-        final Duration duration = Duration.between(startTime, Instant.now());
-        assertTrue(duration.toMillis() < maxWaitDuration.toMillis() + 10,  // allow for some timing delay
-                "Thread A should have timed out after " + maxWaitDuration.toMillis() + " ms, but took " + duration.toMillis() + " ms");
-        pool.close();
     }
 
     @Test


(commons-pool) 02/05: Fix typo in comment

Posted by gg...@apache.org.
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 222ca98799d3c10269268a68e4f85c3b87d218a9
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Jun 10 13:11:38 2025 -0400

    Fix typo in comment
---
 .../java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
index f7dbd0d1..648226f2 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
@@ -2107,7 +2107,7 @@ public class TestGenericKeyedObjectPool extends AbstractTestKeyedObjectPool {
         final Duration maxWaitDuration = Duration.ofSeconds(1);
         final SimpleFactory<String> factory = new SimpleFactory<>();
         factory.makeLatency = 500;
-        factory.setValidationEnabled(true); // turn on factory-level validatiom
+        factory.setValidationEnabled(true); // turn on factory-level validation
         factory.setValid(false); // make validation fail uniformly
         try (GenericKeyedObjectPool<String, String> pool = new GenericKeyedObjectPool<>(factory)) {
             pool.setBlockWhenExhausted(true);


(commons-pool) 03/05: Use final

Posted by gg...@apache.org.
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 a745f6b9ef4d7261642c56bef84567ed8688f2af
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Jun 10 13:16:59 2025 -0400

    Use final
---
 .../org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
index 648226f2..91e3f97c 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
@@ -318,7 +318,7 @@ public class TestGenericKeyedObjectPool extends AbstractTestKeyedObjectPool {
         public void run() {
                 try {
                     pool.returnObject(key, pool.borrowObject(key));
-                } catch (Exception e) {
+                } catch (final Exception e) {
                     // Ignore
                 }
         }
@@ -2120,7 +2120,7 @@ public class TestGenericKeyedObjectPool extends AbstractTestKeyedObjectPool {
             // Then we will wait on the pool.
             try {
                 pool.borrowObject("a");
-            } catch (NoSuchElementException ex) {
+            } catch (final NoSuchElementException ex) {
                 // expected
             }
             // Should have timed out after 1000 ms from the start time