/*
###############################################################################
# #
# Copyright (C) 2011-2016 OpenMEAP, Inc. #
# Credits to Jonathan Schang & Rob Thacher #
# #
# Released under the LGPLv3 #
# #
# OpenMEAP 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 3 of the License, or #
# (at your option) any later version. #
# #
# OpenMEAP 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 should have received a copy of the GNU Lesser General Public License #
# along with OpenMEAP. If not, see <http://www.gnu.org/licenses/>. #
# #
###############################################################################
*/
package com.openmeap.admin.web.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.openmeap.AuthorizerImpl;
import com.openmeap.cluster.ClusterNodeHealthCheckThread;
import com.openmeap.constants.FormConstants;
import com.openmeap.model.ModelManager;
import com.openmeap.model.ModelServiceImpl;
import com.openmeap.model.dto.GlobalSettings;
import com.openmeap.util.ParameterMapUtils;
import com.openmeap.util.ServletUtils;
import com.openmeap.web.DocumentProcessor;
import freemarker.ext.beans.BeanModel;
import freemarker.template.DefaultObjectWrapper;
public class AdminServlet extends HttpServlet {
private static final long serialVersionUID = -7679539480528574013L;
private Logger logger = LoggerFactory.getLogger(AdminServlet.class);
WebApplicationContext context = null;
ModelManager modelManager = null;
public void init() {
context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
ClusterNodeHealthCheckThread healthChecker = (ClusterNodeHealthCheckThread)context.getBean("clusterNodeHealthCheck");
new Thread(healthChecker).start();
}
@SuppressWarnings("unchecked")
@Override
public void service(HttpServletRequest request, HttpServletResponse response) {
logger.trace("Entering service()");
try {
DocumentProcessor documentProcessor = null;
logger.debug("Request uri: {}",request.getRequestURI());
logger.debug("Request url: {}",request.getRequestURL());
logger.debug("Query string: {}",request.getQueryString());
if(logger.isDebugEnabled()) {
logger.debug("Parameter map: {}",ParameterMapUtils.toString(request.getParameterMap()));
}
if( request.getParameter("logout")!=null ) {
logger.trace("Executing logout");
request.getSession().invalidate();
response.sendRedirect(request.getContextPath()+"/interface/");
}
if( request.getParameter("refreshContext")!=null && context instanceof AbstractApplicationContext ) {
logger.trace("Refreshing context");
((AbstractApplicationContext)context).refresh();
}
// support for clearing the persistence context
if( request.getParameter("clearPersistenceContext")!=null && context instanceof AbstractApplicationContext ) {
logger.trace("Clearing the persistence context");
ModelServiceImpl ms = (ModelServiceImpl)((AbstractApplicationContext)context).getBean("modelService");
ms.clearPersistenceContext();
}
// default to the mainOptionPage, unless otherwise specified
String pageBean = null;
if( request.getParameter(FormConstants.PAGE_BEAN)!=null )
pageBean = request.getParameter(FormConstants.PAGE_BEAN);
else pageBean = FormConstants.PAGE_BEAN_MAIN;
logger.debug("Using page bean: {}", pageBean);
documentProcessor = (DocumentProcessor)context.getBean(pageBean);
ModelManager mgr = getModelManager();
Map<Object,Object> map = new HashMap<Object,Object>();
// TODO: I'm not really happy with this hacky work-around for the login form not being in actual request scope
if( documentProcessor.getProcessesFormData() ) {
GlobalSettings settings = mgr.getGlobalSettings();
map = ServletUtils.cloneParameterMap(settings.getMaxFileUploadSize(),settings.getTemporaryStoragePath(),request);
map.put("userPrincipalName",new String[]{request.getUserPrincipal().getName()});
AuthorizerImpl authorizer = (AuthorizerImpl)context.getBean("authorizer");
authorizer.setRequest(request);
}
response.setContentType(FormConstants.CONT_TYPE_HTML);
Map<Object,Object> defaultTemplateVars = new HashMap<Object,Object>();
defaultTemplateVars.put("request", new BeanModel(request,new DefaultObjectWrapper()));
documentProcessor.setTemplateVariables(defaultTemplateVars);
documentProcessor.handleProcessAndRender(map,response.getWriter());
response.getWriter().flush();
response.getWriter().close();
} catch(IOException te) {
throw new RuntimeException(te);
}
logger.trace("Leaving service()");
}
public void setModelManager(ModelManager manager) {
modelManager = manager;
}
public ModelManager getModelManager() {
if( modelManager==null )
modelManager = (ModelManager)context.getBean("modelManager");
return modelManager;
}
}