/*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
* This file is part of jAPS software.
* jAPS is a free software;
* you can redistribute it and/or modify it
* under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2.
*
* See the file License for the specific language governing permissions
* and limitations under the License
*
*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
*/
package com.agiletec.aps.servlet;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.agiletec.aps.system.ApsSystemUtils;
import com.agiletec.aps.system.RequestContext;
import com.agiletec.aps.system.SystemConstants;
import com.agiletec.aps.system.services.controller.ControllerManager;
import com.agiletec.aps.util.ApsWebApplicationUtils;
/**
* Servlet di controllo, punto di ingresso per le richieste di pagine del portale.
* Predispone il contesto di richiesta, invoca il controller e ne gestisce lo stato di uscita.
* @author
*/
public class ControllerServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
RequestContext reqCtx = new RequestContext();
Logger log = ApsSystemUtils.getLogger();
if (log.isLoggable(Level.FINEST)) {
log.finest("Request:" + request.getServletPath());
}
request.setAttribute(RequestContext.REQCTX, reqCtx);
reqCtx.setRequest(request);
reqCtx.setResponse(response);
ControllerManager controller =
(ControllerManager) ApsWebApplicationUtils.getBean(SystemConstants.CONTROLLER_MANAGER, request);
int status = controller.service(reqCtx);
if (status == ControllerManager.REDIRECT) {
if (log.isLoggable(Level.FINEST)) {
log.finest("Redirezione");
}
this.redirect(reqCtx, response);
} else if (status == ControllerManager.OUTPUT) {
if (log.isLoggable(Level.FINEST)) {
log.finest("Output");
}
} else if (status == ControllerManager.ERROR) {
this.outputError(reqCtx, response);
if (log.isLoggable(Level.FINEST)) {
log.finest("Errore");
}
} else {
log.severe("Errore: stato uscita controller = "
+ ControllerManager.getStatusDescription(status)
+ " per richiesta: ");
log.severe(request.getServletPath());
throw new ServletException("Servizio non disponibile");
}
return;
}
private void redirect(RequestContext reqCtx, HttpServletResponse response) throws ServletException {
try {
String url = (String) reqCtx.getExtraParam(RequestContext.EXTRAPAR_REDIRECT_URL);
response.sendRedirect(url);
} catch (Exception e) {
throw new ServletException("Servizio non disponibile");
}
}
private void outputError(RequestContext reqCtx, HttpServletResponse response)
throws ServletException {
try {
if (!response.isCommitted()) {
Integer httpErrorCode = (Integer) reqCtx.getExtraParam("errorCode");
if (httpErrorCode == null) {
httpErrorCode = new Integer(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
}
response.sendError(httpErrorCode.intValue());
}
} catch (IOException e) {
ApsSystemUtils.logThrowable(e, this, "outputError");
throw new ServletException("Servizio non disponibile");
}
}
}