public Object call()

in src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/URIManipulationFilterExtension.java [71:111]


    public Object call(RenderContext renderContext, Object... arguments) {
        ExtensionUtils.checkArgumentCount(RuntimeExtension.URI_MANIPULATION, arguments, 2);
        RuntimeObjectModel runtimeObjectModel = renderContext.getObjectModel();
        String uriString = runtimeObjectModel.toString(arguments[0]);
        Map<String, Object> options = runtimeObjectModel.toMap(arguments[1]);

        try {
            URI originalUri = new URI(uriString);
            // read in https://docs.oracle.com/javase/7/docs/api/java/net/URI.html in section "Identities"
            // which constructors to use for which use case
            final URI transformedUri;
            final String scheme = getOption(SCHEME, options, originalUri.getScheme(), true);
            final String fragment = getOption(FRAGMENT, options, originalUri.getFragment(), false);

            // first check which type of URI
            if (originalUri.isOpaque()) {
                // only scheme and fragment is relevant
                transformedUri = new URI(scheme, originalUri.getSchemeSpecificPart(), fragment);
                return transformedUri.toString();
            } else {
                // only server-based authorities are supported
                try {
                    originalUri = originalUri.parseServerAuthority();
                } catch (URISyntaxException e) {
                    LOG.warn("Only server-based authorities are supported for non-opaque URLs");
                    throw e;
                }
                final String host = getOption(DOMAIN, options, originalUri.getHost(), true);
                final String path = getPath(runtimeObjectModel, originalUri.getPath(), options, scheme != null || host != null);
                final String escapedQuery = getEscapedQuery(runtimeObjectModel, originalUri.getRawQuery(), options);

                // the URI constructor will escape the % in the query part again, we must revert that
                transformedUri = new URI(scheme, originalUri.getUserInfo(), host, originalUri.getPort(), path, escapedQuery,
                        fragment);
                return unescapePercentInQuery(transformedUri.toString());
            }
        } catch (URISyntaxException e) {
            LOG.warn("Cannot manipulate invalid URI '{}'", uriString, e);
        }
        return uriString;
    }