public ProviderOutcome provide()

in src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/JavaUseProvider.java [86:150]


    public ProviderOutcome provide(String identifier, RenderContext renderContext, Bindings arguments) {
        if (!Patterns.JAVA_CLASS_NAME.matcher(identifier).matches()) {
            LOG.debug("Identifier {} does not match a Java class name pattern.", identifier);
            return ProviderOutcome.failure();
        }
        Bindings globalBindings = renderContext.getBindings();
        SlingHttpServletRequest request = BindingsUtils.getRequest(globalBindings);
        Map<String, Object> overrides = setRequestAttributes(request, arguments);

        try {
            Exception failure = null;
            ClassLoader unitClassLoader = bundledUnitManager.getBundledRenderUnitClassloader(globalBindings);
            if (unitClassLoader != null) {
                try {
                    String className = identifier;
                    if (className.indexOf('.') < 0) {
                        // the class name is not fully qualified; need to prepend the package name of the current
                        // rendering unit
                        RenderUnit renderUnit = bundledUnitManager.getRenderUnit(globalBindings);
                        if (renderUnit != null) {
                            className = renderUnit.getClass().getPackage().getName() + "." + className;
                        }
                    }
                    Class<?> clazz = unitClassLoader.loadClass(className);
                    return loadObject(
                            clazz,
                            cls -> bundledUnitManager.getServiceForBundledRenderUnit(globalBindings, clazz),
                            globalBindings,
                            arguments);
                } catch (Exception e) {
                    // maybe the class will actually come from the repository
                    failure = e;
                }
            }
            if (slingHTLMasterCompiler != null) {
                Object result = slingHTLMasterCompiler.getResourceBackedUseObject(renderContext, identifier);
                if (result != null) {
                    if (result instanceof Use) {
                        ((Use) result).init(BindingsUtils.merge(globalBindings, arguments));
                    }
                    return ProviderOutcome.success(result);
                } else {
                    SlingScriptHelper slingScriptHelper = BindingsUtils.getHelper(globalBindings);
                    if (slingScriptHelper != null) {
                        try {
                            Class<?> clazz =
                                    slingHTLMasterCompiler.getClassLoader().loadClass(identifier);
                            return loadObject(clazz, slingScriptHelper::getService, globalBindings, arguments);
                        } catch (Exception e) {
                            failure = e;
                        }
                    }
                }
            }
            if (failure != null) {
                return ProviderOutcome.failure(failure);
            }
            return ProviderOutcome.failure();
        } catch (Exception e) {
            // any other exception is an error
            return ProviderOutcome.failure(e);
        } finally {
            resetRequestAttribute(request, overrides);
        }
    }