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;