/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.web.filter.startuperror;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.openmrs.api.context.Context;
import org.openmrs.module.ModuleUtil;
import org.openmrs.module.OpenmrsCoreModuleException;
import org.openmrs.web.Listener;
import org.openmrs.web.filter.StartupFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This is the second filter that is processed. It is only active when OpenMRS has some liquibase
* updates that need to be run. If updates are needed, this filter/wizard asks for a super user to
* authenticate and review the updates before continuing.
*/
public class StartupErrorFilter extends StartupFilter {
protected final Logger log = LoggerFactory.getLogger(getClass());
/**
* The velocity macro page to redirect to if an error occurs or on initial startup
*/
private static final String DEFAULT_PAGE = "generalerror.vm";
/**
* Called by {@link #doFilter(ServletRequest, ServletResponse, FilterChain)} on GET requests
*
* @param httpRequest
* @param httpResponse
*/
@Override
protected void doGet(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException,
ServletException {
if (getModel().errorAtStartup instanceof OpenmrsCoreModuleException) {
renderTemplate("coremoduleerror.vm", new HashMap<String, Object>(), httpResponse);
} else {
renderTemplate(DEFAULT_PAGE, new HashMap<String, Object>(), httpResponse);
}
}
/**
* @see org.openmrs.web.filter.StartupFilter#doPost(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doPost(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException,
ServletException {
// if they are uploading modules
if (getModel().errorAtStartup instanceof OpenmrsCoreModuleException) {
RequestContext requestContext = new ServletRequestContext(httpRequest);
if (!ServletFileUpload.isMultipartContent(requestContext)) {
throw new ServletException("The request is not a valid multipart/form-data upload request");
}
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
Context.openSession();
List<FileItem> items = upload.parseRequest(requestContext);
for (FileItem item : items) {
InputStream uploadedStream = item.getInputStream();
ModuleUtil.insertModuleFile(uploadedStream, item.getName());
}
}
catch (FileUploadException ex) {
throw new ServletException("Error while uploading file(s)", ex);
}
finally {
Context.closeSession();
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("success", Boolean.TRUE);
renderTemplate("coremoduleerror.vm", map, httpResponse);
// TODO restart openmrs here instead of going to coremodulerror template
}
}
/**
* @see org.openmrs.web.filter.StartupFilter#getModel()
*/
@Override
protected StartupErrorFilterModel getModel() {
// this object was initialized in the #init(FilterConfig) method
return new StartupErrorFilterModel(Listener.getErrorAtStartup());
}
/**
* @see org.openmrs.web.filter.StartupFilter#skipFilter(HttpServletRequest)
*/
@Override
public boolean skipFilter(HttpServletRequest request) {
return !Listener.errorOccurredAtStartup();
}
/**
* @see org.openmrs.web.filter.StartupFilter#getTemplatePrefix()
*/
@Override
protected String getTemplatePrefix() {
return "org/openmrs/web/filter/startuperror/";
}
}