/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.ui.pentaho.controller;
import java.io.IOException;
import java.util.HashMap;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.apache.commons.lang.StringUtils;
import org.mifos.reports.pentaho.PentahoReport;
import org.mifos.reports.pentaho.PentahoReportsServiceFacade;
import org.mifos.reports.pentaho.PentahoValidationError;
import org.mifos.reports.pentaho.params.AbstractPentahoParameter;
import org.mifos.ui.core.controller.BreadCrumbsLinks;
import org.mifos.ui.core.controller.BreadcrumbBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class PentahoReportingController {
private static final String REPORT_ID_PARAM = "reportId";
private static final String CANCEL_PARAM = "CANCEL";
private static final String REPORTS_MAIN_URL = "reportsAction.do?method=load";
private PentahoReportsServiceFacade pentahoReportsService;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new PentahoReportFormValidator());
}
@Autowired
public void setPentahoReportsService(PentahoReportsServiceFacade pentahoReportsService) {
this.pentahoReportsService = pentahoReportsService;
}
@RequestMapping(value = "/execPentahoReport.ftl", method = RequestMethod.GET)
public ModelAndView redirectToReportsPage() {
return new ModelAndView("redirect:" + REPORTS_MAIN_URL);
}
@RequestMapping(value = "/execPentahoReport.ftl", method = RequestMethod.POST)
public ModelAndView executeReport(final HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = CANCEL_PARAM, required = false) String cancel,
@Valid @ModelAttribute("pentahoReportFormBean") PentahoReportFormBean pentahoReportFormBean,
BindingResult bindingResult) throws IOException {
if (!this.pentahoReportsService.checkAccessToReport(pentahoReportFormBean.getReportId())) {
throw new AccessDeniedException("Access denied");
}
ModelAndView mav = null;
Integer reportId = pentahoReportFormBean.getReportId();
if (StringUtils.isNotBlank(cancel)) {
mav = new ModelAndView("redirect:" + REPORTS_MAIN_URL);
} else if (bindingResult.hasErrors()) {
mav = new ModelAndView("viewPentahoReport");
initFormBean(pentahoReportFormBean, reportId, request);
} else {
Integer outputType = Integer.parseInt(pentahoReportFormBean.getOutputType());
Map<String, AbstractPentahoParameter> reportParams = pentahoReportFormBean.getAllParameteres();
PentahoReport report = this.pentahoReportsService.getReport(reportId, outputType, reportParams);
if (report.isInError()) {
for (PentahoValidationError error : report.getErrors()) {
addErrorToBindingResult(error, bindingResult);
}
mav = new ModelAndView("viewPentahoReport");
initFormBean(pentahoReportFormBean, reportId, request);
} else {
if (report.getContentType().equalsIgnoreCase("text/html")) {
HashMap<String, String> modelMap = new HashMap<String, String> ();
modelMap.put("reportContent", new String(report.getContent()));
mav = new ModelAndView("viewHtmlReport", modelMap);
}
else {
response.setHeader("Content-Disposition", "attachment; filename=\""
+ report.getFilename() + "\"");
response.setContentType(report.getContentType());
response.setContentLength(report.getContentSize());
response.getOutputStream().write(report.getContent());
}
}
}
return mav;
}
@RequestMapping(value = "/viewPentahoReport.ftl", method=RequestMethod.GET)
public void loadReport(@RequestParam(value = REPORT_ID_PARAM, required = true) Integer reportId,
@ModelAttribute("pentahoReportFormBean") PentahoReportFormBean formBean, HttpServletRequest request) {
if (!this.pentahoReportsService.checkAccessToReport(reportId)) {
throw new AccessDeniedException("Access denied");
}
initFormBean(formBean, reportId, request);
}
@ModelAttribute("breadcrumbs")
public List<BreadCrumbsLinks> getBreadCrumbs(HttpServletRequest request) {
Integer reportId = getReportId(request);
String reportName = this.pentahoReportsService.getReportName(reportId);
return new BreadcrumbBuilder().withLink("tab.Reports", REPORTS_MAIN_URL)
.withLink(reportName, "viewPentahoReport.ftl?reportId=" + reportId).build();
}
@ModelAttribute("reportName")
public String getReportName(HttpServletRequest request) {
return this.pentahoReportsService.getReportName(getReportId(request));
}
private void initFormBean(PentahoReportFormBean form, Integer reportId, HttpServletRequest request) {
form.setAllowedOutputTypes(this.pentahoReportsService.getReportOutputTypes());
form.setReportId(reportId);
if (form.getOutputType() == null) {
form.setOutputType("0");
}
Map <String, AbstractPentahoParameter> selectedValues = form.getAllParameteres();
boolean update=false;
List<AbstractPentahoParameter> params = this.pentahoReportsService.getParametersForReport(reportId, request, selectedValues, update);
setDWValuesIntoForm(reportId, request, form);
form.setReportParameters(params);
}
private void addErrorToBindingResult(PentahoValidationError validationError, BindingResult bindingResult) {
ObjectError error;
if (validationError.isFieldError()) {
error = new FieldError("pentahoReportFormBean", validationError.getParamName(),
validationError.getParamName() + ": " + validationError.getErrorMessage());
} else {
error = new ObjectError("pentahoReportFormBean", validationError.getErrorMessage());
}
bindingResult.addError(error);
}
@ModelAttribute("report_id")
private Integer getReportId(HttpServletRequest request) {
Integer id = null;
String idStr = request.getParameter(REPORT_ID_PARAM);
if (idStr != null && !idStr.isEmpty()) {
id = Integer.parseInt(idStr);
}
return id;
}
@RequestMapping(value = "/viewPentahoReport.ftl", method = RequestMethod.POST)
public void updateSelectDropdown(
@ModelAttribute("pentahoReportFormBean") PentahoReportFormBean formBean,
HttpServletRequest request) {
formBean.setAllowedOutputTypes(this.pentahoReportsService.getReportOutputTypes());
Map<String, AbstractPentahoParameter> selectedValues = formBean
.getAllParameteres();
boolean update = true;
List<AbstractPentahoParameter> params = this.pentahoReportsService
.getParametersForReport(getReportId(request), request, selectedValues,
update);
setDWValuesIntoForm(getReportId(request), request, formBean);
formBean.setReportParameters(params);
}
private void setDWValuesIntoForm(Integer reportId, HttpServletRequest request, PentahoReportFormBean formBean) {
if (this.pentahoReportsService.isDW(reportId)) {
formBean.setEtlLastUpdate(this.pentahoReportsService.getEtlLastUpdateDate(request));
if (formBean.getEtlLastUpdate().equals(new Date(0))) {
request.getSession().setAttribute("dwNotRun", "true");
} else {
request.getSession().setAttribute("dwNotRun", "false");
}
request.getSession().setAttribute("isDW", "true");
} else {
request.getSession().setAttribute("isDW", "false");
}
}
}