in src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java [542:628]
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) 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();
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(PropertiesUtil
.toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_METHODS),
new String[]{"GET", "HEAD"}))
.contains(slingRequest.getMethod()) &&
Arrays.asList(PropertiesUtil
.toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_EXTENSIONS), new String[]{"html"}))
.contains(slingRequest.getRequestPathInfo().getExtension() == null ? "html" :
slingRequest.getRequestPathInfo().getExtension());
}).min((left, right) ->
{
boolean la = Arrays.asList(PropertiesUtil
.toStringArray(toProperties(left).get(ServletResolverConstants.SLING_SERVLET_SELECTORS), new String[0]))
.containsAll(Arrays.asList(slingRequest.getRequestPathInfo().getSelectors()));
boolean ra = Arrays.asList(PropertiesUtil
.toStringArray(toProperties(right).get(ServletResolverConstants.SLING_SERVLET_SELECTORS), new String[0]))
.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 =
PropertiesUtil.toStringArray(target.get().getReference().getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
if (targetRT == null || targetRT.length == 0) {
((SlingHttpServletResponse) 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(SlingConstants.ATTR_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 {
((SlingHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
} else {
((SlingHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
}
}