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

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

commit eb00d5b9e9b7573c35f98ea7d31390b778b8011b
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Mon Feb 15 10:00:17 2021 -0500

    Add and use java.time.Duration APIs for AbandonedConfig timeouts instead
    of using ints as seconds.
    - Add AbandonedConfig.getRemoveAbandonedTimeoutDuration()
    - Add AbandonedConfig.setRemoveAbandonedTimeout(Duration)
---
 pom.xml                                            |  6 +--
 src/changes/changes.xml                            | 10 ++++-
 .../apache/commons/pool2/impl/AbandonedConfig.java | 44 ++++++++++++++++++++--
 .../commons/pool2/impl/GenericObjectPool.java      | 12 +++---
 .../pool2/impl/TestAbandonedObjectPool.java        | 16 +++++---
 .../apache/commons/pool2/impl/TestConstants.java   | 26 +++++++++++++
 .../pool2/impl/TestDefaultPooledObjectInfo.java    |  2 +-
 .../pool2/proxy/BaseTestProxiedObjectPool.java     |  5 ++-
 8 files changed, 100 insertions(+), 21 deletions(-)

diff --git a/pom.xml b/pom.xml
index 560f106..fbce2e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
   </parent>
 
   <artifactId>commons-pool2</artifactId>
-  <version>2.9.1-SNAPSHOT</version>
+  <version>2.10.0-SNAPSHOT</version>
   <name>Apache Commons Pool</name>
 
   <inceptionYear>2001</inceptionYear>
@@ -158,7 +158,7 @@
     <commons.module.name>org.apache.commons.pool2</commons.module.name>
     <commons.rc.version>RC1</commons.rc.version>
     <!-- Java 8 -->
-    <commons.release.version>2.9.0</commons.release.version>
+    <commons.release.version>2.10.0</commons.release.version>
     <commons.release.desc>(Java 8)</commons.release.desc>
     <!-- Java 7 -->
     <commons.release.2.version>2.6.2</commons.release.2.version>
@@ -185,7 +185,7 @@
     <spotbugs.impl.version>4.2.0</spotbugs.impl.version>
 
     <!-- Commons Release Plugin -->
-    <commons.bc.version>2.8.1</commons.bc.version>
+    <commons.bc.version>2.9.0</commons.bc.version>
     <commons.release.isDistModule>true</commons.release.isDistModule>
     <commons.releaseManagerName>Gary Gregory</commons.releaseManagerName>    
     <commons.releaseManagerKey>86fdc7e2a11262cb</commons.releaseManagerKey>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 18352ff..150db44 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -43,8 +43,14 @@ The <action> type attribute can be add,update,fix,remove.
     <title>Apache Commons Pool Release Notes</title>
   </properties>
   <body>
-  <release version="2.9.1" date="202Y-MM-DD" description="This is a MMMM 
release (Java 8).">
-    <!-- UPDATES -->
+  <release version="2.10.0" date="202Y-MM-DD" description="This is a MMMM 
release (Java 8).">
+    <!-- ADD -->
+    <action dev="ggregory" type="update" due-to="Dependabot">
+      Add and use java.time.Duration APIs for AbandonedConfig timeouts instead 
of using ints for seconds.
+      - Add AbandonedConfig.getRemoveAbandonedTimeoutDuration()
+      - Add AbandonedConfig.setRemoveAbandonedTimeout(Duration)
+    </action>
+    <!-- UPDATE -->
     <action dev="ggregory" type="update" due-to="Dependabot">
       Bump spotbugs-maven-plugin from 4.0.4 to 4.2.0 #48, #53, #59.
     </action>
diff --git a/src/main/java/org/apache/commons/pool2/impl/AbandonedConfig.java 
b/src/main/java/org/apache/commons/pool2/impl/AbandonedConfig.java
index 85c1cc4..91e2eea 100644
--- a/src/main/java/org/apache/commons/pool2/impl/AbandonedConfig.java
+++ b/src/main/java/org/apache/commons/pool2/impl/AbandonedConfig.java
@@ -20,6 +20,7 @@ package org.apache.commons.pool2.impl;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.nio.charset.Charset;
+import java.time.Duration;
 
 import org.apache.commons.pool2.TrackedUse;
 import org.apache.commons.pool2.UsageTracking;
