You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2019/12/06 12:20:02 UTC
[sling-org-apache-sling-scripting-javascript] branch master
updated: SLING-8892 - Unwrap LazyBindings.Supplier values in the
RhinoJavaScriptEngine
This is an automated email from the ASF dual-hosted git repository.
radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-javascript.git
The following commit(s) were added to refs/heads/master by this push:
new 7e45f47 SLING-8892 - Unwrap LazyBindings.Supplier values in the RhinoJavaScriptEngine
7e45f47 is described below
commit 7e45f47f70b14475b8463dc6fb70b044b79dc225
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Fri Dec 6 13:11:44 2019 +0100
SLING-8892 - Unwrap LazyBindings.Supplier values in the RhinoJavaScriptEngine
* Supplier provided values are now unwrapped in the engine and added into
Rhino's ScriptContext only if the unwrapped values are not null
* added tests for Supplier provided values
---
.../javascript/helper/SlingWrapFactory.java | 7 +-----
.../javascript/internal/RhinoJavaScriptEngine.java | 4 ++++
.../internal/RhinoJavaScriptEngineTest.java | 28 ++++++++++++++++++++++
3 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java b/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java
index f2231d2..6510373 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/helper/SlingWrapFactory.java
@@ -21,7 +21,6 @@ package org.apache.sling.scripting.javascript.helper;
import java.util.HashMap;
import java.util.Map;
-import org.apache.sling.api.scripting.LazyBindings;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.WrapFactory;
@@ -68,11 +67,7 @@ public class SlingWrapFactory extends WrapFactory {
}
if (result == null) {
- if (javaObject instanceof LazyBindings.Supplier) {
- result = super.wrapAsJavaObject(cx, scope, ((LazyBindings.Supplier) javaObject).get(), staticType);
- } else {
- result = super.wrapAsJavaObject(cx, scope, javaObject, staticType);
- }
+ result = super.wrapAsJavaObject(cx, scope, javaObject, staticType);
}
return result;
diff --git a/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngine.java b/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngine.java
index f49a661..fddce2b 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngine.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngine.java
@@ -32,6 +32,7 @@ import javax.script.ScriptEngineFactory;
import javax.script.ScriptException;
import org.apache.commons.io.IOUtils;
+import org.apache.sling.api.scripting.LazyBindings;
import org.apache.sling.api.scripting.SlingBindings;
import org.apache.sling.api.scripting.SlingScriptHelper;
import org.apache.sling.commons.classloader.DynamicClassLoader;
@@ -169,6 +170,9 @@ public class RhinoJavaScriptEngine extends AbstractSlingScriptEngine implements
Entry<?, ?> entry = (Entry<?, ?>) entryObject;
String name = (String) entry.getKey();
Object value = entry.getValue();
+ if (value instanceof LazyBindings.Supplier) {
+ value = ((LazyBindings.Supplier) value).get();
+ }
if (value != null) {
// get the current property value, if set
diff --git a/src/test/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineTest.java b/src/test/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineTest.java
index 7c68c5b..63fb572 100644
--- a/src/test/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineTest.java
+++ b/src/test/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineTest.java
@@ -23,6 +23,7 @@ import javax.script.ScriptEngine;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
+import org.apache.sling.api.scripting.LazyBindings;
import org.apache.sling.scripting.api.ScriptCache;
import org.apache.sling.scripting.javascript.helper.SlingWrapFactory;
import org.mockito.Mockito;
@@ -51,6 +52,33 @@ public class RhinoJavaScriptEngineTest extends TestCase {
assertEquals(2.0, result);
}
+ public void testNullSuppliedValue() throws ScriptException {
+ MockRhinoJavaScriptEngineFactory factory = new MockRhinoJavaScriptEngineFactory();
+ ScriptEngine engine = factory.getScriptEngine();
+ Bindings context = new LazyBindings();
+ context.put("suppliedNullValue", (LazyBindings.Supplier) () -> null);
+ Object result = engine.eval("1 + 1", context);
+ assertEquals(2, result);
+ Throwable throwable = null;
+ try {
+ engine.eval("suppliedNullValue === undefined", context);
+ } catch (ScriptException e) {
+ throwable = e;
+ }
+ assertNotNull(throwable);
+ assertTrue(throwable.getMessage().contains("\"suppliedNullValue\" is not defined"));
+ }
+
+ public void testNotNullSuppliedValue() throws ScriptException {
+ MockRhinoJavaScriptEngineFactory factory = new MockRhinoJavaScriptEngineFactory();
+ ScriptEngine engine = factory.getScriptEngine();
+ Bindings context = new LazyBindings();
+ context.put("suppliedNotNullValue", (LazyBindings.Supplier) () -> 42);
+ Object result = engine.eval("0 + suppliedNotNullValue", context);
+ // Java provided values will be wrapped and then unwrapped as Doubles
+ assertEquals(42.0, result);
+ }
+
private static class MockRhinoJavaScriptEngineFactory extends RhinoJavaScriptEngineFactory {
protected SlingWrapFactory wrapFactory;