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

joerghoh pushed a commit to branch SLING-12062-lazybindings-putonly
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-api.git

commit 1b1da72adead49c08ed4a82ea6a1c3bc8059f4f6
Author: Joerg Hoh <joerg...@apache.org>
AuthorDate: Mon Feb 26 15:28:10 2024 +0100

    SLING-12062 add LazyBindings.putOnly
---
 .../apache/sling/api/scripting/LazyBindings.java   | 17 ++++++++++++--
 .../apache/sling/api/scripting/SlingBindings.java  |  4 ++--
 .../apache/sling/api/scripting/package-info.java   |  2 +-
 .../sling/api/scripting/LazyBindingsTest.java      | 26 ++++++++++++++++++++++
 4 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/apache/sling/api/scripting/LazyBindings.java 
b/src/main/java/org/apache/sling/api/scripting/LazyBindings.java
index d44acd2..78e4fd8 100644
--- a/src/main/java/org/apache/sling/api/scripting/LazyBindings.java
+++ b/src/main/java/org/apache/sling/api/scripting/LazyBindings.java
@@ -75,6 +75,20 @@ public class LazyBindings extends HashMap<String, Object> 
implements Bindings {
     @Override
     public Object put(String key, Object value) {
         Object previous = this.get(key);
+        putOnly(key, value);
+        return previous;
+    }
+
+    /**
+     * Set a named value; identical with {@link #put(String, Object)} but does 
not return (and evaluate)
+     * any previous value set.
+     * This is an extension of the LazyBindings implementation and can be 
beneficial if the supplied value is a Supplier, for which the 
+     * evaluation can be costly.
+     * 
+     * @param key the name associated with the value
+     * @param value the value associated with the name
+     */
+    public void putOnly(String key, Object value) {
         if (value instanceof LazyBindings.Supplier) {
             suppliers.put(key, (LazyBindings.Supplier) value);
             super.remove(key);
@@ -82,13 +96,12 @@ public class LazyBindings extends HashMap<String, Object> 
implements Bindings {
             super.put(key, value);
             suppliers.remove(key);
         }
-        return previous;
     }
 
     @Override
     public void putAll(Map<? extends String, ?> toMerge) {
         for (Entry<? extends String, ?> entry : toMerge.entrySet()) {
-            put(entry.getKey(), entry.getValue());
+            putOnly(entry.getKey(), entry.getValue());
         }
     }
 
diff --git a/src/main/java/org/apache/sling/api/scripting/SlingBindings.java 
b/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
index bdc32f7..806cd53 100644
--- a/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
+++ b/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
@@ -182,7 +182,7 @@ public class SlingBindings extends LazyBindings {
      */
     protected void safePut(final String key, final Object value) {
         if ( value != null ) {
-            this.put(key, value);
+            this.putOnly(key, value);
         }
     }
 
@@ -191,7 +191,7 @@ public class SlingBindings extends LazyBindings {
      * @param flush Whether to flush or not
      */
     public void setFlush(boolean flush) {
-        put(FLUSH, flush);
+        putOnly(FLUSH, flush);
     }
 
     /**
diff --git a/src/main/java/org/apache/sling/api/scripting/package-info.java 
b/src/main/java/org/apache/sling/api/scripting/package-info.java
index e43eb81..1772977 100644
--- a/src/main/java/org/apache/sling/api/scripting/package-info.java
+++ b/src/main/java/org/apache/sling/api/scripting/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("2.5.0")
+@Version("2.6.0")
 package org.apache.sling.api.scripting;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/src/test/java/org/apache/sling/api/scripting/LazyBindingsTest.java 
b/src/test/java/org/apache/sling/api/scripting/LazyBindingsTest.java
index a50b45c..4069ae5 100644
--- a/src/test/java/org/apache/sling/api/scripting/LazyBindingsTest.java
+++ b/src/test/java/org/apache/sling/api/scripting/LazyBindingsTest.java
@@ -35,6 +35,7 @@ import java.util.function.Supplier;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 public class LazyBindingsTest {
     private static final String THE_QUESTION = "What is The Answer to the 
Ultimate Question of Life, The Universe, and Everything?";
@@ -220,6 +221,31 @@ public class LazyBindingsTest {
         assertEquals("lazybar", bindings.get("foo"));
     }
 
+    @Test
+    public void testPut_vs_PutOnly() {
+        final LazyBindings bindings = new LazyBindings();
+
+        Supplier supplierPut = Mockito.spy(new LazyBindings.Supplier() {
+            @Override
+            public Object get() {
+                return "bar";
+            }
+        });
+        bindings.put("put", supplierPut);
+        bindings.put("put", supplierPut);
+        Mockito.verify(supplierPut, Mockito.times(1)).get();
+
+        Supplier supplierPutOnly = Mockito.spy(new LazyBindings.Supplier() {
+            @Override
+            public Object get() {
+                return "bar";
+            }
+        });
+        bindings.putOnly("putOnly", supplierPutOnly);
+        bindings.putOnly("putOnly", supplierPutOnly);
+        Mockito.verify(supplierPutOnly, Mockito.never()).get();
+    }
+
     private class TestSupplier implements LazyBindings.Supplier {
 
         private final String name;

Reply via email to