public ExecutableContext prepareScriptContext()

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