/*
* Copyright 2012 The Solmix Project
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.gnu.org/licenses/
* or see the FSF site: http://www.fsf.org.
*/
package org.solmix.fmk.engine.internal.request;
import java.io.IOException;
import java.security.AccessControlException;
import java.util.Iterator;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.solmix.api.request.RequestProcessor;
import org.solmix.api.request.RequestProgressTracker;
import org.solmix.api.request.SlxHttpServletRequest;
import org.solmix.api.request.SlxHttpServletResponse;
import org.solmix.api.servlet.FilterManager;
import org.solmix.api.servlet.ServletManager;
import org.solmix.fmk.engine.internal.filter.RequestFilterChain;
/**
*
* @author Administrator
* @version 110035 2012-4-16
*/
public class SlxRequestProcessor implements RequestProcessor
{
/** default log */
private final Logger log = LoggerFactory.getLogger(SlxRequestProcessor.class);
private ServletManager servletManager;
private FilterManager filterManager;
/**
* {@inheritDoc}
*
* @see org.solmix.api.request.RequestProcessor#processRequest(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
@Override
public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// setting the Sling request and response
final RequestData requestData = new RequestData(this, request, response);
SlxHttpServletRequest slxRequest = requestData.getSlxRequest();
SlxHttpServletResponse slxResponse = requestData.getSlxResponse();
try {
// TODO recoreds Requests.
final ServletManager servletManager = this.servletManager;
if (servletManager == null) {
throw new UnavailableException("servletManager");
}
requestData.initServlet(servletManager);
Filter[] filters = filterManager.getFilters();
if (filters != null&&filters.length>0) {
FilterChain processor = new RequestFilterChain(this, filters);
slxRequest.getRequestProgressTracker().log("Applying filters");
processor.doFilter(slxRequest, slxResponse);
} else {
RequestData.service(slxRequest, slxResponse);
}
} catch (AccessControlException ace) {
log.info("service: Authenticated user {} does not have enough rights to executed requested action", request.getRemoteUser());
// handleError(HttpServletResponse.SC_FORBIDDEN, null, request, response);
} catch (UnavailableException ue) {
// exception is thrown before the SlingHttpServletRequest/Response
// is properly set up due to missing dependencies. In this case
// we must not use the Sling error handling infrastructure but
// just return a 503 status response handled by the servlet
// container environment
final int status = HttpServletResponse.SC_SERVICE_UNAVAILABLE;
final String errorMessage = ue.getMessage() + " service missing, cannot service requests";
log.error("{} , sending status {}", errorMessage, status);
// servletResponse.sendError(status, errorMessage);
} catch (Throwable t) {
// if we have request data and a non-null active servlet name
// we assume, that this is the name of the causing servlet
if (requestData.getActiveServletName() != null) {
request.setAttribute("error.servlet.name", requestData.getActiveServletName());
}
log.error("service: Uncaught Throwable", t);
// handleError(t, request, response);
} finally {
if (log.isDebugEnabled()) {
RequestProgressTracker logTracker = requestData.getRequestProgressTracker();
if (logTracker != null) {
Iterator<String> it = logTracker.getMessages();
while (it.hasNext()) {
log.debug(it.next());
}
}
}
}
}
/**
* @param servletManager the servletManager to set
*/
public void setServletManager(ServletManager servletManager) {
this.servletManager = servletManager;
}
/**
* @param filterManager the filterManager to set
*/
public void setFilterManager(FilterManager filterManager) {
this.filterManager = filterManager;
}
/**
*
*/
public void unsetServletManager(ServletManager servletManager) {
if (this.servletManager == servletManager) {
this.servletManager = null;
}
}
/**
* @param serverInfo
*/
public void setServerInfo(String serverInfo) {
// TODO Auto-generated method stub
}
}