in src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java [89:158]
public ExecutableContext prepareScriptContext(SlingHttpServletRequest request, SlingHttpServletResponse response,
ExecutableUnit executable)
throws IOException {
InternalScriptHelper scriptHelper = new InternalScriptHelper(executable.getBundleContext(), new SlingScriptAdapter(request.getResourceResolver(),
executable.getPath(), "sling/bundle/resource"), request, response,
executable.getServiceCache());
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(executable.getScriptEngineName());
if (scriptEngine == null) {
scriptEngine = scriptEngineManager.getEngineByExtension(executable.getScriptExtension());
if (scriptEngine == null) {
throw new IllegalStateException(String.format("Cannot find a script engine with name %s and extension %s for executable %s.",
executable.getScriptEngineName(), executable.getScriptExtension(), executable.getPath()));
}
}
// prepare the SlingBindings
Bindings bindings = new LazyBindings();
bindings.put("properties", (LazyBindings.Supplier) () -> scriptHelper.getRequest().getResource().getValueMap());
bindings.put(SlingBindings.REQUEST, scriptHelper.getRequest());
bindings.put(SlingBindings.RESPONSE, scriptHelper.getResponse());
bindings.put(SlingBindings.READER, scriptHelper.getRequest().getReader());
bindings.put(SlingBindings.OUT, scriptHelper.getResponse().getWriter());
bindings.put(SlingBindings.RESOURCE, scriptHelper.getRequest().getResource());
bindings.put(SlingBindings.RESOLVER, scriptHelper.getRequest().getResource().getResourceResolver());
Logger scriptLogger = LoggerFactory.getLogger(executable.getName());
bindings.put(SlingBindings.LOG, scriptLogger);
bindings.put(SlingBindings.SLING, scriptHelper);
bindings.put(BundledRenderUnit.VARIABLE, executable);
bindings.put(ScriptEngine.FILENAME, executable.getPath());
bindings.put(ScriptEngine.FILENAME.replace(".", "_"), executable.getPath());
ProtectedBindings protectedBindings = new ProtectedBindings(bindings, PROTECTED_BINDINGS);
long inclusionStart = System.nanoTime();
for (BindingsValuesProvider bindingsValuesProvider : bvpTracker.getBindingsValuesProviders(scriptEngine.getFactory(),
BindingsValuesProvider.DEFAULT_CONTEXT)) {
long start = System.nanoTime();
bindingsValuesProvider.addBindings(protectedBindings);
long stop = System.nanoTime();
LOG.trace("Invoking addBindings() of {} took {} nanoseconds",
bindingsValuesProvider.getClass().getName(), stop-start);
if (stop-start > WARN_LIMIT_FOR_BVP_NANOS) {
// SLING-11182 - make this work with older implementations of the Sling API
if (request.getRequestProgressTracker() != null) {
request.getRequestProgressTracker().log(String.format(BINDINGS_THRESHOLD_MESSAGE, bindingsValuesProvider.getClass().getName(),
(stop-start)/1000, WARN_LIMIT_FOR_BVP_NANOS/1000));
} else {
if (LOG.isInfoEnabled()) {
LOG.info(String.format(BINDINGS_THRESHOLD_MESSAGE, bindingsValuesProvider.getClass().getName(), (stop-start)/1000,
WARN_LIMIT_FOR_BVP_NANOS/1000));
}
}
}
}
// SLING-11182 - make this work with older implementations of the Sling API
if (request.getRequestProgressTracker() != null) {
long duration = (System.nanoTime() - inclusionStart) / 1000;
request.getRequestProgressTracker().log("Adding bindings took " + duration + " microseconds");
}
ScriptContext scriptContext = new BundledScriptContext();
Map<String, LazyBindings.Supplier> slingBindingsSuppliers = new HashMap<>();
slingBindingsSuppliers.put(SlingScriptConstants.ATTR_SCRIPT_RESOURCE_RESOLVER,
() -> scriptingResourceResolverProvider.getRequestScopedResourceResolver());
LazyBindings slingScopeBindings = new LazyBindings(slingBindingsSuppliers);
scriptContext.setBindings(slingScopeBindings, SlingScriptConstants.SLING_SCOPE);
scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
scriptContext.setErrorWriter(new LogWriter(scriptLogger));
scriptContext.setWriter(scriptHelper.getResponse().getWriter());
scriptContext.setReader(scriptHelper.getRequest().getReader());
return new ExecutableContext(scriptContext, executable, scriptEngine);
}