@@ -102,9 +103,9 @@ public class AbandonedConfig {
     }
 
     /**
-     * Timeout in seconds before an abandoned object can be removed.
+     * Timeout before an abandoned object can be removed.
      */
-    private int removeAbandonedTimeout = 300;
+    private Duration removeAbandonedTimeout = Duration.ofSeconds(300);
 
     /**
      * <p>Timeout in seconds before an abandoned object can be removed.</p>
@@ -116,12 +117,47 @@ public class AbandonedConfig {
      * <p>The default value is 300 seconds.</p>
      *
      * @return the abandoned object timeout in seconds
+     * @deprecated Use {@link #getRemoveAbandonedTimeoutDuration()}.
      */
+    @Deprecated
     public int getRemoveAbandonedTimeout() {
+        return (int) this.removeAbandonedTimeout.getSeconds();
+    }
+
+    /**
+     * <p>Timeout before an abandoned object can be removed.</p>
+     *
+     * <p>The time of most recent use of an object is the maximum (latest) of
+     * {@link TrackedUse#getLastUsed()} (if this class of the object implements
+     * TrackedUse) and the time when the object was borrowed from the pool.</p>
+     *
+     * <p>The default value is 300 seconds.</p>
+     *
+     * @return the abandoned object timeout.
+     * @since 2.10.0
+     */
+    public Duration getRemoveAbandonedTimeoutDuration() {
         return this.removeAbandonedTimeout;
     }
 
     /**
+     * <p>Sets the timeout before an abandoned object can be
+     * removed</p>
+     *
+     * <p>Setting this property has no effect if
+     * {@link #getRemoveAbandonedOnBorrow() removeAbandonedOnBorrow} and
+     * {@link #getRemoveAbandonedOnMaintenance() removeAbandonedOnMaintenance}
+     * are both false.</p>
+     *
+     * @param removeAbandonedTimeout new abandoned timeout
+     * @see #getRemoveAbandonedTimeout()
+     * @since 2.10.0
+     */
+    public void setRemoveAbandonedTimeout(final Duration 
removeAbandonedTimeout) {
+        this.removeAbandonedTimeout = removeAbandonedTimeout;
+    }
+
+    /**
      * <p>Sets the timeout in seconds before an abandoned object can be
      * removed</p>
      *
@@ -132,9 +168,11 @@ public class AbandonedConfig {
      *
      * @param removeAbandonedTimeout new abandoned timeout in seconds
      * @see #getRemoveAbandonedTimeout()
+     * @deprecated Use {@link #setRemoveAbandonedTimeout(Duration)}.
      */
+    @Deprecated
     public void setRemoveAbandonedTimeout(final int removeAbandonedTimeout) {
-        this.removeAbandonedTimeout = removeAbandonedTimeout;
+        setRemoveAbandonedTimeout(Duration.ofSeconds(removeAbandonedTimeout));
     }
 
     /**
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 6bb571b..9991926 100644
--- a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
+++ b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
@@ -282,14 +282,16 @@ public class GenericObjectPool<T> extends 
BaseGenericObjectPool<T>
     }
 
     /**
-     * Obtains the timeout before which an object will be considered to be
+     * Gets the timeout before which an object will be considered to be
      * abandoned by this pool.
      *
      * @return The abandoned object timeout in seconds if abandoned object
      *         removal is configured for this pool; Integer.MAX_VALUE 
otherwise.
      *
      * @see AbandonedConfig#getRemoveAbandonedTimeout()
+     * @see AbandonedConfig#getRemoveAbandonedTimeoutDuration()
      */
+    @SuppressWarnings("deprecation")
     @Override
     public int getRemoveAbandonedTimeout() {
         final AbandonedConfig ac = this.abandonedConfig;
@@ -328,7 +330,7 @@ public class GenericObjectPool<T> extends 
BaseGenericObjectPool<T>
             this.abandonedConfig.setLogWriter(abandonedConfig.getLogWriter());
             
this.abandonedConfig.setRemoveAbandonedOnBorrow(abandonedConfig.getRemoveAbandonedOnBorrow());
             
this.abandonedConfig.setRemoveAbandonedOnMaintenance(abandonedConfig.getRemoveAbandonedOnMaintenance());
-            
this.abandonedConfig.setRemoveAbandonedTimeout(abandonedConfig.getRemoveAbandonedTimeout());
+            
this.abandonedConfig.setRemoveAbandonedTimeout(abandonedConfig.getRemoveAbandonedTimeoutDuration());
             
this.abandonedConfig.setUseUsageTracking(abandonedConfig.getUseUsageTracking());
             
this.abandonedConfig.setRequireFullStackTrace(abandonedConfig.getRequireFullStackTrace());
         }
