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 2020/04/17 18:29:31 UTC
[sling-org-apache-sling-scripting-sightly-js-provider] branch
master updated: SLING-9320 - Allow bundled render units to access objects
from the same bundle through the Use API
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-sightly-js-provider.git
The following commit(s) were added to refs/heads/master by this push:
new 6ebafff SLING-9320 - Allow bundled render units to access objects from the same bundle through the Use API
6ebafff is described below
commit 6ebafff6d81367a3b7fb2ab942795f7a73972668
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Fri Apr 17 20:27:36 2020 +0200
SLING-9320 - Allow bundled render units to access objects from the same bundle through the Use API
* updated the JsUseProvider to work with bundled render units
---
pom.xml | 2 +-
.../scripting/sightly/js/impl/JsEnvironment.java | 84 +++++++++------------
.../scripting/sightly/js/impl/JsUseProvider.java | 27 ++++---
.../js/impl/jsapi/SlyBindingsValuesProvider.java | 28 +++++--
.../sightly/js/impl/use/DependencyResolver.java | 87 +++++++++++++++++-----
.../scripting/sightly/js/impl/use/UseFunction.java | 47 ++++++------
6 files changed, 171 insertions(+), 104 deletions(-)
diff --git a/pom.xml b/pom.xml
index 2ef2b5b..184e345 100644
--- a/pom.xml
+++ b/pom.xml
@@ -122,7 +122,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.scripting.sightly</artifactId>
- <version>1.3.1-1.4.0-SNAPSHOT</version>
+ <version>1.4.0-1.4.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
index 98671f3..d0fd050 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
@@ -18,11 +18,6 @@
******************************************************************************/
package org.apache.sling.scripting.sightly.js.impl;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.ScriptContext;
@@ -31,7 +26,6 @@ import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
import org.apache.commons.io.IOUtils;
-import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.scripting.LazyBindings;
import org.apache.sling.scripting.core.ScriptNameAwareReader;
import org.apache.sling.scripting.sightly.SightlyException;
@@ -44,6 +38,7 @@ import org.apache.sling.scripting.sightly.js.impl.loop.EventLoopInterop;
import org.apache.sling.scripting.sightly.js.impl.loop.Task;
import org.apache.sling.scripting.sightly.js.impl.use.DependencyResolver;
import org.apache.sling.scripting.sightly.js.impl.use.UseFunction;
+import org.jetbrains.annotations.NotNull;
import org.mozilla.javascript.Context;
import org.slf4j.LoggerFactory;
@@ -54,10 +49,13 @@ public class JsEnvironment {
private final ScriptEngine jsEngine;
private final Bindings engineBindings;
+ private final DependencyResolver dependencyResolver;
private EventLoop eventLoop;
- public JsEnvironment(ScriptEngine jsEngine) {
+ public JsEnvironment(@NotNull ScriptEngine jsEngine,
+ @NotNull DependencyResolver dependencyResolver) {
this.jsEngine = jsEngine;
+ this.dependencyResolver = dependencyResolver;
engineBindings = new LazyBindings();
TimingBindingsValuesProvider.INSTANCE.addBindings(engineBindings);
}
@@ -76,67 +74,59 @@ public class JsEnvironment {
Context.exit();
}
- public void runResource(Resource scriptResource, Bindings globalBindings, Bindings arguments, UnaryCallback callback) {
+ public void runScript(ScriptNameAwareReader reader, Bindings globalBindings, Bindings arguments, UnaryCallback callback) {
ScriptContext scriptContext = new SimpleScriptContext();
CommonJsModule module = new CommonJsModule();
- Bindings scriptBindings = buildBindings(scriptResource, globalBindings, arguments, module);
+ Bindings scriptBindings = buildBindings(reader, globalBindings, arguments, module);
scriptContext.setBindings(scriptBindings, ScriptContext.ENGINE_SCOPE);
- scriptContext.setAttribute(ScriptEngine.FILENAME, scriptResource.getPath(), ScriptContext.ENGINE_SCOPE);
- runScript(scriptResource, scriptContext, callback, module);
+ scriptContext.setAttribute(ScriptEngine.FILENAME, reader.getScriptName(), ScriptContext.ENGINE_SCOPE);
+ runScript(reader, scriptContext, callback, module);
}
- public AsyncContainer runResource(Resource scriptResource, Bindings globalBindings, Bindings arguments) {
+ public AsyncContainer runScript(ScriptNameAwareReader reader, Bindings globalBindings, Bindings arguments) {
AsyncContainer asyncContainer = new AsyncContainer();
- runResource(scriptResource, globalBindings, arguments, asyncContainer.createCompletionCallback());
+ runScript(reader, globalBindings, arguments, asyncContainer.createCompletionCallback());
return asyncContainer;
}
- private Bindings buildBindings(Resource scriptResource, Bindings local, Bindings arguments, CommonJsModule commonJsModule) {
+ private Bindings buildBindings(ScriptNameAwareReader reader, Bindings globalBindings, Bindings arguments, CommonJsModule commonJsModule) {
Bindings bindings = new LazyBindings();
bindings.putAll(engineBindings);
- DependencyResolver dependencyResolver = new DependencyResolver(scriptResource, this, local);
- UseFunction useFunction = new UseFunction(dependencyResolver, arguments);
+ UseFunction useFunction = new UseFunction(this, dependencyResolver, globalBindings, arguments);
bindings.put(Variables.JS_USE, useFunction);
bindings.put(Variables.MODULE, commonJsModule);
bindings.put(Variables.EXPORTS, commonJsModule.getExports());
- bindings.put(Variables.CONSOLE, new Console(LoggerFactory.getLogger(scriptResource.getName())));
- bindings.putAll(local);
+ bindings.put(Variables.CONSOLE, new Console(LoggerFactory.getLogger(reader.getScriptName())));
+ bindings.putAll(globalBindings);
return bindings;
}
- private void runScript(Resource scriptResource, ScriptContext scriptContext, UnaryCallback callback, CommonJsModule commonJsModule) {
- eventLoop.schedule(scriptTask(scriptResource, scriptContext, callback, commonJsModule));
+ private void runScript(ScriptNameAwareReader reader, ScriptContext scriptContext, UnaryCallback callback, CommonJsModule commonJsModule) {
+ eventLoop.schedule(scriptTask(reader, scriptContext, callback, commonJsModule));
}
- private Task scriptTask(final Resource scriptResource, final ScriptContext scriptContext,
+ private Task scriptTask(final ScriptNameAwareReader reader, final ScriptContext scriptContext,
final UnaryCallback callback, final CommonJsModule commonJsModule) {
- return new Task(new Runnable() {
- @Override
- public void run() {
- Reader reader = null;
- try {
- Object result;
- if (jsEngine instanceof Compilable) {
- reader = new ScriptNameAwareReader(new InputStreamReader(scriptResource.adaptTo(InputStream.class),
- StandardCharsets.UTF_8), scriptResource.getPath());
- result = ((Compilable) jsEngine).compile(reader).eval(scriptContext);
- } else {
- reader = new InputStreamReader(scriptResource.adaptTo(InputStream.class), StandardCharsets.UTF_8);
- result = jsEngine.eval(reader, scriptContext);
- }
- if (commonJsModule.isModified()) {
- result = commonJsModule.getExports();
- }
- if (result instanceof AsyncContainer) {
- ((AsyncContainer) result).addListener(callback);
- } else {
- callback.invoke(result);
- }
- } catch (ScriptException e) {
- throw new SightlyException(e);
- } finally {
- IOUtils.closeQuietly(reader);
+ return new Task(() -> {
+ try {
+ Object result;
+ if (jsEngine instanceof Compilable) {
+ result = ((Compilable) jsEngine).compile(reader).eval(scriptContext);
+ } else {
+ result = jsEngine.eval(reader, scriptContext);
+ }
+ if (commonJsModule.isModified()) {
+ result = commonJsModule.getExports();
+ }
+ if (result instanceof AsyncContainer) {
+ ((AsyncContainer) result).addListener(callback);
+ } else {
+ callback.invoke(result);
}
+ } catch (ScriptException e) {
+ throw new SightlyException(e);
+ } finally {
+ IOUtils.closeQuietly(reader);
}
});
}
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
index 948cef3..d5c6b58 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
@@ -22,21 +22,25 @@ import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
-import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.scripting.SlingScriptHelper;
+import org.apache.sling.api.scripting.LazyBindings;
import org.apache.sling.scripting.api.resource.ScriptingResourceResolverProvider;
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
import org.apache.sling.scripting.sightly.SightlyException;
+import org.apache.sling.scripting.sightly.engine.BundledUnitManager;
import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer;
import org.apache.sling.scripting.sightly.js.impl.async.AsyncExtractor;
import org.apache.sling.scripting.sightly.js.impl.jsapi.ProxyAsyncScriptableFactory;
import org.apache.sling.scripting.sightly.js.impl.rhino.JsValueAdapter;
+import org.apache.sling.scripting.sightly.js.impl.use.DependencyResolver;
import org.apache.sling.scripting.sightly.render.RenderContext;
import org.apache.sling.scripting.sightly.use.ProviderOutcome;
import org.apache.sling.scripting.sightly.use.UseProvider;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
import org.osgi.service.metatype.annotations.AttributeDefinition;
/**
@@ -74,9 +78,13 @@ public class JsUseProvider implements UseProvider {
@Reference
private ScriptingResourceResolverProvider scriptingResourceResolverProvider;
+ @Reference(cardinality = ReferenceCardinality.OPTIONAL, policyOption = ReferencePolicyOption.GREEDY)
+ private BundledUnitManager bundledUnitManager;
+
@Override
public ProviderOutcome provide(String identifier, RenderContext renderContext, Bindings arguments) {
- Bindings globalBindings = renderContext.getBindings();
+ Bindings globalBindings = new LazyBindings();
+ globalBindings.putAll(renderContext.getBindings());
if (!Utils.isJsScript(identifier)) {
return ProviderOutcome.failure();
}
@@ -84,17 +92,16 @@ public class JsUseProvider implements UseProvider {
if (jsEngine == null) {
return ProviderOutcome.failure(new SightlyException("Failed to obtain a " + JS_ENGINE_NAME + " JavaScript engine."));
}
- SlingScriptHelper scriptHelper = Utils.getHelper(globalBindings);
JsEnvironment environment = null;
try {
- environment = new JsEnvironment(jsEngine);
- environment.initialize();
ResourceResolver slingScriptingResolver = scriptingResourceResolverProvider.getRequestScopedResourceResolver();
- Resource callerScript = slingScriptingResolver.getResource(scriptHelper.getScript().getScriptResource().getPath());
- Resource scriptResource = Utils.getScriptResource(callerScript, identifier, globalBindings);
- globalBindings.put(ScriptEngine.FILENAME, scriptResource.getPath());
+ DependencyResolver dependencyResolver = new DependencyResolver(slingScriptingResolver, bundledUnitManager);
+ environment = new JsEnvironment(jsEngine, dependencyResolver);
+ environment.initialize();
+ ScriptNameAwareReader reader = dependencyResolver.resolve(globalBindings, identifier);
+ globalBindings.put(ScriptEngine.FILENAME, reader.getScriptName());
proxyAsyncScriptableFactory.registerProxies(slingScriptingResolver, environment, globalBindings);
- AsyncContainer asyncContainer = environment.runResource(scriptResource, globalBindings, arguments);
+ AsyncContainer asyncContainer = environment.runScript(reader, globalBindings, arguments);
return ProviderOutcome.success(jsValueAdapter.adapt(asyncContainer));
} finally {
if (environment != null) {
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
index c129202..b11b3c8 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
@@ -21,6 +21,7 @@ package org.apache.sling.scripting.sightly.js.impl.jsapi;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.HashMap;
@@ -28,6 +29,7 @@ import java.util.LinkedHashMap;
import java.util.Map;
import javax.script.Bindings;
+import javax.script.ScriptEngine;
import javax.script.SimpleBindings;
import javax.servlet.http.HttpServletRequest;
@@ -37,6 +39,7 @@ import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.scripting.LazyBindings;
import org.apache.sling.api.scripting.SlingBindings;
import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
import org.apache.sling.scripting.sightly.SightlyException;
import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
import org.apache.sling.scripting.sightly.js.impl.Variables;
@@ -195,17 +198,30 @@ public class SlyBindingsValuesProvider {
if (resource == null) {
throw new SightlyException("Sly namespace loader could not find the following script: " + path);
}
- AsyncContainer container = jsEnvironment.runResource(resource, createBindings(bindings), new SimpleBindings());
- Object obj = container.getResult();
- if (!(obj instanceof Function)) {
- throw new SightlyException("Script " + path + " was expected to return a function.");
+ try {
+ AsyncContainer container =
+ jsEnvironment.runScript(
+ new ScriptNameAwareReader(
+ new StringReader(IOUtils.toString(resource.adaptTo(InputStream.class), StandardCharsets.UTF_8)),
+ resource.getPath()
+ ),
+ createBindings(bindings, resource.getPath()),
+ new SimpleBindings()
+ );
+ Object obj = container.getResult();
+ if (!(obj instanceof Function)) {
+ throw new SightlyException("Script " + path + " was expected to return a function.");
+ }
+ return (Function) obj;
+ } catch (IOException e) {
+ throw new SightlyException("Cannot read script " + path + " .");
}
- return (Function) obj;
}
- private Bindings createBindings(Bindings global) {
+ private Bindings createBindings(Bindings global, String factoryPath) {
Bindings bindings = new LazyBindings();
bindings.putAll(global);
+ bindings.put(ScriptEngine.FILENAME, factoryPath);
TimingBindingsValuesProvider.INSTANCE.addBindings(bindings);
return bindings;
}
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
index 46b7cfb..073b84a 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
@@ -19,40 +19,93 @@
package org.apache.sling.scripting.sightly.js.impl.use;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
import javax.script.Bindings;
+import javax.script.ScriptEngine;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.scripting.SlingScript;
+import org.apache.sling.api.scripting.SlingScriptHelper;
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
+import org.apache.sling.scripting.sightly.engine.BundledUnitManager;
import org.apache.sling.scripting.sightly.js.impl.Utils;
-import org.apache.sling.scripting.sightly.js.impl.async.UnaryCallback;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* Resolves dependencies specified by the Use function
*/
public class DependencyResolver {
- private final Resource caller;
- private final JsEnvironment jsEnvironment;
- private final Bindings globalBindings;
+ private final BundledUnitManager bundledUnitManager;
+ private final ResourceResolver scriptingResourceResolver;
- public DependencyResolver(Resource resource, JsEnvironment jsEnvironment, Bindings globalBindings) {
- this.caller = resource;
- this.jsEnvironment = jsEnvironment;
- this.globalBindings = globalBindings;
+ public DependencyResolver(@NotNull ResourceResolver scriptingResourceResolver, @Nullable BundledUnitManager bundledUnitManager) {
+ this.bundledUnitManager = bundledUnitManager;
+ this.scriptingResourceResolver = scriptingResourceResolver;
}
- /**
- * Resolve a dependency
- * @param dependency the dependency identifier
- * @param callback the callback that will receive the resolved dependency
- */
- public void resolve(String dependency, UnaryCallback callback) {
+ public @NotNull ScriptNameAwareReader resolve(Bindings bindings, String dependency) {
if (!Utils.isJsScript(dependency)) {
throw new SightlyException("Only JS scripts are allowed as dependencies. Invalid dependency: " + dependency);
}
- Resource scriptResource = Utils.getScriptResource(caller, dependency, globalBindings);
- jsEnvironment.runResource(scriptResource, globalBindings, Utils.EMPTY_BINDINGS, callback);
+ ScriptNameAwareReader reader = null;
+ IOException ioException = null;
+ try {
+ if (bundledUnitManager != null) {
+ URL script = bundledUnitManager.getScript(bindings, dependency);
+ if (script != null) {
+ reader = new ScriptNameAwareReader(new StringReader(IOUtils.toString(script, StandardCharsets.UTF_8)),
+ script.toExternalForm());
+ }
+ }
+ if (reader == null) {
+ Resource scriptResource = null;
+ if (dependency.startsWith("/")) {
+ scriptResource = scriptingResourceResolver.getResource(dependency);
+ }
+ if (scriptResource == null) {
+ SlingScriptHelper scriptHelper = Utils.getHelper(bindings);
+ if (scriptHelper != null) {
+ String callerName = (String) bindings.get(ScriptEngine.FILENAME);
+ Resource caller = null;
+ if (StringUtils.isNotEmpty(callerName)) {
+ caller = scriptingResourceResolver.getResource(callerName);
+ }
+ SlingScript slingScript = scriptHelper.getScript();
+ if (caller == null && slingScript != null) {
+ caller = scriptingResourceResolver.getResource(slingScript.getScriptResource().getPath());
+ }
+ if (caller != null) {
+ scriptResource = Utils.getScriptResource(caller, dependency, bindings);
+ }
+ }
+ }
+ if (scriptResource != null) {
+ reader = new ScriptNameAwareReader(new StringReader(IOUtils.toString(scriptResource.adaptTo(InputStream.class),
+ StandardCharsets.UTF_8)), scriptResource.getPath());
+ }
+ }
+ } catch (IOException e) {
+ ioException = e;
+ }
+ if (reader == null) {
+ SightlyException sightlyException = new SightlyException(String.format("Unable to load script dependency %s.", dependency));
+ if (ioException != null) {
+ sightlyException.initCause(ioException);
+ }
+ throw sightlyException;
+ }
+ return reader;
}
}
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
index fbfe132..2cb098b 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
@@ -19,13 +19,19 @@
package org.apache.sling.scripting.sightly.js.impl.use;
-import javax.script.Bindings;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import javax.script.Bindings;
+
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
+import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
+import org.apache.sling.scripting.sightly.js.impl.Utils;
+import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer;
+import org.apache.sling.scripting.sightly.js.impl.loop.EventLoopInterop;
+import org.apache.sling.scripting.sightly.js.impl.rhino.JsUtils;
import org.mozilla.javascript.BaseFunction;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
@@ -33,21 +39,21 @@ import org.mozilla.javascript.NativeArray;
import org.mozilla.javascript.NativeObject;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
-import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer;
-import org.apache.sling.scripting.sightly.js.impl.async.UnaryCallback;
-import org.apache.sling.scripting.sightly.js.impl.loop.EventLoopInterop;
-import org.apache.sling.scripting.sightly.js.impl.rhino.JsUtils;
/**
* The JavaScript {@code use} function
*/
public class UseFunction extends BaseFunction {
+ private final JsEnvironment jsEnvironment;
private final DependencyResolver dependencyResolver;
private final Scriptable thisObj;
+ private final Bindings globalBindings;
- public UseFunction(DependencyResolver dependencyResolver, Bindings arguments) {
+ public UseFunction(JsEnvironment jsEnvironment, DependencyResolver dependencyResolver, Bindings globalBindings, Bindings arguments) {
+ this.jsEnvironment = jsEnvironment;
this.dependencyResolver = dependencyResolver;
+ this.globalBindings = globalBindings;
this.thisObj = createThisBinding(arguments);
}
@@ -76,15 +82,13 @@ public class UseFunction extends BaseFunction {
final Object[] dependencies = new Object[depNames.size()];
for (int i = 0; i < depNames.size(); i++) {
final int dependencyPos = i;
- dependencyResolver.resolve(depNames.get(i), new UnaryCallback() {
- @Override
- public void invoke(Object arg) {
- counter[0]--;
- dependencies[dependencyPos] = arg;
- if (counter[0] == 0) {
- Object result = JsUtils.callFn(callback, cx, scope, thisObj, dependencies);
- asyncContainer.complete(result);
- }
+ ScriptNameAwareReader dependency = dependencyResolver.resolve(globalBindings, depNames.get(i));
+ jsEnvironment.runScript(dependency, globalBindings, Utils.EMPTY_BINDINGS, arg -> {
+ counter[0]--;
+ dependencies[dependencyPos] = arg;
+ if (counter[0] == 0) {
+ Object result = JsUtils.callFn(callback, cx, scope, thisObj, dependencies);
+ asyncContainer.complete(result);
}
});
}
@@ -93,12 +97,9 @@ public class UseFunction extends BaseFunction {
}
private void callImmediate(final Function callback, final AsyncContainer asyncContainer, final Context cx, final Scriptable scope) {
- EventLoopInterop.schedule(cx, new Runnable() {
- @Override
- public void run() {
- Object value = JsUtils.callFn(callback, cx, scope, thisObj, new Object[0]);
- asyncContainer.complete(value);
- }
+ EventLoopInterop.schedule(cx, () -> {
+ Object value = JsUtils.callFn(callback, cx, scope, thisObj, new Object[0]);
+ asyncContainer.complete(value);
});
}
@@ -118,7 +119,7 @@ public class UseFunction extends BaseFunction {
private List<String> decodeDepArray(NativeArray nativeArray) {
int depLength = (int) nativeArray.getLength();
- List<String> depNames = new ArrayList<String>(depLength);
+ List<String> depNames = new ArrayList<>(depLength);
for (int i = 0; i < depLength; i++) {
String depName = jsToString(nativeArray.get(i, nativeArray));
depNames.add(depName);