package com.openkm.servlet.frontend;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.jcr.LoginException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import bsh.EvalError;
import com.openkm.bean.form.FormElement;
import com.openkm.core.DatabaseException;
import com.openkm.core.ParseException;
import com.openkm.dao.ReportDAO;
import com.openkm.dao.UserConfigDAO;
import com.openkm.dao.bean.Profile;
import com.openkm.dao.bean.Report;
import com.openkm.dao.bean.UserConfig;
import com.openkm.jcr.JCRUtils;
import com.openkm.util.ReportUtils;
import com.openkm.util.UserActivity;
import com.openkm.util.WebUtils;
/**
* Execute report for users
*
* @pavila
*/
public class ExecuteReportServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(ExecuteReportServlet.class);
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,
ServletException {
log.debug("doGet({}, {})", request, response);
request.setCharacterEncoding("UTF-8");
int id = WebUtils.getInt(request, "id");
int format = WebUtils.getInt(request, "format", ReportUtils.OUTPUT_PDF);
ByteArrayOutputStream baos = null;
ByteArrayInputStream bais = null;
Session session = null;
try {
session = JCRUtils.getSession();
UserConfig uc = UserConfigDAO.findByPk(session, request.getRemoteUser());
Profile up = uc.getProfile();
if (up.getMisc().getReports().contains(id)) {
Report rp = ReportDAO.findByPk(id);
// Set file name
String fileName = rp.getFileName().substring(0, rp.getFileName().indexOf('.')) + ReportUtils.FILE_EXTENSION[format];
// Set default report parameters
Map<String, String> params = new HashMap<String, String>();
String host = com.openkm.core.Config.APPLICATION_URL;
params.put("host", host.substring(0, host.lastIndexOf("/") + 1));
for (FormElement fe : ReportUtils.getReportParameters(id)) {
params.put(fe.getName(), WebUtils.getString(request, fe.getName()));
}
baos = ReportUtils.execute(rp, params, format);
bais = new ByteArrayInputStream(baos.toByteArray());
WebUtils.sendFile(request, response, fileName, ReportUtils.FILE_MIME[format], false, bais);
// Activity log
UserActivity.log(session.getUserID(), "EXECUTE_REPORT", Integer.toString(id), "OK");
} else {
// Activity log
UserActivity.log(session.getUserID(), "EXECUTE_REPORT", Integer.toString(id), "FAILURE");
}
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
} catch (ParseException e) {
log.error(e.getMessage(), e);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
} catch (JRException e) {
log.error(e.getMessage(), e);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
} catch (EvalError e) {
log.error(e.getMessage(), e);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
} catch (LoginException e) {
log.error(e.getMessage(), e);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
} catch (RepositoryException e) {
log.error(e.getMessage(), e);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
JCRUtils.logout(session);
IOUtils.closeQuietly(bais);
IOUtils.closeQuietly(baos);
}
}
}