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:48 UTC
(commons-pool) 04/05: >Add org.apache.commons.pool2.PooledObject.nonNull(PooledObject)
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);
}
}