public ExecutableContext prepareScriptContext()

in src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java [86:171]


    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);
    }