protected GatewayFilter toFilter()

in sra/src/main/java/org/apache/syncope/sra/RouteProvider.java [131:405]


    protected GatewayFilter toFilter(final SRARouteTO route, final SRARouteFilter gwfilter)
            throws ClassNotFoundException, NumberFormatException {

        GatewayFilter filter;

        switch (gwfilter.getFactory()) {
            case ADD_REQUEST_HEADER:
                String[] addRequestHeaderArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(AddRequestHeaderGatewayFilterFactory.class).
                        apply(c -> c.setName(addRequestHeaderArgs[0].trim()).
                        setValue(addRequestHeaderArgs[1].trim()));
                break;

            case ADD_REQUEST_PARAMETER:
                String[] addRequestParameterArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(AddRequestParameterGatewayFilterFactory.class).
                        apply(c -> c.setName(addRequestParameterArgs[0].trim()).
                        setValue(addRequestParameterArgs[1].trim()));
                break;

            case ADD_RESPONSE_HEADER:
                String[] addResponseHeaderArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(AddResponseHeaderGatewayFilterFactory.class).
                        apply(c -> c.setName(addResponseHeaderArgs[0].trim()).
                        setValue(addResponseHeaderArgs[1].trim()));
                break;

            case DEDUPE_RESPONSE_HEADER:
                String[] dedupeResponseHeaderArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(DedupeResponseHeaderGatewayFilterFactory.class).
                        apply(c -> {
                            c.setName(dedupeResponseHeaderArgs[0].trim());
                            if (dedupeResponseHeaderArgs.length > 1) {
                                c.setStrategy(DedupeResponseHeaderGatewayFilterFactory.Strategy.
                                        valueOf(dedupeResponseHeaderArgs[1].trim()));
                            }
                        });
                break;

            case FALLBACK_HEADERS:
                String[] fallbackHeadersArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(FallbackHeadersGatewayFilterFactory.class).
                        apply(c -> {
                            if (StringUtils.isNotBlank(fallbackHeadersArgs[0])) {
                                c.setExecutionExceptionTypeHeaderName(fallbackHeadersArgs[0].trim());
                            }
                            if (StringUtils.isNotBlank(fallbackHeadersArgs[1])) {
                                c.setExecutionExceptionMessageHeaderName(fallbackHeadersArgs[1].trim());
                            }
                            if (StringUtils.isNotBlank(fallbackHeadersArgs[2])) {
                                c.setRootCauseExceptionTypeHeaderName(fallbackHeadersArgs[2].trim());
                            }
                            if (StringUtils.isNotBlank(fallbackHeadersArgs[3])) {
                                c.setRootCauseExceptionMessageHeaderName(fallbackHeadersArgs[3].trim());
                            }
                        });
                break;

            case MAP_REQUEST_HEADER:
                String[] mapRequestHeaderArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(MapRequestHeaderGatewayFilterFactory.class).
                        apply(c -> c.setFromHeader(mapRequestHeaderArgs[0].trim()).
                        setToHeader(mapRequestHeaderArgs[1].trim()));
                break;

            case PREFIX_PATH:
                filter = ctx.getBean(PrefixPathGatewayFilterFactory.class).
                        apply(c -> c.setPrefix(gwfilter.getArgs().trim()));
                break;

            case PRESERVE_HOST_HEADER:
                filter = ctx.getBean(PreserveHostHeaderGatewayFilterFactory.class).apply();
                break;

            case REDIRECT_TO:
                String[] redirectArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(RedirectToGatewayFilterFactory.class).
                        apply(redirectArgs[0].trim(), redirectArgs[1].trim());
                break;

            case REMOVE_REQUEST_HEADER:
                filter = ctx.getBean(RemoveRequestHeaderGatewayFilterFactory.class).
                        apply(c -> c.setName(gwfilter.getArgs().trim()));
                break;

            case REMOVE_RESPONSE_HEADER:
                filter = ctx.getBean(RemoveResponseHeaderGatewayFilterFactory.class).
                        apply(c -> c.setName(gwfilter.getArgs().trim()));
                break;

            case REQUEST_RATE_LIMITER:
                String[] requestRateLimiterArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(RequestRateLimiterGatewayFilterFactory.class).
                        apply(c -> {
                            if (StringUtils.isNotBlank(requestRateLimiterArgs[0])) {
                                c.setDenyEmptyKey(BooleanUtils.toBoolean(requestRateLimiterArgs[0].trim()));
                            }
                            if (StringUtils.isNotBlank(requestRateLimiterArgs[1])) {
                                c.setEmptyKeyStatus(requestRateLimiterArgs[1].trim());
                            }
                            if (StringUtils.isNotBlank(requestRateLimiterArgs[2])) {
                                c.setKeyResolver(ctx.getBean(requestRateLimiterArgs[2].trim(), KeyResolver.class));
                            }
                            if (StringUtils.isNotBlank(requestRateLimiterArgs[3])) {
                                c.setRateLimiter(ctx.getBean(requestRateLimiterArgs[3].trim(), RateLimiter.class));
                            }
                            if (StringUtils.isNotBlank(requestRateLimiterArgs[4])) {
                                c.setStatusCode(HttpStatus.valueOf(requestRateLimiterArgs[4].trim()));
                            }
                        });
                break;

            case REWRITE_PATH:
                String[] rewritePathArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(RewritePathGatewayFilterFactory.class).
                        apply(c -> c.setRegexp(rewritePathArgs[0].trim()).
                        setReplacement(rewritePathArgs[1].trim()));
                break;

            case REWRITE_LOCATION:
                String[] rewriteLocationArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(RewriteLocationResponseHeaderGatewayFilterFactory.class).
                        apply(c -> {
                            c.setStripVersion(RewriteLocationResponseHeaderGatewayFilterFactory.StripVersion.
                                    valueOf(rewriteLocationArgs[0].trim()));
                            if (rewriteLocationArgs.length > 1) {
                                c.setLocationHeaderName(rewriteLocationArgs[1].trim());
                            }
                            if (rewriteLocationArgs.length > 2) {
                                c.setHostValue(rewriteLocationArgs[2].trim());
                            }
                            if (rewriteLocationArgs.length > 3) {
                                c.setProtocols(rewriteLocationArgs[3].trim());
                            }
                        });
                break;

            case REWRITE_RESPONSE_HEADER:
                String[] rewriteResponseHeaderArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(RewriteResponseHeaderGatewayFilterFactory.class).
                        apply(c -> c.setReplacement(rewriteResponseHeaderArgs[2].trim()).
                        setRegexp(rewriteResponseHeaderArgs[1].trim()).
                        setName(rewriteResponseHeaderArgs[0].trim()));
                break;

            case RETRY:
                Mutable<Integer> retries = new MutableObject<>();
                try {
                    retries.setValue(Integer.valueOf(gwfilter.getArgs().trim()));
                } catch (NumberFormatException e) {
                    LOG.error("Unexpected argument value: {}", gwfilter.getArgs().trim(), e);
                    retries.setValue(0);
                }
                filter = ctx.getBean(RetryGatewayFilterFactory.class).
                        apply(c -> c.setRetries(retries.getValue()));
                break;

            case SAVE_SESSION:
                filter = ctx.getBean(SaveSessionGatewayFilterFactory.class).apply(c -> {
                });
                break;

            case SECURE_HEADERS:
                filter = ctx.getBean(SecureHeadersGatewayFilterFactory.class).apply(c -> {
                });
                break;

            case SET_PATH:
                filter = ctx.getBean(SetPathGatewayFilterFactory.class).
                        apply(c -> c.setTemplate(gwfilter.getArgs().trim()));
                break;

            case SET_REQUEST_HEADER:
                String[] setRequestHeaderArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(SetRequestHeaderGatewayFilterFactory.class).
                        apply(c -> c.setName(setRequestHeaderArgs[0].trim()).
                        setValue(setRequestHeaderArgs[1].trim()));
                break;

            case SET_RESPONSE_HEADER:
                String[] setResponseHeaderArgs = gwfilter.getArgs().split(",");
                filter = ctx.getBean(SetResponseHeaderGatewayFilterFactory.class).
                        apply(c -> c.setName(setResponseHeaderArgs[0].trim()).
                        setValue(setResponseHeaderArgs[1].trim()));
                break;

            case SET_STATUS:
                filter = ctx.getBean(SetStatusGatewayFilterFactory.class).
                        apply(c -> c.setStatus(gwfilter.getArgs().trim()));
                break;

            case STRIP_PREFIX:
                Mutable<Integer> parts = new MutableObject<>();
                try {
                    parts.setValue(Integer.valueOf(gwfilter.getArgs().trim()));
                } catch (NumberFormatException e) {
                    LOG.error("Unexpected argument value: {}", gwfilter.getArgs().trim(), e);
                    parts.setValue(0);
                }
                filter = ctx.getBean(StripPrefixGatewayFilterFactory.class).
                        apply(c -> c.setParts(parts.getValue()));
                break;

            case REQUEST_HEADER_TO_REQUEST_URI:
                filter = ctx.getBean(RequestHeaderToRequestUriGatewayFilterFactory.class).
                        apply(c -> c.setName(gwfilter.getArgs().trim()));
                break;

            case SET_REQUEST_SIZE:
                filter = ctx.getBean(RequestSizeGatewayFilterFactory.class).
                        apply(c -> c.setMaxSize(DataSize.ofBytes(Long.parseLong(gwfilter.getArgs().trim()))));
                break;

            case SET_REQUEST_HOST:
                filter = ctx.getBean(SetRequestHostHeaderGatewayFilterFactory.class).
                        apply(c -> c.setHost(gwfilter.getArgs().trim()));
                break;

            case LINK_REWRITE:
                filter = ApplicationContextUtils.getOrCreateBean(
                        ctx,
                        LinkRewriteGatewayFilterFactory.class.getName(),
                        LinkRewriteGatewayFilterFactory.class).
                        apply(c -> c.setData(route.getTarget().toASCIIString() + "," + gwfilter.getArgs().trim()));
                break;

            case CLIENT_CERTS_TO_REQUEST_HEADER:
                String header = StringUtils.isBlank(gwfilter.getArgs()) ? "X-Client-Certificate" : gwfilter.getArgs();
                filter = ApplicationContextUtils.getOrCreateBean(
                        ctx,
                        ClientCertsToRequestHeaderFilterFactory.class.getName(),
                        ClientCertsToRequestHeaderFilterFactory.class).
                        apply(c -> c.setName(header.trim()));
                break;

            case QUERY_PARAM_TO_REQUEST_HEADER:
                filter = ApplicationContextUtils.getOrCreateBean(
                        ctx,
                        QueryParamToRequestHeaderFilterFactory.class.getName(),
                        QueryParamToRequestHeaderFilterFactory.class).
                        apply(c -> c.setName(gwfilter.getArgs().trim()));
                break;

            case PRINCIPAL_TO_REQUEST_HEADER:
                filter = ApplicationContextUtils.getOrCreateBean(
                        ctx,
                        PrincipalToRequestHeaderFilterFactory.class.getName(),
                        PrincipalToRequestHeaderFilterFactory.class).
                        apply(c -> c.setName(gwfilter.getArgs().trim()));
                break;

            case CUSTOM:
                String[] customArgs = gwfilter.getArgs().split(";");
                Consumer<CustomGatewayFilterFactory.Config> customConsumer = customArgs.length > 1
                        ? c -> c.setData(customArgs[1])
                        : c -> c.setData(null);
                CustomGatewayFilterFactory factory = ApplicationContextUtils.getOrCreateBean(
                        ctx,
                        customArgs[0],
                        CustomGatewayFilterFactory.class);
                filter = factory.getOrder().
                        map(order -> (GatewayFilter) new OrderedGatewayFilter(factory.apply(customConsumer), order)).
                        orElseGet(() -> factory.apply(customConsumer));
                break;

            default:
                filter = null;
        }

        if (filter == null) {
            throw new IllegalArgumentException("Could not translate " + gwfilter);
        }

        return filter instanceof Ordered ? filter : new OrderedGatewayFilter(filter, 0);
    }