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);
}
}