/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.gl.web.struts; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.kuali.kfs.gl.service.TrialBalanceService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.util.RiceConstants; import org.kuali.rice.kns.lookup.Lookupable; import org.kuali.rice.kns.util.WebUtils; import org.kuali.rice.kns.web.struts.action.KualiLookupAction; import org.kuali.rice.kns.web.ui.ResultRow; import org.kuali.rice.krad.util.GlobalVariables; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.BadPdfFormatException; import com.lowagie.text.pdf.PdfCopy; import com.lowagie.text.pdf.PdfImportedPage; import com.lowagie.text.pdf.PdfReader; /** * Actions for Trial Balance Report */ public class TrialBalanceReportAction extends KualiLookupAction { private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TrialBalanceReportAction.class); private static final String TOTALS_TABLE_KEY = "totalsTable"; /** * @see org.kuali.rice.kns.web.struts.action.KualiLookupAction#search(org.apache.struts.action.ActionMapping, * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { TrialBalanceReportForm lookupForm = (TrialBalanceReportForm) form; Lookupable lookupable = lookupForm.getLookupable(); if (lookupable == null) { LOG.error("Lookupable is null."); throw new RuntimeException("Lookupable is null."); } Collection displayList = new ArrayList(); List<ResultRow> resultTable = new ArrayList<ResultRow>(); lookupable.validateSearchParameters(lookupForm.getFields()); // get the lookup results and build the inquiry link displayList = lookupable.performLookup(lookupForm, resultTable, true); int totalSize = displayList.size(); request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS_SIZE, totalSize); request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS, resultTable); request.setAttribute(TOTALS_TABLE_KEY, resultTable); GlobalVariables.getUserSession().addObject(TOTALS_TABLE_KEY, resultTable); if (request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY) != null) { GlobalVariables.getUserSession().removeObject(request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY)); } request.setAttribute(KFSConstants.SEARCH_LIST_REQUEST_KEY, GlobalVariables.getUserSession().addObjectWithGeneratedKey(resultTable)); return mapping.findForward(RiceConstants.MAPPING_BASIC); } /** * View results from trial balance * * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ @Override public ActionForward viewResults(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute(KFSConstants.SEARCH_LIST_REQUEST_KEY, request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY)); request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS, GlobalVariables.getUserSession().retrieveObject(request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY))); request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS_SIZE, request.getParameter(KFSConstants.REQUEST_SEARCH_RESULTS_SIZE)); Object totalsTable = GlobalVariables.getUserSession().retrieveObject(TOTALS_TABLE_KEY); request.setAttribute(TOTALS_TABLE_KEY, totalsTable); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * This method handles print pdf file action * * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward print(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { TrialBalanceReportForm lookupForm = (TrialBalanceReportForm) form; Lookupable kualiLookupable = lookupForm.getLookupable(); if (kualiLookupable == null) { LOG.error("Lookupable is null."); throw new RuntimeException("Lookupable is null."); } Collection displayList = new ArrayList(); List<ResultRow> resultTable = new ArrayList<ResultRow>(); // validate search parameters kualiLookupable.validateSearchParameters(lookupForm.getFields()); boolean bounded = true; displayList = kualiLookupable.performLookup(lookupForm, resultTable, bounded); if (!displayList.isEmpty()) { String reportYear = lookupForm.getFields().get(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); String periodCode = lookupForm.getFields().get(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); String reportFileFullName = SpringContext.getBean(TrialBalanceService.class).generateReportForExtractProcess(displayList, reportYear, periodCode); // using itext for pdf ByteArrayOutputStream baos = generatePdfOutStream(reportFileFullName); StringBuffer fileName = new StringBuffer(reportYear); fileName.append("-TrialBalance.pdf"); WebUtils.saveMimeOutputStreamAsFile(response, "application/pdf", baos, fileName.toString()); if (baos != null) { baos.close(); baos = null; } return null; } else { lookupForm.setMessage("No data found."); return mapping.findForward(KFSConstants.MAPPING_BASIC); } } /** * Generate pdf for sending response using itext * * @param reportFileFullName * @return * @throws IOException * @throws DocumentException * @throws BadPdfFormatException */ protected ByteArrayOutputStream generatePdfOutStream(String reportFileFullName) throws IOException, DocumentException, BadPdfFormatException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // we create a reader for a certain document PdfReader reader = new PdfReader(reportFileFullName); reader.consolidateNamedDestinations(); // step 1: creation of a document-object Document document = new Document(reader.getPageSizeWithRotation(1)); // step 2: we create a writer that listens to the document PdfCopy writer = new PdfCopy(document, baos); // step 3: we open the document document.open(); // we retrieve the total number of pages int n = reader.getNumberOfPages(); // step 4: we add content PdfImportedPage page; for (int i = 0; i < n;) { ++i; page = writer.getImportedPage(reader, i); writer.addPage(page); } writer.freeReader(reader); // step 5: we close the document document.close(); return baos; } }