public ProviderOutcome provide()

in src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/RenderUnitProvider.java [90:160]


    public ProviderOutcome provide(String identifier, RenderContext renderContext, Bindings arguments) {
        if (identifier.endsWith("." + SightlyScriptEngineFactory.EXTENSION)) {
            Bindings globalBindings = renderContext.getBindings();
            SlingScriptHelper sling = BindingsUtils.getHelper(globalBindings);
            SlingHttpServletRequest request = BindingsUtils.getRequest(globalBindings);
            final Resource renderUnitResource = scriptDependencyResolver.resolveScript(renderContext, identifier);
            if (renderUnitResource == null) {
                // attempt to find a bundled render unit that does not expose a servlet resource via the search paths
                RenderUnit renderUnit = bundledUnitManager.getRenderUnit(globalBindings, identifier);
                if (renderUnit != null) {
                    return ProviderOutcome.success(renderUnit);
                }
                Resource caller = ResourceResolution.getResourceForRequest(request.getResourceResolver(), request);
                if (caller != null) {
                    String resourceSuperType = caller.getResourceSuperType();
                    StringBuilder errorMessage = new StringBuilder("Cannot find resource ");
                    errorMessage.append(identifier).append(" for base path ").append(caller.getPath());
                    if (StringUtils.isNotEmpty(resourceSuperType)) {
                        errorMessage.append(" with resource super type ").append(resourceSuperType);
                    }
                    errorMessage.append(".");
                    return ProviderOutcome.failure(new SightlyException(errorMessage.toString()));
                } else {
                    return ProviderOutcome.failure(new SightlyException("Cannot resolve template " + identifier + " for script " + sling
                            .getScript().getScriptResource().getPath()));
                }
            }
            try {
                if ("true".equalsIgnoreCase((String) renderUnitResource.getResourceMetadata().get("sling.servlet.resource"))) {
                    BundledRenderUnit bundledRenderUnit = renderUnitResource.adaptTo(BundledRenderUnit.class);
                    if (bundledRenderUnit != null && bundledRenderUnit.getUnit() instanceof RenderUnit) {
                        return ProviderOutcome.success(bundledRenderUnit.getUnit());
                    }
                }
                CachedScript cachedScript = scriptCache.getScript(renderUnitResource.getPath());
                final SightlyCompiledScript compiledScript;
                if (cachedScript != null) {
                    compiledScript = (SightlyCompiledScript) cachedScript.getCompiledScript();
                } else {
                    SightlyScriptEngine sightlyScriptEngine =
                            (SightlyScriptEngine) scriptEngineManager.getEngineByName(SightlyScriptEngineFactory.SHORT_NAME);
                    String encoding = renderUnitResource.getResourceMetadata().getCharacterEncoding();
                    if (StringUtils.isEmpty(encoding)) {
                        encoding = "UTF-8";
                    }
                    InputStream inputStream = renderUnitResource.adaptTo(InputStream.class);
                    if (inputStream == null) {
                        return ProviderOutcome.failure();
                    }
                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream, encoding);
                    ScriptNameAwareReader reader = new ScriptNameAwareReader(inputStreamReader, renderUnitResource.getPath());
                    compiledScript = (SightlyCompiledScript) sightlyScriptEngine.compile(reader);
                    scriptCache.putScript(new CachedScript() {
                        @Override
                        public String getScriptPath() {
                            return renderUnitResource.getPath();
                        }

                        @Override
                        public CompiledScript getCompiledScript() {
                            return compiledScript;
                        }
                    });
                }
                return ProviderOutcome.success(compiledScript.getRenderUnit());
            } catch (Exception e) {
                return ProviderOutcome.failure(e);
            }
        }
        return ProviderOutcome.failure();
    }