package com.cognifide.cq.includefilter;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestDispatcherOptions;
import org.apache.sling.api.servlets.OptingServlet;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
/**
* Experimental implementation for synthetic resource include
*
* @author miroslaw.stawniak
*
*/
//@SlingServlet(resourceTypes = "sling:nonexisting", methods="GET")
public class SyntheticResourceIncludingServlet extends SlingSafeMethodsServlet implements OptingServlet {
private static final long serialVersionUID = 1L;
@Reference
private ConfigurationWhiteboard configurationWhiteboard;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
final String resourceType = getResourceTypeFromSuffix(request);
final RequestDispatcherOptions options = new RequestDispatcherOptions();
options.setForceResourceType(resourceType);
final RequestDispatcher dispatcher = request.getRequestDispatcher(request.getResource(),
options);
dispatcher.forward(request, response);
}
@Override
public boolean accepts(SlingHttpServletRequest request) {
final String resourceType = getResourceTypeFromSuffix(request);
final Configuration config = configurationWhiteboard.getConfiguration(request, resourceType);
return config != null
&& config.hasIncludeSelector(request);
}
private static String getResourceTypeFromSuffix(SlingHttpServletRequest request) {
final String suffix = request.getRequestPathInfo().getSuffix();
return StringUtils.removeStart(suffix, "/");
}
}