@@ -1070,7 +1072,7 @@ public class GenericObjectPool<T> extends 
BaseGenericObjectPool<T>
         // Generate a list of abandoned objects to remove
         final long nowMillis = System.currentTimeMillis();
         final long timeoutMillis =
-                nowMillis - (abandonedConfig.getRemoveAbandonedTimeout() * 
1000L);
+                nowMillis - 
abandonedConfig.getRemoveAbandonedTimeoutDuration().toMillis();
         final ArrayList<PooledObject<T>> remove = new ArrayList<>();
         final Iterator<PooledObject<T>> it = allObjects.values().iterator();
         while (it.hasNext()) {
@@ -1202,7 +1204,7 @@ public class GenericObjectPool<T> extends 
BaseGenericObjectPool<T>
      * {@link #_maxActive} objects created at any one time.
      */
     private final AtomicLong createCount = new AtomicLong(0);
-    private long makeObjectCount = 0;
+    private long makeObjectCount;
     private final Object makeObjectCountLock = new Object();
     private final LinkedBlockingDeque<PooledObject<T>> idleObjects;
 
@@ -1211,7 +1213,7 @@ public class GenericObjectPool<T> extends 
BaseGenericObjectPool<T>
         "org.apache.commons.pool2:type=GenericObjectPool,name=";
 
     // Additional configuration properties for abandoned object tracking
-    private volatile AbandonedConfig abandonedConfig = null;
+    private volatile AbandonedConfig abandonedConfig;
 
     @Override
     protected void toStringAppendFields(final StringBuilder builder) {
diff --git 
a/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java 
b/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java
index e576a85..39886aa 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java
@@ -45,9 +45,11 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  * TestCase for AbandonedObjectPool
  */
 public class TestAbandonedObjectPool {
+
     private GenericObjectPool<PooledTestObject> pool = null;
     private AbandonedConfig abandonedConfig = null;
 
+    @SuppressWarnings("deprecation")
     @BeforeEach
     public void setUp() throws Exception {
         abandonedConfig = new AbandonedConfig();
@@ -57,6 +59,10 @@ public class TestAbandonedObjectPool {
 
         abandonedConfig.setRemoveAbandonedOnBorrow(true);
         abandonedConfig.setRemoveAbandonedTimeout(1);
+        assertEquals(TestConstants.ONE_SECOND, 
abandonedConfig.getRemoveAbandonedTimeoutDuration());
+        abandonedConfig.setRemoveAbandonedTimeout(TestConstants.ONE_SECOND);
+        assertEquals(1, abandonedConfig.getRemoveAbandonedTimeout());
+
         pool = new GenericObjectPool<>(
                new SimpleFactory(),
                new GenericObjectPoolConfig<PooledTestObject>(),
@@ -148,7 +154,7 @@ public class TestAbandonedObjectPool {
     public void testAbandonedReturn() throws Exception {
         abandonedConfig = new AbandonedConfig();
         abandonedConfig.setRemoveAbandonedOnBorrow(true);
-        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedTimeout(TestConstants.ONE_SECOND);
         pool.close();  // Unregister pool created by setup
         pool = new GenericObjectPool<>(
                 new SimpleFactory(200, 0),
@@ -183,7 +189,7 @@ public class TestAbandonedObjectPool {
     public void testAbandonedInvalidate() throws Exception {
         abandonedConfig = new AbandonedConfig();
         abandonedConfig.setRemoveAbandonedOnMaintenance(true);
-        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedTimeout(TestConstants.ONE_SECOND);
         pool.close();  // Unregister pool created by setup
         pool = new GenericObjectPool<>(
                 // destroys take 200 ms
@@ -207,7 +213,7 @@ public class TestAbandonedObjectPool {
     public void testDestroyModeAbandoned() throws Exception {
         abandonedConfig = new AbandonedConfig();
         abandonedConfig.setRemoveAbandonedOnMaintenance(true);
-        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedTimeout(TestConstants.ONE_SECOND);
         pool.close();  // Unregister pool created by setup
         pool = new GenericObjectPool<>(
              // validate takes 1 second
@@ -241,7 +247,7 @@ public class TestAbandonedObjectPool {
     public void testRemoveAbandonedWhileReturning() throws Exception {
         abandonedConfig = new AbandonedConfig();
         abandonedConfig.setRemoveAbandonedOnMaintenance(true);
-        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedTimeout(TestConstants.ONE_SECOND);
         pool.close();  // Unregister pool created by setup
         pool = new GenericObjectPool<>(
              // validate takes 1 second
@@ -299,7 +305,7 @@ public class TestAbandonedObjectPool {
     public void testStackTrace() throws Exception {
         abandonedConfig.setRemoveAbandonedOnMaintenance(true);
         abandonedConfig.setLogAbandoned(true);
-        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedTimeout(TestConstants.ONE_SECOND);
         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
         final BufferedOutputStream bos = new BufferedOutputStream(baos);
         final PrintWriter pw = new PrintWriter(bos);
diff --git a/src/test/java/org/apache/commons/pool2/impl/TestConstants.java 
b/src/test/java/org/apache/commons/pool2/impl/TestConstants.java
new file mode 100644
index 0000000..14d182f
--- /dev/null
+++ b/src/test/java/org/apache/commons/pool2/impl/TestConstants.java
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+package org.apache.commons.pool2.impl;
+
+import java.time.Duration;
+
+public class TestConstants {
+
+    public static final Duration ONE_SECOND = Duration.ofSeconds(1);
+
+}
diff --git 
a/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObjectInfo.java 
b/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObjectInfo.java
index 9a49a6b..50b3050 100644
--- 
a/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObjectInfo.java
+++ 
b/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObjectInfo.java
@@ -112,7 +112,7 @@ public class TestDefaultPooledObjectInfo {
         final AbandonedConfig abandonedConfig = new AbandonedConfig();
 
         abandonedConfig.setRemoveAbandonedOnBorrow(true);
-        abandonedConfig.setRemoveAbandonedTimeout(1);
+        abandonedConfig.setRemoveAbandonedTimeout(TestConstants.ONE_SECOND);
         abandonedConfig.setLogAbandoned(true);
         try (final GenericObjectPool<String> pool = new 
GenericObjectPool<>(new SimpleFactory(),
                 new GenericObjectPoolConfig<String>(), abandonedConfig)) {
diff --git 
a/src/test/java/org/apache/commons/pool2/proxy/BaseTestProxiedObjectPool.java 
b/src/test/java/org/apache/commons/pool2/proxy/BaseTestProxiedObjectPool.java
index 3db3d1d..4e1b93c 100644
--- 
a/src/test/java/org/apache/commons/pool2/proxy/BaseTestProxiedObjectPool.java
+++ 
b/src/test/java/org/apache/commons/pool2/proxy/BaseTestProxiedObjectPool.java
@@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.time.Duration;
 
 import org.apache.commons.pool2.BasePooledObjectFactory;
 import org.apache.commons.pool2.ObjectPool;
@@ -39,7 +40,7 @@ import org.junit.jupiter.api.Test;
 public abstract class BaseTestProxiedObjectPool {
 
     private static final String DATA1 = "data1";
-    private static final int ABANDONED_TIMEOUT_SECS = 3;
+    private static final Duration ABANDONED_TIMEOUT_SECS = 
Duration.ofSeconds(3);
 
     private ObjectPool<TestObject> pool = null;
     private StringWriter log = null;
@@ -130,7 +131,7 @@ public abstract class BaseTestProxiedObjectPool {
         obj.setData(DATA1);
 
         // Sleep long enough for the object to be considered abandoned
-        Thread.sleep((ABANDONED_TIMEOUT_SECS + 2) * 1000);
+        Thread.sleep(ABANDONED_TIMEOUT_SECS.plusSeconds(2).toMillis());
 
         // Borrow another object to trigger the abandoned object processing
         pool.borrowObject();

Reply via email to