in src/main/java/org/apache/sling/scripting/thymeleaf/internal/processor/SlingIncludeAttributeTagProcessor.java [138:191]
protected String dispatch(Resource resource, String path, final SlingHttpServletRequest slingHttpServletRequest, final SlingHttpServletResponse slingHttpServletResponse, final RequestDispatcherOptions requestDispatcherOptions) {
// ensure the path (if set) is absolute and normalized
if (path != null) {
if (!path.startsWith("/")) {
path = slingHttpServletRequest.getResource().getPath() + "/" + path;
}
path = ResourceUtil.normalize(path);
}
// check the resource
if (resource == null) {
if (path == null) {
// neither resource nor path is defined, use current resource
resource = slingHttpServletRequest.getResource();
} else {
// check whether the path (would) resolve, else SyntheticRes.
final String resourceType = requestDispatcherOptions.getForceResourceType();
final Resource tmp = slingHttpServletRequest.getResourceResolver().resolve(path);
if (tmp == null && resourceType != null) {
resource = new SyntheticResource(slingHttpServletRequest.getResourceResolver(), path, resourceType); // TODO DispatcherSyntheticResource?
// remove resource type overwrite as synthetic resource is correctly typed as requested
requestDispatcherOptions.remove(RequestDispatcherOptions.OPT_FORCE_RESOURCE_TYPE);
}
}
}
try {
// create a dispatcher for the resource or path
final RequestDispatcher dispatcher;
if (resource != null) {
dispatcher = slingHttpServletRequest.getRequestDispatcher(resource, requestDispatcherOptions);
} else {
dispatcher = slingHttpServletRequest.getRequestDispatcher(path, requestDispatcherOptions);
}
if (dispatcher != null) {
try {
final CaptureResponseWrapper wrapper = new CaptureResponseWrapper(slingHttpServletResponse);
dispatcher.include(slingHttpServletRequest, wrapper);
if (!wrapper.isBinaryResponse()) {
return wrapper.getCapturedCharacterResponse();
}
} catch (ServletException e) {
logger.error(e.getMessage(), e);
}
} else {
logger.error("no request dispatcher: unable to include {}/'{}'", resource, path);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}