Bindings verifySlingBindings()

in src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java [645:780]


    Bindings verifySlingBindings(final SlingBindings slingBindings) throws IOException {

        final Bindings bindings = new LazyBindings();

        final SlingHttpServletRequest request = slingBindings.getRequest();

        // check sling object
        Object slingObject = slingBindings.get(SLING);
        if (slingObject == null) {

            if (request != null) {
                slingObject = new InternalScriptHelper(
                        this.bundleContext, this, request, slingBindings.getResponse(), this.cache);
            } else {
                slingObject = new InternalScriptHelper(this.bundleContext, this, this.cache);
            }
        } else if (!(slingObject instanceof SlingScriptHelper)) {
            throw fail(SLING, "Wrong type");
        }
        final SlingScriptHelper sling = (SlingScriptHelper) slingObject;
        bindings.put(SLING, sling);

        if (request != null) {
            final SlingHttpServletResponse response = slingBindings.getResponse();
            if (response == null) {
                throw fail(RESPONSE, "Missing or wrong type");
            }

            Object resourceObject = slingBindings.get(RESOURCE);
            if (resourceObject != null && !(resourceObject instanceof Resource)) {
                throw fail(RESOURCE, "Wrong type");
            }

            Object resolverObject = slingBindings.get(RESOLVER);
            if (resolverObject != null && !(resolverObject instanceof ResourceResolver)) {
                throw fail(RESOLVER, "Wrong type");
            }

            Object writerObject = slingBindings.get(OUT);
            if (writerObject != null && !(writerObject instanceof PrintWriter)) {
                throw fail(OUT, "Wrong type");
            }

            // if there is a provided sling script helper, check arguments
            if (slingBindings.get(SLING) != null) {

                if (sling.getRequest() != request) {
                    throw fail(REQUEST, "Not the same as request field of SlingScriptHelper");
                }

                if (sling.getResponse() != response) {
                    throw fail(RESPONSE, "Not the same as response field of SlingScriptHelper");
                }

                if (resourceObject != null && sling.getRequest().getResource() != resourceObject) {
                    throw fail(RESOURCE, "Not the same as resource of the SlingScriptHelper request");
                }

                if (resolverObject != null && sling.getRequest().getResourceResolver() != resolverObject) {
                    throw fail(
                            RESOLVER,
                            "Not the same as the resource resolver of the SlingScriptHelper request's resolver");
                }

                if (writerObject != null && sling.getResponse().getWriter() != writerObject) {
                    throw fail(OUT, "Not the same as writer of the SlingScriptHelper response");
                }
            }

            // set base variables when executing inside a request
            bindings.put(REQUEST, sling.getRequest());
            bindings.put(READER, sling.getRequest().getReader());
            bindings.put(RESPONSE, sling.getResponse());
            bindings.put(RESOURCE, sling.getRequest().getResource());
            bindings.put(RESOLVER, sling.getRequest().getResourceResolver());
            bindings.put(OUT, sling.getResponse().getWriter());
        }

        Object logObject = slingBindings.get(LOG);
        if (logObject == null) {
            logObject = LoggerFactory.getLogger(getLoggerName());
        } else if (!(logObject instanceof Logger)) {
            throw fail(LOG, "Wrong type");
        }
        bindings.put(LOG, logObject);

        // copy non-base variables
        for (Map.Entry<String, Object> entry : slingBindings.entrySet()) {
            if (!bindings.containsKey(entry.getKey())) {
                bindings.put(entry.getKey(), entry.getValue());
            }
        }

        if (!bindingsValuesProviders.isEmpty()) {
            Set<String> protectedKeys = new HashSet<>();
            protectedKeys.addAll(PROTECTED_KEYS);
            ProtectedBindings protectedBindings = new ProtectedBindings(bindings, protectedKeys);

            long inclusionStart = System.nanoTime();
            for (BindingsValuesProvider provider : bindingsValuesProviders) {
                long start = System.nanoTime();
                provider.addBindings(protectedBindings);
                long stop = System.nanoTime();
                LOGGER.trace(
                        "Invoking addBindings() of {} took {} nanoseconds",
                        provider.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 != null && request.getRequestProgressTracker() != null) {
                        request.getRequestProgressTracker()
                                .log(String.format(
                                        BINDINGS_THRESHOLD_MESSAGE,
                                        provider.getClass().getName(),
                                        (stop - start) / 1000,
                                        WARN_LIMIT_FOR_BVP_NANOS / 1000));
                    } else {
                        if (LOGGER.isInfoEnabled()) {
                            LOGGER.info(String.format(
                                    BINDINGS_THRESHOLD_MESSAGE,
                                    provider.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 != null && request.getRequestProgressTracker() != null) {
                long duration = (System.nanoTime() - inclusionStart) / 1000;
                request.getRequestProgressTracker().log("Adding bindings took " + duration + " microseconds");
            }
        }

        return bindings;
    }