public ProviderOutcome provide()

in src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/ScriptUseProvider.java [108:146]


    public ProviderOutcome provide(String scriptName, RenderContext renderContext, Bindings arguments) {
        Bindings globalBindings = renderContext.getBindings();
        Bindings bindings = BindingsUtils.merge(globalBindings, arguments);
        String extension = scriptExtension(scriptName);
        if (extension == null || extension.equals(SightlyScriptEngineFactory.EXTENSION)) {
            return ProviderOutcome.failure();
        }
        URL script = bundledUnitManager.getScript(bindings, scriptName);
        if (script != null) {
            String scriptUrlAsString = script.toExternalForm();
            bindings.remove(BundledRenderUnit.VARIABLE);
            bindings.put(ScriptEngine.FILENAME, scriptUrlAsString);
            ScriptEngineManager scriptEngineManager = getScriptEngineManager();
            if (scriptEngineManager == null) {
                return ProviderOutcome.failure(new SightlyException("Failed to obtain a ScriptEngineManager."));
            }
            ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension(extension);
            if (scriptEngine != null) {
                try (ScriptNameAwareReader reader = new ScriptNameAwareReader(
                        new InputStreamReader(script.openStream(), StandardCharsets.UTF_8), scriptUrlAsString)) {
                    if (scriptEngine instanceof Compilable) {
                        Compilable compilableScriptEngine = (Compilable) scriptEngine;
                        CompiledScript compiledScript = compilableScriptEngine.compile(reader);
                        return ProviderOutcome.notNullOrFailure(compiledScript.eval(bindings));
                    } else {
                        return ProviderOutcome.notNullOrFailure(scriptEngine.eval(reader, bindings));
                    }
                } catch (Exception e) {
                    return ProviderOutcome.failure(e);
                }
            }
        }
        Resource scriptResource = scriptDependencyResolver.resolveScript(renderContext, scriptName);
        if (scriptResource == null) {
            log.debug("Path does not match an existing resource: {}", scriptName);
            return ProviderOutcome.failure();
        }
        return evalScript(scriptResource, bindings);
    }