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 2024/05/12 19:31:34 UTC

(commons-lang) branch master updated: Make LockVisitor.acceptReadLocked(FailableConsumer) null-safe

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-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new b9f15bc00 Make LockVisitor.acceptReadLocked(FailableConsumer) null-safe
b9f15bc00 is described below

commit b9f15bc007be2bb0ba9633559482396e0352785a
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun May 12 15:31:29 2024 -0400

    Make LockVisitor.acceptReadLocked(FailableConsumer) null-safe
    
    Make LockVisitor.applyWriteLocked(FailableConsumer) null-safe
---
 src/changes/changes.xml                                          | 2 ++
 .../apache/commons/lang3/concurrent/locks/LockingVisitors.java   | 9 ++++++---
 .../commons/lang3/concurrent/locks/LockingVisitorsTest.java      | 2 ++
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 359100624..11a977dbc 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -126,6 +126,8 @@ The <action> type attribute can be add,update,fix,remove.
     <action                   type="fix" dev="ggregory" due-to="Stephan Peters, Gary Gregory, Bernd">StringUtils.stripAccents() should handle ligatures, UTF32 math blocks, etc. #1201.</action>
     <action issue="LANG-1524" type="fix" dev="ggregory" due-to="kijong.youn, Aakash Gupta, Gary Gregory">TypeUtils.toString(Type) StackOverflowError for an inner class in the inner class parameterized enclosing class #657.</action>
     <action                   type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate SystemUtils.getUserName(String) in favor of SystemProperties.getUserName(Supplier).</action>
+    <action                   type="fix" dev="ggregory" due-to="Gary Gregory">Make LockVisitor.acceptReadLocked(FailableConsumer) null-safe.</action>
+    <action                   type="fix" dev="ggregory" due-to="Gary Gregory">Make LockVisitor.applyWriteLocked(FailableConsumer) null-safe.</action>
     <!-- UPDATE -->
     <action                   type="update" dev="sebb" due-to="Dependabot">Bump commons-parent from 64 to 69 #1194.</action>
     <action                   type="update" dev="ggregory" due-to="Dependabot">Bump org.codehaus.mojo:exec-maven-plugin from 3.1.1 to 3.2.0 #1175.</action>
diff --git a/src/main/java/org/apache/commons/lang3/concurrent/locks/LockingVisitors.java b/src/main/java/org/apache/commons/lang3/concurrent/locks/LockingVisitors.java
index 400eb1a77..d83f52350 100644
--- a/src/main/java/org/apache/commons/lang3/concurrent/locks/LockingVisitors.java
+++ b/src/main/java/org/apache/commons/lang3/concurrent/locks/LockingVisitors.java
@@ -26,6 +26,7 @@ import java.util.function.Supplier;
 import org.apache.commons.lang3.function.Failable;
 import org.apache.commons.lang3.function.FailableConsumer;
 import org.apache.commons.lang3.function.FailableFunction;
+import org.apache.commons.lang3.function.Suppliers;
 
 /**
  * Combines the monitor and visitor pattern to work with {@link java.util.concurrent.locks.Lock locked objects}. Locked
@@ -262,10 +263,12 @@ public class LockingVisitors {
          * @see #acceptWriteLocked(FailableConsumer)
          */
         protected void lockAcceptUnlock(final Supplier<Lock> lockSupplier, final FailableConsumer<O, ?> consumer) {
-            final Lock lock = lockSupplier.get();
+            final Lock lock = Objects.requireNonNull(Suppliers.get(lockSupplier), "lock");
             lock.lock();
             try {
-                consumer.accept(object);
+                if (consumer != null) {
+                    consumer.accept(object);
+                }
             } catch (final Throwable t) {
                 throw Failable.rethrow(t);
             } finally {
@@ -289,7 +292,7 @@ public class LockingVisitors {
          * @see #applyWriteLocked(FailableFunction)
          */
         protected <T> T lockApplyUnlock(final Supplier<Lock> lockSupplier, final FailableFunction<O, T, ?> function) {
-            final Lock lock = lockSupplier.get();
+            final Lock lock = Objects.requireNonNull(Suppliers.get(lockSupplier), "lock");
             lock.lock();
             try {
                 return function.apply(object);
diff --git a/src/test/java/org/apache/commons/lang3/concurrent/locks/LockingVisitorsTest.java b/src/test/java/org/apache/commons/lang3/concurrent/locks/LockingVisitorsTest.java
index cdf78dae4..74343e891 100644
--- a/src/test/java/org/apache/commons/lang3/concurrent/locks/LockingVisitorsTest.java
+++ b/src/test/java/org/apache/commons/lang3/concurrent/locks/LockingVisitorsTest.java
@@ -93,8 +93,10 @@ public class LockingVisitorsTest extends AbstractLangTest {
         final AtomicInteger res = new AtomicInteger();
         final ReadWriteLock rwLock = new ReentrantReadWriteLock();
         LockingVisitors.create(res, rwLock).acceptReadLocked(AtomicInteger::incrementAndGet);
+        LockingVisitors.create(res, rwLock).acceptReadLocked(null);
         assertEquals(1, res.get());
         LockingVisitors.create(res, rwLock).acceptWriteLocked(AtomicInteger::incrementAndGet);
+        LockingVisitors.create(res, rwLock).acceptWriteLocked(null);
         assertEquals(2, res.get());
     }