/* * Copyright (C) 2004 Erik Swenson - erik@oreports.com * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program 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 General Public License for more * details. * * You should have reserved a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. * */ package org.efs.openreports.actions; import java.util.*; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import org.apache.log4j.Logger; import org.apache.struts2.interceptor.ParameterAware; import org.apache.struts2.interceptor.SessionAware; import org.efs.openreports.ORStatics; import org.efs.openreports.objects.*; import org.efs.openreports.providers.*; import org.efs.openreports.util.LocalStrings; import org.efs.openreports.util.ORUtil; import org.hibernate.HibernateException; public class ExecuteReportAction extends ActionSupport implements SessionAware, ParameterAware { private static final long serialVersionUID = 8329253153675628544L; protected static Logger log = Logger.getLogger(ReportOptionsAction.class); private Map<Object,Object> session; private Map<String,Object> parameters; private int reportId; private String reportName; private String exportType; private String userName; private String password; private boolean displayInline; private boolean promptForParameters; private ParameterProvider parameterProvider; private ReportProvider reportProvider; private UserProvider userProvider; private ReportLogProvider reportLogProvider; @Override public String execute() { ReportUser user = null; try { // get user, validate, and put in session if (userName == null || userName.length() < 1) { user = (ReportUser) ActionContext.getContext().getSession().get( ORStatics.REPORT_USER); if (user != null) password = user.getPassword(); } else { user = userProvider.getUser(userName, password); } if (user == null) { addActionError(LocalStrings.ERROR_LOGIN_INVALID); return ERROR; } session.put(ORStatics.REPORT_USER, user); Report report = null; if (reportName != null && reportName.length() > 0) { report = reportProvider.getReport(reportName); } else { report = reportProvider.getReport(new Integer(reportId)); } if (report == null) { addActionError(LocalStrings.ERROR_REPORT_INVALID); return ERROR; } // validate user authorized to view report if (!user.isValidReport(report)) { addActionError(LocalStrings.ERROR_REPORT_NOTAUTHORIZED); return ERROR; } report.setDisplayInline(displayInline); session.put(ORStatics.REPORT, report); // get exportType, validate, and put in session if (exportType == null || exportType.length() < 1) { if (!report.isQueryReport() && !report.isChartReport()) { addActionError(LocalStrings.ERROR_EXPORTTYPE_REQUIRED); return ERROR; } } session.put(ORStatics.EXPORT_TYPE, exportType); List<ReportParameterMap> reportParameters = report.getParameters(); if (reportParameters != null && reportParameters.size() > 0 && promptForParameters) { return ORStatics.PROMPT_PARAMETERS_ACTION; } // vaidate parameters, create map of parameters, and put in session parameterProvider.validateParameters(reportParameters, parameters); Map<String,Object> map = parameterProvider.getReportParametersMap(reportParameters, parameters); map.put(ORStatics.USER_ID, user.getId()); map.put(ORStatics.EXTERNAL_ID, user.getExternalId()); map.put(ORStatics.USER_NAME, user.getName()); session.remove(ORStatics.REPORT_PARAMETERS); session.put(ORStatics.REPORT_PARAMETERS, map); if (report.isQueryReport()) return ORStatics.QUERY_REPORT_ACTION; if (report.isChartReport()) return ORStatics.CHART_REPORT_ACTION; if (report.isJXLSReport()) return ORStatics.JXLSREPORT_ACTION; if (report.isJPivotReport()) { ORUtil.resetOlapContext(ActionContext.getContext()); try { ReportLog reportLog = new ReportLog(user, report, new Date()); reportLogProvider.insertReportLog(reportLog); } catch (ProviderException pe) { log.warn(pe); } return ORStatics.JPIVOT_ACTION; } return SUCCESS; } catch (ProviderException e) { if (e.getException() instanceof HibernateException) { addActionError(LocalStrings.ERROR_REPORT_INVALID); return ERROR; } addActionError(e.getMessage()); return ERROR; } } @SuppressWarnings("unchecked") public void setSession(Map session) { this.session = session; } @SuppressWarnings("unchecked") public void setParameters(Map parameters) { this.parameters = parameters; } public int getReportId() { return reportId; } public void setReportId(int reportId) { this.reportId = reportId; } public String getExportType() { return exportType; } public void setExportType(String exportType) { this.exportType = exportType; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public void setParameterProvider(ParameterProvider parameterProvider) { this.parameterProvider = parameterProvider; } public void setReportProvider(ReportProvider reportProvider) { this.reportProvider = reportProvider; } public void setUserProvider(UserProvider userProvider) { this.userProvider = userProvider; } public String getReportName() { return reportName; } public void setReportName(String reportName) { this.reportName = reportName; } public boolean isDisplayInline() { return displayInline; } public void setDisplayInline(boolean displayInline) { this.displayInline = displayInline; } public boolean isPromptForParameters() { return promptForParameters; } public void setPromptForParameters(boolean promptForParameters) { this.promptForParameters = promptForParameters; } public void setReportLogProvider(ReportLogProvider reportLogProvider) { this.reportLogProvider = reportLogProvider; } }