public void service()

in src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java [617:716]


        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

            SlingJakartaHttpServletRequest slingRequest = (SlingJakartaHttpServletRequest) req;

            Map<Bundle, List<ServiceRegistration<Servlet>>> tracked;
            BundleTracker<List<ServiceRegistration<Servlet>>> bt = tracker.get();
            if (bt != null) {
                tracked = bt.getTracked();
            } else {
                tracked = Collections.emptyMap();
            }
            BundleContext bc = bundleContext.get();
            final Bundle bcBundle = bc == null ? null : bc.getBundle();

            final Converter c = Converters.standardConverter();
            Optional<ServiceRegistration<Servlet>> target = tracked.values().stream()
                    .flatMap(List::stream)
                    .filter(reg -> !reg.getReference().getBundle().equals(bcBundle))
                    .filter(reg -> getResourceTypeVersion(reg.getReference()) != null)
                    .filter(reg -> {
                        Map<String, Object> props = toProperties(reg);
                        return getResourceTypes(props).equals(resourceType)
                                && Arrays.asList(c.convert(props.get(ServletResolverConstants.SLING_SERVLET_METHODS))
                                                .defaultValue(new String[] {"GET", "HEAD"})
                                                .to(String[].class))
                                        .contains(slingRequest.getMethod())
                                && Arrays.asList(c.convert(props.get(ServletResolverConstants.SLING_SERVLET_EXTENSIONS))
                                                .defaultValue(new String[] {"html"})
                                                .to(String[].class))
                                        .contains(
                                                slingRequest
                                                                        .getRequestPathInfo()
                                                                        .getExtension()
                                                                == null
                                                        ? "html"
                                                        : slingRequest
                                                                .getRequestPathInfo()
                                                                .getExtension());
                    })
                    .min((left, right) -> {
                        boolean la = Arrays.asList(c.convert(toProperties(left)
                                                .get(ServletResolverConstants.SLING_SERVLET_SELECTORS))
                                        .to(String[].class))
                                .containsAll(Arrays.asList(
                                        slingRequest.getRequestPathInfo().getSelectors()));
                        boolean ra = Arrays.asList(c.convert(toProperties(right)
                                                .get(ServletResolverConstants.SLING_SERVLET_SELECTORS))
                                        .to(String[].class))
                                .containsAll(Arrays.asList(
                                        slingRequest.getRequestPathInfo().getSelectors()));
                        if ((la && ra) || (!la && !ra)) {
                            Version rightVersion = getResourceTypeVersion(right.getReference());
                            if (rightVersion == null) {
                                rightVersion = Version.emptyVersion;
                            }
                            Version leftVersion = getResourceTypeVersion(left.getReference());
                            if (leftVersion == null) {
                                leftVersion = Version.emptyVersion;
                            }
                            return rightVersion.compareTo(leftVersion);
                        } else if (la) {
                            return -1;
                        } else {
                            return 1;
                        }
                    });

            if (target.isPresent()) {
                String[] targetRT = c.convert(target.get()
                                .getReference()
                                .getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES))
                        .to(String[].class);
                if (targetRT.length == 0) {
                    ((SlingJakartaHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
                } else {
                    String rt = targetRT[0];
                    RequestDispatcherOptions options = new RequestDispatcherOptions();
                    options.setForceResourceType(rt);

                    RequestDispatcher dispatcher =
                            slingRequest.getRequestDispatcher(slingRequest.getResource(), options);
                    if (dispatcher != null) {
                        if (slingRequest.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH) == null) {
                            final String contentType = slingRequest.getResponseContentType();
                            if (contentType != null) {
                                res.setContentType(contentType);
                                if (contentType.startsWith("text/")) {
                                    res.setCharacterEncoding("UTF-8");
                                }
                            }
                        }
                        dispatcher.include(req, res);
                    } else {
                        ((SlingJakartaHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
                    }
                }
            } else {
                ((SlingJakartaHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
            }
        }