FilterChainHolder getFilterChain()

in aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java [91:141]


    FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servlet) {
        String targetPath = request.getRequestURI();
        DispatcherType type = request.getDispatcherType();

        // only return the cached result if the filter list hasn't changed in the meanwhile
        if (getFilterHolders().size() == filtersSize && getFilterChainCache(type, targetPath, servlet) != null) {
            return getFilterChainCache(type, targetPath, servlet);
        }

        AwsServletRegistration servletRegistration = (AwsServletRegistration)servletContext.getServletRegistrations()
                .values().stream()
                .filter((Predicate<ServletRegistration>) servletRegistration1 -> ((AwsServletRegistration) servletRegistration1).getServlet().equals(servlet))
                .findFirst().orElse(null);

        FilterChainHolder chainHolder = new FilterChainHolder();

        Map<String, FilterHolder> registrations = getFilterHolders();
        if (registrations == null || registrations.size() == 0) {
            if (servletRegistration != null) {
                chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servletRegistration), servletContext));
            }
            return chainHolder;
        }
        for (Map.Entry<String, FilterHolder> entry : registrations.entrySet()) {
            FilterHolder holder = entry.getValue();
            // we only check the dispatcher type if it's not empty. Otherwise we assume it's a REQUEST as per section 6.2.5
            // of servlet specs
            if (holder.getRegistration().getDispatcherTypes().size() > 0 && !holder.getRegistration().getDispatcherTypes().contains(type)) {
                continue;
            }
            for (String path : holder.getRegistration().getUrlPatternMappings()) {
                if (pathMatches(targetPath, path)) {
                    chainHolder.addFilter(holder);
                }
            }

            // TODO: We do not allow programmatic registration of servlets so we never check for servlet name
            // we assume we only ever have one servlet.
        }

        if (servletRegistration != null) {
            chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servletRegistration), servletContext));
        }

        putFilterChainCache(type, targetPath, servlet, chainHolder);
        // update total filter size
        if (filtersSize != registrations.size()) {
            filtersSize = registrations.size();
        }
        return chainHolder;
    }